Packages

21 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

PackageRol principal
@repo/01-base-packageBase tecnica para crear nuevos packages
@repo/analyticsIntegraciones de medicion GA4, GTM y Meta Pixel
@repo/app-errorsContrato runtime neutral para errores tipados
@repo/app-servicesServicios de aplicacion y casos de uso compartidos
@repo/app-function-servicesServicios server-side para Cloud Functions
@repo/brand-assetsFuente y generacion de assets de marca
@repo/client-operationsQueries, mutations y errores tipados en hooks cliente
@repo/constantsTokens y constantes globales
@repo/eslintConfiguracion ESLint compartida
@repo/firebaseConfig comun para emuladores y runtime Firebase
@repo/firebase-admin-adapterAdaptador Firebase Admin para server
@repo/firebase-client-adapterAdaptador Firebase Client para browser
@repo/hooksHooks reutilizables
@repo/iconsExport centralizado de iconos
@repo/motionWrapper compartido de Motion
@repo/prettierConfiguracion Prettier compartida
@repo/schemasContratos Zod y tipos compartidos
@repo/tsconfigBase TypeScript para todo el monorepo
@repo/uiDesign system y componentes UI
@repo/zustandExport compartido de Zustand
@repo/figma-registryRegistro, schema y validacion del SSOT de Figma

3. Lineamientos de desarrollo

  1. Cada package debe tener API publica clara via src/index.ts o exports en package.json.
  2. No exponer internals sin necesidad. Exportar solo contratos estables.
  3. Mantener cohesion: un package, un dominio tecnico.
  4. Todo cambio debe incluir chequeo minimo:
    • pnpm lint --filter <package>
    • pnpm build --filter <package> o pnpm type-check --filter <package>
  5. Documentar cualquier export nuevo en el README del package.

4. Como decidir donde guardar codigo

  1. Si solo lo consume una app y contiene comportamiento, rutas, contenido o permisos propios de esa app, guardarlo en apps/<app>/.
  2. Si lo consumen dos o mas apps, define un contrato transversal o es infraestructura compartida, guardarlo en el package correspondiente.
  3. Si todavia no existe una necesidad real de compartirlo, no crear un package por anticipado.
  4. 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

NecesidadBuscar 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

  1. Buscar el simbolo por nombre en todo el repositorio antes de implementarlo de nuevo.
  2. Leer el README.md del package candidato.
  3. Leer su package.json para confirmar el nombre, scripts y exports.
  4. Leer src/index.ts y los barrels del dominio para confirmar la API publica.
  5. Importar desde @repo/<package>, nunca desde packages/<package>/src/....
  6. Si el export necesario no existe, agregarlo al barrel publico y documentarlo.

Ejemplo:

ts
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-services es para operaciones iniciadas desde apps cliente.
  • @repo/app-errors define AppError sin 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-operations estandariza la ejecucion React Query desde hooks cliente; no implementa casos de uso, acceso Firebase ni presentacion UI. Reexporta AppError desde @repo/app-errors y su adopcion en una app es opt-in.
  • @repo/app-function-services es 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

  1. Identificar el package correcto segun dominio.
  2. Buscar y reutilizar una API existente antes de agregar otra.
  3. Implementar solo el contrato generico; dejar la composicion especifica en la app.
  4. Actualizar tests o agregar cobertura minima si el package tiene Vitest.
  5. Actualizar el README del package con nuevos exports, ubicacion y reglas de uso.
  6. Ejecutar los scripts definidos en el package.json del package antes del PR.

9. Como crear un package nuevo desde 01-base-package

  1. Duplicar la carpeta base:
bash
cp -r packages/01-base-package packages/nuevo-package
  1. Actualizar package.json:
  • name: @repo/nuevo-package
  • exports y types segun tu API publica
  1. Implementar API inicial en src/index.ts.
  2. Completar README.md del package.
  3. Verificar:
bash
pnpm lint --filter @repo/nuevo-package
pnpm build --filter @repo/nuevo-package

10. Checklist rapido para nuevos packages

  • package.json con nombre @repo/...
  • src/index.ts con exports publicos
  • tsconfig.json extendiendo @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
Base Packagepackages/01-base-package/README.md

Plantilla base para crear nuevos packages reutilizables dentro del monorepo.

Analyticspackages/analytics/README.md

Paquete 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.

App Errorspackages/app-errors/README.md

Contrato runtime para errores tipados compartidos entre servicios de aplicación y consumidores cliente. No depende de React, Firebase ni de la UI.

App Function Servicespackages/app-function-services/README.md

Servicios 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.

App Servicespackages/app-services/README.md

Servicios de cliente para apps. Encapsula casos de uso y acceso a datos para que las páginas y

Brand Assetspackages/brand-assets/README.md

Fuente unica y versionada para los assets de identidad de Nidus.

Client Operationspackages/client-operations/README.md

Utilidades 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.

Constantspackages/constants/README.md

Constantes globales del proyecto para mantener consistencia entre apps.

Eslintpackages/eslint/README.md

Configuraciones ESLint compartidas para mantener calidad y consistencia de codigo en todo el monorepo.

Figma Registrypackages/figma-registry/README.md

Registro 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`.

Firebasepackages/firebase/README.md

Configuracion compartida de Firebase para entorno local y utilidades comunes.

Firebase Admin Adapterpackages/firebase-admin-adapter/README.md

Adaptador server-side para Firebase Admin (Auth, Firestore y Storage).

Firebase Client Adapterpackages/firebase-client-adapter/README.md

Adaptador client-side para Firebase en aplicaciones web.

Hookspackages/hooks/README.md

Coleccion de hooks reutilizables compartidos por apps y packages UI.

Iconspackages/icons/README.md

Punto unico de export de iconografia para el monorepo.

Prettierpackages/prettier/README.md

Configuracion Prettier compartida del monorepo.

Schemaspackages/schemas/README.md

Contrato de validación y tipos compartidos basado en [Zod](https://zod.dev) para el monorepo Nidus.

Tsconfigpackages/tsconfig/README.md

Configuracion base de TypeScript para apps y packages del monorepo.

UIpackages/ui/README.md

Sistema de diseno y libreria de componentes reutilizables de Nidus.

Utilspackages/utils/README.md

Utilidades agnósticas y reutilizables del monorepo. Actualmente expone helpers de permisos para resolver los roles y permisos de un usuario dentro de una comunidad.

Zustandpackages/zustand/README.md

Wrapper compartido para exponer Zustand con una unica dependencia del monorepo.