glasswork 0.12.2 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/auth/abilities.d.ts +41 -0
  2. package/dist/auth/abilities.d.ts.map +1 -0
  3. package/dist/auth/abilities.js +62 -0
  4. package/dist/auth/abilities.js.map +1 -0
  5. package/dist/auth/assert.d.ts +20 -0
  6. package/dist/auth/assert.d.ts.map +1 -0
  7. package/dist/auth/assert.js +28 -0
  8. package/dist/auth/assert.js.map +1 -0
  9. package/dist/auth/better-auth-provider.d.ts +56 -0
  10. package/dist/auth/better-auth-provider.d.ts.map +1 -0
  11. package/dist/auth/better-auth-provider.js +62 -0
  12. package/dist/auth/better-auth-provider.js.map +1 -0
  13. package/dist/auth/index.d.ts +6 -0
  14. package/dist/auth/index.d.ts.map +1 -0
  15. package/dist/auth/index.js +5 -0
  16. package/dist/auth/index.js.map +1 -0
  17. package/dist/auth/middleware.d.ts +31 -0
  18. package/dist/auth/middleware.d.ts.map +1 -0
  19. package/dist/auth/middleware.js +92 -0
  20. package/dist/auth/middleware.js.map +1 -0
  21. package/dist/auth/types.d.ts +54 -0
  22. package/dist/auth/types.d.ts.map +1 -0
  23. package/dist/auth/types.js +2 -0
  24. package/dist/auth/types.js.map +1 -0
  25. package/dist/core/bootstrap.d.ts.map +1 -1
  26. package/dist/core/bootstrap.js +5 -2
  27. package/dist/core/bootstrap.js.map +1 -1
  28. package/dist/core/types.d.ts +8 -2
  29. package/dist/core/types.d.ts.map +1 -1
  30. package/dist/http/route-helpers.d.ts +43 -0
  31. package/dist/http/route-helpers.d.ts.map +1 -1
  32. package/dist/http/route-helpers.js +90 -40
  33. package/dist/http/route-helpers.js.map +1 -1
  34. package/dist/index.d.ts +8 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +7 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/jobs/define-job.d.ts +34 -2
  39. package/dist/jobs/define-job.d.ts.map +1 -1
  40. package/dist/jobs/define-job.js.map +1 -1
  41. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts +75 -0
  42. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -0
  43. package/dist/jobs/drivers/eventbridge-scheduler-driver.js +135 -0
  44. package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -0
  45. package/dist/jobs/drivers/mock-driver.d.ts +45 -10
  46. package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
  47. package/dist/jobs/drivers/mock-driver.js +36 -17
  48. package/dist/jobs/drivers/mock-driver.js.map +1 -1
  49. package/dist/jobs/drivers/sqs-driver.d.ts +26 -19
  50. package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
  51. package/dist/jobs/drivers/sqs-driver.js +54 -69
  52. package/dist/jobs/drivers/sqs-driver.js.map +1 -1
  53. package/dist/jobs/errors.d.ts +8 -4
  54. package/dist/jobs/errors.d.ts.map +1 -1
  55. package/dist/jobs/errors.js +13 -7
  56. package/dist/jobs/errors.js.map +1 -1
  57. package/dist/jobs/index.d.ts +4 -3
  58. package/dist/jobs/index.d.ts.map +1 -1
  59. package/dist/jobs/index.js +3 -2
  60. package/dist/jobs/index.js.map +1 -1
  61. package/dist/jobs/job-registry.d.ts +4 -4
  62. package/dist/jobs/job-registry.d.ts.map +1 -1
  63. package/dist/jobs/job-registry.js.map +1 -1
  64. package/dist/jobs/job-service.js +1 -1
  65. package/dist/jobs/job-service.js.map +1 -1
  66. package/dist/jobs/schedule-constants.d.ts +0 -4
  67. package/dist/jobs/schedule-constants.d.ts.map +1 -1
  68. package/dist/jobs/schedule-constants.js +0 -4
  69. package/dist/jobs/schedule-constants.js.map +1 -1
  70. package/dist/jobs/scheduler.d.ts +1 -1
  71. package/dist/jobs/scheduler.d.ts.map +1 -1
  72. package/dist/jobs/scheduler.js +46 -10
  73. package/dist/jobs/scheduler.js.map +1 -1
  74. package/dist/jobs/types.d.ts +59 -50
  75. package/dist/jobs/types.d.ts.map +1 -1
  76. package/dist/jobs/utils.d.ts +0 -9
  77. package/dist/jobs/utils.d.ts.map +1 -1
  78. package/dist/jobs/utils.js +3 -23
  79. package/dist/jobs/utils.js.map +1 -1
  80. package/dist/jobs/worker.d.ts +2 -3
  81. package/dist/jobs/worker.d.ts.map +1 -1
  82. package/dist/jobs/worker.js +183 -82
  83. package/dist/jobs/worker.js.map +1 -1
  84. package/dist/list-query/casl.d.ts +18 -19
  85. package/dist/list-query/casl.d.ts.map +1 -1
  86. package/dist/list-query/casl.js +40 -46
  87. package/dist/list-query/casl.js.map +1 -1
  88. package/dist/uploads/file-upload.d.ts +44 -0
  89. package/dist/uploads/file-upload.d.ts.map +1 -0
  90. package/dist/uploads/file-upload.js +145 -0
  91. package/dist/uploads/file-upload.js.map +1 -0
  92. package/dist/uploads/index.d.ts +6 -0
  93. package/dist/uploads/index.d.ts.map +1 -0
  94. package/dist/uploads/index.js +7 -0
  95. package/dist/uploads/index.js.map +1 -0
  96. package/dist/uploads/uploads.service.d.ts +98 -0
  97. package/dist/uploads/uploads.service.d.ts.map +1 -0
  98. package/dist/uploads/uploads.service.js +134 -0
  99. package/dist/uploads/uploads.service.js.map +1 -0
  100. package/dist/uploads/validators.d.ts +41 -0
  101. package/dist/uploads/validators.d.ts.map +1 -0
  102. package/dist/uploads/validators.js +94 -0
  103. package/dist/uploads/validators.js.map +1 -0
  104. package/package.json +34 -3
  105. package/dist/email/compiler/code-generator.d.ts +0 -11
  106. package/dist/email/compiler/code-generator.d.ts.map +0 -1
  107. package/dist/email/compiler/code-generator.js +0 -319
  108. package/dist/email/compiler/code-generator.js.map +0 -1
@@ -1,17 +1,31 @@
1
1
  import { asValue, createContainer, InjectionMode } from 'awilix';
2
- import { safeParse } from 'valibot';
2
+ import { object, optional, record, safeParse, string, unknown } from 'valibot';
3
3
  import { collectModules, registerModuleProviders, validateNoCycles } from '../core/bootstrap.js';
4
4
  import { createLogger } from '../utils/logger.js';
5
- import { InvalidJobPayloadError, PermanentJobError, TransientJobError } from './errors.js';
5
+ import { InvalidJobPayloadError, PermanentJobError, RetryExhaustedError, TransientJobError, } from './errors.js';
6
6
  import { createJobRegistry } from './job-registry.js';
7
- import { MAX_SQS_DELAY_SECONDS, RUN_AT_METADATA_KEY } from './schedule-constants.js';
7
+ import { generateJobId } from './utils.js';
8
+ /**
9
+ * Default maximum retry attempts before a job is considered dead.
10
+ */
11
+ const DEFAULT_MAX_ATTEMPTS = 25;
12
+ /**
13
+ * Valibot schema for validating SQS job message structure.
14
+ */
15
+ const JobMessageSchema = object({
16
+ jobName: string(),
17
+ payload: optional(unknown()),
18
+ jobId: optional(string()),
19
+ enqueuedAt: optional(string()),
20
+ metadata: optional(record(string(), string())),
21
+ });
8
22
  /**
9
23
  * Bootstrap a worker Lambda handler for processing jobs.
10
24
  */
11
25
  export function bootstrapWorker(config) {
12
26
  const logger = config.logger ?? createLogger('JobsWorker');
13
27
  const statePromise = buildWorkerState(config.module, logger);
14
- return async (event, _ctx) => {
28
+ return async (event, ctx) => {
15
29
  const { container, registry } = await statePromise;
16
30
  if (isSQSEvent(event)) {
17
31
  const batchItemFailures = [];
@@ -22,7 +36,6 @@ export function bootstrapWorker(config) {
22
36
  moduleContainer: container,
23
37
  hooks: config.hooks,
24
38
  logger,
25
- driver: config.driver,
26
39
  });
27
40
  }
28
41
  catch (_error) {
@@ -37,13 +50,15 @@ export function bootstrapWorker(config) {
37
50
  if (!jobName) {
38
51
  throw new Error('Job name is required for non-SQS invocation');
39
52
  }
53
+ // Extract attempt number from Lambda context retry metadata if available
54
+ const attemptNumber = extractAttemptNumber(ctx);
40
55
  await executeJob({
41
56
  jobName,
42
- jobId: 'event',
57
+ jobId: `eb-${generateJobId()}`,
43
58
  payload,
44
- attemptNumber: 1,
59
+ attemptNumber,
45
60
  enqueuedAt: new Date(),
46
- }, { registry, moduleContainer: container, hooks: config.hooks, logger, driver: config.driver });
61
+ }, { registry, moduleContainer: container, hooks: config.hooks, logger });
47
62
  return { success: true };
48
63
  };
49
64
  }
@@ -104,17 +119,23 @@ async function processRecord(record, context) {
104
119
  if (!parsed || typeof parsed !== 'object') {
105
120
  throw new Error('Invalid job message payload');
106
121
  }
122
+ // Validate message structure using Valibot
123
+ const validationResult = safeParse(JobMessageSchema, parsed);
124
+ if (!validationResult.success) {
125
+ context.logger.error('Invalid job message structure', {
126
+ messageId: record.messageId,
127
+ issues: validationResult.issues,
128
+ });
129
+ throw new Error('Invalid job message structure');
130
+ }
107
131
  const parsedMessage = parsed;
108
132
  const jobName = parsedMessage.jobName;
109
133
  const payload = parsedMessage.payload;
110
134
  const jobId = parsedMessage.jobId ?? record.messageId;
111
135
  const enqueuedAt = parsedMessage.enqueuedAt ? new Date(parsedMessage.enqueuedAt) : new Date();
112
136
  const metadata = parsedMessage.metadata;
113
- if (!jobName) {
114
- throw new Error('Job name is required');
115
- }
116
137
  const attemptNumber = record.attributes?.ApproximateReceiveCount
117
- ? Number.parseInt(record.attributes.ApproximateReceiveCount, 10)
138
+ ? Number.parseInt(record.attributes.ApproximateReceiveCount, 10) || 1
118
139
  : 1;
119
140
  const execution = {
120
141
  jobId,
@@ -128,18 +149,11 @@ async function processRecord(record, context) {
128
149
  }
129
150
  async function executeJob(execution, context) {
130
151
  const job = context.registry.getOrThrow(execution.jobName);
131
- if (await rescheduleIfNotDue(execution, job, context)) {
132
- return;
133
- }
152
+ // Normalize retry configuration
153
+ const retryConfig = normalizeRetryConfig(job.retry);
134
154
  const scope = context.moduleContainer.createScope();
135
155
  const services = scope.cradle;
136
- let jobLogger = context.logger;
137
- if (context.moduleContainer.hasRegistration('logger')) {
138
- const baseLogger = context.moduleContainer.resolve('logger');
139
- jobLogger = baseLogger?.child
140
- ? baseLogger.child({ jobId: execution.jobId, jobName: execution.jobName })
141
- : baseLogger;
142
- }
156
+ const jobLogger = resolveJobLogger(context, execution);
143
157
  const jobContext = {
144
158
  services,
145
159
  jobId: execution.jobId,
@@ -159,85 +173,151 @@ async function executeJob(execution, context) {
159
173
  await context.hooks?.onJobComplete?.(execution, jobContext);
160
174
  }
161
175
  catch (error) {
162
- const err = error;
163
- await context.hooks?.onJobFailed?.(execution, jobContext, err);
164
- if (err instanceof PermanentJobError) {
165
- jobLogger?.error('Job permanently failed', { err });
166
- await context.hooks?.onJobDeadLetter?.(execution, jobContext, err);
167
- return;
168
- }
169
- if (err instanceof InvalidJobPayloadError) {
170
- jobLogger?.warn('Invalid job payload, retrying until DLQ', {
171
- err,
172
- jobName: execution.jobName,
173
- jobId: execution.jobId,
174
- attemptNumber: execution.attemptNumber,
175
- });
176
- throw err;
177
- }
178
- if (err instanceof TransientJobError) {
179
- jobLogger?.warn('Job transient failure, retrying', { err, retryAfter: err.retryAfter });
180
- }
181
- throw err;
176
+ await handleJobError(error, execution, jobContext, context, retryConfig, jobLogger);
182
177
  }
183
178
  finally {
184
179
  await scope.dispose();
185
180
  }
186
181
  }
187
- async function rescheduleIfNotDue(execution, job, context) {
188
- const runAtValue = execution.metadata?.[RUN_AT_METADATA_KEY];
189
- if (!runAtValue) {
190
- return false;
182
+ /**
183
+ * Resolve the logger for job execution, scoped to the job if possible.
184
+ */
185
+ function resolveJobLogger(context, execution) {
186
+ if (!context.moduleContainer.hasRegistration('logger')) {
187
+ return context.logger;
188
+ }
189
+ const baseLogger = context.moduleContainer.resolve('logger');
190
+ return baseLogger?.child
191
+ ? baseLogger.child({ jobId: execution.jobId, jobName: execution.jobName })
192
+ : baseLogger;
193
+ }
194
+ /**
195
+ * Handle job execution errors with retry logic.
196
+ */
197
+ async function handleJobError(err, execution, jobContext, context, retryConfig, jobLogger) {
198
+ const { maxAttempts, dead: sendToDead } = retryConfig;
199
+ // PermanentJobError: Never retry, go straight to DLQ
200
+ if (err instanceof PermanentJobError) {
201
+ jobLogger?.error('Job permanently failed', { err });
202
+ await context.hooks?.onJobFailed?.(execution, jobContext, err);
203
+ await context.hooks?.onJobDeadLetter?.(execution, jobContext, err);
204
+ throw err;
191
205
  }
192
- const runAt = new Date(runAtValue);
193
- if (Number.isNaN(runAt.getTime())) {
194
- context.logger.warn('Ignoring invalid runAt metadata; executing immediately', {
206
+ // No retries configured: discard the job silently
207
+ if (maxAttempts === false) {
208
+ jobLogger?.warn('Job failed with retries disabled, discarding', {
209
+ err,
195
210
  jobName: execution.jobName,
196
211
  jobId: execution.jobId,
197
- runAt: runAtValue,
198
212
  });
199
- return false;
213
+ await context.hooks?.onJobFailed?.(execution, jobContext, err);
214
+ // Return without throwing to acknowledge and discard the message
215
+ return undefined;
200
216
  }
201
- const remainingMs = runAt.getTime() - Date.now();
202
- if (remainingMs <= 1000) {
203
- return false;
217
+ // Check if retries are exhausted
218
+ if (execution.attemptNumber >= maxAttempts) {
219
+ return handleExhaustedRetries(err, execution, jobContext, context, maxAttempts, sendToDead, jobLogger);
204
220
  }
205
- const driver = context.driver;
206
- if (!driver || (!driver.enqueueIn && !driver.enqueueAt)) {
207
- context.logger.warn('Job scheduled in future but worker has no driver; executing now', {
221
+ // Normal failure: log and throw to trigger SQS retry
222
+ await context.hooks?.onJobFailed?.(execution, jobContext, err);
223
+ logRetryableError(err, execution, maxAttempts, jobLogger);
224
+ throw err;
225
+ }
226
+ /**
227
+ * Handle the case when all retries are exhausted.
228
+ */
229
+ async function handleExhaustedRetries(err, execution, jobContext, context, maxAttempts, sendToDead, jobLogger) {
230
+ const exhaustedError = new RetryExhaustedError(execution.jobName, execution.attemptNumber, maxAttempts, err);
231
+ jobLogger?.error('Job retries exhausted', {
232
+ err,
233
+ attemptNumber: execution.attemptNumber,
234
+ maxAttempts,
235
+ cause: err.message,
236
+ });
237
+ await context.hooks?.onJobFailed?.(execution, jobContext, err);
238
+ await context.hooks?.onJobDeadLetter?.(execution, jobContext, exhaustedError);
239
+ if (!sendToDead) {
240
+ jobLogger?.info('Job discarded (dead: false)', {
208
241
  jobName: execution.jobName,
209
242
  jobId: execution.jobId,
210
- runAt: runAtValue,
211
243
  });
212
- return false;
244
+ // Return without throwing to discard
245
+ return undefined;
213
246
  }
214
- const delaySeconds = Math.min(MAX_SQS_DELAY_SECONDS, Math.max(1, Math.floor(remainingMs / 1000)));
215
- const message = {
216
- jobName: job.name,
217
- payload: execution.payload,
218
- queue: job.queue,
219
- jobId: execution.jobId,
220
- metadata: {
221
- ...execution.metadata,
222
- [RUN_AT_METADATA_KEY]: runAtValue,
223
- },
224
- };
225
- if (driver.enqueueIn) {
226
- await driver.enqueueIn(message, delaySeconds);
247
+ throw exhaustedError;
248
+ }
249
+ /**
250
+ * Log a retriable error with appropriate context.
251
+ */
252
+ function logRetryableError(err, execution, maxAttempts, jobLogger) {
253
+ if (err instanceof InvalidJobPayloadError) {
254
+ jobLogger?.warn('Invalid job payload, retrying until DLQ', {
255
+ err,
256
+ jobName: execution.jobName,
257
+ jobId: execution.jobId,
258
+ attemptNumber: execution.attemptNumber,
259
+ maxAttempts,
260
+ });
227
261
  }
228
- else if (driver.enqueueAt) {
229
- await driver.enqueueAt(message, runAt);
262
+ else if (err instanceof TransientJobError) {
263
+ jobLogger?.warn('Job transient failure, retrying', {
264
+ err,
265
+ retryAfter: err.retryAfter,
266
+ attemptNumber: execution.attemptNumber,
267
+ maxAttempts,
268
+ });
269
+ }
270
+ else {
271
+ jobLogger?.warn('Job failed, will retry', {
272
+ err,
273
+ attemptNumber: execution.attemptNumber,
274
+ maxAttempts,
275
+ remainingAttempts: maxAttempts - execution.attemptNumber,
276
+ });
230
277
  }
231
- context.logger.info('Deferred job that is not due yet', {
232
- jobName: execution.jobName,
233
- jobId: execution.jobId,
234
- runAt: runAtValue,
235
- delaySeconds,
236
- });
237
- return true;
238
278
  }
279
+ /**
280
+ * Normalize retry configuration to a consistent format.
281
+ * Zero or negative maxAttempts are treated as "no retries" (same as retry: false).
282
+ */
283
+ function normalizeRetryConfig(config) {
284
+ if (config === false) {
285
+ return { maxAttempts: false, dead: false };
286
+ }
287
+ if (typeof config === 'number') {
288
+ // Treat zero or negative as "no retries"
289
+ if (config <= 0) {
290
+ return { maxAttempts: false, dead: false };
291
+ }
292
+ return { maxAttempts: config, dead: true };
293
+ }
294
+ if (config === undefined) {
295
+ return { maxAttempts: DEFAULT_MAX_ATTEMPTS, dead: true };
296
+ }
297
+ // Handle object config with potential invalid maxAttempts
298
+ const maxAttempts = config.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
299
+ if (maxAttempts <= 0) {
300
+ return { maxAttempts: false, dead: false };
301
+ }
302
+ return {
303
+ maxAttempts,
304
+ dead: config.dead ?? true,
305
+ };
306
+ }
307
+ /**
308
+ * Type guard to check if an event is an SQS event.
309
+ * Validates presence of Records array with SQS-specific properties.
310
+ */
239
311
  function isSQSEvent(event) {
240
- return Boolean(event?.Records);
312
+ const maybeEvent = event;
313
+ if (!Array.isArray(maybeEvent?.Records) || maybeEvent.Records.length === 0) {
314
+ return false;
315
+ }
316
+ const firstRecord = maybeEvent.Records[0];
317
+ // Check for SQS-specific properties to distinguish from other AWS event types
318
+ return (typeof firstRecord.messageId === 'string' &&
319
+ typeof firstRecord.body === 'string' &&
320
+ typeof firstRecord.receiptHandle === 'string');
241
321
  }
242
322
  function extractJobName(event) {
243
323
  if (typeof event.jobName === 'string')
@@ -257,4 +337,25 @@ function extractPayload(event) {
257
337
  return detail.payload;
258
338
  return undefined;
259
339
  }
340
+ /**
341
+ * Extract attempt number from Lambda context.
342
+ * For EventBridge retries, checks for retry metadata in the context.
343
+ */
344
+ function extractAttemptNumber(ctx) {
345
+ if (!ctx)
346
+ return 1;
347
+ // EventBridge retry information may be available in client context
348
+ // or through environment variables in some configurations
349
+ try {
350
+ const clientContext = ctx
351
+ .clientContext;
352
+ if (clientContext?.custom?.retryAttempt !== undefined) {
353
+ return clientContext.custom.retryAttempt + 1;
354
+ }
355
+ }
356
+ catch {
357
+ // Ignore parsing errors
358
+ }
359
+ return 1;
360
+ }
260
361
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/jobs/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/jobs/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEjG,OAAO,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC;;GAEG;AACH,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE;IACjB,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC5B,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC9B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;CAC/C,CAAC,CAAC;AA+BH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7D,OAAO,KAAK,EACV,KAA6E,EAC7E,GAAa,EACb,EAAE;QACF,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC;QAEnD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,iBAAiB,GAA0C,EAAE,CAAC;YAEpE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,aAAa,CAAC,MAAM,EAAE;wBAC1B,QAAQ;wBACR,eAAe,EAAE,SAAS;wBAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM;qBACP,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,MAAM,EAAE,CAAC;oBAChB,iBAAiB,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;YAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAC/B,CAAC;QAED,uDAAuD;QACvD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAgC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,cAAc,CAAC,KAAgC,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,yEAAyE;QACzE,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAEhD,MAAM,UAAU,CACd;YACE,OAAO;YACP,KAAK,EAAE,MAAM,aAAa,EAAE,EAAE;YAC9B,OAAO;YACP,aAAa;YACb,UAAU,EAAE,IAAI,IAAI,EAAE;SACvB,EACD,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CACtE,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,SAA6C,EAC7C,KAAe,EACf,MAAc;IAEd,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtE,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7C,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAoB,EAAE,MAAc;IAClE,MAAM,SAAS,GAAG,eAAe,CAAC;QAChC,aAAa,EAAE,aAAa,CAAC,KAAK;QAClC,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1C,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAE7B,qBAAqB;IACrB,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9D,cAAc,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,iDAAiD;IACjD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,qBAAqB,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAE9C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAuB;IAC/C,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3B,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAiB,EAAE,OAAuB;IACrE,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;YACvD,KAAK;YACL,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC,CAAC;QACH,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,2CAA2C;IAC3C,MAAM,gBAAgB,GAAG,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;YACpD,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,gBAAgB,CAAC,MAAM;SAChC,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,aAAa,GAAG,MAMrB,CAAC;IAEF,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IACtC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IACtC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC,SAAS,CAAC;IACtD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9F,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;IAExC,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,EAAE,uBAAuB;QAC9D,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,uBAAuB,EAAE,EAAE,CAAC,IAAI,CAAC;QACrE,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,SAAS,GAAiB;QAC9B,KAAK;QACL,OAAO;QACP,OAAO;QACP,aAAa;QACb,UAAU;QACV,QAAQ;KACT,CAAC;IAEF,MAAM,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,SAAuB,EAAE,OAAuB;IACxE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAE3D,gCAAgC;IAChC,MAAM,WAAW,GAAG,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAiC,CAAC;IAEzD,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAe;QAC7B,QAAQ;QACR,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,aAAa,EAAE,SAAS,CAAC,aAAa;QACtC,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,MAAM,EAAE,SAAS;KAClB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAEzD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjD,MAAM,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,CAAC,KAAc,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC/F,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAuB,EAAE,SAAuB;IACxE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAS,QAAQ,CAAC,CAAC;IACrE,OAAO,UAAU,EAAE,KAAK;QACtB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;QAC1E,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,GAAU,EACV,SAAuB,EACvB,UAAsB,EACtB,OAAuB,EACvB,WAA2D,EAC3D,SAA6B;IAE7B,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;IAEtD,qDAAqD;IACrD,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;QACrC,SAAS,EAAE,KAAK,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,MAAM,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QACnE,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,kDAAkD;IAClD,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QAC1B,SAAS,EAAE,IAAI,CAAC,8CAA8C,EAAE;YAC9D,GAAG;YACH,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAC/D,iEAAiE;QACjE,OAAO,SAAkB,CAAC;IAC5B,CAAC;IAED,iCAAiC;IACjC,IAAI,SAAS,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;QAC3C,OAAO,sBAAsB,CAC3B,GAAG,EACH,SAAS,EACT,UAAU,EACV,OAAO,EACP,WAAW,EACX,UAAU,EACV,SAAS,CACV,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,MAAM,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAC/D,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,GAAG,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,GAAU,EACV,SAAuB,EACvB,UAAsB,EACtB,OAAuB,EACvB,WAAmB,EACnB,UAAmB,EACnB,SAA6B;IAE7B,MAAM,cAAc,GAAG,IAAI,mBAAmB,CAC5C,SAAS,CAAC,OAAO,EACjB,SAAS,CAAC,aAAa,EACvB,WAAW,EACX,GAAG,CACJ,CAAC;IAEF,SAAS,EAAE,KAAK,CAAC,uBAAuB,EAAE;QACxC,GAAG;QACH,aAAa,EAAE,SAAS,CAAC,aAAa;QACtC,WAAW;QACX,KAAK,EAAE,GAAG,CAAC,OAAO;KACnB,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAC/D,MAAM,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IAE9E,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC,6BAA6B,EAAE;YAC7C,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC,CAAC;QACH,qCAAqC;QACrC,OAAO,SAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,cAAc,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,GAAU,EACV,SAAuB,EACvB,WAAmB,EACnB,SAA6B;IAE7B,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;QAC1C,SAAS,EAAE,IAAI,CAAC,yCAAyC,EAAE;YACzD,GAAG;YACH,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;QAC5C,SAAS,EAAE,IAAI,CAAC,iCAAiC,EAAE;YACjD,GAAG;YACH,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,SAAS,EAAE,IAAI,CAAC,wBAAwB,EAAE;YACxC,GAAG;YACH,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,WAAW;YACX,iBAAiB,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa;SACzD,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,MAAgD;IAI5E,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,yCAAyC;QACzC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAChB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IAED,0DAA0D;IAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAC/D,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,WAAW;QACX,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;KAC1B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,KAAc;IAChC,MAAM,UAAU,GAAG,KAA6B,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1C,8EAA8E;IAC9E,OAAO,CACL,OAAO,WAAW,CAAC,SAAS,KAAK,QAAQ;QACzC,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ;QACpC,OAAO,WAAW,CAAC,aAAa,KAAK,QAAQ,CAC9C,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAA8B;IACpD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,MAA6C,CAAC;IACnE,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IACxE,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAClE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,KAA8B;IACpD,IAAI,SAAS,IAAI,KAAK;QAAE,OAAQ,KAA8B,CAAC,OAAO,CAAC;IACvE,MAAM,MAAM,GAAG,KAAK,CAAC,MAA6C,CAAC;IACnE,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAQ,MAA+B,CAAC,OAAO,CAAC;IACnF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,GAAa;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IACnB,mEAAmE;IACnE,0DAA0D;IAC1D,IAAI,CAAC;QACH,MAAM,aAAa,GAAI,GAAkE;aACtF,aAAa,CAAC;QACjB,IAAI,aAAa,EAAE,MAAM,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;YACtD,OAAO,aAAa,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -1,37 +1,36 @@
1
- import type { ListQueryBuilder } from './builder.js';
1
+ export type CaslAccessibleBy = (ability: any, action?: string) => Record<string, Record<string, unknown>>;
2
2
  /**
3
- * Create a CASL scope function that can be applied to a ListQueryBuilder
4
- *
5
- * @param ability - The CASL ability instance (any object that works with @casl/prisma's accessibleBy)
6
- * @param subject - The Prisma model name (e.g., 'User', 'Organization')
7
- * @returns A function that applies the CASL conditions to a builder
3
+ * Register CASL integration dependencies.
4
+ * This must be called at application startup if you use CASL features.
8
5
  *
9
6
  * @example
10
7
  * ```typescript
11
- * import { PureAbility } from '@casl/ability';
12
- * const scope = await createCaslScope(ability, 'User');
13
- * const params = createListQuery({ filter: UserFilterSchema })
14
- * .parse(query)
15
- * .apply(scope)
16
- * .build();
8
+ * import { accessibleBy } from '@casl/prisma';
9
+ * import { registerCasl } from 'glasswork';
10
+ *
11
+ * registerCasl({ accessibleBy });
17
12
  * ```
18
13
  */
19
- export declare function createCaslScope<TAbility = any>(ability: TAbility, subject: string): Promise<(builder: ListQueryBuilder<any, any>) => ListQueryBuilder<any, any>>;
14
+ export declare function registerCasl(options: {
15
+ accessibleBy: CaslAccessibleBy;
16
+ }): void;
20
17
  /**
21
18
  * Create a CASL scope helper that extracts ability from context
22
19
  *
20
+ * @param ability - The CASL ability instance
21
+ * @param action - The action to check ('read', 'update', etc.)
23
22
  * @param subject - The Prisma model name (e.g., 'User', 'Organization')
24
- * @returns An async function that takes a builder and ability, and applies the CASL conditions
23
+ * @returns The CASL conditions object (Prisma where clause)
25
24
  *
26
25
  * @example
27
26
  * ```typescript
28
- * import { PureAbility } from '@casl/ability';
29
- * const scopeUsers = withCaslScope('User');
30
- * const params = await createListQuery({ filter: UserFilterSchema })
27
+ * import { accessibleBy } from '@casl/prisma';
28
+ *
29
+ * const params = createListQuery({ filter: UserFilterSchema })
31
30
  * .parse(query)
32
- * .applyAsync(scopeUsers, ability)
31
+ * .scope(withCaslScope(ability, 'read', 'User'))
33
32
  * .build();
34
33
  * ```
35
34
  */
36
- export declare function withCaslScope(subject: string): <TAbility = any>(builder: ListQueryBuilder<any, any>, ability: TAbility) => Promise<ListQueryBuilder<any, any>>;
35
+ export declare function withCaslScope<TAbility = any>(ability: TAbility, action: string, subject: string): Record<string, unknown>;
37
36
  //# sourceMappingURL=casl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"casl.d.ts","sourceRoot":"","sources":["../../src/list-query/casl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAkBrD;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAAsB,eAAe,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,qBAKrE,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,iCAC5C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,IAE7B,QAAQ,GAAG,GAAG,EAE1B,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EACnC,SAAS,QAAQ,yCAMpB"}
1
+ {"version":3,"file":"casl.d.ts","sourceRoot":"","sources":["../../src/list-query/casl.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,gBAAgB,GAAG,CAE7B,OAAO,EAAE,GAAG,EACZ,MAAM,CAAC,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAU7C;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE;IAAE,YAAY,EAAE,gBAAgB,CAAA;CAAE,QAEvE;AAeD;;;;;;;;;;;;;;;;;GAiBG;AAEH,wBAAgB,aAAa,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,2BAY/F"}
@@ -1,66 +1,60 @@
1
+ const config = {
2
+ accessibleBy: null,
3
+ };
1
4
  /**
2
- * Dynamically import @casl/prisma to keep it as a truly optional dependency.
3
- * Only loaded when CASL scope functions are actually used.
4
- */
5
- async function getAccessibleBy() {
6
- try {
7
- const { accessibleBy } = await import('@casl/prisma');
8
- return accessibleBy;
9
- }
10
- catch {
11
- throw new Error('@casl/prisma package not found. Install with: npm install @casl/ability @casl/prisma\n' +
12
- 'Note: @casl/ability is required as a peer dependency of @casl/prisma.');
13
- }
14
- }
15
- /**
16
- * Create a CASL scope function that can be applied to a ListQueryBuilder
17
- *
18
- * @param ability - The CASL ability instance (any object that works with @casl/prisma's accessibleBy)
19
- * @param subject - The Prisma model name (e.g., 'User', 'Organization')
20
- * @returns A function that applies the CASL conditions to a builder
5
+ * Register CASL integration dependencies.
6
+ * This must be called at application startup if you use CASL features.
21
7
  *
22
8
  * @example
23
9
  * ```typescript
24
- * import { PureAbility } from '@casl/ability';
25
- * const scope = await createCaslScope(ability, 'User');
26
- * const params = createListQuery({ filter: UserFilterSchema })
27
- * .parse(query)
28
- * .apply(scope)
29
- * .build();
10
+ * import { accessibleBy } from '@casl/prisma';
11
+ * import { registerCasl } from 'glasswork';
12
+ *
13
+ * registerCasl({ accessibleBy });
30
14
  * ```
31
15
  */
32
- // biome-ignore lint/suspicious/noExplicitAny: Ability type is generic to work with any CASL ability instance. The actual type checking happens at runtime when accessibleBy is called.
33
- export async function createCaslScope(ability, subject) {
34
- const accessibleBy = await getAccessibleBy();
35
- // biome-ignore lint/suspicious/noExplicitAny: CASL's accessibleBy function has type constraints that don't perfectly align with generic ability types. This cast is necessary for runtime compatibility.
36
- const conditions = accessibleBy(ability)[subject];
37
- // biome-ignore lint/suspicious/noExplicitAny: Return type must be generic to work with any ListQueryBuilder regardless of its schema types. This maintains maximum flexibility for consumers.
38
- return (builder) => builder.scope(conditions);
16
+ export function registerCasl(options) {
17
+ config.accessibleBy = options.accessibleBy;
18
+ }
19
+ function getAccessibleBy() {
20
+ if (!config.accessibleBy) {
21
+ throw new Error('CASL integration not configured. You must call registerCasl({ accessibleBy }) at application startup.\n' +
22
+ 'Example:\n' +
23
+ " import { accessibleBy } from '@casl/prisma';\n" +
24
+ " import { registerCasl } from 'glasswork';\n" +
25
+ ' registerCasl({ accessibleBy });');
26
+ }
27
+ return config.accessibleBy;
39
28
  }
40
29
  /**
41
30
  * Create a CASL scope helper that extracts ability from context
42
31
  *
32
+ * @param ability - The CASL ability instance
33
+ * @param action - The action to check ('read', 'update', etc.)
43
34
  * @param subject - The Prisma model name (e.g., 'User', 'Organization')
44
- * @returns An async function that takes a builder and ability, and applies the CASL conditions
35
+ * @returns The CASL conditions object (Prisma where clause)
45
36
  *
46
37
  * @example
47
38
  * ```typescript
48
- * import { PureAbility } from '@casl/ability';
49
- * const scopeUsers = withCaslScope('User');
50
- * const params = await createListQuery({ filter: UserFilterSchema })
39
+ * import { accessibleBy } from '@casl/prisma';
40
+ *
41
+ * const params = createListQuery({ filter: UserFilterSchema })
51
42
  * .parse(query)
52
- * .applyAsync(scopeUsers, ability)
43
+ * .scope(withCaslScope(ability, 'read', 'User'))
53
44
  * .build();
54
45
  * ```
55
46
  */
56
- export function withCaslScope(subject) {
57
- // biome-ignore lint/suspicious/noExplicitAny: Ability type is generic to work with any CASL ability instance. The actual type checking happens at runtime when accessibleBy is called.
58
- return async (
59
- // biome-ignore lint/suspicious/noExplicitAny: ListQueryBuilder must be generic to work with any schema types. This maintains maximum flexibility for consumers.
60
- builder, ability) => {
61
- const accessibleBy = await getAccessibleBy();
62
- // biome-ignore lint/suspicious/noExplicitAny: CASL's accessibleBy function has type constraints that don't perfectly align with generic ability types. This cast is necessary for runtime compatibility.
63
- return builder.scope(accessibleBy(ability)[subject]);
64
- };
47
+ // biome-ignore lint/suspicious/noExplicitAny: Ability type is generic
48
+ export function withCaslScope(ability, action, subject) {
49
+ const accessibleBy = getAccessibleBy();
50
+ const conditions = accessibleBy(ability, action);
51
+ if (!(subject in conditions)) {
52
+ // Return empty object or undefined? Prisma generally assumes conditions exist if asked.
53
+ // If we assume accessibleBy returns all possible subjects, then missing key might be fine or error.
54
+ // Let's just return what is there, which is undefined if missing. The types expect Record<string, unknown>.
55
+ // Casting to allow potentially undefined access if user made a typo.
56
+ return conditions[subject];
57
+ }
58
+ return conditions[subject];
65
59
  }
66
60
  //# sourceMappingURL=casl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"casl.js","sourceRoot":"","sources":["../../src/list-query/casl.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACtD,OAAO,YAAY,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,wFAAwF;YACtF,uEAAuE,CAC1E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,uLAAuL;AACvL,MAAM,CAAC,KAAK,UAAU,eAAe,CAAiB,OAAiB,EAAE,OAAe;IACtF,MAAM,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;IAC7C,yMAAyM;IACzM,MAAM,UAAU,GAAG,YAAY,CAAC,OAAc,CAAC,CAAC,OAAO,CAAC,CAAC;IACzD,8LAA8L;IAC9L,OAAO,CAAC,OAAmC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,uLAAuL;IACvL,OAAO,KAAK;IACV,gKAAgK;IAChK,OAAmC,EACnC,OAAiB,EACjB,EAAE;QACF,MAAM,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;QAC7C,yMAAyM;QACzM,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"casl.js","sourceRoot":"","sources":["../../src/list-query/casl.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,GAAe;IACzB,YAAY,EAAE,IAAI;CACnB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,OAA2C;IACtE,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;AAC7C,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,yGAAyG;YACvG,YAAY;YACZ,kDAAkD;YAClD,+CAA+C;YAC/C,mCAAmC,CACtC,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,sEAAsE;AACtE,MAAM,UAAU,aAAa,CAAiB,OAAiB,EAAE,MAAc,EAAE,OAAe;IAC9F,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEjD,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC;QAC7B,wFAAwF;QACxF,oGAAoG;QACpG,4GAA4G;QAC5G,qEAAqE;QACrE,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,44 @@
1
+ export interface UploadPathConfig {
2
+ /** Directory path for the file (e.g., 'uploads/avatars/user123/abc123') */
3
+ readonly dir: string;
4
+ /** Sanitized file name (e.g., 'photo.jpg') */
5
+ readonly fileName: string;
6
+ }
7
+ /**
8
+ * Creates an upload configuration object for presigned URL generation.
9
+ * Validates IDs and generates a unique random folder to prevent overwrites.
10
+ *
11
+ * @param prefix - Upload folder prefix (e.g., 'avatars', 'documents')
12
+ * @param ids - Array of IDs to include in path (e.g., [userId] or [clientId, orderId])
13
+ * @param fileName - Sanitized filename (validate with sanitizedFileName schema first)
14
+ * @returns Configuration object with dir and fileName properties
15
+ * @throws BadRequestException if prefix is empty or IDs contain invalid characters
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // In route handler:
20
+ * const config = createUploadConfig('avatars', [user.id], query.name);
21
+ * const result = await uploadsService.getSignedUploadUrl(config);
22
+ * // Result path: /uploads/avatars/{userId}/{randomId}/{filename}
23
+ * ```
24
+ */
25
+ export declare function createUploadConfig(prefix: string, ids: readonly string[], fileName: string): UploadPathConfig;
26
+ /**
27
+ * Asserts that a file path belongs to the specified prefix and IDs.
28
+ * Use this to validate delete operations - ensures users can only delete their own files.
29
+ *
30
+ * @param path - The file path to validate (e.g., from query.name)
31
+ * @param prefix - The expected upload prefix (e.g., 'avatars', 'documents')
32
+ * @param ids - The expected IDs in the path
33
+ * @param errorMessage - Custom error message (default: 'Invalid file path')
34
+ * @throws ForbiddenException if path doesn't match expected structure
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * // In delete handler:
39
+ * assertUploadPathOwnership(query.path, 'avatars', [user.id]);
40
+ * await uploadsService.deleteFile(query.path);
41
+ * ```
42
+ */
43
+ export declare function assertUploadPathOwnership(path: string, prefix: string, ids: readonly string[], errorMessage?: string): void;
44
+ //# sourceMappingURL=file-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload.d.ts","sourceRoot":"","sources":["../../src/uploads/file-upload.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAoBlB;AAsED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,YAAY,SAAsB,GACjC,IAAI,CAYN"}