Error del glob loader de Astro 5 en monorepos

Tu build de Astro pasó. Cero errores. Cero advertencias. Pero tu contenido no aparece.

Recientemente me enfrenté a este problema en un monorepo de pnpm. Estaba usando las content collections de Astro 5 para añadir comentarios editoriales a mis páginas. Localmente, todo funcionaba perfectamente. En mi pipeline de CI, las páginas se renderizaban con contenido vacío.

El problema es cómo el glob loader resuelve las rutas.

El problema

El glob loader de Astro resuelve las rutas base relativas desde process.cwd(). No utiliza la ubicación de tu archivo de configuración.

En un monorepo, tu CI suele ejecutar el build desde la raíz del workspace. Localmente, probablemente ejecutas el build desde el directorio de la aplicación.

  • Local: el cwd es apps/oss-alternatives. La ruta ./content funciona.
  • CI: el cwd es la raíz del repositorio. La ruta ./content no existe.

Astro no lanza un error cuando no encuentra archivos. Simplemente devuelve una colección vacía. Publicas un sitio con datos faltantes y nunca te enteras.

La solución

Deja de usar strings relativos para las rutas. Usa import.meta.url para anclar tus rutas al archivo de configuración en lugar del directorio de trabajo.

Usa este patrón:

import { fileURLToPath } from "node:url";

const TAKES_DIR = fileURLToPath(
  new URL("./content/per-alternative-takes", import.meta.url)
);

Esto garantiza que la ruta sea siempre correcta, sin importar desde dónde ejecutes el build.

Evita colisiones de ID

El glob loader utiliza el campo slug en tu frontmatter como ID por defecto. Si un usuario añade un campo slug, esto puede romper tus búsquedas de datos. Usa generateId para forzar que el nombre del archivo sea el ID de autoridad.

Lecciones para desarrolladores de monorepos

  • Ejecuta smoke tests desde la raíz del workspace localmente. Si solo pruebas desde la carpeta de la app, se te escaparán los errores de rutas.
  • Añade comprobaciones de salud (health checks) a las colecciones. En tu entorno de desarrollo, lanza un error si una colección crítica devuelve cero elementos.
  • Usa la resolución de rutas absolutas para cada referencia de archivo en tus archivos de configuración.
  • Añade una comprobación post-despliegue para verificar que el contenido clave existe en el HTML en vivo.

Nunca confíes en el silencio. Un build exitoso no siempre significa un despliegue exitoso.

Fuente: https://dev.to/morinaga/what-i-learned-about-astro-5-glob-loader-path-resolution-in-a-pnpm-monorepo-2ed4