@cerbos/orm-prisma 2.0.1 → 3.1.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 (38) hide show
  1. package/README.md +59 -2
  2. package/lib/{types/index.d.ts → index.d.ts} +3 -9
  3. package/lib/index.d.ts.map +1 -0
  4. package/lib/index.js +629 -0
  5. package/lib/index.js.map +1 -0
  6. package/package.json +47 -32
  7. package/src/generated/prisma/browser.ts +59 -0
  8. package/src/generated/prisma/client.ts +79 -0
  9. package/src/generated/prisma/commonInputTypes.ts +248 -0
  10. package/src/generated/prisma/enums.ts +15 -0
  11. package/src/generated/prisma/internal/class.ts +260 -0
  12. package/src/generated/prisma/internal/prismaNamespace.ts +1333 -0
  13. package/src/generated/prisma/internal/prismaNamespaceBrowser.ts +168 -0
  14. package/src/generated/prisma/models/Category.ts +1407 -0
  15. package/src/generated/prisma/models/Label.ts +1271 -0
  16. package/src/generated/prisma/models/NestedResource.ts +1557 -0
  17. package/src/generated/prisma/models/NextLevelNestedResource.ts +1332 -0
  18. package/src/generated/prisma/models/Resource.ts +2131 -0
  19. package/src/generated/prisma/models/SubCategory.ts +1407 -0
  20. package/src/generated/prisma/models/Tag.ts +1271 -0
  21. package/src/generated/prisma/models/User.ts +1498 -0
  22. package/src/generated/prisma/models.ts +19 -0
  23. package/src/generated/prisma-v6/client.d.ts +1 -0
  24. package/src/generated/prisma-v6/default.d.ts +1 -0
  25. package/src/generated/prisma-v6/edge.d.ts +1 -0
  26. package/src/generated/prisma-v6/index.d.ts +13639 -0
  27. package/src/generated/prisma-v6/runtime/index-browser.d.ts +370 -0
  28. package/src/generated/prisma-v6/runtime/library.d.ts +3982 -0
  29. package/src/generated/prisma-v6/wasm.d.ts +1 -0
  30. package/src/index.test.ts +4869 -0
  31. package/src/index.ts +954 -0
  32. package/src/test-setup.v6.ts +5 -0
  33. package/src/test-setup.v7.ts +7 -0
  34. package/lib/cjs/index.js +0 -517
  35. package/lib/cjs/index.js.map +0 -1
  36. package/lib/esm/index.js +0 -513
  37. package/lib/esm/index.js.map +0 -1
  38. package/lib/types/index.d.ts.map +0 -1
package/lib/index.js ADDED
@@ -0,0 +1,629 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlanKind = void 0;
4
+ exports.queryPlanToPrisma = queryPlanToPrisma;
5
+ const core_1 = require("@cerbos/core");
6
+ Object.defineProperty(exports, "PlanKind", { enumerable: true, get: function () { return core_1.PlanKind; } });
7
+ function isNamedOperand(operand) {
8
+ return "name" in operand && typeof operand.name === "string";
9
+ }
10
+ function isValueOperand(operand) {
11
+ return "value" in operand && operand.value !== undefined;
12
+ }
13
+ function isOperatorOperand(operand) {
14
+ return ("operator" in operand &&
15
+ typeof operand.operator === "string" &&
16
+ "operands" in operand &&
17
+ Array.isArray(operand.operands));
18
+ }
19
+ function assertDefined(value, message) {
20
+ if (value === undefined) {
21
+ throw new Error(message);
22
+ }
23
+ return value;
24
+ }
25
+ function getLeafField(path) {
26
+ const fieldName = path[path.length - 1];
27
+ if (!fieldName) {
28
+ throw new Error("Field path cannot be empty");
29
+ }
30
+ return fieldName;
31
+ }
32
+ function getFilterEntry(filter) {
33
+ const entry = Object.entries(filter)[0];
34
+ if (!entry) {
35
+ throw new Error("Filter must contain at least one entry");
36
+ }
37
+ return entry;
38
+ }
39
+ function isResolvedFieldReference(operand) {
40
+ return "path" in operand;
41
+ }
42
+ function isResolvedValue(operand) {
43
+ return "value" in operand;
44
+ }
45
+ /**
46
+ * Converts a Cerbos query plan to a Prisma filter.
47
+ */
48
+ function queryPlanToPrisma({ queryPlan, mapper = {}, }) {
49
+ switch (queryPlan.kind) {
50
+ case core_1.PlanKind.ALWAYS_ALLOWED:
51
+ return { kind: core_1.PlanKind.ALWAYS_ALLOWED };
52
+ case core_1.PlanKind.ALWAYS_DENIED:
53
+ return { kind: core_1.PlanKind.ALWAYS_DENIED };
54
+ case core_1.PlanKind.CONDITIONAL:
55
+ return {
56
+ kind: core_1.PlanKind.CONDITIONAL,
57
+ filters: buildPrismaFilterFromCerbosExpression(queryPlan.condition, mapper),
58
+ };
59
+ default:
60
+ throw Error(`Invalid query plan.`);
61
+ }
62
+ }
63
+ /**
64
+ * Resolves a field reference considering relations and nested fields.
65
+ */
66
+ function resolveFieldReference(reference, mapper) {
67
+ const parts = reference.split(".");
68
+ const config = typeof mapper === "function" ? mapper(reference) : mapper[reference];
69
+ let matchedPrefix = "";
70
+ let matchedConfig;
71
+ // If no direct match, look for partial matches
72
+ if (!config) {
73
+ for (let i = parts.length - 1; i >= 0; i--) {
74
+ const prefix = parts.slice(0, i + 1).join(".");
75
+ const prefixConfig = typeof mapper === "function" ? mapper(prefix) : mapper[prefix];
76
+ if (prefixConfig) {
77
+ matchedPrefix = prefix;
78
+ matchedConfig = prefixConfig;
79
+ break;
80
+ }
81
+ }
82
+ }
83
+ const activeConfig = config ?? matchedConfig;
84
+ // Handle relation mapping
85
+ if (activeConfig?.relation) {
86
+ const { name, type, fields } = activeConfig.relation;
87
+ const matchedParts = matchedPrefix ? matchedPrefix.split(".") : [];
88
+ const remainingParts = matchedPrefix
89
+ ? parts.slice(matchedParts.length)
90
+ : parts.slice(1);
91
+ let field;
92
+ const relations = [
93
+ {
94
+ name,
95
+ type,
96
+ field: activeConfig.relation.field,
97
+ nestedMapper: fields,
98
+ },
99
+ ];
100
+ // Process nested relations
101
+ if (fields && remainingParts.length > 0) {
102
+ let currentMapper = fields;
103
+ let currentParts = remainingParts;
104
+ while (currentParts.length > 0) {
105
+ if (!currentMapper) {
106
+ break;
107
+ }
108
+ const currentPart = currentParts[0];
109
+ if (!currentPart) {
110
+ break;
111
+ }
112
+ const nextConfig = currentMapper[currentPart];
113
+ if (nextConfig?.relation) {
114
+ relations.push({
115
+ name: nextConfig.relation.name,
116
+ type: nextConfig.relation.type,
117
+ field: nextConfig.relation.field,
118
+ nestedMapper: nextConfig.relation.fields,
119
+ });
120
+ currentMapper = nextConfig.relation.fields || {};
121
+ currentParts = currentParts.slice(1);
122
+ }
123
+ else {
124
+ const lastPart = currentParts[currentParts.length - 1];
125
+ if (!lastPart) {
126
+ break;
127
+ }
128
+ field = nextConfig?.field || lastPart;
129
+ break;
130
+ }
131
+ }
132
+ }
133
+ return { path: field ? [field] : remainingParts, relations };
134
+ }
135
+ // Simple field mapping
136
+ return { path: [activeConfig?.field || reference] };
137
+ }
138
+ /**
139
+ * Determines the appropriate Prisma operator based on relation type.
140
+ */
141
+ function getPrismaRelationOperator(relation) {
142
+ return relation.type === "one" ? "is" : "some";
143
+ }
144
+ /**
145
+ * Builds a nested relation filter for Prisma queries.
146
+ */
147
+ function buildNestedRelationFilter(relations, fieldFilter) {
148
+ if (relations.length === 0)
149
+ return fieldFilter;
150
+ let currentFilter = fieldFilter;
151
+ // Build nested structure from inside out
152
+ for (let i = relations.length - 1; i >= 0; i--) {
153
+ const relation = relations[i];
154
+ if (!relation) {
155
+ throw new Error("Relation mapping is missing");
156
+ }
157
+ const relationOperator = getPrismaRelationOperator(relation);
158
+ // Handle special case for the deepest relation
159
+ if (relation.field && i === relations.length - 1) {
160
+ const [key, filterValue] = getFilterEntry(currentFilter);
161
+ if (key === "NOT") {
162
+ currentFilter = { NOT: { [relation.field]: filterValue } };
163
+ }
164
+ else {
165
+ currentFilter = { [relation.field]: filterValue };
166
+ }
167
+ }
168
+ currentFilter = { [relation.name]: { [relationOperator]: currentFilter } };
169
+ }
170
+ return currentFilter;
171
+ }
172
+ /**
173
+ * Resolves a PlanExpressionOperand into a ResolvedOperand.
174
+ */
175
+ function resolveOperand(operand, mapper) {
176
+ if (isNamedOperand(operand)) {
177
+ return resolveFieldReference(operand.name, mapper);
178
+ }
179
+ else if (isValueOperand(operand)) {
180
+ return { value: operand.value };
181
+ }
182
+ else if (isOperatorOperand(operand)) {
183
+ const nestedResult = buildPrismaFilterFromCerbosExpression(operand, mapper);
184
+ return { value: nestedResult };
185
+ }
186
+ throw new Error("Operand must have name, value, or be an expression");
187
+ }
188
+ /**
189
+ * Creates a scoped mapper for collection operations
190
+ */
191
+ function createScopedMapper(collectionPath, variableName, fullMapper) {
192
+ return (key) => {
193
+ // If the key starts with the variable name, it's accessing the collection item
194
+ if (key.startsWith(variableName + ".")) {
195
+ const strippedKey = key.replace(variableName + ".", "");
196
+ const parts = strippedKey.split(".");
197
+ // Get the collection's relation config
198
+ const collectionConfig = typeof fullMapper === "function"
199
+ ? fullMapper(collectionPath)
200
+ : fullMapper[collectionPath];
201
+ if (collectionConfig?.relation?.fields) {
202
+ // For nested paths, traverse the fields configuration
203
+ const baseConfig = collectionConfig.relation.fields;
204
+ if (!baseConfig) {
205
+ return { field: strippedKey };
206
+ }
207
+ let currentConfig = baseConfig;
208
+ let field = parts[0] || strippedKey;
209
+ for (let i = 0; i < parts.length - 1; i++) {
210
+ const part = parts[i];
211
+ const nextPart = parts[i + 1];
212
+ if (!part || !nextPart) {
213
+ break;
214
+ }
215
+ const nextConfig = currentConfig[part];
216
+ if (nextConfig?.relation?.fields) {
217
+ currentConfig = nextConfig.relation.fields;
218
+ field = nextPart;
219
+ }
220
+ else {
221
+ break;
222
+ }
223
+ }
224
+ if (!field) {
225
+ field = strippedKey;
226
+ }
227
+ // Return the field config if it exists, otherwise create a default one
228
+ return currentConfig[field] || { field };
229
+ }
230
+ return { field: strippedKey };
231
+ }
232
+ // For keys not referencing the collection item, use the full mapper
233
+ if (typeof fullMapper === "function") {
234
+ return fullMapper(key);
235
+ }
236
+ return fullMapper[key] || { field: key };
237
+ };
238
+ }
239
+ /**
240
+ * Builds a Prisma filter from a Cerbos expression.
241
+ */
242
+ function buildPrismaFilterFromCerbosExpression(expression, mapper) {
243
+ // Validate expression structure
244
+ if (!isOperatorOperand(expression)) {
245
+ throw new Error("Invalid Cerbos expression structure");
246
+ }
247
+ const { operator, operands } = expression;
248
+ // Process different operator types
249
+ switch (operator) {
250
+ case "and":
251
+ return {
252
+ AND: operands.map((operand) => buildPrismaFilterFromCerbosExpression(operand, mapper)),
253
+ };
254
+ case "or":
255
+ return {
256
+ OR: operands.map((operand) => buildPrismaFilterFromCerbosExpression(operand, mapper)),
257
+ };
258
+ case "not": {
259
+ const operand = operands[0];
260
+ if (!operand) {
261
+ throw new Error("not operator requires an operand");
262
+ }
263
+ return {
264
+ NOT: buildPrismaFilterFromCerbosExpression(operand, mapper),
265
+ };
266
+ }
267
+ case "eq":
268
+ case "ne":
269
+ case "lt":
270
+ case "le":
271
+ case "gt":
272
+ case "ge": {
273
+ return handleRelationalOperator(operator, operands, mapper);
274
+ }
275
+ case "in": {
276
+ return handleInOperator(operands, mapper);
277
+ }
278
+ case "contains":
279
+ case "startsWith":
280
+ case "endsWith": {
281
+ return handleStringOperator(operator, operands, mapper);
282
+ }
283
+ case "isSet": {
284
+ return handleIsSetOperator(operands, mapper);
285
+ }
286
+ case "hasIntersection": {
287
+ return handleHasIntersectionOperator(operands, mapper);
288
+ }
289
+ case "lambda": {
290
+ return handleLambdaOperator(operands);
291
+ }
292
+ case "exists":
293
+ case "exists_one":
294
+ case "all":
295
+ case "except":
296
+ case "filter": {
297
+ return handleCollectionOperator(operator, operands, mapper);
298
+ }
299
+ case "map": {
300
+ return handleMapOperator(operands, mapper);
301
+ }
302
+ default:
303
+ throw new Error(`Unsupported operator: ${operator}`);
304
+ }
305
+ }
306
+ /**
307
+ * Helper function to process relational operators (eq, ne, lt, etc.)
308
+ */
309
+ function handleRelationalOperator(operator, operands, mapper) {
310
+ const prismaOperator = {
311
+ eq: "equals",
312
+ ne: "not",
313
+ lt: "lt",
314
+ le: "lte",
315
+ gt: "gt",
316
+ ge: "gte",
317
+ }[operator];
318
+ if (!prismaOperator) {
319
+ throw new Error(`Unsupported operator: ${operator}`);
320
+ }
321
+ const leftOperand = operands.find((o) => isNamedOperand(o) || isOperatorOperand(o));
322
+ if (!leftOperand)
323
+ throw new Error("No valid left operand found");
324
+ const rightOperand = operands.find((o) => o !== leftOperand);
325
+ if (!rightOperand)
326
+ throw new Error("No valid right operand found");
327
+ const left = resolveOperand(leftOperand, mapper);
328
+ const right = resolveOperand(rightOperand, mapper);
329
+ if (isResolvedFieldReference(left)) {
330
+ const { path, relations } = left;
331
+ if (!isResolvedValue(right)) {
332
+ throw new Error("Right operand must be a value");
333
+ }
334
+ const filterValue = { [prismaOperator]: right.value };
335
+ const fieldName = getLeafField(path);
336
+ const fieldFilter = { [fieldName]: filterValue };
337
+ if (relations && relations.length > 0) {
338
+ return buildNestedRelationFilter(relations, fieldFilter);
339
+ }
340
+ return fieldFilter;
341
+ }
342
+ if (!isResolvedValue(right)) {
343
+ throw new Error("Right operand must be a value");
344
+ }
345
+ return { [prismaOperator]: right.value };
346
+ }
347
+ /**
348
+ * Helper function to handle "in" operator
349
+ */
350
+ function handleInOperator(operands, mapper) {
351
+ const nameOperand = operands.find(isNamedOperand);
352
+ if (!nameOperand)
353
+ throw new Error("Name operand is undefined");
354
+ const valueOperand = operands.find(isValueOperand);
355
+ if (!valueOperand)
356
+ throw new Error("Value operand is undefined");
357
+ const resolved = resolveOperand(nameOperand, mapper);
358
+ if (!isResolvedFieldReference(resolved)) {
359
+ throw new Error("Name operand must resolve to a field reference");
360
+ }
361
+ const { path, relations } = resolved;
362
+ const resolvedValue = resolveOperand(valueOperand, mapper);
363
+ if (!isResolvedValue(resolvedValue)) {
364
+ throw new Error("Value operand must resolve to a value");
365
+ }
366
+ const { value } = resolvedValue;
367
+ const values = Array.isArray(value) ? value : [value];
368
+ const fieldName = getLeafField(path);
369
+ if (relations && relations.length > 0) {
370
+ const fieldFilter = values.length === 1
371
+ ? { [fieldName]: values[0] }
372
+ : { [fieldName]: { in: values } };
373
+ return buildNestedRelationFilter(relations, fieldFilter);
374
+ }
375
+ return values.length === 1
376
+ ? { [fieldName]: values[0] }
377
+ : { [fieldName]: { in: values } };
378
+ }
379
+ /**
380
+ * Helper function to handle string operators (contains, startsWith, endsWith)
381
+ */
382
+ function handleStringOperator(operator, operands, mapper) {
383
+ const nameOperand = operands.find(isNamedOperand);
384
+ if (!nameOperand)
385
+ throw new Error("Name operand is undefined");
386
+ const resolved = resolveOperand(nameOperand, mapper);
387
+ if (!isResolvedFieldReference(resolved)) {
388
+ throw new Error("Name operand must resolve to a field reference");
389
+ }
390
+ const { path, relations } = resolved;
391
+ const valueOperand = operands.find(isValueOperand);
392
+ if (!valueOperand)
393
+ throw new Error("Value operand is undefined");
394
+ const resolvedValue = resolveOperand(valueOperand, mapper);
395
+ if (!isResolvedValue(resolvedValue)) {
396
+ throw new Error("Value operand must resolve to a value");
397
+ }
398
+ const { value } = resolvedValue;
399
+ if (typeof value !== "string") {
400
+ throw new Error(`${operator} operator requires string value`);
401
+ }
402
+ const fieldName = getLeafField(path);
403
+ const fieldFilter = { [fieldName]: { [operator]: value } };
404
+ if (relations && relations.length > 0) {
405
+ return buildNestedRelationFilter(relations, fieldFilter);
406
+ }
407
+ return fieldFilter;
408
+ }
409
+ /**
410
+ * Helper function to handle "isSet" operator
411
+ */
412
+ function handleIsSetOperator(operands, mapper) {
413
+ const nameOperand = operands.find(isNamedOperand);
414
+ if (!nameOperand)
415
+ throw new Error("Name operand is undefined");
416
+ const resolved = resolveOperand(nameOperand, mapper);
417
+ if (!isResolvedFieldReference(resolved)) {
418
+ throw new Error("Name operand must resolve to a field reference");
419
+ }
420
+ const { path, relations } = resolved;
421
+ const valueOperand = operands.find(isValueOperand);
422
+ if (!valueOperand)
423
+ throw new Error("Value operand is undefined");
424
+ const resolvedValue = resolveOperand(valueOperand, mapper);
425
+ if (!isResolvedValue(resolvedValue)) {
426
+ throw new Error("Value operand must resolve to a value");
427
+ }
428
+ const fieldName = getLeafField(path);
429
+ const fieldFilter = {
430
+ [fieldName]: resolvedValue.value ? { not: null } : { equals: null },
431
+ };
432
+ if (relations && relations.length > 0) {
433
+ return buildNestedRelationFilter(relations, fieldFilter);
434
+ }
435
+ return fieldFilter;
436
+ }
437
+ /**
438
+ * Helper function to handle "hasIntersection" operator
439
+ */
440
+ function handleHasIntersectionOperator(operands, mapper) {
441
+ if (operands.length !== 2) {
442
+ throw new Error("hasIntersection requires exactly two operands");
443
+ }
444
+ const leftOperand = assertDefined(operands[0], "hasIntersection requires a left operand");
445
+ const rightOperand = assertDefined(operands[1], "hasIntersection requires a right operand");
446
+ // Check if left operand is a map operation
447
+ if (isOperatorOperand(leftOperand) && leftOperand.operator === "map") {
448
+ if (!isValueOperand(rightOperand)) {
449
+ throw new Error("Second operand of hasIntersection must be a value");
450
+ }
451
+ const collection = assertDefined(leftOperand.operands[0], "Map expression must include a collection reference");
452
+ const lambda = assertDefined(leftOperand.operands[1], "Map expression must include a lambda expression");
453
+ if (!isNamedOperand(collection)) {
454
+ throw new Error("First operand of map must be a collection reference");
455
+ }
456
+ // Get variable name from lambda
457
+ if (!isOperatorOperand(lambda)) {
458
+ throw new Error("Lambda expression must have operands");
459
+ }
460
+ const variable = assertDefined(lambda.operands[1], "Lambda variable must have a name");
461
+ if (!isNamedOperand(variable)) {
462
+ throw new Error("Lambda variable must have a name");
463
+ }
464
+ // Create scoped mapper for the collection
465
+ const scopedMapper = createScopedMapper(collection.name, variable.name, mapper);
466
+ const { relations } = resolveFieldReference(collection.name, mapper);
467
+ if (!relations || relations.length === 0) {
468
+ throw new Error("Map operation requires relations");
469
+ }
470
+ const projection = assertDefined(lambda.operands[0], "Invalid map lambda expression structure");
471
+ if (!isNamedOperand(projection)) {
472
+ throw new Error("Invalid map lambda expression structure");
473
+ }
474
+ // Use scoped mapper for resolving the projection
475
+ const resolved = resolveFieldReference(projection.name, scopedMapper);
476
+ const fieldName = getLeafField(resolved.path);
477
+ return buildNestedRelationFilter(relations, {
478
+ [fieldName]: { in: rightOperand.value },
479
+ });
480
+ }
481
+ // Handle regular field reference
482
+ if (!isNamedOperand(leftOperand)) {
483
+ throw new Error("First operand of hasIntersection must be a field reference or map expression");
484
+ }
485
+ if (!isValueOperand(rightOperand)) {
486
+ throw new Error("Second operand of hasIntersection must be a value");
487
+ }
488
+ const { path, relations } = resolveFieldReference(leftOperand.name, mapper);
489
+ if (!Array.isArray(rightOperand.value)) {
490
+ throw new Error("hasIntersection requires an array value");
491
+ }
492
+ if (relations && relations.length > 0) {
493
+ const fieldName = getLeafField(path);
494
+ const fieldFilter = {
495
+ [fieldName]: { in: rightOperand.value },
496
+ };
497
+ return buildNestedRelationFilter(relations, fieldFilter);
498
+ }
499
+ const fieldName = getLeafField(path);
500
+ return { [fieldName]: { some: rightOperand.value } };
501
+ }
502
+ /**
503
+ * Helper function to handle "lambda" operator
504
+ */
505
+ function handleLambdaOperator(operands) {
506
+ const condition = assertDefined(operands[0], "Lambda requires a condition operand");
507
+ const variable = assertDefined(operands[1], "Lambda requires a variable operand");
508
+ if (!isNamedOperand(variable)) {
509
+ throw new Error("Lambda variable must have a name");
510
+ }
511
+ return buildPrismaFilterFromCerbosExpression(condition, (key) => ({
512
+ field: key.replace(`${variable.name}.`, ""),
513
+ }));
514
+ }
515
+ /**
516
+ * Helper function to handle collection operators (exists, all, except, filter)
517
+ */
518
+ function handleCollectionOperator(operator, operands, mapper) {
519
+ if (operands.length !== 2) {
520
+ throw new Error(`${operator} requires exactly two operands`);
521
+ }
522
+ const collection = assertDefined(operands[0], `${operator} requires a collection operand`);
523
+ const lambda = assertDefined(operands[1], `${operator} requires a lambda operand`);
524
+ if (!isNamedOperand(collection)) {
525
+ throw new Error(`First operand of ${operator} must be a collection reference`);
526
+ }
527
+ if (!isOperatorOperand(lambda)) {
528
+ throw new Error(`Second operand of ${operator} must be a lambda expression`);
529
+ }
530
+ // Get variable name from lambda
531
+ const variable = assertDefined(lambda.operands[1], "Lambda variable must have a name");
532
+ if (!isNamedOperand(variable)) {
533
+ throw new Error("Lambda variable must have a name");
534
+ }
535
+ // Create scoped mapper for the collection
536
+ const scopedMapper = createScopedMapper(collection.name, variable.name, mapper);
537
+ const { relations } = resolveFieldReference(collection.name, mapper);
538
+ if (!relations || relations.length === 0) {
539
+ throw new Error(`${operator} operator requires a relation mapping`);
540
+ }
541
+ const lambdaConditionOperand = assertDefined(lambda.operands[0], "Lambda expression must provide a condition");
542
+ const lambdaCondition = buildPrismaFilterFromCerbosExpression(lambdaConditionOperand, // Use the condition part of the lambda
543
+ scopedMapper);
544
+ const relation = assertDefined(relations[0], `${operator} operator requires a relation mapping`);
545
+ let filterValue = lambdaCondition;
546
+ // If the lambda condition already has a relation structure, merge it
547
+ if (lambdaCondition["AND"] || lambdaCondition["OR"]) {
548
+ filterValue = lambdaCondition;
549
+ }
550
+ else {
551
+ const lambdaKeys = Object.keys(lambdaCondition);
552
+ const defaultKey = lambdaKeys[0];
553
+ if (!defaultKey) {
554
+ throw new Error("Lambda condition must have at least one field");
555
+ }
556
+ const lambdaFieldValue = lambdaCondition[defaultKey];
557
+ if (lambdaFieldValue === undefined) {
558
+ throw new Error("Lambda condition field value cannot be undefined");
559
+ }
560
+ const filterField = relation.field || defaultKey;
561
+ filterValue = {
562
+ [filterField]: lambdaFieldValue,
563
+ };
564
+ }
565
+ switch (operator) {
566
+ case "exists":
567
+ case "filter":
568
+ return { [relation.name]: { some: filterValue } };
569
+ case "except":
570
+ return { [relation.name]: { some: { NOT: filterValue } } };
571
+ case "exists_one":
572
+ return {
573
+ [relation.name]: {
574
+ some: filterValue,
575
+ },
576
+ AND: [
577
+ {
578
+ [relation.name]: {
579
+ every: {
580
+ OR: [filterValue, { NOT: filterValue }],
581
+ },
582
+ },
583
+ },
584
+ ],
585
+ };
586
+ case "all":
587
+ return { [relation.name]: { every: filterValue } };
588
+ default:
589
+ throw new Error(`Unexpected operator: ${operator}`);
590
+ }
591
+ }
592
+ /**
593
+ * Helper function to handle "map" operator
594
+ */
595
+ function handleMapOperator(operands, mapper) {
596
+ if (operands.length !== 2) {
597
+ throw new Error("map requires exactly two operands");
598
+ }
599
+ const collection = assertDefined(operands[0], "map requires a collection operand");
600
+ const lambda = assertDefined(operands[1], "map requires a lambda operand");
601
+ if (!isNamedOperand(collection)) {
602
+ throw new Error("First operand of map must be a collection reference");
603
+ }
604
+ if (!isOperatorOperand(lambda) || lambda.operator !== "lambda") {
605
+ throw new Error("Second operand of map must be a lambda expression");
606
+ }
607
+ // Get variable name from lambda
608
+ const projection = assertDefined(lambda.operands[0], "Map lambda expression must provide a projection");
609
+ const variable = assertDefined(lambda.operands[1], "Map lambda expression must provide a variable");
610
+ if (!isNamedOperand(projection) || !isNamedOperand(variable)) {
611
+ throw new Error("Invalid map lambda expression structure");
612
+ }
613
+ // Create scoped mapper for the collection
614
+ const scopedMapper = createScopedMapper(collection.name, variable.name, mapper);
615
+ const { relations } = resolveFieldReference(collection.name, mapper);
616
+ if (!relations || relations.length === 0) {
617
+ throw new Error("map operator requires a relation mapping");
618
+ }
619
+ // Use scoped mapper for resolving the projection
620
+ const resolved = resolveFieldReference(projection.name, scopedMapper);
621
+ const fieldName = getLeafField(resolved.path);
622
+ const lastRelation = assertDefined(relations[relations.length - 1], "Relation mapping must contain at least one relation");
623
+ return buildNestedRelationFilter(relations, {
624
+ [getPrismaRelationOperator(lastRelation)]: {
625
+ select: { [fieldName]: true },
626
+ },
627
+ });
628
+ }
629
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}