teqo-backup/docs/plans/ops-knip-importmap-artifact.md
Francisco Solla 067857a03a fix(OPS124): desabilita o plugin Payload do knip e explicita as exclusões (Closes #1094)
O `pnpm knip` imprimia `ERROR: Error loading src/payload.config.ts
(...server-only...)` e saía 0 — gate verde com o ERROR silencioso, no CI
(`ci-pr.yml`/`deploy.yml`) e local. O plugin embutido do Payload carregava
`src/payload.config.ts` via jiti sob as condições Node padrão e o import
transitivo de `server-only` lançava (só o `react-server` traz o `empty.js`);
o `paths.server-only` do `knip.json` alimenta apenas o resolver estático, não
o carregamento jiti (e o `tsconfig` alias, que funcionaria no load, foi
rejeitado por re-apontar a guarda server/client — classe OPS69).

Fix: `"payload": false` e as contribuições do plugin explicitadas no
`knip.json` (`!src/payload-types.ts` load-bearing; `!src/migrations/**`
paridade), removendo o bloco `paths` inerte. Provado: `pnpm knip` sai 0 sem o
ERROR, um export morto plantado é detectado, e a corrida de controle com
`server-only` neutralizado dá findings idênticos.

Plano: docs/plans/ops-knip-importmap-artifact-impl.md
2026-09-16 19:55:07 -03:00

3.2 KiB

OPS: knip carrega o payload.config.ts com erro (importMap commitado) e roda com análise degradada

Status: executado (impl: docs/plans/ops-knip-importmap-artifact-impl.md) Atualizado em: 2026-09-16 Issue: #1094 (OPS124) Priority: P3 Impeccable: A — sem UI Appetite: ~30 min eng; sem schema, sem deploy

Intenção

pnpm knip imprime ERROR: Error loading src/payload.config.ts (This module cannot be imported from a Client Component module. It should only be used from a Server Component.) e sai com código 0 — acontece no CI (run 35099887216) e local, sempre que src/app/(payload)/admin/importMap.js está no working tree. Esse arquivo está commitado (apesar de knip.json/OPS99/.gitignore o tratarem como artefato de build), importa componentes client e faz o knip carregar payload.config.ts; o server-only resolve para o entry que lança sob as condições padrão (não react-server), e a regra paths.server-only do knip.json não está sendo aplicada ao specifier de pacote. Sem o arquivo, o knip completa (com 2 unresolved imports esperados de [[...segments]]). Por sair 0, o gate fica verde com o knip degradado em silêncio: um ERROR que ninguém lê e uma análise possivelmente incompleta (o entry falhou ao carregar).

Correção de rumo (2026-09-16): durante o C178 eu supus que isso quebrava pnpm push/gate:ci local; na prática o exit é 0 e o push não é afetado. O problema real é o erro silencioso.

Segunda correção de rumo (2026-09-16, no impl): o ERROR é independente do importMap.js — ele reaparece só de carregar a config, com ou sem o arquivo; o importMap commitado apenas troca o exit 1 (unresolved ../importMap) por um exit 0. E o paths.server-only não pode corrigir o carregamento (só alimenta o resolver estático do knip). O caminho escolhido é desabilitar o plugin do Payload e explicitar o que ele contribuía — ver docs/plans/ops-knip-importmap-artifact-impl.md.

Fases verificáveis

  1. Diagnóstico + fix — confirmar a causa (mapping paths.server-only não aplicado vs. importMap.js commitado) e corrigir: (a) fazer o mapeamento funcionar (ou trocar por compilerOptions.paths/condição react-server no knip) e/ou (b) destrackear o importMap.js (OPS99 diz que não deveria estar commitado — foi commitado em fea6c645/b03cec7c para corrigir o admin em branco). Provar: pnpm knip sem a linha Error loading src/payload.config.ts e com a análise completa (um export morto de teste é detectado).
  2. Gate — pnpm gate:fast + pnpm push; sem tocar no pipeline de CI além do necessário.

Já resolvido no simplify/critique (não reabrir)

  • Confirmado que o comportamento é idêntico no CI e local (o importMap.js está commitado, então o CI também vê o arquivo) e que o exit code é 0 — não é um gate quebrado.

Explicitamente fora

  • Mudar a ordem do CI (knip antes do build já é o caso; e o build não é o gerador do arquivo no repo).
  • Limpar outros pontos do knip.json.

Self-score (decisão)

4/5 — fix barato e reversível, causa-raiz nomeada (com correção de rumo registrada), prova objetiva (o ERROR some + export morto detectado), sem risco de produção.