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
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
- Diagnóstico + fix — confirmar a causa (mapping
paths.server-onlynão aplicado vs.importMap.jscommitado) e corrigir: (a) fazer o mapeamento funcionar (ou trocar porcompilerOptions.paths/condiçãoreact-serverno knip) e/ou (b) destrackear oimportMap.js(OPS99 diz que não deveria estar commitado — foi commitado emfea6c645/b03cec7cpara corrigir o admin em branco). Provar:pnpm knipsem a linhaError loading src/payload.config.tse com a análise completa (um export morto de teste é detectado). - 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.jsestá 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.