Hoy publiqué @wendermedia/astro-components v3.0.0 en npm. No es un parche ni un release menor — es un major bump que combina tres migraciones conectadas: Astro 5 → 6, Tailwind 3 → 4 en los templates, y cambio de licencia de MIT a la Wender Media Source License v1.0.
Por qué tres migraciones en un solo release
Tres breaking changes en un solo major bump parecen mala ingeniería — pero la alternativa sería peor. Tres releases mayores separados (3.0 para Astro 6, 4.0 para Tailwind 4 en templates, 5.0 para la licencia) habrían forzado a los consumidores a pasar por tres migraciones consecutivas. Eso es fricción sin valor.
En su lugar: una migración, una guía de migración, una entrada en CHANGELOG. Quien quiera quedarse en v2.x (porque su código todavía está en Astro 5) simplemente fija @wendermedia/astro-components@2.1.0 y sigue recibiendo código bajo licencia MIT.
Astro 5 → 6: qué cambia
Astro 6 no es solo un bump de dependencias. Elimina varias APIs por completo y cambia los valores predeterminados de otras:
Node 18 y 20 ya no son soportados. Vite 7 es nuevo (o opcionalmente Vite 8 — ambos funcionan).
El import `import { ViewTransitions } from "astro:transitions"` ya no funciona. Reemplazo: `ClientRouter` (misma API, nuevo nombre).
La API antigua de colecciones con `type: "content"` y `type: "data"` desapareció. Nueva API basada en loaders con `glob()` y `file()` desde `astro/loaders`.
`z.string().email()` → `z.email()`. La ruta de import ahora es `astro/zod`. Adiós a `astro:schema`.
Reemplazo: `import.meta.glob()` con `{ eager: true }` o content collections.
La integración antigua de Tailwind no soporta Astro 6. Reemplazo: `@tailwindcss/vite` como plugin de Vite.
La librería en sí (src/, integrations/) está sorprendentemente intacta frente a estos cambios — cero llamadas a Astro.glob, cero <ViewTransitions />, cero content collections en el source. Todo el trabajo de migración vive en los templates y bundles, los scaffolds que los consumidores copian a sus propios proyectos.
Tailwind 4 en templates: de integración a plugin de Vite
En v2.x todos los templates usaban @astrojs/tailwind (la integración oficial de Astro). Esa integración está deprecated desde Tailwind 4 y no soporta Astro 6. El cambio:
import { defineConfig } from 'astro/config';
import tailwind from '@astrojs/tailwind';
export default defineConfig({
integrations: [tailwind()],
}); import { defineConfig } from 'astro/config';
import tailwindcss from '@tailwindcss/vite';
export default defineConfig({
integrations: [],
vite: {
plugins: [tailwindcss()],
},
}); Además: tailwind.config.js está muerto. Tailwind 4 ya no lee el config JS — todos los tokens viven como CSS custom properties en bloques @theme dentro de global.css. Es un tema de migración propio, pero relevante para los consumidores de la librería: quien copia un template también debe migrar su sistema de temas a @theme.
Storybook 8 → 10: addons absorbidos
Storybook 9 absorbió la mayoría de los essential addons en el core. Storybook 10 eliminó los paquetes stub vacíos. Lo que antes eran paquetes separados ahora vive como subpath exports dentro del paquete principal storybook:
| Storybook 8 | Storybook 10 |
|---|---|
| @storybook/addon-essentials | Absorbido en core (storybook/actions, storybook/viewport, storybook/highlight) |
| @storybook/addon-interactions | Absorbido en core (storybook/test con fn()) |
| @storybook/addon-links | Absorbido en core |
| @storybook/blocks | @storybook/addon-docs/blocks |
| @storybook/manager-api | storybook/manager-api |
| @storybook/theming/create | storybook/theming/create |
En la práctica: quitar cuatro paquetes de devDependencies, agregar uno nuevo (@storybook/addon-docs para parsing de MDX/Meta en historias Welcome), reescribir tres subpath imports en .storybook/manager.ts. Los 158 archivos de stories quedaron sin tocar — el import canónico de Meta/StoryObj desde @storybook/web-components sigue siendo válido en v10.
Cambio de licencia: MIT → Wender Media Source License v1.0
El cambio más interesante. v2.x corría bajo licencia MIT. v3.0 corre bajo una licencia nueva y propia: la Wender Media Source License v1.0 (WMSL v1.0). Identificador SPDX: LicenseRef-Wender-Media-Source-1.0.
No es una licencia OSI-approved open source. Es una licencia source-available con elementos de copyleft, inspirada en la estructura de la Mozilla Public License 2.0:
Uso comercial gratuito, modificaciones locales, redistribución bajo la misma licencia, inclusión en proyectos con licencias compatibles.
Preservar copyright headers en archivos modificados, incluir LICENSE en redistribuciones, preservar author/contributors en package.json derivados.
Badge en README "Built with @wendermedia/astro-components" o mención en sección de créditos. No es obligatorio — la adopción supera a la visibilidad forzada.
Sublicenciar bajo licencia más permisiva (no relicense a MIT/Apache), eliminar copyright headers, falsificar autoría, usar la marca "Wender Media" en nombres derivados.
Si necesitas código MIT, usa v2.1.0. Si estás en Astro 6 y puedes vivir con WMSL, obtienes v3.0 con todos los nuevos patterns.
La asimetría entre migración de librería y sitio
Migrar una librería que vive en un repo de librería (un paquete npm, no un site build) tiene una particularidad: el directorio de código fuente (src/) está sorprendentemente neutral frente a major bumps de Astro. Todo el trabajo se concentra en cuatro áreas disjuntas:
LICENSE nuevo (354 líneas, 14 secciones), archivo NOTICE, package.json (license, version, peerDeps, optionalDeps, engines), README con sección de attribution, CHANGELOG, guía de MIGRATION, todos los copyright headers.
Siete ViewTransitions → ClientRouter, cuatro schemas de content-collections a Content Layer API, cinco astro.configs a @tailwindcss/vite, todas las llamadas z.string().method() a sintaxis zod 4.
Ocho astro.configs de bundles a Tailwind 4, cuatro configs de content-collection movidos (src/content/config.ts → src/content.config.ts), bundles/blog rss.xml.ts post.slug → post.id, Starlight a 0.39.1.
Configs de .storybook/ con nuevos subpath imports, Welcome.mdx con @storybook/addon-docs/blocks, cuatro addons deprecated eliminados, addon-docs agregado, compat de vitest verificada.
Las cuatro áreas no se solapan — LICENSE/package.json/README en la raíz, templates/, bundles/, y .storybook/ tienen scope de archivos disjunto. Una vez que ves esta asimetría, la estrategia de migración se escribe sola: cada capa puede tratarse independientemente, sin necesidad de hacer dance con git worktrees porque nada colisiona. El archivo barrel index.ts de la librería es prácticamente neutral — solo se actualiza el header de copyright y el string de versión.
Migración de consumidores: qué tienes que hacer
Si usas @wendermedia/astro-components en tu proyecto y quieres actualizar a v3.0, hay una guía de migración completa en el repo. La versión corta:
Actualizar de v2.x a v3.0 en cinco pasos
- Verificar Node
node --version debería ser 22.12 o superior. Si no: nvm install 22 && nvm use 22.
- Instalar Astro 6
npm install astro@^6 en tu proyecto. Sigue la migración oficial de Astro para tus templates.
- Actualizar la librería
npm install @wendermedia/astro-components@^3 — la antigua v2.1.0 sigue disponible si necesitas hacer rollback.
- Configurar Tailwind 4
Si copias los templates: reemplaza @astrojs/tailwind por @tailwindcss/vite, reemplaza tailwind.config.js por @theme en CSS.
- Verificar
npm run build debe completar sin errores. Si hay problemas: fijar v2.1.0 (npm install @wendermedia/astro-components@2.1.0) te devuelve la versión MIT antigua.
Qué viene después
v3.0 es el inicio de una nueva línea. v3.x mantendrá Astro 6 como plataforma, pero los 158 componentes seguirán creciendo. Dos cosas están en el pipeline:
- Componentes React/Vue/Svelte/Solid — las versiones agnósticas de framework bajo
integrations/react/,integrations/vue/etc. ganarán unos 30 componentes más. - CLI experimental de generación de componentes —
wm-components new <descripción>scaffoldea componentes nuevos a partir de una descripción corta, alineados con el sistema de diseño. Experimental, llega con v3.2.
El pin de v2.1.0 sigue como opción LTS de largo plazo para proyectos en Astro 5 — sin actualizaciones, pero sin penalty de descargas tampoco.
Enlaces: