@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.
Files changed (200) hide show
  1. package/README.md +247 -794
  2. package/bin/arc.js +91 -52
  3. package/dist/EventTransport-BkUDYZEb.d.mts +99 -0
  4. package/dist/HookSystem-BsGV-j2l.mjs +404 -0
  5. package/dist/ResourceRegistry-7Ic20ZMw.mjs +249 -0
  6. package/dist/adapters/index.d.mts +5 -0
  7. package/dist/adapters/index.mjs +3 -0
  8. package/dist/audit/index.d.mts +81 -0
  9. package/dist/audit/index.mjs +275 -0
  10. package/dist/audit/mongodb.d.mts +5 -0
  11. package/dist/audit/mongodb.mjs +3 -0
  12. package/dist/audited-CGdLiSlE.mjs +140 -0
  13. package/dist/auth/index.d.mts +188 -0
  14. package/dist/auth/index.mjs +1096 -0
  15. package/dist/auth/redis-session.d.mts +43 -0
  16. package/dist/auth/redis-session.mjs +75 -0
  17. package/dist/betterAuthOpenApi-DjWDddNc.mjs +249 -0
  18. package/dist/cache/index.d.mts +145 -0
  19. package/dist/cache/index.mjs +91 -0
  20. package/dist/caching-GSDJcA6-.mjs +93 -0
  21. package/dist/chunk-C7Uep-_p.mjs +20 -0
  22. package/dist/circuitBreaker-DYhWBW_D.mjs +1096 -0
  23. package/dist/cli/commands/describe.d.mts +18 -0
  24. package/dist/cli/commands/describe.mjs +238 -0
  25. package/dist/cli/commands/docs.d.mts +13 -0
  26. package/dist/cli/commands/docs.mjs +52 -0
  27. package/dist/cli/commands/{generate.d.ts → generate.d.mts} +3 -2
  28. package/dist/cli/commands/generate.mjs +357 -0
  29. package/dist/cli/commands/{init.d.ts → init.d.mts} +11 -8
  30. package/dist/cli/commands/{init.js → init.mjs} +807 -617
  31. package/dist/cli/commands/introspect.d.mts +10 -0
  32. package/dist/cli/commands/introspect.mjs +75 -0
  33. package/dist/cli/index.d.mts +16 -0
  34. package/dist/cli/index.mjs +156 -0
  35. package/dist/constants-DdXFXQtN.mjs +84 -0
  36. package/dist/core/index.d.mts +5 -0
  37. package/dist/core/index.mjs +4 -0
  38. package/dist/createApp-D2D5XXaV.mjs +559 -0
  39. package/dist/defineResource-PXzSJ15_.mjs +2197 -0
  40. package/dist/discovery/index.d.mts +46 -0
  41. package/dist/discovery/index.mjs +109 -0
  42. package/dist/docs/index.d.mts +162 -0
  43. package/dist/docs/index.mjs +74 -0
  44. package/dist/elevation-DGo5shaX.d.mts +87 -0
  45. package/dist/elevation-DSTbVvYj.mjs +113 -0
  46. package/dist/errorHandler-C3GY3_ow.mjs +108 -0
  47. package/dist/errorHandler-CW3OOeYq.d.mts +72 -0
  48. package/dist/errors-DAWRdiYP.d.mts +124 -0
  49. package/dist/errors-DBANPbGr.mjs +211 -0
  50. package/dist/eventPlugin-BEOvaDqo.mjs +229 -0
  51. package/dist/eventPlugin-H6wDDjGO.d.mts +124 -0
  52. package/dist/events/index.d.mts +53 -0
  53. package/dist/events/index.mjs +51 -0
  54. package/dist/events/transports/redis-stream-entry.d.mts +2 -0
  55. package/dist/events/transports/redis-stream-entry.mjs +177 -0
  56. package/dist/events/transports/redis.d.mts +76 -0
  57. package/dist/events/transports/redis.mjs +124 -0
  58. package/dist/externalPaths-SyPF2tgK.d.mts +50 -0
  59. package/dist/factory/index.d.mts +63 -0
  60. package/dist/factory/index.mjs +3 -0
  61. package/dist/fastifyAdapter-C8DlE0YH.d.mts +216 -0
  62. package/dist/fields-Bi_AVKSo.d.mts +109 -0
  63. package/dist/fields-CTd_CrKr.mjs +114 -0
  64. package/dist/hooks/index.d.mts +4 -0
  65. package/dist/hooks/index.mjs +3 -0
  66. package/dist/idempotency/index.d.mts +96 -0
  67. package/dist/idempotency/index.mjs +319 -0
  68. package/dist/idempotency/mongodb.d.mts +2 -0
  69. package/dist/idempotency/mongodb.mjs +114 -0
  70. package/dist/idempotency/redis.d.mts +2 -0
  71. package/dist/idempotency/redis.mjs +103 -0
  72. package/dist/index.d.mts +260 -0
  73. package/dist/index.mjs +104 -0
  74. package/dist/integrations/event-gateway.d.mts +46 -0
  75. package/dist/integrations/event-gateway.mjs +43 -0
  76. package/dist/integrations/index.d.mts +5 -0
  77. package/dist/integrations/index.mjs +1 -0
  78. package/dist/integrations/jobs.d.mts +103 -0
  79. package/dist/integrations/jobs.mjs +123 -0
  80. package/dist/integrations/streamline.d.mts +60 -0
  81. package/dist/integrations/streamline.mjs +125 -0
  82. package/dist/integrations/websocket.d.mts +82 -0
  83. package/dist/integrations/websocket.mjs +288 -0
  84. package/dist/interface-CSNjltAc.d.mts +77 -0
  85. package/dist/interface-DTbsvIWe.d.mts +54 -0
  86. package/dist/interface-e9XfSsUV.d.mts +1097 -0
  87. package/dist/introspectionPlugin-B3JkrjwU.mjs +53 -0
  88. package/dist/keys-DhqDRxv3.mjs +42 -0
  89. package/dist/logger-ByrvQWZO.mjs +78 -0
  90. package/dist/memory-B2v7KrCB.mjs +143 -0
  91. package/dist/migrations/index.d.mts +156 -0
  92. package/dist/migrations/index.mjs +260 -0
  93. package/dist/mongodb-ClykrfGo.d.mts +118 -0
  94. package/dist/mongodb-DNKEExbf.mjs +93 -0
  95. package/dist/mongodb-Dg8O_gvd.d.mts +71 -0
  96. package/dist/openapi-9nB_kiuR.mjs +525 -0
  97. package/dist/org/index.d.mts +68 -0
  98. package/dist/org/index.mjs +513 -0
  99. package/dist/org/types.d.mts +82 -0
  100. package/dist/org/types.mjs +1 -0
  101. package/dist/permissions/index.d.mts +278 -0
  102. package/dist/permissions/index.mjs +579 -0
  103. package/dist/plugins/index.d.mts +172 -0
  104. package/dist/plugins/index.mjs +522 -0
  105. package/dist/plugins/response-cache.d.mts +87 -0
  106. package/dist/plugins/response-cache.mjs +283 -0
  107. package/dist/plugins/tracing-entry.d.mts +2 -0
  108. package/dist/plugins/tracing-entry.mjs +185 -0
  109. package/dist/pluralize-CM-jZg7p.mjs +86 -0
  110. package/dist/policies/{index.d.ts → index.d.mts} +204 -170
  111. package/dist/policies/index.mjs +321 -0
  112. package/dist/presets/{index.d.ts → index.d.mts} +62 -131
  113. package/dist/presets/index.mjs +143 -0
  114. package/dist/presets/multiTenant.d.mts +24 -0
  115. package/dist/presets/multiTenant.mjs +113 -0
  116. package/dist/presets-BTeYbw7h.d.mts +57 -0
  117. package/dist/presets-CeFtfDR8.mjs +119 -0
  118. package/dist/prisma-C3iornoK.d.mts +274 -0
  119. package/dist/prisma-DJbMt3yf.mjs +627 -0
  120. package/dist/queryCachePlugin-B6R0d4av.mjs +138 -0
  121. package/dist/queryCachePlugin-Q6SYuHZ6.d.mts +71 -0
  122. package/dist/redis-UwjEp8Ea.d.mts +49 -0
  123. package/dist/redis-stream-CBg0upHI.d.mts +103 -0
  124. package/dist/registry/index.d.mts +11 -0
  125. package/dist/registry/index.mjs +4 -0
  126. package/dist/requestContext-xi6OKBL-.mjs +55 -0
  127. package/dist/schemaConverter-Dtg0Kt9T.mjs +98 -0
  128. package/dist/schemas/index.d.mts +63 -0
  129. package/dist/schemas/index.mjs +82 -0
  130. package/dist/scope/index.d.mts +21 -0
  131. package/dist/scope/index.mjs +65 -0
  132. package/dist/sessionManager-D_iEHjQl.d.mts +186 -0
  133. package/dist/sse-DkqQ1uxb.mjs +123 -0
  134. package/dist/testing/index.d.mts +907 -0
  135. package/dist/testing/index.mjs +1976 -0
  136. package/dist/tracing-8CEbhF0w.d.mts +70 -0
  137. package/dist/typeGuards-DwxA1t_L.mjs +9 -0
  138. package/dist/types/index.d.mts +946 -0
  139. package/dist/types/index.mjs +14 -0
  140. package/dist/types-B0dhNrnd.d.mts +445 -0
  141. package/dist/types-Beqn1Un7.mjs +38 -0
  142. package/dist/types-DelU6kln.mjs +25 -0
  143. package/dist/types-RLkFVgaw.d.mts +101 -0
  144. package/dist/utils/index.d.mts +747 -0
  145. package/dist/utils/index.mjs +6 -0
  146. package/package.json +194 -68
  147. package/dist/BaseController-DVAiHxEQ.d.ts +0 -233
  148. package/dist/adapters/index.d.ts +0 -237
  149. package/dist/adapters/index.js +0 -668
  150. package/dist/arcCorePlugin-CsShQdyP.d.ts +0 -273
  151. package/dist/audit/index.d.ts +0 -195
  152. package/dist/audit/index.js +0 -319
  153. package/dist/auth/index.d.ts +0 -47
  154. package/dist/auth/index.js +0 -174
  155. package/dist/cli/commands/docs.d.ts +0 -11
  156. package/dist/cli/commands/docs.js +0 -474
  157. package/dist/cli/commands/generate.js +0 -334
  158. package/dist/cli/commands/introspect.d.ts +0 -8
  159. package/dist/cli/commands/introspect.js +0 -338
  160. package/dist/cli/index.d.ts +0 -4
  161. package/dist/cli/index.js +0 -3269
  162. package/dist/core/index.d.ts +0 -220
  163. package/dist/core/index.js +0 -2786
  164. package/dist/createApp-Ce9wl8W9.d.ts +0 -77
  165. package/dist/docs/index.d.ts +0 -166
  166. package/dist/docs/index.js +0 -658
  167. package/dist/errors-8WIxGS_6.d.ts +0 -122
  168. package/dist/events/index.d.ts +0 -117
  169. package/dist/events/index.js +0 -89
  170. package/dist/factory/index.d.ts +0 -38
  171. package/dist/factory/index.js +0 -1652
  172. package/dist/hooks/index.d.ts +0 -4
  173. package/dist/hooks/index.js +0 -199
  174. package/dist/idempotency/index.d.ts +0 -323
  175. package/dist/idempotency/index.js +0 -500
  176. package/dist/index-B4t03KQ0.d.ts +0 -1366
  177. package/dist/index.d.ts +0 -135
  178. package/dist/index.js +0 -4756
  179. package/dist/migrations/index.d.ts +0 -185
  180. package/dist/migrations/index.js +0 -274
  181. package/dist/org/index.d.ts +0 -129
  182. package/dist/org/index.js +0 -220
  183. package/dist/permissions/index.d.ts +0 -144
  184. package/dist/permissions/index.js +0 -103
  185. package/dist/plugins/index.d.ts +0 -46
  186. package/dist/plugins/index.js +0 -1069
  187. package/dist/policies/index.js +0 -196
  188. package/dist/presets/index.js +0 -384
  189. package/dist/presets/multiTenant.d.ts +0 -39
  190. package/dist/presets/multiTenant.js +0 -112
  191. package/dist/registry/index.d.ts +0 -16
  192. package/dist/registry/index.js +0 -253
  193. package/dist/testing/index.d.ts +0 -618
  194. package/dist/testing/index.js +0 -48020
  195. package/dist/types/index.d.ts +0 -4
  196. package/dist/types/index.js +0 -8
  197. package/dist/types-B99TBmFV.d.ts +0 -76
  198. package/dist/types-BvckRbs2.d.ts +0 -143
  199. package/dist/utils/index.d.ts +0 -679
  200. 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 };