@danceroutine/tango-core 1.6.0 → 1.8.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.
- package/dist/errors/MultipleObjectsReturned.d.ts +11 -0
- package/dist/errors/index.d.ts +2 -1
- package/dist/errors/index.js +2 -2
- package/dist/{errors-_tWsmNyZ.js → errors-VacGsSaj.js} +25 -2
- package/dist/errors-VacGsSaj.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/errors-_tWsmNyZ.js.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TangoError, type ErrorDetails } from './TangoError';
|
|
2
|
+
/** Error when a queryset lookup returns more than one row (HTTP 409). */
|
|
3
|
+
export declare class MultipleObjectsReturned extends TangoError {
|
|
4
|
+
static readonly BRAND: "tango.error.multiple_objects_returned";
|
|
5
|
+
readonly __tangoBrand: typeof MultipleObjectsReturned.BRAND;
|
|
6
|
+
status: number;
|
|
7
|
+
constructor(message?: string);
|
|
8
|
+
static isMultipleObjectsReturned(value: unknown): value is MultipleObjectsReturned;
|
|
9
|
+
protected getErrorName(): string;
|
|
10
|
+
protected getDetails(): ErrorDetails;
|
|
11
|
+
}
|
package/dist/errors/index.d.ts
CHANGED
|
@@ -6,9 +6,10 @@ import * as factories from './factories/index';
|
|
|
6
6
|
import { TangoError, type ErrorDetails, type ErrorEnvelope, type ProblemDetails } from './TangoError';
|
|
7
7
|
import { ConflictError } from './ConflictError';
|
|
8
8
|
import { ValidationError } from './ValidationError';
|
|
9
|
+
import { MultipleObjectsReturned } from './MultipleObjectsReturned';
|
|
9
10
|
import { NotFoundError } from './NotFoundError';
|
|
10
11
|
import { PermissionDenied } from './PermissionDenied';
|
|
11
12
|
import { AuthenticationError } from './AuthenticationError';
|
|
12
13
|
import { HttpErrorFactory, type HttpErrorFactoryConfig } from './factories/HttpErrorFactory';
|
|
13
|
-
export { AuthenticationError, ConflictError, HttpErrorFactory, NotFoundError, PermissionDenied, TangoError, ValidationError, factories, };
|
|
14
|
+
export { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, TangoError, ValidationError, factories, };
|
|
14
15
|
export type { ErrorDetails, ErrorEnvelope, HttpError, HttpErrorFactoryConfig, ProblemDetails };
|
package/dist/errors/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TangoError } from "../TangoError-DdQVQNZU.js";
|
|
2
2
|
import "../runtime-B8KkgD3R.js";
|
|
3
|
-
import { AuthenticationError, ConflictError, HttpErrorFactory, NotFoundError, PermissionDenied, ValidationError, factories_exports } from "../errors-
|
|
3
|
+
import { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, ValidationError, factories_exports } from "../errors-VacGsSaj.js";
|
|
4
4
|
|
|
5
|
-
export { AuthenticationError, ConflictError, HttpErrorFactory, NotFoundError, PermissionDenied, TangoError, ValidationError, factories_exports as factories };
|
|
5
|
+
export { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, TangoError, ValidationError, factories_exports as factories };
|
|
@@ -141,6 +141,28 @@ var ValidationError = class ValidationError extends TangoError {
|
|
|
141
141
|
}
|
|
142
142
|
};
|
|
143
143
|
|
|
144
|
+
//#endregion
|
|
145
|
+
//#region src/errors/MultipleObjectsReturned.ts
|
|
146
|
+
var MultipleObjectsReturned = class MultipleObjectsReturned extends TangoError {
|
|
147
|
+
static BRAND = "tango.error.multiple_objects_returned";
|
|
148
|
+
__tangoBrand = MultipleObjectsReturned.BRAND;
|
|
149
|
+
status = 409;
|
|
150
|
+
constructor(message = "Multiple objects returned") {
|
|
151
|
+
super(message);
|
|
152
|
+
this.name = "MultipleObjectsReturned";
|
|
153
|
+
Object.setPrototypeOf(this, MultipleObjectsReturned.prototype);
|
|
154
|
+
}
|
|
155
|
+
static isMultipleObjectsReturned(value) {
|
|
156
|
+
return typeof value === "object" && value !== null && value.__tangoBrand === MultipleObjectsReturned.BRAND;
|
|
157
|
+
}
|
|
158
|
+
getErrorName() {
|
|
159
|
+
return "multiple_objects_returned";
|
|
160
|
+
}
|
|
161
|
+
getDetails() {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
|
|
144
166
|
//#endregion
|
|
145
167
|
//#region src/errors/NotFoundError.ts
|
|
146
168
|
var NotFoundError = class NotFoundError extends TangoError {
|
|
@@ -226,6 +248,7 @@ __export(errors_exports, {
|
|
|
226
248
|
AuthenticationError: () => AuthenticationError,
|
|
227
249
|
ConflictError: () => ConflictError,
|
|
228
250
|
HttpErrorFactory: () => HttpErrorFactory,
|
|
251
|
+
MultipleObjectsReturned: () => MultipleObjectsReturned,
|
|
229
252
|
NotFoundError: () => NotFoundError,
|
|
230
253
|
PermissionDenied: () => PermissionDenied,
|
|
231
254
|
TangoError: () => TangoError,
|
|
@@ -234,5 +257,5 @@ __export(errors_exports, {
|
|
|
234
257
|
});
|
|
235
258
|
|
|
236
259
|
//#endregion
|
|
237
|
-
export { AuthenticationError, ConflictError, HttpErrorFactory, NotFoundError, PermissionDenied, ValidationError, errors_exports, factories_exports };
|
|
238
|
-
//# sourceMappingURL=errors-
|
|
260
|
+
export { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, ValidationError, errors_exports, factories_exports };
|
|
261
|
+
//# sourceMappingURL=errors-VacGsSaj.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-VacGsSaj.js","names":["config: HttpErrorFactoryConfig","value: unknown","error: unknown","error: ZodLikeError","details: Record<string, string[]>","errorClass: new (...args: any[]) => T","handler: (error: T) => HttpError","ErrorClass: new (...args: any[]) => Error","message: string","value: unknown","message: string","details?: ErrorDetails","err: unknown","message: string","value: unknown","message: string","value: unknown","message: string","value: unknown","message: string","value: unknown"],"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":";;;;;IA6Ca,mBAAN,MAAM,iBAAiB;CAC1B,OAAgB,QAAQ;CACxB,eAAuD,iBAAiB;CAGxE,WAAmB,IAAI;CACvB;CAEA,YAAYA,SAAiC,CAAE,GAAE;AAC7C,OAAK,eAAe,OAAO,gBAAgB;CAC9C;;;;CAKD,OAAO,mBAAmBC,OAA2C;AACjE,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,iBAAiB;CAE/E;;;;;CAMD,OAAO,YAAYC,OAA2B;AAC1C,SAAO,IAAI,mBAAmB,OAAO,MAAM;CAC9C;CAED,OAAe,yBAAyBA,OAAuC;AAC3E,SACI,QAAQ,MAAM,IACd,SAAS,MAAM,IACf,MAAM,QAAS,MAA+B,OAAO,IACpD,MAA6B,SAAS;CAE9C;CAED,OAAe,oBAAoBC,OAA+C;EAC9E,MAAMC,UAAoC,CAAE;AAE5C,OAAK,MAAM,SAAS,MAAM,QAAQ;GAC9B,MAAM,MAAM,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG;GAChG,MAAM,iBAAiB,MAAM,YAAY,WAAW,MAAM,UAAU;GAEpE,MAAM,WAAW,QAAQ;AACzB,OAAI,SACA,UAAS,KAAK,QAAQ;IAEtB,SAAQ,OAAO,CAAC,OAAQ;EAE/B;AAED,SAAO;CACV;;;;CAOD,gBAAiCC,YAAuCC,SAAwC;AAC5G,OAAK,SAAS,IAAI,YAAY,QAAuC;AACrE,SAAO;CACV;;;;CAKD,OAAOJ,OAA2B;AAC9B,MAAI,WAAW,aAAa,MAAM,CAC9B,QAAO,MAAM,aAAa;AAG9B,MAAI,iBAAiB,yBAAyB,MAAM,CAChD,QAAO;GACH,QAAQ;GACR,MAAM;IACF,OAAO,MAAM,WAAW;IACxB,SAAS,iBAAiB,oBAAoB,MAAM;GACvD;EACJ;AAGL,OAAK,MAAM,CAAC,YAAY,QAAQ,IAAI,KAAK,SACrC,KAAI,KAAK,qBAAqB,OAAO,WAAW,CAC5C,QAAO,QAAQ,MAAM;AAI7B,MAAI,QAAQ,MAAM,CACd,QAAO;GACH,QAAQ;GACR,MAAM;IACF,OAAO,KAAK,eAAe,MAAM,UAAU;IAC3C,SAAS;GACZ;EACJ;AAGL,SAAO;GACH,QAAQ;GACR,MAAM;IACF,OAAO;IACP,SAAS;GACZ;EACJ;CACJ;CAGD,qBAA6BA,OAAgBK,YAA2D;AACpG,OAAK,QAAQ,MAAM,CACf,QAAO;EAGX,MAAM,gBAAiB,WAAmC;AAC1D,aACW,kBAAkB,YACzB,SAAS,MAAM,IACd,MAAqC,iBAAiB,cAEvD,QAAO;EAGX,MAAM,kBAAmB,MAA+C,aAAa;AACrF,aAAW,oBAAoB,YAAY,oBAAoB,WAAW,KACtE,QAAO;EAGX,MAAM,YAAa,MAA6B;AAChD,aAAW,cAAc,YAAY,cAAc,WAAW,KAC1D,QAAO;AAGX,SAAO;CACV;AACJ;;;;;;;;;ICpLY,gBAAN,MAAM,sBAAsB,WAAW;CAC1C,OAAgB,QAAQ;CACxB,eAAoD,cAAc;CAClE,SAAS;;CAGT,YAAYC,UAAkB,qBAAqB;AAC/C,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,SAAO,eAAe,MAAM,cAAc,UAAU;CACvD;;;;CAKD,OAAO,gBAAgBC,OAAwC;AAC3D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,cAAc;CAE5E;CAED,eAA0C;AACtC,SAAO;CACV;CAED,aAA8C;AAC1C,SAAO;CACV;AACJ;;;;IC9BY,kBAAN,MAAM,wBAAwB,WAAW;CAC5C,8BAAuC;CACvC,SAAS;CAET,YACIC,SACOC,SACT;AACE,QAAM,QAAQ;AAAA,OAFP,UAAA;AAGP,OAAK,OAAO;AACZ,SAAO,eAAe,MAAM,gBAAgB,UAAU;CACzD;;;;CAKD,OAAO,kBAAkBC,KAAsC;AAC3D,WACO,cACQ,QAAQ,YACd,IAAiD,gCAC9C,mCACA,QAAQ,YACZ,QAAQ,QACR,YAAY,cACJ,IAA4B,WAAW;CAE1D;CAED,eAA0C;AACtC,SAAO;CACV;CAED,aAA8C;AAC1C,SAAO,KAAK;CACf;AACJ;;;;ICpCY,0BAAN,MAAM,gCAAgC,WAAW;CACpD,OAAgB,QAAQ;CACxB,eAA8D,wBAAwB;CACtF,SAAS;CAET,YAAYC,UAAkB,6BAA6B;AACvD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,SAAO,eAAe,MAAM,wBAAwB,UAAU;CACjE;CAED,OAAO,0BAA0BC,OAAkD;AAC/E,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,wBAAwB;CAEtF;CAED,eAA0C;AACtC,SAAO;CACV;CAED,aAA8C;AAC1C,SAAO;CACV;AACJ;;;;IC1BY,gBAAN,MAAM,sBAAsB,WAAW;CAC1C,OAAgB,QAAQ;CACxB,eAAoD,cAAc;CAClE,SAAS;;CAGT,YAAYC,UAAkB,sBAAsB;AAChD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,SAAO,eAAe,MAAM,cAAc,UAAU;CACvD;;;;CAKD,OAAO,gBAAgBC,OAAwC;AAC3D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,cAAc;CAE5E;CAED,eAA0C;AACtC,SAAO;CACV;CAED,aAA8C;AAC1C,SAAO;CACV;AACJ;;;;IC9BY,mBAAN,MAAM,yBAAyB,WAAW;CAC7C,OAAgB,QAAQ;CACxB,eAAuD,iBAAiB;CACxE,SAAS;;CAGT,YAAYC,UAAkB,qBAAqB;AAC/C,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,SAAO,eAAe,MAAM,iBAAiB,UAAU;CAC1D;;;;CAKD,OAAO,mBAAmBC,OAA2C;AACjE,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,iBAAiB;CAE/E;CAED,eAA0C;AACtC,SAAO;CACV;CAED,aAA8C;AAC1C,SAAO;CACV;AACJ;;;;IC9BY,sBAAN,MAAM,4BAA4B,WAAW;CAChD,OAAgB,QAAQ;CACxB,eAA0D,oBAAoB;CAC9E,SAAS;;CAGT,YAAYC,UAAkB,2BAA2B;AACrD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,SAAO,eAAe,MAAM,oBAAoB,UAAU;CAC7D;;;;CAKD,OAAO,sBAAsBC,OAA8C;AACvE,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,oBAAoB;CAElF;CAED,eAA0C;AACtC,SAAO;CACV;CAED,aAA8C;AAC1C,SAAO;CACV;AACJ"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as http from './http/index';
|
|
|
6
6
|
import * as logging from './logging/index';
|
|
7
7
|
import * as runtime from './runtime/index';
|
|
8
8
|
import * as sql from './sql/index';
|
|
9
|
-
import { AuthenticationError, ConflictError, HttpErrorFactory, NotFoundError, PermissionDenied, TangoError, ValidationError, type ErrorDetails, type ErrorEnvelope, type HttpError, type HttpErrorFactoryConfig, type ProblemDetails } from './errors/index';
|
|
9
|
+
import { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, TangoError, ValidationError, type ErrorDetails, type ErrorEnvelope, type HttpError, type HttpErrorFactoryConfig, type ProblemDetails } from './errors/index';
|
|
10
10
|
import { TangoBody, type JsonValue, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse } from './http/index';
|
|
11
11
|
import { ConsoleLogger, getLogger, setLoggerFactory, resetLoggerFactory, type Logger } from './logging/index';
|
|
12
12
|
import { SqlSafetyEngine, isTrustedSqlFragment, quoteSqlIdentifier, trustedSql, validateSqlIdentifier, type SqlDialect, type SqlIdentifierRequest, type SqlIdentifierRole, type SqlLookupTokenRequest, type SqlRawFragmentRequest, type SqlSafetyRequest, type TrustedSqlFragment, type ValidatedSqlIdentifier, type ValidatedSqlLookupToken, type ValidatedSqlSafetyResult } from './sql/index';
|
|
@@ -16,5 +16,5 @@ import { isArrayBuffer, isBlob, isDate, isError, isFile, isFormData, isObject, i
|
|
|
16
16
|
* top-level symbols for TS-native ergonomic imports.
|
|
17
17
|
*/
|
|
18
18
|
export { errors, http, logging, runtime, sql };
|
|
19
|
-
export { AuthenticationError, ConflictError, HttpErrorFactory, NotFoundError, PermissionDenied, TangoBody, TangoError, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse, ValidationError, ConsoleLogger, getLogger, setLoggerFactory, resetLoggerFactory, SqlSafetyEngine, trustedSql, isTrustedSqlFragment, validateSqlIdentifier, quoteSqlIdentifier, isArrayBuffer, isBlob, isDate, isError, isFile, isFormData, isObject, isReadableStream, isUint8Array, isURLSearchParams, };
|
|
19
|
+
export { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, TangoBody, TangoError, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse, ValidationError, ConsoleLogger, getLogger, setLoggerFactory, resetLoggerFactory, SqlSafetyEngine, trustedSql, isTrustedSqlFragment, validateSqlIdentifier, quoteSqlIdentifier, isArrayBuffer, isBlob, isDate, isError, isFile, isFormData, isObject, isReadableStream, isUint8Array, isURLSearchParams, };
|
|
20
20
|
export type { ErrorDetails, ErrorEnvelope, HttpError, HttpErrorFactoryConfig, JsonValue, Logger, ProblemDetails, SqlDialect, SqlIdentifierRequest, SqlIdentifierRole, SqlLookupTokenRequest, SqlRawFragmentRequest, SqlSafetyRequest, TrustedSqlFragment, ValidatedSqlIdentifier, ValidatedSqlLookupToken, ValidatedSqlSafetyResult, };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { TangoError } from "./TangoError-DdQVQNZU.js";
|
|
2
2
|
import { isArrayBuffer, isBlob, isDate, isError, isFile, isFormData, isObject, isReadableStream, isURLSearchParams, isUint8Array, runtime_exports } from "./runtime-B8KkgD3R.js";
|
|
3
|
-
import { AuthenticationError, ConflictError, HttpErrorFactory, NotFoundError, PermissionDenied, ValidationError, errors_exports } from "./errors-
|
|
3
|
+
import { AuthenticationError, ConflictError, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, ValidationError, errors_exports } from "./errors-VacGsSaj.js";
|
|
4
4
|
import { TangoBody, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse, http_exports } from "./http-63cMANMG.js";
|
|
5
5
|
import { ConsoleLogger, getLogger, logging_exports, resetLoggerFactory, setLoggerFactory } from "./logging-BWeD4HOO.js";
|
|
6
6
|
import { SqlSafetyEngine, isTrustedSqlFragment, quoteSqlIdentifier, sql_exports, trustedSql, validateSqlIdentifier } from "./sql-BI3ptL9-.js";
|
|
7
7
|
|
|
8
|
-
export { AuthenticationError, ConflictError, ConsoleLogger, HttpErrorFactory, NotFoundError, PermissionDenied, SqlSafetyEngine, TangoBody, TangoError, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse, ValidationError, errors_exports as errors, getLogger, http_exports as http, isArrayBuffer, isBlob, isDate, isError, isFile, isFormData, isObject, isReadableStream, isTrustedSqlFragment, isURLSearchParams, isUint8Array, logging_exports as logging, quoteSqlIdentifier, resetLoggerFactory, runtime_exports as runtime, setLoggerFactory, sql_exports as sql, trustedSql, validateSqlIdentifier };
|
|
8
|
+
export { AuthenticationError, ConflictError, ConsoleLogger, HttpErrorFactory, MultipleObjectsReturned, NotFoundError, PermissionDenied, SqlSafetyEngine, TangoBody, TangoError, TangoHeaders, TangoQueryParams, TangoRequest, TangoResponse, ValidationError, errors_exports as errors, getLogger, http_exports as http, isArrayBuffer, isBlob, isDate, isError, isFile, isFormData, isObject, isReadableStream, isTrustedSqlFragment, isURLSearchParams, isUint8Array, logging_exports as logging, quoteSqlIdentifier, resetLoggerFactory, runtime_exports as runtime, setLoggerFactory, sql_exports as sql, trustedSql, validateSqlIdentifier };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors-_tWsmNyZ.js","names":["config: HttpErrorFactoryConfig","value: unknown","error: unknown","error: ZodLikeError","details: Record<string, string[]>","errorClass: new (...args: any[]) => T","handler: (error: T) => HttpError","ErrorClass: new (...args: any[]) => Error","message: string","value: unknown","message: string","details?: ErrorDetails","err: unknown","message: string","value: unknown","message: string","value: unknown","message: string","value: unknown"],"sources":["../src/errors/factories/HttpErrorFactory.ts","../src/errors/factories/index.ts","../src/errors/ConflictError.ts","../src/errors/ValidationError.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 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 { 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 NotFoundError,\n PermissionDenied,\n TangoError,\n ValidationError,\n factories,\n};\n\nexport type { ErrorDetails, ErrorEnvelope, HttpError, HttpErrorFactoryConfig, ProblemDetails };\n"],"mappings":"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"}
|