@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
@@ -1482,7 +1482,7 @@ const defaultRuleGroupProcessorCEL = (ruleGroup, options) => {
1482
1482
  //#endregion
1483
1483
  //#region src/utils/formatQuery/defaultRuleProcessorCEL.ts
1484
1484
  const shouldNegate$2 = (op) => op.startsWith("not") || op.startsWith("doesnot");
1485
- const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
1485
+ const escapeDoubleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
1486
1486
  /**
1487
1487
  * Default rule processor used by {@link formatQuery} for "cel" format.
1488
1488
  *
@@ -1524,19 +1524,19 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
1524
1524
  case "==":
1525
1525
  case "!=":
1526
1526
  case ">":
1527
- case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`}`;
1527
+ case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`}`;
1528
1528
  case "contains":
1529
- case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
1529
+ case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
1530
1530
  case "beginswith":
1531
- case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
1531
+ case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
1532
1532
  case "endswith":
1533
- case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
1533
+ case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
1534
1534
  case "null": return `${field} == null`;
1535
1535
  case "notnull": return `${field} != null`;
1536
1536
  case "in":
1537
1537
  case "notin": {
1538
1538
  const [prefix, suffix] = shouldNegate$2(operatorTL) ? ["!(", ")"] : ["", ""];
1539
- return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
1539
+ return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes$1(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
1540
1540
  }
1541
1541
  case "between":
1542
1542
  case "notbetween": {
@@ -1546,8 +1546,8 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
1546
1546
  const shouldParseNumbers = !(parseNumbers === false);
1547
1547
  const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
1548
1548
  const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
1549
- let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes(first, escapeQuotes)}"` : firstNum;
1550
- let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes(second, escapeQuotes)}"` : secondNum;
1549
+ let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes$1(first, escapeQuotes)}"` : firstNum;
1550
+ let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes$1(second, escapeQuotes)}"` : secondNum;
1551
1551
  if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
1552
1552
  const tempNum = secondNum;
1553
1553
  secondValue = firstNum;
@@ -1803,7 +1803,7 @@ const defaultRuleGroupProcessorSpEL = (ruleGroup, options) => {
1803
1803
  //#region src/utils/formatQuery/defaultRuleProcessorSpEL.ts
1804
1804
  const shouldNegate$1 = (op) => op.startsWith("not") || op.startsWith("doesnot");
1805
1805
  const wrapInNegation = (clause, negate) => negate ? `!(${clause})` : clause;
1806
- const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
1806
+ const escapeSingleQuotes$2 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
1807
1807
  /**
1808
1808
  * Default rule processor used by {@link formatQuery} for "spel" format.
1809
1809
  *
@@ -1844,20 +1844,20 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
1844
1844
  case "==":
1845
1845
  case "!=":
1846
1846
  case ">":
1847
- case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`;
1847
+ case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`;
1848
1848
  case "contains":
1849
- case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
1849
+ case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
1850
1850
  case "beginswith":
1851
- case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
1851
+ case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
1852
1852
  case "endswith":
1853
- case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
1853
+ case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes$2(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
1854
1854
  case "null": return `${field} == null`;
1855
1855
  case "notnull": return `${field} != null`;
1856
1856
  case "in":
1857
1857
  case "notin": {
1858
1858
  const negate = shouldNegate$1(operatorTL) ? "!" : "";
1859
1859
  const valueAsArray = toArray(value);
1860
- return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes(val, escapeQuotes)}'`}`).join(" or ")})` : "";
1860
+ return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes$2(val, escapeQuotes)}'`}`).join(" or ")})` : "";
1861
1861
  }
1862
1862
  case "between":
1863
1863
  case "notbetween": {
@@ -1867,8 +1867,8 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
1867
1867
  const shouldParseNumbers = !(parseNumbers === false);
1868
1868
  const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
1869
1869
  const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
1870
- let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes(first, escapeQuotes)}'` : firstNum;
1871
- let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes(second, escapeQuotes)}'` : secondNum;
1870
+ let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes$2(first, escapeQuotes)}'` : firstNum;
1871
+ let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes$2(second, escapeQuotes)}'` : secondNum;
1872
1872
  if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
1873
1873
  const tempNum = secondNum;
1874
1874
  secondValue = firstNum;
@@ -1923,7 +1923,7 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
1923
1923
  valsOneAndTwoOnly[0] = secondNum;
1924
1924
  valsOneAndTwoOnly[1] = firstNum;
1925
1925
  }
1926
- 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"} `);
1926
+ 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"} `);
1927
1927
  }
1928
1928
  case "contains":
1929
1929
  case "doesnotcontain": return valueIsField ? concat(quoteValue("%"), wrapFieldName(value), quoteValue("%")) : quoteValue(`%${escapeValue(value)}%`);
@@ -1936,6 +1936,70 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
1936
1936
  return valueIsField ? wrapFieldName(value) : shouldRenderAsNumber(value, parseNumbers) ? `${trimIfString(value)}` : `${wrapAndEscape(value)}`;
1937
1937
  };
1938
1938
  //#endregion
1939
+ //#region src/utils/formatQuery/defaultRuleGroupProcessorCypher.ts
1940
+ /**
1941
+ * Maps a {@link DefaultCombinatorName} to a Cypher combinator keyword.
1942
+ *
1943
+ * @group Export
1944
+ */
1945
+ const cypherCombinatorMap = {
1946
+ and: "AND",
1947
+ or: "OR"
1948
+ };
1949
+ /**
1950
+ * Rule group processor used by {@link formatQuery} for "cypher" and "gql" formats.
1951
+ *
1952
+ * @group Export
1953
+ */
1954
+ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
1955
+ const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
1956
+ const processRuleGroup = (rg, outermost) => {
1957
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
1958
+ const processedRules = [];
1959
+ let precedingCombinator = "";
1960
+ let firstRule = true;
1961
+ for (const rule of rg.rules) {
1962
+ if (typeof rule === "string") {
1963
+ precedingCombinator = cypherCombinatorMap[rule];
1964
+ continue;
1965
+ }
1966
+ if (isRuleGroup(rule)) {
1967
+ const processedGroup = processRuleGroup(rule);
1968
+ if (processedGroup) {
1969
+ if (!firstRule && precedingCombinator) {
1970
+ processedRules.push(precedingCombinator);
1971
+ precedingCombinator = "";
1972
+ }
1973
+ firstRule = false;
1974
+ processedRules.push(processedGroup);
1975
+ }
1976
+ continue;
1977
+ }
1978
+ const [validationResult, fieldValidator] = validateRule(rule);
1979
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
1980
+ const fieldData = getOption(fields, rule.field);
1981
+ const processedRule = ruleProcessor(rule, {
1982
+ ...options,
1983
+ parseNumbers: getParseNumberBoolean(fieldData?.inputType),
1984
+ escapeQuotes: (rule.valueSource ?? "value") === "value",
1985
+ fieldData
1986
+ });
1987
+ if (processedRule) {
1988
+ if (!firstRule && precedingCombinator) {
1989
+ processedRules.push(precedingCombinator);
1990
+ precedingCombinator = "";
1991
+ }
1992
+ firstRule = false;
1993
+ processedRules.push(processedRule);
1994
+ }
1995
+ }
1996
+ const expression = processedRules.join(isRuleGroupType(rg) ? ` ${cypherCombinatorMap[rg.combinator]} ` : " ");
1997
+ const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "NOT " : ""}(`, ")"] : ["", ""];
1998
+ return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
1999
+ };
2000
+ return processRuleGroup(ruleGroup, true);
2001
+ };
2002
+ //#endregion
1939
2003
  //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
1940
2004
  /**
1941
2005
  * Default rule processor used by {@link formatQuery} for the "drizzle" format.
@@ -2103,6 +2167,67 @@ const defaultRuleGroupProcessorElasticSearch = (ruleGroup, options) => {
2103
2167
  return processedRuleGroup === false ? {} : processedRuleGroup;
2104
2168
  };
2105
2169
  //#endregion
2170
+ //#region src/utils/formatQuery/defaultRuleGroupProcessorGremlin.ts
2171
+ /**
2172
+ * Rule group processor used by {@link formatQuery} for "gremlin" format.
2173
+ *
2174
+ * At the top level, filter rules produce chained `.has()` steps (implicit AND).
2175
+ * Nested groups use `.and()` / `.or()` / `.not()` compound traversals with
2176
+ * `__` anonymous traversal prefixes.
2177
+ *
2178
+ * @group Export
2179
+ */
2180
+ const defaultRuleGroupProcessorGremlin = (ruleGroup, options) => {
2181
+ const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
2182
+ const validateAndProcess = (rule) => {
2183
+ // v8 ignore next -- @preserve
2184
+ if (typeof rule === "string" || isRuleGroup(rule)) return void 0;
2185
+ const [validationResult, fieldValidator] = validateRule(rule);
2186
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return;
2187
+ const fieldData = getOption(fields, rule.field);
2188
+ return ruleProcessor(rule, {
2189
+ ...options,
2190
+ parseNumbers: getParseNumberBoolean(fieldData?.inputType),
2191
+ escapeQuotes: (rule.valueSource ?? "value") === "value",
2192
+ fieldData
2193
+ });
2194
+ };
2195
+ /** Recursively processes a nested group into `.and()`/`.or()`/`.not()` form. */
2196
+ const processNested = (rg) => {
2197
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return "";
2198
+ const predicates = [];
2199
+ for (const rule of rg.rules) {
2200
+ if (typeof rule === "string") continue;
2201
+ if (isRuleGroup(rule)) {
2202
+ const nested = processNested(rule);
2203
+ if (nested) predicates.push(nested);
2204
+ continue;
2205
+ }
2206
+ const processed = validateAndProcess(rule);
2207
+ if (processed) predicates.push(processed);
2208
+ }
2209
+ if (predicates.length === 0) return "";
2210
+ const combinator = rg.combinator ?? "and";
2211
+ const prefix = rg.not ? "not" : combinator;
2212
+ if (predicates.length === 1 && !rg.not) return predicates[0];
2213
+ return `.${prefix}(${predicates.map((p) => p.startsWith(".") ? `__${p}` : p).join(", ")})`;
2214
+ };
2215
+ if (!isRuleOrGroupValid(ruleGroup, validationMap[ruleGroup.id ?? ""])) return fallbackExpression;
2216
+ const steps = [];
2217
+ for (const rule of ruleGroup.rules) {
2218
+ if (typeof rule === "string") continue;
2219
+ if (isRuleGroup(rule)) {
2220
+ const compound = processNested(rule);
2221
+ if (compound) steps.push(compound);
2222
+ continue;
2223
+ }
2224
+ const processed = validateAndProcess(rule);
2225
+ if (processed) steps.push(processed);
2226
+ }
2227
+ if (steps.length === 0) return fallbackExpression;
2228
+ return steps.join("");
2229
+ };
2230
+ //#endregion
2106
2231
  //#region src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts
2107
2232
  /**
2108
2233
  * Rule group processor used by {@link formatQuery} for "jsonata" format.
@@ -2273,7 +2398,7 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
2273
2398
  let firstRule = true;
2274
2399
  for (const rule of rg2.rules) {
2275
2400
  if (typeof rule === "string") {
2276
- precedingCombinator = `, ${translations[rule] ?? rule} `;
2401
+ precedingCombinator = `${translations.ruleSeparator ?? ", "}${translations[rule] ?? rule} `;
2277
2402
  continue;
2278
2403
  }
2279
2404
  if (isRuleGroup(rule)) {
@@ -2315,7 +2440,8 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
2315
2440
  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));
2316
2441
  const prefix = mustWrap ? `${prefixTL} (`.trim() : "";
2317
2442
  const suffix = mustWrap ? `) ${suffixTL}`.trim() : "";
2318
- return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `, ${translations[combinator] ?? combinator} ` : "")}${suffix}`;
2443
+ const sep = translations.ruleSeparator ?? ", ";
2444
+ return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `${sep}${translations[combinator] ?? combinator} ` : "")}${suffix}`;
2319
2445
  };
2320
2446
  return processRuleGroup(ruleGroup, true);
2321
2447
  };
@@ -2490,6 +2616,63 @@ const defaultRuleGroupProcessorSequelize = (ruleGroup, options) => {
2490
2616
  return processRuleGroup(convertFromIC(ruleGroup), true);
2491
2617
  };
2492
2618
  //#endregion
2619
+ //#region src/utils/formatQuery/defaultRuleGroupProcessorSPARQL.ts
2620
+ /**
2621
+ * Rule group processor used by {@link formatQuery} for "sparql" format.
2622
+ *
2623
+ * SPARQL uses the same combinators as CEL (`&&` / `||`) and `!()` for negation.
2624
+ *
2625
+ * @group Export
2626
+ */
2627
+ const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
2628
+ const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
2629
+ const processRuleGroup = (rg, outermost) => {
2630
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
2631
+ const processedRules = [];
2632
+ let precedingCombinator = "";
2633
+ let firstRule = true;
2634
+ for (const rule of rg.rules) {
2635
+ if (typeof rule === "string") {
2636
+ precedingCombinator = celCombinatorMap[rule];
2637
+ continue;
2638
+ }
2639
+ if (isRuleGroup(rule)) {
2640
+ const processedGroup = processRuleGroup(rule);
2641
+ if (processedGroup) {
2642
+ if (!firstRule && precedingCombinator) {
2643
+ processedRules.push(precedingCombinator);
2644
+ precedingCombinator = "";
2645
+ }
2646
+ firstRule = false;
2647
+ processedRules.push(processedGroup);
2648
+ }
2649
+ continue;
2650
+ }
2651
+ const [validationResult, fieldValidator] = validateRule(rule);
2652
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
2653
+ const fieldData = getOption(fields, rule.field);
2654
+ const processedRule = ruleProcessor(rule, {
2655
+ ...options,
2656
+ parseNumbers: getParseNumberBoolean(fieldData?.inputType),
2657
+ escapeQuotes: (rule.valueSource ?? "value") === "value",
2658
+ fieldData
2659
+ });
2660
+ if (processedRule) {
2661
+ if (!firstRule && precedingCombinator) {
2662
+ processedRules.push(precedingCombinator);
2663
+ precedingCombinator = "";
2664
+ }
2665
+ firstRule = false;
2666
+ processedRules.push(processedRule);
2667
+ }
2668
+ }
2669
+ const expression = processedRules.join(isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator]} ` : " ");
2670
+ const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "!" : ""}(`, ")"] : ["", ""];
2671
+ return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
2672
+ };
2673
+ return processRuleGroup(ruleGroup, true);
2674
+ };
2675
+ //#endregion
2493
2676
  //#region src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts
2494
2677
  /**
2495
2678
  * Default rule processor used by {@link formatQuery} for "sql" format.
@@ -2865,6 +3048,59 @@ const getFieldValidatorReasons = (rule, fieldValidator) => {
2865
3048
  }
2866
3049
  };
2867
3050
  //#endregion
3051
+ //#region src/utils/formatQuery/defaultRuleProcessorCypher.ts
3052
+ const escapeSingleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
3053
+ /**
3054
+ * Default rule processor used by {@link formatQuery} for "cypher" and "gql" formats.
3055
+ *
3056
+ * @group Export
3057
+ */
3058
+ const defaultRuleProcessorCypher = (rule, opts = {}) => {
3059
+ const { escapeQuotes, parseNumbers } = opts;
3060
+ const { field, operator, value, valueSource } = rule;
3061
+ const valueIsField = valueSource === "field";
3062
+ const operatorTL = operator.toLowerCase();
3063
+ const fmtVal = (v) => {
3064
+ if (v === null || v === void 0) return "null";
3065
+ if (typeof v === "boolean" || typeof v === "bigint") return String(v);
3066
+ if (valueIsField) return trimIfString(v);
3067
+ if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
3068
+ return `'${escapeSingleQuotes$1(v, escapeQuotes)}'`;
3069
+ };
3070
+ switch (operatorTL) {
3071
+ case "=": return `${field} = ${fmtVal(value)}`;
3072
+ case "!=":
3073
+ case "<>": return `${field} <> ${fmtVal(value)}`;
3074
+ case "<":
3075
+ case ">":
3076
+ case "<=":
3077
+ case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
3078
+ case "contains": return `${field} CONTAINS ${fmtVal(value)}`;
3079
+ case "doesnotcontain": return `NOT ${field} CONTAINS ${fmtVal(value)}`;
3080
+ case "beginswith": return `${field} STARTS WITH ${fmtVal(value)}`;
3081
+ case "doesnotbeginwith": return `NOT ${field} STARTS WITH ${fmtVal(value)}`;
3082
+ case "endswith": return `${field} ENDS WITH ${fmtVal(value)}`;
3083
+ case "doesnotendwith": return `NOT ${field} ENDS WITH ${fmtVal(value)}`;
3084
+ case "null": return `${field} IS NULL`;
3085
+ case "notnull": return `${field} IS NOT NULL`;
3086
+ case "in":
3087
+ case "notin": {
3088
+ const values = toArray(value).map(fmtVal);
3089
+ if (!values.length) return "";
3090
+ return `${operatorTL === "notin" ? "NOT " : ""}${field} IN [${values.join(", ")}]`;
3091
+ }
3092
+ case "between":
3093
+ case "notbetween": {
3094
+ const arr = toArray(value);
3095
+ if (arr.length < 2) return "";
3096
+ const [low, high] = [fmtVal(arr[0]), fmtVal(arr[1])];
3097
+ const expr = `${low} <= ${field} AND ${field} <= ${high}`;
3098
+ return operatorTL === "notbetween" ? `NOT (${expr})` : expr;
3099
+ }
3100
+ default: return `${field} ${operator} ${fmtVal(value)}`;
3101
+ }
3102
+ };
3103
+ //#endregion
2868
3104
  //#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
2869
3105
  const rangeOperatorMap = {
2870
3106
  "<": "lt",
@@ -3016,6 +3252,68 @@ const defaultRuleProcessorElasticSearch = (rule, options = {}) => {
3016
3252
  return false;
3017
3253
  };
3018
3254
  //#endregion
3255
+ //#region src/utils/formatQuery/defaultRuleProcessorGremlin.ts
3256
+ const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
3257
+ /**
3258
+ * Default rule processor used by {@link formatQuery} for "gremlin" format.
3259
+ *
3260
+ * Each rule becomes a `.has()` step (or `.hasNot()`/`.has()` for null checks).
3261
+ *
3262
+ * @group Export
3263
+ */
3264
+ const defaultRuleProcessorGremlin = (rule, opts = {}) => {
3265
+ const { escapeQuotes, parseNumbers } = opts;
3266
+ const { field, operator, value, valueSource } = rule;
3267
+ const valueIsField = valueSource === "field";
3268
+ const operatorTL = operator.toLowerCase();
3269
+ const prop = field.includes(".") ? field.split(".").pop() : field;
3270
+ const fmtVal = (v) => {
3271
+ if (v === null || v === void 0) return "null";
3272
+ if (typeof v === "boolean" || typeof v === "bigint") return String(v);
3273
+ if (valueIsField) return trimIfString(v);
3274
+ if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
3275
+ return `'${escapeSingleQuotes(v, escapeQuotes)}'`;
3276
+ };
3277
+ switch (operatorTL) {
3278
+ case "=": return `.has('${prop}', ${fmtVal(value)})`;
3279
+ case "!=":
3280
+ case "<>": return `.has('${prop}', neq(${fmtVal(value)}))`;
3281
+ case "<": return `.has('${prop}', lt(${fmtVal(value)}))`;
3282
+ case ">": return `.has('${prop}', gt(${fmtVal(value)}))`;
3283
+ case "<=": return `.has('${prop}', lte(${fmtVal(value)}))`;
3284
+ case ">=": return `.has('${prop}', gte(${fmtVal(value)}))`;
3285
+ case "contains": return `.has('${prop}', containing(${fmtVal(value)}))`;
3286
+ case "doesnotcontain": return `.has('${prop}', notContaining(${fmtVal(value)}))`;
3287
+ case "beginswith": return `.has('${prop}', startingWith(${fmtVal(value)}))`;
3288
+ case "doesnotbeginwith": return `.has('${prop}', notStartingWith(${fmtVal(value)}))`;
3289
+ case "endswith": return `.has('${prop}', endingWith(${fmtVal(value)}))`;
3290
+ case "doesnotendwith": return `.has('${prop}', notEndingWith(${fmtVal(value)}))`;
3291
+ case "null": return `.hasNot('${prop}')`;
3292
+ case "notnull": return `.has('${prop}')`;
3293
+ case "in": {
3294
+ const items = toArray(value).map(fmtVal);
3295
+ if (!items.length) return "";
3296
+ return `.has('${prop}', within(${items.join(", ")}))`;
3297
+ }
3298
+ case "notin": {
3299
+ const items = toArray(value).map(fmtVal);
3300
+ if (!items.length) return "";
3301
+ return `.has('${prop}', without(${items.join(", ")}))`;
3302
+ }
3303
+ case "between": {
3304
+ const arr = toArray(value);
3305
+ if (arr.length < 2) return "";
3306
+ return `.has('${prop}', between(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
3307
+ }
3308
+ case "notbetween": {
3309
+ const arr = toArray(value);
3310
+ if (arr.length < 2) return "";
3311
+ return `.has('${prop}', outside(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
3312
+ }
3313
+ default: return `.has('${prop}', ${fmtVal(value)})`;
3314
+ }
3315
+ };
3316
+ //#endregion
3019
3317
  //#region src/utils/formatQuery/defaultRuleProcessorJSONata.ts
3020
3318
  const shouldNegate = (op) => op.startsWith("not") || op.startsWith("doesnot");
3021
3319
  const quote = (v, escapeQuotes) => `"${typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`)}"`;
@@ -3270,6 +3568,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
3270
3568
  const orTL = t.or ?? "or";
3271
3569
  const trueTL = t.true ?? "true";
3272
3570
  const falseTL = t.false ?? "false";
3571
+ const listSep = t.listSeparator ?? ", ";
3572
+ const useOxfordComma = !t.listSeparator;
3273
3573
  switch (operatorLowerCase) {
3274
3574
  case "null":
3275
3575
  case "notnull": return "";
@@ -3289,7 +3589,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
3289
3589
  if (valueAsArray.length === 0) return "";
3290
3590
  const valStringArray = valueAsArray.map((v) => valueIsField ? wrapFieldName(getOption(fields ?? [], v)?.label ?? v) : shouldRenderAsNumber(v, parseNumbers) ? `${trimIfString(v)}` : `${wrapAndEscape(v)}`);
3291
3591
  if (valStringArray.length === 1) return valStringArray[0];
3292
- return `(${`${valStringArray.slice(0, -1).join(", ")}${valStringArray.length > 2 ? "," : ""} ${orTL} ${valStringArray.at(-1)}`})`;
3592
+ const oxfordComma = useOxfordComma && valStringArray.length > 2 ? "," : "";
3593
+ return `(${`${valStringArray.slice(0, -1).join(listSep)}${oxfordComma} ${orTL} ${valStringArray.at(-1)}`})`;
3293
3594
  }
3294
3595
  }
3295
3596
  if (typeof rule.value === "boolean") return rule.value ? trueTL : falseTL;
@@ -3402,7 +3703,14 @@ const defaultRuleProcessorNL = (rule, opts) => {
3402
3703
  V: operatorProcessor(rule, opts),
3403
3704
  O: value
3404
3705
  };
3405
- return normalizeConstituentWordOrder(wordOrder).map((term) => `${wordOrderMap[term]}`).join(" ").trim();
3706
+ const translations = opts?.translations ?? {};
3707
+ const suffixMap = {
3708
+ S: translations.afterSubject ?? " ",
3709
+ V: translations.afterVerb ?? " ",
3710
+ O: translations.afterObject ?? " "
3711
+ };
3712
+ const wordOrderTuple = normalizeConstituentWordOrder(wordOrder).filter((term) => wordOrderMap[term] !== "");
3713
+ return wordOrderTuple.map((term, i) => `${wordOrderMap[term]}${i < wordOrderTuple.length - 1 ? suffixMap[term] : ""}`).join("").trim();
3406
3714
  };
3407
3715
  //#endregion
3408
3716
  //#region src/utils/formatQuery/defaultRuleProcessorSQL.ts
@@ -3638,8 +3946,11 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
3638
3946
  const valueIsField = valueSource === "field";
3639
3947
  const operatorLC = lc(operator);
3640
3948
  if (!Op || valueIsField && (!col || !fn && [
3949
+ "contains",
3641
3950
  "doesnotcontain",
3951
+ "beginswith",
3642
3952
  "doesnotbeginwith",
3953
+ "endswith",
3643
3954
  "doesnotendwith"
3644
3955
  ].includes(operatorLC))) return;
3645
3956
  switch (operatorLC) {
@@ -3659,9 +3970,9 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
3659
3970
  }[operatorLC];
3660
3971
  return { [field]: valueIsField && operatorLC === "=" ? { [Op.col]: value } : { [sequelizeOperator]: valueIsField ? col(value) : shouldRenderAsNumber(value, parseNumbers) ? parseNumber(value, { parseNumbers: "strict" }) : value } };
3661
3972
  }
3662
- case "contains": return { [field]: { [Op.substring]: valueIsField ? col(value) : `${value}` } };
3663
- case "beginswith": return { [field]: { [Op.startsWith]: valueIsField ? col(value) : `${value}` } };
3664
- case "endswith": return { [field]: { [Op.endsWith]: valueIsField ? col(value) : `${value}` } };
3973
+ case "contains": return { [field]: { [valueIsField ? Op.like : Op.substring]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `${value}` } };
3974
+ case "beginswith": return { [field]: { [valueIsField ? Op.like : Op.startsWith]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}` } };
3975
+ case "endswith": return { [field]: { [valueIsField ? Op.like : Op.endsWith]: valueIsField ? fn("CONCAT", "%", col(value)) : `${value}` } };
3665
3976
  case "doesnotcontain": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `%${value}%` } };
3666
3977
  case "doesnotbeginwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}%` } };
3667
3978
  case "doesnotendwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value)) : `%${value}` } };
@@ -3691,6 +4002,74 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
3691
4002
  }
3692
4003
  };
3693
4004
  //#endregion
4005
+ //#region src/utils/formatQuery/defaultRuleProcessorSPARQL.ts
4006
+ const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
4007
+ /** Auto-prefix a SPARQL variable name with `?` unless it's already prefixed, a URI, or a prefixed name.
4008
+ *
4009
+ * @group Export
4010
+ */
4011
+ const sparqlVar = (name) => /^[?<]/.test(name) || name.includes(":") ? name : `?${name}`;
4012
+ /**
4013
+ * Default rule processor used by {@link formatQuery} for "sparql" format.
4014
+ *
4015
+ * @group Export
4016
+ */
4017
+ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
4018
+ const { escapeQuotes, parseNumbers } = opts;
4019
+ const { field: rawField, operator, value, valueSource } = rule;
4020
+ const valueIsField = valueSource === "field";
4021
+ const operatorTL = operator.toLowerCase();
4022
+ const field = sparqlVar(rawField);
4023
+ const fmtVal = (v) => {
4024
+ if (v === null || v === void 0) return "\"\"";
4025
+ if (typeof v === "boolean") return `"${v}"^^xsd:boolean`;
4026
+ if (typeof v === "bigint") return String(v);
4027
+ if (valueIsField) return sparqlVar(trimIfString(v));
4028
+ if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
4029
+ const s = typeof v === "string" ? v : JSON.stringify(v) ?? "";
4030
+ if (s.startsWith("?") || s.startsWith("<") || s.includes(":")) return s;
4031
+ return `"${escapeDoubleQuotes(s, escapeQuotes)}"`;
4032
+ };
4033
+ switch (operatorTL) {
4034
+ case "=":
4035
+ case "!=":
4036
+ case "<":
4037
+ case ">":
4038
+ case "<=":
4039
+ case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
4040
+ case "<>": return `${field} != ${fmtVal(value)}`;
4041
+ case "contains": return `CONTAINS(${field}, ${fmtVal(value)})`;
4042
+ case "doesnotcontain": return `!CONTAINS(${field}, ${fmtVal(value)})`;
4043
+ case "beginswith": return `STRSTARTS(${field}, ${fmtVal(value)})`;
4044
+ case "doesnotbeginwith": return `!STRSTARTS(${field}, ${fmtVal(value)})`;
4045
+ case "endswith": return `STRENDS(${field}, ${fmtVal(value)})`;
4046
+ case "doesnotendwith": return `!STRENDS(${field}, ${fmtVal(value)})`;
4047
+ case "null": return `!BOUND(${field})`;
4048
+ case "notnull": return `BOUND(${field})`;
4049
+ case "in": {
4050
+ const items = toArray(value).map(fmtVal);
4051
+ if (!items.length) return "";
4052
+ return `${field} IN (${items.join(", ")})`;
4053
+ }
4054
+ case "notin": {
4055
+ const items = toArray(value).map(fmtVal);
4056
+ if (!items.length) return "";
4057
+ return `${field} NOT IN (${items.join(", ")})`;
4058
+ }
4059
+ case "between": {
4060
+ const arr = toArray(value);
4061
+ if (arr.length < 2) return "";
4062
+ return `${field} >= ${fmtVal(arr[0])} && ${field} <= ${fmtVal(arr[1])}`;
4063
+ }
4064
+ case "notbetween": {
4065
+ const arr = toArray(value);
4066
+ if (arr.length < 2) return "";
4067
+ return `(${field} < ${fmtVal(arr[0])} || ${field} > ${fmtVal(arr[1])})`;
4068
+ }
4069
+ default: return `${field} ${operator} ${fmtVal(value)}`;
4070
+ }
4071
+ };
4072
+ //#endregion
3694
4073
  //#region src/utils/formatQuery/formatQuery.ts
3695
4074
  /**
3696
4075
  * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
@@ -3738,6 +4117,10 @@ const defaultRuleProcessors = {
3738
4117
  sequelize: defaultRuleProcessorSequelize,
3739
4118
  spel: defaultRuleProcessorSpEL,
3740
4119
  sql: defaultRuleProcessorSQL,
4120
+ cypher: defaultRuleProcessorCypher,
4121
+ gql: defaultRuleProcessorCypher,
4122
+ sparql: defaultRuleProcessorSPARQL,
4123
+ gremlin: defaultRuleProcessorGremlin,
3741
4124
  diagnostics: defaultRuleProcessorSQL
3742
4125
  };
3743
4126
  /* v8 ignore next -- @preserve */
@@ -3760,6 +4143,10 @@ const defaultOperatorProcessors = {
3760
4143
  sequelize: defaultOperatorProcessor,
3761
4144
  spel: defaultOperatorProcessor,
3762
4145
  sql: defaultOperatorProcessorSQL,
4146
+ cypher: defaultOperatorProcessor,
4147
+ gql: defaultOperatorProcessor,
4148
+ sparql: defaultOperatorProcessor,
4149
+ gremlin: defaultOperatorProcessor,
3763
4150
  diagnostics: defaultOperatorProcessor
3764
4151
  };
3765
4152
  const defaultFallbackExpressions = {
@@ -3767,6 +4154,8 @@ const defaultFallbackExpressions = {
3767
4154
  ldap: "",
3768
4155
  mongodb: "\"$and\":[{\"$expr\":true}]",
3769
4156
  natural_language: "1 is 1",
4157
+ sparql: "1 = 1",
4158
+ gremlin: "",
3770
4159
  spel: "1 == 1",
3771
4160
  sql: "(1 = 1)"
3772
4161
  };
@@ -3907,6 +4296,10 @@ function formatQuery(ruleGroup, optionParam = {}) {
3907
4296
  case "prisma": return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);
3908
4297
  case "drizzle": return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);
3909
4298
  case "sequelize": return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);
4299
+ case "cypher":
4300
+ case "gql": return defaultRuleGroupProcessorCypher(ruleGroup, finalOptions);
4301
+ case "sparql": return defaultRuleGroupProcessorSPARQL(ruleGroup, finalOptions);
4302
+ case "gremlin": return defaultRuleGroupProcessorGremlin(ruleGroup, finalOptions);
3910
4303
  case "diagnostics": return defaultRuleGroupProcessorDiagnostics(ruleGroup, finalOptions);
3911
4304
  default: return "";
3912
4305
  }
@@ -4630,6 +5023,7 @@ exports.clsx = clsx;
4630
5023
  exports.convertFromIC = convertFromIC;
4631
5024
  exports.convertQuery = convertQuery;
4632
5025
  exports.convertToIC = convertToIC;
5026
+ exports.cypherCombinatorMap = cypherCombinatorMap;
4633
5027
  exports.defaultCELValueProcessor = defaultCELValueProcessor;
4634
5028
  exports.defaultCombinatorLabelMap = defaultCombinatorLabelMap;
4635
5029
  exports.defaultCombinators = defaultCombinators;
@@ -4657,9 +5051,11 @@ exports.defaultPlaceholderValueGroupLabel = defaultPlaceholderValueGroupLabel;
4657
5051
  exports.defaultPlaceholderValueLabel = defaultPlaceholderValueLabel;
4658
5052
  exports.defaultPlaceholderValueName = defaultPlaceholderValueName;
4659
5053
  exports.defaultRuleGroupProcessorCEL = defaultRuleGroupProcessorCEL;
5054
+ exports.defaultRuleGroupProcessorCypher = defaultRuleGroupProcessorCypher;
4660
5055
  exports.defaultRuleGroupProcessorDiagnostics = defaultRuleGroupProcessorDiagnostics;
4661
5056
  exports.defaultRuleGroupProcessorDrizzle = defaultRuleGroupProcessorDrizzle;
4662
5057
  exports.defaultRuleGroupProcessorElasticSearch = defaultRuleGroupProcessorElasticSearch;
5058
+ exports.defaultRuleGroupProcessorGremlin = defaultRuleGroupProcessorGremlin;
4663
5059
  exports.defaultRuleGroupProcessorJSONata = defaultRuleGroupProcessorJSONata;
4664
5060
  exports.defaultRuleGroupProcessorJsonLogic = defaultRuleGroupProcessorJsonLogic;
4665
5061
  exports.defaultRuleGroupProcessorLDAP = defaultRuleGroupProcessorLDAP;
@@ -4668,12 +5064,15 @@ exports.defaultRuleGroupProcessorMongoDBQuery = defaultRuleGroupProcessorMongoDB
4668
5064
  exports.defaultRuleGroupProcessorNL = defaultRuleGroupProcessorNL;
4669
5065
  exports.defaultRuleGroupProcessorParameterized = defaultRuleGroupProcessorParameterized;
4670
5066
  exports.defaultRuleGroupProcessorPrisma = defaultRuleGroupProcessorPrisma;
5067
+ exports.defaultRuleGroupProcessorSPARQL = defaultRuleGroupProcessorSPARQL;
4671
5068
  exports.defaultRuleGroupProcessorSQL = defaultRuleGroupProcessorSQL;
4672
5069
  exports.defaultRuleGroupProcessorSequelize = defaultRuleGroupProcessorSequelize;
4673
5070
  exports.defaultRuleGroupProcessorSpEL = defaultRuleGroupProcessorSpEL;
4674
5071
  exports.defaultRuleProcessorCEL = defaultRuleProcessorCEL;
5072
+ exports.defaultRuleProcessorCypher = defaultRuleProcessorCypher;
4675
5073
  exports.defaultRuleProcessorDrizzle = defaultRuleProcessorDrizzle;
4676
5074
  exports.defaultRuleProcessorElasticSearch = defaultRuleProcessorElasticSearch;
5075
+ exports.defaultRuleProcessorGremlin = defaultRuleProcessorGremlin;
4677
5076
  exports.defaultRuleProcessorJSONata = defaultRuleProcessorJSONata;
4678
5077
  exports.defaultRuleProcessorJsonLogic = defaultRuleProcessorJsonLogic;
4679
5078
  exports.defaultRuleProcessorLDAP = defaultRuleProcessorLDAP;
@@ -4682,6 +5081,7 @@ exports.defaultRuleProcessorMongoDBQuery = defaultRuleProcessorMongoDBQuery;
4682
5081
  exports.defaultRuleProcessorNL = defaultRuleProcessorNL;
4683
5082
  exports.defaultRuleProcessorParameterized = defaultRuleProcessorParameterized;
4684
5083
  exports.defaultRuleProcessorPrisma = defaultRuleProcessorPrisma;
5084
+ exports.defaultRuleProcessorSPARQL = defaultRuleProcessorSPARQL;
4685
5085
  exports.defaultRuleProcessorSQL = defaultRuleProcessorSQL;
4686
5086
  exports.defaultRuleProcessorSequelize = defaultRuleProcessorSequelize;
4687
5087
  exports.defaultRuleProcessorSpEL = defaultRuleProcessorSpEL;
@@ -4777,6 +5177,7 @@ exports.remove = remove;
4777
5177
  exports.removeInPlace = removeInPlace;
4778
5178
  exports.rootPath = rootPath;
4779
5179
  exports.shouldRenderAsNumber = shouldRenderAsNumber;
5180
+ exports.sparqlVar = sparqlVar;
4780
5181
  exports.splitBy = splitBy;
4781
5182
  exports.sqlDialectPresets = sqlDialectPresets;
4782
5183
  exports.standardClassnames = standardClassnames;