@react-querybuilder/core 8.17.0 → 8.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +57 -16
  2. package/dist/cjs/react-querybuilder_core.cjs.development.js +212 -206
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  4. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +57 -16
  5. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  6. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  7. package/dist/{convertQuery-BoMPXL7_.js → convertQuery-BJKNgecE.js} +2 -2
  8. package/dist/{convertQuery-BoMPXL7_.js.map → convertQuery-BJKNgecE.js.map} +1 -1
  9. package/dist/{convertQuery-CQwOrjQr.mjs → convertQuery-J1CaoDxe.mjs} +2 -2
  10. package/dist/{convertQuery-CQwOrjQr.mjs.map → convertQuery-J1CaoDxe.mjs.map} +1 -1
  11. package/dist/formatQuery.d.mts +5 -3
  12. package/dist/formatQuery.d.ts +5 -3
  13. package/dist/formatQuery.js +203 -203
  14. package/dist/formatQuery.js.map +1 -1
  15. package/dist/formatQuery.mjs +203 -203
  16. package/dist/formatQuery.mjs.map +1 -1
  17. package/dist/{import-CSHMjlid.d.ts → import-Qs1-kgv5.d.ts} +2 -2
  18. package/dist/{import-BQ5xaW6i.d.mts → import-ShTj5IdB.d.mts} +2 -2
  19. package/dist/{index-CREDWM32.d.ts → index-DlVg-QXo.d.mts} +32 -3
  20. package/dist/{index-CREDWM32.d.mts → index-DlVg-QXo.d.ts} +32 -3
  21. package/dist/{objectUtils-DxVaGCdg.js → objectUtils-DBJI82bl.js} +2 -2
  22. package/dist/objectUtils-DBJI82bl.js.map +1 -0
  23. package/dist/{objectUtils-D-w8MzpZ.mjs → objectUtils-ZvPkF6u6.mjs} +2 -2
  24. package/dist/objectUtils-ZvPkF6u6.mjs.map +1 -0
  25. package/dist/parseCEL.d.mts +7 -7
  26. package/dist/parseCEL.d.ts +7 -7
  27. package/dist/parseCEL.js +6 -6
  28. package/dist/parseCEL.js.map +1 -1
  29. package/dist/parseCEL.mjs +6 -6
  30. package/dist/parseCEL.mjs.map +1 -1
  31. package/dist/parseCypher.d.mts +1 -1
  32. package/dist/parseCypher.d.ts +1 -1
  33. package/dist/parseCypher.js.map +1 -1
  34. package/dist/parseCypher.mjs.map +1 -1
  35. package/dist/parseGremlin.d.mts +1 -1
  36. package/dist/parseGremlin.d.ts +1 -1
  37. package/dist/parseGremlin.js.map +1 -1
  38. package/dist/parseGremlin.mjs.map +1 -1
  39. package/dist/parseJSONata.d.mts +2 -2
  40. package/dist/parseJSONata.d.ts +2 -2
  41. package/dist/parseJSONata.js +2 -2
  42. package/dist/parseJSONata.js.map +1 -1
  43. package/dist/parseJSONata.mjs +2 -2
  44. package/dist/parseJSONata.mjs.map +1 -1
  45. package/dist/parseJsonLogic.d.mts +2 -2
  46. package/dist/parseJsonLogic.d.ts +2 -2
  47. package/dist/parseJsonLogic.js +11 -11
  48. package/dist/parseJsonLogic.js.map +1 -1
  49. package/dist/parseJsonLogic.mjs +11 -11
  50. package/dist/parseJsonLogic.mjs.map +1 -1
  51. package/dist/parseMongoDB.d.mts +2 -2
  52. package/dist/parseMongoDB.d.ts +2 -2
  53. package/dist/parseMongoDB.js +4 -4
  54. package/dist/parseMongoDB.js.map +1 -1
  55. package/dist/parseMongoDB.mjs +4 -4
  56. package/dist/parseMongoDB.mjs.map +1 -1
  57. package/dist/parseSPARQL.d.mts +1 -1
  58. package/dist/parseSPARQL.d.ts +1 -1
  59. package/dist/parseSPARQL.js.map +1 -1
  60. package/dist/parseSPARQL.mjs.map +1 -1
  61. package/dist/parseSQL.d.mts +2 -2
  62. package/dist/parseSQL.d.ts +2 -2
  63. package/dist/parseSQL.js +3 -3
  64. package/dist/parseSQL.js.map +1 -1
  65. package/dist/parseSQL.mjs +3 -3
  66. package/dist/parseSQL.mjs.map +1 -1
  67. package/dist/parseSpEL.d.mts +2 -2
  68. package/dist/parseSpEL.d.ts +2 -2
  69. package/dist/parseSpEL.js +3 -3
  70. package/dist/parseSpEL.js.map +1 -1
  71. package/dist/parseSpEL.mjs +3 -3
  72. package/dist/parseSpEL.mjs.map +1 -1
  73. package/dist/{prepareQueryObjects-BXf5aV-A.mjs → prepareQueryObjects-Cd_tt4oy.mjs} +3 -3
  74. package/dist/{prepareQueryObjects-BXf5aV-A.mjs.map → prepareQueryObjects-Cd_tt4oy.mjs.map} +1 -1
  75. package/dist/{prepareQueryObjects-gRQqiBPR.js → prepareQueryObjects-DaAXX792.js} +3 -3
  76. package/dist/{prepareQueryObjects-gRQqiBPR.js.map → prepareQueryObjects-DaAXX792.js.map} +1 -1
  77. package/dist/react-querybuilder_core.d.mts +57 -16
  78. package/dist/react-querybuilder_core.legacy-esm.d.ts +57 -16
  79. package/dist/react-querybuilder_core.legacy-esm.js +210 -204
  80. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  81. package/dist/react-querybuilder_core.mjs +212 -206
  82. package/dist/react-querybuilder_core.mjs.map +1 -1
  83. package/dist/react-querybuilder_core.production.d.mts +57 -16
  84. package/dist/react-querybuilder_core.production.mjs +1 -1
  85. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  86. package/dist/transformQuery.d.mts +1 -1
  87. package/dist/transformQuery.d.ts +1 -1
  88. package/dist/transformQuery.js +1 -1
  89. package/dist/transformQuery.mjs +1 -1
  90. package/dist/{utils-ZlKseh1X.js → utils-BpaOtylk.js} +3 -3
  91. package/dist/utils-BpaOtylk.js.map +1 -0
  92. package/dist/{utils-01WaTGBL.mjs → utils-CJRGiPb-.mjs} +3 -3
  93. package/dist/utils-CJRGiPb-.mjs.map +1 -0
  94. package/package.json +12 -12
  95. package/dist/objectUtils-D-w8MzpZ.mjs.map +0 -1
  96. package/dist/objectUtils-DxVaGCdg.js.map +0 -1
  97. package/dist/utils-01WaTGBL.mjs.map +0 -1
  98. package/dist/utils-ZlKseh1X.js.map +0 -1
@@ -89,7 +89,10 @@ const defaultTranslations = {
89
89
  placeholderGroupLabel: defaultPlaceholderValueGroupLabel
90
90
  },
91
91
  matchMode: { title: "Match mode" },
92
- matchThreshold: { title: "Match threshold" },
92
+ matchThreshold: {
93
+ title: "Match threshold",
94
+ placeholderName: "#"
95
+ },
93
96
  value: { title: "Value" },
94
97
  removeRule: {
95
98
  label: "⨯",
@@ -427,7 +430,8 @@ const standardClassnames = {
427
430
  branches: "queryBuilder-branches",
428
431
  justified: "queryBuilder-justified",
429
432
  hasSubQuery: "rule-hasSubQuery",
430
- loading: "queryBuilder-loading"
433
+ loading: "queryBuilder-loading",
434
+ valueDateTimeRelative: "rule-value-dateTimeRelative"
431
435
  };
432
436
  /**
433
437
  * Default classnames for each component.
@@ -477,7 +481,8 @@ const defaultControlClassnames = {
477
481
  valueListItem: "",
478
482
  branches: "",
479
483
  hasSubQuery: "",
480
- loading: ""
484
+ loading: "",
485
+ valueDateTimeRelative: ""
481
486
  };
482
487
  /**
483
488
  * Default reason codes for a group being invalid.
@@ -610,7 +615,7 @@ const trimIfString = (val) => typeof val === "string" ? val.trim() : val;
610
615
  * Splits a string by comma then trims each element. Arrays are returned as is except
611
616
  * any string elements are trimmed.
612
617
  */
613
- const toArray = (a, { retainEmptyStrings } = {}) => Array.isArray(a) ? a.map((v) => trimIfString(v)) : typeof a === "string" ? splitBy(a, ",").filter(retainEmptyStrings ? () => true : (s) => !/^\s*$/.test(s)).map((s) => s.trim()) : typeof a === "number" ? [a] : [];
618
+ const toArray = (a, { retainEmptyStrings } = {}) => Array.isArray(a) ? a.map(trimIfString) : typeof a === "string" ? splitBy(a, ",").filter(retainEmptyStrings ? () => true : (s) => !/^\s*$/.test(s)).map((s) => s.trim()) : typeof a === "number" ? [a] : [];
614
619
  /**
615
620
  * Determines if an array is free of `null`/`undefined`.
616
621
  */
@@ -671,7 +676,7 @@ const numericRegex = new RegExp(numeric_quantity.numericRegex.source.replace(/^\
671
676
  /**
672
677
  * Determines if a variable is a plain old JavaScript object, aka POJO.
673
678
  */
674
- const isPojo = (obj) => obj === null || typeof obj !== "object" ? false : Object.getPrototypeOf(obj) === Object.prototype;
679
+ const isPojo = (obj) => obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype;
675
680
  /**
676
681
  * Simple helper to determine whether a value is null, undefined, or an empty string.
677
682
  */
@@ -1513,7 +1518,7 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
1513
1518
  const totalCount = `double(${field}.size())`;
1514
1519
  const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;
1515
1520
  const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "==";
1516
- if (threshold > 0 && threshold < 1) return `${filteredCount} ${op} (${totalCount} * ${threshold})`;
1521
+ if (threshold > 0 && threshold < 1) return `double(${filteredCount}) ${op} (${totalCount} * ${threshold})`;
1517
1522
  return `${filteredCount} ${op} ${threshold}`;
1518
1523
  }
1519
1524
  }
@@ -2000,106 +2005,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
2000
2005
  return processRuleGroup(ruleGroup, true);
2001
2006
  };
2002
2007
  //#endregion
2003
- //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
2004
- /**
2005
- * Default rule processor used by {@link formatQuery} for the "drizzle" format.
2006
- *
2007
- * @group Export
2008
- */
2009
- const defaultRuleProcessorDrizzle = (rule, _options) => {
2010
- const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
2011
- // v8 ignore next
2012
- const { parseNumbers, preserveValueOrder, context = {} } = opts;
2013
- const { columns, drizzleOperators, useRawFields } = context;
2014
- if (!columns || !drizzleOperators) return void 0;
2015
- const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
2016
- const { field, operator, value, valueSource } = rule;
2017
- const column = useRawFields && /[a-z][a-z0-9]*/i.test(field) ? sql.raw(field) : columns[field];
2018
- const operatorLC = lc(operator);
2019
- const valueIsField = valueSource === "field";
2020
- const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
2021
- const maybeParseNumber = (v) => {
2022
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2023
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2024
- };
2025
- if (!column) return void 0;
2026
- const matchEval = processMatchMode(rule);
2027
- if (matchEval === false) return;
2028
- else if (matchEval) {
2029
- if (opts.preset !== "postgresql") return void 0;
2030
- const { mode, threshold } = matchEval;
2031
- const arrayElementAlias = "elem_alias";
2032
- const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
2033
- ...r,
2034
- field: arrayElementAlias
2035
- }) }), {
2036
- ...opts,
2037
- context: {
2038
- ...opts.context,
2039
- useRawFields: true
2040
- }
2041
- });
2042
- switch (mode) {
2043
- case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
2044
- case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2045
- case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2046
- case "atleast":
2047
- case "atmost":
2048
- case "exactly": {
2049
- const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
2050
- return threshold > 0 && threshold < 1 ? sql`(select count(*) / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}` : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;
2051
- }
2052
- }
2053
- }
2054
- switch (operatorLC) {
2055
- case "=": return eq(column, maybeParseNumber(value));
2056
- case "!=": return ne(column, maybeParseNumber(value));
2057
- case ">": return gt(column, maybeParseNumber(value));
2058
- case "<": return lt(column, maybeParseNumber(value));
2059
- case ">=": return gte(column, maybeParseNumber(value));
2060
- case "<=": return lte(column, maybeParseNumber(value));
2061
- case "beginswith":
2062
- case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
2063
- case "contains":
2064
- case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
2065
- case "endswith":
2066
- case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
2067
- case "null": return isNull(column);
2068
- case "notnull": return isNotNull(column);
2069
- case "in":
2070
- case "notin": {
2071
- const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
2072
- return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
2073
- }
2074
- case "between":
2075
- case "notbetween": {
2076
- const valueAsArray = toArray(value);
2077
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2078
- let [first, second] = valueAsArray;
2079
- const shouldParseNumbers = !(parseNumbers === false);
2080
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2081
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2082
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2083
- if (!preserveValueOrder && secondNum < firstNum) {
2084
- const tempNum = secondNum;
2085
- second = firstNum;
2086
- first = tempNum;
2087
- } else {
2088
- first = firstNum;
2089
- second = secondNum;
2090
- }
2091
- } else if (valueIsField) {
2092
- first = asFieldOrValue(first);
2093
- second = asFieldOrValue(second);
2094
- }
2095
- return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
2096
- }
2097
- return;
2098
- }
2099
- default: return;
2100
- }
2101
- };
2102
- //#endregion
2103
2008
  //#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
2104
2009
  /**
2105
2010
  * Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
@@ -2114,10 +2019,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
2114
2019
  * @group Export
2115
2020
  */
2116
2021
  const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
2117
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
2022
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
2118
2023
  if (!columns || !drizzleOperators) return void 0;
2119
2024
  const { and, not, or } = drizzleOperators;
2120
- const ruleProcessor = defaultRuleProcessorDrizzle;
2121
2025
  const processRuleGroup = (rg, _outermost) => {
2122
2026
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
2123
2027
  const processedRules = rg.rules.map((rule) => {
@@ -2395,7 +2299,7 @@ const defaultRuleGroupProcessorMongoDB = (ruleGroup, options, meta) => {
2395
2299
  const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
2396
2300
  const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, translations, validateRule, validationMap } = options;
2397
2301
  const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
2398
- if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : /* v8 ignore next -- @preserve */ "";
2302
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
2399
2303
  const rg2 = isRuleGroupTypeIC(rg) && rg.rules.some((r) => typeof r === "string" && lc(r) === "xor") ? convertFromIC(rg) : rg;
2400
2304
  const processedRules = [];
2401
2305
  let precedingCombinator = "";
@@ -2493,7 +2397,7 @@ const defaultRuleGroupProcessorParameterized = (ruleGroup, options) => {
2493
2397
  return sql;
2494
2398
  };
2495
2399
  const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
2496
- if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : /* v8 ignore next -- @preserve */ "";
2400
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
2497
2401
  const processedRules = [];
2498
2402
  let precedingCombinator = "";
2499
2403
  let firstRule = true;
@@ -2686,7 +2590,7 @@ const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
2686
2590
  const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
2687
2591
  const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
2688
2592
  const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
2689
- if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : /* v8 ignore next -- @preserve */ "";
2593
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
2690
2594
  const processedRules = [];
2691
2595
  let precedingCombinator = "";
2692
2596
  let firstRule = true;
@@ -2733,96 +2637,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
2733
2637
  return processRuleGroup(ruleGroup, true);
2734
2638
  };
2735
2639
  //#endregion
2736
- //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
2737
- /**
2738
- * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
2739
- *
2740
- * @group Export
2741
- */
2742
- const defaultRuleProcessorTanStackDB = (rule, _options) => {
2743
- const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
2744
- const ops = context.tanStackDbOperators;
2745
- const refs = context._tanstackDbRefs;
2746
- const primaryRef = context._tanstackDbPrimaryRef;
2747
- if (!ops || !refs || !primaryRef) return void 0;
2748
- const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
2749
- const resolveField = (fieldName) => {
2750
- const dotIdx = fieldName.indexOf(".");
2751
- if (dotIdx > 0) {
2752
- const prefix = fieldName.slice(0, dotIdx);
2753
- const rest = fieldName.slice(dotIdx + 1);
2754
- if (refs[prefix]) return refs[prefix][rest];
2755
- }
2756
- return refs[primaryRef][fieldName];
2757
- };
2758
- const { field, operator, value, valueSource } = rule;
2759
- const column = resolveField(field);
2760
- const operatorLC = lc(operator);
2761
- const valueIsField = valueSource === "field";
2762
- const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
2763
- const maybeParseNumber = (v) => {
2764
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2765
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2766
- };
2767
- switch (operatorLC) {
2768
- case "=": return eq(column, maybeParseNumber(value));
2769
- case "!=": return not(eq(column, maybeParseNumber(value)));
2770
- case ">": return gt(column, maybeParseNumber(value));
2771
- case "<": return lt(column, maybeParseNumber(value));
2772
- case ">=": return gte(column, maybeParseNumber(value));
2773
- case "<=": return lte(column, maybeParseNumber(value));
2774
- case "beginswith":
2775
- case "doesnotbeginwith": {
2776
- const expr = like(column, valueIsField ? void 0 : `${value}%`);
2777
- return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
2778
- }
2779
- case "contains":
2780
- case "doesnotcontain": {
2781
- const expr = like(column, valueIsField ? void 0 : `%${value}%`);
2782
- return operatorLC === "doesnotcontain" ? not(expr) : expr;
2783
- }
2784
- case "endswith":
2785
- case "doesnotendwith": {
2786
- const expr = like(column, valueIsField ? void 0 : `%${value}`);
2787
- return operatorLC === "doesnotendwith" ? not(expr) : expr;
2788
- }
2789
- case "null": return isNull(column);
2790
- case "notnull": return not(isNull(column));
2791
- case "in":
2792
- case "notin": {
2793
- const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
2794
- return operatorLC === "notin" ? not(expr) : expr;
2795
- }
2796
- case "between":
2797
- case "notbetween": {
2798
- const valueAsArray = toArray(value);
2799
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2800
- let [first, second] = valueAsArray;
2801
- const shouldParseNumbers = !(parseNumbers === false);
2802
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2803
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2804
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2805
- if (!preserveValueOrder && secondNum < firstNum) {
2806
- const tempNum = secondNum;
2807
- second = firstNum;
2808
- first = tempNum;
2809
- } else {
2810
- first = firstNum;
2811
- second = secondNum;
2812
- }
2813
- } else if (valueIsField) {
2814
- first = asFieldOrValue(first);
2815
- second = asFieldOrValue(second);
2816
- }
2817
- const expr = and(gte(column, first), lte(column, second));
2818
- return operatorLC === "notbetween" ? not(expr) : expr;
2819
- }
2820
- return;
2821
- }
2822
- default: return;
2823
- }
2824
- };
2825
- //#endregion
2826
2640
  //#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
2827
2641
  /**
2828
2642
  * Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
@@ -2835,7 +2649,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
2835
2649
  * @group Export
2836
2650
  */
2837
2651
  const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2838
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
2652
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
2839
2653
  const ops = context.tanStackDbOperators;
2840
2654
  if (!ops) return void 0;
2841
2655
  const { and, eq, not, or } = ops;
@@ -2843,7 +2657,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2843
2657
  const refKeys = Object.keys(refs);
2844
2658
  /* v8 ignore next -- @preserve */
2845
2659
  if (refKeys.length === 0) return fallback;
2846
- const ruleProcessor = defaultRuleProcessorTanStackDB;
2847
2660
  const processRuleGroup = (rg) => {
2848
2661
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
2849
2662
  const processedRules = rg.rules.map((rule) => {
@@ -3241,6 +3054,106 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
3241
3054
  }
3242
3055
  };
3243
3056
  //#endregion
3057
+ //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
3058
+ /**
3059
+ * Default rule processor used by {@link formatQuery} for the "drizzle" format.
3060
+ *
3061
+ * @group Export
3062
+ */
3063
+ const defaultRuleProcessorDrizzle = (rule, _options) => {
3064
+ const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
3065
+ // v8 ignore next
3066
+ const { parseNumbers, preserveValueOrder, context = {} } = opts;
3067
+ const { columns, drizzleOperators, useRawFields } = context;
3068
+ if (!columns || !drizzleOperators) return void 0;
3069
+ const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
3070
+ const { field, operator, value, valueSource } = rule;
3071
+ const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
3072
+ const operatorLC = lc(operator);
3073
+ const valueIsField = valueSource === "field";
3074
+ const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
3075
+ const maybeParseNumber = (v) => {
3076
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
3077
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
3078
+ };
3079
+ if (!column) return void 0;
3080
+ const matchEval = processMatchMode(rule);
3081
+ if (matchEval === false) return;
3082
+ else if (matchEval) {
3083
+ if (opts.preset !== "postgresql") return void 0;
3084
+ const { mode, threshold } = matchEval;
3085
+ const arrayElementAlias = "elem_alias";
3086
+ const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
3087
+ ...r,
3088
+ field: arrayElementAlias
3089
+ }) }), {
3090
+ ...opts,
3091
+ context: {
3092
+ ...opts.context,
3093
+ useRawFields: true
3094
+ }
3095
+ });
3096
+ switch (mode) {
3097
+ case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
3098
+ case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3099
+ case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3100
+ case "atleast":
3101
+ case "atmost":
3102
+ case "exactly": {
3103
+ const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
3104
+ return threshold > 0 && threshold < 1 ? sql`(select count(*)::float / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}` : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;
3105
+ }
3106
+ }
3107
+ }
3108
+ switch (operatorLC) {
3109
+ case "=": return eq(column, maybeParseNumber(value));
3110
+ case "!=": return ne(column, maybeParseNumber(value));
3111
+ case ">": return gt(column, maybeParseNumber(value));
3112
+ case "<": return lt(column, maybeParseNumber(value));
3113
+ case ">=": return gte(column, maybeParseNumber(value));
3114
+ case "<=": return lte(column, maybeParseNumber(value));
3115
+ case "beginswith":
3116
+ case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
3117
+ case "contains":
3118
+ case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
3119
+ case "endswith":
3120
+ case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
3121
+ case "null": return isNull(column);
3122
+ case "notnull": return isNotNull(column);
3123
+ case "in":
3124
+ case "notin": {
3125
+ const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
3126
+ return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
3127
+ }
3128
+ case "between":
3129
+ case "notbetween": {
3130
+ const valueAsArray = toArray(value);
3131
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
3132
+ let [first, second] = valueAsArray;
3133
+ const shouldParseNumbers = !(parseNumbers === false);
3134
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
3135
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
3136
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
3137
+ if (!preserveValueOrder && secondNum < firstNum) {
3138
+ const tempNum = secondNum;
3139
+ second = firstNum;
3140
+ first = tempNum;
3141
+ } else {
3142
+ first = firstNum;
3143
+ second = secondNum;
3144
+ }
3145
+ } else if (valueIsField) {
3146
+ first = asFieldOrValue(first);
3147
+ second = asFieldOrValue(second);
3148
+ }
3149
+ return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
3150
+ }
3151
+ return;
3152
+ }
3153
+ default: return;
3154
+ }
3155
+ };
3156
+ //#endregion
3244
3157
  //#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
3245
3158
  const rangeOperatorMap = {
3246
3159
  "<": "lt",
@@ -3890,7 +3803,7 @@ const defaultRuleProcessorSQL = (rule, opts = {}) => {
3890
3803
  case "atmost":
3891
3804
  case "exactly": {
3892
3805
  const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
3893
- return `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;
3806
+ return `(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;
3894
3807
  }
3895
3808
  }
3896
3809
  }
@@ -3957,7 +3870,7 @@ const defaultRuleProcessorParameterized = (rule, opts, meta) => {
3957
3870
  case "atmost":
3958
3871
  case "exactly": {
3959
3872
  const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
3960
- return finalize(`(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`);
3873
+ return finalize(`(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`);
3961
3874
  }
3962
3875
  }
3963
3876
  }
@@ -4210,6 +4123,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
4210
4123
  }
4211
4124
  };
4212
4125
  //#endregion
4126
+ //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
4127
+ /**
4128
+ * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
4129
+ *
4130
+ * @group Export
4131
+ */
4132
+ const defaultRuleProcessorTanStackDB = (rule, _options) => {
4133
+ const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
4134
+ const ops = context.tanStackDbOperators;
4135
+ const refs = context._tanstackDbRefs;
4136
+ const primaryRef = context._tanstackDbPrimaryRef;
4137
+ if (!ops || !refs || !primaryRef) return void 0;
4138
+ const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
4139
+ const resolveField = (fieldName) => {
4140
+ const dotIdx = fieldName.indexOf(".");
4141
+ if (dotIdx > 0) {
4142
+ const prefix = fieldName.slice(0, dotIdx);
4143
+ const rest = fieldName.slice(dotIdx + 1);
4144
+ if (refs[prefix]) return refs[prefix][rest];
4145
+ }
4146
+ return refs[primaryRef][fieldName];
4147
+ };
4148
+ const { field, operator, value, valueSource } = rule;
4149
+ const column = resolveField(field);
4150
+ const operatorLC = lc(operator);
4151
+ const valueIsField = valueSource === "field";
4152
+ const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
4153
+ const maybeParseNumber = (v) => {
4154
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
4155
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
4156
+ };
4157
+ switch (operatorLC) {
4158
+ case "=": return eq(column, maybeParseNumber(value));
4159
+ case "!=": return not(eq(column, maybeParseNumber(value)));
4160
+ case ">": return gt(column, maybeParseNumber(value));
4161
+ case "<": return lt(column, maybeParseNumber(value));
4162
+ case ">=": return gte(column, maybeParseNumber(value));
4163
+ case "<=": return lte(column, maybeParseNumber(value));
4164
+ case "beginswith":
4165
+ case "doesnotbeginwith": {
4166
+ const expr = like(column, valueIsField ? void 0 : `${value}%`);
4167
+ return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
4168
+ }
4169
+ case "contains":
4170
+ case "doesnotcontain": {
4171
+ const expr = like(column, valueIsField ? void 0 : `%${value}%`);
4172
+ return operatorLC === "doesnotcontain" ? not(expr) : expr;
4173
+ }
4174
+ case "endswith":
4175
+ case "doesnotendwith": {
4176
+ const expr = like(column, valueIsField ? void 0 : `%${value}`);
4177
+ return operatorLC === "doesnotendwith" ? not(expr) : expr;
4178
+ }
4179
+ case "null": return isNull(column);
4180
+ case "notnull": return not(isNull(column));
4181
+ case "in":
4182
+ case "notin": {
4183
+ const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
4184
+ return operatorLC === "notin" ? not(expr) : expr;
4185
+ }
4186
+ case "between":
4187
+ case "notbetween": {
4188
+ const valueAsArray = toArray(value);
4189
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
4190
+ let [first, second] = valueAsArray;
4191
+ const shouldParseNumbers = !(parseNumbers === false);
4192
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
4193
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
4194
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
4195
+ if (!preserveValueOrder && secondNum < firstNum) {
4196
+ const tempNum = secondNum;
4197
+ second = firstNum;
4198
+ first = tempNum;
4199
+ } else {
4200
+ first = firstNum;
4201
+ second = secondNum;
4202
+ }
4203
+ } else if (valueIsField) {
4204
+ first = asFieldOrValue(first);
4205
+ second = asFieldOrValue(second);
4206
+ }
4207
+ const expr = and(gte(column, first), lte(column, second));
4208
+ return operatorLC === "notbetween" ? not(expr) : expr;
4209
+ }
4210
+ return;
4211
+ }
4212
+ default: return;
4213
+ }
4214
+ };
4215
+ //#endregion
4213
4216
  //#region src/utils/formatQuery/formatQuery.ts
4214
4217
  /**
4215
4218
  * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
@@ -4459,6 +4462,8 @@ const generateValueProcessor = (vpbr) => (field, operator, value, valueSource) =
4459
4462
  /**
4460
4463
  * Default value processor used by {@link formatQuery} for "sql" format.
4461
4464
  *
4465
+ * @deprecated Prefer {@link defaultValueProcessorByRule}.
4466
+ *
4462
4467
  * @group Export
4463
4468
  */
4464
4469
  const defaultValueProcessor = generateValueProcessor(defaultValueProcessorByRule);
@@ -4773,7 +4778,8 @@ const mergeClassnames = (...args) => ({
4773
4778
  matchThreshold: joinClassnamesByName("matchThreshold", args),
4774
4779
  branches: joinClassnamesByName("branches", args),
4775
4780
  hasSubQuery: joinClassnamesByName("hasSubQuery", args),
4776
- loading: joinClassnamesByName("loading", args)
4781
+ loading: joinClassnamesByName("loading", args),
4782
+ valueDateTimeRelative: joinClassnamesByName("valueDateTimeRelative", args)
4777
4783
  });
4778
4784
  //#endregion
4779
4785
  //#region src/utils/preferProp.ts