@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;
@@ -430,7 +430,8 @@ const standardClassnames = {
430
430
  branches: "queryBuilder-branches",
431
431
  justified: "queryBuilder-justified",
432
432
  hasSubQuery: "rule-hasSubQuery",
433
- loading: "queryBuilder-loading"
433
+ loading: "queryBuilder-loading",
434
+ valueDateTimeRelative: "rule-value-dateTimeRelative"
434
435
  };
435
436
  /**
436
437
  * Default classnames for each component.
@@ -480,7 +481,8 @@ const defaultControlClassnames = {
480
481
  valueListItem: "",
481
482
  branches: "",
482
483
  hasSubQuery: "",
483
- loading: ""
484
+ loading: "",
485
+ valueDateTimeRelative: ""
484
486
  };
485
487
  /**
486
488
  * Default reason codes for a group being invalid.
@@ -613,7 +615,7 @@ const trimIfString = (val) => typeof val === "string" ? val.trim() : val;
613
615
  * Splits a string by comma then trims each element. Arrays are returned as is except
614
616
  * any string elements are trimmed.
615
617
  */
616
- const toArray = (a, { retainEmptyStrings } = {}) => Array.isArray(a) ? a.map((v) => trimIfString(v)) : typeof a === "string" ? splitBy(a, ",").filter(retainEmptyStrings ? () => true : (s) => !/^\s*$/.test(s)).map((s) => s.trim()) : typeof a === "number" ? [a] : [];
618
+ const toArray = (a, { retainEmptyStrings } = {}) => Array.isArray(a) ? a.map(trimIfString) : typeof a === "string" ? splitBy(a, ",").filter(retainEmptyStrings ? () => true : (s) => !/^\s*$/.test(s)).map((s) => s.trim()) : typeof a === "number" ? [a] : [];
617
619
  /**
618
620
  * Determines if an array is free of `null`/`undefined`.
619
621
  */
@@ -674,7 +676,7 @@ const numericRegex = new RegExp(numeric_quantity.numericRegex.source.replace(/^\
674
676
  /**
675
677
  * Determines if a variable is a plain old JavaScript object, aka POJO.
676
678
  */
677
- const isPojo = (obj) => obj === null || typeof obj !== "object" ? false : Object.getPrototypeOf(obj) === Object.prototype;
679
+ const isPojo = (obj) => obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype;
678
680
  /**
679
681
  * Simple helper to determine whether a value is null, undefined, or an empty string.
680
682
  */
@@ -2003,106 +2005,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
2003
2005
  return processRuleGroup(ruleGroup, true);
2004
2006
  };
2005
2007
  //#endregion
2006
- //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
2007
- /**
2008
- * Default rule processor used by {@link formatQuery} for the "drizzle" format.
2009
- *
2010
- * @group Export
2011
- */
2012
- const defaultRuleProcessorDrizzle = (rule, _options) => {
2013
- const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
2014
- // v8 ignore next
2015
- const { parseNumbers, preserveValueOrder, context = {} } = opts;
2016
- const { columns, drizzleOperators, useRawFields } = context;
2017
- if (!columns || !drizzleOperators) return void 0;
2018
- const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
2019
- const { field, operator, value, valueSource } = rule;
2020
- const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
2021
- const operatorLC = lc(operator);
2022
- const valueIsField = valueSource === "field";
2023
- const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
2024
- const maybeParseNumber = (v) => {
2025
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2026
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2027
- };
2028
- if (!column) return void 0;
2029
- const matchEval = processMatchMode(rule);
2030
- if (matchEval === false) return;
2031
- else if (matchEval) {
2032
- if (opts.preset !== "postgresql") return void 0;
2033
- const { mode, threshold } = matchEval;
2034
- const arrayElementAlias = "elem_alias";
2035
- const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
2036
- ...r,
2037
- field: arrayElementAlias
2038
- }) }), {
2039
- ...opts,
2040
- context: {
2041
- ...opts.context,
2042
- useRawFields: true
2043
- }
2044
- });
2045
- switch (mode) {
2046
- case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
2047
- case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2048
- case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
2049
- case "atleast":
2050
- case "atmost":
2051
- case "exactly": {
2052
- const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
2053
- 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}`)}`;
2054
- }
2055
- }
2056
- }
2057
- switch (operatorLC) {
2058
- case "=": return eq(column, maybeParseNumber(value));
2059
- case "!=": return ne(column, maybeParseNumber(value));
2060
- case ">": return gt(column, maybeParseNumber(value));
2061
- case "<": return lt(column, maybeParseNumber(value));
2062
- case ">=": return gte(column, maybeParseNumber(value));
2063
- case "<=": return lte(column, maybeParseNumber(value));
2064
- case "beginswith":
2065
- case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
2066
- case "contains":
2067
- case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
2068
- case "endswith":
2069
- case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
2070
- case "null": return isNull(column);
2071
- case "notnull": return isNotNull(column);
2072
- case "in":
2073
- case "notin": {
2074
- const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
2075
- return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
2076
- }
2077
- case "between":
2078
- case "notbetween": {
2079
- const valueAsArray = toArray(value);
2080
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2081
- let [first, second] = valueAsArray;
2082
- const shouldParseNumbers = !(parseNumbers === false);
2083
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2084
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2085
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2086
- if (!preserveValueOrder && secondNum < firstNum) {
2087
- const tempNum = secondNum;
2088
- second = firstNum;
2089
- first = tempNum;
2090
- } else {
2091
- first = firstNum;
2092
- second = secondNum;
2093
- }
2094
- } else if (valueIsField) {
2095
- first = asFieldOrValue(first);
2096
- second = asFieldOrValue(second);
2097
- }
2098
- return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
2099
- }
2100
- return;
2101
- }
2102
- default: return;
2103
- }
2104
- };
2105
- //#endregion
2106
2008
  //#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
2107
2009
  /**
2108
2010
  * Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
@@ -2117,10 +2019,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
2117
2019
  * @group Export
2118
2020
  */
2119
2021
  const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
2120
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
2022
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
2121
2023
  if (!columns || !drizzleOperators) return void 0;
2122
2024
  const { and, not, or } = drizzleOperators;
2123
- const ruleProcessor = defaultRuleProcessorDrizzle;
2124
2025
  const processRuleGroup = (rg, _outermost) => {
2125
2026
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
2126
2027
  const processedRules = rg.rules.map((rule) => {
@@ -2736,96 +2637,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
2736
2637
  return processRuleGroup(ruleGroup, true);
2737
2638
  };
2738
2639
  //#endregion
2739
- //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
2740
- /**
2741
- * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
2742
- *
2743
- * @group Export
2744
- */
2745
- const defaultRuleProcessorTanStackDB = (rule, _options) => {
2746
- const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
2747
- const ops = context.tanStackDbOperators;
2748
- const refs = context._tanstackDbRefs;
2749
- const primaryRef = context._tanstackDbPrimaryRef;
2750
- if (!ops || !refs || !primaryRef) return void 0;
2751
- const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
2752
- const resolveField = (fieldName) => {
2753
- const dotIdx = fieldName.indexOf(".");
2754
- if (dotIdx > 0) {
2755
- const prefix = fieldName.slice(0, dotIdx);
2756
- const rest = fieldName.slice(dotIdx + 1);
2757
- if (refs[prefix]) return refs[prefix][rest];
2758
- }
2759
- return refs[primaryRef][fieldName];
2760
- };
2761
- const { field, operator, value, valueSource } = rule;
2762
- const column = resolveField(field);
2763
- const operatorLC = lc(operator);
2764
- const valueIsField = valueSource === "field";
2765
- const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
2766
- const maybeParseNumber = (v) => {
2767
- if (valueIsField || !parseNumbers) return asFieldOrValue(v);
2768
- return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
2769
- };
2770
- switch (operatorLC) {
2771
- case "=": return eq(column, maybeParseNumber(value));
2772
- case "!=": return not(eq(column, maybeParseNumber(value)));
2773
- case ">": return gt(column, maybeParseNumber(value));
2774
- case "<": return lt(column, maybeParseNumber(value));
2775
- case ">=": return gte(column, maybeParseNumber(value));
2776
- case "<=": return lte(column, maybeParseNumber(value));
2777
- case "beginswith":
2778
- case "doesnotbeginwith": {
2779
- const expr = like(column, valueIsField ? void 0 : `${value}%`);
2780
- return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
2781
- }
2782
- case "contains":
2783
- case "doesnotcontain": {
2784
- const expr = like(column, valueIsField ? void 0 : `%${value}%`);
2785
- return operatorLC === "doesnotcontain" ? not(expr) : expr;
2786
- }
2787
- case "endswith":
2788
- case "doesnotendwith": {
2789
- const expr = like(column, valueIsField ? void 0 : `%${value}`);
2790
- return operatorLC === "doesnotendwith" ? not(expr) : expr;
2791
- }
2792
- case "null": return isNull(column);
2793
- case "notnull": return not(isNull(column));
2794
- case "in":
2795
- case "notin": {
2796
- const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
2797
- return operatorLC === "notin" ? not(expr) : expr;
2798
- }
2799
- case "between":
2800
- case "notbetween": {
2801
- const valueAsArray = toArray(value);
2802
- if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
2803
- let [first, second] = valueAsArray;
2804
- const shouldParseNumbers = !(parseNumbers === false);
2805
- if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
2806
- const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
2807
- const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
2808
- if (!preserveValueOrder && secondNum < firstNum) {
2809
- const tempNum = secondNum;
2810
- second = firstNum;
2811
- first = tempNum;
2812
- } else {
2813
- first = firstNum;
2814
- second = secondNum;
2815
- }
2816
- } else if (valueIsField) {
2817
- first = asFieldOrValue(first);
2818
- second = asFieldOrValue(second);
2819
- }
2820
- const expr = and(gte(column, first), lte(column, second));
2821
- return operatorLC === "notbetween" ? not(expr) : expr;
2822
- }
2823
- return;
2824
- }
2825
- default: return;
2826
- }
2827
- };
2828
- //#endregion
2829
2640
  //#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
2830
2641
  /**
2831
2642
  * Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
@@ -2838,7 +2649,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
2838
2649
  * @group Export
2839
2650
  */
2840
2651
  const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2841
- const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
2652
+ const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
2842
2653
  const ops = context.tanStackDbOperators;
2843
2654
  if (!ops) return void 0;
2844
2655
  const { and, eq, not, or } = ops;
@@ -2846,7 +2657,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
2846
2657
  const refKeys = Object.keys(refs);
2847
2658
  /* v8 ignore next -- @preserve */
2848
2659
  if (refKeys.length === 0) return fallback;
2849
- const ruleProcessor = defaultRuleProcessorTanStackDB;
2850
2660
  const processRuleGroup = (rg) => {
2851
2661
  if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
2852
2662
  const processedRules = rg.rules.map((rule) => {
@@ -3244,6 +3054,106 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
3244
3054
  }
3245
3055
  };
3246
3056
  //#endregion
3057
+ //#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
3058
+ /**
3059
+ * Default rule processor used by {@link formatQuery} for the "drizzle" format.
3060
+ *
3061
+ * @group Export
3062
+ */
3063
+ const defaultRuleProcessorDrizzle = (rule, _options) => {
3064
+ const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
3065
+ // v8 ignore next
3066
+ const { parseNumbers, preserveValueOrder, context = {} } = opts;
3067
+ const { columns, drizzleOperators, useRawFields } = context;
3068
+ if (!columns || !drizzleOperators) return void 0;
3069
+ const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
3070
+ const { field, operator, value, valueSource } = rule;
3071
+ const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
3072
+ const operatorLC = lc(operator);
3073
+ const valueIsField = valueSource === "field";
3074
+ const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
3075
+ const maybeParseNumber = (v) => {
3076
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
3077
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
3078
+ };
3079
+ if (!column) return void 0;
3080
+ const matchEval = processMatchMode(rule);
3081
+ if (matchEval === false) return;
3082
+ else if (matchEval) {
3083
+ if (opts.preset !== "postgresql") return void 0;
3084
+ const { mode, threshold } = matchEval;
3085
+ const arrayElementAlias = "elem_alias";
3086
+ const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
3087
+ ...r,
3088
+ field: arrayElementAlias
3089
+ }) }), {
3090
+ ...opts,
3091
+ context: {
3092
+ ...opts.context,
3093
+ useRawFields: true
3094
+ }
3095
+ });
3096
+ switch (mode) {
3097
+ case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
3098
+ case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3099
+ case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
3100
+ case "atleast":
3101
+ case "atmost":
3102
+ case "exactly": {
3103
+ const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
3104
+ return threshold > 0 && threshold < 1 ? sql`(select count(*)::float / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}` : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;
3105
+ }
3106
+ }
3107
+ }
3108
+ switch (operatorLC) {
3109
+ case "=": return eq(column, maybeParseNumber(value));
3110
+ case "!=": return ne(column, maybeParseNumber(value));
3111
+ case ">": return gt(column, maybeParseNumber(value));
3112
+ case "<": return lt(column, maybeParseNumber(value));
3113
+ case ">=": return gte(column, maybeParseNumber(value));
3114
+ case "<=": return lte(column, maybeParseNumber(value));
3115
+ case "beginswith":
3116
+ case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
3117
+ case "contains":
3118
+ case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
3119
+ case "endswith":
3120
+ case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
3121
+ case "null": return isNull(column);
3122
+ case "notnull": return isNotNull(column);
3123
+ case "in":
3124
+ case "notin": {
3125
+ const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
3126
+ return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
3127
+ }
3128
+ case "between":
3129
+ case "notbetween": {
3130
+ const valueAsArray = toArray(value);
3131
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
3132
+ let [first, second] = valueAsArray;
3133
+ const shouldParseNumbers = !(parseNumbers === false);
3134
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
3135
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
3136
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
3137
+ if (!preserveValueOrder && secondNum < firstNum) {
3138
+ const tempNum = secondNum;
3139
+ second = firstNum;
3140
+ first = tempNum;
3141
+ } else {
3142
+ first = firstNum;
3143
+ second = secondNum;
3144
+ }
3145
+ } else if (valueIsField) {
3146
+ first = asFieldOrValue(first);
3147
+ second = asFieldOrValue(second);
3148
+ }
3149
+ return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
3150
+ }
3151
+ return;
3152
+ }
3153
+ default: return;
3154
+ }
3155
+ };
3156
+ //#endregion
3247
3157
  //#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
3248
3158
  const rangeOperatorMap = {
3249
3159
  "<": "lt",
@@ -4213,6 +4123,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
4213
4123
  }
4214
4124
  };
4215
4125
  //#endregion
4126
+ //#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
4127
+ /**
4128
+ * Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
4129
+ *
4130
+ * @group Export
4131
+ */
4132
+ const defaultRuleProcessorTanStackDB = (rule, _options) => {
4133
+ const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
4134
+ const ops = context.tanStackDbOperators;
4135
+ const refs = context._tanstackDbRefs;
4136
+ const primaryRef = context._tanstackDbPrimaryRef;
4137
+ if (!ops || !refs || !primaryRef) return void 0;
4138
+ const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
4139
+ const resolveField = (fieldName) => {
4140
+ const dotIdx = fieldName.indexOf(".");
4141
+ if (dotIdx > 0) {
4142
+ const prefix = fieldName.slice(0, dotIdx);
4143
+ const rest = fieldName.slice(dotIdx + 1);
4144
+ if (refs[prefix]) return refs[prefix][rest];
4145
+ }
4146
+ return refs[primaryRef][fieldName];
4147
+ };
4148
+ const { field, operator, value, valueSource } = rule;
4149
+ const column = resolveField(field);
4150
+ const operatorLC = lc(operator);
4151
+ const valueIsField = valueSource === "field";
4152
+ const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
4153
+ const maybeParseNumber = (v) => {
4154
+ if (valueIsField || !parseNumbers) return asFieldOrValue(v);
4155
+ return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
4156
+ };
4157
+ switch (operatorLC) {
4158
+ case "=": return eq(column, maybeParseNumber(value));
4159
+ case "!=": return not(eq(column, maybeParseNumber(value)));
4160
+ case ">": return gt(column, maybeParseNumber(value));
4161
+ case "<": return lt(column, maybeParseNumber(value));
4162
+ case ">=": return gte(column, maybeParseNumber(value));
4163
+ case "<=": return lte(column, maybeParseNumber(value));
4164
+ case "beginswith":
4165
+ case "doesnotbeginwith": {
4166
+ const expr = like(column, valueIsField ? void 0 : `${value}%`);
4167
+ return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
4168
+ }
4169
+ case "contains":
4170
+ case "doesnotcontain": {
4171
+ const expr = like(column, valueIsField ? void 0 : `%${value}%`);
4172
+ return operatorLC === "doesnotcontain" ? not(expr) : expr;
4173
+ }
4174
+ case "endswith":
4175
+ case "doesnotendwith": {
4176
+ const expr = like(column, valueIsField ? void 0 : `%${value}`);
4177
+ return operatorLC === "doesnotendwith" ? not(expr) : expr;
4178
+ }
4179
+ case "null": return isNull(column);
4180
+ case "notnull": return not(isNull(column));
4181
+ case "in":
4182
+ case "notin": {
4183
+ const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
4184
+ return operatorLC === "notin" ? not(expr) : expr;
4185
+ }
4186
+ case "between":
4187
+ case "notbetween": {
4188
+ const valueAsArray = toArray(value);
4189
+ if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
4190
+ let [first, second] = valueAsArray;
4191
+ const shouldParseNumbers = !(parseNumbers === false);
4192
+ if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
4193
+ const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
4194
+ const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
4195
+ if (!preserveValueOrder && secondNum < firstNum) {
4196
+ const tempNum = secondNum;
4197
+ second = firstNum;
4198
+ first = tempNum;
4199
+ } else {
4200
+ first = firstNum;
4201
+ second = secondNum;
4202
+ }
4203
+ } else if (valueIsField) {
4204
+ first = asFieldOrValue(first);
4205
+ second = asFieldOrValue(second);
4206
+ }
4207
+ const expr = and(gte(column, first), lte(column, second));
4208
+ return operatorLC === "notbetween" ? not(expr) : expr;
4209
+ }
4210
+ return;
4211
+ }
4212
+ default: return;
4213
+ }
4214
+ };
4215
+ //#endregion
4216
4216
  //#region src/utils/formatQuery/formatQuery.ts
4217
4217
  /**
4218
4218
  * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
@@ -4778,7 +4778,8 @@ const mergeClassnames = (...args) => ({
4778
4778
  matchThreshold: joinClassnamesByName("matchThreshold", args),
4779
4779
  branches: joinClassnamesByName("branches", args),
4780
4780
  hasSubQuery: joinClassnamesByName("hasSubQuery", args),
4781
- loading: joinClassnamesByName("loading", args)
4781
+ loading: joinClassnamesByName("loading", args),
4782
+ valueDateTimeRelative: joinClassnamesByName("valueDateTimeRelative", args)
4782
4783
  });
4783
4784
  //#endregion
4784
4785
  //#region src/utils/preferProp.ts