Contribuicao
Padrões de Código
TypeScript strict, ESLint e convenções do projeto
TypeScript
- TypeScript 5.9 com
strict: true noUncheckedIndexedAccess: true— acesso a arrays/objetos retornaT | undefined- Path alias
@/mapeia para./src/
Type-checking
Use sempre o script do monorepo:
bun run check-typesEsse script roda tsc -b (build mode com project references) — a única forma confiável de validar tipos cross-package neste repo.
Nunca rode tsc --noEmit diretamente. Com project references, esse modo não detecta erros que cruzam fronteiras de pacote — é um gap silencioso. Você pode ver o type-check verde localmente e o build da Vercel quebrar logo depois. bun run check-types é a referência.
ESLint
- Flat config (ESLint 9+)
- Zero warnings:
--max-warnings 0 - Configs por tipo de app:
vite— apps/appnext-js— apps/docs
bun run lint # Lint tudo
bun run lint --filter=app # Lint só o appPrettier
Formatação automática para .ts, .tsx e .md:
bun run formatConvenções
Componentes
- shadcn/ui — Importe direto, sem wrappers
- Lucide — Único provider de ícones
- cn() — Para merge de classes
Estrutura de arquivos
src/
├── components/
│ ├── ui/ # shadcn (editável)
│ ├── layout/ # AppLayout, AppSidebar, nav-*
│ └── shared/ # Componentes reusáveis não-domain
├── features/<domain>/
│ ├── components/ # Componentes do domínio
│ └── *Page.tsx # Páginas (targets de rota)
├── hooks/ # 1 hook por tabela/concern
├── stores/ # Zustand stores
├── lib/ # Utilitários, constantes, supabase
├── providers/ # Context providers
└── routes/ # Router configNaming
- Componentes:
PascalCase(arquivos e funções) - Hooks:
camelCasecom prefixouse - Stores:
camelCasecom prefixousee sufixoStore - Arquivos:
kebab-casepara hooks e utilitários
Forms
- Use
useStatepor padrão - Adicione
react-hook-form+zodapenas quando a complexidade de validação justificar (3+ regras por campo)
Prefixo App
Reservado para layout shell: AppLayout, AppSidebar, AppHeader.