Comprobador de actualizaciones (Node 26, Laravel 13 y TypeScript 7)
Pega tu package.json, composer.json o tsconfig.json: te dice qué se rompe al subir a Node 26, Laravel 13 o TypeScript 7, en qué línea y cómo arreglarlo.
¿A qué versión vas?
Solo se lee en tu navegador. No sale ninguna petición con su contenido.
grep -rnE "_stream_(readable|writable|duplex|transform|passthrough|wrap)|writeHeader\(|module\.register\(|createRequire|experimental-transform-types|localStorage|QuotaExceededError|fetch\(" --include='*.js' --include='*.mjs' --include='*.cjs' --include='*.ts' --include='*.mts' --include='*.cts' --exclude-dir=node_modules --exclude-dir=dist --exclude-dir=build . ; grep -rnE "FROM node:|node-version" Dockerfile* .github/ 2>/dev/nullLánzalo en la raíz del proyecto. Sin este paso solo se revisan los archivos de arriba; con él, también el código. No pegues el .env.
Resultado: Node 26
Pega el manifiesto y aparece aquí lo que se rompe, ordenado por impacto.
Revísalo a mano (no se puede detectar desde fuera)
- Busca fósiles también en tus dependencias:
grep -rln "_stream_" node_modules --include="*.js" | head. Explicado en el artículo → - Tras cambiar a 26,
npm rebuild(o borrarnode_modulesy reinstalar) y reconstruir la imagen de Docker sobre la base nueva. Explicado en el artículo → - Pasa la suite con las deprecaciones visibles:
node --pending-deprecation --trace-deprecation ./node_modules/.bin/vitest run. Explicado en el artículo → - Cabeceras de
fetchque salen de una base de datos, de un formulario o de otra API: límpialas (.trim()) donde entran. Undici 8 lanzaTypeErrorcon un\nen vez de sanearlo. Explicado en el artículo → - Durante la instalación, mira los avisos
EBADENGINE: dicen qué dependencia no declara Node 26. Explicado en el artículo →
Reglas sacadas del análisis de Node 26 de este sitio y contrastadas el 2026-09-27. /blog/node-26-lts-que-se-rompe/
Qué hace esta herramienta
Le pegas el manifiesto de tu proyecto —package.json si vas a Node 26, composer.json si vas a Laravel 13, tsconfig.json si vas a TypeScript 7— y te devuelve lo que se rompe, ordenado por impacto y con el cambio concreto para cada caso. Si además pegas la salida del comando del paso 2, revisa también tu código y te señala el archivo y la línea.
Las reglas no son genéricas: salen de los análisis de este sitio sobre qué se rompe al actualizar a Node 26, los cambios que rompen en Laravel 13 y qué se rompe en TypeScript 7. Cada hallazgo enlaza la sección que lo explica con el código de antes y después.
Por qué un grep y no tu repositorio
El comando del paso 2 es un grep -rn que busca solo los patrones que cambian en esa versión. Su salida trae la ruta y el número de línea de cada coincidencia (tests/Feature/CheckoutTest.php:18:…), así que la herramienta puede decirte dónde está cada problema sin ver el resto de tu código. Todo se analiza en el navegador y no sale ninguna petición con lo que pegas.
Lo que detecta en Node 26
engines.nodeque deja fuera la 26, o que todavía admite Node 22 o anteriores.- Addons nativos (
bcrypt,better-sqlite3,canvas…) que necesitan binario para el ABI 147, ynode-sass, que no lo va a tener. - Agentes de observabilidad y cargadores (
dd-trace,@opentelemetry/*,tsx…) que viven en la capa demodule.register(), ahora deprecada. - El flag
--experimental-transform-types, que ya no existe. - En el código:
require('_stream_readable')y compañía,res.writeHeader(),requiresin extensión en paquetes ESM, llamadas afetchque Undici 8 puede rechazar y la imagen de Docker o la matriz de CI que siguen en una versión vieja.
Lo que detecta en Laravel 13
laravel/frameworkyphpque no admiten la 13, y si vienes de la 10 u 11, el aviso de ir versión a versión.- Las dependencias que suben con el framework:
laravel/tinker ^3.0,phpunit ^12.0,pest ^4.0ylaravel/boost ^2.0. laravel/helpers, cuyoarray_first()choca con el del polyfill de PHP 8.5.- En el código:
VerifyCsrfTokenen tests y rutas,upsert()conuniqueByvacío,$event->exceptionOccurred,QueueBusy, rutas con dominio, pivotes polimórficos, factories deStr, callbacks deextend, las vistaspagination::defaultyJs::from.
Lo que detecta en TypeScript 7
- Las opciones del
tsconfig.jsonque ya no existen:baseUrl,target: "es5",downlevelIteration,moduleResolution: "node"y"classic",module: "amd"/"umd"/"systemjs"/"none", yesModuleInterop,allowSyntheticDefaultImportsoalwaysStrictenfalse. Lee el archivo con comentarios y comas finales, como lo leetsc. - Te da el bloque
pathsreescrito sinbaseUrl, con cada destino relativo al tsconfig y con./delante. Es el cambio que suele hacerse a medias: si solo quitasbaseUrl, saleTS5090. - Del
package.json: si tu rango detypescriptsalta a 7 sin que lo decidas, qué dependencias necesitan la API que 7.0 no trae (typescript-eslint,ts-jest,ts-morph, Vue, Svelte, Astro, MDX) y el paquete de compatibilidad que te deja compilando con 6 sin que lo notes. - De la salida pegada: si
npx tscy el binario real no son la misma versión, elTS5101(«is deprecated and will stop functioning in TypeScript 7.0»), que delata que sigues en 6, y los scripts de CI que esperan el código de salida2.
Lo que ninguna herramienta ve desde fuera
Hay cambios que dependen de tu entorno y no de tus archivos: los prefijos de caché y de sesión de Laravel si no están fijados en el .env, o las cabeceras de fetch que llegan de una base de datos. Por eso el resultado termina con una lista para revisar a mano. Un informe limpio es buena señal, no un permiso: pasa la suite entera antes de mover producción.
Preguntas frecuentes
¿Qué revisa exactamente?
Del manifiesto, las restricciones de versión y la configuración: si engines.node admite 26, si php y laravel/framework admiten 13, qué opciones del tsconfig elimina TypeScript 7 y las dependencias que hay que subir con ellos, más los paquetes que se sabe que dan guerra (addons nativos, agentes de observabilidad, laravel/helpers). De la salida del grep, los patrones de código que cambian: módulos _stream_, writeHeader, VerifyCsrfToken, upsert con uniqueBy vacío, exceptionOccurred y el resto de la lista de cada versión.
¿Se sube mi código a algún servidor?
No. Todo se analiza en tu navegador con JavaScript y no sale ninguna petición con lo que pegas. Aun así, no hace falta pegar el proyecto entero: el comando del paso 2 solo extrae las líneas que interesan. No pegues nunca el .env.
¿Por qué me pide la salida de un grep en vez del repositorio?
Porque la salida de grep -rn lleva la ruta y el número de línea de cada coincidencia, y con eso la herramienta te dice dónde está cada problema sin ver el resto del código. Si prefieres, también puedes pegar un archivo suelto: se numera desde la línea 1.
Si no marca nada, ¿puedo actualizar tranquilo?
Es buena señal, pero no basta. Hay cambios que no se ven desde fuera, como los prefijos de caché de Laravel que dependen de tu .env o las cabeceras dinámicas de fetch en Node. Por eso la herramienta termina con una lista para revisar a mano. Pasa la suite entera antes de mover producción.
Me sale «Option 'baseUrl' is deprecated and will stop functioning in TypeScript 7.0». ¿Qué hago?
Es el error TS5101: todavía compilas con TypeScript 6 y te avisa de que en 7 esa opción ya no existe. Silenciarlo con ignoreDeprecations no sirve, porque en 7 el compilador no arranca. Pega tu tsconfig.json en la herramienta y te devuelve el bloque paths reescrito sin baseUrl, con las rutas relativas que pide TypeScript 7.
¿Va a cubrir otras versiones?
Sí. Cada regla sale de un análisis de qué se rompe al actualizar publicado en este sitio. Las siguientes serán las versiones de ese análisis que más se consultan.
Reseñas y valoraciones
Aún no hay reseñas. ¡Sé la primera persona en opinar!
Guías relacionadas
Tutoriales del blog donde esta herramienta resulta útil.
Herramientas relacionadas
Otras del catálogo que se usan bien junto a esta.