@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
@@ -1,273 +0,0 @@
1
- import { FastifyPluginAsync, FastifyInstance, FastifyRequest } from 'fastify';
2
- import { H as HookSystem, j as ResourceRegistry } from './index-B4t03KQ0.js';
3
-
4
- /**
5
- * Request ID Plugin
6
- *
7
- * Propagates request IDs for distributed tracing.
8
- * - Accepts incoming x-request-id header
9
- * - Generates UUID if not provided
10
- * - Attaches to request.id and response header
11
- *
12
- * @example
13
- * import { requestIdPlugin } from '@classytic/arc';
14
- *
15
- * await fastify.register(requestIdPlugin);
16
- *
17
- * // In handlers, access via request.id
18
- * fastify.get('/', async (request) => {
19
- * console.log(request.id); // UUID
20
- * });
21
- */
22
-
23
- interface RequestIdOptions {
24
- /** Header name to read/write request ID (default: 'x-request-id') */
25
- header?: string;
26
- /** Custom ID generator (default: crypto.randomUUID) */
27
- generator?: () => string;
28
- /** Whether to set response header (default: true) */
29
- setResponseHeader?: boolean;
30
- }
31
- declare module 'fastify' {
32
- interface FastifyRequest {
33
- /** Unique request identifier for tracing */
34
- requestId: string;
35
- }
36
- }
37
- declare const requestIdPlugin: FastifyPluginAsync<RequestIdOptions>;
38
- declare const _default$4: FastifyPluginAsync<RequestIdOptions>;
39
-
40
- /**
41
- * Health Check Plugin
42
- *
43
- * Kubernetes-ready health endpoints:
44
- * - /health/live - Liveness probe (is the process alive?)
45
- * - /health/ready - Readiness probe (can we serve traffic?)
46
- * - /health/metrics - Prometheus metrics (optional)
47
- *
48
- * @example
49
- * import { healthPlugin } from '@classytic/arc';
50
- *
51
- * await fastify.register(healthPlugin, {
52
- * prefix: '/_health',
53
- * checks: [
54
- * { name: 'mongodb', check: async () => mongoose.connection.readyState === 1 },
55
- * { name: 'redis', check: async () => redis.ping() === 'PONG' },
56
- * ],
57
- * });
58
- */
59
-
60
- interface HealthCheck {
61
- /** Name of the dependency */
62
- name: string;
63
- /** Function that returns true if healthy, false otherwise */
64
- check: () => Promise<boolean> | boolean;
65
- /** Optional timeout in ms (default: 5000) */
66
- timeout?: number;
67
- /** Whether this check is critical for readiness (default: true) */
68
- critical?: boolean;
69
- }
70
- interface HealthOptions {
71
- /** Route prefix (default: '/_health') */
72
- prefix?: string;
73
- /** Health check dependencies */
74
- checks?: HealthCheck[];
75
- /** Enable metrics endpoint (default: false) */
76
- metrics?: boolean;
77
- /** Custom metrics collector function */
78
- metricsCollector?: () => Promise<string> | string;
79
- /** Version info to include in responses */
80
- version?: string;
81
- /** Collect HTTP request metrics (default: true if metrics enabled) */
82
- collectHttpMetrics?: boolean;
83
- }
84
- declare const healthPlugin: FastifyPluginAsync<HealthOptions>;
85
- declare const _default$3: FastifyPluginAsync<HealthOptions>;
86
-
87
- /**
88
- * OpenTelemetry Distributed Tracing Plugin
89
- *
90
- * Traces HTTP requests, repository operations, and MongoDB queries
91
- * across the entire application lifecycle.
92
- *
93
- * @example
94
- * import { tracingPlugin } from '@classytic/arc/plugins';
95
- *
96
- * await fastify.register(tracingPlugin, {
97
- * serviceName: 'my-api',
98
- * exporterUrl: 'http://localhost:4318/v1/traces', // OTLP endpoint
99
- * });
100
- */
101
-
102
- interface TracingOptions {
103
- /**
104
- * Service name for traces
105
- */
106
- serviceName?: string;
107
- /**
108
- * OTLP exporter endpoint URL
109
- * @default 'http://localhost:4318/v1/traces'
110
- */
111
- exporterUrl?: string;
112
- /**
113
- * Enable auto-instrumentation for HTTP, MongoDB, etc.
114
- * @default true
115
- */
116
- autoInstrumentation?: boolean;
117
- /**
118
- * Trace all repository operations
119
- * @default true
120
- */
121
- traceRepository?: boolean;
122
- /**
123
- * Trace all controller operations
124
- * @default true
125
- */
126
- traceController?: boolean;
127
- /**
128
- * Sample rate (0.0 to 1.0)
129
- * @default 1.0 (trace everything)
130
- */
131
- sampleRate?: number;
132
- }
133
- interface TracerContext {
134
- tracer: any;
135
- currentSpan: any;
136
- }
137
- declare module 'fastify' {
138
- interface FastifyRequest {
139
- tracer?: TracerContext;
140
- }
141
- }
142
- /**
143
- * OpenTelemetry Distributed Tracing Plugin
144
- */
145
- declare function tracingPlugin(fastify: FastifyInstance, options?: TracingOptions): Promise<void>;
146
- /**
147
- * Utility to create custom spans in your code
148
- *
149
- * @example
150
- * import { createSpan } from '@classytic/arc/plugins';
151
- *
152
- * async function expensiveOperation(req) {
153
- * return createSpan(req, 'expensiveOperation', async (span) => {
154
- * span.setAttribute('custom.attribute', 'value');
155
- * return await doWork();
156
- * });
157
- * }
158
- */
159
- declare function createSpan<T>(request: FastifyRequest, name: string, fn: (span: any) => Promise<T>, attributes?: Record<string, any>): Promise<T>;
160
- /**
161
- * Decorator to automatically trace repository methods
162
- *
163
- * @example
164
- * class ProductRepository extends Repository {
165
- * @traced()
166
- * async findActive() {
167
- * return this.findAll({ filter: { isActive: true } });
168
- * }
169
- * }
170
- */
171
- declare function traced(spanName?: string): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
172
- /**
173
- * Check if OpenTelemetry is available
174
- */
175
- declare function isTracingAvailable(): boolean;
176
- declare const _default$2: typeof tracingPlugin;
177
-
178
- /**
179
- * Graceful Shutdown Plugin
180
- *
181
- * Handles SIGTERM and SIGINT signals for clean shutdown:
182
- * - Stops accepting new connections
183
- * - Waits for in-flight requests to complete
184
- * - Closes database connections
185
- * - Exits cleanly
186
- *
187
- * Essential for Kubernetes deployments.
188
- *
189
- * @example
190
- * import { gracefulShutdownPlugin } from '@classytic/arc';
191
- *
192
- * await fastify.register(gracefulShutdownPlugin, {
193
- * timeout: 30000, // 30 seconds max
194
- * onShutdown: async () => {
195
- * await mongoose.disconnect();
196
- * await redis.quit();
197
- * },
198
- * });
199
- */
200
-
201
- interface GracefulShutdownOptions {
202
- /** Maximum time to wait for graceful shutdown in ms (default: 30000) */
203
- timeout?: number;
204
- /** Custom cleanup function called before exit */
205
- onShutdown?: () => Promise<void> | void;
206
- /** Signals to handle (default: ['SIGTERM', 'SIGINT']) */
207
- signals?: NodeJS.Signals[];
208
- /** Whether to log shutdown events (default: true) */
209
- logEvents?: boolean;
210
- }
211
- declare const gracefulShutdownPlugin: FastifyPluginAsync<GracefulShutdownOptions>;
212
- declare module 'fastify' {
213
- interface FastifyInstance {
214
- /** Trigger graceful shutdown manually */
215
- shutdown: () => Promise<void>;
216
- }
217
- }
218
- declare const _default$1: FastifyPluginAsync<GracefulShutdownOptions>;
219
-
220
- /**
221
- * Arc Core Plugin
222
- *
223
- * Sets up instance-scoped Arc systems:
224
- * - HookSystem: Lifecycle hooks per app instance
225
- * - ResourceRegistry: Resource tracking per app instance
226
- * - Event integration: Wires CRUD operations to fastify.events
227
- *
228
- * This solves the global singleton leak problem where multiple
229
- * app instances (e.g., in tests) would share state.
230
- *
231
- * @example
232
- * import { arcCorePlugin } from '@classytic/arc';
233
- *
234
- * const app = Fastify();
235
- * await app.register(arcCorePlugin);
236
- *
237
- * // Now use instance-scoped hooks
238
- * app.arc.hooks.before('product', 'create', async (ctx) => {
239
- * ctx.data.slug = slugify(ctx.data.name);
240
- * });
241
- */
242
-
243
- interface ArcCorePluginOptions {
244
- /** Enable event emission for CRUD operations (requires eventPlugin) */
245
- emitEvents?: boolean;
246
- /** Hook system instance (for testing/custom setup) */
247
- hookSystem?: HookSystem;
248
- /** Resource registry instance (for testing/custom setup) */
249
- registry?: ResourceRegistry;
250
- /**
251
- * Use global singletons for backward compatibility with presets
252
- * When false (default), creates new isolated instances for better test isolation
253
- * When true, uses global hookSystem/registry (for preset compatibility)
254
- */
255
- useGlobalSingletons?: boolean;
256
- }
257
- interface ArcCore {
258
- /** Instance-scoped hook system */
259
- hooks: HookSystem;
260
- /** Instance-scoped resource registry */
261
- registry: ResourceRegistry;
262
- /** Whether event emission is enabled */
263
- emitEvents: boolean;
264
- }
265
- declare module 'fastify' {
266
- interface FastifyInstance {
267
- arc: ArcCore;
268
- }
269
- }
270
- declare const arcCorePlugin: FastifyPluginAsync<ArcCorePluginOptions>;
271
- declare const _default: FastifyPluginAsync<ArcCorePluginOptions>;
272
-
273
- export { type ArcCorePluginOptions as A, type GracefulShutdownOptions as G, type HealthOptions as H, type RequestIdOptions as R, type TracingOptions as T, _default$4 as _, _default$3 as a, type HealthCheck as b, _default$2 as c, createSpan as d, _default$1 as e, _default as f, gracefulShutdownPlugin as g, healthPlugin as h, isTracingAvailable as i, arcCorePlugin as j, type ArcCore as k, requestIdPlugin as r, traced as t };
@@ -1,195 +0,0 @@
1
- import { U as UserBase } from '../types-B99TBmFV.js';
2
- import { FastifyPluginAsync } from 'fastify';
3
-
4
- /**
5
- * Audit Store Interface
6
- *
7
- * Pluggable storage backend for audit logs.
8
- * Implementations: memory (dev), mongodb, event (emit only)
9
- */
10
-
11
- type AuditAction = 'create' | 'update' | 'delete' | 'restore' | 'custom';
12
- interface AuditEntry {
13
- /** Unique audit log ID */
14
- id: string;
15
- /** Resource name (e.g., 'product', 'user') */
16
- resource: string;
17
- /** Document/entity ID */
18
- documentId: string;
19
- /** Action performed */
20
- action: AuditAction;
21
- /** User who performed the action */
22
- userId?: string;
23
- /** Organization context */
24
- organizationId?: string;
25
- /** Previous state (for updates) */
26
- before?: Record<string, unknown>;
27
- /** New state (for creates/updates) */
28
- after?: Record<string, unknown>;
29
- /** Changed fields (for updates) */
30
- changes?: string[];
31
- /** Request ID for tracing */
32
- requestId?: string;
33
- /** IP address */
34
- ipAddress?: string;
35
- /** User agent */
36
- userAgent?: string;
37
- /** Custom metadata */
38
- metadata?: Record<string, unknown>;
39
- /** When the action occurred */
40
- timestamp: Date;
41
- }
42
- interface AuditContext {
43
- user?: UserBase;
44
- organizationId?: string;
45
- requestId?: string;
46
- ipAddress?: string;
47
- userAgent?: string;
48
- }
49
- interface AuditStoreOptions {
50
- /** Store name for logging */
51
- name: string;
52
- }
53
- /**
54
- * Abstract audit store interface
55
- */
56
- interface AuditStore {
57
- /** Store name */
58
- readonly name: string;
59
- /** Log an audit entry */
60
- log(entry: AuditEntry): Promise<void>;
61
- /** Query audit logs (optional - not all stores support querying) */
62
- query?(options: AuditQueryOptions): Promise<AuditEntry[]>;
63
- /** Close/cleanup (optional) */
64
- close?(): Promise<void>;
65
- }
66
- interface AuditQueryOptions {
67
- resource?: string;
68
- documentId?: string;
69
- userId?: string;
70
- organizationId?: string;
71
- action?: AuditAction | AuditAction[];
72
- from?: Date;
73
- to?: Date;
74
- limit?: number;
75
- offset?: number;
76
- }
77
- /**
78
- * Create audit entry from context
79
- */
80
- declare function createAuditEntry(resource: string, documentId: string, action: AuditAction, context: AuditContext, data?: {
81
- before?: Record<string, unknown>;
82
- after?: Record<string, unknown>;
83
- metadata?: Record<string, unknown>;
84
- }): AuditEntry;
85
-
86
- interface AuditPluginOptions {
87
- /** Enable audit logging (default: false) */
88
- enabled?: boolean;
89
- /** Storage backends to use */
90
- stores?: ('memory' | 'mongodb')[];
91
- /** MongoDB connection (required if using mongodb store) */
92
- mongoConnection?: {
93
- collection: (name: string) => unknown;
94
- };
95
- /** MongoDB collection name (default: 'audit_logs') */
96
- mongoCollection?: string;
97
- /** TTL in days for MongoDB (default: 90) */
98
- ttlDays?: number;
99
- /** Custom stores (advanced) */
100
- customStores?: AuditStore[];
101
- }
102
- declare module 'fastify' {
103
- interface FastifyInstance {
104
- /** Log an audit entry */
105
- audit: AuditLogger;
106
- }
107
- interface FastifyRequest {
108
- /** Audit context for current request */
109
- auditContext?: AuditContext;
110
- }
111
- }
112
- interface AuditLogger {
113
- /** Log a create action */
114
- create: (resource: string, documentId: string, data: Record<string, unknown>, context?: AuditContext) => Promise<void>;
115
- /** Log an update action */
116
- update: (resource: string, documentId: string, before: Record<string, unknown>, after: Record<string, unknown>, context?: AuditContext) => Promise<void>;
117
- /** Log a delete action */
118
- delete: (resource: string, documentId: string, data: Record<string, unknown>, context?: AuditContext) => Promise<void>;
119
- /** Log a restore action (soft delete undo) */
120
- restore: (resource: string, documentId: string, data: Record<string, unknown>, context?: AuditContext) => Promise<void>;
121
- /** Log a custom action */
122
- custom: (resource: string, documentId: string, action: string, data?: Record<string, unknown>, context?: AuditContext) => Promise<void>;
123
- /** Query audit logs (if stores support it) */
124
- query: (options: AuditQueryOptions) => Promise<AuditEntry[]>;
125
- }
126
- declare const auditPlugin: FastifyPluginAsync<AuditPluginOptions>;
127
- declare const _default: FastifyPluginAsync<AuditPluginOptions>;
128
-
129
- /**
130
- * In-Memory Audit Store
131
- *
132
- * For development and testing. Not suitable for production.
133
- * Logs are lost on restart.
134
- */
135
-
136
- interface MemoryAuditStoreOptions {
137
- /** Maximum entries to keep (default: 1000) */
138
- maxEntries?: number;
139
- }
140
- declare class MemoryAuditStore implements AuditStore {
141
- readonly name = "memory";
142
- private entries;
143
- private maxEntries;
144
- constructor(options?: MemoryAuditStoreOptions);
145
- log(entry: AuditEntry): Promise<void>;
146
- query(options?: AuditQueryOptions): Promise<AuditEntry[]>;
147
- close(): Promise<void>;
148
- /** Get all entries (for testing) */
149
- getAll(): AuditEntry[];
150
- /** Clear all entries (for testing) */
151
- clear(): void;
152
- }
153
-
154
- /**
155
- * MongoDB Audit Store
156
- *
157
- * Persists audit logs to MongoDB collection with TTL support.
158
- * Suitable for production use.
159
- */
160
-
161
- interface MongoAuditStoreOptions {
162
- /** MongoDB connection or mongoose instance */
163
- connection: MongoConnection;
164
- /** Collection name (default: 'audit_logs') */
165
- collection?: string;
166
- /** TTL in days (default: 90, 0 = no expiry) */
167
- ttlDays?: number;
168
- }
169
- interface MongoConnection {
170
- collection: (name: string) => MongoCollection;
171
- }
172
- interface MongoCollection {
173
- insertOne: (doc: Record<string, unknown>) => Promise<unknown>;
174
- find: (query: Record<string, unknown>) => MongoCursor;
175
- createIndex: (spec: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
176
- }
177
- interface MongoCursor {
178
- sort: (spec: Record<string, unknown>) => MongoCursor;
179
- skip: (n: number) => MongoCursor;
180
- limit: (n: number) => MongoCursor;
181
- toArray: () => Promise<Record<string, unknown>[]>;
182
- }
183
- declare class MongoAuditStore implements AuditStore {
184
- private options;
185
- readonly name = "mongodb";
186
- private collection;
187
- private initialized;
188
- private ttlDays;
189
- constructor(options: MongoAuditStoreOptions);
190
- private ensureIndexes;
191
- log(entry: AuditEntry): Promise<void>;
192
- query(options?: AuditQueryOptions): Promise<AuditEntry[]>;
193
- }
194
-
195
- export { type AuditAction, type AuditContext, type AuditEntry, type AuditLogger, type AuditPluginOptions, type AuditQueryOptions, type AuditStore, type AuditStoreOptions, MemoryAuditStore, type MemoryAuditStoreOptions, MongoAuditStore, type MongoAuditStoreOptions, _default as auditPlugin, auditPlugin as auditPluginFn, createAuditEntry };