uityu.shared 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +163 -0
  2. package/dist/common/index.d.ts +3 -0
  3. package/dist/common/index.d.ts.map +1 -0
  4. package/dist/common/index.js +3 -0
  5. package/dist/common/index.js.map +1 -0
  6. package/dist/common/logging/index.d.ts +2 -0
  7. package/dist/common/logging/index.d.ts.map +1 -0
  8. package/dist/common/logging/index.js +2 -0
  9. package/dist/common/logging/index.js.map +1 -0
  10. package/dist/common/logging/serialize-log-payload.d.ts +12 -0
  11. package/dist/common/logging/serialize-log-payload.d.ts.map +1 -0
  12. package/dist/common/logging/serialize-log-payload.js +84 -0
  13. package/dist/common/logging/serialize-log-payload.js.map +1 -0
  14. package/dist/common/math/clamp-limit.d.ts +13 -0
  15. package/dist/common/math/clamp-limit.d.ts.map +1 -0
  16. package/dist/common/math/clamp-limit.js +18 -0
  17. package/dist/common/math/clamp-limit.js.map +1 -0
  18. package/dist/common/math/index.d.ts +2 -0
  19. package/dist/common/math/index.d.ts.map +1 -0
  20. package/dist/common/math/index.js +2 -0
  21. package/dist/common/math/index.js.map +1 -0
  22. package/dist/errors/app-error.d.ts +7 -0
  23. package/dist/errors/app-error.d.ts.map +1 -0
  24. package/dist/errors/app-error.factory.d.ts +64 -0
  25. package/dist/errors/app-error.factory.d.ts.map +1 -0
  26. package/dist/errors/app-error.factory.js +70 -0
  27. package/dist/errors/app-error.factory.js.map +1 -0
  28. package/dist/errors/app-error.js +13 -0
  29. package/dist/errors/app-error.js.map +1 -0
  30. package/dist/errors/error-codes.d.ts +59 -0
  31. package/dist/errors/error-codes.d.ts.map +1 -0
  32. package/dist/errors/error-codes.js +58 -0
  33. package/dist/errors/error-codes.js.map +1 -0
  34. package/dist/errors/index.d.ts +5 -0
  35. package/dist/errors/index.d.ts.map +1 -0
  36. package/dist/errors/index.js +4 -0
  37. package/dist/errors/index.js.map +1 -0
  38. package/dist/firebase/admin/firebase-admin.cache.d.ts +8 -0
  39. package/dist/firebase/admin/firebase-admin.cache.d.ts.map +1 -0
  40. package/dist/firebase/admin/firebase-admin.cache.js +15 -0
  41. package/dist/firebase/admin/firebase-admin.cache.js.map +1 -0
  42. package/dist/firebase/admin/firebase-admin.factory.d.ts +4 -0
  43. package/dist/firebase/admin/firebase-admin.factory.d.ts.map +1 -0
  44. package/dist/firebase/admin/firebase-admin.factory.js +128 -0
  45. package/dist/firebase/admin/firebase-admin.factory.js.map +1 -0
  46. package/dist/firebase/admin/firebase-admin.types.d.ts +42 -0
  47. package/dist/firebase/admin/firebase-admin.types.d.ts.map +1 -0
  48. package/dist/firebase/admin/firebase-admin.types.js +10 -0
  49. package/dist/firebase/admin/firebase-admin.types.js.map +1 -0
  50. package/dist/firebase/admin/index.d.ts +3 -0
  51. package/dist/firebase/admin/index.d.ts.map +1 -0
  52. package/dist/firebase/admin/index.js +3 -0
  53. package/dist/firebase/admin/index.js.map +1 -0
  54. package/dist/http/error-mapper.d.ts +11 -0
  55. package/dist/http/error-mapper.d.ts.map +1 -0
  56. package/dist/http/error-mapper.js +21 -0
  57. package/dist/http/error-mapper.js.map +1 -0
  58. package/dist/http/index.d.ts +2 -0
  59. package/dist/http/index.d.ts.map +1 -0
  60. package/dist/http/index.js +2 -0
  61. package/dist/http/index.js.map +1 -0
  62. package/dist/index.d.ts +6 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +6 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/search/index.d.ts +2 -0
  67. package/dist/search/index.d.ts.map +1 -0
  68. package/dist/search/index.js +2 -0
  69. package/dist/search/index.js.map +1 -0
  70. package/dist/search/search-index.d.ts +7 -0
  71. package/dist/search/search-index.d.ts.map +1 -0
  72. package/dist/search/search-index.js +40 -0
  73. package/dist/search/search-index.js.map +1 -0
  74. package/package.json +67 -0
package/README.md ADDED
@@ -0,0 +1,163 @@
1
+ # uityu.shared
2
+
3
+ Paquete compartido para los microservicios de UITYU. Expone infraestructura lista para producción (Firebase Admin, utilidades y cimientos de seguridad) con una API predecible y orientada a DDD.
4
+
5
+ ## Instalación
6
+
7
+ ```bash
8
+ npm install uityu.shared firebase-admin
9
+ ```
10
+
11
+ ## Firebase Admin
12
+
13
+ ### Importación DX-first
14
+
15
+ ```ts
16
+ import { getOrCreateFirebaseAdmin } from 'uityu.shared/firebase/admin';
17
+ ```
18
+
19
+ ### Uso básico (SSR, Cloud Functions, APIs)
20
+
21
+ ```ts
22
+ import { getOrCreateFirebaseAdmin } from 'uityu.shared/firebase/admin';
23
+
24
+ const fb = getOrCreateFirebaseAdmin({
25
+ projectId: 'my-project',
26
+ tenantDbId: '(default)'
27
+ });
28
+
29
+ await fb.firestore.collection('users').doc('123').get();
30
+ ```
31
+
32
+ ### Multi Firestore DB + multi-tenant
33
+
34
+ ```ts
35
+ import { getOrCreateFirebaseAdmin } from 'uityu.shared/firebase/admin';
36
+
37
+ const fb = getOrCreateFirebaseAdmin({
38
+ projectId: 'my-project',
39
+ tenantDbId: 'tenant-eu',
40
+ securityDbId: 'security-global',
41
+ appName: 'tenant-eu-app'
42
+ });
43
+
44
+ await fb.tenantFirestore.collection('profiles').get();
45
+ await fb.securityFirestore.collection('audits').get();
46
+ ```
47
+
48
+ ### Uso avanzado con credenciales y storage
49
+
50
+ ```ts
51
+ import { createFirebaseAdmin } from 'uityu.shared/firebase/admin';
52
+ import { credential } from 'firebase-admin';
53
+
54
+ const fb = createFirebaseAdmin({
55
+ projectId: 'secure-project',
56
+ credential: credential.cert(JSON.parse(process.env.FIREBASE_SA_JSON ?? '{}')),
57
+ tenantDbId: 'tenant',
58
+ securityDbId: 'security',
59
+ storageBucket: 'secure-project.appspot.com',
60
+ appName: 'secure-project::primary'
61
+ });
62
+
63
+ await fb.auth.getUser('uid');
64
+ await fb.storage.bucket().file('path/to/file');
65
+ ```
66
+
67
+ ### Idempotente por diseño
68
+
69
+ - `createFirebaseAdmin` crea una instancia nueva y falla si ya existe ese contexto.
70
+ - `getOrCreateFirebaseAdmin` reutiliza la instancia si ya fue creada (ideal para SSR/Functions).
71
+
72
+ ### Facade expuesta
73
+
74
+ Cada factory devuelve un objeto con:
75
+
76
+ - `app`: instancia de `firebase-admin`
77
+ - `tenantFirestore`: Firestore del tenant
78
+ - `securityFirestore`: Firestore secundario de seguridad
79
+ - `firestore`: alias del `tenantFirestore`
80
+ - `auth`: `Auth` inicializado
81
+ - `storage`: `Storage` inicializado
82
+
83
+ ## Common utilities (`uityu.shared/common/*`)
84
+
85
+ ### Logging listo para JSON
86
+
87
+ ```ts
88
+ import { logInfo, logError } from 'uityu.shared/common/logging';
89
+
90
+ logInfo({
91
+ namespace: 'Orders.Create',
92
+ message: 'Order persisted',
93
+ metadata: { orderId: 'ord_123', attempt: 1 }
94
+ });
95
+
96
+ logError({
97
+ namespace: 'Orders.Create',
98
+ message: 'Failed to persist',
99
+ error: new Error('timeout')
100
+ });
101
+ ```
102
+
103
+ ### Utilidades de matemática
104
+
105
+ ```ts
106
+ import { clampLimit } from 'uityu.shared/common/math';
107
+
108
+ const limit = clampLimit(undefined, { defaultValue: 10, max: 50, min: 5 });
109
+ // -> 10
110
+ ```
111
+
112
+ ## Errores + HTTP (`uityu.shared/errors`, `uityu.shared/http`)
113
+
114
+ ```ts
115
+ import { AppErrorFactory } from 'uityu.shared/errors';
116
+ import { toApiError } from 'uityu.shared/http';
117
+
118
+ export async function handler(req): Promise<Response> {
119
+ try {
120
+ if (!req.headers.authorization) {
121
+ throw AppErrorFactory.authRequired();
122
+ }
123
+ // ...
124
+ } catch (error) {
125
+ const { status, body } = toApiError(error, req.headers['x-trace-id']);
126
+ return new Response(JSON.stringify(body), { status });
127
+ }
128
+ }
129
+ ```
130
+
131
+ ## Búsqueda (`uityu.shared/search`)
132
+
133
+ ```ts
134
+ import {
135
+ buildSearchPrefixes,
136
+ createEmptySearchIndex,
137
+ normalizePhoneDigits,
138
+ normalizeSearchText
139
+ } from 'uityu.shared/search';
140
+
141
+ const normalized = normalizeSearchText('Crème Brûlée #42');
142
+ const phone = normalizePhoneDigits('+51 999 888 777');
143
+ const prefixes = buildSearchPrefixes([normalized, phone]);
144
+
145
+ const index = createEmptySearchIndex<string>();
146
+ for (const prefix of prefixes) {
147
+ index[prefix] = 'recipe-id';
148
+ }
149
+ ```
150
+
151
+ ## Por qué adoptar este paquete
152
+
153
+ - Sin copy/paste entre microservicios
154
+ - API estable y versionable (semver)
155
+ - Facilita pruebas e inyección de dependencias
156
+ - Alineado con DDD y SOLID
157
+ - Preparado para extender con `firebase/functions`, `firebase/pubsub`, etc.
158
+
159
+ ## Roadmap sugerido
160
+
161
+ 1. Añadir módulos especializados (`firebase/functions`, `firebase/pubsub`).
162
+ 2. Versionar con semver y publicar en npm privado o GitHub Packages.
163
+ 3. Crear tests de contrato para los microservicios que consuman este paquete.
@@ -0,0 +1,3 @@
1
+ export * from "./math/index.js";
2
+ export * from "./logging/index.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./math/index.js";
2
+ export * from "./logging/index.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./serialize-log-payload.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/logging/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./serialize-log-payload.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/logging/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type LogLevel = "INFO" | "ERROR";
2
+ export type LogPayload = {
3
+ namespace: string;
4
+ message: string;
5
+ metadata?: Record<string, unknown>;
6
+ error?: unknown;
7
+ };
8
+ export declare function serializeLogPayload(payload: unknown): Record<string, unknown>;
9
+ export declare function logInfo(payload: LogPayload): void;
10
+ export declare function logError(payload: LogPayload): void;
11
+ export declare function logFirestoreUsage(collection: string, operation: string, metadata?: Record<string, unknown>, hit?: boolean): void;
12
+ //# sourceMappingURL=serialize-log-payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize-log-payload.d.ts","sourceRoot":"","sources":["../../../src/common/logging/serialize-log-payload.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAExC,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkB7E;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAEjD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAElD;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACtC,GAAG,CAAC,EAAE,OAAO,GACZ,IAAI,CAMN"}
@@ -0,0 +1,84 @@
1
+ export function serializeLogPayload(payload) {
2
+ if (!isSerializableObject(payload)) {
3
+ return {};
4
+ }
5
+ try {
6
+ const serialized = JSON.parse(JSON.stringify(payload, (_key, value) => normalizeValue(value)));
7
+ if (isSerializableObject(serialized)) {
8
+ return serialized;
9
+ }
10
+ return { value: serialized };
11
+ }
12
+ catch {
13
+ return { value: "[unserializable]" };
14
+ }
15
+ }
16
+ export function logInfo(payload) {
17
+ log("INFO", payload);
18
+ }
19
+ export function logError(payload) {
20
+ log("ERROR", payload);
21
+ }
22
+ export function logFirestoreUsage(collection, operation, metadata = {}, hit) {
23
+ logInfo({
24
+ namespace: "FirestoreUsage",
25
+ message: `${collection}.${operation}`,
26
+ metadata: { ...metadata, hit },
27
+ });
28
+ }
29
+ function log(level, payload) {
30
+ const entry = {
31
+ level,
32
+ timestamp: new Date().toISOString(),
33
+ namespace: payload.namespace,
34
+ message: payload.message,
35
+ metadata: serializeLogPayload(payload.metadata ?? {}),
36
+ error: normalizeError(payload.error),
37
+ };
38
+ const serialized = JSON.stringify(entry);
39
+ if (level === "ERROR") {
40
+ console.error(serialized);
41
+ return;
42
+ }
43
+ console.log(serialized);
44
+ }
45
+ function normalizeError(error) {
46
+ if (!error) {
47
+ return undefined;
48
+ }
49
+ if (error instanceof Error) {
50
+ return {
51
+ name: error.name,
52
+ message: error.message,
53
+ stack: error.stack,
54
+ };
55
+ }
56
+ return serializeLogPayload(error);
57
+ }
58
+ function normalizeValue(value) {
59
+ if (value instanceof Date) {
60
+ return value.toISOString();
61
+ }
62
+ if (typeof value === "bigint") {
63
+ return value.toString();
64
+ }
65
+ if (hasToJSON(value)) {
66
+ try {
67
+ return value.toJSON();
68
+ }
69
+ catch {
70
+ return "[unserializable]";
71
+ }
72
+ }
73
+ return value;
74
+ }
75
+ function hasToJSON(value) {
76
+ return Boolean(value &&
77
+ typeof value === "object" &&
78
+ "toJSON" in value &&
79
+ typeof value.toJSON === "function");
80
+ }
81
+ function isSerializableObject(value) {
82
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
83
+ }
84
+ //# sourceMappingURL=serialize-log-payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize-log-payload.js","sourceRoot":"","sources":["../../../src/common/logging/serialize-log-payload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface ClampOptions {
2
+ /** Value to use when the input is undefined or not finite */
3
+ defaultValue: number;
4
+ /** Upper bound; must be a finite number */
5
+ max: number;
6
+ /** Optional lower bound; defaults to 1 */
7
+ min?: number;
8
+ }
9
+ /**
10
+ * Domain-level guard to clamp numeric limits while providing sane defaults.
11
+ */
12
+ export declare function clampLimit(value: number | undefined, options: ClampOptions): number;
13
+ //# sourceMappingURL=clamp-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clamp-limit.d.ts","sourceRoot":"","sources":["../../../src/common/math/clamp-limit.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,YAAY,GACpB,MAAM,CAUR"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Domain-level guard to clamp numeric limits while providing sane defaults.
3
+ */
4
+ export function clampLimit(value, options) {
5
+ const normalized = toFiniteNumber(value, options.defaultValue);
6
+ const min = toFiniteNumber(options.min, 1);
7
+ const max = toFiniteNumber(options.max, min);
8
+ if (max < min) {
9
+ throw new Error("Clamp max must be greater than or equal to min");
10
+ }
11
+ return Math.min(max, Math.max(min, normalized));
12
+ }
13
+ function toFiniteNumber(value, fallback) {
14
+ return typeof value === "number" && Number.isFinite(value)
15
+ ? value
16
+ : fallback;
17
+ }
18
+ //# sourceMappingURL=clamp-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clamp-limit.js","sourceRoot":"","sources":["../../../src/common/math/clamp-limit.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAyB,EACzB,OAAqB;IAErB,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE7C,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB,EAAE,QAAgB;IACjE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QACxD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,QAAQ,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./clamp-limit.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/math/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./clamp-limit.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/math/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare class AppError extends Error {
2
+ code: string;
3
+ status: number;
4
+ errors: Record<string, string>;
5
+ constructor(code: string, message?: string, status?: number, errors?: Record<string, string>);
6
+ }
7
+ //# sourceMappingURL=app-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-error.d.ts","sourceRoot":"","sources":["../../src/errors/app-error.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;IAExB,IAAI,EAAE,MAAM;IAEZ,MAAM;IACN,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;gBAH9B,IAAI,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EACT,MAAM,SAAM,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM;CAK7C"}
@@ -0,0 +1,64 @@
1
+ import { AppError } from "./app-error.js";
2
+ export type AppErrorFactoryOptions = {
3
+ message?: string;
4
+ status?: number;
5
+ errors?: Record<string, string>;
6
+ };
7
+ export declare const AppErrorFactory: {
8
+ authRequired: (options?: AppErrorFactoryOptions) => AppError;
9
+ badRequest: (options?: AppErrorFactoryOptions) => AppError;
10
+ channelExists: (options?: AppErrorFactoryOptions) => AppError;
11
+ channelNotFound: (options?: AppErrorFactoryOptions) => AppError;
12
+ config: (field?: string, options?: AppErrorFactoryOptions) => AppError;
13
+ conflict: (options?: AppErrorFactoryOptions) => AppError;
14
+ courierDocumentTaken: (options?: AppErrorFactoryOptions) => AppError;
15
+ courierNotFound: (options?: AppErrorFactoryOptions) => AppError;
16
+ courierPhoneTaken: (options?: AppErrorFactoryOptions) => AppError;
17
+ customerNotFound: (options?: AppErrorFactoryOptions) => AppError;
18
+ forbidden: (options?: AppErrorFactoryOptions) => AppError;
19
+ invalidJson: (options?: AppErrorFactoryOptions) => AppError;
20
+ invalidReport: (options?: AppErrorFactoryOptions) => AppError;
21
+ invalidState: (options?: AppErrorFactoryOptions) => AppError;
22
+ inviteRevoked: (options?: AppErrorFactoryOptions) => AppError;
23
+ loginStrategiesMissing: (options?: AppErrorFactoryOptions) => AppError;
24
+ loginUnsupportedProvider: (provider?: string, options?: AppErrorFactoryOptions) => AppError;
25
+ noItems: (options?: AppErrorFactoryOptions) => AppError;
26
+ notFound: (options?: AppErrorFactoryOptions) => AppError;
27
+ notificationNotFound: (options?: AppErrorFactoryOptions) => AppError;
28
+ parameterExists: (options?: AppErrorFactoryOptions) => AppError;
29
+ parameterNotFound: (field?: string, options?: AppErrorFactoryOptions) => AppError;
30
+ productExists: (options?: AppErrorFactoryOptions) => AppError;
31
+ productNotFound: (options?: AppErrorFactoryOptions) => AppError;
32
+ serviceExists: (options?: AppErrorFactoryOptions) => AppError;
33
+ serviceNotFound: (options?: AppErrorFactoryOptions) => AppError;
34
+ sunatApiError: (options?: AppErrorFactoryOptions) => AppError;
35
+ sunatAuthError: (options?: AppErrorFactoryOptions) => AppError;
36
+ sunatAuthFailed: (message?: string, options?: AppErrorFactoryOptions) => AppError;
37
+ sunatAuthInvalidResponse: (options?: AppErrorFactoryOptions) => AppError;
38
+ sunatAuthTimeout: (options?: AppErrorFactoryOptions) => AppError;
39
+ sunatSettingsNotConfigured: (options?: AppErrorFactoryOptions) => AppError;
40
+ sunatSettingsNotFound: (options?: AppErrorFactoryOptions) => AppError;
41
+ sunatTimeout: (options?: AppErrorFactoryOptions) => AppError;
42
+ systemNavItemNotFound: (itemId?: string, options?: AppErrorFactoryOptions) => AppError;
43
+ tenantContextConflict: (options?: AppErrorFactoryOptions) => AppError;
44
+ tenantContextRequired: (options?: AppErrorFactoryOptions) => AppError;
45
+ tenantContextUnavailable: (options?: AppErrorFactoryOptions) => AppError;
46
+ tenantForbidden: (options?: AppErrorFactoryOptions) => AppError;
47
+ tenantMemberAlreadyExists: (options?: AppErrorFactoryOptions) => AppError;
48
+ tenantMemberNotFound: (options?: AppErrorFactoryOptions) => AppError;
49
+ tenantMismatch: (options?: AppErrorFactoryOptions) => AppError;
50
+ tenantNotFound: (options?: AppErrorFactoryOptions) => AppError;
51
+ tenantRoleImmutable: (options?: AppErrorFactoryOptions) => AppError;
52
+ tenantRoleNotFound: (options?: AppErrorFactoryOptions) => AppError;
53
+ tenantSeatsExceeded: (options?: AppErrorFactoryOptions) => AppError;
54
+ tenantSlugInUse: (options?: AppErrorFactoryOptions) => AppError;
55
+ ubigeoExists: (options?: AppErrorFactoryOptions) => AppError;
56
+ ubigeoNotFound: (options?: AppErrorFactoryOptions) => AppError;
57
+ unauthorized: (options?: AppErrorFactoryOptions) => AppError;
58
+ userExists: (options?: AppErrorFactoryOptions) => AppError;
59
+ userInactive: (options?: AppErrorFactoryOptions) => AppError;
60
+ userNotFound: (options?: AppErrorFactoryOptions) => AppError;
61
+ validation: (field?: string, options?: AppErrorFactoryOptions) => AppError;
62
+ internal: (options?: AppErrorFactoryOptions) => AppError;
63
+ };
64
+ //# sourceMappingURL=app-error.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-error.factory.d.ts","sourceRoot":"","sources":["../../src/errors/app-error.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAkBF,eAAO,MAAM,eAAe;6BACD,sBAAsB;2BAOxB,sBAAsB;8BAEnB,sBAAsB;gCAEpB,sBAAsB;qBAOjC,MAAM,YAAY,sBAAsB;yBASpC,sBAAsB;qCAEV,sBAAsB;gCAO3B,sBAAsB;kCAEpB,sBAAsB;iCAOvB,sBAAsB;0BAO7B,sBAAsB;4BAEpB,sBAAsB;8BAEpB,sBAAsB;6BAOvB,sBAAsB;8BAOrB,sBAAsB;uCAOb,sBAAsB;0CAQ5C,MAAM,YACP,sBAAsB;wBAUd,sBAAsB;yBAOrB,sBAAsB;qCAEV,sBAAsB;gCAO3B,sBAAsB;gCAOtB,MAAM,YAAY,sBAAsB;8BAO1C,sBAAsB;gCAEpB,sBAAsB;8BAOxB,sBAAsB;gCAEpB,sBAAsB;8BAOxB,sBAAsB;+BAOrB,sBAAsB;gCAOrB,MAAM,YAAY,sBAAsB;yCAO/B,sBAAsB;iCAO9B,sBAAsB;2CAOZ,sBAAsB;sCAO3B,sBAAsB;6BAO/B,sBAAsB;qCAOd,MAAM,YAAY,sBAAsB;sCASvC,sBAAsB;sCAOtB,sBAAsB;yCAOnB,sBAAsB;gCAO/B,sBAAsB;0CAOZ,sBAAsB;qCAO3B,sBAAsB;+BAO5B,sBAAsB;+BAOtB,sBAAsB;oCAOjB,sBAAsB;mCAOvB,sBAAsB;oCAOrB,sBAAsB;gCAO1B,sBAAsB;6BAOzB,sBAAsB;+BAOpB,sBAAsB;6BAOxB,sBAAsB;2BAExB,sBAAsB;6BAOpB,sBAAsB;6BAEtB,sBAAsB;yBAE1B,MAAM,YAAY,sBAAsB;yBAOxC,sBAAsB;CAE5C,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { AppError } from "./app-error.js";
2
+ import { ErrorCode } from "./error-codes.js";
3
+ const DEFAULT_ERRORS = {};
4
+ function buildError(code, defaultMessage, defaultStatus, options) {
5
+ return new AppError(code, options?.message ?? defaultMessage, options?.status ?? defaultStatus, options?.errors ?? DEFAULT_ERRORS);
6
+ }
7
+ export const AppErrorFactory = {
8
+ authRequired: (options) => buildError(ErrorCode.AUTH_REQUIRED, "El idToken de Google es requerido", 401, options),
9
+ badRequest: (options) => buildError(ErrorCode.BAD_REQUEST, "Faltan parámetros", 400, options),
10
+ channelExists: (options) => buildError(ErrorCode.CHANNEL_EXISTS, "El canal ya existe", 409, options),
11
+ channelNotFound: (options) => buildError(ErrorCode.CHANNEL_NOT_FOUND, "Canal no encontrado", 404, options),
12
+ config: (field, options) => buildError(ErrorCode.CONFIG, field
13
+ ? `Falta ${field} para la integración SUNAT`
14
+ : "Falta un campo para la integración SUNAT", 500, options),
15
+ conflict: (options) => buildError(ErrorCode.CONFLICT, "El teléfono ya existe", 409, options),
16
+ courierDocumentTaken: (options) => buildError(ErrorCode.COURIER_DOCUMENT_TAKEN, "El documento ya existe", 409, options),
17
+ courierNotFound: (options) => buildError(ErrorCode.COURIER_NOT_FOUND, "Courier not found", 404, options),
18
+ courierPhoneTaken: (options) => buildError(ErrorCode.COURIER_PHONE_TAKEN, "El teléfono ya existe", 409, options),
19
+ customerNotFound: (options) => buildError(ErrorCode.CUSTOMER_NOT_FOUND, "Cliente no encontrado", 404, options),
20
+ forbidden: (options) => buildError(ErrorCode.FORBIDDEN, "Actor no autorizado", 403, options),
21
+ invalidJson: (options) => buildError(ErrorCode.INVALID_JSON, "Body debe ser JSON", 400, options),
22
+ invalidReport: (options) => buildError(ErrorCode.INVALID_REPORT, "El archivo ZIP está vacío", 409, options),
23
+ invalidState: (options) => buildError(ErrorCode.INVALID_STATE, "No se pudo resolver tenantId/recipientUid desde Firestore", 500, options),
24
+ inviteRevoked: (options) => buildError(ErrorCode.INVITE_REVOKED, "La invitación fue revocada", 409, options),
25
+ loginStrategiesMissing: (options) => buildError(ErrorCode.LOGIN_STRATEGIES_MISSING, "No hay estrategias de autenticación configuradas", 500, options),
26
+ loginUnsupportedProvider: (provider, options) => buildError(ErrorCode.LOGIN_UNSUPPORTED_PROVIDER, provider
27
+ ? `Proveedor de login no soportado: ${provider}`
28
+ : "Proveedor de login no soportado", 400, options),
29
+ noItems: (options) => buildError(ErrorCode.NO_ITEMS, "La orden debe tener al menos un item", 400, options),
30
+ notFound: (options) => buildError(ErrorCode.NOT_FOUND, "User not found", 404, options),
31
+ notificationNotFound: (options) => buildError(ErrorCode.NOTIFICATION_NOT_FOUND, "Notificación no encontrada", 404, options),
32
+ parameterExists: (options) => buildError(ErrorCode.PARAMETER_EXISTS, "El código de parámetro ya existe", 409, options),
33
+ parameterNotFound: (field, options) => buildError(ErrorCode.PARAMETER_NOT_FOUND, field ? `El parámetro ${field} es inválido` : "El parámetro es inválido", 400, options),
34
+ productExists: (options) => buildError(ErrorCode.PRODUCT_EXISTS, "El SKU ya existe", 409, options),
35
+ productNotFound: (options) => buildError(ErrorCode.PRODUCT_NOT_FOUND, "Producto no encontrado", 404, options),
36
+ serviceExists: (options) => buildError(ErrorCode.SERVICE_EXISTS, "El servicio ya existe", 409, options),
37
+ serviceNotFound: (options) => buildError(ErrorCode.SERVICE_NOT_FOUND, "Servicio no encontrado", 404, options),
38
+ sunatApiError: (options) => buildError(ErrorCode.SUNAT_API_ERROR, "Error inesperado en API de SIRE Compras", 502, options),
39
+ sunatAuthError: (options) => buildError(ErrorCode.SUNAT_AUTH_ERROR, "Error inesperado al obtener token SUNAT", 502, options),
40
+ sunatAuthFailed: (message, options) => buildError(ErrorCode.SUNAT_AUTH_FAILED, message ?? "Error de autenticación SUNAT", 500, options),
41
+ sunatAuthInvalidResponse: (options) => buildError(ErrorCode.SUNAT_AUTH_INVALID_RESPONSE, "SUNAT retornó un formato de token inválido", 502, options),
42
+ sunatAuthTimeout: (options) => buildError(ErrorCode.SUNAT_AUTH_TIMEOUT, "Tiempo de espera agotado al obtener token SUNAT", 504, options),
43
+ sunatSettingsNotConfigured: (options) => buildError(ErrorCode.SUNAT_SETTINGS_NOT_CONFIGURED, "Configura las credenciales SUNAT", 404, options),
44
+ sunatSettingsNotFound: (options) => buildError(ErrorCode.SUNAT_SETTINGS_NOT_FOUND, "Configura las credenciales SUNAT", 404, options),
45
+ sunatTimeout: (options) => buildError(ErrorCode.SUNAT_TIMEOUT, "Tiempo de espera agotado en API de SIRE Compras", 504, options),
46
+ systemNavItemNotFound: (itemId, options) => buildError(ErrorCode.SYSTEM_NAV_ITEM_NOT_FOUND, itemId
47
+ ? `Item de navegación no encontrado: ${itemId}`
48
+ : "Item de navegación no encontrado", 404, options),
49
+ tenantContextConflict: (options) => buildError(ErrorCode.TENANT_CONTEXT_CONFLICT, "El contexto del tenant no es válido", 400, options),
50
+ tenantContextRequired: (options) => buildError(ErrorCode.TENANT_CONTEXT_REQUIRED, "Falta el contexto de empresa", 403, options),
51
+ tenantContextUnavailable: (options) => buildError(ErrorCode.TENANT_CONTEXT_UNAVAILABLE, "No se pudo resolver el contexto del tenant", 500, options),
52
+ tenantForbidden: (options) => buildError(ErrorCode.TENANT_FORBIDDEN, "No tienes acceso a esta empresa", 403, options),
53
+ tenantMemberAlreadyExists: (options) => buildError(ErrorCode.TENANT_MEMBER_ALREADY_EXISTS, "El usuario ya es miembro de la empresa", 409, options),
54
+ tenantMemberNotFound: (options) => buildError(ErrorCode.TENANT_MEMBER_NOT_FOUND, "Miembro no encontrado", 404, options),
55
+ tenantMismatch: (options) => buildError(ErrorCode.TENANT_MISMATCH, "El archivo descargado no corresponde al RUC del tenant", 409, options),
56
+ tenantNotFound: (options) => buildError(ErrorCode.TENANT_NOT_FOUND, "Empresa no encontrada", 404, options),
57
+ tenantRoleImmutable: (options) => buildError(ErrorCode.TENANT_ROLE_IMMUTABLE, "Los roles del sistema no pueden desactivarse", 409, options),
58
+ tenantRoleNotFound: (options) => buildError(ErrorCode.TENANT_ROLE_NOT_FOUND, "El rol indicado no existe", 404, options),
59
+ tenantSeatsExceeded: (options) => buildError(ErrorCode.TENANT_SEATS_EXCEEDED, "Capacidad de asientos excedida", 409, options),
60
+ tenantSlugInUse: (options) => buildError(ErrorCode.TENANT_SLUG_IN_USE, "El slug ya está en uso", 409, options),
61
+ ubigeoExists: (options) => buildError(ErrorCode.UBIGEO_EXISTS, "El código ubigeo ya está registrado", 409, options),
62
+ ubigeoNotFound: (options) => buildError(ErrorCode.UBIGEO_NOT_FOUND, "Ubigeo no encontrado", 404, options),
63
+ unauthorized: (options) => buildError(ErrorCode.UNAUTHORIZED, "Usuario no autorizado", 401, options),
64
+ userExists: (options) => buildError(ErrorCode.USER_EXISTS, "El correo ya está registrado", 409, options),
65
+ userInactive: (options) => buildError(ErrorCode.USER_INACTIVE, "Usuario inactivo", 403, options),
66
+ userNotFound: (options) => buildError(ErrorCode.USER_NOT_FOUND, "Usuario no encontrado", 404, options),
67
+ validation: (field, options) => buildError(ErrorCode.VALIDATION, field ? `${field} inválido` : "metadata inválido", 400, options),
68
+ internal: (options) => buildError(ErrorCode.INTERNAL, "internal error", 500, options),
69
+ };
70
+ //# sourceMappingURL=app-error.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-error.factory.js","sourceRoot":"","sources":["../../src/errors/app-error.factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export class AppError extends Error {
2
+ code;
3
+ status;
4
+ errors;
5
+ constructor(code, message, status = 400, errors = {}) {
6
+ super(message ?? code);
7
+ this.code = code;
8
+ this.status = status;
9
+ this.errors = errors;
10
+ this.name = "AppError";
11
+ }
12
+ }
13
+ //# sourceMappingURL=app-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../src/errors/app-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAExB;IAEA;IACA;IAJT,YACS,IAAY,EACnB,OAAgB,EACT,SAAS,GAAG,EACZ,SAAiC,EAAE;QAE1C,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QALhB,SAAI,GAAJ,IAAI,CAAQ;QAEZ,WAAM,GAAN,MAAM,CAAM;QACZ,WAAM,GAAN,MAAM,CAA6B;QAG1C,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,59 @@
1
+ export declare const ErrorCode: {
2
+ readonly AUTH_REQUIRED: "AUTH_REQUIRED";
3
+ readonly BAD_REQUEST: "BAD_REQUEST";
4
+ readonly CHANNEL_EXISTS: "CHANNEL_EXISTS";
5
+ readonly CHANNEL_NOT_FOUND: "CHANNEL_NOT_FOUND";
6
+ readonly CONFIG: "CONFIG";
7
+ readonly CONFLICT: "CONFLICT";
8
+ readonly COURIER_DOCUMENT_TAKEN: "COURIER_DOCUMENT_TAKEN";
9
+ readonly COURIER_NOT_FOUND: "COURIER_NOT_FOUND";
10
+ readonly COURIER_PHONE_TAKEN: "COURIER_PHONE_TAKEN";
11
+ readonly CUSTOMER_NOT_FOUND: "CUSTOMER_NOT_FOUND";
12
+ readonly FORBIDDEN: "FORBIDDEN";
13
+ readonly INVALID_JSON: "INVALID_JSON";
14
+ readonly INVALID_REPORT: "INVALID_REPORT";
15
+ readonly INVALID_STATE: "INVALID_STATE";
16
+ readonly INVITE_REVOKED: "INVITE_REVOKED";
17
+ readonly LOGIN_STRATEGIES_MISSING: "LOGIN_STRATEGIES_MISSING";
18
+ readonly LOGIN_UNSUPPORTED_PROVIDER: "LOGIN_UNSUPPORTED_PROVIDER";
19
+ readonly NO_ITEMS: "NO_ITEMS";
20
+ readonly NOT_FOUND: "NOT_FOUND";
21
+ readonly NOTIFICATION_NOT_FOUND: "NOTIFICATION_NOT_FOUND";
22
+ readonly PARAMETER_EXISTS: "PARAMETER_EXISTS";
23
+ readonly PARAMETER_NOT_FOUND: "PARAMETER_NOT_FOUND";
24
+ readonly PRODUCT_EXISTS: "PRODUCT_EXISTS";
25
+ readonly PRODUCT_NOT_FOUND: "PRODUCT_NOT_FOUND";
26
+ readonly SERVICE_EXISTS: "SERVICE_EXISTS";
27
+ readonly SERVICE_NOT_FOUND: "SERVICE_NOT_FOUND";
28
+ readonly SUNAT_API_ERROR: "SUNAT_API_ERROR";
29
+ readonly SUNAT_AUTH_ERROR: "SUNAT_AUTH_ERROR";
30
+ readonly SUNAT_AUTH_FAILED: "SUNAT_AUTH_FAILED";
31
+ readonly SUNAT_AUTH_INVALID_RESPONSE: "SUNAT_AUTH_INVALID_RESPONSE";
32
+ readonly SUNAT_AUTH_TIMEOUT: "SUNAT_AUTH_TIMEOUT";
33
+ readonly SUNAT_SETTINGS_NOT_CONFIGURED: "SUNAT_SETTINGS_NOT_CONFIGURED";
34
+ readonly SUNAT_SETTINGS_NOT_FOUND: "SUNAT_SETTINGS_NOT_FOUND";
35
+ readonly SUNAT_TIMEOUT: "SUNAT_TIMEOUT";
36
+ readonly SYSTEM_NAV_ITEM_NOT_FOUND: "SYSTEM_NAV_ITEM_NOT_FOUND";
37
+ readonly TENANT_CONTEXT_CONFLICT: "TENANT_CONTEXT_CONFLICT";
38
+ readonly TENANT_CONTEXT_REQUIRED: "TENANT_CONTEXT_REQUIRED";
39
+ readonly TENANT_CONTEXT_UNAVAILABLE: "TENANT_CONTEXT_UNAVAILABLE";
40
+ readonly TENANT_FORBIDDEN: "TENANT_FORBIDDEN";
41
+ readonly TENANT_MEMBER_ALREADY_EXISTS: "TENANT_MEMBER_ALREADY_EXISTS";
42
+ readonly TENANT_MEMBER_NOT_FOUND: "TENANT_MEMBER_NOT_FOUND";
43
+ readonly TENANT_MISMATCH: "TENANT_MISMATCH";
44
+ readonly TENANT_NOT_FOUND: "TENANT_NOT_FOUND";
45
+ readonly TENANT_ROLE_IMMUTABLE: "TENANT_ROLE_IMMUTABLE";
46
+ readonly TENANT_ROLE_NOT_FOUND: "TENANT_ROLE_NOT_FOUND";
47
+ readonly TENANT_SEATS_EXCEEDED: "TENANT_SEATS_EXCEEDED";
48
+ readonly TENANT_SLUG_IN_USE: "TENANT_SLUG_IN_USE";
49
+ readonly UBIGEO_EXISTS: "UBIGEO_EXISTS";
50
+ readonly UBIGEO_NOT_FOUND: "UBIGEO_NOT_FOUND";
51
+ readonly UNAUTHORIZED: "UNAUTHORIZED";
52
+ readonly USER_EXISTS: "USER_EXISTS";
53
+ readonly USER_INACTIVE: "USER_INACTIVE";
54
+ readonly USER_NOT_FOUND: "USER_NOT_FOUND";
55
+ readonly VALIDATION: "VALIDATION";
56
+ readonly INTERNAL: "INTERNAL";
57
+ };
58
+ export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];
59
+ //# sourceMappingURL=error-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../../src/errors/error-codes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDZ,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC"}