@react-querybuilder/core 8.15.0 → 8.16.1

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 (92) hide show
  1. package/README.md +114 -53
  2. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +95 -17
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js +425 -24
  4. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  5. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +95 -17
  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-BeJJH9BI.mjs.map +1 -1
  9. package/dist/convertQuery-Lx2HQa0m.js.map +1 -1
  10. package/dist/formatQuery.d.mts +72 -2
  11. package/dist/formatQuery.d.ts +72 -2
  12. package/dist/formatQuery.js +425 -24
  13. package/dist/formatQuery.js.map +1 -1
  14. package/dist/formatQuery.mjs +418 -25
  15. package/dist/formatQuery.mjs.map +1 -1
  16. package/dist/{import-0wp72lLT.d.mts → import-BC_bAKQ8.d.mts} +2 -2
  17. package/dist/{import-yRVJh7E1.d.ts → import-D1KnXhkQ.d.ts} +2 -2
  18. package/dist/{index-D5TXNIzF.d.ts → index-AAZg4Uh1.d.mts} +15 -8
  19. package/dist/{index-Lht_Wq3V.d.mts → index-Ds06V0zO.d.ts} +15 -8
  20. package/dist/objectUtils-Bzug_QfX.js.map +1 -1
  21. package/dist/objectUtils-D96eEEzL.mjs.map +1 -1
  22. package/dist/parseCEL.d.mts +2 -2
  23. package/dist/parseCEL.d.ts +2 -2
  24. package/dist/parseCEL.js.map +1 -1
  25. package/dist/parseCEL.mjs.map +1 -1
  26. package/dist/parseCypher.d.mts +49 -0
  27. package/dist/parseCypher.d.ts +49 -0
  28. package/dist/parseCypher.js +578 -0
  29. package/dist/parseCypher.js.map +1 -0
  30. package/dist/parseCypher.mjs +575 -0
  31. package/dist/parseCypher.mjs.map +1 -0
  32. package/dist/parseGremlin.d.mts +35 -0
  33. package/dist/parseGremlin.d.ts +35 -0
  34. package/dist/parseGremlin.js +192 -0
  35. package/dist/parseGremlin.js.map +1 -0
  36. package/dist/parseGremlin.mjs +191 -0
  37. package/dist/parseGremlin.mjs.map +1 -0
  38. package/dist/parseJSONata.d.mts +2 -2
  39. package/dist/parseJSONata.d.ts +2 -2
  40. package/dist/parseJSONata.js.map +1 -1
  41. package/dist/parseJSONata.mjs.map +1 -1
  42. package/dist/parseJsonLogic.d.mts +2 -2
  43. package/dist/parseJsonLogic.d.ts +2 -2
  44. package/dist/parseJsonLogic.js.map +1 -1
  45. package/dist/parseJsonLogic.mjs.map +1 -1
  46. package/dist/parseMongoDB.d.mts +2 -2
  47. package/dist/parseMongoDB.d.ts +2 -2
  48. package/dist/parseMongoDB.js.map +1 -1
  49. package/dist/parseMongoDB.mjs.map +1 -1
  50. package/dist/parseSPARQL.d.mts +34 -0
  51. package/dist/parseSPARQL.d.ts +34 -0
  52. package/dist/parseSPARQL.js +253 -0
  53. package/dist/parseSPARQL.js.map +1 -0
  54. package/dist/parseSPARQL.mjs +251 -0
  55. package/dist/parseSPARQL.mjs.map +1 -0
  56. package/dist/parseSQL.d.mts +2 -2
  57. package/dist/parseSQL.d.ts +2 -2
  58. package/dist/parseSQL.js.map +1 -1
  59. package/dist/parseSQL.mjs.map +1 -1
  60. package/dist/parseSpEL.d.mts +2 -2
  61. package/dist/parseSpEL.d.ts +2 -2
  62. package/dist/parseSpEL.js.map +1 -1
  63. package/dist/parseSpEL.mjs.map +1 -1
  64. package/dist/prepareQueryObjects-BoG5Rt8z.js.map +1 -1
  65. package/dist/prepareQueryObjects-uA10ZpZX.mjs.map +1 -1
  66. package/dist/react-querybuilder_core.d.mts +95 -17
  67. package/dist/react-querybuilder_core.legacy-esm.d.ts +95 -17
  68. package/dist/react-querybuilder_core.legacy-esm.js +435 -37
  69. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  70. package/dist/react-querybuilder_core.mjs +418 -25
  71. package/dist/react-querybuilder_core.mjs.map +1 -1
  72. package/dist/react-querybuilder_core.production.d.mts +95 -17
  73. package/dist/react-querybuilder_core.production.mjs +1 -1
  74. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  75. package/dist/transformQuery.d.mts +1 -1
  76. package/dist/transformQuery.d.ts +1 -1
  77. package/dist/transformQuery.js.map +1 -1
  78. package/dist/transformQuery.mjs.map +1 -1
  79. package/dist/utils-ChLG90DP.mjs.map +1 -1
  80. package/dist/utils-Qwkq2Q0F.js.map +1 -1
  81. package/formatQuery/package.json +1 -1
  82. package/package.json +51 -7
  83. package/parseCEL/package.json +1 -1
  84. package/parseCypher/package.json +4 -0
  85. package/parseGremlin/package.json +4 -0
  86. package/parseJSONata/package.json +1 -1
  87. package/parseJsonLogic/package.json +1 -1
  88. package/parseMongoDB/package.json +1 -1
  89. package/parseSPARQL/package.json +4 -0
  90. package/parseSQL/package.json +1 -1
  91. package/parseSpEL/package.json +1 -1
  92. package/transformQuery/package.json +1 -1
@@ -82,7 +82,7 @@ const defaultRuleGroupProcessorCEL = (ruleGroup, options) => {
82
82
  //#endregion
83
83
  //#region src/utils/formatQuery/defaultRuleProcessorCEL.ts
84
84
  const shouldNegate$2 = (op) => op.startsWith("not") || op.startsWith("doesnot");
85
- const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
85
+ const escapeDoubleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
86
86
  /**
87
87
  * Default rule processor used by {@link formatQuery} for "cel" format.
88
88
  *
@@ -124,19 +124,19 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
124
124
  case "==":
125
125
  case "!=":
126
126
  case ">":
127
- case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`}`;
127
+ case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`}`;
128
128
  case "contains":
129
- case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
129
+ case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
130
130
  case "beginswith":
131
- case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
131
+ case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
132
132
  case "endswith":
133
- case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
133
+ case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
134
134
  case "null": return `${field} == null`;
135
135
  case "notnull": return `${field} != null`;
136
136
  case "in":
137
137
  case "notin": {
138
138
  const [prefix, suffix] = shouldNegate$2(operatorTL) ? ["!(", ")"] : ["", ""];
139
- return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
139
+ return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes$1(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
140
140
  }
141
141
  case "between":
142
142
  case "notbetween": {
@@ -146,8 +146,8 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
146
146
  const shouldParseNumbers = !(parseNumbers === false);
147
147
  const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
148
148
  const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
149
- let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes(first, escapeQuotes)}"` : firstNum;
150
- let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes(second, escapeQuotes)}"` : secondNum;
149
+ let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes$1(first, escapeQuotes)}"` : firstNum;
150
+ let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes$1(second, escapeQuotes)}"` : secondNum;
151
151
  if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
152
152
  const tempNum = secondNum;
153
153
  secondValue = firstNum;
@@ -403,7 +403,7 @@ const defaultRuleGroupProcessorSpEL = (ruleGroup, options) => {
403
403
  //#region src/utils/formatQuery/defaultRuleProcessorSpEL.ts
404
404
  const shouldNegate$1 = (op) => op.startsWith("not") || op.startsWith("doesnot");
405
405
  const wrapInNegation = (clause, negate) => negate ? `!(${clause})` : clause;
406
- const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
406
+ const escapeSingleQuotes$2 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
407
407
  /**
408
408
  * Default rule processor used by {@link formatQuery} for "spel" format.
409
409
  *
@@ -444,20 +444,20 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
444
444
  case "==":
445
445
  case "!=":
446
446
  case ">":
447
- case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`;
447
+ case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`;
448
448
  case "contains":
449
- case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
449
+ case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
450
450
  case "beginswith":
451
- case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
451
+ case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
452
452
  case "endswith":
453
- case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
453
+ case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes$2(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
454
454
  case "null": return `${field} == null`;
455
455
  case "notnull": return `${field} != null`;
456
456
  case "in":
457
457
  case "notin": {
458
458
  const negate = shouldNegate$1(operatorTL) ? "!" : "";
459
459
  const valueAsArray = toArray(value);
460
- return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes(val, escapeQuotes)}'`}`).join(" or ")})` : "";
460
+ return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes$2(val, escapeQuotes)}'`}`).join(" or ")})` : "";
461
461
  }
462
462
  case "between":
463
463
  case "notbetween": {
@@ -467,8 +467,8 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
467
467
  const shouldParseNumbers = !(parseNumbers === false);
468
468
  const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
469
469
  const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
470
- let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes(first, escapeQuotes)}'` : firstNum;
471
- let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes(second, escapeQuotes)}'` : secondNum;
470
+ let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes$2(first, escapeQuotes)}'` : firstNum;
471
+ let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes$2(second, escapeQuotes)}'` : secondNum;
472
472
  if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
473
473
  const tempNum = secondNum;
474
474
  secondValue = firstNum;
@@ -523,7 +523,7 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
523
523
  valsOneAndTwoOnly[0] = secondNum;
524
524
  valsOneAndTwoOnly[1] = firstNum;
525
525
  }
526
- return (valueIsField ? valsOneAndTwoOnly.map((v) => wrapFieldName(v)) : valsOneAndTwoOnly.every((v) => shouldRenderAsNumber(v, parseNumbers)) ? valsOneAndTwoOnly.map((v) => parseNumber(v, { parseNumbers: "strict" })) : valsOneAndTwoOnly.map((v) => wrapAndEscape(v))).join(` ${translations?.and ?? "and"} `);
526
+ return (valueIsField ? valsOneAndTwoOnly.map((v) => wrapFieldName(v)) : valsOneAndTwoOnly.every((v) => shouldRenderAsNumber(v, parseNumbers)) ? valsOneAndTwoOnly.map((v) => parseNumber(v, { parseNumbers: "strict" })) : valsOneAndTwoOnly.map((v) => wrapAndEscape(v))).join(` ${translations?.betweenAnd ?? translations?.and ?? "and"} `);
527
527
  }
528
528
  case "contains":
529
529
  case "doesnotcontain": return valueIsField ? concat(quoteValue("%"), wrapFieldName(value), quoteValue("%")) : quoteValue(`%${escapeValue(value)}%`);
@@ -536,6 +536,70 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
536
536
  return valueIsField ? wrapFieldName(value) : shouldRenderAsNumber(value, parseNumbers) ? `${trimIfString(value)}` : `${wrapAndEscape(value)}`;
537
537
  };
538
538
  //#endregion
539
+ //#region src/utils/formatQuery/defaultRuleGroupProcessorCypher.ts
540
+ /**
541
+ * Maps a {@link DefaultCombinatorName} to a Cypher combinator keyword.
542
+ *
543
+ * @group Export
544
+ */
545
+ const cypherCombinatorMap = {
546
+ and: "AND",
547
+ or: "OR"
548
+ };
549
+ /**
550
+ * Rule group processor used by {@link formatQuery} for "cypher" and "gql" formats.
551
+ *
552
+ * @group Export
553
+ */
554
+ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
555
+ const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
556
+ const processRuleGroup = (rg, outermost) => {
557
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
558
+ const processedRules = [];
559
+ let precedingCombinator = "";
560
+ let firstRule = true;
561
+ for (const rule of rg.rules) {
562
+ if (typeof rule === "string") {
563
+ precedingCombinator = cypherCombinatorMap[rule];
564
+ continue;
565
+ }
566
+ if (isRuleGroup(rule)) {
567
+ const processedGroup = processRuleGroup(rule);
568
+ if (processedGroup) {
569
+ if (!firstRule && precedingCombinator) {
570
+ processedRules.push(precedingCombinator);
571
+ precedingCombinator = "";
572
+ }
573
+ firstRule = false;
574
+ processedRules.push(processedGroup);
575
+ }
576
+ continue;
577
+ }
578
+ const [validationResult, fieldValidator] = validateRule(rule);
579
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
580
+ const fieldData = getOption(fields, rule.field);
581
+ const processedRule = ruleProcessor(rule, {
582
+ ...options,
583
+ parseNumbers: getParseNumberBoolean(fieldData?.inputType),
584
+ escapeQuotes: (rule.valueSource ?? "value") === "value",
585
+ fieldData
586
+ });
587
+ if (processedRule) {
588
+ if (!firstRule && precedingCombinator) {
589
+ processedRules.push(precedingCombinator);
590
+ precedingCombinator = "";
591
+ }
592
+ firstRule = false;
593
+ processedRules.push(processedRule);
594
+ }
595
+ }
596
+ const expression = processedRules.join(isRuleGroupType(rg) ? ` ${cypherCombinatorMap[rg.combinator]} ` : " ");
597
+ const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "NOT " : ""}(`, ")"] : ["", ""];
598
+ return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
599
+ };
600
+ return processRuleGroup(ruleGroup, true);
601
+ };
602
+ //#endregion
539
603
  //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
540
604
  /**
541
605
  * Default rule processor used by {@link formatQuery} for the "drizzle" format.
@@ -703,6 +767,67 @@ const defaultRuleGroupProcessorElasticSearch = (ruleGroup, options) => {
703
767
  return processedRuleGroup === false ? {} : processedRuleGroup;
704
768
  };
705
769
  //#endregion
770
+ //#region src/utils/formatQuery/defaultRuleGroupProcessorGremlin.ts
771
+ /**
772
+ * Rule group processor used by {@link formatQuery} for "gremlin" format.
773
+ *
774
+ * At the top level, filter rules produce chained `.has()` steps (implicit AND).
775
+ * Nested groups use `.and()` / `.or()` / `.not()` compound traversals with
776
+ * `__` anonymous traversal prefixes.
777
+ *
778
+ * @group Export
779
+ */
780
+ const defaultRuleGroupProcessorGremlin = (ruleGroup, options) => {
781
+ const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
782
+ const validateAndProcess = (rule) => {
783
+ // v8 ignore next -- @preserve
784
+ if (typeof rule === "string" || isRuleGroup(rule)) return void 0;
785
+ const [validationResult, fieldValidator] = validateRule(rule);
786
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return;
787
+ const fieldData = getOption(fields, rule.field);
788
+ return ruleProcessor(rule, {
789
+ ...options,
790
+ parseNumbers: getParseNumberBoolean(fieldData?.inputType),
791
+ escapeQuotes: (rule.valueSource ?? "value") === "value",
792
+ fieldData
793
+ });
794
+ };
795
+ /** Recursively processes a nested group into `.and()`/`.or()`/`.not()` form. */
796
+ const processNested = (rg) => {
797
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return "";
798
+ const predicates = [];
799
+ for (const rule of rg.rules) {
800
+ if (typeof rule === "string") continue;
801
+ if (isRuleGroup(rule)) {
802
+ const nested = processNested(rule);
803
+ if (nested) predicates.push(nested);
804
+ continue;
805
+ }
806
+ const processed = validateAndProcess(rule);
807
+ if (processed) predicates.push(processed);
808
+ }
809
+ if (predicates.length === 0) return "";
810
+ const combinator = rg.combinator ?? "and";
811
+ const prefix = rg.not ? "not" : combinator;
812
+ if (predicates.length === 1 && !rg.not) return predicates[0];
813
+ return `.${prefix}(${predicates.map((p) => p.startsWith(".") ? `__${p}` : p).join(", ")})`;
814
+ };
815
+ if (!isRuleOrGroupValid(ruleGroup, validationMap[ruleGroup.id ?? ""])) return fallbackExpression;
816
+ const steps = [];
817
+ for (const rule of ruleGroup.rules) {
818
+ if (typeof rule === "string") continue;
819
+ if (isRuleGroup(rule)) {
820
+ const compound = processNested(rule);
821
+ if (compound) steps.push(compound);
822
+ continue;
823
+ }
824
+ const processed = validateAndProcess(rule);
825
+ if (processed) steps.push(processed);
826
+ }
827
+ if (steps.length === 0) return fallbackExpression;
828
+ return steps.join("");
829
+ };
830
+ //#endregion
706
831
  //#region src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts
707
832
  /**
708
833
  * Rule group processor used by {@link formatQuery} for "jsonata" format.
@@ -873,7 +998,7 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
873
998
  let firstRule = true;
874
999
  for (const rule of rg2.rules) {
875
1000
  if (typeof rule === "string") {
876
- precedingCombinator = `, ${translations[rule] ?? rule} `;
1001
+ precedingCombinator = `${translations.ruleSeparator ?? ", "}${translations[rule] ?? rule} `;
877
1002
  continue;
878
1003
  }
879
1004
  if (isRuleGroup(rule)) {
@@ -915,7 +1040,8 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
915
1040
  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));
916
1041
  const prefix = mustWrap ? `${prefixTL} (`.trim() : "";
917
1042
  const suffix = mustWrap ? `) ${suffixTL}`.trim() : "";
918
- return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `, ${translations[combinator] ?? combinator} ` : "")}${suffix}`;
1043
+ const sep = translations.ruleSeparator ?? ", ";
1044
+ return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `${sep}${translations[combinator] ?? combinator} ` : "")}${suffix}`;
919
1045
  };
920
1046
  return processRuleGroup(ruleGroup, true);
921
1047
  };
@@ -1090,6 +1216,63 @@ const defaultRuleGroupProcessorSequelize = (ruleGroup, options) => {
1090
1216
  return processRuleGroup(convertFromIC(ruleGroup), true);
1091
1217
  };
1092
1218
  //#endregion
1219
+ //#region src/utils/formatQuery/defaultRuleGroupProcessorSPARQL.ts
1220
+ /**
1221
+ * Rule group processor used by {@link formatQuery} for "sparql" format.
1222
+ *
1223
+ * SPARQL uses the same combinators as CEL (`&&` / `||`) and `!()` for negation.
1224
+ *
1225
+ * @group Export
1226
+ */
1227
+ const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
1228
+ const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
1229
+ const processRuleGroup = (rg, outermost) => {
1230
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
1231
+ const processedRules = [];
1232
+ let precedingCombinator = "";
1233
+ let firstRule = true;
1234
+ for (const rule of rg.rules) {
1235
+ if (typeof rule === "string") {
1236
+ precedingCombinator = celCombinatorMap[rule];
1237
+ continue;
1238
+ }
1239
+ if (isRuleGroup(rule)) {
1240
+ const processedGroup = processRuleGroup(rule);
1241
+ if (processedGroup) {
1242
+ if (!firstRule && precedingCombinator) {
1243
+ processedRules.push(precedingCombinator);
1244
+ precedingCombinator = "";
1245
+ }
1246
+ firstRule = false;
1247
+ processedRules.push(processedGroup);
1248
+ }
1249
+ continue;
1250
+ }
1251
+ const [validationResult, fieldValidator] = validateRule(rule);
1252
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
1253
+ const fieldData = getOption(fields, rule.field);
1254
+ const processedRule = ruleProcessor(rule, {
1255
+ ...options,
1256
+ parseNumbers: getParseNumberBoolean(fieldData?.inputType),
1257
+ escapeQuotes: (rule.valueSource ?? "value") === "value",
1258
+ fieldData
1259
+ });
1260
+ if (processedRule) {
1261
+ if (!firstRule && precedingCombinator) {
1262
+ processedRules.push(precedingCombinator);
1263
+ precedingCombinator = "";
1264
+ }
1265
+ firstRule = false;
1266
+ processedRules.push(processedRule);
1267
+ }
1268
+ }
1269
+ const expression = processedRules.join(isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator]} ` : " ");
1270
+ const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "!" : ""}(`, ")"] : ["", ""];
1271
+ return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
1272
+ };
1273
+ return processRuleGroup(ruleGroup, true);
1274
+ };
1275
+ //#endregion
1093
1276
  //#region src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts
1094
1277
  /**
1095
1278
  * Default rule processor used by {@link formatQuery} for "sql" format.
@@ -1465,6 +1648,59 @@ const getFieldValidatorReasons = (rule, fieldValidator) => {
1465
1648
  }
1466
1649
  };
1467
1650
  //#endregion
1651
+ //#region src/utils/formatQuery/defaultRuleProcessorCypher.ts
1652
+ const escapeSingleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
1653
+ /**
1654
+ * Default rule processor used by {@link formatQuery} for "cypher" and "gql" formats.
1655
+ *
1656
+ * @group Export
1657
+ */
1658
+ const defaultRuleProcessorCypher = (rule, opts = {}) => {
1659
+ const { escapeQuotes, parseNumbers } = opts;
1660
+ const { field, operator, value, valueSource } = rule;
1661
+ const valueIsField = valueSource === "field";
1662
+ const operatorTL = operator.toLowerCase();
1663
+ const fmtVal = (v) => {
1664
+ if (v === null || v === void 0) return "null";
1665
+ if (typeof v === "boolean" || typeof v === "bigint") return String(v);
1666
+ if (valueIsField) return trimIfString(v);
1667
+ if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
1668
+ return `'${escapeSingleQuotes$1(v, escapeQuotes)}'`;
1669
+ };
1670
+ switch (operatorTL) {
1671
+ case "=": return `${field} = ${fmtVal(value)}`;
1672
+ case "!=":
1673
+ case "<>": return `${field} <> ${fmtVal(value)}`;
1674
+ case "<":
1675
+ case ">":
1676
+ case "<=":
1677
+ case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
1678
+ case "contains": return `${field} CONTAINS ${fmtVal(value)}`;
1679
+ case "doesnotcontain": return `NOT ${field} CONTAINS ${fmtVal(value)}`;
1680
+ case "beginswith": return `${field} STARTS WITH ${fmtVal(value)}`;
1681
+ case "doesnotbeginwith": return `NOT ${field} STARTS WITH ${fmtVal(value)}`;
1682
+ case "endswith": return `${field} ENDS WITH ${fmtVal(value)}`;
1683
+ case "doesnotendwith": return `NOT ${field} ENDS WITH ${fmtVal(value)}`;
1684
+ case "null": return `${field} IS NULL`;
1685
+ case "notnull": return `${field} IS NOT NULL`;
1686
+ case "in":
1687
+ case "notin": {
1688
+ const values = toArray(value).map(fmtVal);
1689
+ if (!values.length) return "";
1690
+ return `${operatorTL === "notin" ? "NOT " : ""}${field} IN [${values.join(", ")}]`;
1691
+ }
1692
+ case "between":
1693
+ case "notbetween": {
1694
+ const arr = toArray(value);
1695
+ if (arr.length < 2) return "";
1696
+ const [low, high] = [fmtVal(arr[0]), fmtVal(arr[1])];
1697
+ const expr = `${low} <= ${field} AND ${field} <= ${high}`;
1698
+ return operatorTL === "notbetween" ? `NOT (${expr})` : expr;
1699
+ }
1700
+ default: return `${field} ${operator} ${fmtVal(value)}`;
1701
+ }
1702
+ };
1703
+ //#endregion
1468
1704
  //#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
1469
1705
  const rangeOperatorMap = {
1470
1706
  "<": "lt",
@@ -1616,6 +1852,68 @@ const defaultRuleProcessorElasticSearch = (rule, options = {}) => {
1616
1852
  return false;
1617
1853
  };
1618
1854
  //#endregion
1855
+ //#region src/utils/formatQuery/defaultRuleProcessorGremlin.ts
1856
+ const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
1857
+ /**
1858
+ * Default rule processor used by {@link formatQuery} for "gremlin" format.
1859
+ *
1860
+ * Each rule becomes a `.has()` step (or `.hasNot()`/`.has()` for null checks).
1861
+ *
1862
+ * @group Export
1863
+ */
1864
+ const defaultRuleProcessorGremlin = (rule, opts = {}) => {
1865
+ const { escapeQuotes, parseNumbers } = opts;
1866
+ const { field, operator, value, valueSource } = rule;
1867
+ const valueIsField = valueSource === "field";
1868
+ const operatorTL = operator.toLowerCase();
1869
+ const prop = field.includes(".") ? field.split(".").pop() : field;
1870
+ const fmtVal = (v) => {
1871
+ if (v === null || v === void 0) return "null";
1872
+ if (typeof v === "boolean" || typeof v === "bigint") return String(v);
1873
+ if (valueIsField) return trimIfString(v);
1874
+ if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
1875
+ return `'${escapeSingleQuotes(v, escapeQuotes)}'`;
1876
+ };
1877
+ switch (operatorTL) {
1878
+ case "=": return `.has('${prop}', ${fmtVal(value)})`;
1879
+ case "!=":
1880
+ case "<>": return `.has('${prop}', neq(${fmtVal(value)}))`;
1881
+ case "<": return `.has('${prop}', lt(${fmtVal(value)}))`;
1882
+ case ">": return `.has('${prop}', gt(${fmtVal(value)}))`;
1883
+ case "<=": return `.has('${prop}', lte(${fmtVal(value)}))`;
1884
+ case ">=": return `.has('${prop}', gte(${fmtVal(value)}))`;
1885
+ case "contains": return `.has('${prop}', containing(${fmtVal(value)}))`;
1886
+ case "doesnotcontain": return `.has('${prop}', notContaining(${fmtVal(value)}))`;
1887
+ case "beginswith": return `.has('${prop}', startingWith(${fmtVal(value)}))`;
1888
+ case "doesnotbeginwith": return `.has('${prop}', notStartingWith(${fmtVal(value)}))`;
1889
+ case "endswith": return `.has('${prop}', endingWith(${fmtVal(value)}))`;
1890
+ case "doesnotendwith": return `.has('${prop}', notEndingWith(${fmtVal(value)}))`;
1891
+ case "null": return `.hasNot('${prop}')`;
1892
+ case "notnull": return `.has('${prop}')`;
1893
+ case "in": {
1894
+ const items = toArray(value).map(fmtVal);
1895
+ if (!items.length) return "";
1896
+ return `.has('${prop}', within(${items.join(", ")}))`;
1897
+ }
1898
+ case "notin": {
1899
+ const items = toArray(value).map(fmtVal);
1900
+ if (!items.length) return "";
1901
+ return `.has('${prop}', without(${items.join(", ")}))`;
1902
+ }
1903
+ case "between": {
1904
+ const arr = toArray(value);
1905
+ if (arr.length < 2) return "";
1906
+ return `.has('${prop}', between(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
1907
+ }
1908
+ case "notbetween": {
1909
+ const arr = toArray(value);
1910
+ if (arr.length < 2) return "";
1911
+ return `.has('${prop}', outside(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
1912
+ }
1913
+ default: return `.has('${prop}', ${fmtVal(value)})`;
1914
+ }
1915
+ };
1916
+ //#endregion
1619
1917
  //#region src/utils/formatQuery/defaultRuleProcessorJSONata.ts
1620
1918
  const shouldNegate = (op) => op.startsWith("not") || op.startsWith("doesnot");
1621
1919
  const quote = (v, escapeQuotes) => `"${typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`)}"`;
@@ -1870,6 +2168,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
1870
2168
  const orTL = t.or ?? "or";
1871
2169
  const trueTL = t.true ?? "true";
1872
2170
  const falseTL = t.false ?? "false";
2171
+ const listSep = t.listSeparator ?? ", ";
2172
+ const useOxfordComma = !t.listSeparator;
1873
2173
  switch (operatorLowerCase) {
1874
2174
  case "null":
1875
2175
  case "notnull": return "";
@@ -1889,7 +2189,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
1889
2189
  if (valueAsArray.length === 0) return "";
1890
2190
  const valStringArray = valueAsArray.map((v) => valueIsField ? wrapFieldName(getOption(fields ?? [], v)?.label ?? v) : shouldRenderAsNumber(v, parseNumbers) ? `${trimIfString(v)}` : `${wrapAndEscape(v)}`);
1891
2191
  if (valStringArray.length === 1) return valStringArray[0];
1892
- return `(${`${valStringArray.slice(0, -1).join(", ")}${valStringArray.length > 2 ? "," : ""} ${orTL} ${valStringArray.at(-1)}`})`;
2192
+ const oxfordComma = useOxfordComma && valStringArray.length > 2 ? "," : "";
2193
+ return `(${`${valStringArray.slice(0, -1).join(listSep)}${oxfordComma} ${orTL} ${valStringArray.at(-1)}`})`;
1893
2194
  }
1894
2195
  }
1895
2196
  if (typeof rule.value === "boolean") return rule.value ? trueTL : falseTL;
@@ -2002,7 +2303,14 @@ const defaultRuleProcessorNL = (rule, opts) => {
2002
2303
  V: operatorProcessor(rule, opts),
2003
2304
  O: value
2004
2305
  };
2005
- return normalizeConstituentWordOrder(wordOrder).map((term) => `${wordOrderMap[term]}`).join(" ").trim();
2306
+ const translations = opts?.translations ?? {};
2307
+ const suffixMap = {
2308
+ S: translations.afterSubject ?? " ",
2309
+ V: translations.afterVerb ?? " ",
2310
+ O: translations.afterObject ?? " "
2311
+ };
2312
+ const wordOrderTuple = normalizeConstituentWordOrder(wordOrder).filter((term) => wordOrderMap[term] !== "");
2313
+ return wordOrderTuple.map((term, i) => `${wordOrderMap[term]}${i < wordOrderTuple.length - 1 ? suffixMap[term] : ""}`).join("").trim();
2006
2314
  };
2007
2315
  //#endregion
2008
2316
  //#region src/utils/formatQuery/defaultRuleProcessorSQL.ts
@@ -2238,8 +2546,11 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
2238
2546
  const valueIsField = valueSource === "field";
2239
2547
  const operatorLC = lc(operator);
2240
2548
  if (!Op || valueIsField && (!col || !fn && [
2549
+ "contains",
2241
2550
  "doesnotcontain",
2551
+ "beginswith",
2242
2552
  "doesnotbeginwith",
2553
+ "endswith",
2243
2554
  "doesnotendwith"
2244
2555
  ].includes(operatorLC))) return;
2245
2556
  switch (operatorLC) {
@@ -2259,9 +2570,9 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
2259
2570
  }[operatorLC];
2260
2571
  return { [field]: valueIsField && operatorLC === "=" ? { [Op.col]: value } : { [sequelizeOperator]: valueIsField ? col(value) : shouldRenderAsNumber(value, parseNumbers) ? parseNumber(value, { parseNumbers: "strict" }) : value } };
2261
2572
  }
2262
- case "contains": return { [field]: { [Op.substring]: valueIsField ? col(value) : `${value}` } };
2263
- case "beginswith": return { [field]: { [Op.startsWith]: valueIsField ? col(value) : `${value}` } };
2264
- case "endswith": return { [field]: { [Op.endsWith]: valueIsField ? col(value) : `${value}` } };
2573
+ case "contains": return { [field]: { [valueIsField ? Op.like : Op.substring]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `${value}` } };
2574
+ case "beginswith": return { [field]: { [valueIsField ? Op.like : Op.startsWith]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}` } };
2575
+ case "endswith": return { [field]: { [valueIsField ? Op.like : Op.endsWith]: valueIsField ? fn("CONCAT", "%", col(value)) : `${value}` } };
2265
2576
  case "doesnotcontain": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `%${value}%` } };
2266
2577
  case "doesnotbeginwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}%` } };
2267
2578
  case "doesnotendwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value)) : `%${value}` } };
@@ -2291,6 +2602,74 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
2291
2602
  }
2292
2603
  };
2293
2604
  //#endregion
2605
+ //#region src/utils/formatQuery/defaultRuleProcessorSPARQL.ts
2606
+ const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
2607
+ /** Auto-prefix a SPARQL variable name with `?` unless it's already prefixed, a URI, or a prefixed name.
2608
+ *
2609
+ * @group Export
2610
+ */
2611
+ const sparqlVar = (name) => /^[?<]/.test(name) || name.includes(":") ? name : `?${name}`;
2612
+ /**
2613
+ * Default rule processor used by {@link formatQuery} for "sparql" format.
2614
+ *
2615
+ * @group Export
2616
+ */
2617
+ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
2618
+ const { escapeQuotes, parseNumbers } = opts;
2619
+ const { field: rawField, operator, value, valueSource } = rule;
2620
+ const valueIsField = valueSource === "field";
2621
+ const operatorTL = operator.toLowerCase();
2622
+ const field = sparqlVar(rawField);
2623
+ const fmtVal = (v) => {
2624
+ if (v === null || v === void 0) return "\"\"";
2625
+ if (typeof v === "boolean") return `"${v}"^^xsd:boolean`;
2626
+ if (typeof v === "bigint") return String(v);
2627
+ if (valueIsField) return sparqlVar(trimIfString(v));
2628
+ if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
2629
+ const s = typeof v === "string" ? v : JSON.stringify(v) ?? "";
2630
+ if (s.startsWith("?") || s.startsWith("<") || s.includes(":")) return s;
2631
+ return `"${escapeDoubleQuotes(s, escapeQuotes)}"`;
2632
+ };
2633
+ switch (operatorTL) {
2634
+ case "=":
2635
+ case "!=":
2636
+ case "<":
2637
+ case ">":
2638
+ case "<=":
2639
+ case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
2640
+ case "<>": return `${field} != ${fmtVal(value)}`;
2641
+ case "contains": return `CONTAINS(${field}, ${fmtVal(value)})`;
2642
+ case "doesnotcontain": return `!CONTAINS(${field}, ${fmtVal(value)})`;
2643
+ case "beginswith": return `STRSTARTS(${field}, ${fmtVal(value)})`;
2644
+ case "doesnotbeginwith": return `!STRSTARTS(${field}, ${fmtVal(value)})`;
2645
+ case "endswith": return `STRENDS(${field}, ${fmtVal(value)})`;
2646
+ case "doesnotendwith": return `!STRENDS(${field}, ${fmtVal(value)})`;
2647
+ case "null": return `!BOUND(${field})`;
2648
+ case "notnull": return `BOUND(${field})`;
2649
+ case "in": {
2650
+ const items = toArray(value).map(fmtVal);
2651
+ if (!items.length) return "";
2652
+ return `${field} IN (${items.join(", ")})`;
2653
+ }
2654
+ case "notin": {
2655
+ const items = toArray(value).map(fmtVal);
2656
+ if (!items.length) return "";
2657
+ return `${field} NOT IN (${items.join(", ")})`;
2658
+ }
2659
+ case "between": {
2660
+ const arr = toArray(value);
2661
+ if (arr.length < 2) return "";
2662
+ return `${field} >= ${fmtVal(arr[0])} && ${field} <= ${fmtVal(arr[1])}`;
2663
+ }
2664
+ case "notbetween": {
2665
+ const arr = toArray(value);
2666
+ if (arr.length < 2) return "";
2667
+ return `(${field} < ${fmtVal(arr[0])} || ${field} > ${fmtVal(arr[1])})`;
2668
+ }
2669
+ default: return `${field} ${operator} ${fmtVal(value)}`;
2670
+ }
2671
+ };
2672
+ //#endregion
2294
2673
  //#region src/utils/formatQuery/formatQuery.ts
2295
2674
  /**
2296
2675
  * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
@@ -2338,6 +2717,10 @@ const defaultRuleProcessors = {
2338
2717
  sequelize: defaultRuleProcessorSequelize,
2339
2718
  spel: defaultRuleProcessorSpEL,
2340
2719
  sql: defaultRuleProcessorSQL,
2720
+ cypher: defaultRuleProcessorCypher,
2721
+ gql: defaultRuleProcessorCypher,
2722
+ sparql: defaultRuleProcessorSPARQL,
2723
+ gremlin: defaultRuleProcessorGremlin,
2341
2724
  diagnostics: defaultRuleProcessorSQL
2342
2725
  };
2343
2726
  /* v8 ignore next -- @preserve */
@@ -2360,6 +2743,10 @@ const defaultOperatorProcessors = {
2360
2743
  sequelize: defaultOperatorProcessor,
2361
2744
  spel: defaultOperatorProcessor,
2362
2745
  sql: defaultOperatorProcessorSQL,
2746
+ cypher: defaultOperatorProcessor,
2747
+ gql: defaultOperatorProcessor,
2748
+ sparql: defaultOperatorProcessor,
2749
+ gremlin: defaultOperatorProcessor,
2363
2750
  diagnostics: defaultOperatorProcessor
2364
2751
  };
2365
2752
  const defaultFallbackExpressions = {
@@ -2367,6 +2754,8 @@ const defaultFallbackExpressions = {
2367
2754
  ldap: "",
2368
2755
  mongodb: "\"$and\":[{\"$expr\":true}]",
2369
2756
  natural_language: "1 is 1",
2757
+ sparql: "1 = 1",
2758
+ gremlin: "",
2370
2759
  spel: "1 == 1",
2371
2760
  sql: "(1 = 1)"
2372
2761
  };
@@ -2507,6 +2896,10 @@ function formatQuery(ruleGroup, optionParam = {}) {
2507
2896
  case "prisma": return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);
2508
2897
  case "drizzle": return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);
2509
2898
  case "sequelize": return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);
2899
+ case "cypher":
2900
+ case "gql": return defaultRuleGroupProcessorCypher(ruleGroup, finalOptions);
2901
+ case "sparql": return defaultRuleGroupProcessorSPARQL(ruleGroup, finalOptions);
2902
+ case "gremlin": return defaultRuleGroupProcessorGremlin(ruleGroup, finalOptions);
2510
2903
  case "diagnostics": return defaultRuleGroupProcessorDiagnostics(ruleGroup, finalOptions);
2511
2904
  default: return "";
2512
2905
  }
@@ -2562,6 +2955,6 @@ const defaultValueProcessorMongoDBByRule = defaultRuleProcessorMongoDB;
2562
2955
  */
2563
2956
  const defaultValueProcessorSpELByRule = defaultRuleProcessorSpEL;
2564
2957
  //#endregion
2565
- export { bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, defaultCELValueProcessor, defaultExportOperatorMap, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultRuleGroupProcessorCEL, defaultRuleGroupProcessorDiagnostics, defaultRuleGroupProcessorDrizzle, defaultRuleGroupProcessorElasticSearch, defaultRuleGroupProcessorJSONata, defaultRuleGroupProcessorJsonLogic, defaultRuleGroupProcessorLDAP, defaultRuleGroupProcessorMongoDB, defaultRuleGroupProcessorMongoDBQuery, defaultRuleGroupProcessorNL, defaultRuleGroupProcessorParameterized, defaultRuleGroupProcessorPrisma, defaultRuleGroupProcessorSQL, defaultRuleGroupProcessorSequelize, defaultRuleGroupProcessorSpEL, defaultRuleProcessorCEL, defaultRuleProcessorDrizzle, defaultRuleProcessorElasticSearch, defaultRuleProcessorJSONata, defaultRuleProcessorJsonLogic, defaultRuleProcessorLDAP, defaultRuleProcessorMongoDB, defaultRuleProcessorMongoDBQuery, defaultRuleProcessorNL, defaultRuleProcessorParameterized, defaultRuleProcessorPrisma, defaultRuleProcessorSQL, defaultRuleProcessorSequelize, defaultRuleProcessorSpEL, defaultSpELValueProcessor, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, formatQuery, formatQueryOptionPresets, getNLTranslataion, getQuoteFieldNamesWithArray, getQuotedFieldName, isValidValue, isValueProcessorLegacy, jsonLogicAdditionalOperators, mapSQLOperator, mongoDbFallback, mongoOperators, normalizeConstituentWordOrder, numerifyValues, prismaFallback, prismaOperators, processMatchMode, shouldRenderAsNumber, sqlDialectPresets };
2958
+ export { bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, cypherCombinatorMap, defaultCELValueProcessor, defaultExportOperatorMap, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultRuleGroupProcessorCEL, defaultRuleGroupProcessorCypher, defaultRuleGroupProcessorDiagnostics, defaultRuleGroupProcessorDrizzle, defaultRuleGroupProcessorElasticSearch, defaultRuleGroupProcessorGremlin, defaultRuleGroupProcessorJSONata, defaultRuleGroupProcessorJsonLogic, defaultRuleGroupProcessorLDAP, defaultRuleGroupProcessorMongoDB, defaultRuleGroupProcessorMongoDBQuery, defaultRuleGroupProcessorNL, defaultRuleGroupProcessorParameterized, defaultRuleGroupProcessorPrisma, defaultRuleGroupProcessorSPARQL, defaultRuleGroupProcessorSQL, defaultRuleGroupProcessorSequelize, defaultRuleGroupProcessorSpEL, defaultRuleProcessorCEL, defaultRuleProcessorCypher, defaultRuleProcessorDrizzle, defaultRuleProcessorElasticSearch, defaultRuleProcessorGremlin, defaultRuleProcessorJSONata, defaultRuleProcessorJsonLogic, defaultRuleProcessorLDAP, defaultRuleProcessorMongoDB, defaultRuleProcessorMongoDBQuery, defaultRuleProcessorNL, defaultRuleProcessorParameterized, defaultRuleProcessorPrisma, defaultRuleProcessorSPARQL, defaultRuleProcessorSQL, defaultRuleProcessorSequelize, defaultRuleProcessorSpEL, defaultSpELValueProcessor, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, formatQuery, formatQueryOptionPresets, getNLTranslataion, getQuoteFieldNamesWithArray, getQuotedFieldName, isValidValue, isValueProcessorLegacy, jsonLogicAdditionalOperators, mapSQLOperator, mongoDbFallback, mongoOperators, normalizeConstituentWordOrder, numerifyValues, prismaFallback, prismaOperators, processMatchMode, shouldRenderAsNumber, sparqlVar, sqlDialectPresets };
2566
2959
 
2567
2960
  //# sourceMappingURL=formatQuery.mjs.map