@fesa/components
La librería de componentes compartida de los sistemas FESA — un solo paquete, un módulo por dominio.
@fesa/components es el paquete compartido de los sistemas FESA. Nació como la extracción del datatable (antes @fesa/datatable) y hoy agrupa todos los componentes que estaban duplicados entre FesaStore, fesa.com.pa, Fesa ID y el starter. Un solo repo, una sola versión, y cada app importa solo el módulo que usa.
Mapa de módulos
| Módulo | Import | Qué contiene | Estado |
|---|---|---|---|
| DataTable | @fesa/components/datatable | Tabla server-first completa (paginación, filtros, export, selección masiva) | Estable — en producción en 4 apps |
| Formularios | @fesa/components/forms | 48 campos react-hook-form (~19.000 LOC): moneda, teléfono, firma, crop de imagen, recurrencia… | Adoptado — fesa.com.pa (v0.5.2) |
| UI | @fesa/components/ui | Primitivas shadcn que usan los formularios + password-input, combobox | Extraído v0.5.2 |
| Motion | @fesa/components/motion + /hooks | AnimatedSection, AnimatedCounter, BackToTop, use-in-view (antes 4 copias idénticas) | Extraído v0.5.2 |
| Utilidades | @fesa/components/utils | Errores, paginación, slug, contraste WCAG, sanitize, cache y rate-limit en memoria, puertos de infraestructura | Extraído v0.5.2 |
| Seguridad | @fesa/components/security | WAF por reglas con puntuación (48 reglas, con tests) | Extraído v0.5.2 |
@fesa/components/email | Design system de correos (EmailLayout + MetaBox/CtaButton/CodeBox/AlertBox, el de FesaStore) + adapter Resend | Extraído v0.5.2 | |
| Auth | @fesa/components/auth | better-auth + drizzle MySQL: registro cerrado, roles parametrizables, plugin admin | En producción — developers.fesa.com.pa (v0.6.1) |
| Storage | @fesa/components/storage | Adapter Cloudflare R2/S3 detrás de IStorageService | Extraído v0.5.2 |
Regla de la casa
Ningún módulo importa next-intl ni catálogos de mensajes: todos los textos tienen default en
español y se sobreescriben por props o provider (el patrón del DataTableLabelsProvider).
Las dependencias pesadas (aws-sdk, resend, react-email) son peers opcionales: solo las instala
la app que importa ese módulo.
Instalación
"dependencies": {
"@fesa/components": "git+ssh://[email protected]/AdanSerrano/fesa-components.git#v0.5.2"
}transpilePackages: ["@fesa/components"]@source "../node_modules/@fesa/components/src";Igual que siempre: tag pineado, TSX crudo sin build, la app lo compila con su propio Tailwind y tsconfig.
Migrando desde @fesa/datatable
Los pins viejos a fesa-datatable.git#v0.4.0 siguen funcionando (GitHub redirige el repo
renombrado). Al subir a v0.5.x: cambia el nombre del paquete, la URL, y los imports de
@fesa/datatable → @fesa/components/datatable (y /server). El API de la tabla no cambió.