@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.
- package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +21 -13
- package/dist/cjs/react-querybuilder_core.cjs.development.js +200 -199
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +21 -13
- package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
- package/dist/{convertQuery-BoMPXL7_.js → convertQuery-BJKNgecE.js} +2 -2
- package/dist/{convertQuery-BoMPXL7_.js.map → convertQuery-BJKNgecE.js.map} +1 -1
- package/dist/{convertQuery-CQwOrjQr.mjs → convertQuery-J1CaoDxe.mjs} +2 -2
- package/dist/{convertQuery-CQwOrjQr.mjs.map → convertQuery-J1CaoDxe.mjs.map} +1 -1
- package/dist/formatQuery.d.mts +2 -2
- package/dist/formatQuery.d.ts +2 -2
- package/dist/formatQuery.js +195 -197
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +195 -197
- package/dist/formatQuery.mjs.map +1 -1
- package/dist/{objectUtils-DxVaGCdg.js → objectUtils-DBJI82bl.js} +2 -2
- package/dist/objectUtils-DBJI82bl.js.map +1 -0
- package/dist/{objectUtils-D-w8MzpZ.mjs → objectUtils-ZvPkF6u6.mjs} +2 -2
- package/dist/objectUtils-ZvPkF6u6.mjs.map +1 -0
- package/dist/parseCEL.js +3 -3
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs +3 -3
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseCypher.js.map +1 -1
- package/dist/parseCypher.mjs.map +1 -1
- package/dist/parseGremlin.js.map +1 -1
- package/dist/parseGremlin.mjs.map +1 -1
- package/dist/parseJSONata.js +2 -2
- package/dist/parseJSONata.js.map +1 -1
- package/dist/parseJSONata.mjs +2 -2
- package/dist/parseJSONata.mjs.map +1 -1
- package/dist/parseJsonLogic.js +4 -4
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +4 -4
- package/dist/parseJsonLogic.mjs.map +1 -1
- package/dist/parseMongoDB.js +4 -4
- package/dist/parseMongoDB.js.map +1 -1
- package/dist/parseMongoDB.mjs +4 -4
- package/dist/parseMongoDB.mjs.map +1 -1
- package/dist/parseSPARQL.js.map +1 -1
- package/dist/parseSPARQL.mjs.map +1 -1
- package/dist/parseSQL.js +3 -3
- package/dist/parseSQL.js.map +1 -1
- package/dist/parseSQL.mjs +3 -3
- package/dist/parseSQL.mjs.map +1 -1
- package/dist/parseSpEL.js +3 -3
- package/dist/parseSpEL.js.map +1 -1
- package/dist/parseSpEL.mjs +3 -3
- package/dist/parseSpEL.mjs.map +1 -1
- package/dist/{prepareQueryObjects-BXf5aV-A.mjs → prepareQueryObjects-Cd_tt4oy.mjs} +3 -3
- package/dist/{prepareQueryObjects-BXf5aV-A.mjs.map → prepareQueryObjects-Cd_tt4oy.mjs.map} +1 -1
- package/dist/{prepareQueryObjects-gRQqiBPR.js → prepareQueryObjects-DaAXX792.js} +3 -3
- package/dist/{prepareQueryObjects-gRQqiBPR.js.map → prepareQueryObjects-DaAXX792.js.map} +1 -1
- package/dist/react-querybuilder_core.d.mts +21 -13
- package/dist/react-querybuilder_core.legacy-esm.d.ts +21 -13
- package/dist/react-querybuilder_core.legacy-esm.js +198 -197
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +200 -199
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +21 -13
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/transformQuery.js +1 -1
- package/dist/transformQuery.mjs +1 -1
- package/dist/{utils-ZlKseh1X.js → utils-BpaOtylk.js} +3 -3
- package/dist/utils-BpaOtylk.js.map +1 -0
- package/dist/{utils-01WaTGBL.mjs → utils-CJRGiPb-.mjs} +3 -3
- package/dist/utils-CJRGiPb-.mjs.map +1 -0
- package/package.json +8 -8
- package/dist/objectUtils-D-w8MzpZ.mjs.map +0 -1
- package/dist/objectUtils-DxVaGCdg.js.map +0 -1
- package/dist/utils-01WaTGBL.mjs.map +0 -1
- 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:
|
|
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:
|
|
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:
|
|
3072
|
+
declare const toArray: <T>(a: T, {
|
|
3065
3073
|
retainEmptyStrings
|
|
3066
3074
|
}?: {
|
|
3067
3075
|
retainEmptyStrings?: boolean;
|
|
3068
|
-
}) =>
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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(
|
|
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
|
|
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
|