Skip to content

chore(deps): move build-only packages to devDependencies (closes #102) - #112

Draft
Guiroos wants to merge 2 commits into
mainfrom
claude/issue-102-build-deps-para-devdeps
Draft

chore(deps): move build-only packages to devDependencies (closes #102)#112
Guiroos wants to merge 2 commits into
mainfrom
claude/issue-102-build-deps-para-devdeps

Conversation

@Guiroos

@Guiroos Guiroos commented Aug 20, 2026

Copy link
Copy Markdown
Owner

O que mudou

Movi três pacotes de dependencies para devDependencies no package.json, mantendo os pins exatos:

  • @serwist/next@9.5.11 — plugin do next.config.mjs, roda só no build
  • serwist@9.5.11 — importado por app/sw.ts, que compila para public/sw.js (artefato estático, não é módulo de servidor)
  • tailwindcss-animate@1.0.7 — plugin do Tailwind, consumido por tailwind.config.ts na geração do CSS

package-lock.json regenerado com npm install --package-lock-only: o diff mexe em flags dev/devOptional, nenhuma versão resolvida trocou.

Adicionei um segundo it em __tests__/unit/dependencies.test.ts que falha quando qualquer entrada de dependencies tem todos os importadores em pontos de entrada de build (*.config.* da raiz, next.config.mjs, app/sw.ts).

Por que dessa forma

Seguindo a proposta da issue sem desvio.

  • Edição manual, não npm i -D: as 41 entradas do package.json são pins exatos; npm i -D reescreveria com caret. Movi as linhas entre os blocos à mão.
  • Estender o arquivo de teste existente e não criar um novo: rootConfigFiles() é exatamente a função cujo resultado o primeiro it trata como prova de uso em produção; a asserção nova precisa tratar o mesmo conjunto como contraprova. As duas definições têm que compartilhar a mesma lista — separá-las em arquivos distintos é como elas divergem depois. next.config.mjs (não casa com .config.) e app/sw.ts (está dentro de app/, varrido pela primeira checagem como se fosse runtime) entram na lista de build-entry explicitamente, com comentário registrando por quê.

A classificação de um pacote como dev no lockfile é por alcançabilidade a partir de dependencies, não por onde é declarado — por isso mover um único pacote de build arrastava toda a subárvore transitiva para o lado "produção".

Como testei

Todos os gates locais verdes (npm ci limpo antes):

  • npm run lint
  • npm run format:check
  • npm run typecheck
  • npm test — 498 testes ✓
  • npm run build

Aceite da issue confirmado:

  • npm audit --omit=dev: 1 lowfound 0 vulnerabilities
  • Contagem de pacotes "produção" do lockfile: 332 → 195 (−137)

Caso discriminante do gate (o que só a correção certa passa): movi tailwindcss-animate de volta para dependencies temporariamente e o novo it falhou com expected [ 'tailwindcss-animate' ] to deeply equal []; com a classificação correta, passa. O it pré-existente fica verde nos dois estados (o arquivo de config não sai do lugar), como a issue previu — por isso o gate novo era necessário.

Risco e o que NÃO foi coberto

Arquivos tocados

  • package.json — 3 linhas movidas de dependencies para devDependencies
  • package-lock.json — regenerado (só flags dev)
  • __tests__/unit/dependencies.test.ts — novo it + helper buildEntryPoints()

🤖 Generated with Claude Code


Generated by Claude Code

@serwist/next, serwist e tailwindcss-animate são ferramenta de build
com um único importador cada (next.config.mjs, app/sw.ts, tailwind.config.ts),
nenhum executado pelo servidor em runtime. Classificados como `dependencies`,
arrastavam 137 transitivas para a árvore de produção do lockfile (332 → 195)
e faziam `npm audit --omit=dev` acusar um advisory de esbuild que não roda
em produção.

Gate: novo `it` em __tests__/unit/dependencies.test.ts falha quando uma
dependência de produção tem todos os importadores em pontos de entrada de
build. Lockfile regenerado com `npm install --package-lock-only`; só flags
`dev` mudam, nenhuma versão resolvida.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WMiJ7AnXfpm3Xtt9S3M4pg

@Guiroos Guiroos left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Um único nit, não bloqueante — a mudança está correta e faz exatamente o que a #102 pede.

O que verifiquei e passou (worktree limpo, npm ci):

  • Gate discriminante funciona de verdade. Revertendo os três pacotes para dependencies, o it novo falha com expected [ '@serwist/next', 'serwist', 'tailwindcss-animate' ] to deeply equal []; com a classificação correta, passa. O it pré-existente fica verde nos dois estados (os importadores em arquivos de config não somem). Não é ruído verde.
  • Aceite da issue confere: npm audit --omit=devfound 0 vulnerabilities; contagem de produção do lockfile 332 → 195, exatamente o alvo da #102.
  • Diff do lockfile só mexe em flags dev/devOptionaldev — nenhuma versão resolvida nem integrity trocou.
  • Sem risco de runtime: npm ci instala dev+prod juntas (CI e Vercel recebem o mesmo conjunto), e os três só são importados em tailwind.config.ts, next.config.mjs e app/sw.ts (que compila para o artefato estático public/sw.js).

O nit está no comentário inline — não altera o resultado do gate.


Generated by Claude Code

Comment thread __tests__/unit/dependencies.test.ts Outdated
…edundante

next.config.mjs já casa com rootConfigFiles() (a substring `.config.` aparece
em `next.config.mjs`), então o join explícito era redundante e o comentário que
o justificava afirmava o inverso. app/sw.ts continua explícito — está dentro de
app/, varrido como runtime. O gate segue pegando os três pacotes misclassificados.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WMiJ7AnXfpm3Xtt9S3M4pg
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.

2 participants