@react-querybuilder/core 8.20.2 → 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.
Files changed (108) hide show
  1. package/README.md +4 -0
  2. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +2261 -2113
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js +319 -22
  4. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  5. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +2261 -2113
  6. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  7. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  8. package/dist/{convertQuery-BJKNgecE.js → convertQuery-Cw76XFIn.js} +8 -8
  9. package/dist/{convertQuery-BJKNgecE.js.map → convertQuery-Cw76XFIn.js.map} +1 -1
  10. package/dist/{convertQuery-J1CaoDxe.mjs → convertQuery-D_4J7E-Z.mjs} +2 -2
  11. package/dist/{convertQuery-J1CaoDxe.mjs.map → convertQuery-D_4J7E-Z.mjs.map} +1 -1
  12. package/dist/formatQuery.d.mts +499 -459
  13. package/dist/formatQuery.d.ts +499 -459
  14. package/dist/formatQuery.js +170 -88
  15. package/dist/formatQuery.js.map +1 -1
  16. package/dist/formatQuery.mjs +97 -20
  17. package/dist/formatQuery.mjs.map +1 -1
  18. package/dist/import-BVdxeIBO.d.mts +26 -0
  19. package/dist/import-Ddc3d_8q.d.ts +26 -0
  20. package/dist/{index-DlVg-QXo.d.mts → index-BSwFvkeI.d.mts} +679 -648
  21. package/dist/{index-DlVg-QXo.d.ts → index-BSwFvkeI.d.ts} +679 -648
  22. package/dist/{objectUtils-DBJI82bl.js → isRuleGroup-0JNiQgLg.js} +1 -26
  23. package/dist/isRuleGroup-0JNiQgLg.js.map +1 -0
  24. package/dist/{objectUtils-ZvPkF6u6.mjs → isRuleGroup-CqLThsbu.mjs} +2 -15
  25. package/dist/isRuleGroup-CqLThsbu.mjs.map +1 -0
  26. package/dist/objectUtils-Cr02aGxb.js +27 -0
  27. package/dist/objectUtils-Cr02aGxb.js.map +1 -0
  28. package/dist/objectUtils-DBlmJgBf.mjs +16 -0
  29. package/dist/objectUtils-DBlmJgBf.mjs.map +1 -0
  30. package/dist/parseCEL.d.mts +64 -30
  31. package/dist/parseCEL.d.ts +64 -30
  32. package/dist/parseCEL.js +91 -12
  33. package/dist/parseCEL.js.map +1 -1
  34. package/dist/parseCEL.mjs +85 -8
  35. package/dist/parseCEL.mjs.map +1 -1
  36. package/dist/parseCypher.d.mts +24 -25
  37. package/dist/parseCypher.d.ts +24 -25
  38. package/dist/parseGremlin.d.mts +18 -19
  39. package/dist/parseGremlin.d.ts +18 -19
  40. package/dist/parseJSONata.d.mts +207 -20
  41. package/dist/parseJSONata.d.ts +207 -20
  42. package/dist/parseJSONata.js +92 -7
  43. package/dist/parseJSONata.js.map +1 -1
  44. package/dist/parseJSONata.mjs +80 -4
  45. package/dist/parseJSONata.mjs.map +1 -1
  46. package/dist/parseJsonLogic.d.mts +51 -18
  47. package/dist/parseJsonLogic.d.ts +51 -18
  48. package/dist/parseJsonLogic.js +95 -34
  49. package/dist/parseJsonLogic.js.map +1 -1
  50. package/dist/parseJsonLogic.mjs +65 -6
  51. package/dist/parseJsonLogic.mjs.map +1 -1
  52. package/dist/parseMongoDB.d.mts +89 -58
  53. package/dist/parseMongoDB.d.ts +89 -58
  54. package/dist/parseMongoDB.js +140 -15
  55. package/dist/parseMongoDB.js.map +1 -1
  56. package/dist/parseMongoDB.mjs +128 -5
  57. package/dist/parseMongoDB.mjs.map +1 -1
  58. package/dist/parseSPARQL.d.mts +17 -18
  59. package/dist/parseSPARQL.d.ts +17 -18
  60. package/dist/parseSPARQL.js.map +1 -1
  61. package/dist/parseSPARQL.mjs.map +1 -1
  62. package/dist/parseSQL.d.mts +266 -18
  63. package/dist/parseSQL.d.ts +266 -18
  64. package/dist/parseSQL.js +163 -10
  65. package/dist/parseSQL.js.map +1 -1
  66. package/dist/parseSQL.mjs +149 -7
  67. package/dist/parseSQL.mjs.map +1 -1
  68. package/dist/parseSpEL.d.mts +193 -19
  69. package/dist/parseSpEL.d.ts +193 -19
  70. package/dist/parseSpEL.js +166 -7
  71. package/dist/parseSpEL.js.map +1 -1
  72. package/dist/parseSpEL.mjs +142 -6
  73. package/dist/parseSpEL.mjs.map +1 -1
  74. package/dist/{prepareQueryObjects-Bni5VgYM.js → prepareQueryObjects-C2-kTZvR.js} +5 -5
  75. package/dist/prepareQueryObjects-C2-kTZvR.js.map +1 -0
  76. package/dist/{prepareQueryObjects-BCLU20Cg.mjs → prepareQueryObjects-Q18lHCKl.mjs} +3 -3
  77. package/dist/prepareQueryObjects-Q18lHCKl.mjs.map +1 -0
  78. package/dist/query-builder-layout.css.map +1 -1
  79. package/dist/query-builder.css.map +1 -1
  80. package/dist/react-querybuilder_core.d.mts +2261 -2113
  81. package/dist/react-querybuilder_core.legacy-esm.d.ts +2261 -2113
  82. package/dist/react-querybuilder_core.legacy-esm.js +335 -40
  83. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  84. package/dist/react-querybuilder_core.mjs +309 -23
  85. package/dist/react-querybuilder_core.mjs.map +1 -1
  86. package/dist/react-querybuilder_core.production.d.mts +2261 -2113
  87. package/dist/react-querybuilder_core.production.mjs +1 -1
  88. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  89. package/dist/styles/_layout.scss +4 -10
  90. package/dist/transformQuery.d.mts +91 -92
  91. package/dist/transformQuery.d.ts +91 -92
  92. package/dist/transformQuery.js +4 -3
  93. package/dist/transformQuery.js.map +1 -1
  94. package/dist/transformQuery.mjs +2 -1
  95. package/dist/transformQuery.mjs.map +1 -1
  96. package/dist/{utils-BpaOtylk.js → utils-DEwV7F6B.js} +108 -12
  97. package/dist/utils-DEwV7F6B.js.map +1 -0
  98. package/dist/{utils-CJRGiPb-.mjs → utils-Dt0D_DMV.mjs} +69 -3
  99. package/dist/utils-Dt0D_DMV.mjs.map +1 -0
  100. package/package.json +14 -14
  101. package/dist/import-Qs1-kgv5.d.ts +0 -27
  102. package/dist/import-ShTj5IdB.d.mts +0 -27
  103. package/dist/objectUtils-DBJI82bl.js.map +0 -1
  104. package/dist/objectUtils-ZvPkF6u6.mjs.map +0 -1
  105. package/dist/prepareQueryObjects-BCLU20Cg.mjs.map +0 -1
  106. package/dist/prepareQueryObjects-Bni5VgYM.js.map +0 -1
  107. package/dist/utils-BpaOtylk.js.map +0 -1
  108. 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-BpaOtylk.js");
3
- const require_objectUtils = require("./objectUtils-DBJI82bl.js");
4
- const require_prepareQueryObjects = require("./prepareQueryObjects-Bni5VgYM.js");
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 (!require_objectUtils.isRuleGroup(negatedExpr) && (negatedExpr.operator === "contains" || negatedExpr.operator === "beginsWith" || negatedExpr.operator === "endsWith")) return {
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 (require_objectUtils.isRuleGroup(result)) return prepare(result);
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
@@ -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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"}
@@ -1,6 +1,6 @@
1
- import { E as joinWith } from "./utils-CJRGiPb-.mjs";
2
- import { r as isRuleGroup } from "./objectUtils-ZvPkF6u6.mjs";
3
- import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-BCLU20Cg.mjs";
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