Status: Approved · v2 · SPEC-CONTRACTS-STRUCTURE-001
depends_on: SPEC-DOMAIN-BASE-001
used_by: IS-ZERO-00.2, IS-MVP-15.1
Estrutura do pacote de contratos
O pacote
@raizfc/contractsé a única fonte compartilhada para tipos de transporte e vocabulário técnico entre web, mobile, API e mocks. Ele deve permanecer TypeScript puro, sem dependência de React, Expo, Next, NestJS, ORM, decorators ou bibliotecas de validação runtime.
Estrutura canônica
packages/contracts/
package.json
tsconfig.json
src/
index.ts
base.ts
api.ts
errors.ts
pagination.ts
money.ts
assets.ts
permissions.ts
enums.ts
constants.ts
auth/
territory/
entities/
dto/
api/
Regras obrigatórias
- IDs são
string; contratos não revelam UUID/ObjectId/sequence. - Datas são aliases de
stringISO-8601, nuncaDate. - Dinheiro usa
{ amountInCents: number; currency: "BRL" }e inteiros seguros. - DTO público, autenticado e de gestão são tipos distintos.
- Request/response de endpoint ficam em
src/api; entidades de transporte reutilizáveis ficam emsrc/dto. - Union types literais são preferidos a
enumTypeScript quando não existe ganho de runtime. - Nenhum
any;unknowndeve ser refinado fora do pacote. - Não duplicar tipos em apps ou API.
Dependências permitidas
O pacote não depende de nenhum outro pacote interno. Dependências externas devem ser zero no MVP.
Export público
Consumidores importam apenas de @raizfc/contracts ou subpaths oficialmente exportados. Paths profundos para src/ são proibidos.
Convenções de nomes
PublicTeamDto: leitura pública.TeamManagementDto: gestão autorizada.CreateTeamRequest/CreateTeamResponse: operação.TeamSummaryDto: referência leve embutida.TeamPrivateDtosó existe quando uma necessidade autenticada real foi especificada.
Nomes como TeamData, TeamInfo, ResponseObject ou IModel são proibidos por não expressarem visibilidade e intenção.
Exemplo base
export type ID = string;
export type ISODateString = string;
export type Currency = "BRL";
export type MoneyAmount = Readonly<{
amountInCents: number;
currency: Currency;
}>;
export type AuditMetadata = Readonly<{
createdAt: ISODateString;
updatedAt: ISODateString;
version: number;
}>;
Ciclos e direção
Arquivos base não importam domínios. DTOs podem importar tipos base e summaries; arquivos de API podem importar DTOs. Um DTO nunca importa um request/response de API. Revisões devem bloquear ciclos entre domínios.
Versionamento
Mudanças aditivas são preferidas. Remoções, renomes ou mudanças semânticas exigem análise de impacto em mocks, services, hooks, API, EPs e consumidores. O pacote mantém changelog interno quando o desenvolvimento começar.
Critérios de aceite
- Package compila isoladamente.
- Zero imports de frameworks.
- Export map cobre somente APIs públicas.
- Todos os domínios do MVP possuem DTOs mínimos.
- Nenhum DTO público expõe dados de gestão/privados.