Me pasé un domingo actualizando giorgiosaud.io de Astro 5 a Astro 6, `@astrojs/svelte` 7 a 8, y `better-auth` 1.4 a 1.6. El build se rompió de tres maneras distintas. Acá va el post-mortem para que no tengas que redescubrir cada una. ## Problema 1: Async IIFE dentro de `onMount` rompe el preprocesamiento TypeScript de Svelte Después de actualizar `@astrojs/svelte` a la versión 8.x, el build empezó a fallar con: ``` [vite-plugin-svelte:compile] Unexpected token ``` El error apuntaba a una anotación de tipo como `: boolean` que no había sido eliminada del output compilado — TypeScript crudo llegando al compilador de Svelte. La causa era una async IIFE con prefijo de punto y coma dentro de `onMount`: ```svelte ``` Cuando `vitePreprocess({ script: true })` ejecuta esbuild para eliminar TypeScript de los bloques ` ``` ## Problema 2: Casteos `as` de TypeScript en templates de Svelte Otro error de compilación de Svelte apareció con este patrón en un template: ```svelte {(user as { role?: string }).role === 'admin' ? t.admin : t.user} ``` Los casteos `as` de TypeScript no son válidos en expresiones de template de Svelte — los templates compilan a JavaScript, no TypeScript. El preprocesador solo maneja el bloque ` {isAdmin ? t.admin : t.user} ``` ## Problema 3: Conflictos de versiones de dependencias transitivas con better-auth 1.6 `better-auth@1.6.9` incluye copias propias de sus dependencias peer en las versiones con las que fue compilado. Si versiones más antiguas de esos paquetes están hoisted en la raíz de `node_modules`, el build se rompe. Me encontré con tres conflictos: | Paquete | Versión hoisted | Versión requerida | Error | |---|---|---|---| | `@better-auth/core` | 1.4.10 | 1.6.9 | Missing `./utils/error-codes` specifier | | `better-call` | 1.1.7 | 1.3.5 | Missing export `kAPIErrorHeaderSymbol` | | `@peculiar/asn1-schema` | 2.6.0 | 2.7.0 | `Cannot get schema for 'AlgorithmIdentifier'` | **Fix:** agregar `overrides` (y `resolutions` para compatibilidad con bun) en `package.json`: ```json { "overrides": { "@better-auth/core": "1.6.9", "better-call": "1.3.5", "@peculiar/asn1-schema": "2.7.0" }, "resolutions": { "@better-auth/core": "1.6.9", "better-call": "1.3.5", "@peculiar/asn1-schema": "2.7.0" } } ``` ## Problema 4: Conflicto de `estree-walker` rompe la carga de la config de Astro en Vercel Incluso después de arreglar lo anterior, los builds en Vercel fallaban con: ``` [astro] Unable to load your Astro config No "exports" main defined in /vercel/path0/node_modules/estree-walker/package.json ``` `estree-walker@3.x` es solo ESM y tiene un campo `exports` correcto. `estree-walker@2.x` no. Algo en el árbol de dependencias estaba instalando `2.0.2` como versión hoisted en el entorno de Vercel. Localmente el build pasaba porque `3.0.3` ya era la versión hoisted de una instalación previa. Vercel restauró una caché del build anterior a la actualización, por lo que tenía `2.0.2` bloqueado. **Fix:** agregar `estree-walker` a los overrides y, crucialmente, **limpiar la caché de build de Vercel** antes de redesplegar. Sin limpiar la caché, Vercel restaura los `node_modules` viejos y el override nunca tiene efecto. ```json { "overrides": { "estree-walker": "3.0.3" }, "resolutions": { "estree-walker": "3.0.3" } } ``` Para limpiar la caché en Vercel: abrí el deployment fallido → **Redeploy** → marcá **"Clear cache and redeploy"**. ## El patrón Los cuatro problemas comparten la misma raíz: **un paquete que incluye sus propias dependencias en una versión específica queda tapado por una versión más antigua hoisted**. El fix es siempre el mismo — forzar la versión correcta con `overrides`/`resolutions` — pero diagnosticar qué paquete está en conflicto requiere leer el error con atención y cruzarlo con los `node_modules` anidados. Si después de una actualización mayor de dependencias encontrás errores de `Missing specifier` o `does not provide an export named`, revisá los `node_modules` anidados con: ```bash find node_modules -name "package.json" -path "*//package.json" | xargs grep '"version"' ``` Comparás versiones: la anidada es la que necesita el paquete, la hoisted es la que está rompiéndolo.