@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
@@ -88,7 +88,10 @@ const defaultTranslations = {
88
88
  placeholderGroupLabel: defaultPlaceholderValueGroupLabel
89
89
  },
90
90
  matchMode: { title: "Match mode" },
91
- matchThreshold: { title: "Match threshold" },
91
+ matchThreshold: {
92
+ title: "Match threshold",
93
+ placeholderName: "#"
94
+ },
92
95
  value: { title: "Value" },
93
96
  removeRule: {
94
97
  label: "⨯",
@@ -426,7 +429,8 @@ const standardClassnames = {
426
429
  branches: "queryBuilder-branches",
427
430
  justified: "queryBuilder-justified",
428
431
  hasSubQuery: "rule-hasSubQuery",
429
- loading: "queryBuilder-loading"
432
+ loading: "queryBuilder-loading",
433
+ valueDateTimeRelative: "rule-value-dateTimeRelative"
430
434
  };
431
435
  /**
432
436
  * Default classnames for each component.
@@ -476,7 +480,8 @@ const defaultControlClassnames = {
476
480
  valueListItem: "",
477
481
  branches: "",
478
482
  hasSubQuery: "",
479
- loading: ""
483
+ loading: "",
484
+ valueDateTimeRelative: ""
480
485
  };
481
486
  /**
482
487
  * Default reason codes for a group being invalid.
@@ -609,7 +614,7 @@ const trimIfString = (val) => typeof val === "string" ? val.trim() : val;
609
614
  * Splits a string by comma then trims each element. Arrays are returned as is except
610
615
  * any string elements are trimmed.
611
616
  */
612
- 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] : [];
617
+ 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] : [];
613
618
  /**
614
619
  * Determines if an array is free of `null`/`undefined`.
615
620
  */
@@ -670,7 +675,7 @@ const numericRegex = new RegExp(numericRegex$1.source.replace(/^\^/, String.raw`
670
675
  /**
671
676
  * Determines if a variable is a plain old JavaScript object, aka POJO.
672
677
  */
673
- const isPojo = (obj) => obj === null || typeof obj !== "object" ? false : Object.getPrototypeOf(obj) === Object.prototype;
678
+ const isPojo = (obj) => obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype;
674
679
  /**
675
680
  * Simple helper to determine whether a value is null, undefined, or an empty string.
676
681
  */
@@ -1512,7 +1517,7 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
1512
1517
  const totalCount = `double(${field}.size())`;
1513
1518
  const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;
1514
1519
  const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "==";
1515
- if (threshold > 0 && threshold < 1) return `${filteredCount} ${op} (${totalCount} * ${threshold})`;
1520
+ if (threshold > 0 && threshold < 1) return `double(${filteredCount}) ${op} (${totalCount} * ${threshold})`;
1516
1521
  return `${filteredCount} ${op} ${threshold}`;
1517
1522
  }
1518
1523
  }
@@ -1999,106 +2004,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
1999
2004
  return processRuleGroup(ruleGroup, true);
2000
2005
  };
2001
2006
  //#endregion
2002
- //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
2003
- /**
2004
- * Default rule processor used by {@link formatQuery} for the "drizzle" format.
2005
- *
2006
- * @group Export
2007
- */
2008
- const defaultRuleProcessorDrizzle = (rule, _options) => {
2009
- const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
2010
- // v8 ignore next
2011
- const { parseNumbers, preserveValueOrder, context = {} } = opts;
2012
- const { columns, drizzleOperators, useRawFields } = context;
2013
- if (!columns || !drizzleOperators) return void 0;
2014
- const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
2015
- const { field, operator, value, valueSource } = rule;
2016
- const column = useRawFields && /[a-z][a-z0-9]*/i.test(field) ? sql.raw(field) : columns[field];
2017
- const operatorLC = lc(operator);
2018
- const valueIsField = valueSource === "field";
2019
- const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
2020
- const maybeParseNumber = (v) => {
2021
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2022
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2023
- };
2024
- if (!column) return void 0;
2025
- const matchEval = processMatchMode(rule);
2026
- if (matchEval === false) return;
2027
- else if (matchEval) {
2028
- if (opts.preset !== "postgresql") return void 0;
2029
- const { mode, threshold } = matchEval;
2030
- const arrayElementAlias = "elem_alias";
2031
- const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
2032
- ...r,
2033
- field: arrayElementAlias
2034
- }) }), {
2035
- ...opts,
2036
- context: {
2037
- ...opts.context,
2038
- useRawFields: true
2039
- }
2040
- });
2041
- switch (mode) {
2042
- case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
2043
- case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2044
- case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2045
- case "atleast":
2046
- case "atmost":
2047
- case "exactly": {
2048
- const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
2049
- 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}`)}`;
2050
- }
2051
- }
2052
- }
2053
- switch (operatorLC) {
2054
- case "=": return eq(column, maybeParseNumber(value));
2055
- case "!=": return ne(column, maybeParseNumber(value));
2056
- case ">": return gt(column, maybeParseNumber(value));
2057
- case "<": return lt(column, maybeParseNumber(value));
2058
- case ">=": return gte(column, maybeParseNumber(value));
2059
- case "<=": return lte(column, maybeParseNumber(value));
2060
- case "beginswith":
2061
- case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
2062
- case "contains":
2063
- case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
2064
- case "endswith":
2065
- case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
2066
- case "null": return isNull(column);
2067
- case "notnull": return isNotNull(column);
2068
- case "in":
2069
- case "notin": {
2070
- const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
2071
- return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
2072
- }
2073
- case "between":
2074
- case "notbetween": {
2075
- const valueAsArray = toArray(value);
2076
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2077
- let [first, second] = valueAsArray;
2078
- const shouldParseNumbers = !(parseNumbers === false);
2079
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2080
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2081
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2082
- if (!preserveValueOrder && secondNum < firstNum) {
2083
- const tempNum = secondNum;
2084
- second = firstNum;
2085
- first = tempNum;
2086
- } else {
2087
- first = firstNum;
2088
- second = secondNum;
2089
- }
2090
- } else if (valueIsField) {
2091
- first = asFieldOrValue(first);
2092
- second = asFieldOrValue(second);
2093
- }
2094
- return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
2095
- }
2096
- return;
2097
- }
2098
- default: return;
2099
- }
2100
- };
2101
- //#endregion
2102
2007
  //#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
2103
2008
  /**
2104
2009
  * Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
@@ -2113,10 +2018,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
2113
2018
  * @group Export
2114
2019
  */
2115
2020
  const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
2116
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
2021
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
2117
2022
  if (!columns || !drizzleOperators) return void 0;
2118
2023
  const { and, not, or } = drizzleOperators;
2119
- const ruleProcessor = defaultRuleProcessorDrizzle;
2120
2024
  const processRuleGroup = (rg, _outermost) => {
2121
2025
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
2122
2026
  const processedRules = rg.rules.map((rule) => {
@@ -2394,7 +2298,7 @@ const defaultRuleGroupProcessorMongoDB = (ruleGroup, options, meta) => {
2394
2298
  const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
2395
2299
  const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, translations, validateRule, validationMap } = options;
2396
2300
  const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
2397
- if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : /* v8 ignore next -- @preserve */ "";
2301
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
2398
2302
  const rg2 = isRuleGroupTypeIC(rg) && rg.rules.some((r) => typeof r === "string" && lc(r) === "xor") ? convertFromIC(rg) : rg;
2399
2303
  const processedRules = [];
2400
2304
  let precedingCombinator = "";
@@ -2492,7 +2396,7 @@ const defaultRuleGroupProcessorParameterized = (ruleGroup, options) => {
2492
2396
  return sql;
2493
2397
  };
2494
2398
  const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
2495
- if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : /* v8 ignore next -- @preserve */ "";
2399
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
2496
2400
  const processedRules = [];
2497
2401
  let precedingCombinator = "";
2498
2402
  let firstRule = true;
@@ -2685,7 +2589,7 @@ const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
2685
2589
  const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
2686
2590
  const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
2687
2591
  const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
2688
- if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : /* v8 ignore next -- @preserve */ "";
2592
+ if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
2689
2593
  const processedRules = [];
2690
2594
  let precedingCombinator = "";
2691
2595
  let firstRule = true;
@@ -2732,96 +2636,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
2732
2636
  return processRuleGroup(ruleGroup, true);
2733
2637
  };
2734
2638
  //#endregion
2735
- //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
2736
- /**
2737
- * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
2738
- *
2739
- * @group Export
2740
- */
2741
- const defaultRuleProcessorTanStackDB = (rule, _options) => {
2742
- const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
2743
- const ops = context.tanStackDbOperators;
2744
- const refs = context._tanstackDbRefs;
2745
- const primaryRef = context._tanstackDbPrimaryRef;
2746
- if (!ops || !refs || !primaryRef) return void 0;
2747
- const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
2748
- const resolveField = (fieldName) => {
2749
- const dotIdx = fieldName.indexOf(".");
2750
- if (dotIdx > 0) {
2751
- const prefix = fieldName.slice(0, dotIdx);
2752
- const rest = fieldName.slice(dotIdx + 1);
2753
- if (refs[prefix]) return refs[prefix][rest];
2754
- }
2755
- return refs[primaryRef][fieldName];
2756
- };
2757
- const { field, operator, value, valueSource } = rule;
2758
- const column = resolveField(field);
2759
- const operatorLC = lc(operator);
2760
- const valueIsField = valueSource === "field";
2761
- const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
2762
- const maybeParseNumber = (v) => {
2763
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2764
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2765
- };
2766
- switch (operatorLC) {
2767
- case "=": return eq(column, maybeParseNumber(value));
2768
- case "!=": return not(eq(column, maybeParseNumber(value)));
2769
- case ">": return gt(column, maybeParseNumber(value));
2770
- case "<": return lt(column, maybeParseNumber(value));
2771
- case ">=": return gte(column, maybeParseNumber(value));
2772
- case "<=": return lte(column, maybeParseNumber(value));
2773
- case "beginswith":
2774
- case "doesnotbeginwith": {
2775
- const expr = like(column, valueIsField ? void 0 : `${value}%`);
2776
- return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
2777
- }
2778
- case "contains":
2779
- case "doesnotcontain": {
2780
- const expr = like(column, valueIsField ? void 0 : `%${value}%`);
2781
- return operatorLC === "doesnotcontain" ? not(expr) : expr;
2782
- }
2783
- case "endswith":
2784
- case "doesnotendwith": {
2785
- const expr = like(column, valueIsField ? void 0 : `%${value}`);
2786
- return operatorLC === "doesnotendwith" ? not(expr) : expr;
2787
- }
2788
- case "null": return isNull(column);
2789
- case "notnull": return not(isNull(column));
2790
- case "in":
2791
- case "notin": {
2792
- const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
2793
- return operatorLC === "notin" ? not(expr) : expr;
2794
- }
2795
- case "between":
2796
- case "notbetween": {
2797
- const valueAsArray = toArray(value);
2798
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2799
- let [first, second] = valueAsArray;
2800
- const shouldParseNumbers = !(parseNumbers === false);
2801
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2802
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2803
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2804
- if (!preserveValueOrder && secondNum < firstNum) {
2805
- const tempNum = secondNum;
2806
- second = firstNum;
2807
- first = tempNum;
2808
- } else {
2809
- first = firstNum;
2810
- second = secondNum;
2811
- }
2812
- } else if (valueIsField) {
2813
- first = asFieldOrValue(first);
2814
- second = asFieldOrValue(second);
2815
- }
2816
- const expr = and(gte(column, first), lte(column, second));
2817
- return operatorLC === "notbetween" ? not(expr) : expr;
2818
- }
2819
- return;
2820
- }
2821
- default: return;
2822
- }
2823
- };
2824
- //#endregion
2825
2639
  //#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
2826
2640
  /**
2827
2641
  * Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
@@ -2834,7 +2648,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
2834
2648
  * @group Export
2835
2649
  */
2836
2650
  const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2837
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
2651
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
2838
2652
  const ops = context.tanStackDbOperators;
2839
2653
  if (!ops) return void 0;
2840
2654
  const { and, eq, not, or } = ops;
@@ -2842,7 +2656,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2842
2656
  const refKeys = Object.keys(refs);
2843
2657
  /* v8 ignore next -- @preserve */
2844
2658
  if (refKeys.length === 0) return fallback;
2845
- const ruleProcessor = defaultRuleProcessorTanStackDB;
2846
2659
  const processRuleGroup = (rg) => {
2847
2660
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
2848
2661
  const processedRules = rg.rules.map((rule) => {
@@ -3240,6 +3053,106 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
3240
3053
  }
3241
3054
  };
3242
3055
  //#endregion
3056
+ //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
3057
+ /**
3058
+ * Default rule processor used by {@link formatQuery} for the "drizzle" format.
3059
+ *
3060
+ * @group Export
3061
+ */
3062
+ const defaultRuleProcessorDrizzle = (rule, _options) => {
3063
+ const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
3064
+ // v8 ignore next
3065
+ const { parseNumbers, preserveValueOrder, context = {} } = opts;
3066
+ const { columns, drizzleOperators, useRawFields } = context;
3067
+ if (!columns || !drizzleOperators) return void 0;
3068
+ const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
3069
+ const { field, operator, value, valueSource } = rule;
3070
+ const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
3071
+ const operatorLC = lc(operator);
3072
+ const valueIsField = valueSource === "field";
3073
+ const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
3074
+ const maybeParseNumber = (v) => {
3075
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
3076
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
3077
+ };
3078
+ if (!column) return void 0;
3079
+ const matchEval = processMatchMode(rule);
3080
+ if (matchEval === false) return;
3081
+ else if (matchEval) {
3082
+ if (opts.preset !== "postgresql") return void 0;
3083
+ const { mode, threshold } = matchEval;
3084
+ const arrayElementAlias = "elem_alias";
3085
+ const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
3086
+ ...r,
3087
+ field: arrayElementAlias
3088
+ }) }), {
3089
+ ...opts,
3090
+ context: {
3091
+ ...opts.context,
3092
+ useRawFields: true
3093
+ }
3094
+ });
3095
+ switch (mode) {
3096
+ case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
3097
+ case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3098
+ case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3099
+ case "atleast":
3100
+ case "atmost":
3101
+ case "exactly": {
3102
+ const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
3103
+ 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}`)}`;
3104
+ }
3105
+ }
3106
+ }
3107
+ switch (operatorLC) {
3108
+ case "=": return eq(column, maybeParseNumber(value));
3109
+ case "!=": return ne(column, maybeParseNumber(value));
3110
+ case ">": return gt(column, maybeParseNumber(value));
3111
+ case "<": return lt(column, maybeParseNumber(value));
3112
+ case ">=": return gte(column, maybeParseNumber(value));
3113
+ case "<=": return lte(column, maybeParseNumber(value));
3114
+ case "beginswith":
3115
+ case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
3116
+ case "contains":
3117
+ case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
3118
+ case "endswith":
3119
+ case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
3120
+ case "null": return isNull(column);
3121
+ case "notnull": return isNotNull(column);
3122
+ case "in":
3123
+ case "notin": {
3124
+ const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
3125
+ return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
3126
+ }
3127
+ case "between":
3128
+ case "notbetween": {
3129
+ const valueAsArray = toArray(value);
3130
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
3131
+ let [first, second] = valueAsArray;
3132
+ const shouldParseNumbers = !(parseNumbers === false);
3133
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
3134
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
3135
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
3136
+ if (!preserveValueOrder && secondNum < firstNum) {
3137
+ const tempNum = secondNum;
3138
+ second = firstNum;
3139
+ first = tempNum;
3140
+ } else {
3141
+ first = firstNum;
3142
+ second = secondNum;
3143
+ }
3144
+ } else if (valueIsField) {
3145
+ first = asFieldOrValue(first);
3146
+ second = asFieldOrValue(second);
3147
+ }
3148
+ return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
3149
+ }
3150
+ return;
3151
+ }
3152
+ default: return;
3153
+ }
3154
+ };
3155
+ //#endregion
3243
3156
  //#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
3244
3157
  const rangeOperatorMap = {
3245
3158
  "<": "lt",
@@ -3889,7 +3802,7 @@ const defaultRuleProcessorSQL = (rule, opts = {}) => {
3889
3802
  case "atmost":
3890
3803
  case "exactly": {
3891
3804
  const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
3892
- return `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;
3805
+ return `(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;
3893
3806
  }
3894
3807
  }
3895
3808
  }
@@ -3956,7 +3869,7 @@ const defaultRuleProcessorParameterized = (rule, opts, meta) => {
3956
3869
  case "atmost":
3957
3870
  case "exactly": {
3958
3871
  const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
3959
- return finalize(`(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`);
3872
+ return finalize(`(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`);
3960
3873
  }
3961
3874
  }
3962
3875
  }
@@ -4209,6 +4122,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
4209
4122
  }
4210
4123
  };
4211
4124
  //#endregion
4125
+ //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
4126
+ /**
4127
+ * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
4128
+ *
4129
+ * @group Export
4130
+ */
4131
+ const defaultRuleProcessorTanStackDB = (rule, _options) => {
4132
+ const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
4133
+ const ops = context.tanStackDbOperators;
4134
+ const refs = context._tanstackDbRefs;
4135
+ const primaryRef = context._tanstackDbPrimaryRef;
4136
+ if (!ops || !refs || !primaryRef) return void 0;
4137
+ const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
4138
+ const resolveField = (fieldName) => {
4139
+ const dotIdx = fieldName.indexOf(".");
4140
+ if (dotIdx > 0) {
4141
+ const prefix = fieldName.slice(0, dotIdx);
4142
+ const rest = fieldName.slice(dotIdx + 1);
4143
+ if (refs[prefix]) return refs[prefix][rest];
4144
+ }
4145
+ return refs[primaryRef][fieldName];
4146
+ };
4147
+ const { field, operator, value, valueSource } = rule;
4148
+ const column = resolveField(field);
4149
+ const operatorLC = lc(operator);
4150
+ const valueIsField = valueSource === "field";
4151
+ const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
4152
+ const maybeParseNumber = (v) => {
4153
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
4154
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
4155
+ };
4156
+ switch (operatorLC) {
4157
+ case "=": return eq(column, maybeParseNumber(value));
4158
+ case "!=": return not(eq(column, maybeParseNumber(value)));
4159
+ case ">": return gt(column, maybeParseNumber(value));
4160
+ case "<": return lt(column, maybeParseNumber(value));
4161
+ case ">=": return gte(column, maybeParseNumber(value));
4162
+ case "<=": return lte(column, maybeParseNumber(value));
4163
+ case "beginswith":
4164
+ case "doesnotbeginwith": {
4165
+ const expr = like(column, valueIsField ? void 0 : `${value}%`);
4166
+ return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
4167
+ }
4168
+ case "contains":
4169
+ case "doesnotcontain": {
4170
+ const expr = like(column, valueIsField ? void 0 : `%${value}%`);
4171
+ return operatorLC === "doesnotcontain" ? not(expr) : expr;
4172
+ }
4173
+ case "endswith":
4174
+ case "doesnotendwith": {
4175
+ const expr = like(column, valueIsField ? void 0 : `%${value}`);
4176
+ return operatorLC === "doesnotendwith" ? not(expr) : expr;
4177
+ }
4178
+ case "null": return isNull(column);
4179
+ case "notnull": return not(isNull(column));
4180
+ case "in":
4181
+ case "notin": {
4182
+ const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
4183
+ return operatorLC === "notin" ? not(expr) : expr;
4184
+ }
4185
+ case "between":
4186
+ case "notbetween": {
4187
+ const valueAsArray = toArray(value);
4188
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
4189
+ let [first, second] = valueAsArray;
4190
+ const shouldParseNumbers = !(parseNumbers === false);
4191
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
4192
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
4193
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
4194
+ if (!preserveValueOrder && secondNum < firstNum) {
4195
+ const tempNum = secondNum;
4196
+ second = firstNum;
4197
+ first = tempNum;
4198
+ } else {
4199
+ first = firstNum;
4200
+ second = secondNum;
4201
+ }
4202
+ } else if (valueIsField) {
4203
+ first = asFieldOrValue(first);
4204
+ second = asFieldOrValue(second);
4205
+ }
4206
+ const expr = and(gte(column, first), lte(column, second));
4207
+ return operatorLC === "notbetween" ? not(expr) : expr;
4208
+ }
4209
+ return;
4210
+ }
4211
+ default: return;
4212
+ }
4213
+ };
4214
+ //#endregion
4212
4215
  //#region src/utils/formatQuery/formatQuery.ts
4213
4216
  /**
4214
4217
  * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
@@ -4458,6 +4461,8 @@ const generateValueProcessor = (vpbr) => (field, operator, value, valueSource) =
4458
4461
  /**
4459
4462
  * Default value processor used by {@link formatQuery} for "sql" format.
4460
4463
  *
4464
+ * @deprecated Prefer {@link defaultValueProcessorByRule}.
4465
+ *
4461
4466
  * @group Export
4462
4467
  */
4463
4468
  const defaultValueProcessor = generateValueProcessor(defaultValueProcessorByRule);
@@ -4772,7 +4777,8 @@ const mergeClassnames = (...args) => ({
4772
4777
  matchThreshold: joinClassnamesByName("matchThreshold", args),
4773
4778
  branches: joinClassnamesByName("branches", args),
4774
4779
  hasSubQuery: joinClassnamesByName("hasSubQuery", args),
4775
- loading: joinClassnamesByName("loading", args)
4780
+ loading: joinClassnamesByName("loading", args),
4781
+ valueDateTimeRelative: joinClassnamesByName("valueDateTimeRelative", args)
4776
4782
  });
4777
4783
  //#endregion
4778
4784
  //#region src/utils/preferProp.ts