defineOonApp e bootstrap
O contrato code-first do frontend — defineOonApp valida identidade, API, rotas, navegação e segurança; startOonApp monta providers, autenticação, tenant, shell e router.
O frontend de todo App Oon é composto em TypeScript/React. O appKind não limita páginas, componentes, layouts ou temas locais.
import { defineOonApp, type OonAppKind, type OonTenancyModel } from "@oondemand/oon-core-front";
import manifest from "../../../central.app.json";
import { navigation } from "./navigation";
import { routes } from "./routes";
import { theme } from "./theme";
export const app = defineOonApp({
app: {
id: manifest.id,
name: manifest.name,
title: manifest.name,
kind: manifest.appKind as OonAppKind,
tenancyModel: manifest.tenancyModel as OonTenancyModel,
capabilities: manifest.capabilities,
},
api: {
baseUrl: import.meta.env.VITE_API_URL ?? "/api",
meusAppsUrl: import.meta.env.DEV ? undefined : import.meta.env.VITE_MEUS_APPS_URL, // endereço do Meus Apps (não é login)
},
runtimeMode: import.meta.env.DEV ? "local" : "platform",
routes: [...routes],
navigation: [...navigation],
theme,
shell: { shell: "default" },
});
import { startOonApp } from "@oondemand/oon-core-front";
import { app } from "./app/app";
startOonApp(app);
O que startOonApp monta
QueryClient → OonThemeProvider (Chakra) → ApiProvider → ActivationProvider
→ TenantProvider (se tenancyModel ≠ none) → AuthProvider
→ [LocalRuntimeBanner no modo local] → Router
Além disso aplica document.title/favicon, endurece o console em produção (disableConsoleInProduction) e cria o cliente HTTP autenticado.
Referência de defineOonApp
| Chave | Descrição |
|---|---|
app |
Obrigatório. id, name, title?, logo?, favicon?, version?, kind?, tenancyModel?, capabilities?, capabilitySettings? |
api |
Obrigatório. baseUrl, meusAppsUrl? (endereço do Meus Apps; desde a 0.7.37 não é usado como login), assistantBaseUrl?, onboardingBaseUrl?, versionPrefix?, timeout? |
runtimeMode |
"local" ou "platform" |
auth |
mode?, loginUrl? (login externo; sem ele o App usa a própria tela /login), tokenParam? (padrão code) |
routes |
Rotas da aplicação — veja Rotas e navegação |
navigation |
Itens de menu ou { mode, items } |
shell |
Configuração do shell — veja Shell e layouts |
layouts |
Componentes de slots de layout (ex.: topbarEnd, organization) |
components |
Registry: fieldRenderers, cellRenderers, cardRenderers, actionRenderers, pageComponents, menuRenderers, menuConditions |
pages |
Páginas por blocos declarativos |
modules |
Módulos com rotas, menus e views |
ui |
Composição declarativa opcional (views collection, document, pipeline, dashboard) |
theme, themes, defaultThemeId |
Temas — veja Temas |
security |
Opções de segurança (guards não podem ser desligados) |
systemPages |
login? e usersAccess? (componente ou false) |
rootElementId |
Elemento de montagem (padrão root) |
Validações
defineOonApp preserva a inferência de tipos e lança erro quando:
app.id,app.nameouapi.baseUrlestão ausentes;security.enableRouteGuardousecurity.enablePermissionGatesãofalse— guards obrigatórios não podem ser desabilitados;- rotas duplicadas, reservadas ou com mais de uma fonte de renderização;
- itens de navegação sem
labelou sem destino.
Subpaths públicos
| Import | Conteúdo |
|---|---|
@oondemand/oon-core-front |
Tudo: bootstrap, componentes, hooks, tipos |
@oondemand/oon-core-front/ui |
Primitives, kit Core*, componentes de domínio |
@oondemand/oon-core-front/routing |
defineOonRoutes, defineOonNavigation, OON_RESERVED_ROUTES |
@oondemand/oon-core-front/theme |
createOonTheme, oonDefaultTheme, createOonSystem, useOonTheme |
@oondemand/oon-core-front/hooks |
useOonAuth, useOonTenant, useOonApi, useOonResource, useCoreMetadata, useModelSchema, useOonTheme |
@oondemand/oon-core-front/testing |
createOonTestConfig |
Limites de segurança
- nunca desative guards do Core;
- não carregue código remoto,
evalouFunctionno bundle; - não inclua tokens, chaves ou segredos (
import.meta.env.*_TOKEN,*_SECRET…); - não importe caminhos internos do pacote;
- mantenha dependências dentro da árvore de
frontend/; - use o backend como autoridade de autorização.
Execute npm run ooncore:conformance antes do build e da publicação.