@react-querybuilder/core 8.18.0 → 8.19.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 (74) hide show
  1. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +24 -21
  2. package/dist/cjs/react-querybuilder_core.cjs.development.js +222 -238
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  4. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +24 -21
  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 +2 -2
  12. package/dist/formatQuery.d.ts +2 -2
  13. package/dist/formatQuery.js +195 -197
  14. package/dist/formatQuery.js.map +1 -1
  15. package/dist/formatQuery.mjs +195 -197
  16. package/dist/formatQuery.mjs.map +1 -1
  17. package/dist/{objectUtils-DxVaGCdg.js → objectUtils-DBJI82bl.js} +2 -2
  18. package/dist/objectUtils-DBJI82bl.js.map +1 -0
  19. package/dist/{objectUtils-D-w8MzpZ.mjs → objectUtils-ZvPkF6u6.mjs} +2 -2
  20. package/dist/objectUtils-ZvPkF6u6.mjs.map +1 -0
  21. package/dist/parseCEL.js +3 -3
  22. package/dist/parseCEL.js.map +1 -1
  23. package/dist/parseCEL.mjs +3 -3
  24. package/dist/parseCEL.mjs.map +1 -1
  25. package/dist/parseCypher.js.map +1 -1
  26. package/dist/parseCypher.mjs.map +1 -1
  27. package/dist/parseGremlin.js.map +1 -1
  28. package/dist/parseGremlin.mjs.map +1 -1
  29. package/dist/parseJSONata.js +2 -2
  30. package/dist/parseJSONata.js.map +1 -1
  31. package/dist/parseJSONata.mjs +2 -2
  32. package/dist/parseJSONata.mjs.map +1 -1
  33. package/dist/parseJsonLogic.js +4 -4
  34. package/dist/parseJsonLogic.js.map +1 -1
  35. package/dist/parseJsonLogic.mjs +4 -4
  36. package/dist/parseJsonLogic.mjs.map +1 -1
  37. package/dist/parseMongoDB.js +4 -4
  38. package/dist/parseMongoDB.js.map +1 -1
  39. package/dist/parseMongoDB.mjs +4 -4
  40. package/dist/parseMongoDB.mjs.map +1 -1
  41. package/dist/parseSPARQL.js.map +1 -1
  42. package/dist/parseSPARQL.mjs.map +1 -1
  43. package/dist/parseSQL.js +3 -3
  44. package/dist/parseSQL.js.map +1 -1
  45. package/dist/parseSQL.mjs +3 -3
  46. package/dist/parseSQL.mjs.map +1 -1
  47. package/dist/parseSpEL.js +3 -3
  48. package/dist/parseSpEL.js.map +1 -1
  49. package/dist/parseSpEL.mjs +3 -3
  50. package/dist/parseSpEL.mjs.map +1 -1
  51. package/dist/{prepareQueryObjects-BXf5aV-A.mjs → prepareQueryObjects-Cd_tt4oy.mjs} +3 -3
  52. package/dist/{prepareQueryObjects-BXf5aV-A.mjs.map → prepareQueryObjects-Cd_tt4oy.mjs.map} +1 -1
  53. package/dist/{prepareQueryObjects-gRQqiBPR.js → prepareQueryObjects-DaAXX792.js} +3 -3
  54. package/dist/{prepareQueryObjects-gRQqiBPR.js.map → prepareQueryObjects-DaAXX792.js.map} +1 -1
  55. package/dist/react-querybuilder_core.d.mts +24 -21
  56. package/dist/react-querybuilder_core.legacy-esm.d.ts +24 -21
  57. package/dist/react-querybuilder_core.legacy-esm.js +221 -236
  58. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  59. package/dist/react-querybuilder_core.mjs +222 -238
  60. package/dist/react-querybuilder_core.mjs.map +1 -1
  61. package/dist/react-querybuilder_core.production.d.mts +24 -21
  62. package/dist/react-querybuilder_core.production.mjs +1 -1
  63. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  64. package/dist/transformQuery.js +1 -1
  65. package/dist/transformQuery.mjs +1 -1
  66. package/dist/{utils-ZlKseh1X.js → utils-BpaOtylk.js} +3 -3
  67. package/dist/utils-BpaOtylk.js.map +1 -0
  68. package/dist/{utils-01WaTGBL.mjs → utils-CJRGiPb-.mjs} +3 -3
  69. package/dist/utils-CJRGiPb-.mjs.map +1 -0
  70. package/package.json +10 -9
  71. package/dist/objectUtils-D-w8MzpZ.mjs.map +0 -1
  72. package/dist/objectUtils-DxVaGCdg.js.map +0 -1
  73. package/dist/utils-01WaTGBL.mjs.map +0 -1
  74. package/dist/utils-ZlKseh1X.js.map +0 -1
@@ -429,7 +429,8 @@ const standardClassnames = {
429
429
  branches: "queryBuilder-branches",
430
430
  justified: "queryBuilder-justified",
431
431
  hasSubQuery: "rule-hasSubQuery",
432
- loading: "queryBuilder-loading"
432
+ loading: "queryBuilder-loading",
433
+ valueDateTimeRelative: "rule-value-dateTimeRelative"
433
434
  };
434
435
  /**
435
436
  * Default classnames for each component.
@@ -479,7 +480,8 @@ const defaultControlClassnames = {
479
480
  valueListItem: "",
480
481
  branches: "",
481
482
  hasSubQuery: "",
482
- loading: ""
483
+ loading: "",
484
+ valueDateTimeRelative: ""
483
485
  };
484
486
  /**
485
487
  * Default reason codes for a group being invalid.
@@ -612,51 +614,25 @@ const trimIfString = (val) => typeof val === "string" ? val.trim() : val;
612
614
  * Splits a string by comma then trims each element. Arrays are returned as is except
613
615
  * any string elements are trimmed.
614
616
  */
615
- 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] : [];
616
618
  /**
617
619
  * Determines if an array is free of `null`/`undefined`.
618
620
  */
619
621
  const nullFreeArray = (arr) => arr.every((el) => el === false || (el !== null && el !== void 0 ? el : false) !== false);
620
622
  //#endregion
621
- //#region src/utils/clsx.ts
622
- /* v8 ignore start -- @preserve */
623
- function toVal(mix) {
624
- let k;
625
- let y;
626
- let str = "";
627
- if (typeof mix === "string" || typeof mix === "number") str += mix;
628
- else if (typeof mix === "object") {
629
- if (Array.isArray(mix)) {
630
- const len = mix.length;
631
- for (k = 0; k < len; k++) if (mix[k] && (y = toVal(mix[k]))) {
632
- str && (str += " ");
633
- str += y;
634
- }
635
- } else for (y in mix) if (mix[y]) {
636
- str && (str += " ");
637
- str += y;
638
- }
639
- }
640
- return str;
623
+ //#region ../../node_modules/clsx/dist/clsx.mjs
624
+ function r(e) {
625
+ var t, f, n = "";
626
+ if ("string" == typeof e || "number" == typeof e) n += e;
627
+ else if ("object" == typeof e) if (Array.isArray(e)) {
628
+ var o = e.length;
629
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
630
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
631
+ return n;
641
632
  }
642
- /* v8 ignore stop -- @preserve */
643
- /**
644
- * Vendored/adapted version of the `clsx` package.
645
- *
646
- * **NOTE:** Prefer the official package from npm outside the context of React Query Builder.
647
- */
648
- // v8 ignore next
649
- function clsx(...args) {
650
- let i = 0;
651
- let tmp;
652
- let x;
653
- let str = "";
654
- const len = args.length;
655
- for (; i < len; i++) if ((tmp = args[i]) && (x = toVal(tmp))) {
656
- str && (str += " ");
657
- str += x;
658
- }
659
- return str;
633
+ function clsx() {
634
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
635
+ return n;
660
636
  }
661
637
  //#endregion
662
638
  //#region src/utils/misc.ts
@@ -673,7 +649,7 @@ const numericRegex = new RegExp(numericRegex$1.source.replace(/^\^/, String.raw`
673
649
  /**
674
650
  * Determines if a variable is a plain old JavaScript object, aka POJO.
675
651
  */
676
- const isPojo = (obj) => obj === null || typeof obj !== "object" ? false : Object.getPrototypeOf(obj) === Object.prototype;
652
+ const isPojo = (obj) => obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype;
677
653
  /**
678
654
  * Simple helper to determine whether a value is null, undefined, or an empty string.
679
655
  */
@@ -697,7 +673,7 @@ const isRuleGroupType = (rg) => isRuleGroup(rg) && typeof rg.combinator === "str
697
673
  */
698
674
  const isRuleGroupTypeIC = (rg) => isRuleGroup(rg) && rg.combinator === void 0;
699
675
  //#endregion
700
- //#region \0@oxc-project+runtime@0.132.0/helpers/typeof.js
676
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/typeof.js
701
677
  function _typeof(o) {
702
678
  "@babel/helpers - typeof";
703
679
  return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
@@ -707,7 +683,7 @@ function _typeof(o) {
707
683
  }, _typeof(o);
708
684
  }
709
685
  //#endregion
710
- //#region \0@oxc-project+runtime@0.132.0/helpers/toPrimitive.js
686
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/toPrimitive.js
711
687
  function toPrimitive(t, r) {
712
688
  if ("object" != _typeof(t) || !t) return t;
713
689
  var e = t[Symbol.toPrimitive];
@@ -719,13 +695,13 @@ function toPrimitive(t, r) {
719
695
  return ("string" === r ? String : Number)(t);
720
696
  }
721
697
  //#endregion
722
- //#region \0@oxc-project+runtime@0.132.0/helpers/toPropertyKey.js
698
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/toPropertyKey.js
723
699
  function toPropertyKey(t) {
724
700
  var i = toPrimitive(t, "string");
725
701
  return "symbol" == _typeof(i) ? i : i + "";
726
702
  }
727
703
  //#endregion
728
- //#region \0@oxc-project+runtime@0.132.0/helpers/defineProperty.js
704
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/defineProperty.js
729
705
  function _defineProperty(e, r, t) {
730
706
  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
731
707
  value: t,
@@ -735,7 +711,7 @@ function _defineProperty(e, r, t) {
735
711
  }) : e[r] = t, e;
736
712
  }
737
713
  //#endregion
738
- //#region \0@oxc-project+runtime@0.132.0/helpers/objectSpread2.js
714
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/objectSpread2.js
739
715
  function ownKeys(e, r) {
740
716
  var t = Object.keys(e);
741
717
  if (Object.getOwnPropertySymbols) {
@@ -758,7 +734,7 @@ function _objectSpread2(e) {
758
734
  return e;
759
735
  }
760
736
  //#endregion
761
- //#region \0@oxc-project+runtime@0.132.0/helpers/objectWithoutPropertiesLoose.js
737
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/objectWithoutPropertiesLoose.js
762
738
  function _objectWithoutPropertiesLoose(r, e) {
763
739
  if (null == r) return {};
764
740
  var t = {};
@@ -769,7 +745,7 @@ function _objectWithoutPropertiesLoose(r, e) {
769
745
  return t;
770
746
  }
771
747
  //#endregion
772
- //#region \0@oxc-project+runtime@0.132.0/helpers/objectWithoutProperties.js
748
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/objectWithoutProperties.js
773
749
  function _objectWithoutProperties(e, t) {
774
750
  if (null == e) return {};
775
751
  var o, r, i = _objectWithoutPropertiesLoose(e, t);
@@ -2064,97 +2040,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
2064
2040
  return processRuleGroup(ruleGroup, true);
2065
2041
  };
2066
2042
  //#endregion
2067
- //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
2068
- /**
2069
- * Default rule processor used by {@link formatQuery} for the "drizzle" format.
2070
- *
2071
- * @group Export
2072
- */
2073
- const defaultRuleProcessorDrizzle = (rule, _options) => {
2074
- const opts = _options !== null && _options !== void 0 ? _options : /* v8 ignore start -- @preserve */ {};
2075
- // v8 ignore next
2076
- const { parseNumbers, preserveValueOrder, context = {} } = opts;
2077
- const { columns, drizzleOperators, useRawFields } = context;
2078
- if (!columns || !drizzleOperators) return void 0;
2079
- const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
2080
- const { field, operator, value, valueSource } = rule;
2081
- const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
2082
- const operatorLC = lc(operator);
2083
- const valueIsField = valueSource === "field";
2084
- const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
2085
- const maybeParseNumber = (v) => {
2086
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2087
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2088
- };
2089
- if (!column) return void 0;
2090
- const matchEval = processMatchMode(rule);
2091
- if (matchEval === false) return;
2092
- else if (matchEval) {
2093
- if (opts.preset !== "postgresql") return void 0;
2094
- const { mode, threshold } = matchEval;
2095
- const arrayElementAlias = "elem_alias";
2096
- const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => _objectSpread2(_objectSpread2({}, r), {}, { field: arrayElementAlias }) }), _objectSpread2(_objectSpread2({}, opts), {}, { context: _objectSpread2(_objectSpread2({}, opts.context), {}, { useRawFields: true }) }));
2097
- switch (mode) {
2098
- case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
2099
- case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2100
- case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2101
- case "atleast":
2102
- case "atmost":
2103
- case "exactly": {
2104
- const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
2105
- 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}`)}`;
2106
- }
2107
- }
2108
- }
2109
- switch (operatorLC) {
2110
- case "=": return eq(column, maybeParseNumber(value));
2111
- case "!=": return ne(column, maybeParseNumber(value));
2112
- case ">": return gt(column, maybeParseNumber(value));
2113
- case "<": return lt(column, maybeParseNumber(value));
2114
- case ">=": return gte(column, maybeParseNumber(value));
2115
- case "<=": return lte(column, maybeParseNumber(value));
2116
- case "beginswith":
2117
- case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
2118
- case "contains":
2119
- case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
2120
- case "endswith":
2121
- case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
2122
- case "null": return isNull(column);
2123
- case "notnull": return isNotNull(column);
2124
- case "in":
2125
- case "notin": {
2126
- const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
2127
- return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
2128
- }
2129
- case "between":
2130
- case "notbetween": {
2131
- const valueAsArray = toArray(value);
2132
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2133
- let [first, second] = valueAsArray;
2134
- const shouldParseNumbers = !(parseNumbers === false);
2135
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2136
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2137
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2138
- if (!preserveValueOrder && secondNum < firstNum) {
2139
- const tempNum = secondNum;
2140
- second = firstNum;
2141
- first = tempNum;
2142
- } else {
2143
- first = firstNum;
2144
- second = secondNum;
2145
- }
2146
- } else if (valueIsField) {
2147
- first = asFieldOrValue(first);
2148
- second = asFieldOrValue(second);
2149
- }
2150
- return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
2151
- }
2152
- return;
2153
- }
2154
- default: return;
2155
- }
2156
- };
2157
- //#endregion
2158
2043
  //#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
2159
2044
  /**
2160
2045
  * Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
@@ -2169,10 +2054,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
2169
2054
  * @group Export
2170
2055
  */
2171
2056
  const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
2172
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
2057
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
2173
2058
  if (!columns || !drizzleOperators) return void 0;
2174
2059
  const { and, not, or } = drizzleOperators;
2175
- const ruleProcessor = defaultRuleProcessorDrizzle;
2176
2060
  const processRuleGroup = (rg, _outermost) => {
2177
2061
  var _rg$id;
2178
2062
  if (!isRuleOrGroupValid(rg, validationMap[(_rg$id = rg.id) !== null && _rg$id !== void 0 ? _rg$id : /* v8 ignore start -- @preserve */ ""])) return;
@@ -2798,96 +2682,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
2798
2682
  return processRuleGroup(ruleGroup, true);
2799
2683
  };
2800
2684
  //#endregion
2801
- //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
2802
- /**
2803
- * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
2804
- *
2805
- * @group Export
2806
- */
2807
- const defaultRuleProcessorTanStackDB = (rule, _options) => {
2808
- const { parseNumbers, preserveValueOrder, context = {} } = _options !== null && _options !== void 0 ? _options : /* v8 ignore start -- @preserve */ {};
2809
- const ops = context.tanStackDbOperators;
2810
- const refs = context._tanstackDbRefs;
2811
- const primaryRef = context._tanstackDbPrimaryRef;
2812
- if (!ops || !refs || !primaryRef) return void 0;
2813
- const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
2814
- const resolveField = (fieldName) => {
2815
- const dotIdx = fieldName.indexOf(".");
2816
- if (dotIdx > 0) {
2817
- const prefix = fieldName.slice(0, dotIdx);
2818
- const rest = fieldName.slice(dotIdx + 1);
2819
- if (refs[prefix]) return refs[prefix][rest];
2820
- }
2821
- return refs[primaryRef][fieldName];
2822
- };
2823
- const { field, operator, value, valueSource } = rule;
2824
- const column = resolveField(field);
2825
- const operatorLC = lc(operator);
2826
- const valueIsField = valueSource === "field";
2827
- const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
2828
- const maybeParseNumber = (v) => {
2829
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2830
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2831
- };
2832
- switch (operatorLC) {
2833
- case "=": return eq(column, maybeParseNumber(value));
2834
- case "!=": return not(eq(column, maybeParseNumber(value)));
2835
- case ">": return gt(column, maybeParseNumber(value));
2836
- case "<": return lt(column, maybeParseNumber(value));
2837
- case ">=": return gte(column, maybeParseNumber(value));
2838
- case "<=": return lte(column, maybeParseNumber(value));
2839
- case "beginswith":
2840
- case "doesnotbeginwith": {
2841
- const expr = like(column, valueIsField ? void 0 : `${value}%`);
2842
- return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
2843
- }
2844
- case "contains":
2845
- case "doesnotcontain": {
2846
- const expr = like(column, valueIsField ? void 0 : `%${value}%`);
2847
- return operatorLC === "doesnotcontain" ? not(expr) : expr;
2848
- }
2849
- case "endswith":
2850
- case "doesnotendwith": {
2851
- const expr = like(column, valueIsField ? void 0 : `%${value}`);
2852
- return operatorLC === "doesnotendwith" ? not(expr) : expr;
2853
- }
2854
- case "null": return isNull(column);
2855
- case "notnull": return not(isNull(column));
2856
- case "in":
2857
- case "notin": {
2858
- const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
2859
- return operatorLC === "notin" ? not(expr) : expr;
2860
- }
2861
- case "between":
2862
- case "notbetween": {
2863
- const valueAsArray = toArray(value);
2864
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2865
- let [first, second] = valueAsArray;
2866
- const shouldParseNumbers = !(parseNumbers === false);
2867
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2868
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2869
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2870
- if (!preserveValueOrder && secondNum < firstNum) {
2871
- const tempNum = secondNum;
2872
- second = firstNum;
2873
- first = tempNum;
2874
- } else {
2875
- first = firstNum;
2876
- second = secondNum;
2877
- }
2878
- } else if (valueIsField) {
2879
- first = asFieldOrValue(first);
2880
- second = asFieldOrValue(second);
2881
- }
2882
- const expr = and(gte(column, first), lte(column, second));
2883
- return operatorLC === "notbetween" ? not(expr) : expr;
2884
- }
2885
- return;
2886
- }
2887
- default: return;
2888
- }
2889
- };
2890
- //#endregion
2891
2685
  //#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
2892
2686
  /**
2893
2687
  * Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
@@ -2901,7 +2695,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
2901
2695
  */
2902
2696
  const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2903
2697
  var _processRuleGroup;
2904
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
2698
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
2905
2699
  const ops = context.tanStackDbOperators;
2906
2700
  if (!ops) return void 0;
2907
2701
  const { and, eq, not, or } = ops;
@@ -2909,7 +2703,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2909
2703
  const refKeys = Object.keys(refs);
2910
2704
  /* v8 ignore next -- @preserve */
2911
2705
  if (refKeys.length === 0) return fallback;
2912
- const ruleProcessor = defaultRuleProcessorTanStackDB;
2913
2706
  const processRuleGroup = (rg) => {
2914
2707
  var _rg$id;
2915
2708
  if (!isRuleOrGroupValid(rg, validationMap[(_rg$id = rg.id) !== null && _rg$id !== void 0 ? _rg$id : /* v8 ignore start -- @preserve */ ""])) return;
@@ -3305,6 +3098,97 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
3305
3098
  }
3306
3099
  };
3307
3100
  //#endregion
3101
+ //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
3102
+ /**
3103
+ * Default rule processor used by {@link formatQuery} for the "drizzle" format.
3104
+ *
3105
+ * @group Export
3106
+ */
3107
+ const defaultRuleProcessorDrizzle = (rule, _options) => {
3108
+ const opts = _options !== null && _options !== void 0 ? _options : /* v8 ignore start -- @preserve */ {};
3109
+ // v8 ignore next
3110
+ const { parseNumbers, preserveValueOrder, context = {} } = opts;
3111
+ const { columns, drizzleOperators, useRawFields } = context;
3112
+ if (!columns || !drizzleOperators) return void 0;
3113
+ const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
3114
+ const { field, operator, value, valueSource } = rule;
3115
+ const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
3116
+ const operatorLC = lc(operator);
3117
+ const valueIsField = valueSource === "field";
3118
+ const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
3119
+ const maybeParseNumber = (v) => {
3120
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
3121
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
3122
+ };
3123
+ if (!column) return void 0;
3124
+ const matchEval = processMatchMode(rule);
3125
+ if (matchEval === false) return;
3126
+ else if (matchEval) {
3127
+ if (opts.preset !== "postgresql") return void 0;
3128
+ const { mode, threshold } = matchEval;
3129
+ const arrayElementAlias = "elem_alias";
3130
+ const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => _objectSpread2(_objectSpread2({}, r), {}, { field: arrayElementAlias }) }), _objectSpread2(_objectSpread2({}, opts), {}, { context: _objectSpread2(_objectSpread2({}, opts.context), {}, { useRawFields: true }) }));
3131
+ switch (mode) {
3132
+ case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
3133
+ case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3134
+ case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3135
+ case "atleast":
3136
+ case "atmost":
3137
+ case "exactly": {
3138
+ const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
3139
+ 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}`)}`;
3140
+ }
3141
+ }
3142
+ }
3143
+ switch (operatorLC) {
3144
+ case "=": return eq(column, maybeParseNumber(value));
3145
+ case "!=": return ne(column, maybeParseNumber(value));
3146
+ case ">": return gt(column, maybeParseNumber(value));
3147
+ case "<": return lt(column, maybeParseNumber(value));
3148
+ case ">=": return gte(column, maybeParseNumber(value));
3149
+ case "<=": return lte(column, maybeParseNumber(value));
3150
+ case "beginswith":
3151
+ case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
3152
+ case "contains":
3153
+ case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
3154
+ case "endswith":
3155
+ case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
3156
+ case "null": return isNull(column);
3157
+ case "notnull": return isNotNull(column);
3158
+ case "in":
3159
+ case "notin": {
3160
+ const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
3161
+ return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
3162
+ }
3163
+ case "between":
3164
+ case "notbetween": {
3165
+ const valueAsArray = toArray(value);
3166
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
3167
+ let [first, second] = valueAsArray;
3168
+ const shouldParseNumbers = !(parseNumbers === false);
3169
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
3170
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
3171
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
3172
+ if (!preserveValueOrder && secondNum < firstNum) {
3173
+ const tempNum = secondNum;
3174
+ second = firstNum;
3175
+ first = tempNum;
3176
+ } else {
3177
+ first = firstNum;
3178
+ second = secondNum;
3179
+ }
3180
+ } else if (valueIsField) {
3181
+ first = asFieldOrValue(first);
3182
+ second = asFieldOrValue(second);
3183
+ }
3184
+ return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
3185
+ }
3186
+ return;
3187
+ }
3188
+ default: return;
3189
+ }
3190
+ };
3191
+ //#endregion
3308
3192
  //#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
3309
3193
  const rangeOperatorMap = {
3310
3194
  "<": "lt",
@@ -4266,6 +4150,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
4266
4150
  }
4267
4151
  };
4268
4152
  //#endregion
4153
+ //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
4154
+ /**
4155
+ * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
4156
+ *
4157
+ * @group Export
4158
+ */
4159
+ const defaultRuleProcessorTanStackDB = (rule, _options) => {
4160
+ const { parseNumbers, preserveValueOrder, context = {} } = _options !== null && _options !== void 0 ? _options : /* v8 ignore start -- @preserve */ {};
4161
+ const ops = context.tanStackDbOperators;
4162
+ const refs = context._tanstackDbRefs;
4163
+ const primaryRef = context._tanstackDbPrimaryRef;
4164
+ if (!ops || !refs || !primaryRef) return void 0;
4165
+ const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
4166
+ const resolveField = (fieldName) => {
4167
+ const dotIdx = fieldName.indexOf(".");
4168
+ if (dotIdx > 0) {
4169
+ const prefix = fieldName.slice(0, dotIdx);
4170
+ const rest = fieldName.slice(dotIdx + 1);
4171
+ if (refs[prefix]) return refs[prefix][rest];
4172
+ }
4173
+ return refs[primaryRef][fieldName];
4174
+ };
4175
+ const { field, operator, value, valueSource } = rule;
4176
+ const column = resolveField(field);
4177
+ const operatorLC = lc(operator);
4178
+ const valueIsField = valueSource === "field";
4179
+ const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
4180
+ const maybeParseNumber = (v) => {
4181
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
4182
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
4183
+ };
4184
+ switch (operatorLC) {
4185
+ case "=": return eq(column, maybeParseNumber(value));
4186
+ case "!=": return not(eq(column, maybeParseNumber(value)));
4187
+ case ">": return gt(column, maybeParseNumber(value));
4188
+ case "<": return lt(column, maybeParseNumber(value));
4189
+ case ">=": return gte(column, maybeParseNumber(value));
4190
+ case "<=": return lte(column, maybeParseNumber(value));
4191
+ case "beginswith":
4192
+ case "doesnotbeginwith": {
4193
+ const expr = like(column, valueIsField ? void 0 : `${value}%`);
4194
+ return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
4195
+ }
4196
+ case "contains":
4197
+ case "doesnotcontain": {
4198
+ const expr = like(column, valueIsField ? void 0 : `%${value}%`);
4199
+ return operatorLC === "doesnotcontain" ? not(expr) : expr;
4200
+ }
4201
+ case "endswith":
4202
+ case "doesnotendwith": {
4203
+ const expr = like(column, valueIsField ? void 0 : `%${value}`);
4204
+ return operatorLC === "doesnotendwith" ? not(expr) : expr;
4205
+ }
4206
+ case "null": return isNull(column);
4207
+ case "notnull": return not(isNull(column));
4208
+ case "in":
4209
+ case "notin": {
4210
+ const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
4211
+ return operatorLC === "notin" ? not(expr) : expr;
4212
+ }
4213
+ case "between":
4214
+ case "notbetween": {
4215
+ const valueAsArray = toArray(value);
4216
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
4217
+ let [first, second] = valueAsArray;
4218
+ const shouldParseNumbers = !(parseNumbers === false);
4219
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
4220
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
4221
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
4222
+ if (!preserveValueOrder && secondNum < firstNum) {
4223
+ const tempNum = secondNum;
4224
+ second = firstNum;
4225
+ first = tempNum;
4226
+ } else {
4227
+ first = firstNum;
4228
+ second = secondNum;
4229
+ }
4230
+ } else if (valueIsField) {
4231
+ first = asFieldOrValue(first);
4232
+ second = asFieldOrValue(second);
4233
+ }
4234
+ const expr = and(gte(column, first), lte(column, second));
4235
+ return operatorLC === "notbetween" ? not(expr) : expr;
4236
+ }
4237
+ return;
4238
+ }
4239
+ default: return;
4240
+ }
4241
+ };
4242
+ //#endregion
4269
4243
  //#region src/utils/formatQuery/formatQuery.ts
4270
4244
  /**
4271
4245
  * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
@@ -4795,7 +4769,17 @@ const mergeAnyTranslation = (el, keyPropContextMap, defaults) => {
4795
4769
  };
4796
4770
  //#endregion
4797
4771
  //#region src/utils/mergeClassnames.ts
4798
- const joinClassnamesByName = (name, args) => clsx(args.map((c) => clsx(c === null || c === void 0 ? void 0 : c[name])));
4772
+ const joinClassnamesByName = (name, args) => {
4773
+ let result = "";
4774
+ for (let i = 0; i < args.length; i++) {
4775
+ var _args$i;
4776
+ const v = (_args$i = args[i]) === null || _args$i === void 0 ? void 0 : _args$i[name];
4777
+ if (!v) continue;
4778
+ const s = typeof v === "string" ? v : clsx(v);
4779
+ if (s) result = result ? `${result} ${s}` : s;
4780
+ }
4781
+ return result;
4782
+ };
4799
4783
  /**
4800
4784
  * Merges a list of partial {@link Classnames} definitions into a single definition.
4801
4785
  */
@@ -4842,7 +4826,8 @@ const mergeClassnames = (...args) => ({
4842
4826
  matchThreshold: joinClassnamesByName("matchThreshold", args),
4843
4827
  branches: joinClassnamesByName("branches", args),
4844
4828
  hasSubQuery: joinClassnamesByName("hasSubQuery", args),
4845
- loading: joinClassnamesByName("loading", args)
4829
+ loading: joinClassnamesByName("loading", args),
4830
+ valueDateTimeRelative: joinClassnamesByName("valueDateTimeRelative", args)
4846
4831
  });
4847
4832
  //#endregion
4848
4833
  //#region src/utils/preferProp.ts