@react-querybuilder/core 8.17.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 +57 -16
- package/dist/cjs/react-querybuilder_core.cjs.development.js +212 -206
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +57 -16
- 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 +5 -3
- package/dist/formatQuery.d.ts +5 -3
- package/dist/formatQuery.js +203 -203
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +203 -203
- package/dist/formatQuery.mjs.map +1 -1
- package/dist/{import-CSHMjlid.d.ts → import-Qs1-kgv5.d.ts} +2 -2
- package/dist/{import-BQ5xaW6i.d.mts → import-ShTj5IdB.d.mts} +2 -2
- package/dist/{index-CREDWM32.d.ts → index-DlVg-QXo.d.mts} +32 -3
- package/dist/{index-CREDWM32.d.mts → index-DlVg-QXo.d.ts} +32 -3
- 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.d.mts +7 -7
- package/dist/parseCEL.d.ts +7 -7
- package/dist/parseCEL.js +6 -6
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs +6 -6
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseCypher.d.mts +1 -1
- package/dist/parseCypher.d.ts +1 -1
- package/dist/parseCypher.js.map +1 -1
- package/dist/parseCypher.mjs.map +1 -1
- package/dist/parseGremlin.d.mts +1 -1
- package/dist/parseGremlin.d.ts +1 -1
- package/dist/parseGremlin.js.map +1 -1
- package/dist/parseGremlin.mjs.map +1 -1
- package/dist/parseJSONata.d.mts +2 -2
- package/dist/parseJSONata.d.ts +2 -2
- 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.d.mts +2 -2
- package/dist/parseJsonLogic.d.ts +2 -2
- package/dist/parseJsonLogic.js +11 -11
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +11 -11
- package/dist/parseJsonLogic.mjs.map +1 -1
- package/dist/parseMongoDB.d.mts +2 -2
- package/dist/parseMongoDB.d.ts +2 -2
- 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.d.mts +1 -1
- package/dist/parseSPARQL.d.ts +1 -1
- package/dist/parseSPARQL.js.map +1 -1
- package/dist/parseSPARQL.mjs.map +1 -1
- package/dist/parseSQL.d.mts +2 -2
- package/dist/parseSQL.d.ts +2 -2
- 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.d.mts +2 -2
- package/dist/parseSpEL.d.ts +2 -2
- 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 +57 -16
- package/dist/react-querybuilder_core.legacy-esm.d.ts +57 -16
- package/dist/react-querybuilder_core.legacy-esm.js +210 -204
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +212 -206
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +57 -16
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/transformQuery.d.mts +1 -1
- package/dist/transformQuery.d.ts +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 +12 -12
- 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
|
@@ -89,7 +89,10 @@ const defaultTranslations = {
|
|
|
89
89
|
placeholderGroupLabel: defaultPlaceholderValueGroupLabel
|
|
90
90
|
},
|
|
91
91
|
matchMode: { title: "Match mode" },
|
|
92
|
-
matchThreshold: {
|
|
92
|
+
matchThreshold: {
|
|
93
|
+
title: "Match threshold",
|
|
94
|
+
placeholderName: "#"
|
|
95
|
+
},
|
|
93
96
|
value: { title: "Value" },
|
|
94
97
|
removeRule: {
|
|
95
98
|
label: "⨯",
|
|
@@ -427,7 +430,8 @@ const standardClassnames = {
|
|
|
427
430
|
branches: "queryBuilder-branches",
|
|
428
431
|
justified: "queryBuilder-justified",
|
|
429
432
|
hasSubQuery: "rule-hasSubQuery",
|
|
430
|
-
loading: "queryBuilder-loading"
|
|
433
|
+
loading: "queryBuilder-loading",
|
|
434
|
+
valueDateTimeRelative: "rule-value-dateTimeRelative"
|
|
431
435
|
};
|
|
432
436
|
/**
|
|
433
437
|
* Default classnames for each component.
|
|
@@ -477,7 +481,8 @@ const defaultControlClassnames = {
|
|
|
477
481
|
valueListItem: "",
|
|
478
482
|
branches: "",
|
|
479
483
|
hasSubQuery: "",
|
|
480
|
-
loading: ""
|
|
484
|
+
loading: "",
|
|
485
|
+
valueDateTimeRelative: ""
|
|
481
486
|
};
|
|
482
487
|
/**
|
|
483
488
|
* Default reason codes for a group being invalid.
|
|
@@ -610,7 +615,7 @@ const trimIfString = (val) => typeof val === "string" ? val.trim() : val;
|
|
|
610
615
|
* Splits a string by comma then trims each element. Arrays are returned as is except
|
|
611
616
|
* any string elements are trimmed.
|
|
612
617
|
*/
|
|
613
|
-
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] : [];
|
|
614
619
|
/**
|
|
615
620
|
* Determines if an array is free of `null`/`undefined`.
|
|
616
621
|
*/
|
|
@@ -671,7 +676,7 @@ const numericRegex = new RegExp(numeric_quantity.numericRegex.source.replace(/^\
|
|
|
671
676
|
/**
|
|
672
677
|
* Determines if a variable is a plain old JavaScript object, aka POJO.
|
|
673
678
|
*/
|
|
674
|
-
const isPojo = (obj) => obj
|
|
679
|
+
const isPojo = (obj) => obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype;
|
|
675
680
|
/**
|
|
676
681
|
* Simple helper to determine whether a value is null, undefined, or an empty string.
|
|
677
682
|
*/
|
|
@@ -1513,7 +1518,7 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
|
|
|
1513
1518
|
const totalCount = `double(${field}.size())`;
|
|
1514
1519
|
const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;
|
|
1515
1520
|
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "==";
|
|
1516
|
-
if (threshold > 0 && threshold < 1) return
|
|
1521
|
+
if (threshold > 0 && threshold < 1) return `double(${filteredCount}) ${op} (${totalCount} * ${threshold})`;
|
|
1517
1522
|
return `${filteredCount} ${op} ${threshold}`;
|
|
1518
1523
|
}
|
|
1519
1524
|
}
|
|
@@ -2000,106 +2005,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
|
|
|
2000
2005
|
return processRuleGroup(ruleGroup, true);
|
|
2001
2006
|
};
|
|
2002
2007
|
//#endregion
|
|
2003
|
-
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
2004
|
-
/**
|
|
2005
|
-
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
2006
|
-
*
|
|
2007
|
-
* @group Export
|
|
2008
|
-
*/
|
|
2009
|
-
const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
2010
|
-
const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
2011
|
-
// v8 ignore next
|
|
2012
|
-
const { parseNumbers, preserveValueOrder, context = {} } = opts;
|
|
2013
|
-
const { columns, drizzleOperators, useRawFields } = context;
|
|
2014
|
-
if (!columns || !drizzleOperators) return void 0;
|
|
2015
|
-
const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
|
|
2016
|
-
const { field, operator, value, valueSource } = rule;
|
|
2017
|
-
const column = useRawFields && /[a-z][a-z0-9]*/i.test(field) ? sql.raw(field) : columns[field];
|
|
2018
|
-
const operatorLC = lc(operator);
|
|
2019
|
-
const valueIsField = valueSource === "field";
|
|
2020
|
-
const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
|
|
2021
|
-
const maybeParseNumber = (v) => {
|
|
2022
|
-
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
2023
|
-
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
2024
|
-
};
|
|
2025
|
-
if (!column) return void 0;
|
|
2026
|
-
const matchEval = processMatchMode(rule);
|
|
2027
|
-
if (matchEval === false) return;
|
|
2028
|
-
else if (matchEval) {
|
|
2029
|
-
if (opts.preset !== "postgresql") return void 0;
|
|
2030
|
-
const { mode, threshold } = matchEval;
|
|
2031
|
-
const arrayElementAlias = "elem_alias";
|
|
2032
|
-
const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
|
|
2033
|
-
...r,
|
|
2034
|
-
field: arrayElementAlias
|
|
2035
|
-
}) }), {
|
|
2036
|
-
...opts,
|
|
2037
|
-
context: {
|
|
2038
|
-
...opts.context,
|
|
2039
|
-
useRawFields: true
|
|
2040
|
-
}
|
|
2041
|
-
});
|
|
2042
|
-
switch (mode) {
|
|
2043
|
-
case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
|
|
2044
|
-
case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
2045
|
-
case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
2046
|
-
case "atleast":
|
|
2047
|
-
case "atmost":
|
|
2048
|
-
case "exactly": {
|
|
2049
|
-
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
2050
|
-
return threshold > 0 && threshold < 1 ? sql`(select count(*) / 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}`)}`;
|
|
2051
|
-
}
|
|
2052
|
-
}
|
|
2053
|
-
}
|
|
2054
|
-
switch (operatorLC) {
|
|
2055
|
-
case "=": return eq(column, maybeParseNumber(value));
|
|
2056
|
-
case "!=": return ne(column, maybeParseNumber(value));
|
|
2057
|
-
case ">": return gt(column, maybeParseNumber(value));
|
|
2058
|
-
case "<": return lt(column, maybeParseNumber(value));
|
|
2059
|
-
case ">=": return gte(column, maybeParseNumber(value));
|
|
2060
|
-
case "<=": return lte(column, maybeParseNumber(value));
|
|
2061
|
-
case "beginswith":
|
|
2062
|
-
case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
|
|
2063
|
-
case "contains":
|
|
2064
|
-
case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
|
|
2065
|
-
case "endswith":
|
|
2066
|
-
case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
|
|
2067
|
-
case "null": return isNull(column);
|
|
2068
|
-
case "notnull": return isNotNull(column);
|
|
2069
|
-
case "in":
|
|
2070
|
-
case "notin": {
|
|
2071
|
-
const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
|
|
2072
|
-
return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
|
|
2073
|
-
}
|
|
2074
|
-
case "between":
|
|
2075
|
-
case "notbetween": {
|
|
2076
|
-
const valueAsArray = toArray(value);
|
|
2077
|
-
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
2078
|
-
let [first, second] = valueAsArray;
|
|
2079
|
-
const shouldParseNumbers = !(parseNumbers === false);
|
|
2080
|
-
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
2081
|
-
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
2082
|
-
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
2083
|
-
if (!preserveValueOrder && secondNum < firstNum) {
|
|
2084
|
-
const tempNum = secondNum;
|
|
2085
|
-
second = firstNum;
|
|
2086
|
-
first = tempNum;
|
|
2087
|
-
} else {
|
|
2088
|
-
first = firstNum;
|
|
2089
|
-
second = secondNum;
|
|
2090
|
-
}
|
|
2091
|
-
} else if (valueIsField) {
|
|
2092
|
-
first = asFieldOrValue(first);
|
|
2093
|
-
second = asFieldOrValue(second);
|
|
2094
|
-
}
|
|
2095
|
-
return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
|
|
2096
|
-
}
|
|
2097
|
-
return;
|
|
2098
|
-
}
|
|
2099
|
-
default: return;
|
|
2100
|
-
}
|
|
2101
|
-
};
|
|
2102
|
-
//#endregion
|
|
2103
2008
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
|
|
2104
2009
|
/**
|
|
2105
2010
|
* Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
|
|
@@ -2114,10 +2019,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
|
2114
2019
|
* @group Export
|
|
2115
2020
|
*/
|
|
2116
2021
|
const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
|
|
2117
|
-
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
|
|
2022
|
+
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
|
|
2118
2023
|
if (!columns || !drizzleOperators) return void 0;
|
|
2119
2024
|
const { and, not, or } = drizzleOperators;
|
|
2120
|
-
const ruleProcessor = defaultRuleProcessorDrizzle;
|
|
2121
2025
|
const processRuleGroup = (rg, _outermost) => {
|
|
2122
2026
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
|
|
2123
2027
|
const processedRules = rg.rules.map((rule) => {
|
|
@@ -2395,7 +2299,7 @@ const defaultRuleGroupProcessorMongoDB = (ruleGroup, options, meta) => {
|
|
|
2395
2299
|
const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
2396
2300
|
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, translations, validateRule, validationMap } = options;
|
|
2397
2301
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
2398
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression :
|
|
2302
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
2399
2303
|
const rg2 = isRuleGroupTypeIC(rg) && rg.rules.some((r) => typeof r === "string" && lc(r) === "xor") ? convertFromIC(rg) : rg;
|
|
2400
2304
|
const processedRules = [];
|
|
2401
2305
|
let precedingCombinator = "";
|
|
@@ -2493,7 +2397,7 @@ const defaultRuleGroupProcessorParameterized = (ruleGroup, options) => {
|
|
|
2493
2397
|
return sql;
|
|
2494
2398
|
};
|
|
2495
2399
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
2496
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression :
|
|
2400
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
2497
2401
|
const processedRules = [];
|
|
2498
2402
|
let precedingCombinator = "";
|
|
2499
2403
|
let firstRule = true;
|
|
@@ -2686,7 +2590,7 @@ const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
|
|
|
2686
2590
|
const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
2687
2591
|
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
2688
2592
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
2689
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression :
|
|
2593
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
2690
2594
|
const processedRules = [];
|
|
2691
2595
|
let precedingCombinator = "";
|
|
2692
2596
|
let firstRule = true;
|
|
@@ -2733,96 +2637,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
|
2733
2637
|
return processRuleGroup(ruleGroup, true);
|
|
2734
2638
|
};
|
|
2735
2639
|
//#endregion
|
|
2736
|
-
//#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
|
|
2737
|
-
/**
|
|
2738
|
-
* Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
2739
|
-
*
|
|
2740
|
-
* @group Export
|
|
2741
|
-
*/
|
|
2742
|
-
const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
2743
|
-
const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
2744
|
-
const ops = context.tanStackDbOperators;
|
|
2745
|
-
const refs = context._tanstackDbRefs;
|
|
2746
|
-
const primaryRef = context._tanstackDbPrimaryRef;
|
|
2747
|
-
if (!ops || !refs || !primaryRef) return void 0;
|
|
2748
|
-
const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
|
|
2749
|
-
const resolveField = (fieldName) => {
|
|
2750
|
-
const dotIdx = fieldName.indexOf(".");
|
|
2751
|
-
if (dotIdx > 0) {
|
|
2752
|
-
const prefix = fieldName.slice(0, dotIdx);
|
|
2753
|
-
const rest = fieldName.slice(dotIdx + 1);
|
|
2754
|
-
if (refs[prefix]) return refs[prefix][rest];
|
|
2755
|
-
}
|
|
2756
|
-
return refs[primaryRef][fieldName];
|
|
2757
|
-
};
|
|
2758
|
-
const { field, operator, value, valueSource } = rule;
|
|
2759
|
-
const column = resolveField(field);
|
|
2760
|
-
const operatorLC = lc(operator);
|
|
2761
|
-
const valueIsField = valueSource === "field";
|
|
2762
|
-
const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
|
|
2763
|
-
const maybeParseNumber = (v) => {
|
|
2764
|
-
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
2765
|
-
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
2766
|
-
};
|
|
2767
|
-
switch (operatorLC) {
|
|
2768
|
-
case "=": return eq(column, maybeParseNumber(value));
|
|
2769
|
-
case "!=": return not(eq(column, maybeParseNumber(value)));
|
|
2770
|
-
case ">": return gt(column, maybeParseNumber(value));
|
|
2771
|
-
case "<": return lt(column, maybeParseNumber(value));
|
|
2772
|
-
case ">=": return gte(column, maybeParseNumber(value));
|
|
2773
|
-
case "<=": return lte(column, maybeParseNumber(value));
|
|
2774
|
-
case "beginswith":
|
|
2775
|
-
case "doesnotbeginwith": {
|
|
2776
|
-
const expr = like(column, valueIsField ? void 0 : `${value}%`);
|
|
2777
|
-
return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
|
|
2778
|
-
}
|
|
2779
|
-
case "contains":
|
|
2780
|
-
case "doesnotcontain": {
|
|
2781
|
-
const expr = like(column, valueIsField ? void 0 : `%${value}%`);
|
|
2782
|
-
return operatorLC === "doesnotcontain" ? not(expr) : expr;
|
|
2783
|
-
}
|
|
2784
|
-
case "endswith":
|
|
2785
|
-
case "doesnotendwith": {
|
|
2786
|
-
const expr = like(column, valueIsField ? void 0 : `%${value}`);
|
|
2787
|
-
return operatorLC === "doesnotendwith" ? not(expr) : expr;
|
|
2788
|
-
}
|
|
2789
|
-
case "null": return isNull(column);
|
|
2790
|
-
case "notnull": return not(isNull(column));
|
|
2791
|
-
case "in":
|
|
2792
|
-
case "notin": {
|
|
2793
|
-
const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
|
|
2794
|
-
return operatorLC === "notin" ? not(expr) : expr;
|
|
2795
|
-
}
|
|
2796
|
-
case "between":
|
|
2797
|
-
case "notbetween": {
|
|
2798
|
-
const valueAsArray = toArray(value);
|
|
2799
|
-
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
2800
|
-
let [first, second] = valueAsArray;
|
|
2801
|
-
const shouldParseNumbers = !(parseNumbers === false);
|
|
2802
|
-
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
2803
|
-
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
2804
|
-
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
2805
|
-
if (!preserveValueOrder && secondNum < firstNum) {
|
|
2806
|
-
const tempNum = secondNum;
|
|
2807
|
-
second = firstNum;
|
|
2808
|
-
first = tempNum;
|
|
2809
|
-
} else {
|
|
2810
|
-
first = firstNum;
|
|
2811
|
-
second = secondNum;
|
|
2812
|
-
}
|
|
2813
|
-
} else if (valueIsField) {
|
|
2814
|
-
first = asFieldOrValue(first);
|
|
2815
|
-
second = asFieldOrValue(second);
|
|
2816
|
-
}
|
|
2817
|
-
const expr = and(gte(column, first), lte(column, second));
|
|
2818
|
-
return operatorLC === "notbetween" ? not(expr) : expr;
|
|
2819
|
-
}
|
|
2820
|
-
return;
|
|
2821
|
-
}
|
|
2822
|
-
default: return;
|
|
2823
|
-
}
|
|
2824
|
-
};
|
|
2825
|
-
//#endregion
|
|
2826
2640
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
|
|
2827
2641
|
/**
|
|
2828
2642
|
* Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
@@ -2835,7 +2649,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
|
2835
2649
|
* @group Export
|
|
2836
2650
|
*/
|
|
2837
2651
|
const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
|
|
2838
|
-
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
|
|
2652
|
+
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
|
|
2839
2653
|
const ops = context.tanStackDbOperators;
|
|
2840
2654
|
if (!ops) return void 0;
|
|
2841
2655
|
const { and, eq, not, or } = ops;
|
|
@@ -2843,7 +2657,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
|
|
|
2843
2657
|
const refKeys = Object.keys(refs);
|
|
2844
2658
|
/* v8 ignore next -- @preserve */
|
|
2845
2659
|
if (refKeys.length === 0) return fallback;
|
|
2846
|
-
const ruleProcessor = defaultRuleProcessorTanStackDB;
|
|
2847
2660
|
const processRuleGroup = (rg) => {
|
|
2848
2661
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
|
|
2849
2662
|
const processedRules = rg.rules.map((rule) => {
|
|
@@ -3241,6 +3054,106 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
|
|
|
3241
3054
|
}
|
|
3242
3055
|
};
|
|
3243
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
|
|
3244
3157
|
//#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
|
|
3245
3158
|
const rangeOperatorMap = {
|
|
3246
3159
|
"<": "lt",
|
|
@@ -3890,7 +3803,7 @@ const defaultRuleProcessorSQL = (rule, opts = {}) => {
|
|
|
3890
3803
|
case "atmost":
|
|
3891
3804
|
case "exactly": {
|
|
3892
3805
|
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
3893
|
-
return `(select count(*)${threshold > 0 && threshold < 1 ?
|
|
3806
|
+
return `(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;
|
|
3894
3807
|
}
|
|
3895
3808
|
}
|
|
3896
3809
|
}
|
|
@@ -3957,7 +3870,7 @@ const defaultRuleProcessorParameterized = (rule, opts, meta) => {
|
|
|
3957
3870
|
case "atmost":
|
|
3958
3871
|
case "exactly": {
|
|
3959
3872
|
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
3960
|
-
return finalize(`(select count(*)${threshold > 0 && threshold < 1 ?
|
|
3873
|
+
return finalize(`(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`);
|
|
3961
3874
|
}
|
|
3962
3875
|
}
|
|
3963
3876
|
}
|
|
@@ -4210,6 +4123,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
|
|
|
4210
4123
|
}
|
|
4211
4124
|
};
|
|
4212
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
|
|
4213
4216
|
//#region src/utils/formatQuery/formatQuery.ts
|
|
4214
4217
|
/**
|
|
4215
4218
|
* A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
|
|
@@ -4459,6 +4462,8 @@ const generateValueProcessor = (vpbr) => (field, operator, value, valueSource) =
|
|
|
4459
4462
|
/**
|
|
4460
4463
|
* Default value processor used by {@link formatQuery} for "sql" format.
|
|
4461
4464
|
*
|
|
4465
|
+
* @deprecated Prefer {@link defaultValueProcessorByRule}.
|
|
4466
|
+
*
|
|
4462
4467
|
* @group Export
|
|
4463
4468
|
*/
|
|
4464
4469
|
const defaultValueProcessor = generateValueProcessor(defaultValueProcessorByRule);
|
|
@@ -4773,7 +4778,8 @@ const mergeClassnames = (...args) => ({
|
|
|
4773
4778
|
matchThreshold: joinClassnamesByName("matchThreshold", args),
|
|
4774
4779
|
branches: joinClassnamesByName("branches", args),
|
|
4775
4780
|
hasSubQuery: joinClassnamesByName("hasSubQuery", args),
|
|
4776
|
-
loading: joinClassnamesByName("loading", args)
|
|
4781
|
+
loading: joinClassnamesByName("loading", args),
|
|
4782
|
+
valueDateTimeRelative: joinClassnamesByName("valueDateTimeRelative", args)
|
|
4777
4783
|
});
|
|
4778
4784
|
//#endregion
|
|
4779
4785
|
//#region src/utils/preferProp.ts
|