Skip to content

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-api sobre base, com prev-api, rmi-api e mcp — fica de fora por clareza; o backoffice pertence aos dois, porque estende base-api além das camadas acima.

Nota: as camadas base-ui, base-prev e base-online incluem 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, pdpj e backoffice diretamente; o ramo de cálculo, pela cadeia — e herda proxies e rotas de auth. A antiga camada base-pdpj, que concentrava a parte de autenticação ao lado de base-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-online centraliza 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 em base-servicos, que também autentica. A app arquivos-online consome 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-calculadora reú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-ui fica 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-rpps e prev-utils declaram apenas base-prev; civeis declara base-calculadora. Tudo o mais chega pela cadeia. O perfil estático de build gera bundles SPA sem servidor; nesse caso o preset static do Nitro bloqueia as rotas de nuvem e a interface oculta os controles que dependem delas. prev-rpps adota permanentemente esse perfil e, por isso, sempre apresenta a experiência offline.

O composable useExchange e a página /importar/[token] (recepção de payload do sistema processual/CNIS/RDCTC) ficam nas apps prev-tc e prev-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/….

AliasAponta para
@baseapps/base/
@base-apiapps/base-api/
@base-uiapps/base-ui/
@base-servicosapps/base-servicos/
@base-onlineapps/base-online/
@base-calculadoraapps/base-calculadora/
@base-prevapps/base-prev/
@appapp/ da própria app consumidora

Atenção: aliases de camada devem ser declarados em dois lugares no nuxt.config.ts: em alias (resolução Vite/TypeScript) e em components[].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'] }
}