@turystack/exceptions 1.0.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.
- package/README.md +25 -0
- package/dist/error-handling/error-handling.d.ts +53 -0
- package/dist/error-handling/error-handling.d.ts.map +1 -0
- package/dist/error-handling/error-handling.js +91 -0
- package/dist/error-handling/error-handling.js.map +1 -0
- package/dist/error-handling/index.d.ts +2 -0
- package/dist/error-handling/index.d.ts.map +1 -0
- package/dist/error-handling/index.js +2 -0
- package/dist/error-handling/index.js.map +1 -0
- package/dist/exceptions/exceptions.d.ts +3 -0
- package/dist/exceptions/exceptions.d.ts.map +1 -0
- package/dist/exceptions/exceptions.js +54 -0
- package/dist/exceptions/exceptions.js.map +1 -0
- package/dist/exceptions/exceptions.types.d.ts +43 -0
- package/dist/exceptions/exceptions.types.d.ts.map +1 -0
- package/dist/exceptions/exceptions.types.js +2 -0
- package/dist/exceptions/exceptions.types.js.map +1 -0
- package/dist/exceptions/index.d.ts +3 -0
- package/dist/exceptions/index.d.ts.map +1 -0
- package/dist/exceptions/index.js +2 -0
- package/dist/exceptions/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# @turystack/exceptions
|
|
2
|
+
|
|
3
|
+
Type-safe HTTP-semantic application exception classes with stable domain codes and metadata.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @turystack/exceptions
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Documentation
|
|
12
|
+
|
|
13
|
+
Options, API reference and examples:
|
|
14
|
+
|
|
15
|
+
**https://tury.dev/libs/exceptions**
|
|
16
|
+
|
|
17
|
+
## Development
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pnpm install
|
|
21
|
+
pnpm typecheck
|
|
22
|
+
pnpm check
|
|
23
|
+
pnpm test
|
|
24
|
+
pnpm build
|
|
25
|
+
```
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export declare class AppError extends Error {
|
|
2
|
+
readonly statusCode: number;
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly metadata?: Record<string, unknown>;
|
|
5
|
+
constructor(message: string, statusCode: number, code: string, metadata?: Record<string, unknown>);
|
|
6
|
+
}
|
|
7
|
+
export declare class BadRequestError extends AppError {
|
|
8
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
9
|
+
}
|
|
10
|
+
export declare class ValidationError extends AppError {
|
|
11
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
12
|
+
}
|
|
13
|
+
export declare class UnauthorizedError extends AppError {
|
|
14
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
15
|
+
}
|
|
16
|
+
export declare class ForbiddenError extends AppError {
|
|
17
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
18
|
+
}
|
|
19
|
+
export declare class NotFoundError extends AppError {
|
|
20
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
21
|
+
}
|
|
22
|
+
export declare class MethodNotAllowedError extends AppError {
|
|
23
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
24
|
+
}
|
|
25
|
+
export declare class ConflictError extends AppError {
|
|
26
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
27
|
+
}
|
|
28
|
+
export declare class ConcurrentUpdateError extends AppError {
|
|
29
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
30
|
+
}
|
|
31
|
+
export declare class GoneError extends AppError {
|
|
32
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
33
|
+
}
|
|
34
|
+
export declare class UnprocessableEntityError extends AppError {
|
|
35
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
36
|
+
}
|
|
37
|
+
export declare class TooManyRequestsError extends AppError {
|
|
38
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
39
|
+
}
|
|
40
|
+
export declare class InternalServerError extends AppError {
|
|
41
|
+
constructor(message?: string, metadata?: Record<string, unknown>);
|
|
42
|
+
}
|
|
43
|
+
export declare class BadGatewayError extends AppError {
|
|
44
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
45
|
+
}
|
|
46
|
+
export declare class ServiceUnavailableError extends AppError {
|
|
47
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
48
|
+
}
|
|
49
|
+
export declare class GatewayTimeoutError extends AppError {
|
|
50
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
51
|
+
}
|
|
52
|
+
export declare function isAppError(error: unknown): error is AppError;
|
|
53
|
+
//# sourceMappingURL=error-handling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handling.d.ts","sourceRoot":"","sources":["../../src/error-handling/error-handling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export class AppError extends Error {
|
|
2
|
+
statusCode;
|
|
3
|
+
code;
|
|
4
|
+
metadata;
|
|
5
|
+
constructor(message, statusCode, code, metadata) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.statusCode = statusCode;
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.metadata = metadata;
|
|
10
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class BadRequestError extends AppError {
|
|
14
|
+
constructor(message, metadata) {
|
|
15
|
+
super(message, 400, 'BAD_REQUEST', metadata);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class ValidationError extends AppError {
|
|
19
|
+
constructor(message, metadata) {
|
|
20
|
+
super(message, 400, 'VALIDATION_ERROR', metadata);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class UnauthorizedError extends AppError {
|
|
24
|
+
constructor(message, metadata) {
|
|
25
|
+
super(message, 401, 'UNAUTHORIZED', metadata);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class ForbiddenError extends AppError {
|
|
29
|
+
constructor(message, metadata) {
|
|
30
|
+
super(message, 403, 'FORBIDDEN', metadata);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class NotFoundError extends AppError {
|
|
34
|
+
constructor(message, metadata) {
|
|
35
|
+
super(message, 404, 'NOT_FOUND', metadata);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class MethodNotAllowedError extends AppError {
|
|
39
|
+
constructor(message, metadata) {
|
|
40
|
+
super(message, 405, 'METHOD_NOT_ALLOWED', metadata);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class ConflictError extends AppError {
|
|
44
|
+
constructor(message, metadata) {
|
|
45
|
+
super(message, 409, 'CONFLICT', metadata);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class ConcurrentUpdateError extends AppError {
|
|
49
|
+
constructor(message, metadata) {
|
|
50
|
+
super(message, 409, 'CONCURRENT_UPDATE', metadata);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export class GoneError extends AppError {
|
|
54
|
+
constructor(message, metadata) {
|
|
55
|
+
super(message, 410, 'GONE', metadata);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class UnprocessableEntityError extends AppError {
|
|
59
|
+
constructor(message, metadata) {
|
|
60
|
+
super(message, 422, 'UNPROCESSABLE_ENTITY', metadata);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class TooManyRequestsError extends AppError {
|
|
64
|
+
constructor(message, metadata) {
|
|
65
|
+
super(message, 429, 'TOO_MANY_REQUESTS', metadata);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class InternalServerError extends AppError {
|
|
69
|
+
constructor(message = 'Internal server error', metadata) {
|
|
70
|
+
super(message, 500, 'INTERNAL_SERVER_ERROR', metadata);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class BadGatewayError extends AppError {
|
|
74
|
+
constructor(message, metadata) {
|
|
75
|
+
super(message, 502, 'BAD_GATEWAY', metadata);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export class ServiceUnavailableError extends AppError {
|
|
79
|
+
constructor(message, metadata) {
|
|
80
|
+
super(message, 503, 'SERVICE_UNAVAILABLE', metadata);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export class GatewayTimeoutError extends AppError {
|
|
84
|
+
constructor(message, metadata) {
|
|
85
|
+
super(message, 504, 'GATEWAY_TIMEOUT', metadata);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function isAppError(error) {
|
|
89
|
+
return error instanceof AppError;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=error-handling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handling.js","sourceRoot":"","sources":["../../src/error-handling/error-handling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/error-handling/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/error-handling/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../../src/exceptions/exceptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAIhB,MAAM,uBAAuB,CAAA;AAkG9B,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,CAAC,GAAG,CAAC,CAwB1E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { BadGatewayError, BadRequestError, ConflictError, ForbiddenError, GatewayTimeoutError, GoneError, InternalServerError, MethodNotAllowedError, NotFoundError, ServiceUnavailableError, TooManyRequestsError, UnauthorizedError, UnprocessableEntityError, } from '../error-handling/index.js';
|
|
2
|
+
function makeExceptionClass(code, Base) {
|
|
3
|
+
const Exception = class extends Base {
|
|
4
|
+
static code = code;
|
|
5
|
+
constructor(metadata) {
|
|
6
|
+
super(code, metadata);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(Exception, Symbol.toPrimitive, {
|
|
10
|
+
value: () => code,
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(Exception, 'toString', {
|
|
13
|
+
value: () => code,
|
|
14
|
+
});
|
|
15
|
+
return Exception;
|
|
16
|
+
}
|
|
17
|
+
function snakeToCamel(input) {
|
|
18
|
+
return input.replace(/_([a-z0-9])/g, (_, character) => character.toUpperCase());
|
|
19
|
+
}
|
|
20
|
+
const groupBaseByName = {
|
|
21
|
+
badGateway: BadGatewayError,
|
|
22
|
+
badRequest: BadRequestError,
|
|
23
|
+
conflict: ConflictError,
|
|
24
|
+
forbidden: ForbiddenError,
|
|
25
|
+
gatewayTimeout: GatewayTimeoutError,
|
|
26
|
+
gone: GoneError,
|
|
27
|
+
internalServerError: InternalServerError,
|
|
28
|
+
methodNotAllowed: MethodNotAllowedError,
|
|
29
|
+
notFound: NotFoundError,
|
|
30
|
+
serviceUnavailable: ServiceUnavailableError,
|
|
31
|
+
tooManyRequests: TooManyRequestsError,
|
|
32
|
+
unauthorized: UnauthorizedError,
|
|
33
|
+
unprocessableEntity: UnprocessableEntityError,
|
|
34
|
+
};
|
|
35
|
+
function addExceptionCode(exceptions, prefix, code, Base) {
|
|
36
|
+
exceptions[snakeToCamel(code)] = makeExceptionClass(`${prefix}.${code}`, Base);
|
|
37
|
+
}
|
|
38
|
+
export function createExceptions(factory) {
|
|
39
|
+
const builder = {
|
|
40
|
+
module(prefix, groups) {
|
|
41
|
+
const exceptions = {
|
|
42
|
+
notFound: makeExceptionClass(`${prefix}.not_found`, NotFoundError),
|
|
43
|
+
};
|
|
44
|
+
for (const [groupName, codes] of Object.entries(groups)) {
|
|
45
|
+
for (const code of codes ?? []) {
|
|
46
|
+
addExceptionCode(exceptions, prefix, code, groupBaseByName[groupName]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return exceptions;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
return factory(builder);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=exceptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../src/exceptions/exceptions.ts"],"names":[],"mappings":"AAOA,OAAO,EAEN,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,GACxB,MAAM,2BAA2B,CAAA;AAOlC,SAAS,kBAAkB,CAC1B,IAAO,EACP,IAAmB;IAEnB,MAAM,SAAS,GAAG,KAAM,SAAQ,IAAI;QACnC,MAAM,CAAU,IAAI,GAAG,IAAI,CAAA;QAE3B,YAAY,QAAkC;YAC7C,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QACtB,CAAC;KACD,CAAA;IAED,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE;QACpD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;KACjB,CAAC,CAAA;IACF,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE;QAC5C,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;KACjB,CAAC,CAAA;IAEF,OAAO,SAAyC,CAAA;AACjD,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,SAAiB,EAAE,EAAE,CAC7D,SAAS,CAAC,WAAW,EAAE,CACvB,CAAA;AACF,CAAC;AAED,MAAM,eAAe,GAAG;IACvB,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,aAAa;IACvB,SAAS,EAAE,cAAc;IACzB,cAAc,EAAE,mBAAmB;IACnC,IAAI,EAAE,SAAS;IACf,mBAAmB,EAAE,mBAAmB;IACxC,gBAAgB,EAAE,qBAAqB;IACvC,QAAQ,EAAE,aAAa;IACvB,kBAAkB,EAAE,uBAAuB;IAC3C,eAAe,EAAE,oBAAoB;IACrC,YAAY,EAAE,iBAAiB;IAC/B,mBAAmB,EAAE,wBAAwB;CACS,CAAA;AAEvD,SAAS,gBAAgB,CACxB,UAA0C,EAC1C,MAAc,EACd,IAAY,EACZ,IAAmB;IAEnB,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,kBAAkB,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAA;AAC/E,CAAC;AAuBD,MAAM,UAAU,gBAAgB,CAAI,OAAmC;IACtE,MAAM,OAAO,GAAqB;QACjC,MAAM,CACL,MAAS,EACT,MAAS;YAET,MAAM,UAAU,GAAmC;gBAClD,QAAQ,EAAE,kBAAkB,CAAC,GAAG,MAAM,YAAY,EAAE,aAAa,CAAC;aAClE,CAAA;YAED,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAGnD,EAAE,CAAC;gBACL,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;oBAChC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAA;gBACvE,CAAC;YACF,CAAC;YAED,OAAO,UAA0C,CAAA;QAClD,CAAC;KACD,CAAA;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { AppError } from '../error-handling/index.js';
|
|
2
|
+
export type ExceptionGroup = {
|
|
3
|
+
badRequest?: readonly string[];
|
|
4
|
+
notFound?: readonly string[];
|
|
5
|
+
unauthorized?: readonly string[];
|
|
6
|
+
forbidden?: readonly string[];
|
|
7
|
+
methodNotAllowed?: readonly string[];
|
|
8
|
+
conflict?: readonly string[];
|
|
9
|
+
gone?: readonly string[];
|
|
10
|
+
unprocessableEntity?: readonly string[];
|
|
11
|
+
tooManyRequests?: readonly string[];
|
|
12
|
+
internalServerError?: readonly string[];
|
|
13
|
+
badGateway?: readonly string[];
|
|
14
|
+
serviceUnavailable?: readonly string[];
|
|
15
|
+
gatewayTimeout?: readonly string[];
|
|
16
|
+
};
|
|
17
|
+
type GroupCodeUnion<T extends ExceptionGroup> = {
|
|
18
|
+
[K in keyof T]: T[K] extends readonly (infer Code)[] ? Code : never;
|
|
19
|
+
}[keyof T] & string;
|
|
20
|
+
export type ExceptionClass<C extends string = string> = (new (metadata?: Record<string, unknown>) => AppError) & {
|
|
21
|
+
readonly code: C;
|
|
22
|
+
};
|
|
23
|
+
type CamelCaseKey<S extends string> = S extends `${infer Head}_${infer Tail}` ? `${Head}${Capitalize<CamelCaseKey<Tail>>}` : S;
|
|
24
|
+
export type NotFoundMetadata = Record<string, unknown>;
|
|
25
|
+
export type NotFoundExceptionClass<P extends string> = (new (metadata: NotFoundMetadata) => AppError) & {
|
|
26
|
+
readonly code: `${P}.not_found`;
|
|
27
|
+
};
|
|
28
|
+
export type ExceptionGroupedModule<P extends string, T extends ExceptionGroup> = {
|
|
29
|
+
notFound: NotFoundExceptionClass<P>;
|
|
30
|
+
} & {
|
|
31
|
+
[K in GroupCodeUnion<T> as CamelCaseKey<K>]: ExceptionClass<`${P}.${K}`>;
|
|
32
|
+
};
|
|
33
|
+
export type ExceptionBuilder = {
|
|
34
|
+
module<P extends string, const T extends ExceptionGroup>(prefix: P, groups: T): ExceptionGroupedModule<P, T>;
|
|
35
|
+
};
|
|
36
|
+
export type InferCreateExceptions<T> = {
|
|
37
|
+
[K in keyof T]: T[K] extends ExceptionClass<infer C> ? C : T[K] extends NotFoundExceptionClass<infer P> ? `${P}.not_found` : never;
|
|
38
|
+
}[keyof T];
|
|
39
|
+
export type InferExceptionCodes<T> = {
|
|
40
|
+
[M in keyof T]: InferCreateExceptions<T[M]>;
|
|
41
|
+
}[keyof T];
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=exceptions.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.types.d.ts","sourceRoot":"","sources":["../../src/exceptions/exceptions.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAGzD,MAAM,MAAM,cAAc,GAAG;IAC5B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5B,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAChC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7B,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC,CAAA;AAED,KAAK,cAAc,CAAC,CAAC,SAAS,cAAc,IAAI;KAC9C,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,KAAK;CACnE,CAAC,MAAM,CAAC,CAAC,GACT,MAAM,CAAA;AAGP,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,CAAC,KACxD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,QAAQ,CAAC,GAAG;IAChB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;CAChB,CAAA;AAED,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GAC1E,GAAG,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,GAC1C,CAAC,CAAA;AAEJ,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAGtD,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,KACvD,QAAQ,EAAE,gBAAgB,KACtB,QAAQ,CAAC,GAAG;IAChB,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAA;CAC/B,CAAA;AAGD,MAAM,MAAM,sBAAsB,CACjC,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,cAAc,IACrB;IACH,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAA;CACnC,GAAG;KACF,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;CACxE,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,CAAC,CAAC,SAAS,cAAc,EACtD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,CAAC,GACP,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAC/B,CAAA;AAGD,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;KACrC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,CAAC,GACjD,CAAC,GACD,CAAC,CAAC,CAAC,CAAC,SAAS,sBAAsB,CAAC,MAAM,CAAC,CAAC,GAC3C,GAAG,CAAC,YAAY,GAChB,KAAK;CACT,CAAC,MAAM,CAAC,CAAC,CAAA;AAaV,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;KACnC,CAAC,IAAI,MAAM,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3C,CAAC,MAAM,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.types.js","sourceRoot":"","sources":["../../src/exceptions/exceptions.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/exceptions/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,mBAAmB,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exceptions/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@turystack/exceptions",
|
|
3
|
+
"description": "Type-safe HTTP-semantic application exception classes with stable domain codes and metadata.",
|
|
4
|
+
"private": false,
|
|
5
|
+
"version": "1.0.2",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/turystack/exceptions.git"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@biomejs/biome": "2.5.4",
|
|
33
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
34
|
+
"tsc-alias": "^1.9.1",
|
|
35
|
+
"typescript": "^7.0.2",
|
|
36
|
+
"vite": "^8.1.5",
|
|
37
|
+
"vitest": "^4.1.10"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"test:cov": "vitest run --coverage",
|
|
44
|
+
"lint": "biome lint ./src",
|
|
45
|
+
"format": "biome format --write ./src",
|
|
46
|
+
"check": "biome check ./src",
|
|
47
|
+
"check:fix": "biome check --write ./src"
|
|
48
|
+
}
|
|
49
|
+
}
|