Estrutura do Monorepo

Entendendo a estrutura e flexibilidade do Turborepo.

Utilizamos o Turborepo para gerenciar nosso monorepo. Essa estrutura nos permite hospedar várias aplicações e pacotes compartilhados em um único repositório Git, facilitando o compartilhamento de código e commits atômicos.

Estrutura de Diretórios

.
├── apps/
│   ├── accounts/       # Aplicação Angular para gerenciamento de usuários
│   ├── api/            # Aplicação backend NestJS
│   ├── docs/           # Site de documentação (Next.js)
│   ├── site/           # Aplicação do site principal (React/Vite)
│   └── web/            # Aplicação web (React/Vite)
├── packages/
│   ├── eslint-config/  # Configurações compartilhadas do ESLint
│   ├── numeracao-digital/ # Pacote de numeração digital
│   ├── shared/         # Tipos compartilhados, DTOs e utilitários
│   ├── typescript-config/ # TSConfigs compartilhados
│   └── ui/             # Biblioteca de componentes UI compartilhada
├── package.json        # Configuração raiz e scripts
└── turbo.json          # Configuração do pipeline Turborepo

Principais Benefícios

  1. Código Compartilhado: O diretório packages/shared nos permite definir interfaces TypeScript (DTOs, Entidades) uma única vez e consumi-las tanto na API quanto nas aplicações Frontend. Isso garante que o frontend esteja sempre sincronizado com as estruturas de dados do backend.
  2. Ferramentas Unificadas: Utilizamos um único arquivo de lock (pnpm-lock.yaml) e configurações consistentes para ESLint, Prettier e TypeScript em todos os projetos.
  3. Cache: O Turborepo armazena em cache os resultados das builds. Se você não alterou um pacote, o Turbo não o reconstruirá, acelerando significativamente os pipelines de CI/CD.
  4. Gerenciamento de Dependências: Os workspaces do pnpm nos permitem vincular pacotes localmente. Alterações em packages/ui são refletidas instantaneamente em apps/docs sem a necessidade de um ciclo de publicação/instalação.

Workspaces

Este projeto está configurado como um workspace pnpm. O arquivo pnpm-workspace.yaml define os locais dos pacotes do workspace:

packages:
  - 'apps/*'
  - 'packages/*'