@react-querybuilder/core 8.9.2 → 8.11.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 (113) hide show
  1. package/dist/{arrayUtils-BF1P8iHS.mjs → arrayUtils-A_OXU9W1.mjs} +3 -75
  2. package/dist/arrayUtils-A_OXU9W1.mjs.map +1 -0
  3. package/dist/arrayUtils-QxZOZTf6.js +73 -0
  4. package/dist/arrayUtils-QxZOZTf6.js.map +1 -0
  5. package/dist/basic-DEc65Kng.d.mts +363 -0
  6. package/dist/basic-Dd_M2f3M.d.ts +363 -0
  7. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +806 -1366
  8. package/dist/cjs/react-querybuilder_core.cjs.development.js +455 -116
  9. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  10. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +806 -1366
  11. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  12. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  13. package/dist/{convertQuery-H7RhQiIc.mjs → convertQuery-CqX3rPvj.mjs} +3 -3
  14. package/dist/{convertQuery-H7RhQiIc.mjs.map → convertQuery-CqX3rPvj.mjs.map} +1 -1
  15. package/dist/{export-DyrnTh6K.d.ts → export-Dy4FckB-.d.ts} +7 -6
  16. package/dist/{export-r-V7bU31.d.mts → export-t1V2N8pz.d.mts} +7 -6
  17. package/dist/formatQuery.d.mts +3 -2
  18. package/dist/formatQuery.d.ts +3 -2
  19. package/dist/formatQuery.js +217 -87
  20. package/dist/formatQuery.js.map +1 -1
  21. package/dist/formatQuery.mjs +217 -87
  22. package/dist/formatQuery.mjs.map +1 -1
  23. package/dist/{import-Cksobmln.d.ts → import-Cz8canKo.d.mts} +3 -3
  24. package/dist/{import-BwbbP4oU.d.mts → import-DtS9Ocx5.d.ts} +3 -3
  25. package/dist/{isRuleGroup-CnhYpLOM.mjs → isRuleGroup-CYcfPgbg.mjs} +2 -2
  26. package/dist/{isRuleGroup-CnhYpLOM.mjs.map → isRuleGroup-CYcfPgbg.mjs.map} +1 -1
  27. package/dist/lexer-C53tqS2p.js +406 -0
  28. package/dist/lexer-C53tqS2p.js.map +1 -0
  29. package/dist/{optGroupUtils-CXLgyg2i.js → optGroupUtils-B0hTpodo.js} +114 -1
  30. package/dist/optGroupUtils-B0hTpodo.js.map +1 -0
  31. package/dist/{optGroupUtils-Duv-M8rf.mjs → optGroupUtils-VeZ3k7-1.mjs} +86 -3
  32. package/dist/optGroupUtils-VeZ3k7-1.mjs.map +1 -0
  33. package/dist/parseCEL.d.mts +292 -11
  34. package/dist/parseCEL.d.ts +292 -11
  35. package/dist/parseCEL.js +874 -1125
  36. package/dist/parseCEL.js.map +1 -1
  37. package/dist/parseCEL.mjs +828 -1126
  38. package/dist/parseCEL.mjs.map +1 -1
  39. package/dist/parseJSONata.d.mts +3 -2
  40. package/dist/parseJSONata.d.ts +3 -2
  41. package/dist/parseJSONata.js +49 -77
  42. package/dist/parseJSONata.js.map +1 -1
  43. package/dist/parseJSONata.mjs +4 -5
  44. package/dist/parseJSONata.mjs.map +1 -1
  45. package/dist/parseJsonLogic.d.mts +4 -3
  46. package/dist/parseJsonLogic.d.ts +4 -3
  47. package/dist/parseJsonLogic.js +5 -6
  48. package/dist/parseJsonLogic.js.map +1 -1
  49. package/dist/parseJsonLogic.mjs +5 -6
  50. package/dist/parseJsonLogic.mjs.map +1 -1
  51. package/dist/parseMongoDB.d.mts +3 -2
  52. package/dist/parseMongoDB.d.ts +3 -2
  53. package/dist/parseMongoDB.js +15 -16
  54. package/dist/parseMongoDB.js.map +1 -1
  55. package/dist/parseMongoDB.mjs +5 -6
  56. package/dist/parseMongoDB.mjs.map +1 -1
  57. package/dist/{parseNumber-BtGKa58z.mjs → parseNumber-CXdMVNFx.mjs} +2 -2
  58. package/dist/{parseNumber-BtGKa58z.mjs.map → parseNumber-CXdMVNFx.mjs.map} +1 -1
  59. package/dist/{parseNumber-Bcys1kOH.js → parseNumber-D4iQDxK-.js} +1 -1
  60. package/dist/{parseNumber-Bcys1kOH.js.map → parseNumber-D4iQDxK-.js.map} +1 -1
  61. package/dist/parseSQL.d.mts +3 -2
  62. package/dist/parseSQL.d.ts +3 -2
  63. package/dist/parseSQL.js +2691 -3036
  64. package/dist/parseSQL.js.map +1 -1
  65. package/dist/parseSQL.mjs +2691 -3037
  66. package/dist/parseSQL.mjs.map +1 -1
  67. package/dist/parseSpEL.d.mts +3 -2
  68. package/dist/parseSpEL.d.ts +3 -2
  69. package/dist/parseSpEL.js +7 -9
  70. package/dist/parseSpEL.js.map +1 -1
  71. package/dist/parseSpEL.mjs +5 -6
  72. package/dist/parseSpEL.mjs.map +1 -1
  73. package/dist/{prepareQueryObjects-BqFEs4eV.js → prepareQueryObjects-BOUWfel5.js} +4 -5
  74. package/dist/prepareQueryObjects-BOUWfel5.js.map +1 -0
  75. package/dist/{prepareQueryObjects-CS6Wmhmf.mjs → prepareQueryObjects-DPCC-iHp.mjs} +6 -7
  76. package/dist/prepareQueryObjects-DPCC-iHp.mjs.map +1 -0
  77. package/dist/query-builder-layout.css +1 -1
  78. package/dist/query-builder-layout.css.map +1 -1
  79. package/dist/query-builder.css +1 -1
  80. package/dist/query-builder.css.map +1 -1
  81. package/dist/react-querybuilder_core.d.mts +806 -1366
  82. package/dist/react-querybuilder_core.legacy-esm.d.ts +806 -1366
  83. package/dist/react-querybuilder_core.legacy-esm.js +455 -114
  84. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  85. package/dist/react-querybuilder_core.mjs +448 -117
  86. package/dist/react-querybuilder_core.mjs.map +1 -1
  87. package/dist/react-querybuilder_core.production.d.mts +806 -1366
  88. package/dist/react-querybuilder_core.production.mjs +1 -1
  89. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  90. package/dist/styles/_layout.scss +61 -17
  91. package/dist/styles/_main.scss +22 -4
  92. package/dist/{transformQuery-FL_nlpp5.js → transformQuery-CWDPogO5.js} +1 -1
  93. package/dist/{transformQuery-FL_nlpp5.js.map → transformQuery-CWDPogO5.js.map} +1 -1
  94. package/dist/{transformQuery-DdMvmrCh.mjs → transformQuery-DCCpjtyq.mjs} +3 -3
  95. package/dist/{transformQuery-DdMvmrCh.mjs.map → transformQuery-DCCpjtyq.mjs.map} +1 -1
  96. package/dist/transformQuery.d.mts +1 -1
  97. package/dist/transformQuery.d.ts +1 -1
  98. package/dist/transformQuery.js +1 -1
  99. package/dist/transformQuery.mjs +2 -2
  100. package/package.json +14 -12
  101. package/dist/arrayUtils-BF1P8iHS.mjs.map +0 -1
  102. package/dist/arrayUtils-D5EoIsKP.js +0 -164
  103. package/dist/arrayUtils-D5EoIsKP.js.map +0 -1
  104. package/dist/basic-BfD-7CN3.d.mts +0 -1235
  105. package/dist/basic-C8xXKHIA.d.ts +0 -1235
  106. package/dist/objectUtils-BBZSfZJz.js +0 -17
  107. package/dist/objectUtils-BBZSfZJz.js.map +0 -1
  108. package/dist/objectUtils-BtWdcZVG.mjs +0 -11
  109. package/dist/objectUtils-BtWdcZVG.mjs.map +0 -1
  110. package/dist/optGroupUtils-CXLgyg2i.js.map +0 -1
  111. package/dist/optGroupUtils-Duv-M8rf.mjs.map +0 -1
  112. package/dist/prepareQueryObjects-BqFEs4eV.js.map +0 -1
  113. package/dist/prepareQueryObjects-CS6Wmhmf.mjs.map +0 -1
@@ -1,9 +1,9 @@
1
- import { defaultPlaceholderFieldName, defaultPlaceholderOperatorName, joinWith, splitBy, toArray, trimIfString } from "./arrayUtils-BF1P8iHS.mjs";
2
- import { isPojo, isRuleGroup, isRuleGroupType, isRuleGroupTypeIC, lc, nullOrUndefinedOrEmpty, numericRegex } from "./isRuleGroup-CnhYpLOM.mjs";
3
- import { parseNumber } from "./parseNumber-BtGKa58z.mjs";
4
- import { transformQuery } from "./transformQuery-DdMvmrCh.mjs";
5
- import { getOption, toFlatOptionArray, toFullOptionList } from "./optGroupUtils-Duv-M8rf.mjs";
6
- import { convertFromIC } from "./convertQuery-H7RhQiIc.mjs";
1
+ import { d as defaultPlaceholderOperatorName, i as toFlatOptionArray, o as toFullOptionList, t as getOption, u as defaultPlaceholderFieldName } from "./optGroupUtils-VeZ3k7-1.mjs";
2
+ import { i as trimIfString, n as splitBy, r as toArray, t as joinWith } from "./arrayUtils-A_OXU9W1.mjs";
3
+ import { a as lc, i as isPojo, n as isRuleGroupType, o as nullOrUndefinedOrEmpty, r as isRuleGroupTypeIC, s as numericRegex, t as isRuleGroup } from "./isRuleGroup-CYcfPgbg.mjs";
4
+ import { t as parseNumber } from "./parseNumber-CXdMVNFx.mjs";
5
+ import { t as transformQuery } from "./transformQuery-DCCpjtyq.mjs";
6
+ import { t as convertFromIC } from "./convertQuery-CqX3rPvj.mjs";
7
7
  import { produce } from "immer";
8
8
 
9
9
  //#region src/utils/isRuleOrGroupValid.ts
@@ -13,9 +13,11 @@ import { produce } from "immer";
13
13
  const isValidationResult = (vr) => isPojo(vr) && typeof vr.valid === "boolean";
14
14
  /**
15
15
  * Determines if a rule or group is valid based on a validation result (if defined)
16
- * or a validator function. Returns `true` if neither are defined.
16
+ * or a validator function. Returns `true` if neither are defined and the `muted`
17
+ * property is not `true`.
17
18
  */
18
19
  const isRuleOrGroupValid = (rg, validationResult, validator) => {
20
+ if (rg.muted) return false;
19
21
  if (typeof validationResult === "boolean") return validationResult;
20
22
  if (isValidationResult(validationResult)) return validationResult.valid;
21
23
  if (typeof validator === "function" && !isRuleGroup(rg)) {
@@ -289,19 +291,45 @@ const defaultRuleGroupProcessorCEL = (ruleGroup, options) => {
289
291
  const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
290
292
  const processRuleGroup = (rg, outermost) => {
291
293
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
292
- const expression = rg.rules.map((rule) => {
293
- if (typeof rule === "string") return celCombinatorMap[rule];
294
- if (isRuleGroup(rule)) return processRuleGroup(rule);
294
+ const processedRules = [];
295
+ let precedingCombinator = "";
296
+ let firstRule = true;
297
+ for (const rule of rg.rules) {
298
+ if (typeof rule === "string") {
299
+ precedingCombinator = celCombinatorMap[rule];
300
+ continue;
301
+ }
302
+ if (isRuleGroup(rule)) {
303
+ const processedGroup = processRuleGroup(rule);
304
+ if (processedGroup) {
305
+ if (!firstRule && precedingCombinator) {
306
+ processedRules.push(precedingCombinator);
307
+ precedingCombinator = "";
308
+ }
309
+ firstRule = false;
310
+ processedRules.push(processedGroup);
311
+ }
312
+ continue;
313
+ }
295
314
  const [validationResult, fieldValidator] = validateRule(rule);
296
- if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return "";
315
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
297
316
  const fieldData = getOption(fields, rule.field);
298
- return ruleProcessor(rule, {
317
+ const processedRule = ruleProcessor(rule, {
299
318
  ...options,
300
319
  parseNumbers: getParseNumberBoolean(fieldData?.inputType),
301
320
  escapeQuotes: (rule.valueSource ?? "value") === "value",
302
321
  fieldData
303
322
  });
304
- }).filter(Boolean).join(isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator]} ` : " ");
323
+ if (processedRule) {
324
+ if (!firstRule && precedingCombinator) {
325
+ processedRules.push(precedingCombinator);
326
+ precedingCombinator = "";
327
+ }
328
+ firstRule = false;
329
+ processedRules.push(processedRule);
330
+ }
331
+ }
332
+ const expression = processedRules.join(isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator]} ` : " ");
305
333
  const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "!" : ""}(`, ")"] : ["", ""];
306
334
  return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
307
335
  };
@@ -328,11 +356,10 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
328
356
  else if (matchEval) {
329
357
  const { mode, threshold } = matchEval;
330
358
  const arrayElementAlias = "elem_alias";
331
- const celQuery = transformQuery(rule.value, { ruleProcessor: (r) => ({
359
+ const nestedArrayFilter = defaultRuleGroupProcessorCEL(transformQuery(rule.value, { ruleProcessor: (r) => ({
332
360
  ...r,
333
361
  field: `${arrayElementAlias}${r.field ? `.${r.field}` : ""}`
334
- }) });
335
- const nestedArrayFilter = defaultRuleGroupProcessorCEL(celQuery, opts);
362
+ }) }), opts);
336
363
  switch (mode) {
337
364
  case "all": return `${field}.all(${arrayElementAlias}, ${nestedArrayFilter})`;
338
365
  case "none":
@@ -366,8 +393,7 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
366
393
  case "in":
367
394
  case "notin": {
368
395
  const [prefix, suffix] = shouldNegate$2(operatorTL) ? ["!(", ")"] : ["", ""];
369
- const valueAsArray = toArray(value);
370
- return `${prefix}${field} in [${valueAsArray.map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
396
+ return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
371
397
  }
372
398
  case "between":
373
399
  case "notbetween": {
@@ -587,19 +613,45 @@ const defaultRuleGroupProcessorSpEL = (ruleGroup, options) => {
587
613
  const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
588
614
  const processRuleGroup = (rg, outermost) => {
589
615
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
590
- const expression = rg.rules.map((rule) => {
591
- if (typeof rule === "string") return rule;
592
- if (isRuleGroup(rule)) return processRuleGroup(rule);
616
+ const processedRules = [];
617
+ let precedingCombinator = "";
618
+ let firstRule = true;
619
+ for (const rule of rg.rules) {
620
+ if (typeof rule === "string") {
621
+ precedingCombinator = rule;
622
+ continue;
623
+ }
624
+ if (isRuleGroup(rule)) {
625
+ const processedGroup = processRuleGroup(rule);
626
+ if (processedGroup) {
627
+ if (!firstRule && precedingCombinator) {
628
+ processedRules.push(precedingCombinator);
629
+ precedingCombinator = "";
630
+ }
631
+ firstRule = false;
632
+ processedRules.push(processedGroup);
633
+ }
634
+ continue;
635
+ }
593
636
  const [validationResult, fieldValidator] = validateRule(rule);
594
- if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return "";
637
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
595
638
  const fieldData = getOption(fields, rule.field);
596
- return ruleProcessor(rule, {
639
+ const processedRule = ruleProcessor(rule, {
597
640
  ...options,
598
641
  parseNumbers: getParseNumberBoolean(fieldData?.inputType),
599
642
  escapeQuotes: (rule.valueSource ?? "value") === "value",
600
643
  fieldData
601
644
  });
602
- }).filter(Boolean).join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : " ");
645
+ if (processedRule) {
646
+ if (!firstRule && precedingCombinator) {
647
+ processedRules.push(precedingCombinator);
648
+ precedingCombinator = "";
649
+ }
650
+ firstRule = false;
651
+ processedRules.push(processedRule);
652
+ }
653
+ }
654
+ const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : " ");
603
655
  const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "!" : ""}(`, ")"] : ["", ""];
604
656
  return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
605
657
  };
@@ -655,15 +707,9 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
655
707
  case "contains":
656
708
  case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
657
709
  case "beginswith":
658
- case "doesnotbeginwith": {
659
- const valueTL = valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes(value, escapeQuotes)}'`;
660
- return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate$1(operatorTL));
661
- }
710
+ case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
662
711
  case "endswith":
663
- case "doesnotendwith": {
664
- const valueTL = valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`;
665
- return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate$1(operatorTL));
666
- }
712
+ case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
667
713
  case "null": return `${field} == null`;
668
714
  case "notnull": return `${field} != null`;
669
715
  case "in":
@@ -776,11 +822,10 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
776
822
  if (opts.preset !== "postgresql") return;
777
823
  const { mode, threshold } = matchEval;
778
824
  const arrayElementAlias = "elem_alias";
779
- const sqlQuery = transformQuery(rule.value, { ruleProcessor: (r) => ({
825
+ const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
780
826
  ...r,
781
827
  field: arrayElementAlias
782
- }) });
783
- const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(sqlQuery, {
828
+ }) }), {
784
829
  ...opts,
785
830
  context: {
786
831
  ...opts.context,
@@ -866,7 +911,6 @@ const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns
866
911
  const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
867
912
  if (!columns || !drizzleOperators) return;
868
913
  const { and, not, or } = drizzleOperators;
869
- const query = isRuleGroupType(ruleGroup) ? ruleGroup : convertFromIC(ruleGroup);
870
914
  const ruleProcessor = defaultRuleProcessorDrizzle;
871
915
  const processRuleGroup = (rg, _outermost) => {
872
916
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
@@ -890,7 +934,7 @@ const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns
890
934
  const ruleGroupSQL = rg.combinator === "or" ? or(...processedRules) : and(...processedRules);
891
935
  return rg.not ? not(ruleGroupSQL) : ruleGroupSQL;
892
936
  };
893
- return processRuleGroup(query, true);
937
+ return processRuleGroup(convertFromIC(ruleGroup), true);
894
938
  };
895
939
 
896
940
  //#endregion
@@ -902,7 +946,6 @@ const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns
902
946
  */
903
947
  const defaultRuleGroupProcessorElasticSearch = (ruleGroup, options) => {
904
948
  const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
905
- const query = convertFromIC(ruleGroup);
906
949
  const processRuleGroup = (rg) => {
907
950
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return false;
908
951
  const processedRules = rg.rules.map((rule) => {
@@ -919,7 +962,7 @@ const defaultRuleGroupProcessorElasticSearch = (ruleGroup, options) => {
919
962
  if (processedRules.length === 0) return false;
920
963
  return { bool: rg.not ? { must_not: /^or$/i.test(rg.combinator) ? { bool: { should: processedRules } } : processedRules } : { [/^or$/i.test(rg.combinator) ? "should" : "must"]: processedRules } };
921
964
  };
922
- const processedRuleGroup = processRuleGroup(query);
965
+ const processedRuleGroup = processRuleGroup(convertFromIC(ruleGroup));
923
966
  return processedRuleGroup === false ? {} : processedRuleGroup;
924
967
  };
925
968
 
@@ -934,19 +977,45 @@ const defaultRuleGroupProcessorJSONata = (ruleGroup, options) => {
934
977
  const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
935
978
  const processRuleGroup = (rg, outermost) => {
936
979
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
937
- const expression = rg.rules.map((rule) => {
938
- if (typeof rule === "string") return rule;
939
- if (isRuleGroup(rule)) return processRuleGroup(rule);
980
+ const processedRules = [];
981
+ let precedingCombinator = "";
982
+ let firstRule = true;
983
+ for (const rule of rg.rules) {
984
+ if (typeof rule === "string") {
985
+ precedingCombinator = rule;
986
+ continue;
987
+ }
988
+ if (isRuleGroup(rule)) {
989
+ const processedGroup = processRuleGroup(rule);
990
+ if (processedGroup) {
991
+ if (!firstRule && precedingCombinator) {
992
+ processedRules.push(precedingCombinator);
993
+ precedingCombinator = "";
994
+ }
995
+ firstRule = false;
996
+ processedRules.push(processedGroup);
997
+ }
998
+ continue;
999
+ }
940
1000
  const [validationResult, fieldValidator] = validateRule(rule);
941
- if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return "";
1001
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
942
1002
  const fieldData = getOption(fields, rule.field);
943
- return ruleProcessor(rule, {
1003
+ const processedRule = ruleProcessor(rule, {
944
1004
  ...options,
945
1005
  parseNumbers: getParseNumberBoolean(fieldData?.inputType),
946
1006
  escapeQuotes: (rule.valueSource ?? "value") === "value",
947
1007
  fieldData
948
1008
  });
949
- }).filter(Boolean).join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : " ");
1009
+ if (processedRule) {
1010
+ if (!firstRule && precedingCombinator) {
1011
+ processedRules.push(precedingCombinator);
1012
+ precedingCombinator = "";
1013
+ }
1014
+ firstRule = false;
1015
+ processedRules.push(processedRule);
1016
+ }
1017
+ }
1018
+ const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : " ");
950
1019
  const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "$not" : ""}(`, ")"] : ["", ""];
951
1020
  return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
952
1021
  };
@@ -992,7 +1061,6 @@ const defaultRuleGroupProcessorJsonLogic = (ruleGroup, options) => {
992
1061
  */
993
1062
  const defaultRuleGroupProcessorLDAP = (ruleGroup, options) => {
994
1063
  const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
995
- const query = convertFromIC(ruleGroup);
996
1064
  const processRuleGroup = (rg, outermost) => {
997
1065
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
998
1066
  const rules = rg.rules.map((rule) => {
@@ -1012,7 +1080,7 @@ const defaultRuleGroupProcessorLDAP = (ruleGroup, options) => {
1012
1080
  const [prefix, suffix] = rules.length > 1 ? [`${notPrefix}(${rg.combinator === "or" ? "|" : "&"}`, `)${notSuffix}`] : [notPrefix, notSuffix];
1013
1081
  return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
1014
1082
  };
1015
- return processRuleGroup(query, true);
1083
+ return processRuleGroup(convertFromIC(ruleGroup), true);
1016
1084
  };
1017
1085
 
1018
1086
  //#endregion
@@ -1067,20 +1135,46 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
1067
1135
  const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
1068
1136
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
1069
1137
  const rg2 = isRuleGroupTypeIC(rg) && rg.rules.some((r) => typeof r === "string" && lc(r) === "xor") ? convertFromIC(rg) : rg;
1070
- const processedRules = rg2.rules.map((rule) => {
1071
- if (typeof rule === "string") return `, ${translations[rule] ?? rule} `;
1072
- if (isRuleGroup(rule)) return processRuleGroup(rule, rg2.rules.length === 1 && !(rg2.not || /^xor$/i.test(rg2.combinator ?? "")));
1138
+ const processedRules = [];
1139
+ let precedingCombinator = "";
1140
+ let firstRule = true;
1141
+ for (const rule of rg2.rules) {
1142
+ if (typeof rule === "string") {
1143
+ precedingCombinator = `, ${translations[rule] ?? rule} `;
1144
+ continue;
1145
+ }
1146
+ if (isRuleGroup(rule)) {
1147
+ const processedGroup = processRuleGroup(rule, rg2.rules.length === 1 && !(rg2.not || /^xor$/i.test(rg2.combinator ?? "")));
1148
+ // istanbul ignore else
1149
+ if (processedGroup) {
1150
+ if (!firstRule && precedingCombinator) {
1151
+ processedRules.push(precedingCombinator);
1152
+ precedingCombinator = "";
1153
+ }
1154
+ firstRule = false;
1155
+ processedRules.push(processedGroup);
1156
+ }
1157
+ continue;
1158
+ }
1073
1159
  const [validationResult, fieldValidator] = validateRule(rule);
1074
- if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return "";
1160
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
1075
1161
  const escapeQuotes = (rule.valueSource ?? "value") === "value";
1076
1162
  const fieldData = getOption(fields, rule.field);
1077
- return ruleProcessor(rule, {
1163
+ const processedRule = ruleProcessor(rule, {
1078
1164
  ...options,
1079
1165
  parseNumbers: getParseNumberBoolean(fieldData?.inputType),
1080
1166
  escapeQuotes,
1081
1167
  fieldData
1082
1168
  });
1083
- });
1169
+ if (processedRule) {
1170
+ if (!firstRule && precedingCombinator) {
1171
+ processedRules.push(precedingCombinator);
1172
+ precedingCombinator = "";
1173
+ }
1174
+ firstRule = false;
1175
+ processedRules.push(processedRule);
1176
+ }
1177
+ }
1084
1178
  if (processedRules.length === 0) return fallbackExpression;
1085
1179
  const isXOR = lc(rg2.combinator ?? "") === "xor";
1086
1180
  const combinator = isXOR ? rg2.combinator.slice(1) : rg2.combinator;
@@ -1088,7 +1182,7 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
1088
1182
  const [prefixTL, suffixTL] = ["groupPrefix", "groupSuffix"].map((key) => rg2.not ? isXOR ? getNLTranslataion(key, translations, ["not", "xor"]) : getNLTranslataion(key, translations, ["not"]) : isXOR ? getNLTranslataion(key, translations, ["xor"]) : getNLTranslataion(key, translations));
1089
1183
  const prefix = mustWrap ? `${prefixTL} (`.trim() : "";
1090
1184
  const suffix = mustWrap ? `) ${suffixTL}`.trim() : "";
1091
- return `${prefix}${processedRules.filter(Boolean).join(isRuleGroupType(rg2) ? `, ${translations[combinator] ?? combinator} ` : "")}${suffix}`;
1185
+ return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `, ${translations[combinator] ?? combinator} ` : "")}${suffix}`;
1092
1186
  };
1093
1187
  return processRuleGroup(ruleGroup, true);
1094
1188
  };
@@ -1138,11 +1232,37 @@ const defaultRuleGroupProcessorParameterized = (ruleGroup, options) => {
1138
1232
  };
1139
1233
  const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
1140
1234
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
1141
- const processedRules = rg.rules.map((rule) => {
1142
- if (typeof rule === "string") return rule;
1143
- if (isRuleGroup(rule)) return processRuleGroup(rule, rg.rules.length === 1);
1144
- return processRule(rule);
1145
- }).filter(Boolean);
1235
+ const processedRules = [];
1236
+ let precedingCombinator = "";
1237
+ let firstRule = true;
1238
+ for (const rule of rg.rules) {
1239
+ if (typeof rule === "string") {
1240
+ precedingCombinator = rule;
1241
+ continue;
1242
+ }
1243
+ if (isRuleGroup(rule)) {
1244
+ const processedGroup = processRuleGroup(rule, rg.rules.length === 1);
1245
+ // istanbul ignore else
1246
+ if (processedGroup) {
1247
+ if (!firstRule && precedingCombinator) {
1248
+ processedRules.push(precedingCombinator);
1249
+ precedingCombinator = "";
1250
+ }
1251
+ firstRule = false;
1252
+ processedRules.push(processedGroup);
1253
+ }
1254
+ continue;
1255
+ }
1256
+ const processedRule = processRule(rule);
1257
+ if (processedRule) {
1258
+ if (!firstRule && precedingCombinator) {
1259
+ processedRules.push(precedingCombinator);
1260
+ precedingCombinator = "";
1261
+ }
1262
+ firstRule = false;
1263
+ processedRules.push(processedRule);
1264
+ }
1265
+ }
1146
1266
  if (processedRules.length === 0) return fallbackExpression;
1147
1267
  return `${rg.not ? "NOT " : ""}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : " ")})`;
1148
1268
  };
@@ -1251,20 +1371,46 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
1251
1371
  const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
1252
1372
  const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
1253
1373
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
1254
- const processedRules = rg.rules.map((rule) => {
1255
- if (typeof rule === "string") return rule;
1256
- if (isRuleGroup(rule)) return processRuleGroup(rule, rg.rules.length === 1);
1374
+ const processedRules = [];
1375
+ let precedingCombinator = "";
1376
+ let firstRule = true;
1377
+ for (const rule of rg.rules) {
1378
+ if (typeof rule === "string") {
1379
+ precedingCombinator = rule;
1380
+ continue;
1381
+ }
1382
+ if (isRuleGroup(rule)) {
1383
+ const processedGroup = processRuleGroup(rule, rg.rules.length === 1);
1384
+ // istanbul ignore else
1385
+ if (processedGroup) {
1386
+ if (!firstRule && precedingCombinator) {
1387
+ processedRules.push(precedingCombinator);
1388
+ precedingCombinator = "";
1389
+ }
1390
+ firstRule = false;
1391
+ processedRules.push(processedGroup);
1392
+ }
1393
+ continue;
1394
+ }
1257
1395
  const [validationResult, fieldValidator] = validateRule(rule);
1258
- if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return "";
1396
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
1259
1397
  const escapeQuotes = (rule.valueSource ?? "value") === "value";
1260
1398
  const fieldData = getOption(fields, rule.field);
1261
- return ruleProcessor(rule, {
1399
+ const processedRule = ruleProcessor(rule, {
1262
1400
  ...options,
1263
1401
  parseNumbers: getParseNumberBoolean(fieldData?.inputType),
1264
1402
  escapeQuotes,
1265
1403
  fieldData
1266
1404
  });
1267
- }).filter(Boolean);
1405
+ if (processedRule) {
1406
+ if (!firstRule && precedingCombinator) {
1407
+ processedRules.push(precedingCombinator);
1408
+ precedingCombinator = "";
1409
+ }
1410
+ firstRule = false;
1411
+ processedRules.push(processedRule);
1412
+ }
1413
+ }
1268
1414
  if (processedRules.length === 0) return fallbackExpression;
1269
1415
  return `${rg.not ? "NOT " : ""}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : " ")})`;
1270
1416
  };
@@ -1542,10 +1688,7 @@ const defaultRuleProcessorJsonLogic = (rule, options = {}) => {
1542
1688
  case "null":
1543
1689
  case "notnull": return { [`${operatorLC === "notnull" ? "!" : "="}=`]: [fieldObject, null] };
1544
1690
  case "in":
1545
- case "notin": {
1546
- const valueAsArray = toArray(value).map((v) => fieldOrNumberRenderer(v));
1547
- return negateIfNotOp(operatorLC, { in: [fieldObject, valueAsArray] });
1548
- }
1691
+ case "notin": return negateIfNotOp(operatorLC, { in: [fieldObject, toArray(value).map((v) => fieldOrNumberRenderer(v))] });
1549
1692
  case "between":
1550
1693
  case "notbetween": {
1551
1694
  const valueAsArray = toArray(value);
@@ -1576,20 +1719,11 @@ const defaultRuleProcessorJsonLogic = (rule, options = {}) => {
1576
1719
  return false;
1577
1720
  }
1578
1721
  case "contains":
1579
- case "doesnotcontain": {
1580
- const jsonRule = { in: [fieldOrNumberRenderer(value), fieldObject] };
1581
- return negateIfNotOp(operatorLC, jsonRule);
1582
- }
1722
+ case "doesnotcontain": return negateIfNotOp(operatorLC, { in: [fieldOrNumberRenderer(value), fieldObject] });
1583
1723
  case "beginswith":
1584
- case "doesnotbeginwith": {
1585
- const jsonRule = { startsWith: [fieldObject, fieldOrNumberRenderer(value)] };
1586
- return negateIfNotOp(operatorLC, jsonRule);
1587
- }
1724
+ case "doesnotbeginwith": return negateIfNotOp(operatorLC, { startsWith: [fieldObject, fieldOrNumberRenderer(value)] });
1588
1725
  case "endswith":
1589
- case "doesnotendwith": {
1590
- const jsonRule = { endsWith: [fieldObject, fieldOrNumberRenderer(value)] };
1591
- return negateIfNotOp(operatorLC, jsonRule);
1592
- }
1726
+ case "doesnotendwith": return negateIfNotOp(operatorLC, { endsWith: [fieldObject, fieldOrNumberRenderer(value)] });
1593
1727
  }
1594
1728
  return false;
1595
1729
  };
@@ -1624,10 +1758,7 @@ const defaultRuleProcessorLDAP = (rule, options = {}) => {
1624
1758
  case "null":
1625
1759
  case "notnull": return negateIf(`(${field}=*)`, operatorLC === "notnull");
1626
1760
  case "in":
1627
- case "notin": {
1628
- const valueAsArray = toArray(value);
1629
- return negateIf(`(|${valueAsArray.map((val) => `(${field}=${ldapEscape(val)})`).join("")})`, operatorLC === "notin");
1630
- }
1761
+ case "notin": return negateIf(`(|${toArray(value).map((val) => `(${field}=${ldapEscape(val)})`).join("")})`, operatorLC === "notin");
1631
1762
  case "between":
1632
1763
  case "notbetween": {
1633
1764
  const valueAsArray = toArray(value);
@@ -1795,10 +1926,9 @@ const defaultRuleProcessorNL = (rule, opts) => {
1795
1926
  });
1796
1927
  const operatorLC = lc(operator);
1797
1928
  if ((operatorLC === "in" || operatorLC === "notin" || operatorLC === "between" || operatorLC === "notbetween") && !value) return "";
1798
- const processedOperator = operatorProcessor(rule, opts);
1799
1929
  const wordOrderMap = {
1800
1930
  S: processedField,
1801
- V: processedOperator,
1931
+ V: operatorProcessor(rule, opts),
1802
1932
  O: value
1803
1933
  };
1804
1934
  return normalizeConstituentWordOrder(wordOrder).map((term) => `${wordOrderMap[term]}`).join(" ").trim();