Appearance
Camadas Nuxt
A Fábrica de Cálculos usa a funcionalidade extends do Nuxt para compor apps a partir de camadas. Cada camada herda automaticamente componentes, composables, plugins, páginas, layouts, configuração Vite e nuxt.config.ts da camada pai.
Hierarquia de camadas
graph TD BASE["📦 base<br>(runtime config · base da hierarquia)"] BASEUI["📦 base-ui<br>(Quasar · Pinia · VueUse · componentes · importador de documento)"] BASESVC["📦 base-servicos<br>(serviços internos · SSO PDPJ + integração PDPJ)"] BASEONLINE["📦 base-online<br>(persistência de cálculos: sessão na aba + Arquivos online)"] BASECALC["📦 base-calculadora<br>(demonstrativo · arquivo de cálculo · tabelas de índices)"] BASEPREV["📦 base-prev<br>(cálculos previdenciários)"] ARQUIVOS["🖥️ arquivos-online<br>:3007"] CIVEIS["🖥️ civeis<br>:3006"] TC["🖥️ prev-tc<br>:3002"] RVT["🖥️ prev-rvt<br>:3001"] ATRASADOS["🖥️ prev-atrasados<br>:3003"] RPPS["🖥️ prev-rpps<br>:3004"] UTILS["🖥️ prev-utils<br>:3005"] INDAPI["🔌 backoffice<br>:8001"] PDPJ["🔌 pdpj<br>:5000"] BASE --> BASEUI BASEUI --> BASESVC BASESVC --> INDAPI BASESVC --> PDPJ & BASEONLINE BASEONLINE --> ARQUIVOS & BASECALC BASECALC --> CIVEIS & BASEPREV BASEPREV --> TC & ATRASADOS & RVT & RPPS & UTILS
O grafo cobre o ramo de interface. O ramo de API — a camada
base-apisobrebase, comprev-api,rmi-apiemcp— fica de fora por clareza; obackofficepertence aos dois, porque estendebase-apialém das camadas acima.Nota: as camadas
base-ui,base-prevebase-onlineincluem playgrounds de desenvolvimento (playground/) — sub-apps não exportadas pela camada, usadas para visualizar componentes e fluxos interativamente:
base-ui/playground→ porta 3020 (pnpm --filter @fc/base-ui dev:open)base-prev/playground→ porta 3021 (pnpm --filter @fc/base-prev dev:open)base-online/playground→ porta 3023 (pnpm --filter @fc/base-online dev:open)
base-servicosé a camada de serviços da plataforma, com dois assuntos organizados por pasta: o lado app do contrato de serviços internos — proxies servidor-a-servidor para o backoffice e fachadas tipadas de consumo, todos derivados de um catálogo declarativo no package@fc/servicos-internos(caminhos, modos de autenticação e tipos vêm do catálogo — nunca de literais; um verificador no backoffice garante que catálogo e rotas não divirjam) — e a integração PDPJ inteira: o SSO (Keycloak/OIDC PDPJ), sessão, perfil, busca de pessoas e a cola de servidor PDPJ (clientes, tradução de erro). Toda app autenticada a estende —base-online,pdpjebackofficediretamente; o ramo de cálculo, pela cadeia — e herda proxies e rotas de auth. A antiga camadabase-pdpj, que concentrava a parte de autenticação ao lado debase-ui, foi fundida aqui: a cadeia principal ficou linear e a declaração duplicada do Quasar que aquela separação exigia deixou de existir.
base-onlinecentraliza a persistência de cálculos: a sessão de cálculo na aba, os Rascunhos locais e a experiência de "Arquivos online" — gerenciador, listagem, pastas, importação em lote, autosave, revisão otimista e as páginas de abertura, link público e permalink. As camadas de baixo dão o meio — proxies e fachadas de grupos, convites e permalinks embase-servicos, que também autentica. A apparquivos-onlineconsome essa camada diretamente para oferecer a experiência standalone em/arquivos-online. Ela é serviço estruturante, não calculadora, e por isso não entra no catálogo compartilhado de calculadoras.
base-calculadorareúne o que existe porque a app é uma calculadora: o demonstrativo judicial impresso, o importador de documento, a tela principal, o arquivo de cálculo baixável e a identificação do processo.base-uifica com a interface genérica — formulário, planilha, diálogos, tema. Nas apps só-cálculo (prev-rvt,prev-rpps,prev-utils) o registro de capacidades remove as rotas de nuvem em build: herdar o ramo online não muda o bundle.As calculadoras estendem uma camada só:
prev-tc,prev-atrasados,prev-rvt,prev-rppseprev-utilsdeclaram apenasbase-prev;civeisdeclarabase-calculadora. Tudo o mais chega pela cadeia. O perfil estático de build gera bundles SPA sem servidor; nesse caso o presetstaticdo Nitro bloqueia as rotas de nuvem e a interface oculta os controles que dependem delas.prev-rppsadota permanentemente esse perfil e, por isso, sempre apresenta a experiência offline.O composable
useExchangee a página/importar/[token](recepção de payload do sistema processual/CNIS/RDCTC) ficam nas appsprev-tceprev-atrasados— uma implementação em cada — e não na camada, por dependerem das stores de cada calculadora.
Como funciona o extends
No nuxt.config.ts de cada app:
ts
// apps/prev-tc/nuxt.config.ts
export default defineNuxtConfig({
extends: ['../base-prev'],
// prev-tc herda base → base-ui → base-servicos → base-online →
// base-calculadora → base-prev automaticamente
})O Nuxt mescla recursivamente todas as camadas. Uma app pode estender mais de uma quando pertence a dois ramos — é o caso único do backoffice, que declara ['../base-api', '../base-servicos'] (borda de API e painel com UI); em colisões de auto-import, a última camada do array vence.
Aliases de camada
Cada layer declara aliases para que componentes de uma camada possam importar explicitamente de outra, evitando ambiguidades:
ts
// apps/base-calculadora/nuxt.config.ts
export default defineNuxtConfig({
alias: {
'@base-calculadora': fileURLToPath(new URL('./', import.meta.url)),
},
components: [
{ path: '@base-calculadora/app/components', pathPrefix: false, extensions: ['.vue'] },
],
})Cada alias aponta para a raiz da camada, não para o seu app/ — daí os caminhos de importação começarem por @base-ui/app/composables/….
| Alias | Aponta para |
|---|---|
@base | apps/base/ |
@base-api | apps/base-api/ |
@base-ui | apps/base-ui/ |
@base-servicos | apps/base-servicos/ |
@base-online | apps/base-online/ |
@base-calculadora | apps/base-calculadora/ |
@base-prev | apps/base-prev/ |
@app | app/ da própria app consumidora |
Atenção: aliases de camada devem ser declarados em dois lugares no
nuxt.config.ts: emalias(resolução Vite/TypeScript) e emcomponents[].path(scanner de auto-import do Nuxt).
app.config.ts por app
Cada app declara sua identidade via defineAppConfig:
ts
// apps/prev-tc/app/app.config.ts
export default defineAppConfig({
nome: 'prev-tc',
titulo: 'Calculadora de Benefícios',
descricao: 'Tempo de contribuição e RMI',
versao: '8.0.11',
tema: '#1a7a6e',
})Quasar + SSR
Todas as apps com UI requerem ssr.noExternal: ['quasar'] no Vite — já configurado em base-ui. Não remover.
ts
// apps/base-ui/nuxt.config.ts
vite: {
ssr: { noExternal: ['quasar'] }
}