@cerbos/orm-prisma 4.0.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.
- package/README.md +611 -460
- package/lib/collections.d.ts +30 -0
- package/lib/collections.d.ts.map +1 -0
- package/lib/collections.js +421 -0
- package/lib/collections.js.map +1 -0
- package/lib/comparison.d.ts +24 -0
- package/lib/comparison.d.ts.map +1 -0
- package/lib/comparison.js +731 -0
- package/lib/comparison.js.map +1 -0
- package/lib/errors.d.ts +13 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +17 -0
- package/lib/errors.js.map +1 -0
- package/lib/evaluate.d.ts +5 -0
- package/lib/evaluate.d.ts.map +1 -0
- package/lib/evaluate.js +118 -0
- package/lib/evaluate.js.map +1 -0
- package/lib/fields.d.ts +34 -0
- package/lib/fields.d.ts.map +1 -0
- package/lib/fields.js +253 -0
- package/lib/fields.js.map +1 -0
- package/lib/functions.d.ts +5 -0
- package/lib/functions.d.ts.map +1 -0
- package/lib/functions.js +408 -0
- package/lib/functions.js.map +1 -0
- package/lib/hierarchy.d.ts +6 -0
- package/lib/hierarchy.d.ts.map +1 -0
- package/lib/hierarchy.js +266 -0
- package/lib/hierarchy.js.map +1 -0
- package/lib/index.d.ts +91 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +34 -2301
- package/lib/index.js.map +1 -1
- package/lib/literals.d.ts +20 -0
- package/lib/literals.d.ts.map +1 -0
- package/lib/literals.js +290 -0
- package/lib/literals.js.map +1 -0
- package/lib/mapping.d.ts +95 -0
- package/lib/mapping.d.ts.map +1 -0
- package/lib/mapping.js +316 -0
- package/lib/mapping.js.map +1 -0
- package/lib/narrowing.d.ts +12 -0
- package/lib/narrowing.d.ts.map +1 -0
- package/lib/narrowing.js +32 -0
- package/lib/narrowing.js.map +1 -0
- package/lib/plan.d.ts +49 -0
- package/lib/plan.d.ts.map +1 -0
- package/lib/plan.js +86 -0
- package/lib/plan.js.map +1 -0
- package/lib/presence.d.ts +25 -0
- package/lib/presence.d.ts.map +1 -0
- package/lib/presence.js +82 -0
- package/lib/presence.js.map +1 -0
- package/lib/regex.d.ts +33 -0
- package/lib/regex.d.ts.map +1 -0
- package/lib/regex.js +480 -0
- package/lib/regex.js.map +1 -0
- package/lib/relations.d.ts +58 -0
- package/lib/relations.d.ts.map +1 -0
- package/lib/relations.js +175 -0
- package/lib/relations.js.map +1 -0
- package/lib/rewrite.d.ts +36 -0
- package/lib/rewrite.d.ts.map +1 -0
- package/lib/rewrite.js +366 -0
- package/lib/rewrite.js.map +1 -0
- package/lib/solve.d.ts +20 -0
- package/lib/solve.d.ts.map +1 -0
- package/lib/solve.js +77 -0
- package/lib/solve.js.map +1 -0
- package/lib/strings.d.ts +12 -0
- package/lib/strings.d.ts.map +1 -0
- package/lib/strings.js +110 -0
- package/lib/strings.js.map +1 -0
- package/lib/ternary.d.ts +12 -0
- package/lib/ternary.d.ts.map +1 -0
- package/lib/ternary.js +192 -0
- package/lib/ternary.js.map +1 -0
- package/lib/timestamp.d.ts +45 -0
- package/lib/timestamp.d.ts.map +1 -0
- package/lib/timestamp.js +225 -0
- package/lib/timestamp.js.map +1 -0
- package/lib/translate.d.ts +20 -0
- package/lib/translate.d.ts.map +1 -0
- package/lib/translate.js +287 -0
- package/lib/translate.js.map +1 -0
- package/lib/types.d.ts +29 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +980 -0
- package/lib/types.js.map +1 -0
- package/lib/value.d.ts +8 -0
- package/lib/value.d.ts.map +1 -0
- package/lib/value.js +7 -0
- package/lib/value.js.map +1 -0
- package/package.json +31 -18
- package/src/adversarial.test.ts +488 -488
- package/src/collections.ts +738 -0
- package/src/comparison.ts +1157 -0
- package/src/corpus.ts +597 -0
- package/src/errors.ts +12 -0
- package/src/evaluate.ts +170 -0
- package/src/fields.ts +373 -0
- package/src/functions.ts +548 -0
- package/src/generated/prisma-adversarial/browser.ts +20 -0
- package/src/generated/prisma-adversarial/client.ts +20 -0
- package/src/generated/prisma-adversarial/commonInputTypes.ts +116 -127
- package/src/generated/prisma-adversarial/internal/class.ts +44 -4
- package/src/generated/prisma-adversarial/internal/prismaNamespace.ts +350 -3
- package/src/generated/prisma-adversarial/internal/prismaNamespaceBrowser.ts +49 -2
- package/src/generated/prisma-adversarial/models/AdversarialBoolListElement.ts +1272 -0
- package/src/generated/prisma-adversarial/models/AdversarialInner.ts +1369 -0
- package/src/generated/prisma-adversarial/models/AdversarialNumberListElement.ts +1316 -0
- package/src/generated/prisma-adversarial/models/AdversarialParent.ts +1474 -0
- package/src/generated/prisma-adversarial/models/AdversarialResource.ts +547 -75
- package/src/generated/prisma-adversarial/models.ts +4 -0
- package/src/generated/prisma-adversarial-mysql/browser.ts +64 -0
- package/src/generated/{prisma → prisma-adversarial-mysql}/client.ts +23 -18
- package/src/generated/{prisma → prisma-adversarial-mysql}/commonInputTypes.ts +167 -92
- package/src/generated/prisma-adversarial-mysql/internal/class.ts +284 -0
- package/src/generated/prisma-adversarial-mysql/internal/prismaNamespace.ts +1518 -0
- package/src/generated/prisma-adversarial-mysql/internal/prismaNamespaceBrowser.ts +274 -0
- package/src/generated/prisma-adversarial-mysql/models/AdversarialBoolListElement.ts +1157 -0
- package/src/generated/prisma-adversarial-mysql/models/AdversarialCategory.ts +1286 -0
- package/src/generated/prisma-adversarial-mysql/models/AdversarialInner.ts +1247 -0
- package/src/generated/prisma-adversarial-mysql/models/AdversarialLabel.ts +1157 -0
- package/src/generated/prisma-adversarial-mysql/models/AdversarialNumberListElement.ts +1201 -0
- package/src/generated/prisma-adversarial-mysql/models/AdversarialParent.ts +1352 -0
- package/src/generated/prisma-adversarial-mysql/models/AdversarialResource.ts +2021 -0
- package/src/generated/prisma-adversarial-mysql/models/AdversarialSubCategory.ts +1286 -0
- package/src/generated/prisma-adversarial-mysql/models/AdversarialTag.ts +1190 -0
- package/src/generated/prisma-adversarial-mysql/models.ts +20 -0
- package/src/generated/prisma-adversarial-mysql-v6/index.d.ts +13822 -0
- package/src/generated/prisma-adversarial-pg/browser.ts +64 -0
- package/src/generated/prisma-adversarial-pg/client.ts +86 -0
- package/src/generated/prisma-adversarial-pg/commonInputTypes.ts +345 -0
- package/src/generated/prisma-adversarial-pg/enums.ts +15 -0
- package/src/generated/prisma-adversarial-pg/internal/class.ts +284 -0
- package/src/generated/prisma-adversarial-pg/internal/prismaNamespace.ts +1542 -0
- package/src/generated/{prisma → prisma-adversarial-pg}/internal/prismaNamespaceBrowser.ts +72 -43
- package/src/generated/prisma-adversarial-pg/models/AdversarialBoolListElement.ts +1275 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialCategory.ts +1404 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialInner.ts +1371 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialLabel.ts +1275 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialNumberListElement.ts +1319 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialParent.ts +1476 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialResource.ts +2139 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialSubCategory.ts +1404 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialTag.ts +1310 -0
- package/src/generated/prisma-adversarial-pg/models.ts +20 -0
- package/src/generated/prisma-adversarial-pg-v6/client.d.ts +1 -0
- package/src/generated/prisma-adversarial-pg-v6/default.d.ts +1 -0
- package/src/generated/prisma-adversarial-pg-v6/edge.d.ts +1 -0
- package/src/generated/prisma-adversarial-pg-v6/index.d.ts +14918 -0
- package/src/generated/prisma-adversarial-pg-v6/runtime/index-browser.d.ts +370 -0
- package/src/generated/prisma-adversarial-pg-v6/runtime/library.d.ts +3982 -0
- package/src/generated/prisma-adversarial-pg-v6/wasm.d.ts +1 -0
- package/src/generated/prisma-adversarial-v6/index.d.ts +6515 -304
- package/src/hierarchy.ts +405 -0
- package/src/index.ts +134 -3325
- package/src/literals.ts +363 -0
- package/src/mapping.ts +474 -0
- package/src/narrowing.ts +33 -0
- package/src/plan.ts +125 -0
- package/src/presence.ts +114 -0
- package/src/regex.ts +596 -0
- package/src/relations.ts +226 -0
- package/src/rewrite.ts +524 -0
- package/src/solve.ts +96 -0
- package/src/strings.ts +152 -0
- package/src/ternary.ts +359 -0
- package/src/test-setup.adversarial-url.ts +21 -0
- package/src/test-setup.adversarial.mysql.v6.ts +13 -0
- package/src/test-setup.adversarial.mysql.v7.ts +12 -0
- package/src/test-setup.adversarial.pg.v6.ts +13 -0
- package/src/test-setup.adversarial.pg.v7.ts +9 -0
- package/src/test-setup.adversarial.v7.ts +1 -0
- package/src/timestamp.ts +308 -0
- package/src/translate.ts +419 -0
- package/src/translator.test.ts +766 -0
- package/src/types.ts +1310 -0
- package/src/value.ts +16 -0
- package/src/generated/prisma/browser.ts +0 -59
- package/src/generated/prisma/internal/class.ts +0 -274
- package/src/generated/prisma/internal/prismaNamespace.ts +0 -1403
- package/src/generated/prisma/models/Category.ts +0 -1412
- package/src/generated/prisma/models/Label.ts +0 -1276
- package/src/generated/prisma/models/NestedResource.ts +0 -1562
- package/src/generated/prisma/models/NextLevelNestedResource.ts +0 -1337
- package/src/generated/prisma/models/Resource.ts +0 -2196
- package/src/generated/prisma/models/SubCategory.ts +0 -1412
- package/src/generated/prisma/models/Tag.ts +0 -1276
- package/src/generated/prisma/models/User.ts +0 -1503
- package/src/generated/prisma/models.ts +0 -19
- package/src/generated/prisma-v6/index.d.ts +0 -13726
- package/src/index.test.ts +0 -8885
- package/src/test-setup.v6.ts +0 -5
- package/src/test-setup.v7.ts +0 -7
- /package/src/generated/{prisma → prisma-adversarial-mysql}/enums.ts +0 -0
- /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/client.d.ts +0 -0
- /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/default.d.ts +0 -0
- /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/edge.d.ts +0 -0
- /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/runtime/index-browser.d.ts +0 -0
- /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/runtime/library.d.ts +0 -0
- /package/src/generated/{prisma-v6 → prisma-adversarial-mysql-v6}/wasm.d.ts +0 -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"}
|