@react-querybuilder/core 8.18.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 (74) hide show
  1. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +21 -13
  2. package/dist/cjs/react-querybuilder_core.cjs.development.js +200 -199
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  4. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +21 -13
  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 +21 -13
  56. package/dist/react-querybuilder_core.legacy-esm.d.ts +21 -13
  57. package/dist/react-querybuilder_core.legacy-esm.js +198 -197
  58. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  59. package/dist/react-querybuilder_core.mjs +200 -199
  60. package/dist/react-querybuilder_core.mjs.map +1 -1
  61. package/dist/react-querybuilder_core.production.d.mts +21 -13
  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 +8 -8
  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,7 +614,7 @@ 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
  */
@@ -673,7 +675,7 @@ const numericRegex = new RegExp(numericRegex$1.source.replace(/^\^/, String.raw`
673
675
  /**
674
676
  * Determines if a variable is a plain old JavaScript object, aka POJO.
675
677
  */
676
- 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;
677
679
  /**
678
680
  * Simple helper to determine whether a value is null, undefined, or an empty string.
679
681
  */
@@ -2002,106 +2004,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
2002
2004
  return processRuleGroup(ruleGroup, true);
2003
2005
  };
2004
2006
  //#endregion
2005
- //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
2006
- /**
2007
- * Default rule processor used by {@link formatQuery} for the "drizzle" format.
2008
- *
2009
- * @group Export
2010
- */
2011
- const defaultRuleProcessorDrizzle = (rule, _options) => {
2012
- const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
2013
- // v8 ignore next
2014
- const { parseNumbers, preserveValueOrder, context = {} } = opts;
2015
- const { columns, drizzleOperators, useRawFields } = context;
2016
- if (!columns || !drizzleOperators) return void 0;
2017
- const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
2018
- const { field, operator, value, valueSource } = rule;
2019
- const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
2020
- const operatorLC = lc(operator);
2021
- const valueIsField = valueSource === "field";
2022
- const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
2023
- const maybeParseNumber = (v) => {
2024
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2025
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2026
- };
2027
- if (!column) return void 0;
2028
- const matchEval = processMatchMode(rule);
2029
- if (matchEval === false) return;
2030
- else if (matchEval) {
2031
- if (opts.preset !== "postgresql") return void 0;
2032
- const { mode, threshold } = matchEval;
2033
- const arrayElementAlias = "elem_alias";
2034
- const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
2035
- ...r,
2036
- field: arrayElementAlias
2037
- }) }), {
2038
- ...opts,
2039
- context: {
2040
- ...opts.context,
2041
- useRawFields: true
2042
- }
2043
- });
2044
- switch (mode) {
2045
- case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
2046
- case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2047
- case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2048
- case "atleast":
2049
- case "atmost":
2050
- case "exactly": {
2051
- const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
2052
- 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}`)}`;
2053
- }
2054
- }
2055
- }
2056
- switch (operatorLC) {
2057
- case "=": return eq(column, maybeParseNumber(value));
2058
- case "!=": return ne(column, maybeParseNumber(value));
2059
- case ">": return gt(column, maybeParseNumber(value));
2060
- case "<": return lt(column, maybeParseNumber(value));
2061
- case ">=": return gte(column, maybeParseNumber(value));
2062
- case "<=": return lte(column, maybeParseNumber(value));
2063
- case "beginswith":
2064
- case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
2065
- case "contains":
2066
- case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
2067
- case "endswith":
2068
- case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
2069
- case "null": return isNull(column);
2070
- case "notnull": return isNotNull(column);
2071
- case "in":
2072
- case "notin": {
2073
- const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
2074
- return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
2075
- }
2076
- case "between":
2077
- case "notbetween": {
2078
- const valueAsArray = toArray(value);
2079
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2080
- let [first, second] = valueAsArray;
2081
- const shouldParseNumbers = !(parseNumbers === false);
2082
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2083
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2084
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2085
- if (!preserveValueOrder && secondNum < firstNum) {
2086
- const tempNum = secondNum;
2087
- second = firstNum;
2088
- first = tempNum;
2089
- } else {
2090
- first = firstNum;
2091
- second = secondNum;
2092
- }
2093
- } else if (valueIsField) {
2094
- first = asFieldOrValue(first);
2095
- second = asFieldOrValue(second);
2096
- }
2097
- return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
2098
- }
2099
- return;
2100
- }
2101
- default: return;
2102
- }
2103
- };
2104
- //#endregion
2105
2007
  //#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
2106
2008
  /**
2107
2009
  * Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
@@ -2116,10 +2018,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
2116
2018
  * @group Export
2117
2019
  */
2118
2020
  const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
2119
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
2021
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
2120
2022
  if (!columns || !drizzleOperators) return void 0;
2121
2023
  const { and, not, or } = drizzleOperators;
2122
- const ruleProcessor = defaultRuleProcessorDrizzle;
2123
2024
  const processRuleGroup = (rg, _outermost) => {
2124
2025
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
2125
2026
  const processedRules = rg.rules.map((rule) => {
@@ -2735,96 +2636,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
2735
2636
  return processRuleGroup(ruleGroup, true);
2736
2637
  };
2737
2638
  //#endregion
2738
- //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
2739
- /**
2740
- * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
2741
- *
2742
- * @group Export
2743
- */
2744
- const defaultRuleProcessorTanStackDB = (rule, _options) => {
2745
- const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
2746
- const ops = context.tanStackDbOperators;
2747
- const refs = context._tanstackDbRefs;
2748
- const primaryRef = context._tanstackDbPrimaryRef;
2749
- if (!ops || !refs || !primaryRef) return void 0;
2750
- const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
2751
- const resolveField = (fieldName) => {
2752
- const dotIdx = fieldName.indexOf(".");
2753
- if (dotIdx > 0) {
2754
- const prefix = fieldName.slice(0, dotIdx);
2755
- const rest = fieldName.slice(dotIdx + 1);
2756
- if (refs[prefix]) return refs[prefix][rest];
2757
- }
2758
- return refs[primaryRef][fieldName];
2759
- };
2760
- const { field, operator, value, valueSource } = rule;
2761
- const column = resolveField(field);
2762
- const operatorLC = lc(operator);
2763
- const valueIsField = valueSource === "field";
2764
- const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
2765
- const maybeParseNumber = (v) => {
2766
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2767
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2768
- };
2769
- switch (operatorLC) {
2770
- case "=": return eq(column, maybeParseNumber(value));
2771
- case "!=": return not(eq(column, maybeParseNumber(value)));
2772
- case ">": return gt(column, maybeParseNumber(value));
2773
- case "<": return lt(column, maybeParseNumber(value));
2774
- case ">=": return gte(column, maybeParseNumber(value));
2775
- case "<=": return lte(column, maybeParseNumber(value));
2776
- case "beginswith":
2777
- case "doesnotbeginwith": {
2778
- const expr = like(column, valueIsField ? void 0 : `${value}%`);
2779
- return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
2780
- }
2781
- case "contains":
2782
- case "doesnotcontain": {
2783
- const expr = like(column, valueIsField ? void 0 : `%${value}%`);
2784
- return operatorLC === "doesnotcontain" ? not(expr) : expr;
2785
- }
2786
- case "endswith":
2787
- case "doesnotendwith": {
2788
- const expr = like(column, valueIsField ? void 0 : `%${value}`);
2789
- return operatorLC === "doesnotendwith" ? not(expr) : expr;
2790
- }
2791
- case "null": return isNull(column);
2792
- case "notnull": return not(isNull(column));
2793
- case "in":
2794
- case "notin": {
2795
- const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
2796
- return operatorLC === "notin" ? not(expr) : expr;
2797
- }
2798
- case "between":
2799
- case "notbetween": {
2800
- const valueAsArray = toArray(value);
2801
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2802
- let [first, second] = valueAsArray;
2803
- const shouldParseNumbers = !(parseNumbers === false);
2804
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2805
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2806
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2807
- if (!preserveValueOrder && secondNum < firstNum) {
2808
- const tempNum = secondNum;
2809
- second = firstNum;
2810
- first = tempNum;
2811
- } else {
2812
- first = firstNum;
2813
- second = secondNum;
2814
- }
2815
- } else if (valueIsField) {
2816
- first = asFieldOrValue(first);
2817
- second = asFieldOrValue(second);
2818
- }
2819
- const expr = and(gte(column, first), lte(column, second));
2820
- return operatorLC === "notbetween" ? not(expr) : expr;
2821
- }
2822
- return;
2823
- }
2824
- default: return;
2825
- }
2826
- };
2827
- //#endregion
2828
2639
  //#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
2829
2640
  /**
2830
2641
  * Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
@@ -2837,7 +2648,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
2837
2648
  * @group Export
2838
2649
  */
2839
2650
  const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2840
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
2651
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
2841
2652
  const ops = context.tanStackDbOperators;
2842
2653
  if (!ops) return void 0;
2843
2654
  const { and, eq, not, or } = ops;
@@ -2845,7 +2656,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2845
2656
  const refKeys = Object.keys(refs);
2846
2657
  /* v8 ignore next -- @preserve */
2847
2658
  if (refKeys.length === 0) return fallback;
2848
- const ruleProcessor = defaultRuleProcessorTanStackDB;
2849
2659
  const processRuleGroup = (rg) => {
2850
2660
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
2851
2661
  const processedRules = rg.rules.map((rule) => {
@@ -3243,6 +3053,106 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
3243
3053
  }
3244
3054
  };
3245
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
3246
3156
  //#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
3247
3157
  const rangeOperatorMap = {
3248
3158
  "<": "lt",
@@ -4212,6 +4122,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
4212
4122
  }
4213
4123
  };
4214
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
4215
4215
  //#region src/utils/formatQuery/formatQuery.ts
4216
4216
  /**
4217
4217
  * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
@@ -4777,7 +4777,8 @@ const mergeClassnames = (...args) => ({
4777
4777
  matchThreshold: joinClassnamesByName("matchThreshold", args),
4778
4778
  branches: joinClassnamesByName("branches", args),
4779
4779
  hasSubQuery: joinClassnamesByName("hasSubQuery", args),
4780
- loading: joinClassnamesByName("loading", args)
4780
+ loading: joinClassnamesByName("loading", args),
4781
+ valueDateTimeRelative: joinClassnamesByName("valueDateTimeRelative", args)
4781
4782
  });
4782
4783
  //#endregion
4783
4784
  //#region src/utils/preferProp.ts