@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.
- package/README.md +598 -603
- 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 +23 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +34 -2555
- 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 +27 -17
- package/src/adversarial.test.ts +376 -1071
- package/src/collections.ts +738 -0
- package/src/comparison.ts +1157 -0
- package/src/corpus.ts +433 -250
- 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 +10 -0
- package/src/generated/prisma-adversarial/client.ts +10 -0
- package/src/generated/prisma-adversarial/commonInputTypes.ts +116 -127
- package/src/generated/prisma-adversarial/internal/class.ts +24 -4
- package/src/generated/prisma-adversarial/internal/prismaNamespace.ts +174 -3
- package/src/generated/prisma-adversarial/internal/prismaNamespaceBrowser.ts +23 -2
- package/src/generated/prisma-adversarial/models/AdversarialBoolListElement.ts +1272 -0
- package/src/generated/prisma-adversarial/models/AdversarialInner.ts +54 -54
- package/src/generated/prisma-adversarial/models/AdversarialNumberListElement.ts +1316 -0
- package/src/generated/prisma-adversarial/models/AdversarialParent.ts +66 -66
- package/src/generated/prisma-adversarial/models/AdversarialResource.ts +435 -87
- package/src/generated/prisma-adversarial/models.ts +2 -0
- package/src/generated/prisma-adversarial-mysql/browser.ts +64 -0
- package/src/generated/prisma-adversarial-mysql/client.ts +86 -0
- package/src/generated/prisma-adversarial-mysql/commonInputTypes.ts +349 -0
- package/src/generated/prisma-adversarial-mysql/enums.ts +15 -0
- 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/client.d.ts +1 -0
- package/src/generated/prisma-adversarial-mysql-v6/default.d.ts +1 -0
- package/src/generated/prisma-adversarial-mysql-v6/edge.d.ts +1 -0
- package/src/generated/prisma-adversarial-mysql-v6/index.d.ts +13822 -0
- package/src/generated/prisma-adversarial-mysql-v6/runtime/index-browser.d.ts +370 -0
- package/src/generated/prisma-adversarial-mysql-v6/runtime/library.d.ts +3982 -0
- package/src/generated/prisma-adversarial-mysql-v6/wasm.d.ts +1 -0
- package/src/generated/prisma-adversarial-pg/browser.ts +10 -0
- package/src/generated/prisma-adversarial-pg/client.ts +10 -0
- package/src/generated/prisma-adversarial-pg/commonInputTypes.ts +118 -129
- package/src/generated/prisma-adversarial-pg/internal/class.ts +24 -4
- package/src/generated/prisma-adversarial-pg/internal/prismaNamespace.ts +174 -3
- package/src/generated/prisma-adversarial-pg/internal/prismaNamespaceBrowser.ts +23 -2
- package/src/generated/prisma-adversarial-pg/models/AdversarialBoolListElement.ts +1275 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialInner.ts +54 -54
- package/src/generated/prisma-adversarial-pg/models/AdversarialNumberListElement.ts +1319 -0
- package/src/generated/prisma-adversarial-pg/models/AdversarialParent.ts +66 -66
- package/src/generated/prisma-adversarial-pg/models/AdversarialResource.ts +435 -87
- package/src/generated/prisma-adversarial-pg/models.ts +2 -0
- package/src/generated/prisma-adversarial-pg-v6/index.d.ts +3476 -388
- package/src/generated/prisma-adversarial-v6/index.d.ts +3465 -383
- package/src/hierarchy.ts +405 -0
- package/src/index.ts +66 -3646
- 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 +6 -3
- 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.v7.ts +1 -0
- package/src/timestamp.ts +308 -0
- package/src/translate.ts +419 -0
- package/src/translator.test.ts +497 -1317
- package/src/types.ts +1310 -0
- package/src/value.ts +16 -0
package/lib/presence.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// `has()`, the presence test the planner emits from Cerbos 0.57.0 for an attribute it does not
|
|
3
|
+
// fold into a guard: whether the caller's attributes carry the key at all.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.handleHasOperator = handleHasOperator;
|
|
6
|
+
exports.constantPresence = constantPresence;
|
|
7
|
+
const mapping_1 = require("./mapping");
|
|
8
|
+
const plan_1 = require("./plan");
|
|
9
|
+
const relations_1 = require("./relations");
|
|
10
|
+
const errors_1 = require("./errors");
|
|
11
|
+
/**
|
|
12
|
+
* `has(ref)`, or `!has(ref)` when `negated`.
|
|
13
|
+
*
|
|
14
|
+
* Presence is a property of the caller's null convention, not of the column: an attribute sent as
|
|
15
|
+
* an explicit null is present, so `has()` is true for every row, and one omitted when its column
|
|
16
|
+
* is NULL is present exactly when the column is not NULL. Element columns inside a lambda follow
|
|
17
|
+
* the omitted convention unless they are declared `nullable: false`, as the collection macros
|
|
18
|
+
* already assume. A to-one relation is present when the related row exists.
|
|
19
|
+
*
|
|
20
|
+
* `has()` itself never errors on a missing value, so `!has()` is a plain NOT. The one error it can
|
|
21
|
+
* raise is selecting through a missing to-one hop, `has(parent.x)` on a parentless row, which
|
|
22
|
+
* denies under both polarities, so every hop BEFORE the tested key is required outside the NOT.
|
|
23
|
+
*/
|
|
24
|
+
function handleHasOperator(operands, context, negated) {
|
|
25
|
+
const [operand] = operands;
|
|
26
|
+
if (operands.length !== 1 || operand === undefined || !(0, plan_1.isNamedOperand)(operand)) {
|
|
27
|
+
throw new errors_1.UnsupportedQueryPlanError("has requires exactly one attribute reference");
|
|
28
|
+
}
|
|
29
|
+
const fieldRef = (0, mapping_1.resolveFieldReference)(operand.name, context);
|
|
30
|
+
const relations = fieldRef.relations ?? [];
|
|
31
|
+
if (relations.some((relation) => relation.type === "many")) {
|
|
32
|
+
throw new errors_1.UnsupportedQueryPlanError(`Cannot translate has(${operand.name}): a presence test over a to-many relation has no ` +
|
|
33
|
+
"Prisma filter that matches what the caller sends for it");
|
|
34
|
+
}
|
|
35
|
+
let presence;
|
|
36
|
+
let hops = relations;
|
|
37
|
+
if ((0, mapping_1.namesToOneRelation)(context.mapper, operand.name)) {
|
|
38
|
+
presence = (0, relations_1.wrapInRelations)(relations, {});
|
|
39
|
+
hops = relations.slice(0, -1);
|
|
40
|
+
}
|
|
41
|
+
else if (presenceFollowsColumn(operand.name, fieldRef, context)) {
|
|
42
|
+
presence = (0, relations_1.wrapInRelations)(relations, {
|
|
43
|
+
[(0, mapping_1.getLeafField)(fieldRef.path)]: { not: null },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
presence = (0, relations_1.wrapInRelations)(relations, {});
|
|
48
|
+
}
|
|
49
|
+
if (!negated)
|
|
50
|
+
return presence;
|
|
51
|
+
const absence = (0, relations_1.negateFilter)(presence);
|
|
52
|
+
return hops.length === 0 ? absence : { AND: [(0, relations_1.wrapInRelations)(hops, {}), absence] };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* `has(R.attr.x)` on an attribute sent as an explicit null is true on every row, so it becomes the
|
|
56
|
+
* constant `true` before translation. Left to the translator it lowers to `{}`, which Prisma drops
|
|
57
|
+
* from an OR or a NOT, losing the rows it admits and, negated, admitting rows it denies.
|
|
58
|
+
*/
|
|
59
|
+
function constantPresence(node, context) {
|
|
60
|
+
const [operand] = node.operands;
|
|
61
|
+
if (node.operator !== "has" ||
|
|
62
|
+
node.operands.length !== 1 ||
|
|
63
|
+
operand === undefined ||
|
|
64
|
+
!(0, plan_1.isNamedOperand)(operand) ||
|
|
65
|
+
!operand.name.startsWith("request.") ||
|
|
66
|
+
(0, mapping_1.namesToOneRelation)(context.mapper, operand.name)) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
const fieldRef = (0, mapping_1.resolveFieldReference)(operand.name, context);
|
|
70
|
+
if ((fieldRef.relations ?? []).length > 0)
|
|
71
|
+
return undefined;
|
|
72
|
+
return presenceFollowsColumn(operand.name, fieldRef, context) ? undefined : { value: true };
|
|
73
|
+
}
|
|
74
|
+
/** Whether a NULL column means the key is absent, rather than sent as an explicit null. */
|
|
75
|
+
function presenceFollowsColumn(reference, fieldRef, context) {
|
|
76
|
+
const element = context.scopes.some((scope) => reference.startsWith(scope.variableName + "."));
|
|
77
|
+
if (element && fieldRef.nullAttributeRepresentation === undefined) {
|
|
78
|
+
return fieldRef.nullable !== false;
|
|
79
|
+
}
|
|
80
|
+
return ((fieldRef.nullAttributeRepresentation ?? context.nullRepresentation) === "omitted");
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.js","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
|
package/lib/regex.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PlanExpressionOperand } from "@cerbos/core";
|
|
2
|
+
import type { PrismaFilter } from "./index";
|
|
3
|
+
import type { TranslationContext } from "./mapping";
|
|
4
|
+
/** One position of an expanded pattern: a literal character, `.` (not a newline), or `.*`. */
|
|
5
|
+
type Token = {
|
|
6
|
+
char: string;
|
|
7
|
+
} | {
|
|
8
|
+
any: true;
|
|
9
|
+
} | {
|
|
10
|
+
star: true;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A pattern RE2 itself rejects, as the parser below sees it. Whether RE2 rejects a pattern is
|
|
14
|
+
* decided by re2js (isInvalidPattern), not by this parser, whose refusals are always safe.
|
|
15
|
+
*/
|
|
16
|
+
export declare class InvalidRegexError extends Error {
|
|
17
|
+
}
|
|
18
|
+
type Expansion = {
|
|
19
|
+
begin: boolean;
|
|
20
|
+
end: boolean;
|
|
21
|
+
tokens: Token[];
|
|
22
|
+
};
|
|
23
|
+
/** The pattern as alternatives, each anchored at its ends or not. */
|
|
24
|
+
export declare function expandPattern(pattern: string): Expansion[];
|
|
25
|
+
/**
|
|
26
|
+
* Whether the pattern is one RE2 rejects, so that `matches()` raises an error on every row: what
|
|
27
|
+
* re2js, a port of RE2, refuses to compile. A pattern this adapter cannot translate is not invalid;
|
|
28
|
+
* it is refused when translated.
|
|
29
|
+
*/
|
|
30
|
+
export declare function isInvalidPattern(pattern: string): boolean;
|
|
31
|
+
export declare function handleMatchesOperator(operands: PlanExpressionOperand[], context: TranslationContext): PrismaFilter;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=regex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../src/regex.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAI1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAA0B,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAU5E,8FAA8F;AAC9F,KAAK,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAU/D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AA4U/C,KAAK,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AA8DnE,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAuB1D;AA8ED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAaD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,EAAE,kBAAkB,GAC1B,YAAY,CA0Cd"}
|
package/lib/regex.js
ADDED
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// `matches(column, "pattern")` for the RE2 patterns whose language a boolean combination of LIKE
|
|
3
|
+
// filters decides exactly. Everything else is refused.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.InvalidRegexError = void 0;
|
|
6
|
+
exports.expandPattern = expandPattern;
|
|
7
|
+
exports.isInvalidPattern = isInvalidPattern;
|
|
8
|
+
exports.handleMatchesOperator = handleMatchesOperator;
|
|
9
|
+
const re2js_1 = require("re2js");
|
|
10
|
+
const fields_1 = require("./fields");
|
|
11
|
+
const mapping_1 = require("./mapping");
|
|
12
|
+
const plan_1 = require("./plan");
|
|
13
|
+
const errors_1 = require("./errors");
|
|
14
|
+
const narrowing_1 = require("./narrowing");
|
|
15
|
+
/** Past this many alternatives, a pattern is refused rather than spelled out. */
|
|
16
|
+
const MAX_ALTERNATIVES = 256;
|
|
17
|
+
/**
|
|
18
|
+
* A pattern RE2 itself rejects, as the parser below sees it. Whether RE2 rejects a pattern is
|
|
19
|
+
* decided by re2js (isInvalidPattern), not by this parser, whose refusals are always safe.
|
|
20
|
+
*/
|
|
21
|
+
class InvalidRegexError extends Error {
|
|
22
|
+
}
|
|
23
|
+
exports.InvalidRegexError = InvalidRegexError;
|
|
24
|
+
function refuse(pattern, why) {
|
|
25
|
+
throw new errors_1.UnsupportedQueryPlanError(`Cannot translate matches() with pattern ${JSON.stringify(pattern)}: ${why}. Prisma has no ` +
|
|
26
|
+
"regex filter; only patterns a combination of LIKE filters decides exactly are translated");
|
|
27
|
+
}
|
|
28
|
+
const DIGITS = [..."0123456789"];
|
|
29
|
+
/**
|
|
30
|
+
* A repetition count, `{n}`, `{n,}` or `{n,m}`; any other brace is a literal to RE2. A count is
|
|
31
|
+
* read as Go's `regexp/syntax` `parseInt` reads it, which takes no leading zero: `a{01}` is `a`
|
|
32
|
+
* then the text "{01}".
|
|
33
|
+
*/
|
|
34
|
+
const REPEAT = /^\{(0|[1-9]\d*)(,(0|[1-9]\d*)?)?\}/;
|
|
35
|
+
/** RE2's bound on the copies a counted repetition, nested ones included, may make. */
|
|
36
|
+
const MAX_REPEAT = 1000;
|
|
37
|
+
/**
|
|
38
|
+
* Go's `repeatIsValid`: each repetition divides the budget by its count (its maximum, or its
|
|
39
|
+
* minimum when unbounded), and a count beyond what is left is invalid: `(a{2}){600}`.
|
|
40
|
+
*/
|
|
41
|
+
function repeatIsValid(node, budget) {
|
|
42
|
+
switch (node.kind) {
|
|
43
|
+
case "repeat": {
|
|
44
|
+
if (node.max === 0)
|
|
45
|
+
return true;
|
|
46
|
+
const count = node.max === Infinity ? node.min : node.max;
|
|
47
|
+
if (count > budget)
|
|
48
|
+
return false;
|
|
49
|
+
return repeatIsValid(node.node, count === 0 ? budget : Math.floor(budget / count));
|
|
50
|
+
}
|
|
51
|
+
case "alt":
|
|
52
|
+
return node.branches.every((branch) => branch.every((inner) => repeatIsValid(inner, budget)));
|
|
53
|
+
default:
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** RE2's simple case folding over ASCII letters: `k` and `s` fold with a non-ASCII sign too. */
|
|
58
|
+
function foldOrbit(char) {
|
|
59
|
+
const lower = char.toLowerCase();
|
|
60
|
+
if (!/^[a-z]$/.test(lower))
|
|
61
|
+
return [char];
|
|
62
|
+
const orbit = [lower, lower.toUpperCase()];
|
|
63
|
+
if (lower === "k")
|
|
64
|
+
orbit.push("K");
|
|
65
|
+
if (lower === "s")
|
|
66
|
+
orbit.push("ſ");
|
|
67
|
+
return orbit;
|
|
68
|
+
}
|
|
69
|
+
/** A recursive-descent parser over the pattern's code points (RE2 matches code points). */
|
|
70
|
+
class Parser {
|
|
71
|
+
pattern;
|
|
72
|
+
index = 0;
|
|
73
|
+
caseInsensitive = false;
|
|
74
|
+
chars;
|
|
75
|
+
constructor(pattern) {
|
|
76
|
+
this.pattern = pattern;
|
|
77
|
+
this.chars = Array.from(pattern);
|
|
78
|
+
}
|
|
79
|
+
parse() {
|
|
80
|
+
if (this.pattern.startsWith("(?i)")) {
|
|
81
|
+
this.caseInsensitive = true;
|
|
82
|
+
this.index = 4;
|
|
83
|
+
}
|
|
84
|
+
const branches = this.alternation();
|
|
85
|
+
if (this.index !== this.chars.length)
|
|
86
|
+
refuse(this.pattern, "unbalanced parenthesis");
|
|
87
|
+
return branches;
|
|
88
|
+
}
|
|
89
|
+
peek(offset = 0) {
|
|
90
|
+
return this.chars[this.index + offset];
|
|
91
|
+
}
|
|
92
|
+
rest() {
|
|
93
|
+
return this.chars.slice(this.index).join("");
|
|
94
|
+
}
|
|
95
|
+
next() {
|
|
96
|
+
return this.chars[this.index++];
|
|
97
|
+
}
|
|
98
|
+
alternation() {
|
|
99
|
+
const branches = [this.sequence()];
|
|
100
|
+
while (this.peek() === "|") {
|
|
101
|
+
this.index++;
|
|
102
|
+
branches.push(this.sequence());
|
|
103
|
+
}
|
|
104
|
+
return branches;
|
|
105
|
+
}
|
|
106
|
+
sequence() {
|
|
107
|
+
const nodes = [];
|
|
108
|
+
for (let char = this.peek(); char !== undefined && char !== "|" && char !== ")"; char = this.peek()) {
|
|
109
|
+
nodes.push(this.quantified(this.atom()));
|
|
110
|
+
}
|
|
111
|
+
return nodes;
|
|
112
|
+
}
|
|
113
|
+
quantified(node) {
|
|
114
|
+
const char = this.peek();
|
|
115
|
+
let min;
|
|
116
|
+
let max;
|
|
117
|
+
if (char === "*" || char === "+" || char === "?") {
|
|
118
|
+
this.index++;
|
|
119
|
+
[min, max] = char === "*" ? [0, Infinity] : char === "+" ? [1, Infinity] : [0, 1];
|
|
120
|
+
}
|
|
121
|
+
else if (char === "{") {
|
|
122
|
+
const match = REPEAT.exec(this.rest());
|
|
123
|
+
// RE2 reads a brace that does not open a repetition as a literal.
|
|
124
|
+
if (match === null)
|
|
125
|
+
return node;
|
|
126
|
+
this.index += Array.from(match[0]).length;
|
|
127
|
+
min = Number(match[1]);
|
|
128
|
+
max = match[2] === undefined ? min : match[3] === undefined ? Infinity : Number(match[3]);
|
|
129
|
+
if (min > MAX_REPEAT || (max !== Infinity && (max > MAX_REPEAT || max < min))) {
|
|
130
|
+
throw new InvalidRegexError("invalid repeat count");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
return node;
|
|
135
|
+
}
|
|
136
|
+
const next = this.peek();
|
|
137
|
+
if (next === "?")
|
|
138
|
+
refuse(this.pattern, "non-greedy repetition");
|
|
139
|
+
if (next === "*" || next === "+" || (next === "{" && REPEAT.test(this.rest()))) {
|
|
140
|
+
throw new InvalidRegexError("invalid nested repetition");
|
|
141
|
+
}
|
|
142
|
+
if (node.kind === "begin" || node.kind === "end") {
|
|
143
|
+
refuse(this.pattern, "a repeated anchor");
|
|
144
|
+
}
|
|
145
|
+
const repeat = { kind: "repeat", node, min, max };
|
|
146
|
+
if (!repeatIsValid(repeat, MAX_REPEAT))
|
|
147
|
+
throw new InvalidRegexError("invalid repeat count");
|
|
148
|
+
return repeat;
|
|
149
|
+
}
|
|
150
|
+
atom() {
|
|
151
|
+
const char = this.next();
|
|
152
|
+
switch (char) {
|
|
153
|
+
case "^":
|
|
154
|
+
return { kind: "begin" };
|
|
155
|
+
case "$":
|
|
156
|
+
return { kind: "end" };
|
|
157
|
+
case ".":
|
|
158
|
+
return { kind: "any" };
|
|
159
|
+
case "(": {
|
|
160
|
+
if (this.peek() === "?") {
|
|
161
|
+
const rest = this.rest();
|
|
162
|
+
if (/^\?(=|!|<=|<!)/.test(rest))
|
|
163
|
+
throw new InvalidRegexError("lookaround");
|
|
164
|
+
if (rest.startsWith("?:")) {
|
|
165
|
+
this.index += 2;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
refuse(this.pattern, "a group flag");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const branches = this.alternation();
|
|
172
|
+
if (this.peek() !== ")")
|
|
173
|
+
refuse(this.pattern, "unbalanced parenthesis");
|
|
174
|
+
this.index++;
|
|
175
|
+
return { kind: "alt", branches };
|
|
176
|
+
}
|
|
177
|
+
case "[":
|
|
178
|
+
return this.characterClass();
|
|
179
|
+
case "\\":
|
|
180
|
+
return this.escape();
|
|
181
|
+
case "*":
|
|
182
|
+
case "+":
|
|
183
|
+
case "?":
|
|
184
|
+
throw new InvalidRegexError("missing argument to repetition operator");
|
|
185
|
+
case "{":
|
|
186
|
+
// A count with nothing before it to repeat; a brace that is not a count stays a literal.
|
|
187
|
+
if (REPEAT.test(`{${this.rest()}`)) {
|
|
188
|
+
throw new InvalidRegexError("missing argument to repetition operator");
|
|
189
|
+
}
|
|
190
|
+
return this.literal(char);
|
|
191
|
+
default:
|
|
192
|
+
return this.literal(char);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
literal(char) {
|
|
196
|
+
if (this.caseInsensitive && /[^\x00-\x7F]/.test(char)) {
|
|
197
|
+
refuse(this.pattern, "case-insensitive matching of a non-ASCII character");
|
|
198
|
+
}
|
|
199
|
+
return { kind: "char", chars: this.caseInsensitive ? foldOrbit(char) : [char] };
|
|
200
|
+
}
|
|
201
|
+
escape() {
|
|
202
|
+
const char = this.next();
|
|
203
|
+
if (char === undefined)
|
|
204
|
+
throw new InvalidRegexError("trailing backslash");
|
|
205
|
+
if (char === "d")
|
|
206
|
+
return { kind: "char", chars: DIGITS };
|
|
207
|
+
const octal = this.octalEscape(char);
|
|
208
|
+
if (octal !== undefined)
|
|
209
|
+
return this.literal(octal);
|
|
210
|
+
if (/[A-Za-z0-9]/.test(char))
|
|
211
|
+
refuse(this.pattern, `the escape \\${char}`);
|
|
212
|
+
return this.literal(char);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* The character of an octal escape whose first digit was just read, as Go's regexp/syntax reads
|
|
216
|
+
* it: `\0` on its own, and `\1` to `\7` only when another octal digit follows (alone, each is
|
|
217
|
+
* a backreference, which RE2 rejects); up to three digits in all. `\11` is a tab.
|
|
218
|
+
*/
|
|
219
|
+
octalEscape(first) {
|
|
220
|
+
const isOctal = (c) => c !== undefined && c >= "0" && c <= "7";
|
|
221
|
+
if (!isOctal(first)) {
|
|
222
|
+
if (/[89]/.test(first))
|
|
223
|
+
throw new InvalidRegexError(`invalid escape sequence: \\${first}`);
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
if (first !== "0" && !isOctal(this.peek())) {
|
|
227
|
+
throw new InvalidRegexError(`invalid escape sequence: \\${first}`);
|
|
228
|
+
}
|
|
229
|
+
let code = Number(first);
|
|
230
|
+
for (let digits = 1; digits < 3 && isOctal(this.peek()); digits++) {
|
|
231
|
+
code = code * 8 + Number(this.next());
|
|
232
|
+
}
|
|
233
|
+
return String.fromCodePoint(code);
|
|
234
|
+
}
|
|
235
|
+
characterClass() {
|
|
236
|
+
if (this.peek() === "^")
|
|
237
|
+
refuse(this.pattern, "a negated character class");
|
|
238
|
+
const chars = new Set();
|
|
239
|
+
let first = true;
|
|
240
|
+
for (;;) {
|
|
241
|
+
const char = this.next();
|
|
242
|
+
if (char === undefined)
|
|
243
|
+
throw new InvalidRegexError("missing closing ]");
|
|
244
|
+
if (char === "]" && !first)
|
|
245
|
+
break;
|
|
246
|
+
first = false;
|
|
247
|
+
if (char === "[" && this.rest().startsWith(":digit:]")) {
|
|
248
|
+
this.index += ":digit:]".length;
|
|
249
|
+
DIGITS.forEach((digit) => chars.add(digit));
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
if (char === "[" && this.peek() === ":")
|
|
253
|
+
refuse(this.pattern, "a POSIX class other than digit");
|
|
254
|
+
let from = char;
|
|
255
|
+
if (char === "\\") {
|
|
256
|
+
const escaped = this.next();
|
|
257
|
+
if (escaped === undefined)
|
|
258
|
+
throw new InvalidRegexError("trailing backslash");
|
|
259
|
+
if (escaped === "d") {
|
|
260
|
+
DIGITS.forEach((digit) => chars.add(digit));
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const octal = this.octalEscape(escaped);
|
|
264
|
+
if (octal !== undefined) {
|
|
265
|
+
from = octal;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
if (/[A-Za-z0-9]/.test(escaped))
|
|
269
|
+
refuse(this.pattern, `the escape \\${escaped}`);
|
|
270
|
+
from = escaped;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (this.peek() === "-" && this.peek(1) !== "]") {
|
|
274
|
+
this.index++;
|
|
275
|
+
const to = this.next();
|
|
276
|
+
if (to === undefined || to === "\\")
|
|
277
|
+
refuse(this.pattern, "an escaped class range");
|
|
278
|
+
const start = from.codePointAt(0);
|
|
279
|
+
const end = to.codePointAt(0);
|
|
280
|
+
if (end < start)
|
|
281
|
+
throw new InvalidRegexError("invalid character class range");
|
|
282
|
+
if (end - start > 128)
|
|
283
|
+
refuse(this.pattern, "a wide character range");
|
|
284
|
+
for (let code = start; code <= end; code++)
|
|
285
|
+
chars.add(String.fromCodePoint(code));
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
chars.add(from);
|
|
289
|
+
}
|
|
290
|
+
const members = [...chars].flatMap((char) => {
|
|
291
|
+
if (this.caseInsensitive && /[^\x00-\x7F]/.test(char)) {
|
|
292
|
+
refuse(this.pattern, "case-insensitive matching of a non-ASCII character");
|
|
293
|
+
}
|
|
294
|
+
return this.caseInsensitive ? foldOrbit(char) : [char];
|
|
295
|
+
});
|
|
296
|
+
return { kind: "char", chars: [...new Set(members)] };
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
function product(pattern, left, right) {
|
|
300
|
+
if (left.length * right.length > MAX_ALTERNATIVES) {
|
|
301
|
+
refuse(pattern, `more than ${MAX_ALTERNATIVES} alternatives`);
|
|
302
|
+
}
|
|
303
|
+
return left.flatMap((l) => right.map((r) => [...l, ...r]));
|
|
304
|
+
}
|
|
305
|
+
/** Every token sequence `nodes` (holding no anchor) can match. */
|
|
306
|
+
function expand(pattern, nodes) {
|
|
307
|
+
let sequences = [[]];
|
|
308
|
+
for (const node of nodes) {
|
|
309
|
+
sequences = product(pattern, sequences, expandNode(pattern, node));
|
|
310
|
+
}
|
|
311
|
+
return sequences;
|
|
312
|
+
}
|
|
313
|
+
function expandNode(pattern, node) {
|
|
314
|
+
switch (node.kind) {
|
|
315
|
+
case "char":
|
|
316
|
+
return node.chars.map((char) => [{ char }]);
|
|
317
|
+
case "any":
|
|
318
|
+
return [[{ any: true }]];
|
|
319
|
+
case "alt": {
|
|
320
|
+
const all = node.branches.flatMap((branch) => expand(pattern, branch));
|
|
321
|
+
if (all.length > MAX_ALTERNATIVES)
|
|
322
|
+
refuse(pattern, `more than ${MAX_ALTERNATIVES} alternatives`);
|
|
323
|
+
return all;
|
|
324
|
+
}
|
|
325
|
+
case "repeat": {
|
|
326
|
+
if (node.max === Infinity) {
|
|
327
|
+
if (node.node.kind !== "any")
|
|
328
|
+
refuse(pattern, "unbounded repetition of anything but .");
|
|
329
|
+
return [[...Array.from({ length: node.min }, () => ({ any: true })), { star: true }]];
|
|
330
|
+
}
|
|
331
|
+
const unit = expandNode(pattern, node.node);
|
|
332
|
+
const results = [];
|
|
333
|
+
let power = [[]];
|
|
334
|
+
for (let count = 0; count <= node.max; count++) {
|
|
335
|
+
if (count >= node.min)
|
|
336
|
+
results.push(...power);
|
|
337
|
+
if (results.length > MAX_ALTERNATIVES)
|
|
338
|
+
refuse(pattern, `more than ${MAX_ALTERNATIVES} alternatives`);
|
|
339
|
+
if (count < node.max)
|
|
340
|
+
power = product(pattern, power, unit);
|
|
341
|
+
}
|
|
342
|
+
return results;
|
|
343
|
+
}
|
|
344
|
+
default:
|
|
345
|
+
refuse(pattern, "an anchor inside a group or away from the pattern's ends");
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/** The pattern as alternatives, each anchored at its ends or not. */
|
|
349
|
+
function expandPattern(pattern) {
|
|
350
|
+
const branches = new Parser(pattern).parse();
|
|
351
|
+
const expansions = [];
|
|
352
|
+
for (const branch of branches) {
|
|
353
|
+
let nodes = branch;
|
|
354
|
+
const begin = nodes[0]?.kind === "begin";
|
|
355
|
+
if (begin)
|
|
356
|
+
nodes = nodes.slice(1);
|
|
357
|
+
const end = nodes[nodes.length - 1]?.kind === "end";
|
|
358
|
+
if (end)
|
|
359
|
+
nodes = nodes.slice(0, -1);
|
|
360
|
+
for (const tokens of expand(pattern, nodes)) {
|
|
361
|
+
expansions.push({ begin, end, tokens });
|
|
362
|
+
if (expansions.length > MAX_ALTERNATIVES) {
|
|
363
|
+
refuse(pattern, `more than ${MAX_ALTERNATIVES} alternatives`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return expansions;
|
|
368
|
+
}
|
|
369
|
+
// -- the filter ----------------------------------------------------------------------------------
|
|
370
|
+
const LIKE_METACHARACTERS = /[%_\\]/;
|
|
371
|
+
/**
|
|
372
|
+
* One alternative as a filter on the column. Without a wildcard it is `equals`, `startsWith`,
|
|
373
|
+
* `endsWith` or `contains` as its anchors say. With one, only a pattern anchored at both ends is
|
|
374
|
+
* translated: a LIKE of `_` for `.` and `%` for `.*`, and no newline anywhere in the value — the
|
|
375
|
+
* literal characters are not newlines, so every newline in a match falls in a wildcard, which RE2's
|
|
376
|
+
* `.` does not match.
|
|
377
|
+
*/
|
|
378
|
+
function alternativeFilter(pattern, fieldRef, { begin, end, tokens }) {
|
|
379
|
+
const characters = tokens.flatMap((token) => ("char" in token ? [token.char] : []));
|
|
380
|
+
const literal = characters.length === tokens.length ? characters.join("") : undefined;
|
|
381
|
+
if (literal !== undefined && begin && end) {
|
|
382
|
+
return (0, fields_1.buildFieldFilter)(fieldRef, "equals", literal);
|
|
383
|
+
}
|
|
384
|
+
const likeText = tokens
|
|
385
|
+
.map((token) => ("char" in token ? token.char : "any" in token ? "_" : "%"))
|
|
386
|
+
.join("");
|
|
387
|
+
// A prefix is matched as a range, so it needs no escaping (see buildPrefixFilter).
|
|
388
|
+
if (literal !== undefined && begin)
|
|
389
|
+
return (0, fields_1.buildPrefixFilter)(fieldRef, literal);
|
|
390
|
+
const literals = tokens.flatMap((token) => ("char" in token ? [token.char] : []));
|
|
391
|
+
if (literals.some((char) => LIKE_METACHARACTERS.test(char))) {
|
|
392
|
+
refuse(pattern, "a literal LIKE metacharacter (%, _ or \\), which Prisma does not escape");
|
|
393
|
+
}
|
|
394
|
+
if (literal !== undefined) {
|
|
395
|
+
return (0, fields_1.buildFieldFilter)(fieldRef, end ? "endsWith" : "contains", literal);
|
|
396
|
+
}
|
|
397
|
+
if (!begin || !end) {
|
|
398
|
+
refuse(pattern, "a wildcard in a pattern not anchored at both ends");
|
|
399
|
+
}
|
|
400
|
+
if (literals.includes("\n"))
|
|
401
|
+
refuse(pattern, "a literal newline beside a wildcard");
|
|
402
|
+
const noNewline = { NOT: (0, fields_1.buildFieldFilter)(fieldRef, "contains", "\n") };
|
|
403
|
+
const segments = likeText.split("%");
|
|
404
|
+
if (segments.length === 1) {
|
|
405
|
+
// Exactly the pattern's length: it matches as a prefix, and one more character never fits.
|
|
406
|
+
return {
|
|
407
|
+
AND: [
|
|
408
|
+
(0, fields_1.buildFieldFilter)(fieldRef, "startsWith", likeText),
|
|
409
|
+
{ NOT: (0, fields_1.buildFieldFilter)(fieldRef, "startsWith", `${likeText}_`) },
|
|
410
|
+
noNewline,
|
|
411
|
+
],
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
if (segments.length > 2)
|
|
415
|
+
refuse(pattern, "more than one .* in one alternative");
|
|
416
|
+
// `A.*B`: A at the start, B at the end, and room for both without overlapping.
|
|
417
|
+
const [head, tail] = (0, narrowing_1.pair)(segments);
|
|
418
|
+
const filters = [];
|
|
419
|
+
if (head !== "")
|
|
420
|
+
filters.push((0, fields_1.buildFieldFilter)(fieldRef, "startsWith", head));
|
|
421
|
+
if (tail !== "")
|
|
422
|
+
filters.push((0, fields_1.buildFieldFilter)(fieldRef, "endsWith", tail));
|
|
423
|
+
if (head !== "" && tail !== "") {
|
|
424
|
+
filters.push((0, fields_1.buildFieldFilter)(fieldRef, "startsWith", "_".repeat(Array.from(head).length + Array.from(tail).length)));
|
|
425
|
+
}
|
|
426
|
+
if (filters.length === 0)
|
|
427
|
+
filters.push((0, fields_1.buildFieldFilter)(fieldRef, "startsWith", ""));
|
|
428
|
+
return { AND: [...filters, noNewline] };
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Whether the pattern is one RE2 rejects, so that `matches()` raises an error on every row: what
|
|
432
|
+
* re2js, a port of RE2, refuses to compile. A pattern this adapter cannot translate is not invalid;
|
|
433
|
+
* it is refused when translated.
|
|
434
|
+
*/
|
|
435
|
+
function isInvalidPattern(pattern) {
|
|
436
|
+
return re2Rejection(pattern) !== undefined;
|
|
437
|
+
}
|
|
438
|
+
/** RE2's reason for rejecting the pattern, or undefined when it compiles. */
|
|
439
|
+
function re2Rejection(pattern) {
|
|
440
|
+
try {
|
|
441
|
+
re2js_1.RE2JS.compile(pattern);
|
|
442
|
+
return undefined;
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
return error instanceof Error ? error.message : String(error);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
function handleMatchesOperator(operands, context) {
|
|
449
|
+
const [receiver, patternOperand] = operands;
|
|
450
|
+
if (operands.length !== 2 ||
|
|
451
|
+
receiver === undefined ||
|
|
452
|
+
!(0, plan_1.isNamedOperand)(receiver) ||
|
|
453
|
+
patternOperand === undefined ||
|
|
454
|
+
!(0, plan_1.isValueOperand)(patternOperand) ||
|
|
455
|
+
!(0, narrowing_1.isString)(patternOperand.value)) {
|
|
456
|
+
throw new errors_1.UnsupportedQueryPlanError("matches() is translated only for a column receiver and a literal pattern");
|
|
457
|
+
}
|
|
458
|
+
const pattern = patternOperand.value;
|
|
459
|
+
const fieldRef = (0, mapping_1.resolveFieldReference)(receiver.name, context);
|
|
460
|
+
if (!(0, mapping_1.isResolvedFieldReference)(fieldRef)) {
|
|
461
|
+
throw new errors_1.UnsupportedQueryPlanError("matches() requires a column receiver");
|
|
462
|
+
}
|
|
463
|
+
(0, fields_1.assertStringField)(fieldRef, "matches");
|
|
464
|
+
const rejection = re2Rejection(pattern);
|
|
465
|
+
if (rejection !== undefined)
|
|
466
|
+
refuse(pattern, `RE2 rejects it (${rejection})`);
|
|
467
|
+
let expansions;
|
|
468
|
+
try {
|
|
469
|
+
expansions = expandPattern(pattern);
|
|
470
|
+
}
|
|
471
|
+
catch (error) {
|
|
472
|
+
if (error instanceof InvalidRegexError) {
|
|
473
|
+
refuse(pattern, `RE2 rejects it (${error.message})`);
|
|
474
|
+
}
|
|
475
|
+
throw error;
|
|
476
|
+
}
|
|
477
|
+
const filters = expansions.map((expansion) => alternativeFilter(pattern, fieldRef, expansion));
|
|
478
|
+
return filters.length === 1 ? filters[0] : { OR: filters };
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=regex.js.map
|
package/lib/regex.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex.js","sourceRoot":"","sources":["../src/regex.ts"],"names":[],"mappings":"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"}
|