@danceroutine/tango-core 1.11.1 → 1.11.2

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 (83) hide show
  1. package/dist/{TangoError-DdQVQNZU.js → TangoError-Cvgnm026.js} +8 -4
  2. package/dist/TangoError-Cvgnm026.js.map +1 -0
  3. package/dist/TangoError-ptR2iApz.d.ts +45 -0
  4. package/dist/chunk-D7D4PA-g.js +13 -0
  5. package/dist/errors/index.d.ts +3 -15
  6. package/dist/errors/index.js +3 -5
  7. package/dist/{errors-VacGsSaj.js → errors-DpI5Dxmr.js} +45 -36
  8. package/dist/errors-DpI5Dxmr.js.map +1 -0
  9. package/dist/http/index.d.ts +2 -10
  10. package/dist/http/index.js +2 -5
  11. package/dist/{http-63cMANMG.js → http-6e0y_vd6.js} +95 -79
  12. package/dist/{http-63cMANMG.js.map → http-6e0y_vd6.js.map} +1 -1
  13. package/dist/index-B5PoK4LH.d.ts +86 -0
  14. package/dist/index-D8o4DOOG.d.ts +824 -0
  15. package/dist/index-DFWodYLS.d.ts +161 -0
  16. package/dist/index-DPABSINz.d.ts +114 -0
  17. package/dist/index-MZzjIxgD.d.ts +59 -0
  18. package/dist/index.d.ts +7 -20
  19. package/dist/index.js +13 -7
  20. package/dist/index.js.map +1 -0
  21. package/dist/logging/index.d.ts +2 -3
  22. package/dist/logging/index.js +2 -3
  23. package/dist/logging-UC5uXHET.js +68 -0
  24. package/dist/logging-UC5uXHET.js.map +1 -0
  25. package/dist/runtime/index.d.ts +2 -14
  26. package/dist/runtime/index.js +2 -3
  27. package/dist/{runtime-B8KkgD3R.js → runtime-BAG_EKuM.js} +44 -35
  28. package/dist/runtime-BAG_EKuM.js.map +1 -0
  29. package/dist/sql/index.d.ts +2 -13
  30. package/dist/sql/index.js +2 -3
  31. package/dist/{sql-BI3ptL9-.js → sql-CIPnuTYO.js} +21 -16
  32. package/dist/{sql-BI3ptL9-.js.map → sql-CIPnuTYO.js.map} +1 -1
  33. package/package.json +2 -2
  34. package/dist/TangoError-DdQVQNZU.js.map +0 -1
  35. package/dist/chunk-BkvOhyD0.js +0 -12
  36. package/dist/errors/AuthenticationError.d.ts +0 -15
  37. package/dist/errors/ConflictError.d.ts +0 -15
  38. package/dist/errors/HttpError.d.ts +0 -7
  39. package/dist/errors/MultipleObjectsReturned.d.ts +0 -11
  40. package/dist/errors/NotFoundError.d.ts +0 -15
  41. package/dist/errors/PermissionDenied.d.ts +0 -15
  42. package/dist/errors/TangoError.d.ts +0 -33
  43. package/dist/errors/ValidationError.d.ts +0 -14
  44. package/dist/errors/factories/HttpErrorFactory.d.ts +0 -59
  45. package/dist/errors/factories/index.d.ts +0 -4
  46. package/dist/errors-VacGsSaj.js.map +0 -1
  47. package/dist/http/TangoBody.d.ts +0 -110
  48. package/dist/http/TangoHeaders.d.ts +0 -191
  49. package/dist/http/TangoQueryParams.d.ts +0 -81
  50. package/dist/http/TangoRequest.d.ts +0 -130
  51. package/dist/http/TangoResponse.d.ts +0 -305
  52. package/dist/logging/ConsoleLogger.d.ts +0 -15
  53. package/dist/logging/Logger.d.ts +0 -13
  54. package/dist/logging/getLogger.d.ts +0 -23
  55. package/dist/logging-BWeD4HOO.js +0 -48
  56. package/dist/logging-BWeD4HOO.js.map +0 -1
  57. package/dist/runtime/binary/index.d.ts +0 -6
  58. package/dist/runtime/binary/isArrayBuffer.d.ts +0 -4
  59. package/dist/runtime/binary/isBlob.d.ts +0 -4
  60. package/dist/runtime/binary/isUint8Array.d.ts +0 -4
  61. package/dist/runtime/date/index.d.ts +0 -4
  62. package/dist/runtime/date/isDate.d.ts +0 -4
  63. package/dist/runtime/error/index.d.ts +0 -4
  64. package/dist/runtime/error/isError.d.ts +0 -4
  65. package/dist/runtime/internal/hasTag.d.ts +0 -1
  66. package/dist/runtime/object/index.d.ts +0 -5
  67. package/dist/runtime/object/isNil.d.ts +0 -4
  68. package/dist/runtime/object/isObject.d.ts +0 -4
  69. package/dist/runtime/web/index.d.ts +0 -7
  70. package/dist/runtime/web/isFile.d.ts +0 -4
  71. package/dist/runtime/web/isFormData.d.ts +0 -4
  72. package/dist/runtime/web/isReadableStream.d.ts +0 -4
  73. package/dist/runtime/web/isURLSearchParams.d.ts +0 -4
  74. package/dist/runtime-B8KkgD3R.js.map +0 -1
  75. package/dist/sql/SqlDialect.d.ts +0 -5
  76. package/dist/sql/SqlIdentifierRole.d.ts +0 -13
  77. package/dist/sql/SqlSafetyEngine.d.ts +0 -50
  78. package/dist/sql/TrustedSqlFragment.d.ts +0 -5
  79. package/dist/sql/ValidatedSqlIdentifier.d.ts +0 -7
  80. package/dist/sql/isTrustedSqlFragment.d.ts +0 -5
  81. package/dist/sql/quoteSqlIdentifier.d.ts +0 -6
  82. package/dist/sql/trustedSql.d.ts +0 -5
  83. package/dist/sql/validateSqlIdentifier.d.ts +0 -6
@@ -1,5 +1,9 @@
1
-
2
1
  //#region src/errors/TangoError.ts
2
+ /**
3
+ * Base branded framework error.
4
+ *
5
+ * Subclasses provide HTTP status, stable code, and structured details.
6
+ */
3
7
  var TangoError = class extends Error {
4
8
  __tangoErrorBrand = "tango.error";
5
9
  /** Runtime guard for Tango-branded errors. */
@@ -29,7 +33,7 @@ var TangoError = class extends Error {
29
33
  };
30
34
  }
31
35
  };
32
-
33
36
  //#endregion
34
- export { TangoError };
35
- //# sourceMappingURL=TangoError-DdQVQNZU.js.map
37
+ export { TangoError as t };
38
+
39
+ //# sourceMappingURL=TangoError-Cvgnm026.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TangoError-Cvgnm026.js","names":[],"sources":["../src/errors/TangoError.ts"],"sourcesContent":["import type { HttpError } from './HttpError';\n\n/** Structured error detail payload for API responses. */\nexport type ErrorDetails = Record<string, string[]> | null | undefined;\n\n/** Canonical error payload shape used by Tango HTTP error responses. */\nexport type ProblemDetails<TDetails extends ErrorDetails = null> = {\n code: string;\n message: string;\n details?: TDetails;\n fields?: Record<string, string[]>;\n};\n\n/** Envelope shape for serialized error responses. */\nexport type ErrorEnvelope<TDetails extends ErrorDetails = null> = {\n error: ProblemDetails<TDetails>;\n};\n\n/**\n * Base branded framework error.\n *\n * Subclasses provide HTTP status, stable code, and structured details.\n */\nexport abstract class TangoError extends Error {\n // String brand avoids instanceof and survives cross-package boundaries.\n readonly __tangoErrorBrand = 'tango.error' as const;\n abstract status: number;\n\n protected abstract getDetails(): ErrorDetails;\n\n protected abstract getErrorName(): string;\n\n /** Runtime guard for Tango-branded errors. */\n static isTangoError(err: unknown): err is TangoError {\n return !!err && (err as { __tangoErrorBrand?: string }).__tangoErrorBrand === 'tango.error';\n }\n\n /** Runtime guard for plain problem-details objects. */\n static isProblemDetails(err: unknown): err is ProblemDetails {\n return (\n !!err &&\n typeof err === 'object' &&\n err !== null &&\n 'code' in err &&\n typeof (err as { code: unknown }).code === 'string' &&\n 'message' in err &&\n typeof (err as { message: unknown }).message === 'string'\n );\n }\n\n /** Convert this error to wire-level envelope format. */\n toErrorEnvelope(): ErrorEnvelope<ErrorDetails> {\n return {\n error: {\n code: this.getErrorName(),\n message: this.message,\n details: this.getDetails(),\n },\n };\n }\n\n /** Convert this error to legacy `HttpError` shape. */\n toHttpError(): HttpError {\n return {\n status: this.status,\n body: {\n error: this.message,\n details: this.getDetails(),\n },\n };\n }\n}\n"],"mappings":";;;;;;AAuBA,IAAsB,aAAtB,cAAyC,MAAM;CAE3C,oBAA6B;;CAQ7B,OAAO,aAAa,KAAiC;EACjD,OAAO,CAAC,CAAC,OAAQ,IAAuC,sBAAsB;CAClF;;CAGA,OAAO,iBAAiB,KAAqC;EACzD,OACI,CAAC,CAAC,OACF,OAAO,QAAQ,YACf,QAAQ,QACR,UAAU,OACV,OAAQ,IAA0B,SAAS,YAC3C,aAAa,OACb,OAAQ,IAA6B,YAAY;CAEzD;;CAGA,kBAA+C;EAC3C,OAAO,EACH,OAAO;GACH,MAAM,KAAK,aAAa;GACxB,SAAS,KAAK;GACd,SAAS,KAAK,WAAW;EAC7B,EACJ;CACJ;;CAGA,cAAyB;EACrB,OAAO;GACH,QAAQ,KAAK;GACb,MAAM;IACF,OAAO,KAAK;IACZ,SAAS,KAAK,WAAW;GAC7B;EACJ;CACJ;AACJ"}
@@ -0,0 +1,45 @@
1
+ //#region src/errors/HttpError.d.ts
2
+ interface HttpError {
3
+ status: number;
4
+ body: {
5
+ error: string;
6
+ details?: Record<string, string[]> | null;
7
+ };
8
+ }
9
+ //#endregion
10
+ //#region src/errors/TangoError.d.ts
11
+ /** Structured error detail payload for API responses. */
12
+ type ErrorDetails = Record<string, string[]> | null | undefined;
13
+ /** Canonical error payload shape used by Tango HTTP error responses. */
14
+ type ProblemDetails<TDetails extends ErrorDetails = null> = {
15
+ code: string;
16
+ message: string;
17
+ details?: TDetails;
18
+ fields?: Record<string, string[]>;
19
+ };
20
+ /** Envelope shape for serialized error responses. */
21
+ type ErrorEnvelope<TDetails extends ErrorDetails = null> = {
22
+ error: ProblemDetails<TDetails>;
23
+ };
24
+ /**
25
+ * Base branded framework error.
26
+ *
27
+ * Subclasses provide HTTP status, stable code, and structured details.
28
+ */
29
+ declare abstract class TangoError extends Error {
30
+ readonly __tangoErrorBrand: "tango.error";
31
+ abstract status: number;
32
+ protected abstract getDetails(): ErrorDetails;
33
+ protected abstract getErrorName(): string;
34
+ /** Runtime guard for Tango-branded errors. */
35
+ static isTangoError(err: unknown): err is TangoError;
36
+ /** Runtime guard for plain problem-details objects. */
37
+ static isProblemDetails(err: unknown): err is ProblemDetails;
38
+ /** Convert this error to wire-level envelope format. */
39
+ toErrorEnvelope(): ErrorEnvelope<ErrorDetails>;
40
+ /** Convert this error to legacy `HttpError` shape. */
41
+ toHttpError(): HttpError;
42
+ }
43
+ //#endregion
44
+ export { HttpError as a, TangoError as i, ErrorEnvelope as n, ProblemDetails as r, ErrorDetails as t };
45
+ //# sourceMappingURL=TangoError-ptR2iApz.d.ts.map
@@ -0,0 +1,13 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true
8
+ });
9
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
10
+ return target;
11
+ };
12
+ //#endregion
13
+ export { __exportAll as t };
@@ -1,15 +1,3 @@
1
- /**
2
- * Domain boundary barrel: centralizes this subdomain's public contract.
3
- */
4
- import type { HttpError } from './HttpError';
5
- import * as factories from './factories/index';
6
- import { TangoError, type ErrorDetails, type ErrorEnvelope, type ProblemDetails } from './TangoError';
7
- import { ConflictError } from './ConflictError';
8
- import { ValidationError } from './ValidationError';
9
- import { MultipleObjectsReturned } from './MultipleObjectsReturned';
10
- import { NotFoundError } from './NotFoundError';
11
- import { PermissionDenied } from './PermissionDenied';
12
- import { AuthenticationError } from './AuthenticationError';
13
- import { HttpErrorFactory, type HttpErrorFactoryConfig } from './factories/HttpErrorFactory';
14
- export { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, TangoError, ValidationError, factories, };
15
- export type { ErrorDetails, ErrorEnvelope, HttpError, HttpErrorFactoryConfig, ProblemDetails };
1
+ import { a as HttpError, i as TangoError, n as ErrorEnvelope, r as ProblemDetails, t as ErrorDetails } from "../TangoError-ptR2iApz.js";
2
+ import { a as MultipleObjectsReturned, c as index_d_exports, i as NotFoundError, l as HttpErrorFactory, n as AuthenticationError, o as ValidationError, r as PermissionDenied, s as ConflictError, u as HttpErrorFactoryConfig } from "../index-DFWodYLS.js";
3
+ export { AuthenticationError, ConflictError, type ErrorDetails, type ErrorEnvelope, type HttpError, HttpErrorFactory, type HttpErrorFactoryConfig, MultipleObjectsReturned, NotFoundError, PermissionDenied, type ProblemDetails, TangoError, ValidationError, index_d_exports as factories };
@@ -1,5 +1,3 @@
1
- import { TangoError } from "../TangoError-DdQVQNZU.js";
2
- import "../runtime-B8KkgD3R.js";
3
- import { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, ValidationError, factories_exports } from "../errors-VacGsSaj.js";
4
-
5
- export { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, TangoError, ValidationError, factories_exports as factories };
1
+ import { t as TangoError } from "../TangoError-Cvgnm026.js";
2
+ import { a as MultipleObjectsReturned, c as factories_exports, i as NotFoundError, l as HttpErrorFactory, n as AuthenticationError, o as ValidationError, r as PermissionDenied, s as ConflictError } from "../errors-DpI5Dxmr.js";
3
+ export { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, TangoError, ValidationError, factories_exports as factories };
@@ -1,12 +1,34 @@
1
- import { __export } from "./chunk-BkvOhyD0.js";
2
- import { TangoError } from "./TangoError-DdQVQNZU.js";
3
- import { isError, isObject } from "./runtime-B8KkgD3R.js";
4
-
1
+ import { t as __exportAll } from "./chunk-D7D4PA-g.js";
2
+ import { t as TangoError } from "./TangoError-Cvgnm026.js";
3
+ import { a as isError, s as isObject } from "./runtime-BAG_EKuM.js";
5
4
  //#region src/errors/factories/HttpErrorFactory.ts
5
+ /**
6
+ * Converts errors into structured HTTP error responses.
7
+ * Supports TangoError subclasses out of the box, and custom error handlers
8
+ * can be registered for third-party or application-specific error types.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Development (default) — exposes real error messages
13
+ * const devFactory = new HttpErrorFactory();
14
+ *
15
+ * // Production — hides internal error details
16
+ * const prodFactory = new HttpErrorFactory({ exposeErrors: false });
17
+ *
18
+ * // Register a custom handler for a third-party error
19
+ * prodFactory.registerHandler(ZodError, (err) => ({
20
+ * status: 400,
21
+ * body: { error: 'Validation failed', details: err.flatten().fieldErrors },
22
+ * }));
23
+ *
24
+ * // Quick one-shot conversion with dev defaults
25
+ * const httpError = HttpErrorFactory.toHttpError(new NotFoundError('missing'));
26
+ * ```
27
+ */
6
28
  var HttpErrorFactory = class HttpErrorFactory {
7
29
  static BRAND = "tango.error_factory.http";
8
30
  __tangoBrand = HttpErrorFactory.BRAND;
9
- handlers = new Map();
31
+ handlers = /* @__PURE__ */ new Map();
10
32
  exposeErrors;
11
33
  constructor(config = {}) {
12
34
  this.exposeErrors = config.exposeErrors ?? true;
@@ -34,7 +56,7 @@ var HttpErrorFactory = class HttpErrorFactory {
34
56
  const message = typeof issue.message === "string" ? issue.message : "Invalid value";
35
57
  const existing = details[key];
36
58
  if (existing) existing.push(message);
37
- else details[key] = [message];
59
+ else details[key] = [message];
38
60
  }
39
61
  return details;
40
62
  }
@@ -84,14 +106,12 @@ else details[key] = [message];
84
106
  return false;
85
107
  }
86
108
  };
87
-
88
109
  //#endregion
89
110
  //#region src/errors/factories/index.ts
90
- var factories_exports = {};
91
- __export(factories_exports, { HttpErrorFactory: () => HttpErrorFactory });
92
-
111
+ var factories_exports = /* @__PURE__ */ __exportAll({ HttpErrorFactory: () => HttpErrorFactory });
93
112
  //#endregion
94
113
  //#region src/errors/ConflictError.ts
114
+ /** Error for conflicting resource state (HTTP 409). */
95
115
  var ConflictError = class ConflictError extends TangoError {
96
116
  static BRAND = "tango.error.conflict";
97
117
  __tangoBrand = ConflictError.BRAND;
@@ -111,14 +131,13 @@ var ConflictError = class ConflictError extends TangoError {
111
131
  getErrorName() {
112
132
  return "conflict";
113
133
  }
114
- getDetails() {
115
- return undefined;
116
- }
134
+ getDetails() {}
117
135
  };
118
-
119
136
  //#endregion
120
137
  //#region src/errors/ValidationError.ts
138
+ /** Error for request validation failures (HTTP 400). */
121
139
  var ValidationError = class ValidationError extends TangoError {
140
+ details;
122
141
  __tangoValidationErrorBrand = "tango.error.validation";
123
142
  status = 400;
124
143
  constructor(message, details) {
@@ -140,9 +159,9 @@ var ValidationError = class ValidationError extends TangoError {
140
159
  return this.details;
141
160
  }
142
161
  };
143
-
144
162
  //#endregion
145
163
  //#region src/errors/MultipleObjectsReturned.ts
164
+ /** Error when a queryset lookup returns more than one row (HTTP 409). */
146
165
  var MultipleObjectsReturned = class MultipleObjectsReturned extends TangoError {
147
166
  static BRAND = "tango.error.multiple_objects_returned";
148
167
  __tangoBrand = MultipleObjectsReturned.BRAND;
@@ -158,13 +177,11 @@ var MultipleObjectsReturned = class MultipleObjectsReturned extends TangoError {
158
177
  getErrorName() {
159
178
  return "multiple_objects_returned";
160
179
  }
161
- getDetails() {
162
- return undefined;
163
- }
180
+ getDetails() {}
164
181
  };
165
-
166
182
  //#endregion
167
183
  //#region src/errors/NotFoundError.ts
184
+ /** Error for missing resources (HTTP 404). */
168
185
  var NotFoundError = class NotFoundError extends TangoError {
169
186
  static BRAND = "tango.error.not_found";
170
187
  __tangoBrand = NotFoundError.BRAND;
@@ -184,13 +201,11 @@ var NotFoundError = class NotFoundError extends TangoError {
184
201
  getErrorName() {
185
202
  return "not_found";
186
203
  }
187
- getDetails() {
188
- return undefined;
189
- }
204
+ getDetails() {}
190
205
  };
191
-
192
206
  //#endregion
193
207
  //#region src/errors/PermissionDenied.ts
208
+ /** Error for authorization failures (HTTP 403). */
194
209
  var PermissionDenied = class PermissionDenied extends TangoError {
195
210
  static BRAND = "tango.error.permission_denied";
196
211
  __tangoBrand = PermissionDenied.BRAND;
@@ -210,13 +225,11 @@ var PermissionDenied = class PermissionDenied extends TangoError {
210
225
  getErrorName() {
211
226
  return "permission_denied";
212
227
  }
213
- getDetails() {
214
- return undefined;
215
- }
228
+ getDetails() {}
216
229
  };
217
-
218
230
  //#endregion
219
231
  //#region src/errors/AuthenticationError.ts
232
+ /** Error for missing/invalid authentication (HTTP 401). */
220
233
  var AuthenticationError = class AuthenticationError extends TangoError {
221
234
  static BRAND = "tango.error.authentication";
222
235
  __tangoBrand = AuthenticationError.BRAND;
@@ -236,15 +249,11 @@ var AuthenticationError = class AuthenticationError extends TangoError {
236
249
  getErrorName() {
237
250
  return "authentication_error";
238
251
  }
239
- getDetails() {
240
- return undefined;
241
- }
252
+ getDetails() {}
242
253
  };
243
-
244
254
  //#endregion
245
255
  //#region src/errors/index.ts
246
- var errors_exports = {};
247
- __export(errors_exports, {
256
+ var errors_exports = /* @__PURE__ */ __exportAll({
248
257
  AuthenticationError: () => AuthenticationError,
249
258
  ConflictError: () => ConflictError,
250
259
  HttpErrorFactory: () => HttpErrorFactory,
@@ -255,7 +264,7 @@ __export(errors_exports, {
255
264
  ValidationError: () => ValidationError,
256
265
  factories: () => factories_exports
257
266
  });
258
-
259
267
  //#endregion
260
- export { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, ValidationError, errors_exports, factories_exports };
261
- //# sourceMappingURL=errors-VacGsSaj.js.map
268
+ export { MultipleObjectsReturned as a, factories_exports as c, NotFoundError as i, HttpErrorFactory as l, AuthenticationError as n, ValidationError as o, PermissionDenied as r, ConflictError as s, errors_exports as t };
269
+
270
+ //# sourceMappingURL=errors-DpI5Dxmr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors-DpI5Dxmr.js","names":[],"sources":["../src/errors/factories/HttpErrorFactory.ts","../src/errors/factories/index.ts","../src/errors/ConflictError.ts","../src/errors/ValidationError.ts","../src/errors/MultipleObjectsReturned.ts","../src/errors/NotFoundError.ts","../src/errors/PermissionDenied.ts","../src/errors/AuthenticationError.ts","../src/errors/index.ts"],"sourcesContent":["import { TangoError } from '../TangoError';\nimport type { HttpError } from '../HttpError';\nimport { isError, isObject } from '../../runtime/index';\n\nexport interface HttpErrorFactoryConfig {\n /**\n * When true, raw error messages are included in HTTP responses.\n * When false, generic messages are returned for non-TangoError exceptions.\n * Defaults to true (dev-friendly). Set to false in production.\n */\n exposeErrors?: boolean;\n}\n\ntype ZodLikeIssue = {\n path?: unknown[];\n message?: unknown;\n};\n\ntype ZodLikeError = Error & {\n issues: ZodLikeIssue[];\n};\n\n/**\n * Converts errors into structured HTTP error responses.\n * Supports TangoError subclasses out of the box, and custom error handlers\n * can be registered for third-party or application-specific error types.\n *\n * @example\n * ```typescript\n * // Development (default) — exposes real error messages\n * const devFactory = new HttpErrorFactory();\n *\n * // Production — hides internal error details\n * const prodFactory = new HttpErrorFactory({ exposeErrors: false });\n *\n * // Register a custom handler for a third-party error\n * prodFactory.registerHandler(ZodError, (err) => ({\n * status: 400,\n * body: { error: 'Validation failed', details: err.flatten().fieldErrors },\n * }));\n *\n * // Quick one-shot conversion with dev defaults\n * const httpError = HttpErrorFactory.toHttpError(new NotFoundError('missing'));\n * ```\n */\nexport class HttpErrorFactory {\n static readonly BRAND = 'tango.error_factory.http' as const;\n readonly __tangoBrand: typeof HttpErrorFactory.BRAND = HttpErrorFactory.BRAND;\n\n // oxlint-disable-next-line typescript/no-explicit-any\n private handlers = new Map<new (...args: any[]) => Error, (error: Error) => HttpError>();\n private exposeErrors: boolean;\n\n constructor(config: HttpErrorFactoryConfig = {}) {\n this.exposeErrors = config.exposeErrors ?? true;\n }\n\n /**\n * Narrow an unknown value to `HttpErrorFactory`.\n */\n static isHttpErrorFactory(value: unknown): value is HttpErrorFactory {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === HttpErrorFactory.BRAND\n );\n }\n\n /**\n * Convert an unknown error into an `HttpError` using dev-friendly defaults.\n * Shorthand for `new HttpErrorFactory().create(error)`.\n */\n static toHttpError(error: unknown): HttpError {\n return new HttpErrorFactory().create(error);\n }\n\n private static isZodLikeValidationError(error: unknown): error is ZodLikeError {\n return (\n isError(error) &&\n isObject(error) &&\n Array.isArray((error as { issues?: unknown }).issues) &&\n (error as { name?: unknown }).name === 'ZodError'\n );\n }\n\n private static zodLikeErrorDetails(error: ZodLikeError): Record<string, string[]> {\n const details: Record<string, string[]> = {};\n\n for (const issue of error.issues) {\n const key = Array.isArray(issue.path) && issue.path.length > 0 ? String(issue.path.join('.')) : '_schema';\n const message = typeof issue.message === 'string' ? issue.message : 'Invalid value';\n\n const existing = details[key];\n if (existing) {\n existing.push(message);\n } else {\n details[key] = [message];\n }\n }\n\n return details;\n }\n\n /**\n * Register a custom mapper for an application or third-party error type.\n */\n\n // oxlint-disable-next-line typescript/no-explicit-any\n registerHandler<T extends Error>(errorClass: new (...args: any[]) => T, handler: (error: T) => HttpError): this {\n this.handlers.set(errorClass, handler as (error: Error) => HttpError);\n return this;\n }\n\n /**\n * Convert an unknown error into the normalized HTTP error shape Tango uses.\n */\n create(error: unknown): HttpError {\n if (TangoError.isTangoError(error)) {\n return error.toHttpError();\n }\n\n if (HttpErrorFactory.isZodLikeValidationError(error)) {\n return {\n status: 400,\n body: {\n error: error.message || 'Validation failed',\n details: HttpErrorFactory.zodLikeErrorDetails(error),\n },\n };\n }\n\n for (const [ErrorClass, handler] of this.handlers) {\n if (this.isErrorClassInstance(error, ErrorClass)) {\n return handler(error);\n }\n }\n\n if (isError(error)) {\n return {\n status: 500,\n body: {\n error: this.exposeErrors ? error.message : 'Internal Server Error',\n details: null,\n },\n };\n }\n\n return {\n status: 500,\n body: {\n error: 'Unknown error occurred',\n details: null,\n },\n };\n }\n\n // oxlint-disable-next-line typescript/no-explicit-any\n private isErrorClassInstance(error: unknown, ErrorClass: new (...args: any[]) => Error): error is Error {\n if (!isError(error)) {\n return false;\n }\n\n const expectedBrand = (ErrorClass as { BRAND?: unknown }).BRAND;\n if (\n typeof expectedBrand === 'string' &&\n isObject(error) &&\n (error as { __tangoBrand?: unknown }).__tangoBrand === expectedBrand\n ) {\n return true;\n }\n\n const constructorName = (error as { constructor?: { name?: unknown } }).constructor?.name;\n if (typeof constructorName === 'string' && constructorName === ErrorClass.name) {\n return true;\n }\n\n const errorName = (error as { name?: unknown }).name;\n if (typeof errorName === 'string' && errorName === ErrorClass.name) {\n return true;\n }\n\n return false;\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { HttpErrorFactory, type HttpErrorFactoryConfig } from './HttpErrorFactory';\n","import { TangoError, type ErrorDetails } from './TangoError';\n\n/** Error for conflicting resource state (HTTP 409). */\nexport class ConflictError extends TangoError {\n static readonly BRAND = 'tango.error.conflict' as const;\n readonly __tangoBrand: typeof ConflictError.BRAND = ConflictError.BRAND;\n status = 409;\n\n /** Create a conflict error with optional custom message. */\n constructor(message: string = 'Resource conflict') {\n super(message);\n this.name = 'ConflictError';\n Object.setPrototypeOf(this, ConflictError.prototype);\n }\n\n /**\n * Narrow an unknown value to `ConflictError`.\n */\n static isConflictError(value: unknown): value is ConflictError {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === ConflictError.BRAND\n );\n }\n\n protected override getErrorName(): string {\n return 'conflict';\n }\n\n protected override getDetails(): ErrorDetails {\n return undefined;\n }\n}\n","import { TangoError, type ErrorDetails } from './TangoError';\n\n/** Error for request validation failures (HTTP 400). */\nexport class ValidationError extends TangoError {\n readonly __tangoValidationErrorBrand = 'tango.error.validation' as const;\n status = 400;\n\n constructor(\n message: string,\n public details?: ErrorDetails\n ) {\n super(message);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n\n /**\n * Narrow an unknown value to `ValidationError`, including common legacy shapes.\n */\n static isValidationError(err: unknown): err is ValidationError {\n return (\n (!!err &&\n typeof err === 'object' &&\n (err as { __tangoValidationErrorBrand?: string }).__tangoValidationErrorBrand ===\n 'tango.error.validation') ||\n (typeof err === 'object' &&\n err !== null &&\n 'fields' in err &&\n typeof (err as { fields: unknown }).fields === 'object')\n );\n }\n\n protected override getErrorName(): string {\n return 'ValidationError';\n }\n\n protected override getDetails(): ErrorDetails {\n return this.details;\n }\n}\n","import { TangoError, type ErrorDetails } from './TangoError';\n\n/** Error when a queryset lookup returns more than one row (HTTP 409). */\nexport class MultipleObjectsReturned extends TangoError {\n static readonly BRAND = 'tango.error.multiple_objects_returned' as const;\n readonly __tangoBrand: typeof MultipleObjectsReturned.BRAND = MultipleObjectsReturned.BRAND;\n status = 409;\n\n constructor(message: string = 'Multiple objects returned') {\n super(message);\n this.name = 'MultipleObjectsReturned';\n Object.setPrototypeOf(this, MultipleObjectsReturned.prototype);\n }\n\n static isMultipleObjectsReturned(value: unknown): value is MultipleObjectsReturned {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === MultipleObjectsReturned.BRAND\n );\n }\n\n protected override getErrorName(): string {\n return 'multiple_objects_returned';\n }\n\n protected override getDetails(): ErrorDetails {\n return undefined;\n }\n}\n","import { TangoError, type ErrorDetails } from './TangoError';\n\n/** Error for missing resources (HTTP 404). */\nexport class NotFoundError extends TangoError {\n static readonly BRAND = 'tango.error.not_found' as const;\n readonly __tangoBrand: typeof NotFoundError.BRAND = NotFoundError.BRAND;\n status = 404;\n\n /** Create a not-found error with optional custom message. */\n constructor(message: string = 'Resource not found') {\n super(message);\n this.name = 'NotFoundError';\n Object.setPrototypeOf(this, NotFoundError.prototype);\n }\n\n /**\n * Narrow an unknown value to `NotFoundError`.\n */\n static isNotFoundError(value: unknown): value is NotFoundError {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === NotFoundError.BRAND\n );\n }\n\n protected override getErrorName(): string {\n return 'not_found';\n }\n\n protected override getDetails(): ErrorDetails {\n return undefined;\n }\n}\n","import { TangoError, type ErrorDetails } from './TangoError';\n\n/** Error for authorization failures (HTTP 403). */\nexport class PermissionDenied extends TangoError {\n static readonly BRAND = 'tango.error.permission_denied' as const;\n readonly __tangoBrand: typeof PermissionDenied.BRAND = PermissionDenied.BRAND;\n status = 403;\n\n /** Create a permission-denied error with optional custom message. */\n constructor(message: string = 'Permission denied') {\n super(message);\n this.name = 'PermissionDenied';\n Object.setPrototypeOf(this, PermissionDenied.prototype);\n }\n\n /**\n * Narrow an unknown value to `PermissionDenied`.\n */\n static isPermissionDenied(value: unknown): value is PermissionDenied {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === PermissionDenied.BRAND\n );\n }\n\n protected override getErrorName(): string {\n return 'permission_denied';\n }\n\n protected override getDetails(): ErrorDetails {\n return undefined;\n }\n}\n","import { TangoError, type ErrorDetails } from './TangoError';\n\n/** Error for missing/invalid authentication (HTTP 401). */\nexport class AuthenticationError extends TangoError {\n static readonly BRAND = 'tango.error.authentication' as const;\n readonly __tangoBrand: typeof AuthenticationError.BRAND = AuthenticationError.BRAND;\n status = 401;\n\n /** Create an authentication error with optional custom message. */\n constructor(message: string = 'Authentication required') {\n super(message);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n\n /**\n * Narrow an unknown value to `AuthenticationError`.\n */\n static isAuthenticationError(value: unknown): value is AuthenticationError {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === AuthenticationError.BRAND\n );\n }\n\n protected override getErrorName(): string {\n return 'authentication_error';\n }\n\n protected override getDetails(): ErrorDetails {\n return undefined;\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nimport type { HttpError } from './HttpError';\nimport * as factories from './factories/index';\nimport { TangoError, type ErrorDetails, type ErrorEnvelope, type ProblemDetails } from './TangoError';\nimport { ConflictError } from './ConflictError';\nimport { ValidationError } from './ValidationError';\nimport { MultipleObjectsReturned } from './MultipleObjectsReturned';\nimport { NotFoundError } from './NotFoundError';\nimport { PermissionDenied } from './PermissionDenied';\nimport { AuthenticationError } from './AuthenticationError';\nimport { HttpErrorFactory, type HttpErrorFactoryConfig } from './factories/HttpErrorFactory';\n\nexport {\n AuthenticationError,\n ConflictError,\n HttpErrorFactory,\n MultipleObjectsReturned,\n NotFoundError,\n PermissionDenied,\n TangoError,\n ValidationError,\n factories,\n};\n\nexport type { ErrorDetails, ErrorEnvelope, HttpError, HttpErrorFactoryConfig, ProblemDetails };\n"],"mappings":"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"}
@@ -1,10 +1,2 @@
1
- /**
2
- * Domain boundary barrel: centralizes this subdomain's public contract.
3
- */
4
- import { TangoBody, type JsonValue } from './TangoBody';
5
- import { TangoHeaders } from './TangoHeaders';
6
- import { TangoQueryParams } from './TangoQueryParams';
7
- import { TangoRequest } from './TangoRequest';
8
- import { TangoResponse } from './TangoResponse';
9
- export { TangoBody, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse };
10
- export type { JsonValue };
1
+ import { a as TangoHeaders, i as TangoRequest, n as TangoResponse, o as JsonValue, r as TangoQueryParams, s as TangoBody } from "../index-D8o4DOOG.js";
2
+ export { type JsonValue, TangoBody, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse };
@@ -1,5 +1,2 @@
1
- import "../TangoError-DdQVQNZU.js";
2
- import "../runtime-B8KkgD3R.js";
3
- import { TangoBody, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse } from "../http-63cMANMG.js";
4
-
5
- export { TangoBody, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse };
1
+ import { a as TangoHeaders, i as TangoQueryParams, n as TangoResponse, o as TangoBody, r as TangoRequest } from "../http-6e0y_vd6.js";
2
+ export { TangoBody, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse };