Solución de problemas
Los síntomas conocidos al consumir la librería, con su causa y su arreglo.
Formato bitácora: síntoma → causa → solución. Los problemas específicos del datatable tienen su propia página.
Los componentes se ven "rotos" (sin bordes ni espaciados)
Causa: Tailwind no escanea la librería.
Solución: @source "../node_modules/@fesa/components/src"; en el globals.css y reinicia el dev server.
Turbopack dev: "module factory is not available"
Causa: hay copias anidadas de alguna dependencia en node_modules/@fesa/components/node_modules (instalación vieja, anterior a v0.5.2) — o el caché de turbopack quedó stale tras reinstalar.
Solución: confirma que ese directorio anidado no existe (desde v0.5.2 todo el runtime es peer). Si existe: purga e instala de nuevo. Si no existe: rm -rf .next y arranca dev otra vez — y en el navegador, hard reload (los chunks de turbopack-dev se nombran por ruta, no por contenido, y el navegador puede servir los viejos).
bun install no trae la versión nueva
Causa: bun cachea la resolución del commit git por URL.
Solución:
bun pm cache rm
# borra las líneas @fesa/components del bun.lock
rm -rf node_modules/@fesa
bun installEl install falla resolviendo el paquete en un servidor
Causa: el servidor no puede leer el repo privado por SSH.
Solución: deploy key de solo lectura en GitHub → fesa-components → Settings → Deploy keys.
bun reporta un peer sin cumplir
Causa: la app fija una versión fuera del rango del peer (la librería los declara amplios a propósito).
Solución: normalmente basta actualizar el paquete en la app. Si el rango de la librería es el estrecho, es un bug nuestro: repórtalo — se ensancha en la librería (como se hizo con lucide-react).
"Cannot find module 'vaul' / 'sonner' / 'react-hook-form'" al adoptar /ui
Causa: shimear un componente con export * from '@fesa/components/ui' re-exporta todo el barrel de UI, no solo el componente que pediste. TypeScript typechequea el barrel entero, así que cada peer de CUALQUIER componente del barrel tiene que estar instalado en la app — aunque no uses ese componente. Los que más sorprenden: drawer arrastra vaul, sonner arrastra sonner, form arrastra react-hook-form.
Solución: instala los peers que el barrel necesita aunque no los uses directamente:
bun add vaul sonner react-hook-formEn el bundle se tree-shakean (si no importas Drawer, vaul no llega al cliente); solo el typecheck y el install los piden. Una app que ya tenía esos componentes locales ya trae los peers; las que no (tracking, transfer) los necesitan al adoptar.
¿Por qué re-exportar todo el barrel?
El shim export * from '@fesa/components/ui' por archivo mantiene las rutas locales
(@/components/ui/button) intactas sin reescribir cientos de imports. El costo es que arrastra
los peers del barrel completo. Es un trade-off deliberado: cero churn en los consumidores a
cambio de instalar unos peers extra que el bundle descarta.
La bitácora completa del ecosistema
Los problemas que trascienden a la librería (builds, VPS, auth, datos) viven en la bitácora de developers.fesa.com.pa.