PulsoMetrics / main — Next.js 14 + TypeScript

Auditoría de Código Muerto & Refactor

Análisis estático completo · knip + depcheck + ts-prune · Sprint Q3 2026
Ejecutado: 2026-06-18 09:14
Archivos analizados: 183
Duración: 4.2 s
✓ Build pasó antes del análisis
23
Hallazgos totales
eliminables este sprint
9
Dependencias sin usar
en package.json
11
Exports huérfanos
TypeScript / TSX
3
Duplicados consolidables
componentes / utils
Salida de herramientas de detección
knip depcheck ts-prune
$ npx knip --reporter compact
Unused files: src/experiments/AiInsightsV1.tsx, src/experiments/MetricsBeta.tsx
Unused exports: formatPercentage (src/utils/format.ts), OldDashboard (src/components/OldDashboard.tsx)
Unused dependencies: lodash, moment, @types/uuid
$ npx depcheck
Unused dependencies: lodash, moment, axios, react-tooltip, classnames, @radix-ui/react-popover, react-hot-toast
Unused devDependencies: @types/lodash, husky (config vacía)
$ npx ts-prune | grep -v "(used in module)"
src/utils/format.ts:12 - formatPercentage
src/utils/format.ts:28 - truncateLabel
src/hooks/useOldTheme.ts:1 - useOldTheme
src/lib/api/legacyClient.ts:3 - legacyFetch, legacyPost (8 exports)
📦 Dependencias sin usar — package.json
9 paquetes
Paquete Versión actual Riesgo Motivo Ahorro estimado
moment 2.29.4 SAFE Reemplazado por date-fns en Dic 2025. Ningún import activo. −287 kB
lodash 4.17.21 SAFE Usado en 0 ficheros. Funciones nativas cubren el caso de uso. −71 kB
axios 1.6.8 SAFE Todo el fetching usa fetch() nativo o SWR. Sin imports. −43 kB
classnames 2.3.3 SAFE Proyecto usa clsx (ya instalado). classnames huérfano. −4 kB
react-tooltip 5.25.0 SAFE Tooltips migrados a Radix Tooltip en Sprint 12. Sin refs. −38 kB
react-hot-toast 2.4.1 CAREFUL 1 import dinámico en código legacy no eliminado aún. −22 kB (condicional)
@radix-ui/react-popover 1.0.7 CAREFUL Instalado para experimento; 1 fichero experimental lo usa. −18 kB (condicional)
@types/lodash 4.14.202 SAFE devDep sin uso tras eliminar lodash. −0 kB bundle (dev only)
husky 9.0.11 SAFE .husky/ vacía. Nunca configurado. devDep inactivo. −0 kB bundle (dev only)
📤 Exportaciones huérfanas — TypeScript
11 exports
Export Fichero Línea Riesgo Acción
formatPercentage src/utils/format.ts 12 SAFE Eliminar export + función
truncateLabel src/utils/format.ts 28 SAFE Eliminar export + función
useOldTheme src/hooks/useOldTheme.ts 1 SAFE Eliminar fichero completo
legacyFetch, legacyPost
+ 6 más
src/lib/api/legacyClient.ts 3–89 CAREFUL Verificar llamadas dinámicas antes
OldDashboard src/components/OldDashboard.tsx 1 SAFE Eliminar fichero completo
METRIC_COLORS_V1 src/constants/colors.ts 44 SAFE Eliminar constante
AiInsightsV1, MetricsBeta src/experiments/ SAFE Eliminar carpeta experiments/
🔁 Duplicados consolidables
3 grupos
LoadingSpinner SAFE
Existe en: src/components/ui/LoadingSpinner.tsx y src/components/common/Spinner.tsx
Implementación canónica: ui/LoadingSpinner.tsx (más completa, acepta size prop)
Actualizar 4 imports de Spinner.tsx → LoadingSpinner; eliminar Spinner.tsx
formatCurrency SAFE
Existe en: src/utils/format.ts:5 y src/lib/helpers/currency.ts:12
Implementación canónica: utils/format.ts (maneja locales ES/EN, más testeada)
Redirigir 2 imports de helpers/currency → utils/format; eliminar currency.ts si queda vacío
useDebounce hook CAREFUL
Existe en: src/hooks/useDebounce.ts y src/features/search/hooks/debounce.ts
Diferencia: search/debounce.ts tiene delay distinto por defecto (150ms vs 300ms).
Unificar añadiendo prop delay opcional en useDebounce; actualizar SearchBar; eliminar duplicado
📋 Plan de eliminación por lotes (orden recomendado)
Lote 1 — Dependencias SAFE −443 kB bundle
  • npm uninstall moment lodash axios classnames react-tooltip
  • npm uninstall -D @types/lodash husky
  • npm run build → confirmar sin errores
  • npm test → suite verde
  • git commit "chore: remove 7 unused npm dependencies"
Lote 2 — Exports & archivos SAFE −5 ficheros
  • Eliminar src/experiments/ (AiInsightsV1, MetricsBeta)
  • Eliminar src/components/OldDashboard.tsx
  • Eliminar src/hooks/useOldTheme.ts
  • Limpiar formatPercentage, truncateLabel, METRIC_COLORS_V1
  • Build + tests → commit "refactor: remove dead exports and files"
Lote 3 — Duplicados SAFE −2 ficheros
  • Actualizar 4 imports Spinner → LoadingSpinner
  • Actualizar 2 imports currency → format
  • Eliminar Spinner.tsx y currency.ts
  • Build + tests → commit "refactor: consolidate duplicate components"
Lote 4 — Elementos CAREFUL requiere revisión
  • Grep dinámico: grep -r "legacyClient" --include="*.ts" .
  • Verificar react-hot-toast en código legacy
  • Unificar useDebounce con delay opcional
  • Eliminar solo si grep confirma 0 referencias dinámicas
📊 Impacto estimado tras la limpieza completa
Bundle JS (prod)
−443 kB
node_modules size
−180 MB
Tiempo de CI (install)
−18 s
Ficheros TypeScript
183 → 173
First Load JS (Next.js)
−31% estimado