@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
@@ -2581,6 +2581,10 @@ interface Classnames {
2581
2581
  * Classname(s) applied to async components in their "loading" state.
2582
2582
  */
2583
2583
  loading: Classname;
2584
+ /**
2585
+ * Classname(s) applied to value editors for relative date/time values.
2586
+ */
2587
+ valueDateTimeRelative: Classname;
2584
2588
  }
2585
2589
  /**
2586
2590
  * Placeholder strings for option lists.
@@ -2948,6 +2952,7 @@ declare const standardClassnames: {
2948
2952
  readonly justified: "queryBuilder-justified";
2949
2953
  readonly hasSubQuery: "rule-hasSubQuery";
2950
2954
  readonly loading: "queryBuilder-loading";
2955
+ readonly valueDateTimeRelative: "rule-value-dateTimeRelative";
2951
2956
  };
2952
2957
  /**
2953
2958
  * Default classnames for each component.
@@ -3052,20 +3057,23 @@ declare const splitBy: (str?: string, splitChar?: string) => string[];
3052
3057
  * // would return
3053
3058
  * 'this\\,\\,that, , the other, , , \\,'
3054
3059
  */
3055
- declare const joinWith: (strArr: any[], joinChar?: string) => string;
3060
+ declare const joinWith: (strArr: unknown[], joinChar?: string) => string;
3061
+ type IsUnknown<T> = unknown extends T ? true : false;
3062
+ type Trimmed<T> = IsUnknown<T> extends true ? string : T;
3056
3063
  /**
3057
3064
  * Trims the value if it is a string. Otherwise returns the value as is.
3058
3065
  */
3059
- declare const trimIfString: (val: any) => any;
3066
+ declare const trimIfString: <T>(val: T) => Trimmed<T>;
3067
+ type ToArrayResult<T> = IsUnknown<T> extends true ? string[] : T extends readonly (infer U)[] ? Trimmed<U>[] : T extends string ? string[] : T extends number ? number[] : never[];
3060
3068
  /**
3061
3069
  * Splits a string by comma then trims each element. Arrays are returned as is except
3062
3070
  * any string elements are trimmed.
3063
3071
  */
3064
- declare const toArray: (a: any, {
3072
+ declare const toArray: <T>(a: T, {
3065
3073
  retainEmptyStrings
3066
3074
  }?: {
3067
3075
  retainEmptyStrings?: boolean;
3068
- }) => any[];
3076
+ }) => ToArrayResult<T>;
3069
3077
  /**
3070
3078
  * Determines if an array is free of `null`/`undefined`.
3071
3079
  */
@@ -3782,7 +3790,7 @@ declare const numerifyValues: (rg: RuleGroupTypeAny, options: SetRequired<Format
3782
3790
  *
3783
3791
  * @group Export
3784
3792
  */
3785
- declare const isValidValue: (value: any) => boolean;
3793
+ declare const isValidValue: (value: unknown) => boolean;
3786
3794
  /**
3787
3795
  * Determines whether {@link formatQuery} should render the given value as a number.
3788
3796
  * As long as `parseNumbers` is `true`, `number` and `bigint` values will return `true` and
@@ -3790,7 +3798,7 @@ declare const isValidValue: (value: any) => boolean;
3790
3798
  *
3791
3799
  * @group Export
3792
3800
  */
3793
- declare const shouldRenderAsNumber: (value: any, parseNumbers?: boolean) => boolean;
3801
+ declare const shouldRenderAsNumber: (value: unknown, parseNumbers?: boolean) => boolean;
3794
3802
  /**
3795
3803
  * Used by {@link formatQuery} to determine whether the given value processor is a
3796
3804
  * "legacy" value processor by counting the number of arguments. Legacy value
@@ -4053,7 +4061,7 @@ declare const numericRegex: RegExp;
4053
4061
  /**
4054
4062
  * Determines if a variable is a plain old JavaScript object, aka POJO.
4055
4063
  */
4056
- declare const isPojo: (obj: any) => obj is Record<string, any>;
4064
+ declare const isPojo: (obj: unknown) => obj is Record<string, any>;
4057
4065
  /**
4058
4066
  * Simple helper to determine whether a value is null, undefined, or an empty string.
4059
4067
  */
@@ -4134,25 +4142,25 @@ declare const uniqByIdentifier: <T extends RequireAtLeastOne$1<{
4134
4142
  *
4135
4143
  * @group Option Lists
4136
4144
  */
4137
- declare const isOptionGroupArray: (arr: any) => arr is OptionGroup<BaseOption>[];
4145
+ declare const isOptionGroupArray: (arr: unknown) => arr is OptionGroup<BaseOption>[];
4138
4146
  /**
4139
4147
  * Determines if an array is a flat array of {@link FlexibleOption}.
4140
4148
  *
4141
4149
  * @group Option Lists
4142
4150
  */
4143
- declare const isFlexibleOptionArray: (arr: any) => arr is FlexibleOption[];
4151
+ declare const isFlexibleOptionArray: (arr: unknown) => arr is FlexibleOption[];
4144
4152
  /**
4145
4153
  * Determines if an array is a flat array of {@link FullOption}.
4146
4154
  *
4147
4155
  * @group Option Lists
4148
4156
  */
4149
- declare const isFullOptionArray: (arr: any) => arr is FullOption[];
4157
+ declare const isFullOptionArray: (arr: unknown) => arr is FullOption[];
4150
4158
  /**
4151
4159
  * Determines if a {@link FlexibleOptionList} is a {@link FlexibleOptionGroup} array.
4152
4160
  *
4153
4161
  * @group Option Lists
4154
4162
  */
4155
- declare const isFlexibleOptionGroupArray: (arr: any, {
4163
+ declare const isFlexibleOptionGroupArray: (arr: unknown, {
4156
4164
  allowEmpty
4157
4165
  }?: {
4158
4166
  allowEmpty?: boolean;
@@ -4162,7 +4170,7 @@ declare const isFlexibleOptionGroupArray: (arr: any, {
4162
4170
  *
4163
4171
  * @group Option Lists
4164
4172
  */
4165
- declare const isFullOptionGroupArray: (arr: any, {
4173
+ declare const isFullOptionGroupArray: (arr: unknown, {
4166
4174
  allowEmpty
4167
4175
  }?: {
4168
4176
  allowEmpty?: boolean;
@@ -4237,7 +4245,7 @@ interface ParseNumberOptions {
4237
4245
  * If that returns `NaN`, the string is returned unchanged. Numeric values are returned
4238
4246
  * as-is regardless of the `parseNumbers` option.
4239
4247
  */
4240
- declare const parseNumber: (val: any, {
4248
+ declare const parseNumber: (val: unknown, {
4241
4249
  parseNumbers,
4242
4250
  bigIntOnOverflow
4243
4251
  }?: ParseNumberOptions) => any;
@@ -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
  */
@@ -697,7 +699,7 @@ const isRuleGroupType = (rg) => isRuleGroup(rg) && typeof rg.combinator === "str
697
699
  */
698
700
  const isRuleGroupTypeIC = (rg) => isRuleGroup(rg) && rg.combinator === void 0;
699
701
  //#endregion
700
- //#region \0@oxc-project+runtime@0.132.0/helpers/typeof.js
702
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/typeof.js
701
703
  function _typeof(o) {
702
704
  "@babel/helpers - typeof";
703
705
  return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
@@ -707,7 +709,7 @@ function _typeof(o) {
707
709
  }, _typeof(o);
708
710
  }
709
711
  //#endregion
710
- //#region \0@oxc-project+runtime@0.132.0/helpers/toPrimitive.js
712
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/toPrimitive.js
711
713
  function toPrimitive(t, r) {
712
714
  if ("object" != _typeof(t) || !t) return t;
713
715
  var e = t[Symbol.toPrimitive];
@@ -719,13 +721,13 @@ function toPrimitive(t, r) {
719
721
  return ("string" === r ? String : Number)(t);
720
722
  }
721
723
  //#endregion
722
- //#region \0@oxc-project+runtime@0.132.0/helpers/toPropertyKey.js
724
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/toPropertyKey.js
723
725
  function toPropertyKey(t) {
724
726
  var i = toPrimitive(t, "string");
725
727
  return "symbol" == _typeof(i) ? i : i + "";
726
728
  }
727
729
  //#endregion
728
- //#region \0@oxc-project+runtime@0.132.0/helpers/defineProperty.js
730
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/defineProperty.js
729
731
  function _defineProperty(e, r, t) {
730
732
  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
731
733
  value: t,
@@ -735,7 +737,7 @@ function _defineProperty(e, r, t) {
735
737
  }) : e[r] = t, e;
736
738
  }
737
739
  //#endregion
738
- //#region \0@oxc-project+runtime@0.132.0/helpers/objectSpread2.js
740
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/objectSpread2.js
739
741
  function ownKeys(e, r) {
740
742
  var t = Object.keys(e);
741
743
  if (Object.getOwnPropertySymbols) {
@@ -758,7 +760,7 @@ function _objectSpread2(e) {
758
760
  return e;
759
761
  }
760
762
  //#endregion
761
- //#region \0@oxc-project+runtime@0.132.0/helpers/objectWithoutPropertiesLoose.js
763
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/objectWithoutPropertiesLoose.js
762
764
  function _objectWithoutPropertiesLoose(r, e) {
763
765
  if (null == r) return {};
764
766
  var t = {};
@@ -769,7 +771,7 @@ function _objectWithoutPropertiesLoose(r, e) {
769
771
  return t;
770
772
  }
771
773
  //#endregion
772
- //#region \0@oxc-project+runtime@0.132.0/helpers/objectWithoutProperties.js
774
+ //#region \0@oxc-project+runtime@0.134.0/helpers/esm/objectWithoutProperties.js
773
775
  function _objectWithoutProperties(e, t) {
774
776
  if (null == e) return {};
775
777
  var o, r, i = _objectWithoutPropertiesLoose(e, t);
@@ -2064,97 +2066,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
2064
2066
  return processRuleGroup(ruleGroup, true);
2065
2067
  };
2066
2068
  //#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
2069
  //#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
2159
2070
  /**
2160
2071
  * Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
@@ -2169,10 +2080,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
2169
2080
  * @group Export
2170
2081
  */
2171
2082
  const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
2172
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
2083
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
2173
2084
  if (!columns || !drizzleOperators) return void 0;
2174
2085
  const { and, not, or } = drizzleOperators;
2175
- const ruleProcessor = defaultRuleProcessorDrizzle;
2176
2086
  const processRuleGroup = (rg, _outermost) => {
2177
2087
  var _rg$id;
2178
2088
  if (!isRuleOrGroupValid(rg, validationMap[(_rg$id = rg.id) !== null && _rg$id !== void 0 ? _rg$id : /* v8 ignore start -- @preserve */ ""])) return;
@@ -2798,96 +2708,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
2798
2708
  return processRuleGroup(ruleGroup, true);
2799
2709
  };
2800
2710
  //#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
2711
  //#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
2892
2712
  /**
2893
2713
  * Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
@@ -2901,7 +2721,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
2901
2721
  */
2902
2722
  const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2903
2723
  var _processRuleGroup;
2904
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
2724
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
2905
2725
  const ops = context.tanStackDbOperators;
2906
2726
  if (!ops) return void 0;
2907
2727
  const { and, eq, not, or } = ops;
@@ -2909,7 +2729,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2909
2729
  const refKeys = Object.keys(refs);
2910
2730
  /* v8 ignore next -- @preserve */
2911
2731
  if (refKeys.length === 0) return fallback;
2912
- const ruleProcessor = defaultRuleProcessorTanStackDB;
2913
2732
  const processRuleGroup = (rg) => {
2914
2733
  var _rg$id;
2915
2734
  if (!isRuleOrGroupValid(rg, validationMap[(_rg$id = rg.id) !== null && _rg$id !== void 0 ? _rg$id : /* v8 ignore start -- @preserve */ ""])) return;
@@ -3305,6 +3124,97 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
3305
3124
  }
3306
3125
  };
3307
3126
  //#endregion
3127
+ //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
3128
+ /**
3129
+ * Default rule processor used by {@link formatQuery} for the "drizzle" format.
3130
+ *
3131
+ * @group Export
3132
+ */
3133
+ const defaultRuleProcessorDrizzle = (rule, _options) => {
3134
+ const opts = _options !== null && _options !== void 0 ? _options : /* v8 ignore start -- @preserve */ {};
3135
+ // v8 ignore next
3136
+ const { parseNumbers, preserveValueOrder, context = {} } = opts;
3137
+ const { columns, drizzleOperators, useRawFields } = context;
3138
+ if (!columns || !drizzleOperators) return void 0;
3139
+ const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
3140
+ const { field, operator, value, valueSource } = rule;
3141
+ const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
3142
+ const operatorLC = lc(operator);
3143
+ const valueIsField = valueSource === "field";
3144
+ const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
3145
+ const maybeParseNumber = (v) => {
3146
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
3147
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
3148
+ };
3149
+ if (!column) return void 0;
3150
+ const matchEval = processMatchMode(rule);
3151
+ if (matchEval === false) return;
3152
+ else if (matchEval) {
3153
+ if (opts.preset !== "postgresql") return void 0;
3154
+ const { mode, threshold } = matchEval;
3155
+ const arrayElementAlias = "elem_alias";
3156
+ const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => _objectSpread2(_objectSpread2({}, r), {}, { field: arrayElementAlias }) }), _objectSpread2(_objectSpread2({}, opts), {}, { context: _objectSpread2(_objectSpread2({}, opts.context), {}, { useRawFields: true }) }));
3157
+ switch (mode) {
3158
+ case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
3159
+ case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3160
+ case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3161
+ case "atleast":
3162
+ case "atmost":
3163
+ case "exactly": {
3164
+ const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
3165
+ 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}`)}`;
3166
+ }
3167
+ }
3168
+ }
3169
+ switch (operatorLC) {
3170
+ case "=": return eq(column, maybeParseNumber(value));
3171
+ case "!=": return ne(column, maybeParseNumber(value));
3172
+ case ">": return gt(column, maybeParseNumber(value));
3173
+ case "<": return lt(column, maybeParseNumber(value));
3174
+ case ">=": return gte(column, maybeParseNumber(value));
3175
+ case "<=": return lte(column, maybeParseNumber(value));
3176
+ case "beginswith":
3177
+ case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
3178
+ case "contains":
3179
+ case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
3180
+ case "endswith":
3181
+ case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
3182
+ case "null": return isNull(column);
3183
+ case "notnull": return isNotNull(column);
3184
+ case "in":
3185
+ case "notin": {
3186
+ const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
3187
+ return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
3188
+ }
3189
+ case "between":
3190
+ case "notbetween": {
3191
+ const valueAsArray = toArray(value);
3192
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
3193
+ let [first, second] = valueAsArray;
3194
+ const shouldParseNumbers = !(parseNumbers === false);
3195
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
3196
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
3197
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
3198
+ if (!preserveValueOrder && secondNum < firstNum) {
3199
+ const tempNum = secondNum;
3200
+ second = firstNum;
3201
+ first = tempNum;
3202
+ } else {
3203
+ first = firstNum;
3204
+ second = secondNum;
3205
+ }
3206
+ } else if (valueIsField) {
3207
+ first = asFieldOrValue(first);
3208
+ second = asFieldOrValue(second);
3209
+ }
3210
+ return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
3211
+ }
3212
+ return;
3213
+ }
3214
+ default: return;
3215
+ }
3216
+ };
3217
+ //#endregion
3308
3218
  //#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
3309
3219
  const rangeOperatorMap = {
3310
3220
  "<": "lt",
@@ -4266,6 +4176,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
4266
4176
  }
4267
4177
  };
4268
4178
  //#endregion
4179
+ //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
4180
+ /**
4181
+ * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
4182
+ *
4183
+ * @group Export
4184
+ */
4185
+ const defaultRuleProcessorTanStackDB = (rule, _options) => {
4186
+ const { parseNumbers, preserveValueOrder, context = {} } = _options !== null && _options !== void 0 ? _options : /* v8 ignore start -- @preserve */ {};
4187
+ const ops = context.tanStackDbOperators;
4188
+ const refs = context._tanstackDbRefs;
4189
+ const primaryRef = context._tanstackDbPrimaryRef;
4190
+ if (!ops || !refs || !primaryRef) return void 0;
4191
+ const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
4192
+ const resolveField = (fieldName) => {
4193
+ const dotIdx = fieldName.indexOf(".");
4194
+ if (dotIdx > 0) {
4195
+ const prefix = fieldName.slice(0, dotIdx);
4196
+ const rest = fieldName.slice(dotIdx + 1);
4197
+ if (refs[prefix]) return refs[prefix][rest];
4198
+ }
4199
+ return refs[primaryRef][fieldName];
4200
+ };
4201
+ const { field, operator, value, valueSource } = rule;
4202
+ const column = resolveField(field);
4203
+ const operatorLC = lc(operator);
4204
+ const valueIsField = valueSource === "field";
4205
+ const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
4206
+ const maybeParseNumber = (v) => {
4207
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
4208
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
4209
+ };
4210
+ switch (operatorLC) {
4211
+ case "=": return eq(column, maybeParseNumber(value));
4212
+ case "!=": return not(eq(column, maybeParseNumber(value)));
4213
+ case ">": return gt(column, maybeParseNumber(value));
4214
+ case "<": return lt(column, maybeParseNumber(value));
4215
+ case ">=": return gte(column, maybeParseNumber(value));
4216
+ case "<=": return lte(column, maybeParseNumber(value));
4217
+ case "beginswith":
4218
+ case "doesnotbeginwith": {
4219
+ const expr = like(column, valueIsField ? void 0 : `${value}%`);
4220
+ return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
4221
+ }
4222
+ case "contains":
4223
+ case "doesnotcontain": {
4224
+ const expr = like(column, valueIsField ? void 0 : `%${value}%`);
4225
+ return operatorLC === "doesnotcontain" ? not(expr) : expr;
4226
+ }
4227
+ case "endswith":
4228
+ case "doesnotendwith": {
4229
+ const expr = like(column, valueIsField ? void 0 : `%${value}`);
4230
+ return operatorLC === "doesnotendwith" ? not(expr) : expr;
4231
+ }
4232
+ case "null": return isNull(column);
4233
+ case "notnull": return not(isNull(column));
4234
+ case "in":
4235
+ case "notin": {
4236
+ const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
4237
+ return operatorLC === "notin" ? not(expr) : expr;
4238
+ }
4239
+ case "between":
4240
+ case "notbetween": {
4241
+ const valueAsArray = toArray(value);
4242
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
4243
+ let [first, second] = valueAsArray;
4244
+ const shouldParseNumbers = !(parseNumbers === false);
4245
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
4246
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
4247
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
4248
+ if (!preserveValueOrder && secondNum < firstNum) {
4249
+ const tempNum = secondNum;
4250
+ second = firstNum;
4251
+ first = tempNum;
4252
+ } else {
4253
+ first = firstNum;
4254
+ second = secondNum;
4255
+ }
4256
+ } else if (valueIsField) {
4257
+ first = asFieldOrValue(first);
4258
+ second = asFieldOrValue(second);
4259
+ }
4260
+ const expr = and(gte(column, first), lte(column, second));
4261
+ return operatorLC === "notbetween" ? not(expr) : expr;
4262
+ }
4263
+ return;
4264
+ }
4265
+ default: return;
4266
+ }
4267
+ };
4268
+ //#endregion
4269
4269
  //#region src/utils/formatQuery/formatQuery.ts
4270
4270
  /**
4271
4271
  * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
@@ -4842,7 +4842,8 @@ const mergeClassnames = (...args) => ({
4842
4842
  matchThreshold: joinClassnamesByName("matchThreshold", args),
4843
4843
  branches: joinClassnamesByName("branches", args),
4844
4844
  hasSubQuery: joinClassnamesByName("hasSubQuery", args),
4845
- loading: joinClassnamesByName("loading", args)
4845
+ loading: joinClassnamesByName("loading", args),
4846
+ valueDateTimeRelative: joinClassnamesByName("valueDateTimeRelative", args)
4846
4847
  });
4847
4848
  //#endregion
4848
4849
  //#region src/utils/preferProp.ts