@cerbos/orm-prisma 4.1.0 → 5.0.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 (174) hide show
  1. package/README.md +598 -603
  2. package/lib/collections.d.ts +30 -0
  3. package/lib/collections.d.ts.map +1 -0
  4. package/lib/collections.js +421 -0
  5. package/lib/collections.js.map +1 -0
  6. package/lib/comparison.d.ts +24 -0
  7. package/lib/comparison.d.ts.map +1 -0
  8. package/lib/comparison.js +731 -0
  9. package/lib/comparison.js.map +1 -0
  10. package/lib/errors.d.ts +13 -0
  11. package/lib/errors.d.ts.map +1 -0
  12. package/lib/errors.js +17 -0
  13. package/lib/errors.js.map +1 -0
  14. package/lib/evaluate.d.ts +5 -0
  15. package/lib/evaluate.d.ts.map +1 -0
  16. package/lib/evaluate.js +118 -0
  17. package/lib/evaluate.js.map +1 -0
  18. package/lib/fields.d.ts +34 -0
  19. package/lib/fields.d.ts.map +1 -0
  20. package/lib/fields.js +253 -0
  21. package/lib/fields.js.map +1 -0
  22. package/lib/functions.d.ts +5 -0
  23. package/lib/functions.d.ts.map +1 -0
  24. package/lib/functions.js +408 -0
  25. package/lib/functions.js.map +1 -0
  26. package/lib/hierarchy.d.ts +6 -0
  27. package/lib/hierarchy.d.ts.map +1 -0
  28. package/lib/hierarchy.js +266 -0
  29. package/lib/hierarchy.js.map +1 -0
  30. package/lib/index.d.ts +23 -13
  31. package/lib/index.d.ts.map +1 -1
  32. package/lib/index.js +34 -2555
  33. package/lib/index.js.map +1 -1
  34. package/lib/literals.d.ts +20 -0
  35. package/lib/literals.d.ts.map +1 -0
  36. package/lib/literals.js +290 -0
  37. package/lib/literals.js.map +1 -0
  38. package/lib/mapping.d.ts +95 -0
  39. package/lib/mapping.d.ts.map +1 -0
  40. package/lib/mapping.js +316 -0
  41. package/lib/mapping.js.map +1 -0
  42. package/lib/narrowing.d.ts +12 -0
  43. package/lib/narrowing.d.ts.map +1 -0
  44. package/lib/narrowing.js +32 -0
  45. package/lib/narrowing.js.map +1 -0
  46. package/lib/plan.d.ts +49 -0
  47. package/lib/plan.d.ts.map +1 -0
  48. package/lib/plan.js +86 -0
  49. package/lib/plan.js.map +1 -0
  50. package/lib/presence.d.ts +25 -0
  51. package/lib/presence.d.ts.map +1 -0
  52. package/lib/presence.js +82 -0
  53. package/lib/presence.js.map +1 -0
  54. package/lib/regex.d.ts +33 -0
  55. package/lib/regex.d.ts.map +1 -0
  56. package/lib/regex.js +480 -0
  57. package/lib/regex.js.map +1 -0
  58. package/lib/relations.d.ts +58 -0
  59. package/lib/relations.d.ts.map +1 -0
  60. package/lib/relations.js +175 -0
  61. package/lib/relations.js.map +1 -0
  62. package/lib/rewrite.d.ts +36 -0
  63. package/lib/rewrite.d.ts.map +1 -0
  64. package/lib/rewrite.js +366 -0
  65. package/lib/rewrite.js.map +1 -0
  66. package/lib/solve.d.ts +20 -0
  67. package/lib/solve.d.ts.map +1 -0
  68. package/lib/solve.js +77 -0
  69. package/lib/solve.js.map +1 -0
  70. package/lib/strings.d.ts +12 -0
  71. package/lib/strings.d.ts.map +1 -0
  72. package/lib/strings.js +110 -0
  73. package/lib/strings.js.map +1 -0
  74. package/lib/ternary.d.ts +12 -0
  75. package/lib/ternary.d.ts.map +1 -0
  76. package/lib/ternary.js +192 -0
  77. package/lib/ternary.js.map +1 -0
  78. package/lib/timestamp.d.ts +45 -0
  79. package/lib/timestamp.d.ts.map +1 -0
  80. package/lib/timestamp.js +225 -0
  81. package/lib/timestamp.js.map +1 -0
  82. package/lib/translate.d.ts +20 -0
  83. package/lib/translate.d.ts.map +1 -0
  84. package/lib/translate.js +287 -0
  85. package/lib/translate.js.map +1 -0
  86. package/lib/types.d.ts +29 -0
  87. package/lib/types.d.ts.map +1 -0
  88. package/lib/types.js +980 -0
  89. package/lib/types.js.map +1 -0
  90. package/lib/value.d.ts +8 -0
  91. package/lib/value.d.ts.map +1 -0
  92. package/lib/value.js +7 -0
  93. package/lib/value.js.map +1 -0
  94. package/package.json +27 -17
  95. package/src/adversarial.test.ts +376 -1071
  96. package/src/collections.ts +738 -0
  97. package/src/comparison.ts +1157 -0
  98. package/src/corpus.ts +433 -250
  99. package/src/errors.ts +12 -0
  100. package/src/evaluate.ts +170 -0
  101. package/src/fields.ts +373 -0
  102. package/src/functions.ts +548 -0
  103. package/src/generated/prisma-adversarial/browser.ts +10 -0
  104. package/src/generated/prisma-adversarial/client.ts +10 -0
  105. package/src/generated/prisma-adversarial/commonInputTypes.ts +116 -127
  106. package/src/generated/prisma-adversarial/internal/class.ts +24 -4
  107. package/src/generated/prisma-adversarial/internal/prismaNamespace.ts +174 -3
  108. package/src/generated/prisma-adversarial/internal/prismaNamespaceBrowser.ts +23 -2
  109. package/src/generated/prisma-adversarial/models/AdversarialBoolListElement.ts +1272 -0
  110. package/src/generated/prisma-adversarial/models/AdversarialInner.ts +54 -54
  111. package/src/generated/prisma-adversarial/models/AdversarialNumberListElement.ts +1316 -0
  112. package/src/generated/prisma-adversarial/models/AdversarialParent.ts +66 -66
  113. package/src/generated/prisma-adversarial/models/AdversarialResource.ts +435 -87
  114. package/src/generated/prisma-adversarial/models.ts +2 -0
  115. package/src/generated/prisma-adversarial-mysql/browser.ts +64 -0
  116. package/src/generated/prisma-adversarial-mysql/client.ts +86 -0
  117. package/src/generated/prisma-adversarial-mysql/commonInputTypes.ts +349 -0
  118. package/src/generated/prisma-adversarial-mysql/enums.ts +15 -0
  119. package/src/generated/prisma-adversarial-mysql/internal/class.ts +284 -0
  120. package/src/generated/prisma-adversarial-mysql/internal/prismaNamespace.ts +1518 -0
  121. package/src/generated/prisma-adversarial-mysql/internal/prismaNamespaceBrowser.ts +274 -0
  122. package/src/generated/prisma-adversarial-mysql/models/AdversarialBoolListElement.ts +1157 -0
  123. package/src/generated/prisma-adversarial-mysql/models/AdversarialCategory.ts +1286 -0
  124. package/src/generated/prisma-adversarial-mysql/models/AdversarialInner.ts +1247 -0
  125. package/src/generated/prisma-adversarial-mysql/models/AdversarialLabel.ts +1157 -0
  126. package/src/generated/prisma-adversarial-mysql/models/AdversarialNumberListElement.ts +1201 -0
  127. package/src/generated/prisma-adversarial-mysql/models/AdversarialParent.ts +1352 -0
  128. package/src/generated/prisma-adversarial-mysql/models/AdversarialResource.ts +2021 -0
  129. package/src/generated/prisma-adversarial-mysql/models/AdversarialSubCategory.ts +1286 -0
  130. package/src/generated/prisma-adversarial-mysql/models/AdversarialTag.ts +1190 -0
  131. package/src/generated/prisma-adversarial-mysql/models.ts +20 -0
  132. package/src/generated/prisma-adversarial-mysql-v6/client.d.ts +1 -0
  133. package/src/generated/prisma-adversarial-mysql-v6/default.d.ts +1 -0
  134. package/src/generated/prisma-adversarial-mysql-v6/edge.d.ts +1 -0
  135. package/src/generated/prisma-adversarial-mysql-v6/index.d.ts +13822 -0
  136. package/src/generated/prisma-adversarial-mysql-v6/runtime/index-browser.d.ts +370 -0
  137. package/src/generated/prisma-adversarial-mysql-v6/runtime/library.d.ts +3982 -0
  138. package/src/generated/prisma-adversarial-mysql-v6/wasm.d.ts +1 -0
  139. package/src/generated/prisma-adversarial-pg/browser.ts +10 -0
  140. package/src/generated/prisma-adversarial-pg/client.ts +10 -0
  141. package/src/generated/prisma-adversarial-pg/commonInputTypes.ts +118 -129
  142. package/src/generated/prisma-adversarial-pg/internal/class.ts +24 -4
  143. package/src/generated/prisma-adversarial-pg/internal/prismaNamespace.ts +174 -3
  144. package/src/generated/prisma-adversarial-pg/internal/prismaNamespaceBrowser.ts +23 -2
  145. package/src/generated/prisma-adversarial-pg/models/AdversarialBoolListElement.ts +1275 -0
  146. package/src/generated/prisma-adversarial-pg/models/AdversarialInner.ts +54 -54
  147. package/src/generated/prisma-adversarial-pg/models/AdversarialNumberListElement.ts +1319 -0
  148. package/src/generated/prisma-adversarial-pg/models/AdversarialParent.ts +66 -66
  149. package/src/generated/prisma-adversarial-pg/models/AdversarialResource.ts +435 -87
  150. package/src/generated/prisma-adversarial-pg/models.ts +2 -0
  151. package/src/generated/prisma-adversarial-pg-v6/index.d.ts +3476 -388
  152. package/src/generated/prisma-adversarial-v6/index.d.ts +3465 -383
  153. package/src/hierarchy.ts +405 -0
  154. package/src/index.ts +66 -3646
  155. package/src/literals.ts +363 -0
  156. package/src/mapping.ts +474 -0
  157. package/src/narrowing.ts +33 -0
  158. package/src/plan.ts +125 -0
  159. package/src/presence.ts +114 -0
  160. package/src/regex.ts +596 -0
  161. package/src/relations.ts +226 -0
  162. package/src/rewrite.ts +524 -0
  163. package/src/solve.ts +96 -0
  164. package/src/strings.ts +152 -0
  165. package/src/ternary.ts +359 -0
  166. package/src/test-setup.adversarial-url.ts +6 -3
  167. package/src/test-setup.adversarial.mysql.v6.ts +13 -0
  168. package/src/test-setup.adversarial.mysql.v7.ts +12 -0
  169. package/src/test-setup.adversarial.v7.ts +1 -0
  170. package/src/timestamp.ts +308 -0
  171. package/src/translate.ts +419 -0
  172. package/src/translator.test.ts +497 -1317
  173. package/src/types.ts +1310 -0
  174. package/src/value.ts +16 -0
@@ -0,0 +1,30 @@
1
+ import type { PlanExpressionOperand } from "@cerbos/core";
2
+ import type { PrismaFilter } from "./index";
3
+ import type { TranslationContext } from "./mapping";
4
+ /**
5
+ * Refuses a two-variable comprehension (`list.exists(i, v, ...)`, `map.exists(k, v, ...)`), whose
6
+ * lambda binds the element's index or key as well as the element. A Prisma relation filter tests
7
+ * related rows, which carry no position, and enumerates no map keys, so the first variable has
8
+ * nothing to bind to.
9
+ */
10
+ export declare function assertSingleVariableLambda(operator: string, lambda: {
11
+ operator: string;
12
+ operands: PlanExpressionOperand[];
13
+ }): void;
14
+ /** A collection macro (exists, all, except, exists_one, filter) in positive position. */
15
+ export declare function handleCollectionOperator(operator: string, operands: PlanExpressionOperand[], context: TranslationContext): PrismaFilter;
16
+ /** The same macro under `!`, which is not the plain `NOT` of the positive filter. */
17
+ export declare function buildNegatedCollectionFilter(operator: string, operands: PlanExpressionOperand[], context: TranslationContext): PrismaFilter;
18
+ /**
19
+ * Helper function to handle "map" operator
20
+ */
21
+ export declare function handleMapOperator(operands: PlanExpressionOperand[], context: TranslationContext): PrismaFilter;
22
+ /**
23
+ * Helper function to handle "hasIntersection" operator
24
+ */
25
+ export declare function handleHasIntersectionOperator(operands: PlanExpressionOperand[], context: TranslationContext): PrismaFilter;
26
+ /**
27
+ * Helper function to handle "lambda" operator
28
+ */
29
+ export declare function handleLambdaOperator(operands: PlanExpressionOperand[], context: TranslationContext): PrismaFilter;
30
+ //# sourceMappingURL=collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAM1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAO5C,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,WAAW,CAAC;AAuBnB;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAA;CAAE,GAC9D,IAAI,CAQN;AAuZD,yFAAyF;AACzF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CAEd;AAED,qFAAqF;AACrF,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CAEd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CAyDd;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CA0Dd;AA6FD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CAmBd"}
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ // The collection macros (`exists`, `all`, `except`, and the refused `exists_one`/`filter`), in
3
+ // both polarities, plus `map`, `hasIntersection` and a bare `lambda`.
4
+ //
5
+ // A macro over a relation lowers to Prisma's `some`/`every`/`none`. Those collapse SQL's UNKNOWN
6
+ // to false at the EXISTS boundary, so every macro whose lambda body touches a nullable element
7
+ // column carries an explicit guard to keep CEL's error semantics (a NULL element column is a
8
+ // missing attribute, which Cerbos treats as deny).
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.assertSingleVariableLambda = assertSingleVariableLambda;
11
+ exports.handleCollectionOperator = handleCollectionOperator;
12
+ exports.buildNegatedCollectionFilter = buildNegatedCollectionFilter;
13
+ exports.handleMapOperator = handleMapOperator;
14
+ exports.handleHasIntersectionOperator = handleHasIntersectionOperator;
15
+ exports.handleLambdaOperator = handleLambdaOperator;
16
+ const fields_1 = require("./fields");
17
+ const mapping_1 = require("./mapping");
18
+ const plan_1 = require("./plan");
19
+ const relations_1 = require("./relations");
20
+ const rewrite_1 = require("./rewrite");
21
+ const translate_1 = require("./translate");
22
+ const errors_1 = require("./errors");
23
+ /**
24
+ * Refuses a two-variable comprehension (`list.exists(i, v, ...)`, `map.exists(k, v, ...)`), whose
25
+ * lambda binds the element's index or key as well as the element. A Prisma relation filter tests
26
+ * related rows, which carry no position, and enumerates no map keys, so the first variable has
27
+ * nothing to bind to.
28
+ */
29
+ function assertSingleVariableLambda(operator, lambda) {
30
+ if (lambda.operator === "lambda" && lambda.operands.length > 2) {
31
+ throw new errors_1.UnsupportedQueryPlanError(`${operator} with a two-variable lambda: the first variable binds the element's list ` +
32
+ "index or map key, and a Prisma relation filter tests related rows, which carry no " +
33
+ "position, and enumerates no map keys");
34
+ }
35
+ }
36
+ function newLambdaScope(variableName, relations) {
37
+ return {
38
+ variableName,
39
+ relationModel: relations[relations.length - 1]?.model,
40
+ nullableFields: new Set(),
41
+ unknownFilters: [],
42
+ };
43
+ }
44
+ /**
45
+ * Fold a collection macro whose collection operand is a literal value list.
46
+ *
47
+ * The planner emits this shape when a known-value collection (typically a
48
+ * folded principal attribute) has more than 10 elements — at 10 or fewer it
49
+ * unrolls `exists`/`all` into an or/and chain itself (cerbos/cerbos#2570,
50
+ * cerbos/cerbos#2817; `maxItems = 10` in the planner's struct matcher). Apply
51
+ * the same fold here so the translated filter does not depend on which side of
52
+ * that threshold the collection lands: substitute each element into the lambda
53
+ * body and combine the per-element filters with OR (`exists`) or AND (`all`).
54
+ *
55
+ * An empty list yields `{OR: []}` / `{AND: []}`, which Prisma evaluates to
56
+ * match-nothing / match-everything — exactly CEL's `exists`/`all` semantics
57
+ * over an empty collection.
58
+ */
59
+ function foldKnownValueCollection(operator, collection, lambda, context, negated) {
60
+ if (operator !== "exists" && operator !== "all") {
61
+ throw new errors_1.UnsupportedQueryPlanError(`${operator} over a literal collection value is not supported. ` +
62
+ "Only exists() and all() can be folded into a flat filter.");
63
+ }
64
+ const elements = collection.value;
65
+ if (!Array.isArray(elements)) {
66
+ throw new errors_1.UnsupportedQueryPlanError(`${operator} over a literal collection requires a list value`);
67
+ }
68
+ if (!(0, plan_1.isOperatorOperand)(lambda) || lambda.operator !== "lambda") {
69
+ throw new errors_1.UnsupportedQueryPlanError(`Second operand of ${operator} must be a lambda expression`);
70
+ }
71
+ if (lambda.operands.length !== 2) {
72
+ throw new errors_1.UnsupportedQueryPlanError(`${operator} over a literal collection supports single-variable lambdas only`);
73
+ }
74
+ const body = (0, plan_1.assertDefined)(lambda.operands[0], "Lambda expression must provide a condition");
75
+ const variable = (0, plan_1.assertDefined)(lambda.operands[1], "Lambda variable must have a name");
76
+ if (!(0, plan_1.isNamedOperand)(variable)) {
77
+ throw new errors_1.UnsupportedQueryPlanError("Lambda variable must have a name");
78
+ }
79
+ const filters = elements.map((element) => {
80
+ const substituted = (0, rewrite_1.substituteLambdaVariable)(body, variable.name, element);
81
+ return negated
82
+ ? (0, translate_1.buildNegatedFilter)(substituted, context)
83
+ : (0, translate_1.buildPrismaFilterFromCerbosExpression)(substituted, context);
84
+ });
85
+ const combinesWithOr = operator === "exists" ? !negated : negated;
86
+ return combinesWithOr ? { OR: filters } : { AND: filters };
87
+ }
88
+ function buildCollectionLambdaParts(operator, operands, context) {
89
+ if (operands.length !== 2) {
90
+ throw new errors_1.UnsupportedQueryPlanError(`${operator} requires exactly two operands`);
91
+ }
92
+ const collection = (0, plan_1.assertDefined)(operands[0], `${operator} requires a collection operand`);
93
+ const lambda = (0, plan_1.assertDefined)(operands[1], `${operator} requires a lambda operand`);
94
+ if (!(0, plan_1.isNamedOperand)(collection)) {
95
+ throw new errors_1.UnsupportedQueryPlanError(`First operand of ${operator} must be a collection reference`);
96
+ }
97
+ if (!(0, plan_1.isOperatorOperand)(lambda)) {
98
+ throw new errors_1.UnsupportedQueryPlanError(`Second operand of ${operator} must be a lambda expression`);
99
+ }
100
+ assertSingleVariableLambda(operator, lambda);
101
+ const variable = (0, plan_1.assertDefined)(lambda.operands[1], "Lambda variable must have a name");
102
+ if (!(0, plan_1.isNamedOperand)(variable)) {
103
+ throw new errors_1.UnsupportedQueryPlanError("Lambda variable must have a name");
104
+ }
105
+ const { relations } = (0, mapping_1.resolveFieldReference)(collection.name, context);
106
+ if (!relations || relations.length === 0) {
107
+ throw new errors_1.UnsupportedQueryPlanError(`${operator} operator requires a relation mapping`);
108
+ }
109
+ if (relations[relations.length - 1].type === "one") {
110
+ // CEL reads a to-one relation as a map, and a macro over a map ranges over its KEYS — the
111
+ // attribute names present on the related row — which no Prisma relation filter enumerates.
112
+ throw new errors_1.UnsupportedQueryPlanError(`${operator} over ${collection.name}: it is a to-one relation, which CEL reads as a map ` +
113
+ "whose keys (the attribute names present on the related row) the macro ranges over, " +
114
+ "and a Prisma relation filter tests rows, not attribute names");
115
+ }
116
+ const head = relations[0];
117
+ const restRelations = relations.slice(1);
118
+ const lambdaConditionOperand = (0, plan_1.assertDefined)(lambda.operands[0], "Lambda expression must provide a condition");
119
+ const scope = newLambdaScope(variable.name, relations);
120
+ const lambdaCondition = (0, translate_1.buildPrismaFilterFromCerbosExpression)(lambdaConditionOperand, (0, mapping_1.enterLambdaScope)(context, collection.name, scope));
121
+ return {
122
+ head,
123
+ restRelations,
124
+ // Chained collection reference (e.g. R.attr.a.b): the lambda's elements live at the END
125
+ // of the chain, so the element predicate must join through every intermediate hop.
126
+ filterValue: (0, relations_1.wrapInRelations)(restRelations, lambdaCondition),
127
+ elementFilter: lambdaCondition,
128
+ nullableFields: scope.nullableFields,
129
+ unknownFilters: scope.unknownFilters,
130
+ };
131
+ }
132
+ function buildUnknownElementFilter(parts) {
133
+ const filters = [...parts.unknownFilters];
134
+ if (parts.nullableFields.size > 0) {
135
+ filters.push((0, fields_1.buildNullWitnessFilter)(parts.nullableFields));
136
+ }
137
+ if (filters.length === 0) {
138
+ return undefined;
139
+ }
140
+ return filters.length === 1 ? filters[0] : { OR: filters };
141
+ }
142
+ /** Wraps an element-level filter through the full relation chain (head + rest). */
143
+ function wrapCollectionElementFilter(parts, elementFilter) {
144
+ return (0, relations_1.relationFilter)(parts.head, "some", (0, relations_1.wrapInRelations)(parts.restRelations, elementFilter));
145
+ }
146
+ /**
147
+ * all() over a chain (`R.attr.a.b`): the elements are the flattened tail, so the predicate must
148
+ * hold at the end of every path (`every` through each to-many hop, `is` through a to-one one),
149
+ * and the hops must exist — an absent parent is a missing-path error, never a vacuous TRUE.
150
+ */
151
+ function positiveChainAllFilter(parts) {
152
+ let universal = parts.elementFilter;
153
+ for (const relation of [...parts.restRelations].reverse()) {
154
+ universal = (0, relations_1.relationFilter)(relation, relation.type === "one" ? "is" : "every", universal);
155
+ }
156
+ const filters = [
157
+ (0, relations_1.buildLeadingHopsExistFilter)(parts.head, parts.restRelations),
158
+ (0, relations_1.relationFilter)(parts.head, "every", universal),
159
+ ];
160
+ if (parts.nullableFields.size > 0) {
161
+ // As for a direct relation: an element whose referenced column is NULL errors in CEL.
162
+ filters.push({
163
+ NOT: wrapCollectionElementFilter(parts, (0, fields_1.buildNullWitnessFilter)(parts.nullableFields)),
164
+ });
165
+ }
166
+ return { AND: filters };
167
+ }
168
+ /** `relation: { none: <a nullable element column is NULL> }`, ANDed onto `base` when needed. */
169
+ function excludeNullElements(base, parts) {
170
+ if (parts.nullableFields.size === 0) {
171
+ return base;
172
+ }
173
+ return {
174
+ AND: [
175
+ base,
176
+ (0, relations_1.relationFilter)(parts.head, "none", (0, fields_1.buildNullWitnessFilter)(parts.nullableFields)),
177
+ ],
178
+ };
179
+ }
180
+ function positiveCollectionFilter(operator, parts, context) {
181
+ const { head, filterValue } = parts;
182
+ switch (operator) {
183
+ case "exists": {
184
+ // A NULL element keeps the per-element predicate UNKNOWN, so it can never create a
185
+ // false positive here; a CEL error (deny) coincides with "no match" — no guard needed.
186
+ // An enclosing macro still needs to know when this one is UNKNOWN, so it is recorded.
187
+ const filter = (0, relations_1.relationFilter)(head, "some", filterValue);
188
+ const unknownElement = buildUnknownElementFilter(parts);
189
+ if (unknownElement !== undefined) {
190
+ (0, mapping_1.currentScope)(context)?.unknownFilters.push({
191
+ AND: [
192
+ { NOT: filter },
193
+ wrapCollectionElementFilter(parts, unknownElement),
194
+ ],
195
+ });
196
+ }
197
+ return filter;
198
+ }
199
+ case "except":
200
+ return (0, relations_1.relationFilter)(head, "some", (0, relations_1.negateFilter)(filterValue));
201
+ case "all":
202
+ if (parts.restRelations.length > 0) {
203
+ return positiveChainAllFilter(parts);
204
+ }
205
+ // CEL all() errors when any element evaluation errors without a false witness; SQL
206
+ // `every` would treat those elements as vacuously passing. Exclude rows holding any
207
+ // element whose referenced nullable column is NULL. (`every` already rejects rows
208
+ // with a definitive false witness, matching error absorption.)
209
+ return excludeNullElements((0, relations_1.relationFilter)(head, "every", filterValue), parts);
210
+ default:
211
+ throw new errors_1.UnsupportedQueryPlanError(`Unexpected operator: ${operator}`);
212
+ }
213
+ }
214
+ /**
215
+ * The filter for a NEGATED collection operator, encoding CEL's error semantics (see
216
+ * buildNegatedFilter).
217
+ */
218
+ function negatedCollectionFilter(operator, parts) {
219
+ const { head, filterValue } = parts;
220
+ // An absent to-one parent must stay denied under negation rather than satisfying it
221
+ // vacuously (#309).
222
+ const leadingHopsExist = (0, relations_1.buildLeadingHopsExistFilter)(head, parts.restRelations);
223
+ const requireLeadingHops = (filter) => leadingHopsExist === undefined
224
+ ? filter
225
+ : { AND: [leadingHopsExist, filter] };
226
+ switch (operator) {
227
+ case "exists": {
228
+ const base = requireLeadingHops({
229
+ NOT: (0, relations_1.relationFilter)(head, "some", filterValue),
230
+ });
231
+ const unknownElement = buildUnknownElementFilter(parts);
232
+ if (unknownElement === undefined) {
233
+ return base;
234
+ }
235
+ // !exists is TRUE only when every element is definitively false: no P-match AND no
236
+ // element whose evaluation is UNKNOWN (NULL column = missing attribute = CEL error).
237
+ return {
238
+ AND: [base, { NOT: wrapCollectionElementFilter(parts, unknownElement) }],
239
+ };
240
+ }
241
+ case "all":
242
+ // !all is TRUE only with a definitive false witness, which also absorbs error
243
+ // elements — exactly `some(NOT P)` in SQL (NULL columns keep NOT P UNKNOWN). Over a chain
244
+ // the witness is an element at the END of it, so the negation sits inside every hop:
245
+ // negating the some-wrapped chain instead would admit a hop with no elements at all.
246
+ return wrapCollectionElementFilter(parts, (0, relations_1.negateFilter)(parts.elementFilter));
247
+ case "except":
248
+ // !except(c,P) = every element definitively matches P.
249
+ return excludeNullElements(requireLeadingHops((0, relations_1.relationFilter)(head, "none", (0, relations_1.negateFilter)(filterValue))), parts);
250
+ default:
251
+ throw new errors_1.UnsupportedQueryPlanError(`Unexpected operator: ${operator}`);
252
+ }
253
+ }
254
+ function translateCollectionMacro(operator, operands, context, negated) {
255
+ // A literal value list arrives when the planner could not unroll a macro over a known
256
+ // collection (more than 10 elements). Fold it before attempting relation resolution because
257
+ // there is no relation mapping for a literal.
258
+ const [collection, lambda] = operands;
259
+ if (operands.length === 2 &&
260
+ collection !== undefined &&
261
+ lambda !== undefined &&
262
+ (0, plan_1.isValueOperand)(collection)) {
263
+ return foldKnownValueCollection(operator, collection, lambda, context, negated);
264
+ }
265
+ if (operator === "exists_one") {
266
+ throw new errors_1.UnsupportedQueryPlanError("exists_one requires counting matching elements, which Prisma where-filters cannot express");
267
+ }
268
+ if (operator === "filter") {
269
+ throw new errors_1.UnsupportedQueryPlanError("The filter() collection operator returns a list, not a boolean. " +
270
+ "It cannot be used as a standalone condition. " +
271
+ "Use exists() or combine filter() with size() instead.");
272
+ }
273
+ const parts = buildCollectionLambdaParts(operator, operands, context);
274
+ return negated
275
+ ? negatedCollectionFilter(operator, parts)
276
+ : positiveCollectionFilter(operator, parts, context);
277
+ }
278
+ /** A collection macro (exists, all, except, exists_one, filter) in positive position. */
279
+ function handleCollectionOperator(operator, operands, context) {
280
+ return translateCollectionMacro(operator, operands, context, false);
281
+ }
282
+ /** The same macro under `!`, which is not the plain `NOT` of the positive filter. */
283
+ function buildNegatedCollectionFilter(operator, operands, context) {
284
+ return translateCollectionMacro(operator, operands, context, true);
285
+ }
286
+ /**
287
+ * Helper function to handle "map" operator
288
+ */
289
+ function handleMapOperator(operands, context) {
290
+ if (operands.length !== 2) {
291
+ throw new errors_1.UnsupportedQueryPlanError("map requires exactly two operands");
292
+ }
293
+ const collection = (0, plan_1.assertDefined)(operands[0], "map requires a collection operand");
294
+ const lambda = (0, plan_1.assertDefined)(operands[1], "map requires a lambda operand");
295
+ if (!(0, plan_1.isNamedOperand)(collection)) {
296
+ throw new errors_1.UnsupportedQueryPlanError("First operand of map must be a collection reference");
297
+ }
298
+ if (!(0, plan_1.isOperatorOperand)(lambda) || lambda.operator !== "lambda") {
299
+ throw new errors_1.UnsupportedQueryPlanError("Second operand of map must be a lambda expression");
300
+ }
301
+ assertSingleVariableLambda("map", lambda);
302
+ const projection = (0, plan_1.assertDefined)(lambda.operands[0], "Map lambda expression must provide a projection");
303
+ const variable = (0, plan_1.assertDefined)(lambda.operands[1], "Map lambda expression must provide a variable");
304
+ if (!(0, plan_1.isNamedOperand)(projection) || !(0, plan_1.isNamedOperand)(variable)) {
305
+ throw new errors_1.UnsupportedQueryPlanError("Invalid map lambda expression structure");
306
+ }
307
+ const { relations } = (0, mapping_1.resolveFieldReference)(collection.name, context);
308
+ if (!relations || relations.length === 0) {
309
+ throw new errors_1.UnsupportedQueryPlanError("map operator requires a relation mapping");
310
+ }
311
+ const scopedContext = (0, mapping_1.enterLambdaScope)(context, collection.name, newLambdaScope(variable.name, relations));
312
+ const resolved = (0, mapping_1.resolveFieldReference)(projection.name, scopedContext);
313
+ const fieldName = (0, mapping_1.getLeafField)(resolved.path);
314
+ const lastRelation = relations[relations.length - 1];
315
+ return (0, relations_1.wrapInRelations)(relations, {
316
+ [(0, relations_1.relationOperator)(lastRelation)]: {
317
+ select: { [fieldName]: true },
318
+ },
319
+ });
320
+ }
321
+ /**
322
+ * Helper function to handle "hasIntersection" operator
323
+ */
324
+ function handleHasIntersectionOperator(operands, context) {
325
+ if (operands.length !== 2) {
326
+ throw new errors_1.UnsupportedQueryPlanError("hasIntersection requires exactly two operands");
327
+ }
328
+ // Intersection is symmetric, and the planner preserves policy source order — e.g.
329
+ // `hasIntersection(["a"], R.attr.tags)` puts the constant list FIRST. Normalize to
330
+ // field/map-first (see #256).
331
+ ({ operands } = (0, plan_1.normalizeBinaryOperands)("hasIntersection", operands));
332
+ const leftOperand = (0, plan_1.assertDefined)(operands[0], "hasIntersection requires a left operand");
333
+ const rightOperand = (0, plan_1.assertDefined)(operands[1], "hasIntersection requires a right operand");
334
+ if ((0, plan_1.isOperatorOperand)(leftOperand) && leftOperand.operator === "map") {
335
+ return handleMapIntersection(leftOperand.operands, rightOperand, context);
336
+ }
337
+ if (!(0, plan_1.isNamedOperand)(leftOperand)) {
338
+ throw new errors_1.UnsupportedQueryPlanError("First operand of hasIntersection must be a field reference or map expression");
339
+ }
340
+ if (!(0, plan_1.isValueOperand)(rightOperand)) {
341
+ throw new errors_1.UnsupportedQueryPlanError("Second operand of hasIntersection must be a value");
342
+ }
343
+ const fieldRef = (0, mapping_1.resolveFieldReference)(leftOperand.name, context);
344
+ if (!Array.isArray(rightOperand.value)) {
345
+ throw new errors_1.UnsupportedQueryPlanError("hasIntersection requires an array value");
346
+ }
347
+ if (rightOperand.value.length === 0 && fieldRef.relations?.length === 1) {
348
+ return { OR: [] };
349
+ }
350
+ if (fieldRef.relations && fieldRef.relations.length > 0) {
351
+ // The whole reference, not just its path: the mapped valueType is what refuses a literal of
352
+ // another type (`hasIntersection(numberList, ["2", 3])`), which CEL's heterogeneous equality
353
+ // never matches and which a store would otherwise be handed to coerce.
354
+ return (0, fields_1.buildMembershipFilter)(context, fieldRef, rightOperand.value);
355
+ }
356
+ if (fieldRef.valueType !== undefined) {
357
+ throw new errors_1.UnsupportedQueryPlanError("hasIntersection over a scalar attribute is a CEL error, which a Prisma filter cannot express");
358
+ }
359
+ return { [(0, mapping_1.getLeafField)(fieldRef.path)]: { some: rightOperand.value } };
360
+ }
361
+ /** `hasIntersection(collection.map(x, x.field), [literals])`. */
362
+ function handleMapIntersection(mapOperands, rightOperand, context) {
363
+ if (!(0, plan_1.isValueOperand)(rightOperand)) {
364
+ throw new errors_1.UnsupportedQueryPlanError("Second operand of hasIntersection must be a value");
365
+ }
366
+ const collection = (0, plan_1.assertDefined)(mapOperands[0], "Map expression must include a collection reference");
367
+ const lambda = (0, plan_1.assertDefined)(mapOperands[1], "Map expression must include a lambda expression");
368
+ if (!(0, plan_1.isNamedOperand)(collection)) {
369
+ throw new errors_1.UnsupportedQueryPlanError("First operand of map must be a collection reference");
370
+ }
371
+ if (!(0, plan_1.isOperatorOperand)(lambda)) {
372
+ throw new errors_1.UnsupportedQueryPlanError("Lambda expression must have operands");
373
+ }
374
+ assertSingleVariableLambda("map", lambda);
375
+ const variable = (0, plan_1.assertDefined)(lambda.operands[1], "Lambda variable must have a name");
376
+ if (!(0, plan_1.isNamedOperand)(variable)) {
377
+ throw new errors_1.UnsupportedQueryPlanError("Lambda variable must have a name");
378
+ }
379
+ const { relations } = (0, mapping_1.resolveFieldReference)(collection.name, context);
380
+ if (!relations || relations.length === 0) {
381
+ throw new errors_1.UnsupportedQueryPlanError("Map operation requires relations");
382
+ }
383
+ const projection = (0, plan_1.assertDefined)(lambda.operands[0], "Invalid map lambda expression structure");
384
+ if (!(0, plan_1.isNamedOperand)(projection)) {
385
+ throw new errors_1.UnsupportedQueryPlanError("Invalid map lambda expression structure");
386
+ }
387
+ // Resolve the projection through the scoped mapper, collecting nullable element columns.
388
+ const scope = newLambdaScope(variable.name, relations);
389
+ const resolved = (0, mapping_1.resolveFieldReference)(projection.name, (0, mapping_1.enterLambdaScope)(context, collection.name, scope));
390
+ const fieldName = (0, mapping_1.getLeafField)(resolved.path);
391
+ if (!Array.isArray(rightOperand.value))
392
+ throw new errors_1.UnsupportedQueryPlanError("hasIntersection requires a literal list");
393
+ const base = (0, relations_1.wrapInRelations)(relations, (0, fields_1.buildMembershipFilter)(context, { ...resolved, path: [fieldName], relations: [] }, rightOperand.value));
394
+ if (scope.nullableFields.size === 0) {
395
+ return base;
396
+ }
397
+ // CEL map() errors if ANY element is missing the projected attribute — even alongside a
398
+ // matching element — and Cerbos treats that error as deny. Exclude rows holding an
399
+ // element whose projected (nullable) column is NULL.
400
+ return {
401
+ AND: [
402
+ base,
403
+ { NOT: (0, relations_1.wrapInRelations)(relations, (0, fields_1.buildNullWitnessFilter)(scope.nullableFields)) },
404
+ ],
405
+ };
406
+ }
407
+ /**
408
+ * Helper function to handle "lambda" operator
409
+ */
410
+ function handleLambdaOperator(operands, context) {
411
+ const condition = (0, plan_1.assertDefined)(operands[0], "Lambda requires a condition operand");
412
+ const variable = (0, plan_1.assertDefined)(operands[1], "Lambda requires a variable operand");
413
+ if (!(0, plan_1.isNamedOperand)(variable)) {
414
+ throw new errors_1.UnsupportedQueryPlanError("Lambda variable must have a name");
415
+ }
416
+ return (0, translate_1.buildPrismaFilterFromCerbosExpression)(condition, {
417
+ ...context,
418
+ mapper: (key) => ({ field: key.replace(`${variable.name}.`, "") }),
419
+ });
420
+ }
421
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { PlanExpressionOperand } from "@cerbos/core";
2
+ import type { PrismaFilter } from "./index";
3
+ import type { TranslationContext } from "./mapping";
4
+ /**
5
+ * Helper function to process relational operators (eq, ne, lt, etc.)
6
+ */
7
+ export declare function handleRelationalOperator(operator: string, operands: PlanExpressionOperand[], context: TranslationContext): PrismaFilter;
8
+ /** Whether a map-literal lookup appears anywhere in `operand`. */
9
+ export declare function containsMapLiteralLookup(operand: PlanExpressionOperand): boolean;
10
+ /**
11
+ * `{"k1": v1, "k2": v2}[x] == v` (and `!=`, either side first), with `x` a string column: the keys
12
+ * whose value equals `v` are exactly the values of `x` that make it true, and every other key the
13
+ * values that make it false. Any `x` that is not a key is an error, true under neither polarity,
14
+ * so the comparison and its negation are two membership tests, never one test and its NOT:
15
+ * `negated` asks for the negation's filter, and buildNegatedFilter pushes every `not` above a
16
+ * lookup down to it. Inside a lambda body a macro negates its body with a plain NOT, so the
17
+ * lookup is refused there.
18
+ */
19
+ export declare function tryHandleMapLiteralLookup(operator: string, operands: PlanExpressionOperand[], context: TranslationContext, negated?: boolean): PrismaFilter | null;
20
+ /**
21
+ * Helper function to handle "in" operator
22
+ */
23
+ export declare function handleInOperator(operands: PlanExpressionOperand[], context: TranslationContext): PrismaFilter;
24
+ //# sourceMappingURL=comparison.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.d.ts","sourceRoot":"","sources":["../src/comparison.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAS,MAAM,cAAc,CAAC;AAWjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAW5C,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,WAAW,CAAC;AA0BnB;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CAmHd;AAaD,kEAAkE;AAClE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAIhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,UAAQ,GACd,YAAY,GAAG,IAAI,CAkDrB;AAuvBD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CA8Dd"}