@react-querybuilder/core 8.20.1 → 8.21.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 +4 -0
- package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +2261 -2113
- package/dist/cjs/react-querybuilder_core.cjs.development.js +323 -26
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +2261 -2113
- package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
- package/dist/{convertQuery-BJKNgecE.js → convertQuery-Cw76XFIn.js} +8 -8
- package/dist/{convertQuery-BJKNgecE.js.map → convertQuery-Cw76XFIn.js.map} +1 -1
- package/dist/{convertQuery-J1CaoDxe.mjs → convertQuery-D_4J7E-Z.mjs} +2 -2
- package/dist/{convertQuery-J1CaoDxe.mjs.map → convertQuery-D_4J7E-Z.mjs.map} +1 -1
- package/dist/formatQuery.d.mts +499 -459
- package/dist/formatQuery.d.ts +499 -459
- package/dist/formatQuery.js +173 -91
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +100 -23
- package/dist/formatQuery.mjs.map +1 -1
- package/dist/import-BVdxeIBO.d.mts +26 -0
- package/dist/import-Ddc3d_8q.d.ts +26 -0
- package/dist/{index-DlVg-QXo.d.mts → index-BSwFvkeI.d.mts} +679 -648
- package/dist/{index-DlVg-QXo.d.ts → index-BSwFvkeI.d.ts} +679 -648
- package/dist/{objectUtils-DBJI82bl.js → isRuleGroup-0JNiQgLg.js} +1 -26
- package/dist/isRuleGroup-0JNiQgLg.js.map +1 -0
- package/dist/{objectUtils-ZvPkF6u6.mjs → isRuleGroup-CqLThsbu.mjs} +2 -15
- package/dist/isRuleGroup-CqLThsbu.mjs.map +1 -0
- package/dist/objectUtils-Cr02aGxb.js +27 -0
- package/dist/objectUtils-Cr02aGxb.js.map +1 -0
- package/dist/objectUtils-DBlmJgBf.mjs +16 -0
- package/dist/objectUtils-DBlmJgBf.mjs.map +1 -0
- package/dist/parseCEL.d.mts +64 -30
- package/dist/parseCEL.d.ts +64 -30
- package/dist/parseCEL.js +91 -12
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs +85 -8
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseCypher.d.mts +24 -25
- package/dist/parseCypher.d.ts +24 -25
- package/dist/parseGremlin.d.mts +18 -19
- package/dist/parseGremlin.d.ts +18 -19
- package/dist/parseJSONata.d.mts +207 -20
- package/dist/parseJSONata.d.ts +207 -20
- package/dist/parseJSONata.js +92 -7
- package/dist/parseJSONata.js.map +1 -1
- package/dist/parseJSONata.mjs +80 -4
- package/dist/parseJSONata.mjs.map +1 -1
- package/dist/parseJsonLogic.d.mts +51 -18
- package/dist/parseJsonLogic.d.ts +51 -18
- package/dist/parseJsonLogic.js +95 -34
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +65 -6
- package/dist/parseJsonLogic.mjs.map +1 -1
- package/dist/parseMongoDB.d.mts +89 -58
- package/dist/parseMongoDB.d.ts +89 -58
- package/dist/parseMongoDB.js +140 -15
- package/dist/parseMongoDB.js.map +1 -1
- package/dist/parseMongoDB.mjs +128 -5
- package/dist/parseMongoDB.mjs.map +1 -1
- package/dist/parseSPARQL.d.mts +17 -18
- package/dist/parseSPARQL.d.ts +17 -18
- package/dist/parseSPARQL.js.map +1 -1
- package/dist/parseSPARQL.mjs.map +1 -1
- package/dist/parseSQL.d.mts +266 -18
- package/dist/parseSQL.d.ts +266 -18
- package/dist/parseSQL.js +163 -10
- package/dist/parseSQL.js.map +1 -1
- package/dist/parseSQL.mjs +149 -7
- package/dist/parseSQL.mjs.map +1 -1
- package/dist/parseSpEL.d.mts +193 -19
- package/dist/parseSpEL.d.ts +193 -19
- package/dist/parseSpEL.js +166 -7
- package/dist/parseSpEL.js.map +1 -1
- package/dist/parseSpEL.mjs +142 -6
- package/dist/parseSpEL.mjs.map +1 -1
- package/dist/{prepareQueryObjects-DaAXX792.js → prepareQueryObjects-C2-kTZvR.js} +6 -6
- package/dist/prepareQueryObjects-C2-kTZvR.js.map +1 -0
- package/dist/{prepareQueryObjects-Cd_tt4oy.mjs → prepareQueryObjects-Q18lHCKl.mjs} +4 -4
- package/dist/prepareQueryObjects-Q18lHCKl.mjs.map +1 -0
- package/dist/query-builder-layout.css.map +1 -1
- package/dist/query-builder.css.map +1 -1
- package/dist/react-querybuilder_core.d.mts +2261 -2113
- package/dist/react-querybuilder_core.legacy-esm.d.ts +2261 -2113
- package/dist/react-querybuilder_core.legacy-esm.js +339 -44
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +313 -27
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +2261 -2113
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/styles/_layout.scss +4 -10
- package/dist/transformQuery.d.mts +91 -92
- package/dist/transformQuery.d.ts +91 -92
- package/dist/transformQuery.js +4 -3
- package/dist/transformQuery.js.map +1 -1
- package/dist/transformQuery.mjs +2 -1
- package/dist/transformQuery.mjs.map +1 -1
- package/dist/{utils-BpaOtylk.js → utils-DEwV7F6B.js} +108 -12
- package/dist/utils-DEwV7F6B.js.map +1 -0
- package/dist/{utils-CJRGiPb-.mjs → utils-Dt0D_DMV.mjs} +69 -3
- package/dist/utils-Dt0D_DMV.mjs.map +1 -0
- package/package.json +15 -14
- package/dist/import-Qs1-kgv5.d.ts +0 -27
- package/dist/import-ShTj5IdB.d.mts +0 -27
- package/dist/objectUtils-DBJI82bl.js.map +0 -1
- package/dist/objectUtils-ZvPkF6u6.mjs.map +0 -1
- package/dist/prepareQueryObjects-Cd_tt4oy.mjs.map +0 -1
- package/dist/prepareQueryObjects-DaAXX792.js.map +0 -1
- package/dist/utils-BpaOtylk.js.map +0 -1
- package/dist/utils-CJRGiPb-.mjs.map +0 -1
package/dist/parseSpEL.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_utils = require("./utils-
|
|
3
|
-
const
|
|
4
|
-
const require_prepareQueryObjects = require("./prepareQueryObjects-
|
|
2
|
+
const require_utils = require("./utils-DEwV7F6B.js");
|
|
3
|
+
const require_isRuleGroup = require("./isRuleGroup-0JNiQgLg.js");
|
|
4
|
+
const require_prepareQueryObjects = require("./prepareQueryObjects-C2-kTZvR.js");
|
|
5
5
|
let spel2js = require("spel2js");
|
|
6
6
|
//#region src/utils/parseSpEL/utils.ts
|
|
7
7
|
const isSpELPropertyNode = (expr) => {
|
|
@@ -16,7 +16,7 @@ const isSpELListNode = (expr) => {
|
|
|
16
16
|
const isSpELOpAnd = (expr) => expr.type === "op-and";
|
|
17
17
|
const isSpELOpOr = (expr) => expr.type === "op-or";
|
|
18
18
|
const isSpELOpMatches = (expr) => expr.type === "matches" && (isSpELIdentifier(expr.children[0]) && isSpELStringLiteral(expr.children[1]) || isSpELIdentifier(expr.children[1]) && isSpELStringLiteral(expr.children[0]) || isSpELIdentifier(expr.children[0]) && isSpELIdentifier(expr.children[1]));
|
|
19
|
-
const isSpELIdentifier = (expr) => expr.type === "property" || expr.type === "variable" || expr.type === "compound";
|
|
19
|
+
const isSpELIdentifier = (expr) => (expr.type === "property" || expr.type === "variable" || expr.type === "compound") && expr.identifier !== null;
|
|
20
20
|
const isSpELStringLiteral = (expr) => expr.type === "string";
|
|
21
21
|
const isSpELNumericLiteral = (expr) => expr.type === "number";
|
|
22
22
|
const isSpELBooleanLiteral = (expr) => expr.type === "boolean";
|
|
@@ -25,8 +25,85 @@ const isSpELRelationOp = (expr) => expr.type === "op-eq" || expr.type === "op-ne
|
|
|
25
25
|
const isSpELPrimitive = (expr) => isSpELNumericLiteral(expr) || isSpELStringLiteral(expr) || isSpELBooleanLiteral(expr) || isSpELNullLiteral(expr);
|
|
26
26
|
const isSpELBetweenValues = (expr) => expr.type === "between" && isSpELIdentifier(expr.children[0]) && expr.children[1].type === "list" && expr.children[1].children.length >= 2 && expr.children[1].children.every((c) => isSpELPrimitive(c));
|
|
27
27
|
const isSpELBetweenFields = (expr) => expr.type === "between" && isSpELIdentifier(expr.children[0]) && expr.children[1].type === "list" && expr.children[1].children.length >= 2 && expr.children[1].children.every((c) => isSpELIdentifier(c));
|
|
28
|
+
/** A SpEL arithmetic infix node (`op-plus`/`op-minus`/`op-multiply`/`op-divide`/`op-modulus`). */
|
|
29
|
+
const isSpELMathOperation = (expr) => expr.type === "op-plus" || expr.type === "op-minus" || expr.type === "op-multiply" || expr.type === "op-divide" || expr.type === "op-modulus";
|
|
30
|
+
/** A method/function invocation node (`.toUpperCase()`, `T(java.lang.Math).abs(x)`, `myFunc(a)`). */
|
|
31
|
+
const isSpELMethodCall = (expr) => expr.type === "method" && typeof expr.methodName === "string";
|
|
32
|
+
/**
|
|
33
|
+
* Whether a relation operand should be routed to `getExpression`: an arithmetic infix node or a
|
|
34
|
+
* method/function invocation. Bare identifiers, chains, and literals are not expression operands
|
|
35
|
+
* (they retain their normal handling).
|
|
36
|
+
*/
|
|
37
|
+
const isSpELExpressionOperand = (expr) => isSpELMathOperation(expr) || isSpELMethodCall(expr);
|
|
38
|
+
const isSpELMethodNode = (expr) => expr.getType() === "method";
|
|
39
|
+
/**
|
|
40
|
+
* Builds a {@link SpELMethodCall} from a SpEL `method` node. Arguments are stored on the
|
|
41
|
+
* compiled node's `getRaw()` payload (not as children), so they are processed from there.
|
|
42
|
+
*/
|
|
43
|
+
const processMethodNode = (mn, target, typeRef) => {
|
|
44
|
+
const { methodName, args } = mn.getRaw();
|
|
45
|
+
return {
|
|
46
|
+
type: "method",
|
|
47
|
+
children: args.map((a) => processCompiledExpression(a)),
|
|
48
|
+
startPosition: mn.getStartPosition(),
|
|
49
|
+
endPosition: mn.getEndPosition(),
|
|
50
|
+
value: "N/A",
|
|
51
|
+
identifier: null,
|
|
52
|
+
methodName,
|
|
53
|
+
target,
|
|
54
|
+
typeRef
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Processes a SpEL `compound` node that invokes one or more methods, e.g. `name.toUpperCase()`,
|
|
59
|
+
* `a.b.toLowerCase()`, `(a + b).toUpperCase()`, or `T(java.lang.Math).abs(cost)`. Leading
|
|
60
|
+
* property/variable children are collapsed into a dotted receiver identifier, a leading `typeref`
|
|
61
|
+
* becomes the `typeRef` of the first call, and each subsequent `method` child wraps the previous
|
|
62
|
+
* result as its `target`. Returns `null` for chain shapes that can't be represented.
|
|
63
|
+
*/
|
|
64
|
+
const processMethodChain = (ce) => {
|
|
65
|
+
const children = ce.getChildren();
|
|
66
|
+
if (!children.some((c) => isSpELMethodNode(c))) return null;
|
|
67
|
+
let index = 0;
|
|
68
|
+
let target = null;
|
|
69
|
+
let typeRef = null;
|
|
70
|
+
const first = children[0];
|
|
71
|
+
if (first.getType() === "typeref") {
|
|
72
|
+
typeRef = first.getChildren()[0].getRaw().join(".");
|
|
73
|
+
index = 1;
|
|
74
|
+
} else if (isSpELPropertyNode(first)) {
|
|
75
|
+
const parts = [];
|
|
76
|
+
while (index < children.length && isSpELPropertyNode(children[index])) {
|
|
77
|
+
parts.push(children[index].getRaw());
|
|
78
|
+
++index;
|
|
79
|
+
}
|
|
80
|
+
target = {
|
|
81
|
+
type: parts.length > 1 ? "compound" : first.getType(),
|
|
82
|
+
children: [],
|
|
83
|
+
startPosition: first.getStartPosition(),
|
|
84
|
+
endPosition: children[index - 1].getEndPosition(),
|
|
85
|
+
value: "N/A",
|
|
86
|
+
identifier: parts.join(".")
|
|
87
|
+
};
|
|
88
|
+
} else {
|
|
89
|
+
target = processCompiledExpression(first);
|
|
90
|
+
index = 1;
|
|
91
|
+
}
|
|
92
|
+
let result = null;
|
|
93
|
+
for (; index < children.length; ++index) {
|
|
94
|
+
const child = children[index];
|
|
95
|
+
if (!isSpELMethodNode(child)) return null;
|
|
96
|
+
result = processMethodNode(child, result ?? target, result ? null : typeRef);
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
};
|
|
28
100
|
const processCompiledExpression = (ce) => {
|
|
29
101
|
const type = ce.getType();
|
|
102
|
+
if (isSpELMethodNode(ce)) return processMethodNode(ce, null, null);
|
|
103
|
+
if (type === "compound" && !isSpELCompoundNode(ce)) {
|
|
104
|
+
const methodChain = processMethodChain(ce);
|
|
105
|
+
if (methodChain) return methodChain;
|
|
106
|
+
}
|
|
30
107
|
const identifier = isSpELCompoundNode(ce) ? ce.getChildren().map((p) => isSpELPropertyNode(p) ? p.getRaw() : /* v8 ignore next -- @preserve */ "").join(".") : isSpELPropertyNode(ce) ? ce.getRaw() : null;
|
|
31
108
|
const children = type === "compound" ? [] : (isSpELListNode(ce) ? ce.getRaw : ce.getChildren)().map((c) => processCompiledExpression(c));
|
|
32
109
|
const startPosition = ce.getStartPosition();
|
|
@@ -97,7 +174,7 @@ const generateMixedAndOrList = (expr) => {
|
|
|
97
174
|
//#endregion
|
|
98
175
|
//#region src/utils/parseSpEL/parseSpEL.ts
|
|
99
176
|
function parseSpEL(spel, options = {}) {
|
|
100
|
-
const { fields, independentCombinators, listsAsArrays } = options;
|
|
177
|
+
const { fields, independentCombinators, listsAsArrays, getExpression } = options;
|
|
101
178
|
const ic = !!independentCombinators;
|
|
102
179
|
const fieldsFlat = require_prepareQueryObjects.getFieldsArray(fields);
|
|
103
180
|
const fieldIsValid = (fieldName, operator, subordinateFieldName) => require_prepareQueryObjects.fieldIsValidUtil({
|
|
@@ -107,6 +184,7 @@ function parseSpEL(spel, options = {}) {
|
|
|
107
184
|
subordinateFieldName,
|
|
108
185
|
getValueSources: options?.getValueSources
|
|
109
186
|
});
|
|
187
|
+
const exprCtx = { fieldExists: (fieldName) => fieldsFlat.length === 0 || fieldsFlat.some((f) => f.name === fieldName) };
|
|
110
188
|
const emptyQuery = {
|
|
111
189
|
rules: [],
|
|
112
190
|
...ic ? {} : { combinator: "and" }
|
|
@@ -117,7 +195,7 @@ function parseSpEL(spel, options = {}) {
|
|
|
117
195
|
const negatedExpr = parseProcessedSpEL(expr.children[0]);
|
|
118
196
|
// v8 ignore else
|
|
119
197
|
if (negatedExpr) {
|
|
120
|
-
if (!
|
|
198
|
+
if (!require_isRuleGroup.isRuleGroup(negatedExpr) && (negatedExpr.operator === "contains" || negatedExpr.operator === "beginsWith" || negatedExpr.operator === "endsWith")) return {
|
|
121
199
|
...negatedExpr,
|
|
122
200
|
operator: `doesNot${negatedExpr.operator[0].toUpperCase()}${negatedExpr.operator.slice(1).replace("s", "")}`
|
|
123
201
|
};
|
|
@@ -221,6 +299,64 @@ function parseSpEL(spel, options = {}) {
|
|
|
221
299
|
let valueSource = void 0;
|
|
222
300
|
let flip = false;
|
|
223
301
|
const [left, right] = expr.children;
|
|
302
|
+
if (getExpression) {
|
|
303
|
+
const leftIsExpr = isSpELExpressionOperand(left);
|
|
304
|
+
const rightIsExpr = isSpELExpressionOperand(right);
|
|
305
|
+
if (leftIsExpr || rightIsExpr) {
|
|
306
|
+
const op = (flipOp) => normalizeOperator(expr.type, flipOp);
|
|
307
|
+
if (leftIsExpr && rightIsExpr) {
|
|
308
|
+
const l = getExpression(left, exprCtx);
|
|
309
|
+
const r = getExpression(right, exprCtx);
|
|
310
|
+
return l && r ? {
|
|
311
|
+
field: "",
|
|
312
|
+
operator: op(false),
|
|
313
|
+
lhs: l,
|
|
314
|
+
value: r,
|
|
315
|
+
valueSource: "expression"
|
|
316
|
+
} : null;
|
|
317
|
+
}
|
|
318
|
+
if (isSpELIdentifier(left) && rightIsExpr) {
|
|
319
|
+
const node = getExpression(right, exprCtx);
|
|
320
|
+
const f = left.identifier;
|
|
321
|
+
const operator = op(false);
|
|
322
|
+
return node && fieldIsValid(f, operator) ? {
|
|
323
|
+
field: f,
|
|
324
|
+
operator,
|
|
325
|
+
value: node,
|
|
326
|
+
valueSource: "expression"
|
|
327
|
+
} : null;
|
|
328
|
+
}
|
|
329
|
+
if (leftIsExpr && isSpELIdentifier(right)) {
|
|
330
|
+
const node = getExpression(left, exprCtx);
|
|
331
|
+
const f = right.identifier;
|
|
332
|
+
const operator = op(true);
|
|
333
|
+
return node && fieldIsValid(f, operator) ? {
|
|
334
|
+
field: f,
|
|
335
|
+
operator,
|
|
336
|
+
value: node,
|
|
337
|
+
valueSource: "expression"
|
|
338
|
+
} : null;
|
|
339
|
+
}
|
|
340
|
+
if (leftIsExpr && isSpELPrimitive(right)) {
|
|
341
|
+
const l = getExpression(left, exprCtx);
|
|
342
|
+
return l ? {
|
|
343
|
+
field: "",
|
|
344
|
+
operator: op(false),
|
|
345
|
+
lhs: l,
|
|
346
|
+
value: right.value
|
|
347
|
+
} : null;
|
|
348
|
+
}
|
|
349
|
+
if (isSpELPrimitive(left)) {
|
|
350
|
+
const r = getExpression(right, exprCtx);
|
|
351
|
+
return r ? {
|
|
352
|
+
field: "",
|
|
353
|
+
operator: op(true),
|
|
354
|
+
lhs: r,
|
|
355
|
+
value: left.value
|
|
356
|
+
} : null;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
224
360
|
if (isSpELIdentifier(left)) {
|
|
225
361
|
field = left.identifier;
|
|
226
362
|
if (isSpELIdentifier(right)) {
|
|
@@ -256,7 +392,7 @@ function parseSpEL(spel, options = {}) {
|
|
|
256
392
|
}
|
|
257
393
|
const result = parseProcessedSpEL(processCompiledExpression(compiledSpEL));
|
|
258
394
|
if (result) {
|
|
259
|
-
if (
|
|
395
|
+
if (require_isRuleGroup.isRuleGroup(result)) return prepare(result);
|
|
260
396
|
return prepare({
|
|
261
397
|
rules: [result],
|
|
262
398
|
...ic ? {} : { combinator: "and" }
|
|
@@ -265,6 +401,29 @@ function parseSpEL(spel, options = {}) {
|
|
|
265
401
|
return prepare(emptyQuery);
|
|
266
402
|
}
|
|
267
403
|
//#endregion
|
|
404
|
+
exports.generateFlatAndOrList = generateFlatAndOrList;
|
|
405
|
+
exports.generateMixedAndOrList = generateMixedAndOrList;
|
|
406
|
+
exports.isSpELBetweenFields = isSpELBetweenFields;
|
|
407
|
+
exports.isSpELBetweenValues = isSpELBetweenValues;
|
|
408
|
+
exports.isSpELBooleanLiteral = isSpELBooleanLiteral;
|
|
409
|
+
exports.isSpELCompoundNode = isSpELCompoundNode;
|
|
410
|
+
exports.isSpELExpressionOperand = isSpELExpressionOperand;
|
|
411
|
+
exports.isSpELIdentifier = isSpELIdentifier;
|
|
412
|
+
exports.isSpELListNode = isSpELListNode;
|
|
413
|
+
exports.isSpELMathOperation = isSpELMathOperation;
|
|
414
|
+
exports.isSpELMethodCall = isSpELMethodCall;
|
|
415
|
+
exports.isSpELMethodNode = isSpELMethodNode;
|
|
416
|
+
exports.isSpELNullLiteral = isSpELNullLiteral;
|
|
417
|
+
exports.isSpELNumericLiteral = isSpELNumericLiteral;
|
|
418
|
+
exports.isSpELOpAnd = isSpELOpAnd;
|
|
419
|
+
exports.isSpELOpMatches = isSpELOpMatches;
|
|
420
|
+
exports.isSpELOpOr = isSpELOpOr;
|
|
421
|
+
exports.isSpELPrimitive = isSpELPrimitive;
|
|
422
|
+
exports.isSpELPropertyNode = isSpELPropertyNode;
|
|
423
|
+
exports.isSpELRelationOp = isSpELRelationOp;
|
|
424
|
+
exports.isSpELStringLiteral = isSpELStringLiteral;
|
|
425
|
+
exports.normalizeOperator = normalizeOperator;
|
|
268
426
|
exports.parseSpEL = parseSpEL;
|
|
427
|
+
exports.processCompiledExpression = processCompiledExpression;
|
|
269
428
|
|
|
270
429
|
//# sourceMappingURL=parseSpEL.js.map
|
package/dist/parseSpEL.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseSpEL.js","names":["getFieldsArray","fieldIsValidUtil","isRuleGroup","joinWith","prepareRuleGroup","SpelExpressionEvaluator"],"sources":["../src/utils/parseSpEL/utils.ts","../src/utils/parseSpEL/parseSpEL.ts"],"sourcesContent":["import type { DefaultCombinatorName, DefaultOperatorName } from '../../types';\nimport type {\n SpELBaseNode,\n SpELBetweenFields,\n SpELBetweenValues,\n SpELBooleanLiteral,\n SpELCompoundNode,\n SpELExpressionNode,\n SpELIdentifier,\n SpELListNode,\n SpELNodeType,\n SpELNullLiteral,\n SpELNumericLiteral,\n SpELOpAnd,\n SpELOpMatches,\n SpELOpOr,\n SpELPrimitive,\n SpELProcessedExpression,\n SpELPropertyNode,\n SpELRelOpType,\n SpELRelation as SpELRelationOp,\n SpELStringLiteral,\n} from './types';\n\nexport const isSpELPropertyNode = (expr: SpELBaseNode<SpELNodeType>): expr is SpELPropertyNode => {\n return expr.getType() === 'property' || expr.getType() === 'variable';\n};\nexport const isSpELCompoundNode = (expr: SpELBaseNode<SpELNodeType>): expr is SpELCompoundNode => {\n return expr.getType() === 'compound' && expr.getChildren().every(c => isSpELPropertyNode(c));\n};\nexport const isSpELListNode = (expr: SpELBaseNode<SpELNodeType>): expr is SpELListNode => {\n return expr.getType() === 'list';\n};\n\nexport const isSpELOpAnd = (expr: SpELProcessedExpression): expr is SpELOpAnd =>\n expr.type === 'op-and';\nexport const isSpELOpOr = (expr: SpELProcessedExpression): expr is SpELOpOr =>\n expr.type === 'op-or';\nexport const isSpELOpMatches = (expr: SpELProcessedExpression): expr is SpELOpMatches =>\n expr.type === 'matches' &&\n ((isSpELIdentifier(expr.children[0]) && isSpELStringLiteral(expr.children[1])) ||\n (isSpELIdentifier(expr.children[1]) && isSpELStringLiteral(expr.children[0])) ||\n (isSpELIdentifier(expr.children[0]) && isSpELIdentifier(expr.children[1])));\nexport const isSpELIdentifier = (expr: SpELProcessedExpression): expr is SpELIdentifier =>\n expr.type === 'property' || expr.type === 'variable' || expr.type === 'compound';\nexport const isSpELStringLiteral = (expr: SpELProcessedExpression): expr is SpELStringLiteral =>\n expr.type === 'string';\nexport const isSpELNumericLiteral = (expr: SpELProcessedExpression): expr is SpELNumericLiteral =>\n expr.type === 'number';\nexport const isSpELBooleanLiteral = (expr: SpELProcessedExpression): expr is SpELBooleanLiteral =>\n expr.type === 'boolean';\nexport const isSpELNullLiteral = (expr: SpELProcessedExpression): expr is SpELNullLiteral =>\n expr.type === 'null';\nexport const isSpELRelationOp = (expr: SpELProcessedExpression): expr is SpELRelationOp =>\n expr.type === 'op-eq' ||\n expr.type === 'op-ne' ||\n expr.type === 'op-gt' ||\n expr.type === 'op-ge' ||\n expr.type === 'op-lt' ||\n expr.type === 'op-le';\nexport const isSpELPrimitive = (expr: SpELProcessedExpression): expr is SpELPrimitive =>\n isSpELNumericLiteral(expr) ||\n isSpELStringLiteral(expr) ||\n isSpELBooleanLiteral(expr) ||\n isSpELNullLiteral(expr);\nexport const isSpELBetweenValues = (expr: SpELProcessedExpression): expr is SpELBetweenValues =>\n expr.type === 'between' &&\n isSpELIdentifier(expr.children[0]) &&\n expr.children[1].type === 'list' &&\n expr.children[1].children.length >= 2 &&\n expr.children[1].children.every(c => isSpELPrimitive(c));\nexport const isSpELBetweenFields = (expr: SpELProcessedExpression): expr is SpELBetweenFields =>\n expr.type === 'between' &&\n isSpELIdentifier(expr.children[0]) &&\n expr.children[1].type === 'list' &&\n expr.children[1].children.length >= 2 &&\n expr.children[1].children.every(c => isSpELIdentifier(c));\n\nexport const processCompiledExpression = (\n ce: SpELPropertyNode | SpELExpressionNode\n): SpELProcessedExpression => {\n const type = ce.getType();\n const identifier = isSpELCompoundNode(ce)\n ? ce\n .getChildren()\n .map(p => (isSpELPropertyNode(p) ? p.getRaw() : /* v8 ignore next -- @preserve */ ''))\n .join('.')\n : isSpELPropertyNode(ce)\n ? ce.getRaw()\n : null;\n const children =\n type === 'compound'\n ? []\n : (isSpELListNode(ce) ? ce.getRaw : ce.getChildren)().map(c => processCompiledExpression(c));\n const startPosition = ce.getStartPosition();\n const endPosition = ce.getEndPosition();\n const value = ce.getValue.length === 0 ? ce.getValue() : 'N/A';\n\n return {\n type: type === 'compound' && !identifier ? 'invalid' : type,\n children,\n startPosition,\n endPosition,\n value,\n identifier,\n };\n};\n\nexport const normalizeOperator = (opType: SpELRelOpType, flip?: boolean): DefaultOperatorName => {\n if (flip) {\n if (opType === 'op-lt') return '>';\n if (opType === 'op-le') return '>=';\n if (opType === 'op-gt') return '<';\n if (opType === 'op-ge') return '<=';\n }\n return (\n {\n 'op-eq': '=',\n 'op-ge': '>=',\n 'op-gt': '>',\n 'op-le': '<=',\n 'op-lt': '<',\n 'op-ne': '!=',\n } as const\n )[opType];\n};\n\nexport const generateFlatAndOrList = (\n expr: SpELProcessedExpression\n): (DefaultCombinatorName | SpELProcessedExpression)[] => {\n const combinator = expr.type.slice(3) as DefaultCombinatorName;\n const [left, right] = expr.children;\n if (left.type === 'op-and' || left.type === 'op-or') {\n return [...generateFlatAndOrList(left), combinator, right];\n }\n return [left, combinator, right];\n};\n\nexport const generateMixedAndOrList = (\n expr: SpELOpAnd | SpELOpOr\n): (DefaultCombinatorName | SpELProcessedExpression | ('and' | SpELProcessedExpression)[])[] => {\n const arr = generateFlatAndOrList(expr);\n const returnArray: (\n | DefaultCombinatorName\n | SpELProcessedExpression\n | ('and' | SpELProcessedExpression)[]\n )[] = [];\n let startIndex = 0;\n for (let i = 0; i < arr.length; i += 2) {\n if (arr[i + 1] === 'and') {\n startIndex = i;\n let j = 1;\n while (arr[startIndex + j] === 'and') {\n i += 2;\n j += 2;\n }\n const tempAndArray = arr.slice(startIndex, i + 1) as ('and' | SpELProcessedExpression)[];\n returnArray.push(tempAndArray);\n i -= 2;\n } else if (arr[i + 1] === 'or') {\n if (i === 0 || i === arr.length - 3) {\n if (i === 0 || arr[i - 1] === 'or') {\n returnArray.push(arr[i]);\n }\n returnArray.push(arr[i + 1]);\n if (i === arr.length - 3) {\n returnArray.push(arr[i + 2]);\n }\n } else {\n if (arr[i - 1] === 'and') {\n returnArray.push(arr[i + 1]);\n } else {\n returnArray.push(arr[i], arr[i + 1]);\n }\n }\n }\n }\n if (returnArray.length === 1 && Array.isArray(returnArray[0])) {\n // If length is 1, then the only element is an AND array so just return that\n return returnArray[0];\n }\n return returnArray;\n};\n","import { SpelExpressionEvaluator } from 'spel2js';\nimport type { Except } from 'type-fest';\nimport type {\n DefaultCombinatorName,\n DefaultOperatorName,\n DefaultRuleGroupArray,\n DefaultRuleGroupICArray,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type { SpELExpressionNode, SpELProcessedExpression } from './types';\nimport {\n generateFlatAndOrList,\n generateMixedAndOrList,\n isSpELBetweenFields,\n isSpELBetweenValues,\n isSpELIdentifier,\n isSpELOpAnd,\n isSpELOpMatches,\n isSpELOpOr,\n isSpELPrimitive,\n isSpELRelationOp,\n normalizeOperator,\n processCompiledExpression,\n} from './utils';\n\n/**\n * Options object for {@link parseSpEL!parseSpEL}.\n */\nexport interface ParseSpELOptions extends ParserCommonOptions {}\n\n/**\n * Converts a SpEL string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseSpEL(spel: string): DefaultRuleGroupType;\n/**\n * Converts a SpEL string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseSpEL(\n spel: string,\n options: Except<ParseSpELOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a SpEL string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseSpEL(\n spel: string,\n options: Except<ParseSpELOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseSpEL(spel: string, options: ParseSpELOptions = {}): DefaultRuleGroupTypeAny {\n const { fields, independentCombinators, listsAsArrays } = options;\n const ic = !!independentCombinators;\n const fieldsFlat = getFieldsArray(fields);\n\n const fieldIsValid = (\n fieldName: string,\n operator: DefaultOperatorName,\n subordinateFieldName?: string\n ) =>\n fieldIsValidUtil({\n fieldName,\n fieldsFlat,\n operator,\n subordinateFieldName,\n getValueSources: options?.getValueSources,\n });\n\n const emptyQuery: DefaultRuleGroupTypeAny = {\n rules: [],\n ...(ic ? {} : { combinator: 'and' }),\n };\n\n const parseProcessedSpEL = (\n expr: SpELProcessedExpression,\n processOpts: {\n groupOnlyIfNecessary?: boolean;\n forwardNegation?: boolean;\n } = {}\n ): DefaultRuleType | DefaultRuleGroupTypeAny | null => {\n const { forwardNegation: _forwardedNegation, groupOnlyIfNecessary: _g } = processOpts;\n if (expr.type === 'op-not') {\n const negatedExpr = parseProcessedSpEL(expr.children[0]);\n // v8 ignore else\n if (negatedExpr) {\n if (\n !isRuleGroup(negatedExpr) &&\n (negatedExpr.operator === 'contains' ||\n negatedExpr.operator === 'beginsWith' ||\n negatedExpr.operator === 'endsWith')\n ) {\n return {\n ...negatedExpr,\n operator: `doesNot${negatedExpr.operator[0].toUpperCase()}${negatedExpr.operator\n .slice(1)\n .replace('s', '')}` as DefaultOperatorName,\n };\n }\n return ic\n ? ({ rules: [negatedExpr], not: true } as DefaultRuleGroupTypeIC)\n : ({\n combinator: 'and',\n rules: [negatedExpr],\n not: true,\n } as DefaultRuleGroupType);\n }\n } else if (isSpELOpAnd(expr) || isSpELOpOr(expr)) {\n if (ic) {\n const andOrList = generateFlatAndOrList(expr);\n const rules = andOrList.map(v => {\n if (typeof v === 'string') {\n return v;\n }\n return parseProcessedSpEL(v);\n });\n // Bail out completely if any rules in the list were invalid\n // so as not to return an incorrect and/or sequence\n if (!rules.every(Boolean)) {\n return null;\n }\n return {\n rules: rules as DefaultRuleGroupICArray,\n };\n }\n const andOrList = generateMixedAndOrList(expr);\n const combinator = andOrList[1] as DefaultCombinatorName;\n const filteredList = andOrList\n .filter(v => Array.isArray(v) || (!!v && typeof v !== 'string' && 'type' in v))\n .map(v =>\n Array.isArray(v) ? v.filter(vf => !!v && typeof vf !== 'string' && 'type' in vf) : v\n ) as (SpELProcessedExpression | SpELProcessedExpression[])[];\n const rules = filteredList\n .map((exp): DefaultRuleGroupType | DefaultRuleType | null => {\n if (Array.isArray(exp)) {\n return {\n combinator: 'and',\n rules: exp.map(e => parseProcessedSpEL(e)).filter(Boolean) as DefaultRuleGroupArray,\n };\n }\n return parseProcessedSpEL(exp) as DefaultRuleType | DefaultRuleGroupType | null;\n })\n .filter(Boolean) as DefaultRuleGroupArray;\n // v8 ignore else\n if (rules.length > 0) {\n return { combinator, rules };\n }\n } else if (isSpELOpMatches(expr)) {\n const [left, right] = expr.children;\n let field: string = '';\n let regex: string = '';\n let valueSource: ValueSource | undefined = undefined;\n if (isSpELIdentifier(left)) {\n field = left.identifier;\n if (isSpELIdentifier(right)) {\n regex = right.identifier;\n valueSource = 'field';\n } else {\n // v8 ignore else\n if (isSpELPrimitive(right)) {\n regex = right.value;\n }\n }\n } else {\n // v8 ignore else\n if (isSpELIdentifier(right) && isSpELPrimitive(left)) {\n field = right.identifier;\n regex = left.value;\n }\n }\n\n if (/^(?!\\^).*?(?<!\\$)$/.test(regex)) {\n // v8 ignore else\n if (fieldIsValid(field, 'contains')) {\n return {\n field,\n operator: 'contains',\n value: regex,\n ...(valueSource ? { valueSource } : {}),\n };\n }\n } else {\n if (/^\\^.*?(?<!\\$)$/.test(regex)) {\n // v8 ignore else\n if (fieldIsValid(field, 'beginsWith')) {\n return {\n field,\n operator: 'beginsWith',\n value: regex.replace(/^\\^/, ''),\n };\n }\n } else {\n // v8 ignore else\n if (/^(?!\\^).*?\\$$/.test(regex)) {\n // v8 ignore else\n if (fieldIsValid(field, 'endsWith')) {\n return {\n field,\n operator: 'endsWith',\n value: regex.replace(/\\$$/, ''),\n };\n }\n }\n }\n }\n } else if (isSpELBetweenValues(expr) || isSpELBetweenFields(expr)) {\n // oxlint-disable-next-line typescript/no-explicit-any\n let values: [any, any] = [null, null];\n let valueSource: ValueSource | undefined = undefined;\n const [\n { identifier: field },\n {\n children: [left, right],\n },\n ] = expr.children;\n\n if (isSpELBetweenValues(expr)) {\n values = [left.value, right.value];\n } else {\n values = [left.identifier, right.identifier];\n valueSource = 'field';\n }\n // v8 ignore else\n if (\n field &&\n values.every(v => fieldIsValid(field, 'between', valueSource === 'field' ? v : undefined))\n ) {\n const valueArray =\n values[0] < values[1] || valueSource === 'field' ? values : [values[1], values[0]];\n const value = listsAsArrays ? valueArray : joinWith(valueArray, ',');\n return valueSource\n ? { field, operator: 'between', value, valueSource }\n : { field, operator: 'between', value };\n }\n } else if (isSpELRelationOp(expr)) {\n let field: string | null = null;\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = undefined;\n let valueSource: ValueSource | undefined = undefined;\n let flip = false;\n const [left, right] = expr.children;\n\n if (isSpELIdentifier(left)) {\n field = left.identifier;\n if (isSpELIdentifier(right)) {\n value = right.identifier;\n valueSource = 'field';\n } else if (isSpELPrimitive(right)) {\n value = right.value;\n }\n } else {\n // v8 ignore else\n if (isSpELIdentifier(right) && isSpELPrimitive(left)) {\n flip = true;\n field = right.identifier;\n value = left.value;\n }\n }\n let operator = normalizeOperator(expr.type, flip);\n if (value === null && (operator === '=' || operator === '!=')) {\n operator = operator === '=' ? 'null' : 'notNull';\n }\n if (\n field &&\n fieldIsValid(field, operator, valueSource === 'field' ? value : undefined) &&\n value !== undefined\n ) {\n return valueSource ? { field, operator, value, valueSource } : { field, operator, value };\n }\n }\n return null;\n };\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let compiledSpEL: SpELExpressionNode;\n try {\n compiledSpEL = SpelExpressionEvaluator.compile(spel)._compiledExpression;\n } catch {\n return prepare(emptyQuery);\n }\n\n const processedSpEL = processCompiledExpression(compiledSpEL);\n\n const result = parseProcessedSpEL(processedSpEL);\n if (result) {\n if (isRuleGroup(result)) {\n return prepare(result);\n }\n return prepare({ rules: [result], ...(ic ? {} : { combinator: 'and' }) });\n }\n\n return prepare(emptyQuery);\n}\n\nexport { parseSpEL };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parseSpEL.js","names":["getFieldsArray","fieldIsValidUtil","isRuleGroup","joinWith","prepareRuleGroup","SpelExpressionEvaluator"],"sources":["../src/utils/parseSpEL/utils.ts","../src/utils/parseSpEL/parseSpEL.ts"],"sourcesContent":["import type { DefaultCombinatorName, DefaultOperatorName } from '../../types';\nimport type {\n SpELBaseNode,\n SpELBetweenFields,\n SpELBetweenValues,\n SpELBooleanLiteral,\n SpELCompoundNode,\n SpELExpressionNode,\n SpELIdentifier,\n SpELListNode,\n SpELMethodCall,\n SpELMethodNode,\n SpELNodeType,\n SpELNullLiteral,\n SpELNumericLiteral,\n SpELOpAnd,\n SpELOpMatches,\n SpELOpOr,\n SpELPrimitive,\n SpELProcessedExpression,\n SpELPropertyNode,\n SpELQualifiedIdentifierNode,\n SpELRelOpType,\n SpELRelation as SpELRelationOp,\n SpELStringLiteral,\n} from './types';\n\nexport const isSpELPropertyNode = (expr: SpELBaseNode<SpELNodeType>): expr is SpELPropertyNode => {\n return expr.getType() === 'property' || expr.getType() === 'variable';\n};\nexport const isSpELCompoundNode = (expr: SpELBaseNode<SpELNodeType>): expr is SpELCompoundNode => {\n return expr.getType() === 'compound' && expr.getChildren().every(c => isSpELPropertyNode(c));\n};\nexport const isSpELListNode = (expr: SpELBaseNode<SpELNodeType>): expr is SpELListNode => {\n return expr.getType() === 'list';\n};\n\nexport const isSpELOpAnd = (expr: SpELProcessedExpression): expr is SpELOpAnd =>\n expr.type === 'op-and';\nexport const isSpELOpOr = (expr: SpELProcessedExpression): expr is SpELOpOr =>\n expr.type === 'op-or';\nexport const isSpELOpMatches = (expr: SpELProcessedExpression): expr is SpELOpMatches =>\n expr.type === 'matches' &&\n ((isSpELIdentifier(expr.children[0]) && isSpELStringLiteral(expr.children[1])) ||\n (isSpELIdentifier(expr.children[1]) && isSpELStringLiteral(expr.children[0])) ||\n (isSpELIdentifier(expr.children[0]) && isSpELIdentifier(expr.children[1])));\nexport const isSpELIdentifier = (expr: SpELProcessedExpression): expr is SpELIdentifier =>\n (expr.type === 'property' || expr.type === 'variable' || expr.type === 'compound') &&\n expr.identifier !== null;\nexport const isSpELStringLiteral = (expr: SpELProcessedExpression): expr is SpELStringLiteral =>\n expr.type === 'string';\nexport const isSpELNumericLiteral = (expr: SpELProcessedExpression): expr is SpELNumericLiteral =>\n expr.type === 'number';\nexport const isSpELBooleanLiteral = (expr: SpELProcessedExpression): expr is SpELBooleanLiteral =>\n expr.type === 'boolean';\nexport const isSpELNullLiteral = (expr: SpELProcessedExpression): expr is SpELNullLiteral =>\n expr.type === 'null';\nexport const isSpELRelationOp = (expr: SpELProcessedExpression): expr is SpELRelationOp =>\n expr.type === 'op-eq' ||\n expr.type === 'op-ne' ||\n expr.type === 'op-gt' ||\n expr.type === 'op-ge' ||\n expr.type === 'op-lt' ||\n expr.type === 'op-le';\nexport const isSpELPrimitive = (expr: SpELProcessedExpression): expr is SpELPrimitive =>\n isSpELNumericLiteral(expr) ||\n isSpELStringLiteral(expr) ||\n isSpELBooleanLiteral(expr) ||\n isSpELNullLiteral(expr);\nexport const isSpELBetweenValues = (expr: SpELProcessedExpression): expr is SpELBetweenValues =>\n expr.type === 'between' &&\n isSpELIdentifier(expr.children[0]) &&\n expr.children[1].type === 'list' &&\n expr.children[1].children.length >= 2 &&\n expr.children[1].children.every(c => isSpELPrimitive(c));\nexport const isSpELBetweenFields = (expr: SpELProcessedExpression): expr is SpELBetweenFields =>\n expr.type === 'between' &&\n isSpELIdentifier(expr.children[0]) &&\n expr.children[1].type === 'list' &&\n expr.children[1].children.length >= 2 &&\n expr.children[1].children.every(c => isSpELIdentifier(c));\n\n/** A SpEL arithmetic infix node (`op-plus`/`op-minus`/`op-multiply`/`op-divide`/`op-modulus`). */\nexport const isSpELMathOperation = (expr: SpELProcessedExpression): boolean =>\n expr.type === 'op-plus' ||\n expr.type === 'op-minus' ||\n expr.type === 'op-multiply' ||\n expr.type === 'op-divide' ||\n expr.type === 'op-modulus';\n\n/** A method/function invocation node (`.toUpperCase()`, `T(java.lang.Math).abs(x)`, `myFunc(a)`). */\nexport const isSpELMethodCall = (expr: SpELProcessedExpression): expr is SpELMethodCall =>\n expr.type === 'method' && typeof expr.methodName === 'string';\n\n/**\n * Whether a relation operand should be routed to `getExpression`: an arithmetic infix node or a\n * method/function invocation. Bare identifiers, chains, and literals are not expression operands\n * (they retain their normal handling).\n */\nexport const isSpELExpressionOperand = (expr: SpELProcessedExpression): boolean =>\n isSpELMathOperation(expr) || isSpELMethodCall(expr);\n\nexport const isSpELMethodNode = (expr: SpELBaseNode<SpELNodeType>): expr is SpELMethodNode =>\n expr.getType() === 'method';\n\n/**\n * Builds a {@link SpELMethodCall} from a SpEL `method` node. Arguments are stored on the\n * compiled node's `getRaw()` payload (not as children), so they are processed from there.\n */\nconst processMethodNode = (\n mn: SpELMethodNode,\n target: SpELProcessedExpression | null,\n typeRef: string | null\n): SpELMethodCall => {\n const { methodName, args } = mn.getRaw();\n return {\n type: 'method',\n children: args.map(a => processCompiledExpression(a)),\n startPosition: mn.getStartPosition(),\n endPosition: mn.getEndPosition(),\n value: 'N/A',\n identifier: null,\n methodName,\n target,\n typeRef,\n };\n};\n\n/**\n * Processes a SpEL `compound` node that invokes one or more methods, e.g. `name.toUpperCase()`,\n * `a.b.toLowerCase()`, `(a + b).toUpperCase()`, or `T(java.lang.Math).abs(cost)`. Leading\n * property/variable children are collapsed into a dotted receiver identifier, a leading `typeref`\n * becomes the `typeRef` of the first call, and each subsequent `method` child wraps the previous\n * result as its `target`. Returns `null` for chain shapes that can't be represented.\n */\nconst processMethodChain = (ce: SpELExpressionNode): SpELMethodCall | null => {\n const children = ce.getChildren();\n if (!children.some(c => isSpELMethodNode(c))) {\n return null;\n }\n\n let index = 0;\n let target: SpELProcessedExpression | null = null;\n let typeRef: string | null = null;\n const first = children[0];\n\n if (first.getType() === 'typeref') {\n const qualifiedIdentifier = first.getChildren()[0] as unknown as SpELQualifiedIdentifierNode;\n typeRef = qualifiedIdentifier.getRaw().join('.');\n index = 1;\n } else if (isSpELPropertyNode(first)) {\n const parts: string[] = [];\n while (index < children.length && isSpELPropertyNode(children[index])) {\n parts.push((children[index] as unknown as SpELPropertyNode).getRaw());\n ++index;\n }\n target = {\n type: parts.length > 1 ? 'compound' : first.getType(),\n children: [],\n startPosition: first.getStartPosition(),\n endPosition: children[index - 1].getEndPosition(),\n value: 'N/A',\n identifier: parts.join('.'),\n };\n } else {\n // Arbitrary receiver subtree, e.g. `(a + b).toUpperCase()`\n target = processCompiledExpression(first);\n index = 1;\n }\n\n let result: SpELMethodCall | null = null;\n for (; index < children.length; ++index) {\n const child = children[index];\n if (!isSpELMethodNode(child)) {\n return null;\n }\n result = processMethodNode(child, result ?? target, result ? null : typeRef);\n }\n return result;\n};\n\nexport const processCompiledExpression = (\n ce: SpELPropertyNode | SpELExpressionNode\n): SpELProcessedExpression => {\n const type = ce.getType();\n\n // Bare function calls, e.g. `myFunc(a, b)`\n if (isSpELMethodNode(ce)) {\n return processMethodNode(ce, null, null);\n }\n\n // Method chains, e.g. `name.toUpperCase()` or `T(java.lang.Math).abs(cost)`\n if (type === 'compound' && !isSpELCompoundNode(ce)) {\n const methodChain = processMethodChain(ce);\n if (methodChain) {\n return methodChain;\n }\n }\n\n const identifier = isSpELCompoundNode(ce)\n ? ce\n .getChildren()\n .map(p => (isSpELPropertyNode(p) ? p.getRaw() : /* v8 ignore next -- @preserve */ ''))\n .join('.')\n : isSpELPropertyNode(ce)\n ? ce.getRaw()\n : null;\n const children =\n type === 'compound'\n ? []\n : (isSpELListNode(ce) ? ce.getRaw : ce.getChildren)().map(c => processCompiledExpression(c));\n const startPosition = ce.getStartPosition();\n const endPosition = ce.getEndPosition();\n const value = ce.getValue.length === 0 ? ce.getValue() : 'N/A';\n\n return {\n type: type === 'compound' && !identifier ? 'invalid' : type,\n children,\n startPosition,\n endPosition,\n value,\n identifier,\n };\n};\n\nexport const normalizeOperator = (opType: SpELRelOpType, flip?: boolean): DefaultOperatorName => {\n if (flip) {\n if (opType === 'op-lt') return '>';\n if (opType === 'op-le') return '>=';\n if (opType === 'op-gt') return '<';\n if (opType === 'op-ge') return '<=';\n }\n return (\n {\n 'op-eq': '=',\n 'op-ge': '>=',\n 'op-gt': '>',\n 'op-le': '<=',\n 'op-lt': '<',\n 'op-ne': '!=',\n } as const\n )[opType];\n};\n\nexport const generateFlatAndOrList = (\n expr: SpELProcessedExpression\n): (DefaultCombinatorName | SpELProcessedExpression)[] => {\n const combinator = expr.type.slice(3) as DefaultCombinatorName;\n const [left, right] = expr.children;\n if (left.type === 'op-and' || left.type === 'op-or') {\n return [...generateFlatAndOrList(left), combinator, right];\n }\n return [left, combinator, right];\n};\n\nexport const generateMixedAndOrList = (\n expr: SpELOpAnd | SpELOpOr\n): (DefaultCombinatorName | SpELProcessedExpression | ('and' | SpELProcessedExpression)[])[] => {\n const arr = generateFlatAndOrList(expr);\n const returnArray: (\n | DefaultCombinatorName\n | SpELProcessedExpression\n | ('and' | SpELProcessedExpression)[]\n )[] = [];\n let startIndex = 0;\n for (let i = 0; i < arr.length; i += 2) {\n if (arr[i + 1] === 'and') {\n startIndex = i;\n let j = 1;\n while (arr[startIndex + j] === 'and') {\n i += 2;\n j += 2;\n }\n const tempAndArray = arr.slice(startIndex, i + 1) as ('and' | SpELProcessedExpression)[];\n returnArray.push(tempAndArray);\n i -= 2;\n } else if (arr[i + 1] === 'or') {\n if (i === 0 || i === arr.length - 3) {\n if (i === 0 || arr[i - 1] === 'or') {\n returnArray.push(arr[i]);\n }\n returnArray.push(arr[i + 1]);\n if (i === arr.length - 3) {\n returnArray.push(arr[i + 2]);\n }\n } else {\n if (arr[i - 1] === 'and') {\n returnArray.push(arr[i + 1]);\n } else {\n returnArray.push(arr[i], arr[i + 1]);\n }\n }\n }\n }\n if (returnArray.length === 1 && Array.isArray(returnArray[0])) {\n // If length is 1, then the only element is an AND array so just return that\n return returnArray[0];\n }\n return returnArray;\n};\n","import { SpelExpressionEvaluator } from 'spel2js';\nimport type { Except } from 'type-fest';\nimport type {\n DefaultCombinatorName,\n DefaultOperatorName,\n DefaultRuleGroupArray,\n DefaultRuleGroupICArray,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n ExpressionNode,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type {\n ParseSpELExpressionContext,\n SpELExpressionNode,\n SpELExpressionOperand,\n SpELProcessedExpression,\n} from './types';\nimport {\n generateFlatAndOrList,\n generateMixedAndOrList,\n isSpELBetweenFields,\n isSpELBetweenValues,\n isSpELExpressionOperand,\n isSpELIdentifier,\n isSpELOpAnd,\n isSpELOpMatches,\n isSpELOpOr,\n isSpELPrimitive,\n isSpELRelationOp,\n normalizeOperator,\n processCompiledExpression,\n} from './utils';\n\n/**\n * Options object for {@link parseSpEL!parseSpEL}.\n */\nexport interface ParseSpELOptions extends ParserCommonOptions {\n /**\n * Handler that converts a SpEL expression operand subtree into an {@link ExpressionNode}.\n * Return `null` to reject (the rule is dropped). Supplied by `@react-querybuilder/expr`\n * (`expressionParserSpEL`). When omitted, expression operands are ignored (rule dropped).\n *\n * Arithmetic infix operands and method/function invocations\n * (`T(java.lang.Math).abs/min/max(...)`, `.toUpperCase()`/`.toLowerCase()`, and custom calls)\n * are both supported. See {@link SpELExpressionOperand}.\n */\n getExpression?: (\n node: SpELExpressionOperand,\n ctx: ParseSpELExpressionContext\n ) => ExpressionNode | null;\n}\n\n/**\n * Converts a SpEL string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseSpEL(spel: string): DefaultRuleGroupType;\n/**\n * Converts a SpEL string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseSpEL(\n spel: string,\n options: Except<ParseSpELOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a SpEL string expression into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseSpEL(\n spel: string,\n options: Except<ParseSpELOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseSpEL(spel: string, options: ParseSpELOptions = {}): DefaultRuleGroupTypeAny {\n const { fields, independentCombinators, listsAsArrays, getExpression } = options;\n const ic = !!independentCombinators;\n const fieldsFlat = getFieldsArray(fields);\n\n const fieldIsValid = (\n fieldName: string,\n operator: DefaultOperatorName,\n subordinateFieldName?: string\n ) =>\n fieldIsValidUtil({\n fieldName,\n fieldsFlat,\n operator,\n subordinateFieldName,\n getValueSources: options?.getValueSources,\n });\n\n const exprCtx: ParseSpELExpressionContext = {\n fieldExists: fieldName => fieldsFlat.length === 0 || fieldsFlat.some(f => f.name === fieldName),\n };\n\n const emptyQuery: DefaultRuleGroupTypeAny = {\n rules: [],\n ...(ic ? {} : { combinator: 'and' }),\n };\n\n const parseProcessedSpEL = (\n expr: SpELProcessedExpression,\n processOpts: {\n groupOnlyIfNecessary?: boolean;\n forwardNegation?: boolean;\n } = {}\n ): DefaultRuleType | DefaultRuleGroupTypeAny | null => {\n const { forwardNegation: _forwardedNegation, groupOnlyIfNecessary: _g } = processOpts;\n if (expr.type === 'op-not') {\n const negatedExpr = parseProcessedSpEL(expr.children[0]);\n // v8 ignore else\n if (negatedExpr) {\n if (\n !isRuleGroup(negatedExpr) &&\n (negatedExpr.operator === 'contains' ||\n negatedExpr.operator === 'beginsWith' ||\n negatedExpr.operator === 'endsWith')\n ) {\n return {\n ...negatedExpr,\n operator: `doesNot${negatedExpr.operator[0].toUpperCase()}${negatedExpr.operator\n .slice(1)\n .replace('s', '')}` as DefaultOperatorName,\n };\n }\n return ic\n ? ({ rules: [negatedExpr], not: true } as DefaultRuleGroupTypeIC)\n : ({\n combinator: 'and',\n rules: [negatedExpr],\n not: true,\n } as DefaultRuleGroupType);\n }\n } else if (isSpELOpAnd(expr) || isSpELOpOr(expr)) {\n if (ic) {\n const andOrList = generateFlatAndOrList(expr);\n const rules = andOrList.map(v => {\n if (typeof v === 'string') {\n return v;\n }\n return parseProcessedSpEL(v);\n });\n // Bail out completely if any rules in the list were invalid\n // so as not to return an incorrect and/or sequence\n if (!rules.every(Boolean)) {\n return null;\n }\n return {\n rules: rules as DefaultRuleGroupICArray,\n };\n }\n const andOrList = generateMixedAndOrList(expr);\n const combinator = andOrList[1] as DefaultCombinatorName;\n const filteredList = andOrList\n .filter(v => Array.isArray(v) || (!!v && typeof v !== 'string' && 'type' in v))\n .map(v =>\n Array.isArray(v) ? v.filter(vf => !!v && typeof vf !== 'string' && 'type' in vf) : v\n ) as (SpELProcessedExpression | SpELProcessedExpression[])[];\n const rules = filteredList\n .map((exp): DefaultRuleGroupType | DefaultRuleType | null => {\n if (Array.isArray(exp)) {\n return {\n combinator: 'and',\n rules: exp.map(e => parseProcessedSpEL(e)).filter(Boolean) as DefaultRuleGroupArray,\n };\n }\n return parseProcessedSpEL(exp) as DefaultRuleType | DefaultRuleGroupType | null;\n })\n .filter(Boolean) as DefaultRuleGroupArray;\n // v8 ignore else\n if (rules.length > 0) {\n return { combinator, rules };\n }\n } else if (isSpELOpMatches(expr)) {\n const [left, right] = expr.children;\n let field: string = '';\n let regex: string = '';\n let valueSource: ValueSource | undefined = undefined;\n if (isSpELIdentifier(left)) {\n field = left.identifier;\n if (isSpELIdentifier(right)) {\n regex = right.identifier;\n valueSource = 'field';\n } else {\n // v8 ignore else\n if (isSpELPrimitive(right)) {\n regex = right.value;\n }\n }\n } else {\n // v8 ignore else\n if (isSpELIdentifier(right) && isSpELPrimitive(left)) {\n field = right.identifier;\n regex = left.value;\n }\n }\n\n if (/^(?!\\^).*?(?<!\\$)$/.test(regex)) {\n // v8 ignore else\n if (fieldIsValid(field, 'contains')) {\n return {\n field,\n operator: 'contains',\n value: regex,\n ...(valueSource ? { valueSource } : {}),\n };\n }\n } else {\n if (/^\\^.*?(?<!\\$)$/.test(regex)) {\n // v8 ignore else\n if (fieldIsValid(field, 'beginsWith')) {\n return {\n field,\n operator: 'beginsWith',\n value: regex.replace(/^\\^/, ''),\n };\n }\n } else {\n // v8 ignore else\n if (/^(?!\\^).*?\\$$/.test(regex)) {\n // v8 ignore else\n if (fieldIsValid(field, 'endsWith')) {\n return {\n field,\n operator: 'endsWith',\n value: regex.replace(/\\$$/, ''),\n };\n }\n }\n }\n }\n } else if (isSpELBetweenValues(expr) || isSpELBetweenFields(expr)) {\n // oxlint-disable-next-line typescript/no-explicit-any\n let values: [any, any] = [null, null];\n let valueSource: ValueSource | undefined = undefined;\n const [\n { identifier: field },\n {\n children: [left, right],\n },\n ] = expr.children;\n\n if (isSpELBetweenValues(expr)) {\n values = [left.value, right.value];\n } else {\n values = [left.identifier, right.identifier];\n valueSource = 'field';\n }\n // v8 ignore else\n if (\n field &&\n values.every(v => fieldIsValid(field, 'between', valueSource === 'field' ? v : undefined))\n ) {\n const valueArray =\n values[0] < values[1] || valueSource === 'field' ? values : [values[1], values[0]];\n const value = listsAsArrays ? valueArray : joinWith(valueArray, ',');\n return valueSource\n ? { field, operator: 'between', value, valueSource }\n : { field, operator: 'between', value };\n }\n } else if (isSpELRelationOp(expr)) {\n let field: string | null = null;\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = undefined;\n let valueSource: ValueSource | undefined = undefined;\n let flip = false;\n const [left, right] = expr.children;\n\n // Arithmetic and method/function expression operands (from `@react-querybuilder/expr`)\n if (getExpression) {\n const leftIsExpr = isSpELExpressionOperand(left);\n const rightIsExpr = isSpELExpressionOperand(right);\n if (leftIsExpr || rightIsExpr) {\n const op = (flipOp: boolean) => normalizeOperator(expr.type, flipOp);\n if (leftIsExpr && rightIsExpr) {\n // expression <op> expression → both sides on lhs/value\n const l = getExpression(left, exprCtx);\n const r = getExpression(right, exprCtx);\n return l && r\n ? { field: '', operator: op(false), lhs: l, value: r, valueSource: 'expression' }\n : null;\n }\n if (isSpELIdentifier(left) && rightIsExpr) {\n // field <op> expression → rhs expression\n const node = getExpression(right, exprCtx);\n const f = left.identifier;\n const operator = op(false);\n return node && fieldIsValid(f, operator)\n ? { field: f, operator, value: node, valueSource: 'expression' }\n : null;\n }\n if (leftIsExpr && isSpELIdentifier(right)) {\n // expression <op> field → flip to field <op> expression\n const node = getExpression(left, exprCtx);\n const f = right.identifier;\n const operator = op(true);\n return node && fieldIsValid(f, operator)\n ? { field: f, operator, value: node, valueSource: 'expression' }\n : null;\n }\n if (leftIsExpr && isSpELPrimitive(right)) {\n // expression <op> literal → lhs = expression, literal value\n const l = getExpression(left, exprCtx);\n return l ? { field: '', operator: op(false), lhs: l, value: right.value } : null;\n }\n if (isSpELPrimitive(left)) {\n // literal <op> expression → lhs = expression, flip operator\n const r = getExpression(right, exprCtx);\n return r ? { field: '', operator: op(true), lhs: r, value: left.value } : null;\n }\n }\n }\n\n if (isSpELIdentifier(left)) {\n field = left.identifier;\n if (isSpELIdentifier(right)) {\n value = right.identifier;\n valueSource = 'field';\n } else if (isSpELPrimitive(right)) {\n value = right.value;\n }\n } else {\n // v8 ignore else\n if (isSpELIdentifier(right) && isSpELPrimitive(left)) {\n flip = true;\n field = right.identifier;\n value = left.value;\n }\n }\n let operator = normalizeOperator(expr.type, flip);\n if (value === null && (operator === '=' || operator === '!=')) {\n operator = operator === '=' ? 'null' : 'notNull';\n }\n if (\n field &&\n fieldIsValid(field, operator, valueSource === 'field' ? value : undefined) &&\n value !== undefined\n ) {\n return valueSource ? { field, operator, value, valueSource } : { field, operator, value };\n }\n }\n return null;\n };\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let compiledSpEL: SpELExpressionNode;\n try {\n compiledSpEL = SpelExpressionEvaluator.compile(spel)._compiledExpression;\n } catch {\n return prepare(emptyQuery);\n }\n\n const processedSpEL = processCompiledExpression(compiledSpEL);\n\n const result = parseProcessedSpEL(processedSpEL);\n if (result) {\n if (isRuleGroup(result)) {\n return prepare(result);\n }\n return prepare({ rules: [result], ...(ic ? {} : { combinator: 'and' }) });\n }\n\n return prepare(emptyQuery);\n}\n\nexport { parseSpEL };\n"],"mappings":"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"}
|
package/dist/parseSpEL.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-
|
|
1
|
+
import { j as joinWith } from "./utils-Dt0D_DMV.mjs";
|
|
2
|
+
import { t as isRuleGroup } from "./isRuleGroup-CqLThsbu.mjs";
|
|
3
|
+
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-Q18lHCKl.mjs";
|
|
4
4
|
import { SpelExpressionEvaluator } from "spel2js";
|
|
5
5
|
//#region src/utils/parseSpEL/utils.ts
|
|
6
6
|
const isSpELPropertyNode = (expr) => {
|
|
@@ -15,7 +15,7 @@ const isSpELListNode = (expr) => {
|
|
|
15
15
|
const isSpELOpAnd = (expr) => expr.type === "op-and";
|
|
16
16
|
const isSpELOpOr = (expr) => expr.type === "op-or";
|
|
17
17
|
const isSpELOpMatches = (expr) => expr.type === "matches" && (isSpELIdentifier(expr.children[0]) && isSpELStringLiteral(expr.children[1]) || isSpELIdentifier(expr.children[1]) && isSpELStringLiteral(expr.children[0]) || isSpELIdentifier(expr.children[0]) && isSpELIdentifier(expr.children[1]));
|
|
18
|
-
const isSpELIdentifier = (expr) => expr.type === "property" || expr.type === "variable" || expr.type === "compound";
|
|
18
|
+
const isSpELIdentifier = (expr) => (expr.type === "property" || expr.type === "variable" || expr.type === "compound") && expr.identifier !== null;
|
|
19
19
|
const isSpELStringLiteral = (expr) => expr.type === "string";
|
|
20
20
|
const isSpELNumericLiteral = (expr) => expr.type === "number";
|
|
21
21
|
const isSpELBooleanLiteral = (expr) => expr.type === "boolean";
|
|
@@ -24,8 +24,85 @@ const isSpELRelationOp = (expr) => expr.type === "op-eq" || expr.type === "op-ne
|
|
|
24
24
|
const isSpELPrimitive = (expr) => isSpELNumericLiteral(expr) || isSpELStringLiteral(expr) || isSpELBooleanLiteral(expr) || isSpELNullLiteral(expr);
|
|
25
25
|
const isSpELBetweenValues = (expr) => expr.type === "between" && isSpELIdentifier(expr.children[0]) && expr.children[1].type === "list" && expr.children[1].children.length >= 2 && expr.children[1].children.every((c) => isSpELPrimitive(c));
|
|
26
26
|
const isSpELBetweenFields = (expr) => expr.type === "between" && isSpELIdentifier(expr.children[0]) && expr.children[1].type === "list" && expr.children[1].children.length >= 2 && expr.children[1].children.every((c) => isSpELIdentifier(c));
|
|
27
|
+
/** A SpEL arithmetic infix node (`op-plus`/`op-minus`/`op-multiply`/`op-divide`/`op-modulus`). */
|
|
28
|
+
const isSpELMathOperation = (expr) => expr.type === "op-plus" || expr.type === "op-minus" || expr.type === "op-multiply" || expr.type === "op-divide" || expr.type === "op-modulus";
|
|
29
|
+
/** A method/function invocation node (`.toUpperCase()`, `T(java.lang.Math).abs(x)`, `myFunc(a)`). */
|
|
30
|
+
const isSpELMethodCall = (expr) => expr.type === "method" && typeof expr.methodName === "string";
|
|
31
|
+
/**
|
|
32
|
+
* Whether a relation operand should be routed to `getExpression`: an arithmetic infix node or a
|
|
33
|
+
* method/function invocation. Bare identifiers, chains, and literals are not expression operands
|
|
34
|
+
* (they retain their normal handling).
|
|
35
|
+
*/
|
|
36
|
+
const isSpELExpressionOperand = (expr) => isSpELMathOperation(expr) || isSpELMethodCall(expr);
|
|
37
|
+
const isSpELMethodNode = (expr) => expr.getType() === "method";
|
|
38
|
+
/**
|
|
39
|
+
* Builds a {@link SpELMethodCall} from a SpEL `method` node. Arguments are stored on the
|
|
40
|
+
* compiled node's `getRaw()` payload (not as children), so they are processed from there.
|
|
41
|
+
*/
|
|
42
|
+
const processMethodNode = (mn, target, typeRef) => {
|
|
43
|
+
const { methodName, args } = mn.getRaw();
|
|
44
|
+
return {
|
|
45
|
+
type: "method",
|
|
46
|
+
children: args.map((a) => processCompiledExpression(a)),
|
|
47
|
+
startPosition: mn.getStartPosition(),
|
|
48
|
+
endPosition: mn.getEndPosition(),
|
|
49
|
+
value: "N/A",
|
|
50
|
+
identifier: null,
|
|
51
|
+
methodName,
|
|
52
|
+
target,
|
|
53
|
+
typeRef
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Processes a SpEL `compound` node that invokes one or more methods, e.g. `name.toUpperCase()`,
|
|
58
|
+
* `a.b.toLowerCase()`, `(a + b).toUpperCase()`, or `T(java.lang.Math).abs(cost)`. Leading
|
|
59
|
+
* property/variable children are collapsed into a dotted receiver identifier, a leading `typeref`
|
|
60
|
+
* becomes the `typeRef` of the first call, and each subsequent `method` child wraps the previous
|
|
61
|
+
* result as its `target`. Returns `null` for chain shapes that can't be represented.
|
|
62
|
+
*/
|
|
63
|
+
const processMethodChain = (ce) => {
|
|
64
|
+
const children = ce.getChildren();
|
|
65
|
+
if (!children.some((c) => isSpELMethodNode(c))) return null;
|
|
66
|
+
let index = 0;
|
|
67
|
+
let target = null;
|
|
68
|
+
let typeRef = null;
|
|
69
|
+
const first = children[0];
|
|
70
|
+
if (first.getType() === "typeref") {
|
|
71
|
+
typeRef = first.getChildren()[0].getRaw().join(".");
|
|
72
|
+
index = 1;
|
|
73
|
+
} else if (isSpELPropertyNode(first)) {
|
|
74
|
+
const parts = [];
|
|
75
|
+
while (index < children.length && isSpELPropertyNode(children[index])) {
|
|
76
|
+
parts.push(children[index].getRaw());
|
|
77
|
+
++index;
|
|
78
|
+
}
|
|
79
|
+
target = {
|
|
80
|
+
type: parts.length > 1 ? "compound" : first.getType(),
|
|
81
|
+
children: [],
|
|
82
|
+
startPosition: first.getStartPosition(),
|
|
83
|
+
endPosition: children[index - 1].getEndPosition(),
|
|
84
|
+
value: "N/A",
|
|
85
|
+
identifier: parts.join(".")
|
|
86
|
+
};
|
|
87
|
+
} else {
|
|
88
|
+
target = processCompiledExpression(first);
|
|
89
|
+
index = 1;
|
|
90
|
+
}
|
|
91
|
+
let result = null;
|
|
92
|
+
for (; index < children.length; ++index) {
|
|
93
|
+
const child = children[index];
|
|
94
|
+
if (!isSpELMethodNode(child)) return null;
|
|
95
|
+
result = processMethodNode(child, result ?? target, result ? null : typeRef);
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
};
|
|
27
99
|
const processCompiledExpression = (ce) => {
|
|
28
100
|
const type = ce.getType();
|
|
101
|
+
if (isSpELMethodNode(ce)) return processMethodNode(ce, null, null);
|
|
102
|
+
if (type === "compound" && !isSpELCompoundNode(ce)) {
|
|
103
|
+
const methodChain = processMethodChain(ce);
|
|
104
|
+
if (methodChain) return methodChain;
|
|
105
|
+
}
|
|
29
106
|
const identifier = isSpELCompoundNode(ce) ? ce.getChildren().map((p) => isSpELPropertyNode(p) ? p.getRaw() : /* v8 ignore next -- @preserve */ "").join(".") : isSpELPropertyNode(ce) ? ce.getRaw() : null;
|
|
30
107
|
const children = type === "compound" ? [] : (isSpELListNode(ce) ? ce.getRaw : ce.getChildren)().map((c) => processCompiledExpression(c));
|
|
31
108
|
const startPosition = ce.getStartPosition();
|
|
@@ -96,7 +173,7 @@ const generateMixedAndOrList = (expr) => {
|
|
|
96
173
|
//#endregion
|
|
97
174
|
//#region src/utils/parseSpEL/parseSpEL.ts
|
|
98
175
|
function parseSpEL(spel, options = {}) {
|
|
99
|
-
const { fields, independentCombinators, listsAsArrays } = options;
|
|
176
|
+
const { fields, independentCombinators, listsAsArrays, getExpression } = options;
|
|
100
177
|
const ic = !!independentCombinators;
|
|
101
178
|
const fieldsFlat = getFieldsArray(fields);
|
|
102
179
|
const fieldIsValid = (fieldName, operator, subordinateFieldName) => fieldIsValidUtil({
|
|
@@ -106,6 +183,7 @@ function parseSpEL(spel, options = {}) {
|
|
|
106
183
|
subordinateFieldName,
|
|
107
184
|
getValueSources: options?.getValueSources
|
|
108
185
|
});
|
|
186
|
+
const exprCtx = { fieldExists: (fieldName) => fieldsFlat.length === 0 || fieldsFlat.some((f) => f.name === fieldName) };
|
|
109
187
|
const emptyQuery = {
|
|
110
188
|
rules: [],
|
|
111
189
|
...ic ? {} : { combinator: "and" }
|
|
@@ -220,6 +298,64 @@ function parseSpEL(spel, options = {}) {
|
|
|
220
298
|
let valueSource = void 0;
|
|
221
299
|
let flip = false;
|
|
222
300
|
const [left, right] = expr.children;
|
|
301
|
+
if (getExpression) {
|
|
302
|
+
const leftIsExpr = isSpELExpressionOperand(left);
|
|
303
|
+
const rightIsExpr = isSpELExpressionOperand(right);
|
|
304
|
+
if (leftIsExpr || rightIsExpr) {
|
|
305
|
+
const op = (flipOp) => normalizeOperator(expr.type, flipOp);
|
|
306
|
+
if (leftIsExpr && rightIsExpr) {
|
|
307
|
+
const l = getExpression(left, exprCtx);
|
|
308
|
+
const r = getExpression(right, exprCtx);
|
|
309
|
+
return l && r ? {
|
|
310
|
+
field: "",
|
|
311
|
+
operator: op(false),
|
|
312
|
+
lhs: l,
|
|
313
|
+
value: r,
|
|
314
|
+
valueSource: "expression"
|
|
315
|
+
} : null;
|
|
316
|
+
}
|
|
317
|
+
if (isSpELIdentifier(left) && rightIsExpr) {
|
|
318
|
+
const node = getExpression(right, exprCtx);
|
|
319
|
+
const f = left.identifier;
|
|
320
|
+
const operator = op(false);
|
|
321
|
+
return node && fieldIsValid(f, operator) ? {
|
|
322
|
+
field: f,
|
|
323
|
+
operator,
|
|
324
|
+
value: node,
|
|
325
|
+
valueSource: "expression"
|
|
326
|
+
} : null;
|
|
327
|
+
}
|
|
328
|
+
if (leftIsExpr && isSpELIdentifier(right)) {
|
|
329
|
+
const node = getExpression(left, exprCtx);
|
|
330
|
+
const f = right.identifier;
|
|
331
|
+
const operator = op(true);
|
|
332
|
+
return node && fieldIsValid(f, operator) ? {
|
|
333
|
+
field: f,
|
|
334
|
+
operator,
|
|
335
|
+
value: node,
|
|
336
|
+
valueSource: "expression"
|
|
337
|
+
} : null;
|
|
338
|
+
}
|
|
339
|
+
if (leftIsExpr && isSpELPrimitive(right)) {
|
|
340
|
+
const l = getExpression(left, exprCtx);
|
|
341
|
+
return l ? {
|
|
342
|
+
field: "",
|
|
343
|
+
operator: op(false),
|
|
344
|
+
lhs: l,
|
|
345
|
+
value: right.value
|
|
346
|
+
} : null;
|
|
347
|
+
}
|
|
348
|
+
if (isSpELPrimitive(left)) {
|
|
349
|
+
const r = getExpression(right, exprCtx);
|
|
350
|
+
return r ? {
|
|
351
|
+
field: "",
|
|
352
|
+
operator: op(true),
|
|
353
|
+
lhs: r,
|
|
354
|
+
value: left.value
|
|
355
|
+
} : null;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
223
359
|
if (isSpELIdentifier(left)) {
|
|
224
360
|
field = left.identifier;
|
|
225
361
|
if (isSpELIdentifier(right)) {
|
|
@@ -264,6 +400,6 @@ function parseSpEL(spel, options = {}) {
|
|
|
264
400
|
return prepare(emptyQuery);
|
|
265
401
|
}
|
|
266
402
|
//#endregion
|
|
267
|
-
export { parseSpEL };
|
|
403
|
+
export { generateFlatAndOrList, generateMixedAndOrList, isSpELBetweenFields, isSpELBetweenValues, isSpELBooleanLiteral, isSpELCompoundNode, isSpELExpressionOperand, isSpELIdentifier, isSpELListNode, isSpELMathOperation, isSpELMethodCall, isSpELMethodNode, isSpELNullLiteral, isSpELNumericLiteral, isSpELOpAnd, isSpELOpMatches, isSpELOpOr, isSpELPrimitive, isSpELPropertyNode, isSpELRelationOp, isSpELStringLiteral, normalizeOperator, parseSpEL, processCompiledExpression };
|
|
268
404
|
|
|
269
405
|
//# sourceMappingURL=parseSpEL.mjs.map
|