Packages
packages/
Esta seccion centraliza la documentacion de cada package reutilizable y una guia general de lineamientos para mantener codigo compartido sostenible en el tiempo.
Packages del Monorepo Nidus
Este directorio contiene los paquetes compartidos que permiten construir aplicaciones consistentes, reutilizables y faciles de mantener dentro de Nidus.
Este archivo es el indice principal para humanos y agentes de IA cuando necesitan decidir donde buscar codigo reutilizable. Antes de crear una funcion, hook, schema, constante, servicio o componente compartido, leer este README y luego el README especifico del package candidato.
1. Objetivo de packages/
- Centralizar logica, configuracion y componentes compartidos.
- Reducir duplicacion entre apps.
- Definir contratos estables (exports) para escalar sin romper integraciones.
2. Estructura actual
| Package | Rol principal |
|---|---|
@repo/01-base-package | Base tecnica para crear nuevos packages |
@repo/analytics | Integraciones de medicion GA4, GTM y Meta Pixel |
@repo/app-errors | Contrato runtime neutral para errores tipados |
@repo/app-services | Servicios de aplicacion y casos de uso compartidos |
@repo/app-function-services | Servicios server-side para Cloud Functions |
@repo/brand-assets | Fuente y generacion de assets de marca |
@repo/client-operations | Queries, mutations y errores tipados en hooks cliente |
@repo/constants | Tokens y constantes globales |
@repo/eslint | Configuracion ESLint compartida |
@repo/firebase | Config comun para emuladores y runtime Firebase |
@repo/firebase-admin-adapter | Adaptador Firebase Admin para server |
@repo/firebase-client-adapter | Adaptador Firebase Client para browser |
@repo/hooks | Hooks reutilizables |
@repo/icons | Export centralizado de iconos |
@repo/motion | Wrapper compartido de Motion |
@repo/prettier | Configuracion Prettier compartida |
@repo/schemas | Contratos Zod y tipos compartidos |
@repo/tsconfig | Base TypeScript para todo el monorepo |
@repo/ui | Design system y componentes UI |
@repo/zustand | Export compartido de Zustand |
@repo/figma-registry | Registro, schema y validacion del SSOT de Figma |
3. Lineamientos de desarrollo
- Cada package debe tener API publica clara via
src/index.tsoexportsenpackage.json. - No exponer internals sin necesidad. Exportar solo contratos estables.
- Mantener cohesion: un package, un dominio tecnico.
- Todo cambio debe incluir chequeo minimo:
pnpm lint --filter <package>pnpm build --filter <package>opnpm type-check --filter <package>
- Documentar cualquier export nuevo en el README del package.
4. Como decidir donde guardar codigo
- Si solo lo consume una app y contiene comportamiento, rutas, contenido o permisos propios de esa
app, guardarlo en
apps/<app>/. - Si lo consumen dos o mas apps, define un contrato transversal o es infraestructura compartida, guardarlo en el package correspondiente.
- Si todavia no existe una necesidad real de compartirlo, no crear un package por anticipado.
- Si una parte es generica y otra depende de una app, guardar la parte generica en
packages/y el adaptador/composition en la app.
Mapa rapido por responsabilidad
| Necesidad | Buscar primero |
|---|---|
| Componentes UI y primitives | @repo/ui |
| Hooks genericos de browser | @repo/hooks o @repo/ui/src/hooks |
| Iconos | @repo/icons |
| Schemas Zod y tipos de datos | @repo/schemas |
| Rutas, permisos, paths Firebase y tokens | @repo/constants |
| Firebase desde browser | @repo/firebase-client-adapter |
| Firebase Admin desde server/functions | @repo/firebase-admin-adapter |
| Contrato runtime de errores tipados | @repo/app-errors |
| Casos de uso cliente | @repo/app-services |
| Ejecucion de queries/mutations en hooks cliente | @repo/client-operations |
| Casos de uso para Cloud Functions | @repo/app-function-services |
| Analytics y tracking | @repo/analytics |
| Configuracion transversal | @repo/eslint, @repo/prettier, @repo/tsconfig, @repo/firebase |
5. Como encontrar y consumir una API
- Buscar el simbolo por nombre en todo el repositorio antes de implementarlo de nuevo.
- Leer el
README.mddel package candidato. - Leer su
package.jsonpara confirmar el nombre, scripts yexports. - Leer
src/index.tsy los barrels del dominio para confirmar la API publica. - Importar desde
@repo/<package>, nunca desdepackages/<package>/src/.... - Si el export necesario no existe, agregarlo al barrel publico y documentarlo.
Ejemplo:
import { Button, cn } from '@repo/ui';
import { APP_ROUTES, FIRESTORE_PATHS } from '@repo/constants';
import { createUser } from '@repo/app-services';
6. Reglas de limites entre packages
- Un package nunca puede importar desde
apps/. - No duplicar schemas, tipos derivados, nombres de colecciones, rutas ni permisos.
- Los tipos de entidades persistidas y payloads deben derivarse de
@repo/schemas. - Los componentes no deben llamar Firebase directamente; usar adapters y services.
@repo/app-serviceses para operaciones iniciadas desde apps cliente.@repo/app-errorsdefineAppErrorsin dependencias de Firebase, React ni UI; los servicios lo lanzan con códigos estables y las apps convierten esos códigos en copy de producto.@repo/client-operationsestandariza la ejecucion React Query desde hooks cliente; no implementa casos de uso, acceso Firebase ni presentacion UI. ReexportaAppErrordesde@repo/app-errorsy su adopcion en una app es opt-in.@repo/app-function-serviceses para operaciones server-side ejecutadas por Cloud Functions.- Evitar dependencias circulares y mantener cada package enfocado en un dominio tecnico.
- Mantener nombres de archivos, variables, funciones e interfaces en ingles.
7. Buenas practicas para codigo reutilizable
- Preferir funciones puras y sin side effects ocultos.
- Modelar contratos con tipos explicitos y/o esquemas Zod.
- Evitar acoplamiento circular entre packages.
- Mantener ejemplos de uso concretos en README.
- Versionar cambios de API en PR description.
8. Como contribuir a un package existente
- Identificar el package correcto segun dominio.
- Buscar y reutilizar una API existente antes de agregar otra.
- Implementar solo el contrato generico; dejar la composicion especifica en la app.
- Actualizar tests o agregar cobertura minima si el package tiene Vitest.
- Actualizar el README del package con nuevos exports, ubicacion y reglas de uso.
- Ejecutar los scripts definidos en el
package.jsondel package antes del PR.
9. Como crear un package nuevo desde 01-base-package
- Duplicar la carpeta base:
cp -r packages/01-base-package packages/nuevo-package
- Actualizar
package.json:
name:@repo/nuevo-packageexportsytypessegun tu API publica
- Implementar API inicial en
src/index.ts. - Completar
README.mddel package. - Verificar:
pnpm lint --filter @repo/nuevo-package
pnpm build --filter @repo/nuevo-package
10. Checklist rapido para nuevos packages
-
package.jsoncon nombre@repo/... -
src/index.tscon exports publicos -
tsconfig.jsonextendiendo@repo/tsconfig - scripts de lint/build/type-check
- README documentado
- El package tiene al menos un consumidor real o una frontera tecnica justificada
- No importa desde
apps/ni expone rutas internas innecesarias - Tests agregados o justificacion de por que no aplican
- README de
packages/y referencias de agentes actualizadas si cambia la arquitectura
packages/01-base-package/README.mdPlantilla base para crear nuevos packages reutilizables dentro del monorepo.
packages/analytics/README.mdPaquete de mediciones, analytics y tracking de conversiones para el monorepo Nidus. Centraliza la integración de **Google Analytics 4 (GA4)**, **Google Tag Manager (GTM)** y **Meta (Facebook) Pixel** en un único paquete reutilizable.
packages/app-errors/README.mdContrato runtime para errores tipados compartidos entre servicios de aplicación y consumidores cliente. No depende de React, Firebase ni de la UI.
packages/app-function-services/README.mdServicios server-side reutilizables para Cloud Functions. Este package contiene casos de uso que requieren el Admin SDK; no debe importarse desde componentes o codigo ejecutado en el navegador.
packages/app-services/README.mdServicios de cliente para apps. Encapsula casos de uso y acceso a datos para que las páginas y
packages/brand-assets/README.mdFuente unica y versionada para los assets de identidad de Nidus.
packages/client-operations/README.mdUtilidades opt-in para estandarizar queries, mutations y errores de operaciones iniciadas desde una app cliente. Reexporta `AppError` desde `@repo/app-errors`, pero no implementa servicios ni presenta UI.
packages/constants/README.mdConstantes globales del proyecto para mantener consistencia entre apps.
packages/eslint/README.mdConfiguraciones ESLint compartidas para mantener calidad y consistencia de codigo en todo el monorepo.
packages/figma-registry/README.mdRegistro de Figma como SSOT visual del monorepo. Los archivos de módulo viven junto al código de cada app como `figma.json`; el schema está en `schema/module.schema.json` y los aliases compartidos en `data/files.json`.
packages/firebase/README.mdConfiguracion compartida de Firebase para entorno local y utilidades comunes.
packages/firebase-admin-adapter/README.mdAdaptador server-side para Firebase Admin (Auth, Firestore y Storage).
packages/firebase-client-adapter/README.mdAdaptador client-side para Firebase en aplicaciones web.
packages/hooks/README.mdColeccion de hooks reutilizables compartidos por apps y packages UI.
packages/icons/README.mdPunto unico de export de iconografia para el monorepo.
packages/prettier/README.mdConfiguracion Prettier compartida del monorepo.
packages/schemas/README.mdContrato de validación y tipos compartidos basado en [Zod](https://zod.dev) para el monorepo Nidus.
packages/tsconfig/README.mdConfiguracion base de TypeScript para apps y packages del monorepo.
packages/ui/README.mdSistema de diseno y libreria de componentes reutilizables de Nidus.
packages/utils/README.mdUtilidades agnósticas y reutilizables del monorepo. Actualmente expone helpers de permisos para resolver los roles y permisos de un usuario dentro de una comunidad.
packages/zustand/README.mdWrapper compartido para exponer Zustand con una unica dependencia del monorepo.