Skip to content

chore: detecta mudança no contrato do Strapi e remove specs mortas - #176

Open
iacapuca wants to merge 1 commit into
mainfrom
chore/strapi-zod-codegen
Open

chore: detecta mudança no contrato do Strapi e remove specs mortas#176
iacapuca wants to merge 1 commit into
mainfrom
chore/strapi-zod-codegen

Conversation

@iacapuca

@iacapuca iacapuca commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Adiciona um snapshot dos content types do Strapi e um job informativo que falha quando ele fica para trás. Nenhum arquivo de app/ foi alterado — typecheck, lint e build idênticos à baseline (286 / 150 / ✓).

O que entra

scripts/check-strapi-contract.mjs busca a spec, guarda components.schemas
pnpm strapi:contract atualiza o snapshot
pnpm strapi:contract --check falha se divergir
job Strapi contract informativo, no PR Validation

Sai 1.5 MB de peso morto: specification.json e app/types/strapi-api.ts, nenhum dos dois importado por lugar algum. O specification.json foi commitado em abril no #134 e nunca regenerado — o processo manual já tinha falhado na prática.

Por que só components.schemas

Os 64 paths mudam por motivos que não nos afetam (auth, upload), e a spec do Strapi 5 é experimental e sai com defeitos justamente neles: /auth/sessions/{sessionId} declara {sessionId} na URL e define parameters: []. É OpenAPI inválido — o Orval recusa a spec inteira por causa disso.

Por que não geramos tipos nem Zod

Essa era a proposta original, e o POC a derrubou.

A spec erra o formato da chave primária: declara documentId como uuid com regex estrita, e o Strapi 5 emite cuid.

documentId real       →  erndppywooar0fq6v99l2y5m
contrato gerado exige →  z.uuid().regex(/^[0-9a-f]{8}-.../)

Testado contra produção: zero de três projetos reais passariam. O efeito seria .parse() lançando em toda página que lê projeto, FAQ ou documento.

E o mais relevante: typecheck e build ficaram verdes com o código quebrado. É falha de runtime, invisível para os dois. Só apareceu buscando dado de verdade.

A doc do Strapi avisa que geradores podem emitir tipos mais frouxos que a realidade; aqui é o inverso e pior — mais estrito e factualmente errado.

O que o snapshot entrega

Quando alguém mexer num content type, o --check fica vermelho e o diff do strapi-contract.json mostra exatamente o que mudou. Um humano decide se algum schema Zod em app/queries/ precisa acompanhar.

É menos automático do que eu tinha proposto, mas é o que a spec sustenta hoje.

Informativo de propósito: um PR sem relação com o Strapi não deveria travar. Diferente do typecheck — que está permanentemente vermelho com 286 erros e virou paisagem — este nasce verde, então vermelho ali é sinal.

🤖 Generated with Claude Code

Adiciona um snapshot dos content types do Strapi e um job informativo que
falha quando ele fica para tras. Nenhum arquivo de app/ foi alterado.

- scripts/check-strapi-contract.mjs + `pnpm strapi:contract`
- strapi-contract.json: components.schemas da spec OpenAPI (36 KB)
- job "Strapi contract" no PR Validation
- remove specification.json (1 MB) e app/types/strapi-api.ts (504 KB)

Os dois arquivos removidos nao eram importados por lugar nenhum. O
specification.json foi commitado em abril no PR #134 e nunca regenerado --
o processo manual ja tinha falhado na pratica.

Guarda so components.schemas: os 64 paths mudam por motivos que nao nos
afetam, e a spec do Strapi 5 e experimental e sai com defeitos justamente
neles (/auth/sessions/{sessionId} declara um parametro que nao define, o
que faz o Orval recusar a spec inteira).

Deliberadamente nao gera tipos nem schemas Zod. A spec erra o formato da
chave primaria: declara documentId como uuid, e o Strapi 5 emite cuid
(erndppywooar0fq6v99l2y5m). Testado contra producao, zero de tres projetos
reais passariam numa validacao derivada dela -- e isso nao aparece em
typecheck nem em build, so em runtime. Os schemas em app/queries/ seguem
escritos a mao; o snapshot serve para revisao humana no PR.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NzvzBUT8kw8SbR4bsGab97
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown

🚀 Preview deploy

URL https://dabca8bf-ameciclo.ti-8b9.workers.dev
Version dabca8bf-ffa8-4bd8-8f23-795a9b7ed9d1
Commit f18547e6b57f2c913ded50670a2d4ee2cd95535e

Updates on every push. Production is unchanged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant