Saltar a contenido

RF-010 — Actualización de plataforma: React 19 estable y Next.js 16

Estado Hecho: Next 16.3.3 y React 19 estable (ADR-0006); la deuda que quedó (Node del pipeline y errores de tipos) se cerró el 2026-09-21 con la tarea #272. Falta endurecer la auditoría a --audit-level=high
Tipo Actualización de plataforma (deuda técnica de seguridad)
Ubicación package.json · src/middleware.ts · src/app/** · .github/workflows/auditoria-dependencias.yml
Depende de RF-000 · ADR-0004
Ver también Auditoría de dependencias del 2026-08-26 (ADR-0004, contexto)

Requisito

Eliminar las últimas vulnerabilidades conocidas del árbol de dependencias y salir de versiones sin soporte: el storefront corre sobre un release candidate de React 19 de noviembre de 2024 (fijado por overrides en package.json) y sobre Next.js 15.5, cuya rama arrastra vulnerabilidades en el postcss embebido (GHSA-qx2v-qp2m-jg93 y relacionadas) sin corrección dentro de la 15.x. Al completar la migración, endurecer el gate de CI de --audit-level=critical a --audit-level=high.

Solución planificada

Dos PRs secuenciales, cada uno verificado en dev-shop antes de mezclar (no hay suite de tests: la verificación es manual — checkout completo, búsqueda Algolia, resolución de región por middleware, login con Google, QR Bancard y formulario de crédito).

PR 1 — React 19 estable (prerequisito bloqueante)

Next 16 exige React >= 19.2; el RC fijado hoy lo impide.

  1. Quitar el bloque overrides de react/react-dom en package.json.
  2. Subir react y react-dom a 19.2.x (estable) y @types/react/@types/react-dom a la serie 19.
  3. Quitar la excepción de react/react-dom en .github/dependabot.yml y la restricción correspondiente en AGENTS.md.

Riesgo estimado: bajo-moderado. RC → estable de la misma major; el riesgo real es la antigüedad del RC (15 meses), no el cambio de API.

PR 2 — Next.js 16 (16.3.x)

Relevado contra el código el 2026-08-26:

  1. Correr el codemod oficial: npx @next/codemod@latest upgrade.
  2. params síncrono (rompe en 16): las tres páginas de transferencia de pedido (order/[id]/transfer/[token]/ y sus variantes accept/decline) acceden a params sin await. El codemod las corrige; verificar a mano.
  3. next lint eliminado: migrar el script lint al CLI de ESLint (arrastra ESLint 8 → 9 con flat config y eslint-config-next 16). Es la parte más laboriosa del salto.
  4. middleware.ts → proxy.ts: deprecado en 16, todavía funcional; renombrar.
  5. Limpiar devDependencies huérfanas del starter: babel-loader, @babel/core, webpack (no hay config de Babel ni webpack custom; Turbopack pasa a ser el bundler por defecto sin impacto).
  6. Subir la imagen base del Dockerfile, en línea con el engines de package.json. Se hizo en dos pasos: a node:22-alpine con la actualización y a node:24-alpine el 2026-09-21, cuando engines pasó a >=24 (tarea #272); el workflow de auditoría también usa Node 24.
  7. Endurecer .github/workflows/auditoria-dependencias.yml a --audit-level=high (cierra el TODO dejado en el ADR-0004). Sigue pendiente: al 2026-09-21 quedan 5 avisos altos en dependencias transitivas (brace-expansion, glob, minimatch, picomatch, preact), todos con arreglo disponible.

Compatibilidades ya verificadas: react-instantsearch-nextjs y react-instantsearch-router-nextjs aceptan next < 17; images.remotePatterns es el formato vigente; el proyecto corre sobre Node 24.

Criterios de aceptación

  • npm audit sin vulnerabilidades high ni critical, y CI en verde con --audit-level=high.
  • npm run build y npm run lint (nuevo CLI) sin errores.
  • Recorrido manual completo en dev-shop sin regresiones: catálogo, ficha, carrito, checkout, búsqueda, región por URL, login Google, crédito.
  • Sin overrides de React en package.json; Dependabot vuelve a cubrir React.

Estimación

Un día y medio de desarrollo (medio día PR 1, un día PR 2) más la verificación manual en dev-shop. Lo delicado no es el código sino la verificación, por la ausencia de tests.