@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.
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 +323 -26
  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 +173 -91
  15. package/dist/formatQuery.js.map +1 -1
  16. package/dist/formatQuery.mjs +100 -23
  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-DaAXX792.js → prepareQueryObjects-C2-kTZvR.js} +6 -6
  75. package/dist/prepareQueryObjects-C2-kTZvR.js.map +1 -0
  76. package/dist/{prepareQueryObjects-Cd_tt4oy.mjs → prepareQueryObjects-Q18lHCKl.mjs} +4 -4
  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 +339 -44
  83. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  84. package/dist/react-querybuilder_core.mjs +313 -27
  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 +15 -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-Cd_tt4oy.mjs.map +0 -1
  106. package/dist/prepareQueryObjects-DaAXX792.js.map +0 -1
  107. package/dist/utils-BpaOtylk.js.map +0 -1
  108. package/dist/utils-CJRGiPb-.mjs.map +0 -1
@@ -21,8 +21,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  //#endregion
24
- const require_objectUtils = require("./objectUtils-DBJI82bl.js");
25
- const require_prepareQueryObjects = require("./prepareQueryObjects-DaAXX792.js");
24
+ const require_isRuleGroup = require("./isRuleGroup-0JNiQgLg.js");
25
+ const require_prepareQueryObjects = require("./prepareQueryObjects-C2-kTZvR.js");
26
26
  let jsonata = require("jsonata");
27
27
  jsonata = __toESM(jsonata);
28
28
  //#region src/utils/parseJSONata/utils.ts
@@ -59,6 +59,25 @@ const isJSONataPrimitiveList = (expr) => isJSONataList(expr) && expr.expressions
59
59
  const isJSONataIdentifierList = (expr) => isJSONataList(expr) && expr.expressions.every((v) => isJSONataIdentifier(v));
60
60
  const isJSONataValidValue = (expr) => isJSONataPrimitive(expr) || isJSONataRegex(expr) || isJSONataIdentifier(expr) || isJSONataPrimitiveList(expr) || isJSONataIdentifierList(expr) || isJSONataToMillis(expr);
61
61
  const isJSONataComparison = (expr) => isJSONataEqual(expr) || isJSONataNotEqual(expr) || isJSONataGreaterThan(expr) || isJSONataGreaterThanOrEqual(expr) || isJSONataLessThan(expr) || isJSONataLessThanOrEqual(expr);
62
+ const jsonataArithmeticOperators = /* @__PURE__ */ new Set([
63
+ "+",
64
+ "-",
65
+ "*",
66
+ "/",
67
+ "%"
68
+ ]);
69
+ /**
70
+ * A JSONata comparison operand that is a candidate expression subtree: an arithmetic infix node
71
+ * (`+ - * / %`) or a function-call node (excluding the `not`/`contains` predicates handled
72
+ * elsewhere). The expr-supplied `getExpression` handler decides whether it maps to a known
73
+ * function.
74
+ */
75
+ const isJSONataExpressionOperand = (expr) => {
76
+ if (!isJSONataExprNode(expr)) return false;
77
+ if (isJSONataBlock(expr) && expr.expressions.length === 1) return isJSONataExpressionOperand(expr.expressions[0]);
78
+ if (isJSONataBinaryNode(expr) && jsonataArithmeticOperators.has(expr.value)) return true;
79
+ return expr.type === "function" && expr.value === "(" && isJSONataExprNode(expr.procedure) && expr.procedure.type === "variable" && typeof expr.procedure.value === "string" && expr.procedure.value !== "not" && expr.procedure.value !== "contains";
80
+ };
62
81
  const getValidValue = (expr) => {
63
82
  if (isJSONataToMillis(expr)) return getValidValue(expr.arguments[0]);
64
83
  else if (isJSONataIdentifier(expr)) return getFieldFromPath(expr);
@@ -125,7 +144,7 @@ const generateMixedAndOrList = (expr) => {
125
144
  //#endregion
126
145
  //#region src/utils/parseJSONata/parseJSONata.ts
127
146
  function parseJSONata(jsonataInput, options = {}) {
128
- const { fields, independentCombinators, listsAsArrays: _laa } = options;
147
+ const { fields, independentCombinators, listsAsArrays: _laa, getExpression } = options;
129
148
  const ic = !!independentCombinators;
130
149
  const fieldsFlat = require_prepareQueryObjects.getFieldsArray(fields);
131
150
  const fieldIsValid = (fieldName, operator, subordinateFieldName) => require_prepareQueryObjects.fieldIsValidUtil({
@@ -139,6 +158,7 @@ function parseJSONata(jsonataInput, options = {}) {
139
158
  rules: [],
140
159
  ...ic ? {} : { combinator: "and" }
141
160
  };
161
+ const exprCtx = { fieldExists: (fieldName) => fieldsFlat.length === 0 || fieldsFlat.some((f) => f.name === fieldName) };
142
162
  const parseJSONataAST = (expr, processOpts = {}) => {
143
163
  const { forwardNegation: _forwardedNegation, groupOnlyIfNecessary: _g } = processOpts;
144
164
  if (isJSONataBlock(expr)) {
@@ -156,7 +176,7 @@ function parseJSONata(jsonataInput, options = {}) {
156
176
  return parseJSONataAST(v);
157
177
  });
158
178
  if (!rules.every(Boolean)) return null;
159
- if (((rs) => rs.length === 3 && (rs[1] === "and" || rs[1] === "or") && !require_objectUtils.isRuleGroup(rs[0]) && !require_objectUtils.isRuleGroup(rs[2]))(rules) && rules[0].field === rules[2].field && (rules[0].valueSource ?? "value") === (rules[2].valueSource ?? "value") && (rules[1] === "and" && (rules[0].operator === ">=" && rules[2].operator === "<=" || rules[0].operator === "<=" && rules[2].operator === ">=") || rules[1] === "or" && (rules[0].operator === ">" && rules[2].operator === "<" || rules[0].operator === "<" && rules[2].operator === ">"))) return {
179
+ if (((rs) => rs.length === 3 && (rs[1] === "and" || rs[1] === "or") && !require_isRuleGroup.isRuleGroup(rs[0]) && !require_isRuleGroup.isRuleGroup(rs[2]))(rules) && rules[0].field === rules[2].field && (rules[0].valueSource ?? "value") === (rules[2].valueSource ?? "value") && (rules[1] === "and" && (rules[0].operator === ">=" && rules[2].operator === "<=" || rules[0].operator === "<=" && rules[2].operator === ">=") || rules[1] === "or" && (rules[0].operator === ">" && rules[2].operator === "<" || rules[0].operator === "<" && rules[2].operator === ">"))) return {
160
180
  field: rules[0].field,
161
181
  operator: rules[1] === "and" ? "between" : "notBetween",
162
182
  value: rules[1] === "and" && rules[0].operator === "<=" || rules[1] === "or" && rules[0].operator === ">" ? [rules[2].value, rules[0].value] : [rules[0].value, rules[2].value],
@@ -173,7 +193,7 @@ function parseJSONata(jsonataInput, options = {}) {
173
193
  };
174
194
  return parseJSONataAST(exp);
175
195
  }).filter(Boolean);
176
- if (((rs) => rs.length === 2 && !require_objectUtils.isRuleGroup(rs[0]) && !require_objectUtils.isRuleGroup(rs[1]))(rules) && rules[0].field === rules[1].field && (rules[0].valueSource ?? "value") === (rules[1].valueSource ?? "value") && (combinator === "and" && (rules[0].operator === ">=" && rules[1].operator === "<=" || rules[0].operator === "<=" && rules[1].operator === ">=") || combinator === "or" && (rules[0].operator === ">" && rules[1].operator === "<" || rules[0].operator === "<" && rules[1].operator === ">"))) return {
196
+ if (((rs) => rs.length === 2 && !require_isRuleGroup.isRuleGroup(rs[0]) && !require_isRuleGroup.isRuleGroup(rs[1]))(rules) && rules[0].field === rules[1].field && (rules[0].valueSource ?? "value") === (rules[1].valueSource ?? "value") && (combinator === "and" && (rules[0].operator === ">=" && rules[1].operator === "<=" || rules[0].operator === "<=" && rules[1].operator === ">=") || combinator === "or" && (rules[0].operator === ">" && rules[1].operator === "<" || rules[0].operator === "<" && rules[1].operator === ">"))) return {
177
197
  field: rules[0].field,
178
198
  operator: combinator === "and" ? "between" : "notBetween",
179
199
  value: combinator === "and" && rules[0].operator === "<=" || combinator === "or" && rules[0].operator === ">" ? [rules[1].value, rules[0].value] : [rules[0].value, rules[1].value],
@@ -188,7 +208,7 @@ function parseJSONata(jsonataInput, options = {}) {
188
208
  const negatedExpr = parseJSONataAST(expr.arguments[0]);
189
209
  // v8 ignore else
190
210
  if (negatedExpr) {
191
- if (!require_objectUtils.isRuleGroup(negatedExpr) && (negatedExpr.operator === "contains" || negatedExpr.operator === "beginsWith" || negatedExpr.operator === "endsWith")) return {
211
+ if (!require_isRuleGroup.isRuleGroup(negatedExpr) && (negatedExpr.operator === "contains" || negatedExpr.operator === "beginsWith" || negatedExpr.operator === "endsWith")) return {
192
212
  ...negatedExpr,
193
213
  operator: negatedLikeOperators[negatedExpr.operator]
194
214
  };
@@ -241,6 +261,62 @@ function parseJSONata(jsonataInput, options = {}) {
241
261
  let valueSource = void 0;
242
262
  let flip = false;
243
263
  const { lhs, rhs } = expr;
264
+ if (getExpression) {
265
+ const lhsIsExpr = isJSONataExpressionOperand(lhs);
266
+ const rhsIsExpr = isJSONataExpressionOperand(rhs);
267
+ if (lhsIsExpr && rhsIsExpr) {
268
+ const l = getExpression(lhs, exprCtx);
269
+ const r = getExpression(rhs, exprCtx);
270
+ if (l && r) return {
271
+ field: "",
272
+ operator: normalizeOperator(expr.value),
273
+ lhs: l,
274
+ value: r,
275
+ valueSource: "expression"
276
+ };
277
+ return null;
278
+ } else if (isJSONataIdentifier(lhs) && rhsIsExpr) {
279
+ const node = getExpression(rhs, exprCtx);
280
+ const f = getFieldFromPath(lhs);
281
+ const op = normalizeOperator(expr.value);
282
+ if (node && fieldIsValid(f, op)) return {
283
+ field: f,
284
+ operator: op,
285
+ value: node,
286
+ valueSource: "expression"
287
+ };
288
+ return null;
289
+ } else if (lhsIsExpr && isJSONataIdentifier(rhs)) {
290
+ const node = getExpression(lhs, exprCtx);
291
+ const f = getFieldFromPath(rhs);
292
+ const op = normalizeOperator(expr.value, true);
293
+ if (node && fieldIsValid(f, op)) return {
294
+ field: f,
295
+ operator: op,
296
+ value: node,
297
+ valueSource: "expression"
298
+ };
299
+ return null;
300
+ } else if (lhsIsExpr && isJSONataValidValue(rhs)) {
301
+ const l = getExpression(lhs, exprCtx);
302
+ if (l) return {
303
+ field: "",
304
+ operator: normalizeOperator(expr.value),
305
+ lhs: l,
306
+ value: getValidValue(rhs)
307
+ };
308
+ return null;
309
+ } else if (isJSONataValidValue(lhs) && rhsIsExpr) {
310
+ const l = getExpression(rhs, exprCtx);
311
+ if (l) return {
312
+ field: "",
313
+ operator: normalizeOperator(expr.value, true),
314
+ lhs: l,
315
+ value: getValidValue(lhs)
316
+ };
317
+ return null;
318
+ }
319
+ }
244
320
  if (isJSONataIdentifier(lhs) && isJSONataValidValue(rhs)) {
245
321
  field = getFieldFromPath(lhs);
246
322
  value = getValidValue(rhs);
@@ -274,7 +350,7 @@ function parseJSONata(jsonataInput, options = {}) {
274
350
  }
275
351
  const result = parseJSONataAST(jsonataExpr.ast());
276
352
  if (result) {
277
- if (require_objectUtils.isRuleGroup(result)) return prepare(result);
353
+ if (require_isRuleGroup.isRuleGroup(result)) return prepare(result);
278
354
  return prepare({
279
355
  rules: [result],
280
356
  ...ic ? {} : { combinator: "and" }
@@ -283,6 +359,15 @@ function parseJSONata(jsonataInput, options = {}) {
283
359
  return prepare(emptyQuery);
284
360
  }
285
361
  //#endregion
362
+ exports.getFieldFromPath = getFieldFromPath;
363
+ exports.getValidValue = getValidValue;
364
+ exports.isJSONataBoolean = isJSONataBoolean;
365
+ exports.isJSONataExpressionOperand = isJSONataExpressionOperand;
366
+ exports.isJSONataIdentifier = isJSONataIdentifier;
367
+ exports.isJSONataList = isJSONataList;
368
+ exports.isJSONataNull = isJSONataNull;
369
+ exports.isJSONataNumber = isJSONataNumber;
370
+ exports.isJSONataString = isJSONataString;
286
371
  exports.parseJSONata = parseJSONata;
287
372
 
288
373
  //# sourceMappingURL=parseJSONata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseJSONata.js","names":["getFieldsArray","fieldIsValidUtil","isRuleGroup","prepareRuleGroup"],"sources":["../src/utils/parseJSONata/utils.ts","../src/utils/parseJSONata/parseJSONata.ts"],"sourcesContent":["import type { DefaultCombinatorName, DefaultOperatorName } from '../../types';\nimport type {\n JSONataAnd,\n JSONataBinaryNode,\n JSONataBlock,\n JSONataBoolean,\n JSONataContains,\n JSONataEqual,\n JSONataExprNode,\n JSONataGreaterThan,\n JSONataGreaterThanOrEqual,\n JSONataIdentifier,\n JSONataIn,\n JSONataLessThan,\n JSONataLessThanOrEqual,\n JSONataList,\n JSONataName,\n JSONataNot,\n JSONataNotEqual,\n JSONataNull,\n JSONataNumber,\n JSONataOr,\n JSONataPath,\n JSONataRegex,\n JSONataString,\n JSONataToMillis,\n} from './types';\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype Any = any;\n\nexport const isJSONataExprNode = (expr: Any): expr is JSONataExprNode => {\n return expr && typeof expr === 'object' && typeof expr.type === 'string';\n};\nconst isJSONataBinaryNode = (expr: Any): expr is JSONataBinaryNode =>\n isJSONataExprNode(expr) && expr.type === 'binary';\n\n// Identifiers\nexport const isJSONataPath = (expr: Any): expr is JSONataPath =>\n isJSONataExprNode(expr) &&\n expr.type === 'path' &&\n Array.isArray(expr.steps) &&\n expr.steps.length > 0 &&\n isJSONataExprNode(expr.steps[0]);\nexport const isJSONataName = (expr: Any): expr is JSONataName =>\n isJSONataExprNode(expr) &&\n expr.type === 'name' &&\n typeof expr.value === 'string' &&\n expr.value.length > 0;\nexport const isJSONataIdentifier = (expr: Any): expr is JSONataIdentifier =>\n isJSONataPath(expr) && expr.steps.every(v => isJSONataName(v));\n\n// Groups\nexport const isJSONataBlock = (expr: Any): expr is JSONataBlock =>\n isJSONataExprNode(expr) &&\n expr.type === 'block' &&\n Array.isArray(expr.expressions) &&\n expr.expressions.length > 0 &&\n isJSONataExprNode(expr.expressions[0]);\n\n// Values\nexport const isJSONataString = (expr: Any): expr is JSONataString =>\n isJSONataExprNode(expr) && expr.type === 'string' && typeof expr.value === 'string';\nexport const isJSONataNumber = (expr: Any): expr is JSONataNumber =>\n isJSONataExprNode(expr) && expr.type === 'number' && typeof expr.value === 'number';\nexport const isJSONataBoolean = (expr: Any): expr is JSONataBoolean =>\n isJSONataExprNode(expr) && expr.type === 'value' && typeof expr.value === 'boolean';\nexport const isJSONataNull = (expr: Any): expr is JSONataNull =>\n isJSONataExprNode(expr) && expr.type === 'value' && expr.value === null;\nexport const isJSONataRegex = (expr: Any): expr is JSONataRegex =>\n isJSONataExprNode(expr) && expr.type === 'regex' && expr.value instanceof RegExp;\n\n// Combinators\nexport const isJSONataAnd = (expr: Any): expr is JSONataAnd =>\n isJSONataBinaryNode(expr) && expr.value === 'and';\nexport const isJSONataOr = (expr: Any): expr is JSONataOr =>\n isJSONataBinaryNode(expr) && expr.value === 'or';\n\n// Operators\nexport const isJSONataEqual = (expr: Any): expr is JSONataEqual =>\n isJSONataBinaryNode(expr) && expr.value === '=';\nexport const isJSONataNotEqual = (expr: Any): expr is JSONataNotEqual =>\n isJSONataBinaryNode(expr) && expr.value === '!=';\nexport const isJSONataGreaterThan = (expr: Any): expr is JSONataGreaterThan =>\n isJSONataBinaryNode(expr) && expr.value === '>';\nexport const isJSONataGreaterThanOrEqual = (expr: Any): expr is JSONataGreaterThanOrEqual =>\n isJSONataBinaryNode(expr) && expr.value === '>=';\nexport const isJSONataLessThan = (expr: Any): expr is JSONataLessThan =>\n isJSONataBinaryNode(expr) && expr.value === '<';\nexport const isJSONataLessThanOrEqual = (expr: Any): expr is JSONataLessThanOrEqual =>\n isJSONataBinaryNode(expr) && expr.value === '<=';\nexport const isJSONataIn = (expr: Any): expr is JSONataIn =>\n isJSONataBinaryNode(expr) &&\n expr.value === 'in' &&\n isJSONataPath(expr.lhs) &&\n isJSONataList(expr.rhs);\n\n// Functions\nexport const isJSONataNot = (expr: Any): expr is JSONataNot =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n isJSONataExprNode(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'not' &&\n expr.procedure.type === 'variable';\nexport const isJSONataContains = (expr: Any): expr is JSONataContains =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n expr.arguments.length >= 2 &&\n isJSONataExprNode(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'contains' &&\n expr.procedure.type === 'variable';\nexport const isJSONataToMillis = (expr: Any): expr is JSONataToMillis =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n expr.arguments.length > 0 &&\n isJSONataString(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'toMillis' &&\n expr.procedure.type === 'variable';\n\n// Miscellaneous\nexport const isJSONataList = (expr: Any): expr is JSONataList =>\n isJSONataExprNode(expr) &&\n expr.type === 'unary' &&\n expr.value === '[' &&\n Array.isArray(expr.expressions);\nexport const isJSONataPrimitive = (expr: Any): boolean => {\n return (\n isJSONataString(expr) ||\n isJSONataNumber(expr) ||\n isJSONataBoolean(expr) ||\n isJSONataNull(expr) ||\n isJSONataToMillis(expr)\n );\n};\nexport const isJSONataPrimitiveList = (expr: Any): boolean =>\n isJSONataList(expr) && expr.expressions.every(v => isJSONataPrimitive(v));\nexport const isJSONataIdentifierList = (expr: Any): boolean =>\n isJSONataList(expr) && expr.expressions.every(v => isJSONataIdentifier(v));\nexport const isJSONataValidValue = (expr: Any): boolean =>\n isJSONataPrimitive(expr) ||\n isJSONataRegex(expr) ||\n isJSONataIdentifier(expr) ||\n isJSONataPrimitiveList(expr) ||\n isJSONataIdentifierList(expr) ||\n isJSONataToMillis(expr);\nexport const isJSONataComparison = (\n expr: Any\n): expr is\n | JSONataEqual\n | JSONataNotEqual\n | JSONataGreaterThan\n | JSONataGreaterThanOrEqual\n | JSONataLessThan\n | JSONataLessThanOrEqual =>\n isJSONataEqual(expr) ||\n isJSONataNotEqual(expr) ||\n isJSONataGreaterThan(expr) ||\n isJSONataGreaterThanOrEqual(expr) ||\n isJSONataLessThan(expr) ||\n isJSONataLessThanOrEqual(expr);\n\nexport const getValidValue = (expr: Any): Any => {\n if (isJSONataToMillis(expr)) {\n return getValidValue(expr.arguments[0]);\n } else if (isJSONataIdentifier(expr)) {\n return getFieldFromPath(expr);\n } else if (isJSONataPrimitiveList(expr)) {\n return expr.expressions.map((v: Any) => getValidValue(v));\n } else if (isJSONataIdentifierList(expr)) {\n return expr.expressions.map((v: Any) => getFieldFromPath(v));\n }\n return expr.value;\n};\n\nexport const getFieldFromPath = (path: JSONataPath): string =>\n isJSONataIdentifier(path)\n ? path.steps.map(s => s.value).join('.')\n : /* v8 ignore next -- @preserve */ '';\n\nexport const normalizeOperator = (\n opType: DefaultOperatorName,\n flip?: boolean\n): DefaultOperatorName => {\n if (flip) {\n if (opType === '<') return '>';\n if (opType === '<=') return '>=';\n if (opType === '>') return '<';\n if (opType === '>=') return '<=';\n }\n return opType;\n};\n\nexport const negatedLikeOperators: Record<\n Extract<DefaultOperatorName, 'beginsWith' | 'contains' | 'endsWith'>,\n DefaultOperatorName\n> = {\n contains: 'doesNotContain',\n beginsWith: 'doesNotBeginWith',\n endsWith: 'doesNotEndWith',\n} satisfies Record<\n Extract<DefaultOperatorName, 'beginsWith' | 'contains' | 'endsWith'>,\n DefaultOperatorName\n>;\n\nexport const generateFlatAndOrList = (\n expr: JSONataExprNode\n): (DefaultCombinatorName | JSONataExprNode)[] => {\n // v8 ignore else\n if (isJSONataAnd(expr) || isJSONataOr(expr)) {\n const { lhs, rhs, value: combinator } = expr;\n if (isJSONataAnd(lhs) || isJSONataOr(lhs)) {\n return [...generateFlatAndOrList(lhs), combinator, rhs];\n }\n return [lhs, combinator, rhs];\n }\n // v8 ignore next\n return [];\n};\n\nexport const generateMixedAndOrList = (\n expr: JSONataAnd | JSONataOr\n): (JSONataExprNode | DefaultCombinatorName | (JSONataExprNode | 'and')[])[] => {\n const arr = generateFlatAndOrList(expr);\n const returnArray: (DefaultCombinatorName | JSONataExprNode | ('and' | JSONataExprNode)[])[] = [];\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' | JSONataExprNode)[];\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 jsonata from 'jsonata';\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 { isRuleGroup } from '../isRuleGroup';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type { JSONataExprNode } from './types';\nimport {\n generateFlatAndOrList,\n generateMixedAndOrList,\n getFieldFromPath,\n getValidValue,\n isJSONataAnd,\n isJSONataBlock,\n isJSONataComparison,\n isJSONataContains,\n isJSONataIdentifier,\n isJSONataIdentifierList,\n isJSONataIn,\n isJSONataNot,\n isJSONataOr,\n isJSONataRegex,\n isJSONataString,\n isJSONataValidValue,\n negatedLikeOperators,\n normalizeOperator,\n} from './utils';\n\n/**\n * Options object for {@link parseJSONata}.\n *\n * Note: `listsAsArrays` is ignored by `parseJSONata`; lists are _always_ arrays.\n */\nexport interface ParseJSONataOptions extends ParserCommonOptions {}\n\n/**\n * Converts a JSONata 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 parseJSONata(jsonataInput: string): DefaultRuleGroupType;\n/**\n * Converts a JSONata 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 parseJSONata(\n jsonataInput: string,\n options: Except<ParseJSONataOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JSONata 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 parseJSONata(\n jsonataInput: string,\n options: Except<ParseJSONataOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJSONata(\n jsonataInput: string,\n options: ParseJSONataOptions = {}\n): DefaultRuleGroupTypeAny {\n const { fields, independentCombinators, listsAsArrays: _laa } = 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 parseJSONataAST = (\n expr: JSONataExprNode,\n processOpts: {\n groupOnlyIfNecessary?: boolean;\n forwardNegation?: boolean;\n } = {}\n ): DefaultRuleType | DefaultRuleGroupTypeAny | null => {\n const { forwardNegation: _forwardedNegation, groupOnlyIfNecessary: _g } = processOpts;\n if (isJSONataBlock(expr)) {\n if (\n isJSONataAnd(expr.expressions[0]) ||\n isJSONataOr(expr.expressions[0]) ||\n isJSONataBlock(expr.expressions[0])\n ) {\n return parseJSONataAST(expr.expressions[0]);\n }\n const blockOfExpr = parseJSONataAST(expr.expressions[0]);\n // v8 ignore else\n if (blockOfExpr) {\n return ic\n ? ({ rules: [blockOfExpr] } as DefaultRuleGroupTypeIC)\n : ({\n combinator: 'and',\n rules: [blockOfExpr],\n } as DefaultRuleGroupType);\n }\n } else if (isJSONataAnd(expr) || isJSONataOr(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 parseJSONataAST(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\n // Reduce this group to a single between/notBetween rule if possible\n if (\n ((rs: unknown[]): rs is [DefaultRuleType, DefaultCombinatorName, DefaultRuleType] =>\n rs.length === 3 &&\n (rs[1] === 'and' || rs[1] === 'or') &&\n !isRuleGroup(rs[0]) &&\n !isRuleGroup(rs[2]))(rules) &&\n rules[0].field === rules[2].field &&\n (rules[0].valueSource ?? 'value') === (rules[2].valueSource ?? 'value') &&\n ((rules[1] === 'and' &&\n ((rules[0].operator === '>=' && rules[2].operator === '<=') ||\n (rules[0].operator === '<=' && rules[2].operator === '>='))) ||\n (rules[1] === 'or' &&\n ((rules[0].operator === '>' && rules[2].operator === '<') ||\n (rules[0].operator === '<' && rules[2].operator === '>'))))\n ) {\n return {\n field: rules[0].field,\n operator: rules[1] === 'and' ? 'between' : 'notBetween',\n value:\n (rules[1] === 'and' && rules[0].operator === '<=') ||\n (rules[1] === 'or' && rules[0].operator === '>')\n ? [rules[2].value, rules[0].value]\n : [rules[0].value, rules[2].value],\n ...(rules[0].valueSource ? { valueSource: rules[0].valueSource } : null),\n };\n }\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 (JSONataExprNode | JSONataExprNode[])[];\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 => parseJSONataAST(e)).filter(Boolean) as DefaultRuleGroupArray,\n };\n }\n return parseJSONataAST(exp) as DefaultRuleType | DefaultRuleGroupType | null;\n })\n .filter(Boolean) as DefaultRuleGroupArray;\n\n // Reduce this group to a single between/notBetween rule if possible\n if (\n ((rs: unknown[]): rs is [DefaultRuleType, DefaultRuleType] =>\n rs.length === 2 && !isRuleGroup(rs[0]) && !isRuleGroup(rs[1]))(rules) &&\n rules[0].field === rules[1].field &&\n (rules[0].valueSource ?? 'value') === (rules[1].valueSource ?? 'value') &&\n ((combinator === 'and' &&\n ((rules[0].operator === '>=' && rules[1].operator === '<=') ||\n (rules[0].operator === '<=' && rules[1].operator === '>='))) ||\n (combinator === 'or' &&\n ((rules[0].operator === '>' && rules[1].operator === '<') ||\n (rules[0].operator === '<' && rules[1].operator === '>'))))\n ) {\n return {\n field: rules[0].field,\n operator: combinator === 'and' ? 'between' : 'notBetween',\n value:\n (combinator === 'and' && rules[0].operator === '<=') ||\n (combinator === 'or' && rules[0].operator === '>')\n ? [rules[1].value, rules[0].value]\n : [rules[0].value, rules[1].value],\n ...(rules[0].valueSource ? { valueSource: rules[0].valueSource } : null),\n };\n }\n\n // v8 ignore else\n if (rules.length > 0) {\n return { combinator, rules };\n }\n } else if (isJSONataNot(expr)) {\n const negatedExpr = parseJSONataAST(expr.arguments[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: negatedLikeOperators[negatedExpr.operator],\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 (isJSONataContains(expr)) {\n const [arg1, arg2] = expr.arguments;\n let field: string = '';\n let regex: string | RegExp = '';\n let valueSource: ValueSource | undefined = undefined;\n // v8 ignore else\n if (isJSONataIdentifier(arg1)) {\n field = getFieldFromPath(arg1);\n if (isJSONataIdentifier(arg2)) {\n regex = getFieldFromPath(arg2);\n valueSource = 'field';\n } else {\n // v8 ignore else\n if (isJSONataString(arg2) || isJSONataRegex(arg2)) {\n regex = getValidValue(arg2);\n }\n }\n }\n\n // v8 ignore else\n if (\n valueSource === 'field'\n ? fieldIsValid(field, 'contains', regex as string)\n : fieldIsValid(field, 'contains')\n ) {\n return {\n field,\n operator: 'contains',\n value: regex,\n ...(valueSource ? { valueSource } : {}),\n };\n }\n } else if (isJSONataIn(expr)) {\n const field = getFieldFromPath(expr.lhs);\n let valueSource: ValueSource | undefined = undefined;\n if (isJSONataIdentifierList(expr.rhs)) {\n valueSource = 'field';\n }\n if (isJSONataValidValue(expr.rhs)) {\n // oxlint-disable-next-line typescript/no-explicit-any\n const value: any[] = getValidValue(expr.rhs);\n // v8 ignore else\n if (\n field &&\n value.every(v => fieldIsValid(field, 'in', valueSource === 'field' ? v : undefined))\n ) {\n return { field, operator: 'in', value, ...(valueSource ? { valueSource } : {}) };\n }\n }\n } else if (isJSONataComparison(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 { lhs, rhs } = expr;\n\n if (isJSONataIdentifier(lhs) && isJSONataValidValue(rhs)) {\n field = getFieldFromPath(lhs);\n value = getValidValue(rhs);\n if (isJSONataIdentifier(rhs)) {\n valueSource = 'field';\n }\n } else {\n // v8 ignore else\n if (isJSONataIdentifier(rhs) && isJSONataValidValue(lhs)) {\n flip = true;\n field = getFieldFromPath(rhs);\n value = getValidValue(lhs);\n }\n }\n let operator = normalizeOperator(expr.value, 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 jsonataExpr: jsonata.Expression;\n try {\n jsonataExpr = jsonata(jsonataInput);\n } catch {\n return prepare(emptyQuery);\n }\n const jsonataAST = jsonataExpr.ast() as JSONataExprNode;\n\n const result = parseJSONataAST(jsonataAST);\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 { parseJSONata };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAa,qBAAqB,SAAuC;CACvE,OAAO,QAAQ,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS;AAClE;AACA,MAAM,uBAAuB,SAC3B,kBAAkB,IAAI,KAAK,KAAK,SAAS;AAG3C,MAAa,iBAAiB,SAC5B,kBAAkB,IAAI,KACtB,KAAK,SAAS,UACd,MAAM,QAAQ,KAAK,KAAK,KACxB,KAAK,MAAM,SAAS,KACpB,kBAAkB,KAAK,MAAM,EAAE;AACjC,MAAa,iBAAiB,SAC5B,kBAAkB,IAAI,KACtB,KAAK,SAAS,UACd,OAAO,KAAK,UAAU,YACtB,KAAK,MAAM,SAAS;AACtB,MAAa,uBAAuB,SAClC,cAAc,IAAI,KAAK,KAAK,MAAM,OAAM,MAAK,cAAc,CAAC,CAAC;AAG/D,MAAa,kBAAkB,SAC7B,kBAAkB,IAAI,KACtB,KAAK,SAAS,WACd,MAAM,QAAQ,KAAK,WAAW,KAC9B,KAAK,YAAY,SAAS,KAC1B,kBAAkB,KAAK,YAAY,EAAE;AAGvC,MAAa,mBAAmB,SAC9B,kBAAkB,IAAI,KAAK,KAAK,SAAS,YAAY,OAAO,KAAK,UAAU;AAC7E,MAAa,mBAAmB,SAC9B,kBAAkB,IAAI,KAAK,KAAK,SAAS,YAAY,OAAO,KAAK,UAAU;AAC7E,MAAa,oBAAoB,SAC/B,kBAAkB,IAAI,KAAK,KAAK,SAAS,WAAW,OAAO,KAAK,UAAU;AAC5E,MAAa,iBAAiB,SAC5B,kBAAkB,IAAI,KAAK,KAAK,SAAS,WAAW,KAAK,UAAU;AACrE,MAAa,kBAAkB,SAC7B,kBAAkB,IAAI,KAAK,KAAK,SAAS,WAAW,KAAK,iBAAiB;AAG5E,MAAa,gBAAgB,SAC3B,oBAAoB,IAAI,KAAK,KAAK,UAAU;AAC9C,MAAa,eAAe,SAC1B,oBAAoB,IAAI,KAAK,KAAK,UAAU;AAG9C,MAAa,kBAAkB,SAC7B,oBAAoB,IAAI,KAAK,KAAK,UAAU;AAC9C,MAAa,qBAAqB,SAChC,oBAAoB,IAAI,KAAK,KAAK,UAAU;AAC9C,MAAa,wBAAwB,SACnC,oBAAoB,IAAI,KAAK,KAAK,UAAU;AAC9C,MAAa,+BAA+B,SAC1C,oBAAoB,IAAI,KAAK,KAAK,UAAU;AAC9C,MAAa,qBAAqB,SAChC,oBAAoB,IAAI,KAAK,KAAK,UAAU;AAC9C,MAAa,4BAA4B,SACvC,oBAAoB,IAAI,KAAK,KAAK,UAAU;AAC9C,MAAa,eAAe,SAC1B,oBAAoB,IAAI,KACxB,KAAK,UAAU,QACf,cAAc,KAAK,GAAG,KACtB,cAAc,KAAK,GAAG;AAGxB,MAAa,gBAAgB,SAC3B,kBAAkB,IAAI,KACtB,KAAK,SAAS,cACd,KAAK,UAAU,OACf,MAAM,QAAQ,KAAK,SAAS,KAC5B,kBAAkB,KAAK,UAAU,EAAE,KACnC,kBAAkB,KAAK,SAAS,KAChC,KAAK,UAAU,UAAU,SACzB,KAAK,UAAU,SAAS;AAC1B,MAAa,qBAAqB,SAChC,kBAAkB,IAAI,KACtB,KAAK,SAAS,cACd,KAAK,UAAU,OACf,MAAM,QAAQ,KAAK,SAAS,KAC5B,KAAK,UAAU,UAAU,KACzB,kBAAkB,KAAK,UAAU,EAAE,KACnC,kBAAkB,KAAK,SAAS,KAChC,KAAK,UAAU,UAAU,cACzB,KAAK,UAAU,SAAS;AAC1B,MAAa,qBAAqB,SAChC,kBAAkB,IAAI,KACtB,KAAK,SAAS,cACd,KAAK,UAAU,OACf,MAAM,QAAQ,KAAK,SAAS,KAC5B,KAAK,UAAU,SAAS,KACxB,gBAAgB,KAAK,UAAU,EAAE,KACjC,kBAAkB,KAAK,SAAS,KAChC,KAAK,UAAU,UAAU,cACzB,KAAK,UAAU,SAAS;AAG1B,MAAa,iBAAiB,SAC5B,kBAAkB,IAAI,KACtB,KAAK,SAAS,WACd,KAAK,UAAU,OACf,MAAM,QAAQ,KAAK,WAAW;AAChC,MAAa,sBAAsB,SAAuB;CACxD,OACE,gBAAgB,IAAI,KACpB,gBAAgB,IAAI,KACpB,iBAAiB,IAAI,KACrB,cAAc,IAAI,KAClB,kBAAkB,IAAI;AAE1B;AACA,MAAa,0BAA0B,SACrC,cAAc,IAAI,KAAK,KAAK,YAAY,OAAM,MAAK,mBAAmB,CAAC,CAAC;AAC1E,MAAa,2BAA2B,SACtC,cAAc,IAAI,KAAK,KAAK,YAAY,OAAM,MAAK,oBAAoB,CAAC,CAAC;AAC3E,MAAa,uBAAuB,SAClC,mBAAmB,IAAI,KACvB,eAAe,IAAI,KACnB,oBAAoB,IAAI,KACxB,uBAAuB,IAAI,KAC3B,wBAAwB,IAAI,KAC5B,kBAAkB,IAAI;AACxB,MAAa,uBACX,SAQA,eAAe,IAAI,KACnB,kBAAkB,IAAI,KACtB,qBAAqB,IAAI,KACzB,4BAA4B,IAAI,KAChC,kBAAkB,IAAI,KACtB,yBAAyB,IAAI;AAE/B,MAAa,iBAAiB,SAAmB;CAC/C,IAAI,kBAAkB,IAAI,GACxB,OAAO,cAAc,KAAK,UAAU,EAAE;MACjC,IAAI,oBAAoB,IAAI,GACjC,OAAO,iBAAiB,IAAI;MACvB,IAAI,uBAAuB,IAAI,GACpC,OAAO,KAAK,YAAY,KAAK,MAAW,cAAc,CAAC,CAAC;MACnD,IAAI,wBAAwB,IAAI,GACrC,OAAO,KAAK,YAAY,KAAK,MAAW,iBAAiB,CAAC,CAAC;CAE7D,OAAO,KAAK;AACd;AAEA,MAAa,oBAAoB,SAC/B,oBAAoB,IAAI,IACpB,KAAK,MAAM,KAAI,MAAK,EAAE,KAAK,CAAC,CAAC,KAAK,GAAG,sCACH;AAExC,MAAa,qBACX,QACA,SACwB;CACxB,IAAI,MAAM;EACR,IAAI,WAAW,KAAK,OAAO;EAC3B,IAAI,WAAW,MAAM,OAAO;EAC5B,IAAI,WAAW,KAAK,OAAO;EAC3B,IAAI,WAAW,MAAM,OAAO;CAC9B;CACA,OAAO;AACT;AAEA,MAAa,uBAGT;CACF,UAAU;CACV,YAAY;CACZ,UAAU;AACZ;AAKA,MAAa,yBACX,SACgD;;CAEhD,IAAI,aAAa,IAAI,KAAK,YAAY,IAAI,GAAG;EAC3C,MAAM,EAAE,KAAK,KAAK,OAAO,eAAe;EACxC,IAAI,aAAa,GAAG,KAAK,YAAY,GAAG,GACtC,OAAO;GAAC,GAAG,sBAAsB,GAAG;GAAG;GAAY;EAAG;EAExD,OAAO;GAAC;GAAK;GAAY;EAAG;CAC9B;;CAEA,OAAO,CAAC;AACV;AAEA,MAAa,0BACX,SAC8E;CAC9E,MAAM,MAAM,sBAAsB,IAAI;CACtC,MAAM,cAAyF,CAAC;CAChG,IAAI,aAAa;CACjB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GACnC,IAAI,IAAI,IAAI,OAAO,OAAO;EACxB,aAAa;EACb,IAAI,IAAI;EACR,OAAO,IAAI,aAAa,OAAO,OAAO;GACpC,KAAK;GACL,KAAK;EACP;EACA,MAAM,eAAe,IAAI,MAAM,YAAY,IAAI,CAAC;EAChD,YAAY,KAAK,YAAY;EAC7B,KAAK;CACP,OAAO,IAAI,IAAI,IAAI,OAAO,MACxB,IAAI,MAAM,KAAK,MAAM,IAAI,SAAS,GAAG;EACnC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAC5B,YAAY,KAAK,IAAI,EAAE;EAEzB,YAAY,KAAK,IAAI,IAAI,EAAE;EAC3B,IAAI,MAAM,IAAI,SAAS,GACrB,YAAY,KAAK,IAAI,IAAI,EAAE;CAE/B,OACE,IAAI,IAAI,IAAI,OAAO,OACjB,YAAY,KAAK,IAAI,IAAI,EAAE;MAE3B,YAAY,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE;CAK3C,IAAI,YAAY,WAAW,KAAK,MAAM,QAAQ,YAAY,EAAE,GAE1D,OAAO,YAAY;CAErB,OAAO;AACT;;;AClMA,SAAS,aACP,cACA,UAA+B,CAAC,GACP;CACzB,MAAM,EAAE,QAAQ,wBAAwB,eAAe,SAAS;CAChE,MAAM,KAAK,CAAC,CAAC;CACb,MAAM,aAAaA,4BAAAA,eAAe,MAAM;CAExC,MAAM,gBACJ,WACA,UACA,yBAEAC,4BAAAA,iBAAiB;EACf;EACA;EACA;EACA;EACA,iBAAiB,SAAS;CAC5B,CAAC;CAEH,MAAM,aAAsC;EAC1C,OAAO,CAAC;EACR,GAAI,KAAK,CAAC,IAAI,EAAE,YAAY,MAAM;CACpC;CAEA,MAAM,mBACJ,MACA,cAGI,CAAC,MACgD;EACrD,MAAM,EAAE,iBAAiB,oBAAoB,sBAAsB,OAAO;EAC1E,IAAI,eAAe,IAAI,GAAG;GACxB,IACE,aAAa,KAAK,YAAY,EAAE,KAChC,YAAY,KAAK,YAAY,EAAE,KAC/B,eAAe,KAAK,YAAY,EAAE,GAElC,OAAO,gBAAgB,KAAK,YAAY,EAAE;GAE5C,MAAM,cAAc,gBAAgB,KAAK,YAAY,EAAE;;GAEvD,IAAI,aACF,OAAO,KACF,EAAE,OAAO,CAAC,WAAW,EAAE,IACvB;IACC,YAAY;IACZ,OAAO,CAAC,WAAW;GACrB;EAER,OAAO,IAAI,aAAa,IAAI,KAAK,YAAY,IAAI,GAAG;GAClD,IAAI,IAAI;IAEN,MAAM,QADY,sBAAsB,IAClB,CAAC,CAAC,KAAI,MAAK;KAC/B,IAAI,OAAO,MAAM,UACf,OAAO;KAET,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAGD,IAAI,CAAC,MAAM,MAAM,OAAO,GACtB,OAAO;IAIT,MACI,OACA,GAAG,WAAW,MACb,GAAG,OAAO,SAAS,GAAG,OAAO,SAC9B,CAACC,oBAAAA,YAAY,GAAG,EAAE,KAClB,CAACA,oBAAAA,YAAY,GAAG,EAAE,EAAA,CAAG,KAAK,KAC5B,MAAM,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC,UAC3B,MAAM,EAAE,CAAC,eAAe,cAAc,MAAM,EAAE,CAAC,eAAe,aAC7D,MAAM,OAAO,UACX,MAAM,EAAE,CAAC,aAAa,QAAQ,MAAM,EAAE,CAAC,aAAa,QACnD,MAAM,EAAE,CAAC,aAAa,QAAQ,MAAM,EAAE,CAAC,aAAa,SACtD,MAAM,OAAO,SACV,MAAM,EAAE,CAAC,aAAa,OAAO,MAAM,EAAE,CAAC,aAAa,OAClD,MAAM,EAAE,CAAC,aAAa,OAAO,MAAM,EAAE,CAAC,aAAa,OAE1D,OAAO;KACL,OAAO,MAAM,EAAE,CAAC;KAChB,UAAU,MAAM,OAAO,QAAQ,YAAY;KAC3C,OACG,MAAM,OAAO,SAAS,MAAM,EAAE,CAAC,aAAa,QAC5C,MAAM,OAAO,QAAQ,MAAM,EAAE,CAAC,aAAa,MACxC,CAAC,MAAM,EAAE,CAAC,OAAO,MAAM,EAAE,CAAC,KAAK,IAC/B,CAAC,MAAM,EAAE,CAAC,OAAO,MAAM,EAAE,CAAC,KAAK;KACrC,GAAI,MAAM,EAAE,CAAC,cAAc,EAAE,aAAa,MAAM,EAAE,CAAC,YAAY,IAAI;IACrE;IAGF,OAAO,EACE,MACT;GACF;GACA,MAAM,YAAY,uBAAuB,IAAI;GAC7C,MAAM,aAAa,UAAU;GAM7B,MAAM,QALe,UAClB,QAAO,MAAK,MAAM,QAAQ,CAAC,KAAM,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,UAAU,CAAE,CAAC,CAC9E,KAAI,MACH,MAAM,QAAQ,CAAC,IAAI,EAAE,QAAO,OAAM,CAAC,CAAC,KAAK,OAAO,OAAO,YAAY,UAAU,EAAE,IAAI,CAE9D,CAAC,CACvB,KAAK,QAAuD;IAC3D,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO;KACL,YAAY;KACZ,OAAO,IAAI,KAAI,MAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,OAAO;IACxD;IAEF,OAAO,gBAAgB,GAAG;GAC5B,CAAC,CAAC,CACD,OAAO,OAAO;GAGjB,MACI,OACA,GAAG,WAAW,KAAK,CAACA,oBAAAA,YAAY,GAAG,EAAE,KAAK,CAACA,oBAAAA,YAAY,GAAG,EAAE,EAAA,CAAG,KAAK,KACtE,MAAM,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC,UAC3B,MAAM,EAAE,CAAC,eAAe,cAAc,MAAM,EAAE,CAAC,eAAe,aAC7D,eAAe,UACb,MAAM,EAAE,CAAC,aAAa,QAAQ,MAAM,EAAE,CAAC,aAAa,QACnD,MAAM,EAAE,CAAC,aAAa,QAAQ,MAAM,EAAE,CAAC,aAAa,SACtD,eAAe,SACZ,MAAM,EAAE,CAAC,aAAa,OAAO,MAAM,EAAE,CAAC,aAAa,OAClD,MAAM,EAAE,CAAC,aAAa,OAAO,MAAM,EAAE,CAAC,aAAa,OAE1D,OAAO;IACL,OAAO,MAAM,EAAE,CAAC;IAChB,UAAU,eAAe,QAAQ,YAAY;IAC7C,OACG,eAAe,SAAS,MAAM,EAAE,CAAC,aAAa,QAC9C,eAAe,QAAQ,MAAM,EAAE,CAAC,aAAa,MAC1C,CAAC,MAAM,EAAE,CAAC,OAAO,MAAM,EAAE,CAAC,KAAK,IAC/B,CAAC,MAAM,EAAE,CAAC,OAAO,MAAM,EAAE,CAAC,KAAK;IACrC,GAAI,MAAM,EAAE,CAAC,cAAc,EAAE,aAAa,MAAM,EAAE,CAAC,YAAY,IAAI;GACrE;;GAIF,IAAI,MAAM,SAAS,GACjB,OAAO;IAAE;IAAY;GAAM;EAE/B,OAAO,IAAI,aAAa,IAAI,GAAG;GAC7B,MAAM,cAAc,gBAAgB,KAAK,UAAU,EAAE;;GAErD,IAAI,aAAa;IACf,IACE,CAACA,oBAAAA,YAAY,WAAW,MACvB,YAAY,aAAa,cACxB,YAAY,aAAa,gBACzB,YAAY,aAAa,aAE3B,OAAO;KACL,GAAG;KACH,UAAU,qBAAqB,YAAY;IAC7C;IAEF,OAAO,KACF;KAAE,OAAO,CAAC,WAAW;KAAG,KAAK;IAAK,IAClC;KACC,YAAY;KACZ,OAAO,CAAC,WAAW;KACnB,KAAK;IACP;GACN;EACF,OAAO,IAAI,kBAAkB,IAAI,GAAG;GAClC,MAAM,CAAC,MAAM,QAAQ,KAAK;GAC1B,IAAI,QAAgB;GACpB,IAAI,QAAyB;GAC7B,IAAI,cAAuC,KAAA;;GAE3C,IAAI,oBAAoB,IAAI,GAAG;IAC7B,QAAQ,iBAAiB,IAAI;IAC7B,IAAI,oBAAoB,IAAI,GAAG;KAC7B,QAAQ,iBAAiB,IAAI;KAC7B,cAAc;IAChB,OAEE,IAAI,gBAAgB,IAAI,KAAK,eAAe,IAAI,GAC9C,QAAQ,cAAc,IAAI;GAGhC;;GAGA,IACE,gBAAgB,UACZ,aAAa,OAAO,YAAY,KAAe,IAC/C,aAAa,OAAO,UAAU,GAElC,OAAO;IACL;IACA,UAAU;IACV,OAAO;IACP,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;GACvC;EAEJ,OAAO,IAAI,YAAY,IAAI,GAAG;GAC5B,MAAM,QAAQ,iBAAiB,KAAK,GAAG;GACvC,IAAI,cAAuC,KAAA;GAC3C,IAAI,wBAAwB,KAAK,GAAG,GAClC,cAAc;GAEhB,IAAI,oBAAoB,KAAK,GAAG,GAAG;IAEjC,MAAM,QAAe,cAAc,KAAK,GAAG;;IAE3C,IACE,SACA,MAAM,OAAM,MAAK,aAAa,OAAO,MAAM,gBAAgB,UAAU,IAAI,KAAA,CAAS,CAAC,GAEnF,OAAO;KAAE;KAAO,UAAU;KAAM;KAAO,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;IAAG;GAEnF;EACF,OAAO,IAAI,oBAAoB,IAAI,GAAG;GACpC,IAAI,QAAuB;GAE3B,IAAI,QAAa,KAAA;GACjB,IAAI,cAAuC,KAAA;GAC3C,IAAI,OAAO;GACX,MAAM,EAAE,KAAK,QAAQ;GAErB,IAAI,oBAAoB,GAAG,KAAK,oBAAoB,GAAG,GAAG;IACxD,QAAQ,iBAAiB,GAAG;IAC5B,QAAQ,cAAc,GAAG;IACzB,IAAI,oBAAoB,GAAG,GACzB,cAAc;GAElB,OAEE,IAAI,oBAAoB,GAAG,KAAK,oBAAoB,GAAG,GAAG;IACxD,OAAO;IACP,QAAQ,iBAAiB,GAAG;IAC5B,QAAQ,cAAc,GAAG;GAC3B;GAEF,IAAI,WAAW,kBAAkB,KAAK,OAAO,IAAI;GACjD,IAAI,UAAU,SAAS,aAAa,OAAO,aAAa,OACtD,WAAW,aAAa,MAAM,SAAS;GAEzC,IACE,SACA,aAAa,OAAO,UAAU,gBAAgB,UAAU,QAAQ,KAAA,CAAS,KACzE,UAAU,KAAA,GAEV,OAAO,cAAc;IAAE;IAAO;IAAU;IAAO;GAAY,IAAI;IAAE;IAAO;IAAU;GAAM;EAE5F;EACA,OAAO;CACT;CAEA,MAAM,UAAU,QAAQ,cAAcC,4BAAAA,oBAAuB,MAAS;CAEtE,IAAI;CACJ,IAAI;EACF,eAAA,GAAA,QAAA,QAAA,CAAsB,YAAY;CACpC,QAAQ;EACN,OAAO,QAAQ,UAAU;CAC3B;CAGA,MAAM,SAAS,gBAFI,YAAY,IAES,CAAC;CACzC,IAAI,QAAQ;EACV,IAAID,oBAAAA,YAAY,MAAM,GACpB,OAAO,QAAQ,MAAM;EAEvB,OAAO,QAAQ;GAAE,OAAO,CAAC,MAAM;GAAG,GAAI,KAAK,CAAC,IAAI,EAAE,YAAY,MAAM;EAAG,CAAC;CAC1E;CAEA,OAAO,QAAQ,UAAU;AAC3B"}
1
+ {"version":3,"file":"parseJSONata.js","names":["getFieldsArray","fieldIsValidUtil","isRuleGroup","prepareRuleGroup"],"sources":["../src/utils/parseJSONata/utils.ts","../src/utils/parseJSONata/parseJSONata.ts"],"sourcesContent":["import type { DefaultCombinatorName, DefaultOperatorName } from '../../types';\nimport type {\n JSONataAnd,\n JSONataBinaryNode,\n JSONataBlock,\n JSONataBoolean,\n JSONataContains,\n JSONataEqual,\n JSONataExprNode,\n JSONataGreaterThan,\n JSONataGreaterThanOrEqual,\n JSONataIdentifier,\n JSONataIn,\n JSONataLessThan,\n JSONataLessThanOrEqual,\n JSONataList,\n JSONataName,\n JSONataNot,\n JSONataNotEqual,\n JSONataNull,\n JSONataNumber,\n JSONataOr,\n JSONataPath,\n JSONataRegex,\n JSONataString,\n JSONataToMillis,\n} from './types';\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype Any = any;\n\nexport const isJSONataExprNode = (expr: Any): expr is JSONataExprNode => {\n return expr && typeof expr === 'object' && typeof expr.type === 'string';\n};\nconst isJSONataBinaryNode = (expr: Any): expr is JSONataBinaryNode =>\n isJSONataExprNode(expr) && expr.type === 'binary';\n\n// Identifiers\nexport const isJSONataPath = (expr: Any): expr is JSONataPath =>\n isJSONataExprNode(expr) &&\n expr.type === 'path' &&\n Array.isArray(expr.steps) &&\n expr.steps.length > 0 &&\n isJSONataExprNode(expr.steps[0]);\nexport const isJSONataName = (expr: Any): expr is JSONataName =>\n isJSONataExprNode(expr) &&\n expr.type === 'name' &&\n typeof expr.value === 'string' &&\n expr.value.length > 0;\nexport const isJSONataIdentifier = (expr: Any): expr is JSONataIdentifier =>\n isJSONataPath(expr) && expr.steps.every(v => isJSONataName(v));\n\n// Groups\nexport const isJSONataBlock = (expr: Any): expr is JSONataBlock =>\n isJSONataExprNode(expr) &&\n expr.type === 'block' &&\n Array.isArray(expr.expressions) &&\n expr.expressions.length > 0 &&\n isJSONataExprNode(expr.expressions[0]);\n\n// Values\nexport const isJSONataString = (expr: Any): expr is JSONataString =>\n isJSONataExprNode(expr) && expr.type === 'string' && typeof expr.value === 'string';\nexport const isJSONataNumber = (expr: Any): expr is JSONataNumber =>\n isJSONataExprNode(expr) && expr.type === 'number' && typeof expr.value === 'number';\nexport const isJSONataBoolean = (expr: Any): expr is JSONataBoolean =>\n isJSONataExprNode(expr) && expr.type === 'value' && typeof expr.value === 'boolean';\nexport const isJSONataNull = (expr: Any): expr is JSONataNull =>\n isJSONataExprNode(expr) && expr.type === 'value' && expr.value === null;\nexport const isJSONataRegex = (expr: Any): expr is JSONataRegex =>\n isJSONataExprNode(expr) && expr.type === 'regex' && expr.value instanceof RegExp;\n\n// Combinators\nexport const isJSONataAnd = (expr: Any): expr is JSONataAnd =>\n isJSONataBinaryNode(expr) && expr.value === 'and';\nexport const isJSONataOr = (expr: Any): expr is JSONataOr =>\n isJSONataBinaryNode(expr) && expr.value === 'or';\n\n// Operators\nexport const isJSONataEqual = (expr: Any): expr is JSONataEqual =>\n isJSONataBinaryNode(expr) && expr.value === '=';\nexport const isJSONataNotEqual = (expr: Any): expr is JSONataNotEqual =>\n isJSONataBinaryNode(expr) && expr.value === '!=';\nexport const isJSONataGreaterThan = (expr: Any): expr is JSONataGreaterThan =>\n isJSONataBinaryNode(expr) && expr.value === '>';\nexport const isJSONataGreaterThanOrEqual = (expr: Any): expr is JSONataGreaterThanOrEqual =>\n isJSONataBinaryNode(expr) && expr.value === '>=';\nexport const isJSONataLessThan = (expr: Any): expr is JSONataLessThan =>\n isJSONataBinaryNode(expr) && expr.value === '<';\nexport const isJSONataLessThanOrEqual = (expr: Any): expr is JSONataLessThanOrEqual =>\n isJSONataBinaryNode(expr) && expr.value === '<=';\nexport const isJSONataIn = (expr: Any): expr is JSONataIn =>\n isJSONataBinaryNode(expr) &&\n expr.value === 'in' &&\n isJSONataPath(expr.lhs) &&\n isJSONataList(expr.rhs);\n\n// Functions\nexport const isJSONataNot = (expr: Any): expr is JSONataNot =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n isJSONataExprNode(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'not' &&\n expr.procedure.type === 'variable';\nexport const isJSONataContains = (expr: Any): expr is JSONataContains =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n expr.arguments.length >= 2 &&\n isJSONataExprNode(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'contains' &&\n expr.procedure.type === 'variable';\nexport const isJSONataToMillis = (expr: Any): expr is JSONataToMillis =>\n isJSONataExprNode(expr) &&\n expr.type === 'function' &&\n expr.value === '(' &&\n Array.isArray(expr.arguments) &&\n expr.arguments.length > 0 &&\n isJSONataString(expr.arguments[0]) &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.value === 'toMillis' &&\n expr.procedure.type === 'variable';\n\n// Miscellaneous\nexport const isJSONataList = (expr: Any): expr is JSONataList =>\n isJSONataExprNode(expr) &&\n expr.type === 'unary' &&\n expr.value === '[' &&\n Array.isArray(expr.expressions);\nexport const isJSONataPrimitive = (expr: Any): boolean => {\n return (\n isJSONataString(expr) ||\n isJSONataNumber(expr) ||\n isJSONataBoolean(expr) ||\n isJSONataNull(expr) ||\n isJSONataToMillis(expr)\n );\n};\nexport const isJSONataPrimitiveList = (expr: Any): boolean =>\n isJSONataList(expr) && expr.expressions.every(v => isJSONataPrimitive(v));\nexport const isJSONataIdentifierList = (expr: Any): boolean =>\n isJSONataList(expr) && expr.expressions.every(v => isJSONataIdentifier(v));\nexport const isJSONataValidValue = (expr: Any): boolean =>\n isJSONataPrimitive(expr) ||\n isJSONataRegex(expr) ||\n isJSONataIdentifier(expr) ||\n isJSONataPrimitiveList(expr) ||\n isJSONataIdentifierList(expr) ||\n isJSONataToMillis(expr);\nexport const isJSONataComparison = (\n expr: Any\n): expr is\n | JSONataEqual\n | JSONataNotEqual\n | JSONataGreaterThan\n | JSONataGreaterThanOrEqual\n | JSONataLessThan\n | JSONataLessThanOrEqual =>\n isJSONataEqual(expr) ||\n isJSONataNotEqual(expr) ||\n isJSONataGreaterThan(expr) ||\n isJSONataGreaterThanOrEqual(expr) ||\n isJSONataLessThan(expr) ||\n isJSONataLessThanOrEqual(expr);\n\n// Arithmetic infix operators eligible as expression operands\nconst jsonataArithmeticOperators = new Set(['+', '-', '*', '/', '%']);\n\n/**\n * A JSONata comparison operand that is a candidate expression subtree: an arithmetic infix node\n * (`+ - * / %`) or a function-call node (excluding the `not`/`contains` predicates handled\n * elsewhere). The expr-supplied `getExpression` handler decides whether it maps to a known\n * function.\n */\nexport const isJSONataExpressionOperand = (expr: Any): expr is JSONataExprNode => {\n if (!isJSONataExprNode(expr)) return false;\n // Unwrap parenthesized single-expression blocks (e.g. `(cost * 2)`)\n if (isJSONataBlock(expr) && expr.expressions.length === 1)\n return isJSONataExpressionOperand(expr.expressions[0]);\n if (isJSONataBinaryNode(expr) && jsonataArithmeticOperators.has(expr.value)) return true;\n return (\n expr.type === 'function' &&\n expr.value === '(' &&\n isJSONataExprNode(expr.procedure) &&\n expr.procedure.type === 'variable' &&\n typeof expr.procedure.value === 'string' &&\n expr.procedure.value !== 'not' &&\n expr.procedure.value !== 'contains'\n );\n};\n\nexport const getValidValue = (expr: Any): Any => {\n if (isJSONataToMillis(expr)) {\n return getValidValue(expr.arguments[0]);\n } else if (isJSONataIdentifier(expr)) {\n return getFieldFromPath(expr);\n } else if (isJSONataPrimitiveList(expr)) {\n return expr.expressions.map((v: Any) => getValidValue(v));\n } else if (isJSONataIdentifierList(expr)) {\n return expr.expressions.map((v: Any) => getFieldFromPath(v));\n }\n return expr.value;\n};\n\nexport const getFieldFromPath = (path: JSONataPath): string =>\n isJSONataIdentifier(path)\n ? path.steps.map(s => s.value).join('.')\n : /* v8 ignore next -- @preserve */ '';\n\nexport const normalizeOperator = (\n opType: DefaultOperatorName,\n flip?: boolean\n): DefaultOperatorName => {\n if (flip) {\n if (opType === '<') return '>';\n if (opType === '<=') return '>=';\n if (opType === '>') return '<';\n if (opType === '>=') return '<=';\n }\n return opType;\n};\n\nexport const negatedLikeOperators: Record<\n Extract<DefaultOperatorName, 'beginsWith' | 'contains' | 'endsWith'>,\n DefaultOperatorName\n> = {\n contains: 'doesNotContain',\n beginsWith: 'doesNotBeginWith',\n endsWith: 'doesNotEndWith',\n} satisfies Record<\n Extract<DefaultOperatorName, 'beginsWith' | 'contains' | 'endsWith'>,\n DefaultOperatorName\n>;\n\nexport const generateFlatAndOrList = (\n expr: JSONataExprNode\n): (DefaultCombinatorName | JSONataExprNode)[] => {\n // v8 ignore else\n if (isJSONataAnd(expr) || isJSONataOr(expr)) {\n const { lhs, rhs, value: combinator } = expr;\n if (isJSONataAnd(lhs) || isJSONataOr(lhs)) {\n return [...generateFlatAndOrList(lhs), combinator, rhs];\n }\n return [lhs, combinator, rhs];\n }\n // v8 ignore next\n return [];\n};\n\nexport const generateMixedAndOrList = (\n expr: JSONataAnd | JSONataOr\n): (JSONataExprNode | DefaultCombinatorName | (JSONataExprNode | 'and')[])[] => {\n const arr = generateFlatAndOrList(expr);\n const returnArray: (DefaultCombinatorName | JSONataExprNode | ('and' | JSONataExprNode)[])[] = [];\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' | JSONataExprNode)[];\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 jsonata from 'jsonata';\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 { isRuleGroup } from '../isRuleGroup';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type {\n JSONataExprNode,\n JSONataExpressionOperand,\n ParseJSONataExpressionContext,\n} from './types';\nimport {\n generateFlatAndOrList,\n generateMixedAndOrList,\n getFieldFromPath,\n getValidValue,\n isJSONataAnd,\n isJSONataBlock,\n isJSONataComparison,\n isJSONataContains,\n isJSONataExpressionOperand,\n isJSONataIdentifier,\n isJSONataIdentifierList,\n isJSONataIn,\n isJSONataNot,\n isJSONataOr,\n isJSONataRegex,\n isJSONataString,\n isJSONataValidValue,\n negatedLikeOperators,\n normalizeOperator,\n} from './utils';\n\n/**\n * Options object for {@link parseJSONata}.\n *\n * Note: `listsAsArrays` is ignored by `parseJSONata`; lists are _always_ arrays.\n */\nexport interface ParseJSONataOptions extends ParserCommonOptions {\n /**\n * Handler that converts a JSONata arithmetic/function operand subtree into an\n * {@link ExpressionNode}. Return `null` to reject (the rule is dropped). Supplied by\n * `@react-querybuilder/expr` (`expressionParserJSONata`). When omitted, expression\n * operands are ignored (rule dropped).\n */\n getExpression?: (\n node: JSONataExpressionOperand,\n ctx: ParseJSONataExpressionContext\n ) => ExpressionNode | null;\n}\n\n/**\n * Converts a JSONata 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 parseJSONata(jsonataInput: string): DefaultRuleGroupType;\n/**\n * Converts a JSONata 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 parseJSONata(\n jsonataInput: string,\n options: Except<ParseJSONataOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JSONata 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 parseJSONata(\n jsonataInput: string,\n options: Except<ParseJSONataOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJSONata(\n jsonataInput: string,\n options: ParseJSONataOptions = {}\n): DefaultRuleGroupTypeAny {\n const { fields, independentCombinators, listsAsArrays: _laa, 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 emptyQuery: DefaultRuleGroupTypeAny = {\n rules: [],\n ...(ic ? {} : { combinator: 'and' }),\n };\n\n const exprCtx: ParseJSONataExpressionContext = {\n fieldExists: fieldName => fieldsFlat.length === 0 || fieldsFlat.some(f => f.name === fieldName),\n };\n\n const parseJSONataAST = (\n expr: JSONataExprNode,\n processOpts: {\n groupOnlyIfNecessary?: boolean;\n forwardNegation?: boolean;\n } = {}\n ): DefaultRuleType | DefaultRuleGroupTypeAny | null => {\n const { forwardNegation: _forwardedNegation, groupOnlyIfNecessary: _g } = processOpts;\n if (isJSONataBlock(expr)) {\n if (\n isJSONataAnd(expr.expressions[0]) ||\n isJSONataOr(expr.expressions[0]) ||\n isJSONataBlock(expr.expressions[0])\n ) {\n return parseJSONataAST(expr.expressions[0]);\n }\n const blockOfExpr = parseJSONataAST(expr.expressions[0]);\n // v8 ignore else\n if (blockOfExpr) {\n return ic\n ? ({ rules: [blockOfExpr] } as DefaultRuleGroupTypeIC)\n : ({\n combinator: 'and',\n rules: [blockOfExpr],\n } as DefaultRuleGroupType);\n }\n } else if (isJSONataAnd(expr) || isJSONataOr(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 parseJSONataAST(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\n // Reduce this group to a single between/notBetween rule if possible\n if (\n ((rs: unknown[]): rs is [DefaultRuleType, DefaultCombinatorName, DefaultRuleType] =>\n rs.length === 3 &&\n (rs[1] === 'and' || rs[1] === 'or') &&\n !isRuleGroup(rs[0]) &&\n !isRuleGroup(rs[2]))(rules) &&\n rules[0].field === rules[2].field &&\n (rules[0].valueSource ?? 'value') === (rules[2].valueSource ?? 'value') &&\n ((rules[1] === 'and' &&\n ((rules[0].operator === '>=' && rules[2].operator === '<=') ||\n (rules[0].operator === '<=' && rules[2].operator === '>='))) ||\n (rules[1] === 'or' &&\n ((rules[0].operator === '>' && rules[2].operator === '<') ||\n (rules[0].operator === '<' && rules[2].operator === '>'))))\n ) {\n return {\n field: rules[0].field,\n operator: rules[1] === 'and' ? 'between' : 'notBetween',\n value:\n (rules[1] === 'and' && rules[0].operator === '<=') ||\n (rules[1] === 'or' && rules[0].operator === '>')\n ? [rules[2].value, rules[0].value]\n : [rules[0].value, rules[2].value],\n ...(rules[0].valueSource ? { valueSource: rules[0].valueSource } : null),\n };\n }\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 (JSONataExprNode | JSONataExprNode[])[];\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 => parseJSONataAST(e)).filter(Boolean) as DefaultRuleGroupArray,\n };\n }\n return parseJSONataAST(exp) as DefaultRuleType | DefaultRuleGroupType | null;\n })\n .filter(Boolean) as DefaultRuleGroupArray;\n\n // Reduce this group to a single between/notBetween rule if possible\n if (\n ((rs: unknown[]): rs is [DefaultRuleType, DefaultRuleType] =>\n rs.length === 2 && !isRuleGroup(rs[0]) && !isRuleGroup(rs[1]))(rules) &&\n rules[0].field === rules[1].field &&\n (rules[0].valueSource ?? 'value') === (rules[1].valueSource ?? 'value') &&\n ((combinator === 'and' &&\n ((rules[0].operator === '>=' && rules[1].operator === '<=') ||\n (rules[0].operator === '<=' && rules[1].operator === '>='))) ||\n (combinator === 'or' &&\n ((rules[0].operator === '>' && rules[1].operator === '<') ||\n (rules[0].operator === '<' && rules[1].operator === '>'))))\n ) {\n return {\n field: rules[0].field,\n operator: combinator === 'and' ? 'between' : 'notBetween',\n value:\n (combinator === 'and' && rules[0].operator === '<=') ||\n (combinator === 'or' && rules[0].operator === '>')\n ? [rules[1].value, rules[0].value]\n : [rules[0].value, rules[1].value],\n ...(rules[0].valueSource ? { valueSource: rules[0].valueSource } : null),\n };\n }\n\n // v8 ignore else\n if (rules.length > 0) {\n return { combinator, rules };\n }\n } else if (isJSONataNot(expr)) {\n const negatedExpr = parseJSONataAST(expr.arguments[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: negatedLikeOperators[negatedExpr.operator],\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 (isJSONataContains(expr)) {\n const [arg1, arg2] = expr.arguments;\n let field: string = '';\n let regex: string | RegExp = '';\n let valueSource: ValueSource | undefined = undefined;\n // v8 ignore else\n if (isJSONataIdentifier(arg1)) {\n field = getFieldFromPath(arg1);\n if (isJSONataIdentifier(arg2)) {\n regex = getFieldFromPath(arg2);\n valueSource = 'field';\n } else {\n // v8 ignore else\n if (isJSONataString(arg2) || isJSONataRegex(arg2)) {\n regex = getValidValue(arg2);\n }\n }\n }\n\n // v8 ignore else\n if (\n valueSource === 'field'\n ? fieldIsValid(field, 'contains', regex as string)\n : fieldIsValid(field, 'contains')\n ) {\n return {\n field,\n operator: 'contains',\n value: regex,\n ...(valueSource ? { valueSource } : {}),\n };\n }\n } else if (isJSONataIn(expr)) {\n const field = getFieldFromPath(expr.lhs);\n let valueSource: ValueSource | undefined = undefined;\n if (isJSONataIdentifierList(expr.rhs)) {\n valueSource = 'field';\n }\n if (isJSONataValidValue(expr.rhs)) {\n // oxlint-disable-next-line typescript/no-explicit-any\n const value: any[] = getValidValue(expr.rhs);\n // v8 ignore else\n if (\n field &&\n value.every(v => fieldIsValid(field, 'in', valueSource === 'field' ? v : undefined))\n ) {\n return { field, operator: 'in', value, ...(valueSource ? { valueSource } : {}) };\n }\n }\n } else if (isJSONataComparison(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 { lhs, rhs } = expr;\n\n // Arithmetic/function expression operands (from `@react-querybuilder/expr`)\n if (getExpression) {\n const lhsIsExpr = isJSONataExpressionOperand(lhs);\n const rhsIsExpr = isJSONataExpressionOperand(rhs);\n if (lhsIsExpr && rhsIsExpr) {\n // expression <op> expression → both sides on lhs/value\n const l = getExpression(lhs, exprCtx);\n const r = getExpression(rhs, exprCtx);\n if (l && r) {\n return {\n field: '',\n operator: normalizeOperator(expr.value),\n lhs: l,\n value: r,\n valueSource: 'expression',\n };\n }\n return null;\n } else if (isJSONataIdentifier(lhs) && rhsIsExpr) {\n // field <op> expression → rhs expression\n const node = getExpression(rhs, exprCtx);\n const f = getFieldFromPath(lhs);\n const op = normalizeOperator(expr.value);\n if (node && fieldIsValid(f, op)) {\n return { field: f, operator: op, value: node, valueSource: 'expression' };\n }\n return null;\n } else if (lhsIsExpr && isJSONataIdentifier(rhs)) {\n // expression <op> field → flip to field <op> expression\n const node = getExpression(lhs, exprCtx);\n const f = getFieldFromPath(rhs);\n const op = normalizeOperator(expr.value, true);\n if (node && fieldIsValid(f, op)) {\n return { field: f, operator: op, value: node, valueSource: 'expression' };\n }\n return null;\n } else if (lhsIsExpr && isJSONataValidValue(rhs)) {\n // expression <op> literal → lhs = expression, literal value\n const l = getExpression(lhs, exprCtx);\n if (l) {\n return {\n field: '',\n operator: normalizeOperator(expr.value),\n lhs: l,\n value: getValidValue(rhs),\n };\n }\n return null;\n } else if (isJSONataValidValue(lhs) && rhsIsExpr) {\n // literal <op> expression → lhs = expression, flip operator\n const l = getExpression(rhs, exprCtx);\n if (l) {\n return {\n field: '',\n operator: normalizeOperator(expr.value, true),\n lhs: l,\n value: getValidValue(lhs),\n };\n }\n return null;\n }\n }\n\n if (isJSONataIdentifier(lhs) && isJSONataValidValue(rhs)) {\n field = getFieldFromPath(lhs);\n value = getValidValue(rhs);\n if (isJSONataIdentifier(rhs)) {\n valueSource = 'field';\n }\n } else {\n // v8 ignore else\n if (isJSONataIdentifier(rhs) && isJSONataValidValue(lhs)) {\n flip = true;\n field = getFieldFromPath(rhs);\n value = getValidValue(lhs);\n }\n }\n let operator = normalizeOperator(expr.value, 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 jsonataExpr: jsonata.Expression;\n try {\n jsonataExpr = jsonata(jsonataInput);\n } catch {\n return prepare(emptyQuery);\n }\n const jsonataAST = jsonataExpr.ast() as JSONataExprNode;\n\n const result = parseJSONataAST(jsonataAST);\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 { parseJSONata };\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { r as isRuleGroup } from "./objectUtils-ZvPkF6u6.mjs";
2
- import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-Cd_tt4oy.mjs";
1
+ import { t as isRuleGroup } from "./isRuleGroup-CqLThsbu.mjs";
2
+ import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-Q18lHCKl.mjs";
3
3
  import jsonata from "jsonata";
4
4
  //#region src/utils/parseJSONata/utils.ts
5
5
  const isJSONataExprNode = (expr) => {
@@ -35,6 +35,25 @@ const isJSONataPrimitiveList = (expr) => isJSONataList(expr) && expr.expressions
35
35
  const isJSONataIdentifierList = (expr) => isJSONataList(expr) && expr.expressions.every((v) => isJSONataIdentifier(v));
36
36
  const isJSONataValidValue = (expr) => isJSONataPrimitive(expr) || isJSONataRegex(expr) || isJSONataIdentifier(expr) || isJSONataPrimitiveList(expr) || isJSONataIdentifierList(expr) || isJSONataToMillis(expr);
37
37
  const isJSONataComparison = (expr) => isJSONataEqual(expr) || isJSONataNotEqual(expr) || isJSONataGreaterThan(expr) || isJSONataGreaterThanOrEqual(expr) || isJSONataLessThan(expr) || isJSONataLessThanOrEqual(expr);
38
+ const jsonataArithmeticOperators = /* @__PURE__ */ new Set([
39
+ "+",
40
+ "-",
41
+ "*",
42
+ "/",
43
+ "%"
44
+ ]);
45
+ /**
46
+ * A JSONata comparison operand that is a candidate expression subtree: an arithmetic infix node
47
+ * (`+ - * / %`) or a function-call node (excluding the `not`/`contains` predicates handled
48
+ * elsewhere). The expr-supplied `getExpression` handler decides whether it maps to a known
49
+ * function.
50
+ */
51
+ const isJSONataExpressionOperand = (expr) => {
52
+ if (!isJSONataExprNode(expr)) return false;
53
+ if (isJSONataBlock(expr) && expr.expressions.length === 1) return isJSONataExpressionOperand(expr.expressions[0]);
54
+ if (isJSONataBinaryNode(expr) && jsonataArithmeticOperators.has(expr.value)) return true;
55
+ return expr.type === "function" && expr.value === "(" && isJSONataExprNode(expr.procedure) && expr.procedure.type === "variable" && typeof expr.procedure.value === "string" && expr.procedure.value !== "not" && expr.procedure.value !== "contains";
56
+ };
38
57
  const getValidValue = (expr) => {
39
58
  if (isJSONataToMillis(expr)) return getValidValue(expr.arguments[0]);
40
59
  else if (isJSONataIdentifier(expr)) return getFieldFromPath(expr);
@@ -101,7 +120,7 @@ const generateMixedAndOrList = (expr) => {
101
120
  //#endregion
102
121
  //#region src/utils/parseJSONata/parseJSONata.ts
103
122
  function parseJSONata(jsonataInput, options = {}) {
104
- const { fields, independentCombinators, listsAsArrays: _laa } = options;
123
+ const { fields, independentCombinators, listsAsArrays: _laa, getExpression } = options;
105
124
  const ic = !!independentCombinators;
106
125
  const fieldsFlat = getFieldsArray(fields);
107
126
  const fieldIsValid = (fieldName, operator, subordinateFieldName) => fieldIsValidUtil({
@@ -115,6 +134,7 @@ function parseJSONata(jsonataInput, options = {}) {
115
134
  rules: [],
116
135
  ...ic ? {} : { combinator: "and" }
117
136
  };
137
+ const exprCtx = { fieldExists: (fieldName) => fieldsFlat.length === 0 || fieldsFlat.some((f) => f.name === fieldName) };
118
138
  const parseJSONataAST = (expr, processOpts = {}) => {
119
139
  const { forwardNegation: _forwardedNegation, groupOnlyIfNecessary: _g } = processOpts;
120
140
  if (isJSONataBlock(expr)) {
@@ -217,6 +237,62 @@ function parseJSONata(jsonataInput, options = {}) {
217
237
  let valueSource = void 0;
218
238
  let flip = false;
219
239
  const { lhs, rhs } = expr;
240
+ if (getExpression) {
241
+ const lhsIsExpr = isJSONataExpressionOperand(lhs);
242
+ const rhsIsExpr = isJSONataExpressionOperand(rhs);
243
+ if (lhsIsExpr && rhsIsExpr) {
244
+ const l = getExpression(lhs, exprCtx);
245
+ const r = getExpression(rhs, exprCtx);
246
+ if (l && r) return {
247
+ field: "",
248
+ operator: normalizeOperator(expr.value),
249
+ lhs: l,
250
+ value: r,
251
+ valueSource: "expression"
252
+ };
253
+ return null;
254
+ } else if (isJSONataIdentifier(lhs) && rhsIsExpr) {
255
+ const node = getExpression(rhs, exprCtx);
256
+ const f = getFieldFromPath(lhs);
257
+ const op = normalizeOperator(expr.value);
258
+ if (node && fieldIsValid(f, op)) return {
259
+ field: f,
260
+ operator: op,
261
+ value: node,
262
+ valueSource: "expression"
263
+ };
264
+ return null;
265
+ } else if (lhsIsExpr && isJSONataIdentifier(rhs)) {
266
+ const node = getExpression(lhs, exprCtx);
267
+ const f = getFieldFromPath(rhs);
268
+ const op = normalizeOperator(expr.value, true);
269
+ if (node && fieldIsValid(f, op)) return {
270
+ field: f,
271
+ operator: op,
272
+ value: node,
273
+ valueSource: "expression"
274
+ };
275
+ return null;
276
+ } else if (lhsIsExpr && isJSONataValidValue(rhs)) {
277
+ const l = getExpression(lhs, exprCtx);
278
+ if (l) return {
279
+ field: "",
280
+ operator: normalizeOperator(expr.value),
281
+ lhs: l,
282
+ value: getValidValue(rhs)
283
+ };
284
+ return null;
285
+ } else if (isJSONataValidValue(lhs) && rhsIsExpr) {
286
+ const l = getExpression(rhs, exprCtx);
287
+ if (l) return {
288
+ field: "",
289
+ operator: normalizeOperator(expr.value, true),
290
+ lhs: l,
291
+ value: getValidValue(lhs)
292
+ };
293
+ return null;
294
+ }
295
+ }
220
296
  if (isJSONataIdentifier(lhs) && isJSONataValidValue(rhs)) {
221
297
  field = getFieldFromPath(lhs);
222
298
  value = getValidValue(rhs);
@@ -259,6 +335,6 @@ function parseJSONata(jsonataInput, options = {}) {
259
335
  return prepare(emptyQuery);
260
336
  }
261
337
  //#endregion
262
- export { parseJSONata };
338
+ export { getFieldFromPath, getValidValue, isJSONataBoolean, isJSONataExpressionOperand, isJSONataIdentifier, isJSONataList, isJSONataNull, isJSONataNumber, isJSONataString, parseJSONata };
263
339
 
264
340
  //# sourceMappingURL=parseJSONata.mjs.map