📘 DOCUMENTAÇÃO OFICIAL — ARQUITETURA DO MONOREPO (PNPM + CLOUDFLARE WORKERS + REACT)
Versão 2.0 — Revisada, Profissional e Consolidada Projeto: Todo App — Monorepo Serverless Última atualização: 1 de Dezembro de 2025
A aplicação Todo App é uma solução Fullstack executada em arquitetura Serverless Edge, composta por:
- Aplicação Web SPA desenvolvida em React + Vite
- API Serverless desenvolvida em Hono + Cloudflare Workers
- Monorepo PNPM com módulos compartilhados
- D1 como banco SQL nativo do Cloudflare
- R2 como armazenamento de ativos do sistema
- Schemas Zod + Tipagem compartilhada entre API e Frontend
Toda a stack foi organizada para garantir:
Objetivos Arquiteturais
- Estabilidade operacional — eliminação de dependências incompatíveis
- Alta performance — execução 100% na borda (Cloudflare Edge)
- Código DRY e modular — contratos reutilizáveis via pacotes internos
- Escalabilidade horizontal — escalonamento automático global
- Governança de código — auditoria interna automatizada
O repositório utiliza PNPM Workspaces, que organiza o código em aplicações (apps/) e bibliotecas internas (packages/).
.
├── apps/
│ ├── api/ # API serverless (Hono + Cloudflare Workers)
│ │ ├── src/
│ │ │ ├── config/ # Configurações (D1, R2, Environment)
│ │ │ ├── middlewares/ # Middlewares Hono (ex: JWT Guard)
│ │ │ ├── modules/ # Módulos de domínio
│ │ │ │ ├── auth/
│ │ │ │ └── todos/
│ │ │ └── index.ts # Entry point da API (fetch handler)
│ │ └── wrangler.jsonc # Configurações Cloudflare
│ │
│ └── frontend/ # SPA React (Vite)
│ ├── src/
│ │ ├── components/
│ │ ├── context/
│ │ ├── pages/
│ │ ├── routes/
│ │ └── services/ # Clientes HTTP (axios)
│ └── package.json
│
└── packages/
├── shared/ # Tipos + Schemas Zod compartilhados
│ ├── src/
│ │ └── schemas/
│ └── package.json
│
└── utils/ # Utilidades internas reutilizáveis
└── package.json
pnpm-workspace.yaml # Declara os workspaces do projeto
pnpm-lock.yaml # ÚNICO lockfile permitido no monorepo
As versões abaixo refletem o ambiente de desenvolvimento e as dependências principais usadas no monorepo. Atualize sempre que fizer upgrades e sincronize com
package.jsonepnpm-lock.yaml.
| Componente / Ferramenta | Versão usada / recomendada |
|---|---|
| pnpm (workspace) | ≥ 9.0 (recomendado) |
| Node.js (dev) | 18.x / 20.x (LTS recomendado) |
| React | 19.2.0 |
| Vite | 7.2.4 |
| React Router DOM | 7.9.6 |
| Material UI | 7.3.5 |
| Axios | 1.13.2 |
| TypeScript | 5.9.3 |
| Hono | 4.10.7 |
| Cloudflare Wrangler | 4.51.0 |
| @hono/jwt | latest (usar versão compatível com Hono v4) |
| bcryptjs | 3.0.3 |
| Zod | 3.23.0 |
| Cloudflare D1 | (serviço Cloudflare — use runtime compatível com Wrangler 4.51) |
| pnpm-lock.yaml | Único lockfile do monorepo |
- Adicione campos
enginesnopackage.jsonda raiz para travar a versão mínima do Node/pnpm:"engines": { "node": ">=18", "pnpm": ">=9" }
- Mantenha uma única fonte de verdade para versões: Use
package.jsonpor workspace epnpm-lock.yamlna raiz. - Automatize updates com Renovate/Dependabot e crie PRs de atualização.
- Ao atualizar uma dependência incompatível (ex.: Hono maior), atualize também esta tabela e as instruções de deploy (
wrangler.jsonc/wrangler.toml).
O PNPM utiliza uma arquitetura moderna baseada em:
✔ Repositório Central ("PNPM Store")
Onde todas as dependências reais ficam armazenadas:
~/.pnpm-store
✔ Node Modules Virtuais (Symlinks)
Cada workspace possui sua própria pasta node_modules, porém contendo apenas links simbólicos para os pacotes na store.
✔ Benefícios
- Redução extrema de espaço
- Instalações até 30x mais rápidas
- Zero duplicação de dependências
- Cache persistente global
❗ Política Oficial do Projeto
O monorepo NÃO permite o uso de:
package-lock.json(bloqueado)yarn.lock(bloqueado)
A API segue o padrão funcional adaptado para a borda:
Cliente → Worker (fetch) → Hono → Middleware → Rota → Controller → Service → D1
| Camada | Descrição |
|---|---|
| index.ts | Ponto de entrada do Worker. Monta o app Hono. |
| routes/ | Define rotas e associa a validações Zod via zValidator. |
| middlewares/ | Autenticação JWT, CORS, Logs. |
| modules/ | Domínio (auth, todos), com controllers e services. |
| services/ | Acessam o banco D1 via env.DB. |
| D1 SQL | Persistência nativa, sem ORMs. |
- Hashing de senha →
bcryptjs - JWT →
@hono/jwt(sign & verify) - Secrets → configuradas via
wrangler secret put
Tokens:
- Access Token: 15 minutos
- Refresh Token: 7 dias
Banco:
governance-system-db
ID: fbdff5ac-2fcc-4182-9cbf-be6c1d08e287
Migrations:
Localizadas em:
apps/api/migrations/
Aplicação:
pnpm wrangler d1 migrations apply governance-system-db
A aplicação cliente é uma SPA que utiliza:
- React 19
- Material UI
- React Router DOM
- Axios para consumo da API
- Context API para autenticação
Fluxo de autenticação:
Login → Recebe JWT → Grava em localStorage → Interceptor Axios aplica Authorization → Rotas protegidas
O pacote packages/shared contém:
- Tipos globais
- Schemas Zod
- Contratos entre API e Frontend
Exemplo de export:
import { LoginSchema, TodoSchema } from '@app/shared';
O monorepo inclui um módulo interno de Auditoria que executa verificações automáticas.
Comando:
pnpm audit:repo
Verificações executadas:
| Teste | Severidade | Status |
|---|---|---|
| TODOs no código | Low | ✔ |
| Uso de any | Medium | ✔ |
| Magic Numbers | Medium | ✔ |
| Catch vazio | High | ✔ |
| then() sem catch() | High | ✔ |
| Funções muito grandes | Medium | ✔ |
| Ciclos de importação | Critical | ✔ |
| Imports suspeitos | Low | ✔ |
| Imports não utilizados | Low | ✔ |
| Arquivos duplicados | Medium | ✔ |
| Pastas duplicadas | Low | ✔ |
| Estrutura do monorepo | High | ✔ |
O relatório é gerado automaticamente em:
/audit/report.md
- Usar somente PNPM
- Apenas 1 lockfile →
pnpm-lock.yaml - Importar apenas via paths absolutos configurados
- Proibido deixar código sem validação Zod
- Proibido lógica de negócio dentro de controllers
- Proibido criar "Models" (não existe ORM)
- Determinístico
- Funcional
- Puro quando possível
- Segregado por domínio
- Compartilhado apenas via “packages/”
[React App]
↓ HTTP
[Cloudflare Edge]
↓
[Worker fetch()]
↓
[Hono Middleware]
↓
[Route Handler]
↓
[Controller]
↓
[Service]
↓
[D1 Database]
apps/api ───────┐
│
apps/frontend ───┤────> packages/shared
│
packages/utils ──┘
Próximos passos:
- Padronizar revisões via auditoria automática
- Criar scripts de CI (GitHub Actions)
- Gerar documentação interativa (OpenAPI + Zod)
- Criar CLI interna para migrações e seeds D1
- Implantar testes E2E usando Playwright