@classytic/arc 1.1.0 → 2.1.3
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 +247 -794
- package/bin/arc.js +91 -52
- package/dist/EventTransport-BkUDYZEb.d.mts +99 -0
- package/dist/HookSystem-BsGV-j2l.mjs +404 -0
- package/dist/ResourceRegistry-7Ic20ZMw.mjs +249 -0
- package/dist/adapters/index.d.mts +5 -0
- package/dist/adapters/index.mjs +3 -0
- package/dist/audit/index.d.mts +81 -0
- package/dist/audit/index.mjs +275 -0
- package/dist/audit/mongodb.d.mts +5 -0
- package/dist/audit/mongodb.mjs +3 -0
- package/dist/audited-CGdLiSlE.mjs +140 -0
- package/dist/auth/index.d.mts +188 -0
- package/dist/auth/index.mjs +1096 -0
- package/dist/auth/redis-session.d.mts +43 -0
- package/dist/auth/redis-session.mjs +75 -0
- package/dist/betterAuthOpenApi-DjWDddNc.mjs +249 -0
- package/dist/cache/index.d.mts +145 -0
- package/dist/cache/index.mjs +91 -0
- package/dist/caching-GSDJcA6-.mjs +93 -0
- package/dist/chunk-C7Uep-_p.mjs +20 -0
- package/dist/circuitBreaker-DYhWBW_D.mjs +1096 -0
- package/dist/cli/commands/describe.d.mts +18 -0
- package/dist/cli/commands/describe.mjs +238 -0
- package/dist/cli/commands/docs.d.mts +13 -0
- package/dist/cli/commands/docs.mjs +52 -0
- package/dist/cli/commands/{generate.d.ts → generate.d.mts} +3 -2
- package/dist/cli/commands/generate.mjs +357 -0
- package/dist/cli/commands/{init.d.ts → init.d.mts} +11 -8
- package/dist/cli/commands/{init.js → init.mjs} +807 -617
- package/dist/cli/commands/introspect.d.mts +10 -0
- package/dist/cli/commands/introspect.mjs +75 -0
- package/dist/cli/index.d.mts +16 -0
- package/dist/cli/index.mjs +156 -0
- package/dist/constants-DdXFXQtN.mjs +84 -0
- package/dist/core/index.d.mts +5 -0
- package/dist/core/index.mjs +4 -0
- package/dist/createApp-D2D5XXaV.mjs +559 -0
- package/dist/defineResource-PXzSJ15_.mjs +2197 -0
- package/dist/discovery/index.d.mts +46 -0
- package/dist/discovery/index.mjs +109 -0
- package/dist/docs/index.d.mts +162 -0
- package/dist/docs/index.mjs +74 -0
- package/dist/elevation-DGo5shaX.d.mts +87 -0
- package/dist/elevation-DSTbVvYj.mjs +113 -0
- package/dist/errorHandler-C3GY3_ow.mjs +108 -0
- package/dist/errorHandler-CW3OOeYq.d.mts +72 -0
- package/dist/errors-DAWRdiYP.d.mts +124 -0
- package/dist/errors-DBANPbGr.mjs +211 -0
- package/dist/eventPlugin-BEOvaDqo.mjs +229 -0
- package/dist/eventPlugin-H6wDDjGO.d.mts +124 -0
- package/dist/events/index.d.mts +53 -0
- package/dist/events/index.mjs +51 -0
- package/dist/events/transports/redis-stream-entry.d.mts +2 -0
- package/dist/events/transports/redis-stream-entry.mjs +177 -0
- package/dist/events/transports/redis.d.mts +76 -0
- package/dist/events/transports/redis.mjs +124 -0
- package/dist/externalPaths-SyPF2tgK.d.mts +50 -0
- package/dist/factory/index.d.mts +63 -0
- package/dist/factory/index.mjs +3 -0
- package/dist/fastifyAdapter-C8DlE0YH.d.mts +216 -0
- package/dist/fields-Bi_AVKSo.d.mts +109 -0
- package/dist/fields-CTd_CrKr.mjs +114 -0
- package/dist/hooks/index.d.mts +4 -0
- package/dist/hooks/index.mjs +3 -0
- package/dist/idempotency/index.d.mts +96 -0
- package/dist/idempotency/index.mjs +319 -0
- package/dist/idempotency/mongodb.d.mts +2 -0
- package/dist/idempotency/mongodb.mjs +114 -0
- package/dist/idempotency/redis.d.mts +2 -0
- package/dist/idempotency/redis.mjs +103 -0
- package/dist/index.d.mts +260 -0
- package/dist/index.mjs +104 -0
- package/dist/integrations/event-gateway.d.mts +46 -0
- package/dist/integrations/event-gateway.mjs +43 -0
- package/dist/integrations/index.d.mts +5 -0
- package/dist/integrations/index.mjs +1 -0
- package/dist/integrations/jobs.d.mts +103 -0
- package/dist/integrations/jobs.mjs +123 -0
- package/dist/integrations/streamline.d.mts +60 -0
- package/dist/integrations/streamline.mjs +125 -0
- package/dist/integrations/websocket.d.mts +82 -0
- package/dist/integrations/websocket.mjs +288 -0
- package/dist/interface-CSNjltAc.d.mts +77 -0
- package/dist/interface-DTbsvIWe.d.mts +54 -0
- package/dist/interface-e9XfSsUV.d.mts +1097 -0
- package/dist/introspectionPlugin-B3JkrjwU.mjs +53 -0
- package/dist/keys-DhqDRxv3.mjs +42 -0
- package/dist/logger-ByrvQWZO.mjs +78 -0
- package/dist/memory-B2v7KrCB.mjs +143 -0
- package/dist/migrations/index.d.mts +156 -0
- package/dist/migrations/index.mjs +260 -0
- package/dist/mongodb-ClykrfGo.d.mts +118 -0
- package/dist/mongodb-DNKEExbf.mjs +93 -0
- package/dist/mongodb-Dg8O_gvd.d.mts +71 -0
- package/dist/openapi-9nB_kiuR.mjs +525 -0
- package/dist/org/index.d.mts +68 -0
- package/dist/org/index.mjs +513 -0
- package/dist/org/types.d.mts +82 -0
- package/dist/org/types.mjs +1 -0
- package/dist/permissions/index.d.mts +278 -0
- package/dist/permissions/index.mjs +579 -0
- package/dist/plugins/index.d.mts +172 -0
- package/dist/plugins/index.mjs +522 -0
- package/dist/plugins/response-cache.d.mts +87 -0
- package/dist/plugins/response-cache.mjs +283 -0
- package/dist/plugins/tracing-entry.d.mts +2 -0
- package/dist/plugins/tracing-entry.mjs +185 -0
- package/dist/pluralize-CM-jZg7p.mjs +86 -0
- package/dist/policies/{index.d.ts → index.d.mts} +204 -170
- package/dist/policies/index.mjs +321 -0
- package/dist/presets/{index.d.ts → index.d.mts} +62 -131
- package/dist/presets/index.mjs +143 -0
- package/dist/presets/multiTenant.d.mts +24 -0
- package/dist/presets/multiTenant.mjs +113 -0
- package/dist/presets-BTeYbw7h.d.mts +57 -0
- package/dist/presets-CeFtfDR8.mjs +119 -0
- package/dist/prisma-C3iornoK.d.mts +274 -0
- package/dist/prisma-DJbMt3yf.mjs +627 -0
- package/dist/queryCachePlugin-B6R0d4av.mjs +138 -0
- package/dist/queryCachePlugin-Q6SYuHZ6.d.mts +71 -0
- package/dist/redis-UwjEp8Ea.d.mts +49 -0
- package/dist/redis-stream-CBg0upHI.d.mts +103 -0
- package/dist/registry/index.d.mts +11 -0
- package/dist/registry/index.mjs +4 -0
- package/dist/requestContext-xi6OKBL-.mjs +55 -0
- package/dist/schemaConverter-Dtg0Kt9T.mjs +98 -0
- package/dist/schemas/index.d.mts +63 -0
- package/dist/schemas/index.mjs +82 -0
- package/dist/scope/index.d.mts +21 -0
- package/dist/scope/index.mjs +65 -0
- package/dist/sessionManager-D_iEHjQl.d.mts +186 -0
- package/dist/sse-DkqQ1uxb.mjs +123 -0
- package/dist/testing/index.d.mts +907 -0
- package/dist/testing/index.mjs +1976 -0
- package/dist/tracing-8CEbhF0w.d.mts +70 -0
- package/dist/typeGuards-DwxA1t_L.mjs +9 -0
- package/dist/types/index.d.mts +946 -0
- package/dist/types/index.mjs +14 -0
- package/dist/types-B0dhNrnd.d.mts +445 -0
- package/dist/types-Beqn1Un7.mjs +38 -0
- package/dist/types-DelU6kln.mjs +25 -0
- package/dist/types-RLkFVgaw.d.mts +101 -0
- package/dist/utils/index.d.mts +747 -0
- package/dist/utils/index.mjs +6 -0
- package/package.json +194 -68
- package/dist/BaseController-DVAiHxEQ.d.ts +0 -233
- package/dist/adapters/index.d.ts +0 -237
- package/dist/adapters/index.js +0 -668
- package/dist/arcCorePlugin-CsShQdyP.d.ts +0 -273
- package/dist/audit/index.d.ts +0 -195
- package/dist/audit/index.js +0 -319
- package/dist/auth/index.d.ts +0 -47
- package/dist/auth/index.js +0 -174
- package/dist/cli/commands/docs.d.ts +0 -11
- package/dist/cli/commands/docs.js +0 -474
- package/dist/cli/commands/generate.js +0 -334
- package/dist/cli/commands/introspect.d.ts +0 -8
- package/dist/cli/commands/introspect.js +0 -338
- package/dist/cli/index.d.ts +0 -4
- package/dist/cli/index.js +0 -3269
- package/dist/core/index.d.ts +0 -220
- package/dist/core/index.js +0 -2786
- package/dist/createApp-Ce9wl8W9.d.ts +0 -77
- package/dist/docs/index.d.ts +0 -166
- package/dist/docs/index.js +0 -658
- package/dist/errors-8WIxGS_6.d.ts +0 -122
- package/dist/events/index.d.ts +0 -117
- package/dist/events/index.js +0 -89
- package/dist/factory/index.d.ts +0 -38
- package/dist/factory/index.js +0 -1652
- package/dist/hooks/index.d.ts +0 -4
- package/dist/hooks/index.js +0 -199
- package/dist/idempotency/index.d.ts +0 -323
- package/dist/idempotency/index.js +0 -500
- package/dist/index-B4t03KQ0.d.ts +0 -1366
- package/dist/index.d.ts +0 -135
- package/dist/index.js +0 -4756
- package/dist/migrations/index.d.ts +0 -185
- package/dist/migrations/index.js +0 -274
- package/dist/org/index.d.ts +0 -129
- package/dist/org/index.js +0 -220
- package/dist/permissions/index.d.ts +0 -144
- package/dist/permissions/index.js +0 -103
- package/dist/plugins/index.d.ts +0 -46
- package/dist/plugins/index.js +0 -1069
- package/dist/policies/index.js +0 -196
- package/dist/presets/index.js +0 -384
- package/dist/presets/multiTenant.d.ts +0 -39
- package/dist/presets/multiTenant.js +0 -112
- package/dist/registry/index.d.ts +0 -16
- package/dist/registry/index.js +0 -253
- package/dist/testing/index.d.ts +0 -618
- package/dist/testing/index.js +0 -48020
- package/dist/types/index.d.ts +0 -4
- package/dist/types/index.js +0 -8
- package/dist/types-B99TBmFV.d.ts +0 -76
- package/dist/types-BvckRbs2.d.ts +0 -143
- package/dist/utils/index.d.ts +0 -679
- package/dist/utils/index.js +0 -931
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-C7Uep-_p.mjs";
|
|
2
|
+
import { f as isArcError } from "./errors-DBANPbGr.mjs";
|
|
3
|
+
import fp from "fastify-plugin";
|
|
4
|
+
|
|
5
|
+
//#region src/plugins/errorHandler.ts
|
|
6
|
+
var errorHandler_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
default: () => errorHandlerPlugin,
|
|
8
|
+
errorHandlerPlugin: () => errorHandlerPlugin
|
|
9
|
+
});
|
|
10
|
+
async function errorHandlerPluginFn(fastify, options = {}) {
|
|
11
|
+
const isProduction = process.env.NODE_ENV === "production";
|
|
12
|
+
const { includeStack = !isProduction, onError, errorMap = {} } = options;
|
|
13
|
+
fastify.setErrorHandler(async (error, request, reply) => {
|
|
14
|
+
if (onError) try {
|
|
15
|
+
await onError(error, request);
|
|
16
|
+
} catch (callbackError) {
|
|
17
|
+
request.log.error({ err: callbackError }, "Error in onError callback");
|
|
18
|
+
}
|
|
19
|
+
const requestId = request.id;
|
|
20
|
+
const response = {
|
|
21
|
+
success: false,
|
|
22
|
+
error: error.message || "Internal Server Error",
|
|
23
|
+
code: "INTERNAL_ERROR",
|
|
24
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
25
|
+
...requestId && { requestId }
|
|
26
|
+
};
|
|
27
|
+
let statusCode = 500;
|
|
28
|
+
if (isArcError(error)) {
|
|
29
|
+
statusCode = error.statusCode;
|
|
30
|
+
response.code = error.code;
|
|
31
|
+
if (error.details) response.details = error.details;
|
|
32
|
+
if (error.requestId) response.requestId = error.requestId;
|
|
33
|
+
if (error.cause) request.log.error({ cause: error.cause }, "Error cause chain");
|
|
34
|
+
} else if ("validation" in error && Array.isArray(error.validation)) {
|
|
35
|
+
statusCode = 400;
|
|
36
|
+
response.code = "VALIDATION_ERROR";
|
|
37
|
+
response.error = "Validation failed";
|
|
38
|
+
response.details = { errors: error.validation?.map((v) => ({
|
|
39
|
+
field: v.instancePath?.replace(/^\//, "") || v.params?.missingProperty || "unknown",
|
|
40
|
+
message: v.message || "Invalid value",
|
|
41
|
+
keyword: v.keyword
|
|
42
|
+
})) };
|
|
43
|
+
} else if ("statusCode" in error && typeof error.statusCode === "number") {
|
|
44
|
+
statusCode = error.statusCode;
|
|
45
|
+
response.code = statusCodeToCode(statusCode);
|
|
46
|
+
} else if (error.name && errorMap[error.name]) {
|
|
47
|
+
const mapping = errorMap[error.name];
|
|
48
|
+
statusCode = mapping.statusCode;
|
|
49
|
+
response.code = mapping.code;
|
|
50
|
+
if (mapping.message) response.error = mapping.message;
|
|
51
|
+
} else if (error.name === "ValidationError" && "errors" in error) {
|
|
52
|
+
statusCode = 400;
|
|
53
|
+
response.code = "VALIDATION_ERROR";
|
|
54
|
+
const mongooseErrors = error.errors;
|
|
55
|
+
if (includeStack) response.details = { errors: Object.entries(mongooseErrors).map(([field, err]) => ({
|
|
56
|
+
field: err.path || field,
|
|
57
|
+
message: err.message
|
|
58
|
+
})) };
|
|
59
|
+
else response.details = { errorCount: Object.keys(mongooseErrors).length };
|
|
60
|
+
} else if (error.name === "CastError") {
|
|
61
|
+
statusCode = 400;
|
|
62
|
+
response.code = "INVALID_ID";
|
|
63
|
+
response.error = "Invalid identifier format";
|
|
64
|
+
} else if (error.name === "MongoServerError" && error.code === 11e3) {
|
|
65
|
+
statusCode = 409;
|
|
66
|
+
response.code = "DUPLICATE_KEY";
|
|
67
|
+
response.error = "Resource already exists";
|
|
68
|
+
const keyValue = error.keyValue;
|
|
69
|
+
if (keyValue && includeStack) response.details = { duplicateFields: Object.keys(keyValue) };
|
|
70
|
+
}
|
|
71
|
+
if (includeStack && error.stack) response.stack = error.stack;
|
|
72
|
+
if (statusCode >= 500) request.log.error({
|
|
73
|
+
err: error,
|
|
74
|
+
statusCode
|
|
75
|
+
}, "Server error");
|
|
76
|
+
else if (statusCode >= 400) request.log.warn({
|
|
77
|
+
err: error,
|
|
78
|
+
statusCode
|
|
79
|
+
}, "Client error");
|
|
80
|
+
return reply.status(statusCode).send(response);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Map HTTP status code to error code
|
|
85
|
+
*/
|
|
86
|
+
function statusCodeToCode(statusCode) {
|
|
87
|
+
return {
|
|
88
|
+
400: "BAD_REQUEST",
|
|
89
|
+
401: "UNAUTHORIZED",
|
|
90
|
+
403: "FORBIDDEN",
|
|
91
|
+
404: "NOT_FOUND",
|
|
92
|
+
405: "METHOD_NOT_ALLOWED",
|
|
93
|
+
409: "CONFLICT",
|
|
94
|
+
422: "UNPROCESSABLE_ENTITY",
|
|
95
|
+
429: "RATE_LIMITED",
|
|
96
|
+
500: "INTERNAL_ERROR",
|
|
97
|
+
502: "BAD_GATEWAY",
|
|
98
|
+
503: "SERVICE_UNAVAILABLE",
|
|
99
|
+
504: "GATEWAY_TIMEOUT"
|
|
100
|
+
}[statusCode] ?? "ERROR";
|
|
101
|
+
}
|
|
102
|
+
const errorHandlerPlugin = fp(errorHandlerPluginFn, {
|
|
103
|
+
name: "arc-error-handler",
|
|
104
|
+
fastify: "5.x"
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
//#endregion
|
|
108
|
+
export { errorHandler_exports as n, errorHandlerPlugin as t };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { t as DomainEvent } from "./EventTransport-BkUDYZEb.mjs";
|
|
2
|
+
import { FastifyInstance, FastifyPluginAsync, FastifyRequest } from "fastify";
|
|
3
|
+
|
|
4
|
+
//#region src/plugins/caching.d.ts
|
|
5
|
+
interface CachingRule {
|
|
6
|
+
/** Path prefix to match (e.g., '/api/products') */
|
|
7
|
+
match: string;
|
|
8
|
+
/** Cache-Control max-age in seconds */
|
|
9
|
+
maxAge: number;
|
|
10
|
+
/** Cache-Control: private vs public (default: public) */
|
|
11
|
+
private?: boolean;
|
|
12
|
+
/** stale-while-revalidate directive in seconds */
|
|
13
|
+
staleWhileRevalidate?: number;
|
|
14
|
+
}
|
|
15
|
+
interface CachingOptions {
|
|
16
|
+
/** Default max-age in seconds for Cache-Control (default: 0 = no-cache) */
|
|
17
|
+
maxAge?: number;
|
|
18
|
+
/** Enable ETag generation (default: true) */
|
|
19
|
+
etag?: boolean;
|
|
20
|
+
/** Enable conditional requests — 304 Not Modified (default: true) */
|
|
21
|
+
conditional?: boolean;
|
|
22
|
+
/** HTTP methods to cache (default: ['GET', 'HEAD']) */
|
|
23
|
+
methods?: string[];
|
|
24
|
+
/** Paths to exclude from caching (prefix match) */
|
|
25
|
+
exclude?: string[];
|
|
26
|
+
/** Custom cache rules per path prefix */
|
|
27
|
+
rules?: CachingRule[];
|
|
28
|
+
}
|
|
29
|
+
declare const cachingPlugin: FastifyPluginAsync<CachingOptions>;
|
|
30
|
+
declare const _default$1: FastifyPluginAsync<CachingOptions>;
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/plugins/sse.d.ts
|
|
33
|
+
interface SSEOptions {
|
|
34
|
+
/** SSE endpoint path (default: '/events/stream') */
|
|
35
|
+
path?: string;
|
|
36
|
+
/** Require authentication (default: true) */
|
|
37
|
+
requireAuth?: boolean;
|
|
38
|
+
/** Event patterns to stream (default: ['*'] = all) */
|
|
39
|
+
patterns?: string[];
|
|
40
|
+
/** Heartbeat interval in ms (default: 30000) */
|
|
41
|
+
heartbeat?: number;
|
|
42
|
+
/** Filter events by organizationId from request.scope (default: false) */
|
|
43
|
+
orgScoped?: boolean;
|
|
44
|
+
/** Custom event filter function */
|
|
45
|
+
filter?: (event: DomainEvent<unknown>, request: FastifyRequest) => boolean;
|
|
46
|
+
}
|
|
47
|
+
declare const ssePlugin: FastifyPluginAsync<SSEOptions>;
|
|
48
|
+
declare const _default: FastifyPluginAsync<SSEOptions>;
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/plugins/errorHandler.d.ts
|
|
51
|
+
interface ErrorHandlerOptions {
|
|
52
|
+
/**
|
|
53
|
+
* Include stack trace in error responses (default: false in production)
|
|
54
|
+
*/
|
|
55
|
+
includeStack?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Custom error callback for logging to external services
|
|
58
|
+
*/
|
|
59
|
+
onError?: (error: Error, request: FastifyRequest) => void | Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Map specific error types to custom responses
|
|
62
|
+
*/
|
|
63
|
+
errorMap?: Record<string, {
|
|
64
|
+
statusCode: number;
|
|
65
|
+
code: string;
|
|
66
|
+
message?: string;
|
|
67
|
+
}>;
|
|
68
|
+
}
|
|
69
|
+
declare function errorHandlerPluginFn(fastify: FastifyInstance, options?: ErrorHandlerOptions): Promise<void>;
|
|
70
|
+
declare const errorHandlerPlugin: typeof errorHandlerPluginFn;
|
|
71
|
+
//#endregion
|
|
72
|
+
export { ssePlugin as a, _default$1 as c, _default as i, cachingPlugin as l, errorHandlerPlugin as n, CachingOptions as o, SSEOptions as r, CachingRule as s, ErrorHandlerOptions as t };
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//#region src/utils/errors.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Error Classes
|
|
4
|
+
*
|
|
5
|
+
* Standard error types for the Arc framework.
|
|
6
|
+
*/
|
|
7
|
+
interface ErrorDetails {
|
|
8
|
+
code?: string;
|
|
9
|
+
statusCode?: number;
|
|
10
|
+
details?: Record<string, unknown>;
|
|
11
|
+
cause?: Error;
|
|
12
|
+
requestId?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Base Arc Error
|
|
16
|
+
*
|
|
17
|
+
* All Arc errors extend this class and produce a consistent error envelope:
|
|
18
|
+
* {
|
|
19
|
+
* success: false,
|
|
20
|
+
* error: "Human-readable message",
|
|
21
|
+
* code: "MACHINE_CODE",
|
|
22
|
+
* requestId: "uuid", // For tracing
|
|
23
|
+
* timestamp: "ISO date", // When error occurred
|
|
24
|
+
* details: { ... } // Additional context
|
|
25
|
+
* }
|
|
26
|
+
*/
|
|
27
|
+
declare class ArcError extends Error {
|
|
28
|
+
name: string;
|
|
29
|
+
readonly code: string;
|
|
30
|
+
readonly statusCode: number;
|
|
31
|
+
readonly details?: Record<string, unknown>;
|
|
32
|
+
readonly cause?: Error;
|
|
33
|
+
readonly timestamp: string;
|
|
34
|
+
requestId?: string;
|
|
35
|
+
constructor(message: string, options?: ErrorDetails);
|
|
36
|
+
/**
|
|
37
|
+
* Set request ID (typically from request context)
|
|
38
|
+
*/
|
|
39
|
+
withRequestId(requestId: string): this;
|
|
40
|
+
/**
|
|
41
|
+
* Convert to JSON response.
|
|
42
|
+
* Includes cause chain when present for debugging visibility.
|
|
43
|
+
*/
|
|
44
|
+
toJSON(): Record<string, unknown>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Not Found Error - 404
|
|
48
|
+
*/
|
|
49
|
+
declare class NotFoundError extends ArcError {
|
|
50
|
+
constructor(resource: string, identifier?: string);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Validation Error - 400
|
|
54
|
+
*/
|
|
55
|
+
declare class ValidationError extends ArcError {
|
|
56
|
+
readonly errors: Array<{
|
|
57
|
+
field: string;
|
|
58
|
+
message: string;
|
|
59
|
+
}>;
|
|
60
|
+
constructor(message: string, errors?: Array<{
|
|
61
|
+
field: string;
|
|
62
|
+
message: string;
|
|
63
|
+
}>);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Unauthorized Error - 401
|
|
67
|
+
*/
|
|
68
|
+
declare class UnauthorizedError extends ArcError {
|
|
69
|
+
constructor(message?: string);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Forbidden Error - 403
|
|
73
|
+
*/
|
|
74
|
+
declare class ForbiddenError extends ArcError {
|
|
75
|
+
constructor(message?: string);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Conflict Error - 409
|
|
79
|
+
*/
|
|
80
|
+
declare class ConflictError extends ArcError {
|
|
81
|
+
constructor(message: string, field?: string);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Organization Required Error - 403
|
|
85
|
+
*/
|
|
86
|
+
declare class OrgRequiredError extends ArcError {
|
|
87
|
+
readonly organizations?: Array<{
|
|
88
|
+
id: string;
|
|
89
|
+
roles?: string[];
|
|
90
|
+
}>;
|
|
91
|
+
constructor(message: string, organizations?: Array<{
|
|
92
|
+
id: string;
|
|
93
|
+
roles?: string[];
|
|
94
|
+
}>);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Organization Access Denied Error - 403
|
|
98
|
+
*/
|
|
99
|
+
declare class OrgAccessDeniedError extends ArcError {
|
|
100
|
+
constructor(orgId?: string);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Rate Limit Error - 429
|
|
104
|
+
*/
|
|
105
|
+
declare class RateLimitError extends ArcError {
|
|
106
|
+
readonly retryAfter?: number;
|
|
107
|
+
constructor(message?: string, retryAfter?: number);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Service Unavailable Error - 503
|
|
111
|
+
*/
|
|
112
|
+
declare class ServiceUnavailableError extends ArcError {
|
|
113
|
+
constructor(message?: string);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create error from status code
|
|
117
|
+
*/
|
|
118
|
+
declare function createError(statusCode: number, message: string, details?: Record<string, unknown>): ArcError;
|
|
119
|
+
/**
|
|
120
|
+
* Check if error is an Arc error
|
|
121
|
+
*/
|
|
122
|
+
declare function isArcError(error: unknown): error is ArcError;
|
|
123
|
+
//#endregion
|
|
124
|
+
export { NotFoundError as a, RateLimitError as c, ValidationError as d, createError as f, ForbiddenError as i, ServiceUnavailableError as l, ConflictError as n, OrgAccessDeniedError as o, isArcError as p, ErrorDetails as r, OrgRequiredError as s, ArcError as t, UnauthorizedError as u };
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
//#region src/utils/errors.ts
|
|
2
|
+
/**
|
|
3
|
+
* Base Arc Error
|
|
4
|
+
*
|
|
5
|
+
* All Arc errors extend this class and produce a consistent error envelope:
|
|
6
|
+
* {
|
|
7
|
+
* success: false,
|
|
8
|
+
* error: "Human-readable message",
|
|
9
|
+
* code: "MACHINE_CODE",
|
|
10
|
+
* requestId: "uuid", // For tracing
|
|
11
|
+
* timestamp: "ISO date", // When error occurred
|
|
12
|
+
* details: { ... } // Additional context
|
|
13
|
+
* }
|
|
14
|
+
*/
|
|
15
|
+
var ArcError = class ArcError extends Error {
|
|
16
|
+
name;
|
|
17
|
+
code;
|
|
18
|
+
statusCode;
|
|
19
|
+
details;
|
|
20
|
+
cause;
|
|
21
|
+
timestamp;
|
|
22
|
+
requestId;
|
|
23
|
+
constructor(message, options = {}) {
|
|
24
|
+
super(message, options.cause ? { cause: options.cause } : void 0);
|
|
25
|
+
this.name = "ArcError";
|
|
26
|
+
this.code = options.code ?? "ARC_ERROR";
|
|
27
|
+
this.statusCode = options.statusCode ?? 500;
|
|
28
|
+
this.details = options.details;
|
|
29
|
+
this.cause = options.cause;
|
|
30
|
+
this.timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
31
|
+
this.requestId = options.requestId;
|
|
32
|
+
if (Error.captureStackTrace) Error.captureStackTrace(this, this.constructor);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Set request ID (typically from request context)
|
|
36
|
+
*/
|
|
37
|
+
withRequestId(requestId) {
|
|
38
|
+
this.requestId = requestId;
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Convert to JSON response.
|
|
43
|
+
* Includes cause chain when present for debugging visibility.
|
|
44
|
+
*/
|
|
45
|
+
toJSON() {
|
|
46
|
+
return {
|
|
47
|
+
success: false,
|
|
48
|
+
error: this.message,
|
|
49
|
+
code: this.code,
|
|
50
|
+
timestamp: this.timestamp,
|
|
51
|
+
...this.requestId && { requestId: this.requestId },
|
|
52
|
+
...this.details && { details: this.details },
|
|
53
|
+
...this.cause && { cause: this.cause instanceof ArcError ? this.cause.toJSON() : {
|
|
54
|
+
message: this.cause.message,
|
|
55
|
+
name: this.cause.name
|
|
56
|
+
} }
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Not Found Error - 404
|
|
62
|
+
*/
|
|
63
|
+
var NotFoundError = class extends ArcError {
|
|
64
|
+
constructor(resource, identifier) {
|
|
65
|
+
const message = identifier ? `${resource} with identifier '${identifier}' not found` : `${resource} not found`;
|
|
66
|
+
super(message, {
|
|
67
|
+
code: "NOT_FOUND",
|
|
68
|
+
statusCode: 404,
|
|
69
|
+
details: {
|
|
70
|
+
resource,
|
|
71
|
+
identifier
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
this.name = "NotFoundError";
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Validation Error - 400
|
|
79
|
+
*/
|
|
80
|
+
var ValidationError = class extends ArcError {
|
|
81
|
+
errors;
|
|
82
|
+
constructor(message, errors = []) {
|
|
83
|
+
super(message, {
|
|
84
|
+
code: "VALIDATION_ERROR",
|
|
85
|
+
statusCode: 400,
|
|
86
|
+
details: { errors }
|
|
87
|
+
});
|
|
88
|
+
this.name = "ValidationError";
|
|
89
|
+
this.errors = errors;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Unauthorized Error - 401
|
|
94
|
+
*/
|
|
95
|
+
var UnauthorizedError = class extends ArcError {
|
|
96
|
+
constructor(message = "Authentication required") {
|
|
97
|
+
super(message, {
|
|
98
|
+
code: "UNAUTHORIZED",
|
|
99
|
+
statusCode: 401
|
|
100
|
+
});
|
|
101
|
+
this.name = "UnauthorizedError";
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Forbidden Error - 403
|
|
106
|
+
*/
|
|
107
|
+
var ForbiddenError = class extends ArcError {
|
|
108
|
+
constructor(message = "Access denied") {
|
|
109
|
+
super(message, {
|
|
110
|
+
code: "FORBIDDEN",
|
|
111
|
+
statusCode: 403
|
|
112
|
+
});
|
|
113
|
+
this.name = "ForbiddenError";
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Conflict Error - 409
|
|
118
|
+
*/
|
|
119
|
+
var ConflictError = class extends ArcError {
|
|
120
|
+
constructor(message, field) {
|
|
121
|
+
super(message, {
|
|
122
|
+
code: "CONFLICT",
|
|
123
|
+
statusCode: 409,
|
|
124
|
+
details: field ? { field } : void 0
|
|
125
|
+
});
|
|
126
|
+
this.name = "ConflictError";
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Organization Required Error - 403
|
|
131
|
+
*/
|
|
132
|
+
var OrgRequiredError = class extends ArcError {
|
|
133
|
+
organizations;
|
|
134
|
+
constructor(message, organizations) {
|
|
135
|
+
super(message, {
|
|
136
|
+
code: "ORG_SELECTION_REQUIRED",
|
|
137
|
+
statusCode: 403,
|
|
138
|
+
details: organizations ? { organizations } : void 0
|
|
139
|
+
});
|
|
140
|
+
this.name = "OrgRequiredError";
|
|
141
|
+
this.organizations = organizations;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Organization Access Denied Error - 403
|
|
146
|
+
*/
|
|
147
|
+
var OrgAccessDeniedError = class extends ArcError {
|
|
148
|
+
constructor(orgId) {
|
|
149
|
+
super("Organization access denied", {
|
|
150
|
+
code: "ORG_ACCESS_DENIED",
|
|
151
|
+
statusCode: 403,
|
|
152
|
+
details: orgId ? { organizationId: orgId } : void 0
|
|
153
|
+
});
|
|
154
|
+
this.name = "OrgAccessDeniedError";
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Rate Limit Error - 429
|
|
159
|
+
*/
|
|
160
|
+
var RateLimitError = class extends ArcError {
|
|
161
|
+
retryAfter;
|
|
162
|
+
constructor(message = "Too many requests", retryAfter) {
|
|
163
|
+
super(message, {
|
|
164
|
+
code: "RATE_LIMITED",
|
|
165
|
+
statusCode: 429,
|
|
166
|
+
details: retryAfter ? { retryAfter } : void 0
|
|
167
|
+
});
|
|
168
|
+
this.name = "RateLimitError";
|
|
169
|
+
this.retryAfter = retryAfter;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Service Unavailable Error - 503
|
|
174
|
+
*/
|
|
175
|
+
var ServiceUnavailableError = class extends ArcError {
|
|
176
|
+
constructor(message = "Service temporarily unavailable") {
|
|
177
|
+
super(message, {
|
|
178
|
+
code: "SERVICE_UNAVAILABLE",
|
|
179
|
+
statusCode: 503
|
|
180
|
+
});
|
|
181
|
+
this.name = "ServiceUnavailableError";
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Create error from status code
|
|
186
|
+
*/
|
|
187
|
+
function createError(statusCode, message, details) {
|
|
188
|
+
return new ArcError(message, {
|
|
189
|
+
code: {
|
|
190
|
+
400: "BAD_REQUEST",
|
|
191
|
+
401: "UNAUTHORIZED",
|
|
192
|
+
403: "FORBIDDEN",
|
|
193
|
+
404: "NOT_FOUND",
|
|
194
|
+
409: "CONFLICT",
|
|
195
|
+
429: "RATE_LIMITED",
|
|
196
|
+
500: "INTERNAL_ERROR",
|
|
197
|
+
503: "SERVICE_UNAVAILABLE"
|
|
198
|
+
}[statusCode] ?? "ERROR",
|
|
199
|
+
statusCode,
|
|
200
|
+
details
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Check if error is an Arc error
|
|
205
|
+
*/
|
|
206
|
+
function isArcError(error) {
|
|
207
|
+
return error instanceof ArcError;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
//#endregion
|
|
211
|
+
export { OrgAccessDeniedError as a, ServiceUnavailableError as c, createError as d, isArcError as f, NotFoundError as i, UnauthorizedError as l, ConflictError as n, OrgRequiredError as o, ForbiddenError as r, RateLimitError as s, ArcError as t, ValidationError as u };
|