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.
- Quitar el bloque
overridesdereact/react-domenpackage.json. - Subir
reactyreact-doma19.2.x(estable) y@types/react/@types/react-doma la serie 19. - Quitar la excepción de
react/react-domen.github/dependabot.ymly la restricción correspondiente enAGENTS.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:
- Correr el codemod oficial:
npx @next/codemod@latest upgrade. paramssíncrono (rompe en 16): las tres páginas de transferencia de pedido (order/[id]/transfer/[token]/y sus variantesaccept/decline) acceden aparamssinawait. El codemod las corrige; verificar a mano.next linteliminado: migrar el scriptlintal CLI de ESLint (arrastra ESLint 8 → 9 con flat config yeslint-config-next16). Es la parte más laboriosa del salto.middleware.ts→proxy.ts: deprecado en 16, todavía funcional; renombrar.- 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). - Subir la imagen base del
Dockerfile, en línea con elenginesdepackage.json. Se hizo en dos pasos: anode:22-alpinecon la actualización y anode:24-alpineel 2026-09-21, cuandoenginespasó a>=24(tarea #272); el workflow de auditoría también usa Node 24. - Endurecer
.github/workflows/auditoria-dependencias.ymla--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 auditsin vulnerabilidades high ni critical, y CI en verde con--audit-level=high.npm run buildynpm 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
overridesde React enpackage.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.