@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
@@ -1481,7 +1481,7 @@ const defaultRuleGroupProcessorCEL = (ruleGroup, options) => {
1481
1481
  //#endregion
1482
1482
  //#region src/utils/formatQuery/defaultRuleProcessorCEL.ts
1483
1483
  const shouldNegate$2 = (op) => op.startsWith("not") || op.startsWith("doesnot");
1484
- const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
1484
+ const escapeDoubleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
1485
1485
  /**
1486
1486
  * Default rule processor used by {@link formatQuery} for "cel" format.
1487
1487
  *
@@ -1523,19 +1523,19 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
1523
1523
  case "==":
1524
1524
  case "!=":
1525
1525
  case ">":
1526
- case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`}`;
1526
+ case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`}`;
1527
1527
  case "contains":
1528
- case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
1528
+ case "doesnotcontain": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.contains(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
1529
1529
  case "beginswith":
1530
- case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
1530
+ case "doesnotbeginwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.startsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
1531
1531
  case "endswith":
1532
- case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes(value, escapeQuotes)}"`})`;
1532
+ case "doesnotendwith": return `${shouldNegate$2(operatorTL) ? "!" : ""}${field}.endsWith(${valueIsField ? trimIfString(value) : `"${escapeDoubleQuotes$1(value, escapeQuotes)}"`})`;
1533
1533
  case "null": return `${field} == null`;
1534
1534
  case "notnull": return `${field} != null`;
1535
1535
  case "in":
1536
1536
  case "notin": {
1537
1537
  const [prefix, suffix] = shouldNegate$2(operatorTL) ? ["!(", ")"] : ["", ""];
1538
- return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
1538
+ return `${prefix}${field} in [${toArray(value).map((val) => valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `"${escapeDoubleQuotes$1(val, escapeQuotes)}"`).join(", ")}]${suffix}`;
1539
1539
  }
1540
1540
  case "between":
1541
1541
  case "notbetween": {
@@ -1545,8 +1545,8 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
1545
1545
  const shouldParseNumbers = !(parseNumbers === false);
1546
1546
  const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
1547
1547
  const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
1548
- let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes(first, escapeQuotes)}"` : firstNum;
1549
- let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes(second, escapeQuotes)}"` : secondNum;
1548
+ let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `"${escapeDoubleQuotes$1(first, escapeQuotes)}"` : firstNum;
1549
+ let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `"${escapeDoubleQuotes$1(second, escapeQuotes)}"` : secondNum;
1550
1550
  if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
1551
1551
  const tempNum = secondNum;
1552
1552
  secondValue = firstNum;
@@ -1802,7 +1802,7 @@ const defaultRuleGroupProcessorSpEL = (ruleGroup, options) => {
1802
1802
  //#region src/utils/formatQuery/defaultRuleProcessorSpEL.ts
1803
1803
  const shouldNegate$1 = (op) => op.startsWith("not") || op.startsWith("doesnot");
1804
1804
  const wrapInNegation = (clause, negate) => negate ? `!(${clause})` : clause;
1805
- const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
1805
+ const escapeSingleQuotes$2 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\'`);
1806
1806
  /**
1807
1807
  * Default rule processor used by {@link formatQuery} for "spel" format.
1808
1808
  *
@@ -1843,20 +1843,20 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
1843
1843
  case "==":
1844
1844
  case "!=":
1845
1845
  case ">":
1846
- case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`;
1846
+ case ">=": return `${field} ${operatorTL} ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`;
1847
1847
  case "contains":
1848
- case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
1848
+ case "doesnotcontain": return wrapInNegation(`${field} matches ${valueIsField || useBareValue ? trimIfString(value) : `'${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
1849
1849
  case "beginswith":
1850
- case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
1850
+ case "doesnotbeginwith": return wrapInNegation(`${field} matches ${valueIsField ? `'^'.concat(${trimIfString(value)})` : `'${typeof value === "string" && !value.startsWith("^") || useBareValue ? "^" : ""}${escapeSingleQuotes$2(value, escapeQuotes)}'`}`, shouldNegate$1(operatorTL));
1851
1851
  case "endswith":
1852
- case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
1852
+ case "doesnotendwith": return wrapInNegation(`${field} matches ${valueIsField ? `${trimIfString(value)}.concat('$')` : `'${escapeSingleQuotes$2(value, escapeQuotes)}${typeof value === "string" && !value.endsWith("$") || useBareValue ? "$" : ""}'`}`, shouldNegate$1(operatorTL));
1853
1853
  case "null": return `${field} == null`;
1854
1854
  case "notnull": return `${field} != null`;
1855
1855
  case "in":
1856
1856
  case "notin": {
1857
1857
  const negate = shouldNegate$1(operatorTL) ? "!" : "";
1858
1858
  const valueAsArray = toArray(value);
1859
- return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes(val, escapeQuotes)}'`}`).join(" or ")})` : "";
1859
+ return valueAsArray.length > 0 ? `${negate}(${valueAsArray.map((val) => `${field} == ${valueIsField || shouldRenderAsNumber(val, parseNumbers) ? `${trimIfString(val)}` : `'${escapeSingleQuotes$2(val, escapeQuotes)}'`}`).join(" or ")})` : "";
1860
1860
  }
1861
1861
  case "between":
1862
1862
  case "notbetween": {
@@ -1866,8 +1866,8 @@ const defaultRuleProcessorSpEL = (rule, opts = {}) => {
1866
1866
  const shouldParseNumbers = !(parseNumbers === false);
1867
1867
  const firstNum = shouldRenderAsNumber(first, shouldParseNumbers) ? parseNumber(first, { parseNumbers: shouldParseNumbers }) : NaN;
1868
1868
  const secondNum = shouldRenderAsNumber(second, shouldParseNumbers) ? parseNumber(second, { parseNumbers: shouldParseNumbers }) : NaN;
1869
- let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes(first, escapeQuotes)}'` : firstNum;
1870
- let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes(second, escapeQuotes)}'` : secondNum;
1869
+ let firstValue = Number.isNaN(firstNum) ? valueIsField ? `${first}` : `'${escapeSingleQuotes$2(first, escapeQuotes)}'` : firstNum;
1870
+ let secondValue = Number.isNaN(secondNum) ? valueIsField ? `${second}` : `'${escapeSingleQuotes$2(second, escapeQuotes)}'` : secondNum;
1871
1871
  if (!preserveValueOrder && firstValue === firstNum && secondValue === secondNum && secondNum < firstNum) {
1872
1872
  const tempNum = secondNum;
1873
1873
  secondValue = firstNum;
@@ -1922,7 +1922,7 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
1922
1922
  valsOneAndTwoOnly[0] = secondNum;
1923
1923
  valsOneAndTwoOnly[1] = firstNum;
1924
1924
  }
1925
- 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"} `);
1925
+ 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"} `);
1926
1926
  }
1927
1927
  case "contains":
1928
1928
  case "doesnotcontain": return valueIsField ? concat(quoteValue("%"), wrapFieldName(value), quoteValue("%")) : quoteValue(`%${escapeValue(value)}%`);
@@ -1935,6 +1935,70 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
1935
1935
  return valueIsField ? wrapFieldName(value) : shouldRenderAsNumber(value, parseNumbers) ? `${trimIfString(value)}` : `${wrapAndEscape(value)}`;
1936
1936
  };
1937
1937
  //#endregion
1938
+ //#region src/utils/formatQuery/defaultRuleGroupProcessorCypher.ts
1939
+ /**
1940
+ * Maps a {@link DefaultCombinatorName} to a Cypher combinator keyword.
1941
+ *
1942
+ * @group Export
1943
+ */
1944
+ const cypherCombinatorMap = {
1945
+ and: "AND",
1946
+ or: "OR"
1947
+ };
1948
+ /**
1949
+ * Rule group processor used by {@link formatQuery} for "cypher" and "gql" formats.
1950
+ *
1951
+ * @group Export
1952
+ */
1953
+ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
1954
+ const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
1955
+ const processRuleGroup = (rg, outermost) => {
1956
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
1957
+ const processedRules = [];
1958
+ let precedingCombinator = "";
1959
+ let firstRule = true;
1960
+ for (const rule of rg.rules) {
1961
+ if (typeof rule === "string") {
1962
+ precedingCombinator = cypherCombinatorMap[rule];
1963
+ continue;
1964
+ }
1965
+ if (isRuleGroup(rule)) {
1966
+ const processedGroup = processRuleGroup(rule);
1967
+ if (processedGroup) {
1968
+ if (!firstRule && precedingCombinator) {
1969
+ processedRules.push(precedingCombinator);
1970
+ precedingCombinator = "";
1971
+ }
1972
+ firstRule = false;
1973
+ processedRules.push(processedGroup);
1974
+ }
1975
+ continue;
1976
+ }
1977
+ const [validationResult, fieldValidator] = validateRule(rule);
1978
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
1979
+ const fieldData = getOption(fields, rule.field);
1980
+ const processedRule = ruleProcessor(rule, {
1981
+ ...options,
1982
+ parseNumbers: getParseNumberBoolean(fieldData?.inputType),
1983
+ escapeQuotes: (rule.valueSource ?? "value") === "value",
1984
+ fieldData
1985
+ });
1986
+ if (processedRule) {
1987
+ if (!firstRule && precedingCombinator) {
1988
+ processedRules.push(precedingCombinator);
1989
+ precedingCombinator = "";
1990
+ }
1991
+ firstRule = false;
1992
+ processedRules.push(processedRule);
1993
+ }
1994
+ }
1995
+ const expression = processedRules.join(isRuleGroupType(rg) ? ` ${cypherCombinatorMap[rg.combinator]} ` : " ");
1996
+ const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "NOT " : ""}(`, ")"] : ["", ""];
1997
+ return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
1998
+ };
1999
+ return processRuleGroup(ruleGroup, true);
2000
+ };
2001
+ //#endregion
1938
2002
  //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
1939
2003
  /**
1940
2004
  * Default rule processor used by {@link formatQuery} for the "drizzle" format.
@@ -2102,6 +2166,67 @@ const defaultRuleGroupProcessorElasticSearch = (ruleGroup, options) => {
2102
2166
  return processedRuleGroup === false ? {} : processedRuleGroup;
2103
2167
  };
2104
2168
  //#endregion
2169
+ //#region src/utils/formatQuery/defaultRuleGroupProcessorGremlin.ts
2170
+ /**
2171
+ * Rule group processor used by {@link formatQuery} for "gremlin" format.
2172
+ *
2173
+ * At the top level, filter rules produce chained `.has()` steps (implicit AND).
2174
+ * Nested groups use `.and()` / `.or()` / `.not()` compound traversals with
2175
+ * `__` anonymous traversal prefixes.
2176
+ *
2177
+ * @group Export
2178
+ */
2179
+ const defaultRuleGroupProcessorGremlin = (ruleGroup, options) => {
2180
+ const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
2181
+ const validateAndProcess = (rule) => {
2182
+ // v8 ignore next -- @preserve
2183
+ if (typeof rule === "string" || isRuleGroup(rule)) return void 0;
2184
+ const [validationResult, fieldValidator] = validateRule(rule);
2185
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) return;
2186
+ const fieldData = getOption(fields, rule.field);
2187
+ return ruleProcessor(rule, {
2188
+ ...options,
2189
+ parseNumbers: getParseNumberBoolean(fieldData?.inputType),
2190
+ escapeQuotes: (rule.valueSource ?? "value") === "value",
2191
+ fieldData
2192
+ });
2193
+ };
2194
+ /** Recursively processes a nested group into `.and()`/`.or()`/`.not()` form. */
2195
+ const processNested = (rg) => {
2196
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return "";
2197
+ const predicates = [];
2198
+ for (const rule of rg.rules) {
2199
+ if (typeof rule === "string") continue;
2200
+ if (isRuleGroup(rule)) {
2201
+ const nested = processNested(rule);
2202
+ if (nested) predicates.push(nested);
2203
+ continue;
2204
+ }
2205
+ const processed = validateAndProcess(rule);
2206
+ if (processed) predicates.push(processed);
2207
+ }
2208
+ if (predicates.length === 0) return "";
2209
+ const combinator = rg.combinator ?? "and";
2210
+ const prefix = rg.not ? "not" : combinator;
2211
+ if (predicates.length === 1 && !rg.not) return predicates[0];
2212
+ return `.${prefix}(${predicates.map((p) => p.startsWith(".") ? `__${p}` : p).join(", ")})`;
2213
+ };
2214
+ if (!isRuleOrGroupValid(ruleGroup, validationMap[ruleGroup.id ?? ""])) return fallbackExpression;
2215
+ const steps = [];
2216
+ for (const rule of ruleGroup.rules) {
2217
+ if (typeof rule === "string") continue;
2218
+ if (isRuleGroup(rule)) {
2219
+ const compound = processNested(rule);
2220
+ if (compound) steps.push(compound);
2221
+ continue;
2222
+ }
2223
+ const processed = validateAndProcess(rule);
2224
+ if (processed) steps.push(processed);
2225
+ }
2226
+ if (steps.length === 0) return fallbackExpression;
2227
+ return steps.join("");
2228
+ };
2229
+ //#endregion
2105
2230
  //#region src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts
2106
2231
  /**
2107
2232
  * Rule group processor used by {@link formatQuery} for "jsonata" format.
@@ -2272,7 +2397,7 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
2272
2397
  let firstRule = true;
2273
2398
  for (const rule of rg2.rules) {
2274
2399
  if (typeof rule === "string") {
2275
- precedingCombinator = `, ${translations[rule] ?? rule} `;
2400
+ precedingCombinator = `${translations.ruleSeparator ?? ", "}${translations[rule] ?? rule} `;
2276
2401
  continue;
2277
2402
  }
2278
2403
  if (isRuleGroup(rule)) {
@@ -2314,7 +2439,8 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
2314
2439
  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));
2315
2440
  const prefix = mustWrap ? `${prefixTL} (`.trim() : "";
2316
2441
  const suffix = mustWrap ? `) ${suffixTL}`.trim() : "";
2317
- return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `, ${translations[combinator] ?? combinator} ` : "")}${suffix}`;
2442
+ const sep = translations.ruleSeparator ?? ", ";
2443
+ return `${prefix}${processedRules.join(isRuleGroupType(rg2) ? `${sep}${translations[combinator] ?? combinator} ` : "")}${suffix}`;
2318
2444
  };
2319
2445
  return processRuleGroup(ruleGroup, true);
2320
2446
  };
@@ -2489,6 +2615,63 @@ const defaultRuleGroupProcessorSequelize = (ruleGroup, options) => {
2489
2615
  return processRuleGroup(convertFromIC(ruleGroup), true);
2490
2616
  };
2491
2617
  //#endregion
2618
+ //#region src/utils/formatQuery/defaultRuleGroupProcessorSPARQL.ts
2619
+ /**
2620
+ * Rule group processor used by {@link formatQuery} for "sparql" format.
2621
+ *
2622
+ * SPARQL uses the same combinators as CEL (`&&` / `||`) and `!()` for negation.
2623
+ *
2624
+ * @group Export
2625
+ */
2626
+ const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
2627
+ const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
2628
+ const processRuleGroup = (rg, outermost) => {
2629
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? fallbackExpression : "";
2630
+ const processedRules = [];
2631
+ let precedingCombinator = "";
2632
+ let firstRule = true;
2633
+ for (const rule of rg.rules) {
2634
+ if (typeof rule === "string") {
2635
+ precedingCombinator = celCombinatorMap[rule];
2636
+ continue;
2637
+ }
2638
+ if (isRuleGroup(rule)) {
2639
+ const processedGroup = processRuleGroup(rule);
2640
+ if (processedGroup) {
2641
+ if (!firstRule && precedingCombinator) {
2642
+ processedRules.push(precedingCombinator);
2643
+ precedingCombinator = "";
2644
+ }
2645
+ firstRule = false;
2646
+ processedRules.push(processedGroup);
2647
+ }
2648
+ continue;
2649
+ }
2650
+ const [validationResult, fieldValidator] = validateRule(rule);
2651
+ if (!isRuleOrGroupValid(rule, validationResult, fieldValidator) || rule.field === placeholderFieldName || rule.operator === placeholderOperatorName || placeholderValueName !== void 0 && rule.value === placeholderValueName) continue;
2652
+ const fieldData = getOption(fields, rule.field);
2653
+ const processedRule = ruleProcessor(rule, {
2654
+ ...options,
2655
+ parseNumbers: getParseNumberBoolean(fieldData?.inputType),
2656
+ escapeQuotes: (rule.valueSource ?? "value") === "value",
2657
+ fieldData
2658
+ });
2659
+ if (processedRule) {
2660
+ if (!firstRule && precedingCombinator) {
2661
+ processedRules.push(precedingCombinator);
2662
+ precedingCombinator = "";
2663
+ }
2664
+ firstRule = false;
2665
+ processedRules.push(processedRule);
2666
+ }
2667
+ }
2668
+ const expression = processedRules.join(isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator]} ` : " ");
2669
+ const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? "!" : ""}(`, ")"] : ["", ""];
2670
+ return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;
2671
+ };
2672
+ return processRuleGroup(ruleGroup, true);
2673
+ };
2674
+ //#endregion
2492
2675
  //#region src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts
2493
2676
  /**
2494
2677
  * Default rule processor used by {@link formatQuery} for "sql" format.
@@ -2864,6 +3047,59 @@ const getFieldValidatorReasons = (rule, fieldValidator) => {
2864
3047
  }
2865
3048
  };
2866
3049
  //#endregion
3050
+ //#region src/utils/formatQuery/defaultRuleProcessorCypher.ts
3051
+ const escapeSingleQuotes$1 = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
3052
+ /**
3053
+ * Default rule processor used by {@link formatQuery} for "cypher" and "gql" formats.
3054
+ *
3055
+ * @group Export
3056
+ */
3057
+ const defaultRuleProcessorCypher = (rule, opts = {}) => {
3058
+ const { escapeQuotes, parseNumbers } = opts;
3059
+ const { field, operator, value, valueSource } = rule;
3060
+ const valueIsField = valueSource === "field";
3061
+ const operatorTL = operator.toLowerCase();
3062
+ const fmtVal = (v) => {
3063
+ if (v === null || v === void 0) return "null";
3064
+ if (typeof v === "boolean" || typeof v === "bigint") return String(v);
3065
+ if (valueIsField) return trimIfString(v);
3066
+ if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
3067
+ return `'${escapeSingleQuotes$1(v, escapeQuotes)}'`;
3068
+ };
3069
+ switch (operatorTL) {
3070
+ case "=": return `${field} = ${fmtVal(value)}`;
3071
+ case "!=":
3072
+ case "<>": return `${field} <> ${fmtVal(value)}`;
3073
+ case "<":
3074
+ case ">":
3075
+ case "<=":
3076
+ case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
3077
+ case "contains": return `${field} CONTAINS ${fmtVal(value)}`;
3078
+ case "doesnotcontain": return `NOT ${field} CONTAINS ${fmtVal(value)}`;
3079
+ case "beginswith": return `${field} STARTS WITH ${fmtVal(value)}`;
3080
+ case "doesnotbeginwith": return `NOT ${field} STARTS WITH ${fmtVal(value)}`;
3081
+ case "endswith": return `${field} ENDS WITH ${fmtVal(value)}`;
3082
+ case "doesnotendwith": return `NOT ${field} ENDS WITH ${fmtVal(value)}`;
3083
+ case "null": return `${field} IS NULL`;
3084
+ case "notnull": return `${field} IS NOT NULL`;
3085
+ case "in":
3086
+ case "notin": {
3087
+ const values = toArray(value).map(fmtVal);
3088
+ if (!values.length) return "";
3089
+ return `${operatorTL === "notin" ? "NOT " : ""}${field} IN [${values.join(", ")}]`;
3090
+ }
3091
+ case "between":
3092
+ case "notbetween": {
3093
+ const arr = toArray(value);
3094
+ if (arr.length < 2) return "";
3095
+ const [low, high] = [fmtVal(arr[0]), fmtVal(arr[1])];
3096
+ const expr = `${low} <= ${field} AND ${field} <= ${high}`;
3097
+ return operatorTL === "notbetween" ? `NOT (${expr})` : expr;
3098
+ }
3099
+ default: return `${field} ${operator} ${fmtVal(value)}`;
3100
+ }
3101
+ };
3102
+ //#endregion
2867
3103
  //#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
2868
3104
  const rangeOperatorMap = {
2869
3105
  "<": "lt",
@@ -3015,6 +3251,68 @@ const defaultRuleProcessorElasticSearch = (rule, options = {}) => {
3015
3251
  return false;
3016
3252
  };
3017
3253
  //#endregion
3254
+ //#region src/utils/formatQuery/defaultRuleProcessorGremlin.ts
3255
+ const escapeSingleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll("'", "\\'");
3256
+ /**
3257
+ * Default rule processor used by {@link formatQuery} for "gremlin" format.
3258
+ *
3259
+ * Each rule becomes a `.has()` step (or `.hasNot()`/`.has()` for null checks).
3260
+ *
3261
+ * @group Export
3262
+ */
3263
+ const defaultRuleProcessorGremlin = (rule, opts = {}) => {
3264
+ const { escapeQuotes, parseNumbers } = opts;
3265
+ const { field, operator, value, valueSource } = rule;
3266
+ const valueIsField = valueSource === "field";
3267
+ const operatorTL = operator.toLowerCase();
3268
+ const prop = field.includes(".") ? field.split(".").pop() : field;
3269
+ const fmtVal = (v) => {
3270
+ if (v === null || v === void 0) return "null";
3271
+ if (typeof v === "boolean" || typeof v === "bigint") return String(v);
3272
+ if (valueIsField) return trimIfString(v);
3273
+ if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
3274
+ return `'${escapeSingleQuotes(v, escapeQuotes)}'`;
3275
+ };
3276
+ switch (operatorTL) {
3277
+ case "=": return `.has('${prop}', ${fmtVal(value)})`;
3278
+ case "!=":
3279
+ case "<>": return `.has('${prop}', neq(${fmtVal(value)}))`;
3280
+ case "<": return `.has('${prop}', lt(${fmtVal(value)}))`;
3281
+ case ">": return `.has('${prop}', gt(${fmtVal(value)}))`;
3282
+ case "<=": return `.has('${prop}', lte(${fmtVal(value)}))`;
3283
+ case ">=": return `.has('${prop}', gte(${fmtVal(value)}))`;
3284
+ case "contains": return `.has('${prop}', containing(${fmtVal(value)}))`;
3285
+ case "doesnotcontain": return `.has('${prop}', notContaining(${fmtVal(value)}))`;
3286
+ case "beginswith": return `.has('${prop}', startingWith(${fmtVal(value)}))`;
3287
+ case "doesnotbeginwith": return `.has('${prop}', notStartingWith(${fmtVal(value)}))`;
3288
+ case "endswith": return `.has('${prop}', endingWith(${fmtVal(value)}))`;
3289
+ case "doesnotendwith": return `.has('${prop}', notEndingWith(${fmtVal(value)}))`;
3290
+ case "null": return `.hasNot('${prop}')`;
3291
+ case "notnull": return `.has('${prop}')`;
3292
+ case "in": {
3293
+ const items = toArray(value).map(fmtVal);
3294
+ if (!items.length) return "";
3295
+ return `.has('${prop}', within(${items.join(", ")}))`;
3296
+ }
3297
+ case "notin": {
3298
+ const items = toArray(value).map(fmtVal);
3299
+ if (!items.length) return "";
3300
+ return `.has('${prop}', without(${items.join(", ")}))`;
3301
+ }
3302
+ case "between": {
3303
+ const arr = toArray(value);
3304
+ if (arr.length < 2) return "";
3305
+ return `.has('${prop}', between(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
3306
+ }
3307
+ case "notbetween": {
3308
+ const arr = toArray(value);
3309
+ if (arr.length < 2) return "";
3310
+ return `.has('${prop}', outside(${fmtVal(arr[0])}, ${fmtVal(arr[1])}))`;
3311
+ }
3312
+ default: return `.has('${prop}', ${fmtVal(value)})`;
3313
+ }
3314
+ };
3315
+ //#endregion
3018
3316
  //#region src/utils/formatQuery/defaultRuleProcessorJSONata.ts
3019
3317
  const shouldNegate = (op) => op.startsWith("not") || op.startsWith("doesnot");
3020
3318
  const quote = (v, escapeQuotes) => `"${typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`)}"`;
@@ -3269,6 +3567,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
3269
3567
  const orTL = t.or ?? "or";
3270
3568
  const trueTL = t.true ?? "true";
3271
3569
  const falseTL = t.false ?? "false";
3570
+ const listSep = t.listSeparator ?? ", ";
3571
+ const useOxfordComma = !t.listSeparator;
3272
3572
  switch (operatorLowerCase) {
3273
3573
  case "null":
3274
3574
  case "notnull": return "";
@@ -3288,7 +3588,8 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
3288
3588
  if (valueAsArray.length === 0) return "";
3289
3589
  const valStringArray = valueAsArray.map((v) => valueIsField ? wrapFieldName(getOption(fields ?? [], v)?.label ?? v) : shouldRenderAsNumber(v, parseNumbers) ? `${trimIfString(v)}` : `${wrapAndEscape(v)}`);
3290
3590
  if (valStringArray.length === 1) return valStringArray[0];
3291
- return `(${`${valStringArray.slice(0, -1).join(", ")}${valStringArray.length > 2 ? "," : ""} ${orTL} ${valStringArray.at(-1)}`})`;
3591
+ const oxfordComma = useOxfordComma && valStringArray.length > 2 ? "," : "";
3592
+ return `(${`${valStringArray.slice(0, -1).join(listSep)}${oxfordComma} ${orTL} ${valStringArray.at(-1)}`})`;
3292
3593
  }
3293
3594
  }
3294
3595
  if (typeof rule.value === "boolean") return rule.value ? trueTL : falseTL;
@@ -3401,7 +3702,14 @@ const defaultRuleProcessorNL = (rule, opts) => {
3401
3702
  V: operatorProcessor(rule, opts),
3402
3703
  O: value
3403
3704
  };
3404
- return normalizeConstituentWordOrder(wordOrder).map((term) => `${wordOrderMap[term]}`).join(" ").trim();
3705
+ const translations = opts?.translations ?? {};
3706
+ const suffixMap = {
3707
+ S: translations.afterSubject ?? " ",
3708
+ V: translations.afterVerb ?? " ",
3709
+ O: translations.afterObject ?? " "
3710
+ };
3711
+ const wordOrderTuple = normalizeConstituentWordOrder(wordOrder).filter((term) => wordOrderMap[term] !== "");
3712
+ return wordOrderTuple.map((term, i) => `${wordOrderMap[term]}${i < wordOrderTuple.length - 1 ? suffixMap[term] : ""}`).join("").trim();
3405
3713
  };
3406
3714
  //#endregion
3407
3715
  //#region src/utils/formatQuery/defaultRuleProcessorSQL.ts
@@ -3637,8 +3945,11 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
3637
3945
  const valueIsField = valueSource === "field";
3638
3946
  const operatorLC = lc(operator);
3639
3947
  if (!Op || valueIsField && (!col || !fn && [
3948
+ "contains",
3640
3949
  "doesnotcontain",
3950
+ "beginswith",
3641
3951
  "doesnotbeginwith",
3952
+ "endswith",
3642
3953
  "doesnotendwith"
3643
3954
  ].includes(operatorLC))) return;
3644
3955
  switch (operatorLC) {
@@ -3658,9 +3969,9 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
3658
3969
  }[operatorLC];
3659
3970
  return { [field]: valueIsField && operatorLC === "=" ? { [Op.col]: value } : { [sequelizeOperator]: valueIsField ? col(value) : shouldRenderAsNumber(value, parseNumbers) ? parseNumber(value, { parseNumbers: "strict" }) : value } };
3660
3971
  }
3661
- case "contains": return { [field]: { [Op.substring]: valueIsField ? col(value) : `${value}` } };
3662
- case "beginswith": return { [field]: { [Op.startsWith]: valueIsField ? col(value) : `${value}` } };
3663
- case "endswith": return { [field]: { [Op.endsWith]: valueIsField ? col(value) : `${value}` } };
3972
+ case "contains": return { [field]: { [valueIsField ? Op.like : Op.substring]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `${value}` } };
3973
+ case "beginswith": return { [field]: { [valueIsField ? Op.like : Op.startsWith]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}` } };
3974
+ case "endswith": return { [field]: { [valueIsField ? Op.like : Op.endsWith]: valueIsField ? fn("CONCAT", "%", col(value)) : `${value}` } };
3664
3975
  case "doesnotcontain": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value), "%") : `%${value}%` } };
3665
3976
  case "doesnotbeginwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", col(value), "%") : `${value}%` } };
3666
3977
  case "doesnotendwith": return { [field]: { [Op.notLike]: valueIsField ? fn("CONCAT", "%", col(value)) : `%${value}` } };
@@ -3690,6 +4001,74 @@ const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder,
3690
4001
  }
3691
4002
  };
3692
4003
  //#endregion
4004
+ //#region src/utils/formatQuery/defaultRuleProcessorSPARQL.ts
4005
+ const escapeDoubleQuotes = (v, escapeQuotes) => typeof v !== "string" || !escapeQuotes ? `${v}` : v.replaceAll(`"`, `\\"`);
4006
+ /** Auto-prefix a SPARQL variable name with `?` unless it's already prefixed, a URI, or a prefixed name.
4007
+ *
4008
+ * @group Export
4009
+ */
4010
+ const sparqlVar = (name) => /^[?<]/.test(name) || name.includes(":") ? name : `?${name}`;
4011
+ /**
4012
+ * Default rule processor used by {@link formatQuery} for "sparql" format.
4013
+ *
4014
+ * @group Export
4015
+ */
4016
+ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
4017
+ const { escapeQuotes, parseNumbers } = opts;
4018
+ const { field: rawField, operator, value, valueSource } = rule;
4019
+ const valueIsField = valueSource === "field";
4020
+ const operatorTL = operator.toLowerCase();
4021
+ const field = sparqlVar(rawField);
4022
+ const fmtVal = (v) => {
4023
+ if (v === null || v === void 0) return "\"\"";
4024
+ if (typeof v === "boolean") return `"${v}"^^xsd:boolean`;
4025
+ if (typeof v === "bigint") return String(v);
4026
+ if (valueIsField) return sparqlVar(trimIfString(v));
4027
+ if (typeof v === "number" || shouldRenderAsNumber(v, parseNumbers)) return trimIfString(v);
4028
+ const s = typeof v === "string" ? v : JSON.stringify(v) ?? "";
4029
+ if (s.startsWith("?") || s.startsWith("<") || s.includes(":")) return s;
4030
+ return `"${escapeDoubleQuotes(s, escapeQuotes)}"`;
4031
+ };
4032
+ switch (operatorTL) {
4033
+ case "=":
4034
+ case "!=":
4035
+ case "<":
4036
+ case ">":
4037
+ case "<=":
4038
+ case ">=": return `${field} ${operatorTL} ${fmtVal(value)}`;
4039
+ case "<>": return `${field} != ${fmtVal(value)}`;
4040
+ case "contains": return `CONTAINS(${field}, ${fmtVal(value)})`;
4041
+ case "doesnotcontain": return `!CONTAINS(${field}, ${fmtVal(value)})`;
4042
+ case "beginswith": return `STRSTARTS(${field}, ${fmtVal(value)})`;
4043
+ case "doesnotbeginwith": return `!STRSTARTS(${field}, ${fmtVal(value)})`;
4044
+ case "endswith": return `STRENDS(${field}, ${fmtVal(value)})`;
4045
+ case "doesnotendwith": return `!STRENDS(${field}, ${fmtVal(value)})`;
4046
+ case "null": return `!BOUND(${field})`;
4047
+ case "notnull": return `BOUND(${field})`;
4048
+ case "in": {
4049
+ const items = toArray(value).map(fmtVal);
4050
+ if (!items.length) return "";
4051
+ return `${field} IN (${items.join(", ")})`;
4052
+ }
4053
+ case "notin": {
4054
+ const items = toArray(value).map(fmtVal);
4055
+ if (!items.length) return "";
4056
+ return `${field} NOT IN (${items.join(", ")})`;
4057
+ }
4058
+ case "between": {
4059
+ const arr = toArray(value);
4060
+ if (arr.length < 2) return "";
4061
+ return `${field} >= ${fmtVal(arr[0])} && ${field} <= ${fmtVal(arr[1])}`;
4062
+ }
4063
+ case "notbetween": {
4064
+ const arr = toArray(value);
4065
+ if (arr.length < 2) return "";
4066
+ return `(${field} < ${fmtVal(arr[0])} || ${field} > ${fmtVal(arr[1])})`;
4067
+ }
4068
+ default: return `${field} ${operator} ${fmtVal(value)}`;
4069
+ }
4070
+ };
4071
+ //#endregion
3693
4072
  //#region src/utils/formatQuery/formatQuery.ts
3694
4073
  /**
3695
4074
  * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
@@ -3737,6 +4116,10 @@ const defaultRuleProcessors = {
3737
4116
  sequelize: defaultRuleProcessorSequelize,
3738
4117
  spel: defaultRuleProcessorSpEL,
3739
4118
  sql: defaultRuleProcessorSQL,
4119
+ cypher: defaultRuleProcessorCypher,
4120
+ gql: defaultRuleProcessorCypher,
4121
+ sparql: defaultRuleProcessorSPARQL,
4122
+ gremlin: defaultRuleProcessorGremlin,
3740
4123
  diagnostics: defaultRuleProcessorSQL
3741
4124
  };
3742
4125
  /* v8 ignore next -- @preserve */
@@ -3759,6 +4142,10 @@ const defaultOperatorProcessors = {
3759
4142
  sequelize: defaultOperatorProcessor,
3760
4143
  spel: defaultOperatorProcessor,
3761
4144
  sql: defaultOperatorProcessorSQL,
4145
+ cypher: defaultOperatorProcessor,
4146
+ gql: defaultOperatorProcessor,
4147
+ sparql: defaultOperatorProcessor,
4148
+ gremlin: defaultOperatorProcessor,
3762
4149
  diagnostics: defaultOperatorProcessor
3763
4150
  };
3764
4151
  const defaultFallbackExpressions = {
@@ -3766,6 +4153,8 @@ const defaultFallbackExpressions = {
3766
4153
  ldap: "",
3767
4154
  mongodb: "\"$and\":[{\"$expr\":true}]",
3768
4155
  natural_language: "1 is 1",
4156
+ sparql: "1 = 1",
4157
+ gremlin: "",
3769
4158
  spel: "1 == 1",
3770
4159
  sql: "(1 = 1)"
3771
4160
  };
@@ -3906,6 +4295,10 @@ function formatQuery(ruleGroup, optionParam = {}) {
3906
4295
  case "prisma": return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);
3907
4296
  case "drizzle": return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);
3908
4297
  case "sequelize": return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);
4298
+ case "cypher":
4299
+ case "gql": return defaultRuleGroupProcessorCypher(ruleGroup, finalOptions);
4300
+ case "sparql": return defaultRuleGroupProcessorSPARQL(ruleGroup, finalOptions);
4301
+ case "gremlin": return defaultRuleGroupProcessorGremlin(ruleGroup, finalOptions);
3909
4302
  case "diagnostics": return defaultRuleGroupProcessorDiagnostics(ruleGroup, finalOptions);
3910
4303
  default: return "";
3911
4304
  }
@@ -4618,6 +5011,6 @@ const groupInPlace = (query, sourcePathOrID, targetPathOrID, options = {}) => {
4618
5011
  return query;
4619
5012
  };
4620
5013
  //#endregion
4621
- export { LogType, TestID, add, addInPlace, bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, clsx, convertFromIC, convertQuery, convertToIC, defaultCELValueProcessor, defaultCombinatorLabelMap, defaultCombinators, defaultCombinatorsExtended, defaultControlClassnames, defaultExportOperatorMap, defaultJoinChar, defaultMatchModes, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorLabelMap, defaultOperatorNegationMap, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultOperators, defaultPlaceholderFieldGroupLabel, defaultPlaceholderFieldLabel, defaultPlaceholderFieldName, defaultPlaceholderLabel, defaultPlaceholderName, defaultPlaceholderOperatorGroupLabel, defaultPlaceholderOperatorLabel, defaultPlaceholderOperatorName, defaultPlaceholderValueGroupLabel, defaultPlaceholderValueLabel, defaultPlaceholderValueName, 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, defaultTranslations, defaultValidator, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, filterFieldsByComparator, findID, findPath, formatQuery, formatQueryOptionPresets, generateAccessibleDescription, generateID, getCommonAncestorPath, getFirstOption, getMatchModesUtil, getNLTranslataion, getOption, getParentPath, getParseNumberMethod, getPathOfID, getQuoteFieldNamesWithArray, getQuotedFieldName, getValidationClassNames, getValueSourcesUtil, group, groupInPlace, groupInvalidReasons, insert, insertInPlace, isAncestor, isFlexibleOptionArray, isFlexibleOptionGroupArray, isFullOptionArray, isFullOptionGroupArray, isOptionGroupArray, isPojo, isRuleGroup, isRuleGroupType, isRuleGroupTypeIC, isRuleOrGroupValid, isRuleType, isUnsafeKey, isValidValue, isValidationResult, isValueProcessorLegacy, joinWith, jsonLogicAdditionalOperators, lc, mapSQLOperator, mergeAnyTranslation, mergeAnyTranslations, mergeClassnames, mongoDbFallback, mongoOperators, move, moveInPlace, normalizeConstituentWordOrder, nullFreeArray, nullOrUndefinedOrEmpty, numericRegex, numerifyValues, objectEntries, objectKeys, parseNumber, pathIsDisabled, pathsAreEqual, preferAnyProp, preferFlagProps, preferProp, prepareOptionList, prepareRule, prepareRuleGroup, prepareRuleOrGroup, prismaFallback, prismaOperators, processMatchMode, queryBuilderFlagDefaults, regenerateID, regenerateIDs, remove, removeInPlace, rootPath, shouldRenderAsNumber, splitBy, sqlDialectPresets, standardClassnames, toArray, toFlatOptionArray, toFullOption, toFullOptionList, toFullOptionMap, transformQuery, trimIfString, uniqByIdentifier, uniqByName, uniqOptGroups, uniqOptList, update, updateInPlace, uuidV4regex };
5014
+ export { LogType, TestID, add, addInPlace, bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, clsx, convertFromIC, convertQuery, convertToIC, cypherCombinatorMap, defaultCELValueProcessor, defaultCombinatorLabelMap, defaultCombinators, defaultCombinatorsExtended, defaultControlClassnames, defaultExportOperatorMap, defaultJoinChar, defaultMatchModes, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorLabelMap, defaultOperatorNegationMap, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultOperators, defaultPlaceholderFieldGroupLabel, defaultPlaceholderFieldLabel, defaultPlaceholderFieldName, defaultPlaceholderLabel, defaultPlaceholderName, defaultPlaceholderOperatorGroupLabel, defaultPlaceholderOperatorLabel, defaultPlaceholderOperatorName, defaultPlaceholderValueGroupLabel, defaultPlaceholderValueLabel, defaultPlaceholderValueName, 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, defaultTranslations, defaultValidator, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, filterFieldsByComparator, findID, findPath, formatQuery, formatQueryOptionPresets, generateAccessibleDescription, generateID, getCommonAncestorPath, getFirstOption, getMatchModesUtil, getNLTranslataion, getOption, getParentPath, getParseNumberMethod, getPathOfID, getQuoteFieldNamesWithArray, getQuotedFieldName, getValidationClassNames, getValueSourcesUtil, group, groupInPlace, groupInvalidReasons, insert, insertInPlace, isAncestor, isFlexibleOptionArray, isFlexibleOptionGroupArray, isFullOptionArray, isFullOptionGroupArray, isOptionGroupArray, isPojo, isRuleGroup, isRuleGroupType, isRuleGroupTypeIC, isRuleOrGroupValid, isRuleType, isUnsafeKey, isValidValue, isValidationResult, isValueProcessorLegacy, joinWith, jsonLogicAdditionalOperators, lc, mapSQLOperator, mergeAnyTranslation, mergeAnyTranslations, mergeClassnames, mongoDbFallback, mongoOperators, move, moveInPlace, normalizeConstituentWordOrder, nullFreeArray, nullOrUndefinedOrEmpty, numericRegex, numerifyValues, objectEntries, objectKeys, parseNumber, pathIsDisabled, pathsAreEqual, preferAnyProp, preferFlagProps, preferProp, prepareOptionList, prepareRule, prepareRuleGroup, prepareRuleOrGroup, prismaFallback, prismaOperators, processMatchMode, queryBuilderFlagDefaults, regenerateID, regenerateIDs, remove, removeInPlace, rootPath, shouldRenderAsNumber, sparqlVar, splitBy, sqlDialectPresets, standardClassnames, toArray, toFlatOptionArray, toFullOption, toFullOptionList, toFullOptionMap, transformQuery, trimIfString, uniqByIdentifier, uniqByName, uniqOptGroups, uniqOptList, update, updateInPlace, uuidV4regex };
4622
5015
 
4623
5016
  //# sourceMappingURL=react-querybuilder_core.mjs.map