App Errors

packages/app-errors/README.md

@repo/app-errors

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

AppError

Cada error incluye un code estable y namespaced, un kind para decisiones genéricas de flujo, y un message técnico seguro que no debe mostrarse directamente al usuario. cause conserva el error original para diagnóstico; fieldErrors y metadata son opcionales y no deben contener secretos.

Los servicios construyen AppError en su frontera pública. La app traduce code/kind a copy de producto y nunca muestra mensajes crudos de Firebase o SDK.

Integración con Information

@repo/app-errors define el contrato runtime y los kinds, no los códigos de cada dominio. Los códigos de Information se declaran en @repo/app-services/info-errors; el servicio preserva errores externos en cause sin copiar el mensaje de Firebase. fieldErrors representa errores de validación y metadata no debe incluir secretos.

En system, modules/information/utils/information-error.ts traduce code/kind a copy de producto para toasts y estado de página. Esta separación evita que el package runtime dependa de idioma o UI. La guía del módulo está en Information en el visor.

ts
import { AppError } from '@repo/app-errors';

const adapterError = new Error('adapter failure');

throw new AppError({
  code: 'INFO_PERMISSION_DENIED',
  kind: 'permission',
  message: 'Information update rejected',
  cause: adapterError,
});

Validación

bash
pnpm --filter @repo/app-errors test:run
pnpm --filter @repo/app-errors check-types
pnpm --filter @repo/app-errors lint