@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
|
@@ -88,7 +88,10 @@ const defaultTranslations = {
|
|
|
88
88
|
placeholderGroupLabel: defaultPlaceholderValueGroupLabel
|
|
89
89
|
},
|
|
90
90
|
matchMode: { title: "Match mode" },
|
|
91
|
-
matchThreshold: {
|
|
91
|
+
matchThreshold: {
|
|
92
|
+
title: "Match threshold",
|
|
93
|
+
placeholderName: "#"
|
|
94
|
+
},
|
|
92
95
|
value: { title: "Value" },
|
|
93
96
|
removeRule: {
|
|
94
97
|
label: "⨯",
|
|
@@ -426,7 +429,8 @@ const standardClassnames = {
|
|
|
426
429
|
branches: "queryBuilder-branches",
|
|
427
430
|
justified: "queryBuilder-justified",
|
|
428
431
|
hasSubQuery: "rule-hasSubQuery",
|
|
429
|
-
loading: "queryBuilder-loading"
|
|
432
|
+
loading: "queryBuilder-loading",
|
|
433
|
+
valueDateTimeRelative: "rule-value-dateTimeRelative"
|
|
430
434
|
};
|
|
431
435
|
/**
|
|
432
436
|
* Default classnames for each component.
|
|
@@ -476,7 +480,8 @@ const defaultControlClassnames = {
|
|
|
476
480
|
valueListItem: "",
|
|
477
481
|
branches: "",
|
|
478
482
|
hasSubQuery: "",
|
|
479
|
-
loading: ""
|
|
483
|
+
loading: "",
|
|
484
|
+
valueDateTimeRelative: ""
|
|
480
485
|
};
|
|
481
486
|
/**
|
|
482
487
|
* Default reason codes for a group being invalid.
|
|
@@ -609,7 +614,7 @@ const trimIfString = (val) => typeof val === "string" ? val.trim() : val;
|
|
|
609
614
|
* Splits a string by comma then trims each element. Arrays are returned as is except
|
|
610
615
|
* any string elements are trimmed.
|
|
611
616
|
*/
|
|
612
|
-
const toArray = (a, { retainEmptyStrings } = {}) => Array.isArray(a) ? a.map(
|
|
617
|
+
const toArray = (a, { retainEmptyStrings } = {}) => Array.isArray(a) ? a.map(trimIfString) : typeof a === "string" ? splitBy(a, ",").filter(retainEmptyStrings ? () => true : (s) => !/^\s*$/.test(s)).map((s) => s.trim()) : typeof a === "number" ? [a] : [];
|
|
613
618
|
/**
|
|
614
619
|
* Determines if an array is free of `null`/`undefined`.
|
|
615
620
|
*/
|
|
@@ -670,7 +675,7 @@ const numericRegex = new RegExp(numericRegex$1.source.replace(/^\^/, String.raw`
|
|
|
670
675
|
/**
|
|
671
676
|
* Determines if a variable is a plain old JavaScript object, aka POJO.
|
|
672
677
|
*/
|
|
673
|
-
const isPojo = (obj) => obj
|
|
678
|
+
const isPojo = (obj) => obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype;
|
|
674
679
|
/**
|
|
675
680
|
* Simple helper to determine whether a value is null, undefined, or an empty string.
|
|
676
681
|
*/
|
|
@@ -1512,7 +1517,7 @@ const defaultRuleProcessorCEL = (rule, opts = {}) => {
|
|
|
1512
1517
|
const totalCount = `double(${field}.size())`;
|
|
1513
1518
|
const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;
|
|
1514
1519
|
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "==";
|
|
1515
|
-
if (threshold > 0 && threshold < 1) return
|
|
1520
|
+
if (threshold > 0 && threshold < 1) return `double(${filteredCount}) ${op} (${totalCount} * ${threshold})`;
|
|
1516
1521
|
return `${filteredCount} ${op} ${threshold}`;
|
|
1517
1522
|
}
|
|
1518
1523
|
}
|
|
@@ -1999,106 +2004,6 @@ const defaultRuleGroupProcessorCypher = (ruleGroup, options) => {
|
|
|
1999
2004
|
return processRuleGroup(ruleGroup, true);
|
|
2000
2005
|
};
|
|
2001
2006
|
//#endregion
|
|
2002
|
-
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
2003
|
-
/**
|
|
2004
|
-
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
2005
|
-
*
|
|
2006
|
-
* @group Export
|
|
2007
|
-
*/
|
|
2008
|
-
const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
2009
|
-
const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
2010
|
-
// v8 ignore next
|
|
2011
|
-
const { parseNumbers, preserveValueOrder, context = {} } = opts;
|
|
2012
|
-
const { columns, drizzleOperators, useRawFields } = context;
|
|
2013
|
-
if (!columns || !drizzleOperators) return void 0;
|
|
2014
|
-
const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
|
|
2015
|
-
const { field, operator, value, valueSource } = rule;
|
|
2016
|
-
const column = useRawFields && /[a-z][a-z0-9]*/i.test(field) ? sql.raw(field) : columns[field];
|
|
2017
|
-
const operatorLC = lc(operator);
|
|
2018
|
-
const valueIsField = valueSource === "field";
|
|
2019
|
-
const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
|
|
2020
|
-
const maybeParseNumber = (v) => {
|
|
2021
|
-
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
2022
|
-
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
2023
|
-
};
|
|
2024
|
-
if (!column) return void 0;
|
|
2025
|
-
const matchEval = processMatchMode(rule);
|
|
2026
|
-
if (matchEval === false) return;
|
|
2027
|
-
else if (matchEval) {
|
|
2028
|
-
if (opts.preset !== "postgresql") return void 0;
|
|
2029
|
-
const { mode, threshold } = matchEval;
|
|
2030
|
-
const arrayElementAlias = "elem_alias";
|
|
2031
|
-
const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
|
|
2032
|
-
...r,
|
|
2033
|
-
field: arrayElementAlias
|
|
2034
|
-
}) }), {
|
|
2035
|
-
...opts,
|
|
2036
|
-
context: {
|
|
2037
|
-
...opts.context,
|
|
2038
|
-
useRawFields: true
|
|
2039
|
-
}
|
|
2040
|
-
});
|
|
2041
|
-
switch (mode) {
|
|
2042
|
-
case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
|
|
2043
|
-
case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
2044
|
-
case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
2045
|
-
case "atleast":
|
|
2046
|
-
case "atmost":
|
|
2047
|
-
case "exactly": {
|
|
2048
|
-
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
2049
|
-
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}`)}`;
|
|
2050
|
-
}
|
|
2051
|
-
}
|
|
2052
|
-
}
|
|
2053
|
-
switch (operatorLC) {
|
|
2054
|
-
case "=": return eq(column, maybeParseNumber(value));
|
|
2055
|
-
case "!=": return ne(column, maybeParseNumber(value));
|
|
2056
|
-
case ">": return gt(column, maybeParseNumber(value));
|
|
2057
|
-
case "<": return lt(column, maybeParseNumber(value));
|
|
2058
|
-
case ">=": return gte(column, maybeParseNumber(value));
|
|
2059
|
-
case "<=": return lte(column, maybeParseNumber(value));
|
|
2060
|
-
case "beginswith":
|
|
2061
|
-
case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
|
|
2062
|
-
case "contains":
|
|
2063
|
-
case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
|
|
2064
|
-
case "endswith":
|
|
2065
|
-
case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
|
|
2066
|
-
case "null": return isNull(column);
|
|
2067
|
-
case "notnull": return isNotNull(column);
|
|
2068
|
-
case "in":
|
|
2069
|
-
case "notin": {
|
|
2070
|
-
const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
|
|
2071
|
-
return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
|
|
2072
|
-
}
|
|
2073
|
-
case "between":
|
|
2074
|
-
case "notbetween": {
|
|
2075
|
-
const valueAsArray = toArray(value);
|
|
2076
|
-
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
2077
|
-
let [first, second] = valueAsArray;
|
|
2078
|
-
const shouldParseNumbers = !(parseNumbers === false);
|
|
2079
|
-
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
2080
|
-
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
2081
|
-
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
2082
|
-
if (!preserveValueOrder && secondNum < firstNum) {
|
|
2083
|
-
const tempNum = secondNum;
|
|
2084
|
-
second = firstNum;
|
|
2085
|
-
first = tempNum;
|
|
2086
|
-
} else {
|
|
2087
|
-
first = firstNum;
|
|
2088
|
-
second = secondNum;
|
|
2089
|
-
}
|
|
2090
|
-
} else if (valueIsField) {
|
|
2091
|
-
first = asFieldOrValue(first);
|
|
2092
|
-
second = asFieldOrValue(second);
|
|
2093
|
-
}
|
|
2094
|
-
return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
|
|
2095
|
-
}
|
|
2096
|
-
return;
|
|
2097
|
-
}
|
|
2098
|
-
default: return;
|
|
2099
|
-
}
|
|
2100
|
-
};
|
|
2101
|
-
//#endregion
|
|
2102
2007
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts
|
|
2103
2008
|
/**
|
|
2104
2009
|
* Default rule group processor used by {@link formatQuery} for the "drizzle" format. The returned
|
|
@@ -2113,10 +2018,9 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
|
2113
2018
|
* @group Export
|
|
2114
2019
|
*/
|
|
2115
2020
|
const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
|
|
2116
|
-
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
|
|
2021
|
+
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, ruleProcessor } = options;
|
|
2117
2022
|
if (!columns || !drizzleOperators) return void 0;
|
|
2118
2023
|
const { and, not, or } = drizzleOperators;
|
|
2119
|
-
const ruleProcessor = defaultRuleProcessorDrizzle;
|
|
2120
2024
|
const processRuleGroup = (rg, _outermost) => {
|
|
2121
2025
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
|
|
2122
2026
|
const processedRules = rg.rules.map((rule) => {
|
|
@@ -2394,7 +2298,7 @@ const defaultRuleGroupProcessorMongoDB = (ruleGroup, options, meta) => {
|
|
|
2394
2298
|
const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
2395
2299
|
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, translations, validateRule, validationMap } = options;
|
|
2396
2300
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
2397
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression :
|
|
2301
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
2398
2302
|
const rg2 = isRuleGroupTypeIC(rg) && rg.rules.some((r) => typeof r === "string" && lc(r) === "xor") ? convertFromIC(rg) : rg;
|
|
2399
2303
|
const processedRules = [];
|
|
2400
2304
|
let precedingCombinator = "";
|
|
@@ -2492,7 +2396,7 @@ const defaultRuleGroupProcessorParameterized = (ruleGroup, options) => {
|
|
|
2492
2396
|
return sql;
|
|
2493
2397
|
};
|
|
2494
2398
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
2495
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression :
|
|
2399
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
2496
2400
|
const processedRules = [];
|
|
2497
2401
|
let precedingCombinator = "";
|
|
2498
2402
|
let firstRule = true;
|
|
@@ -2685,7 +2589,7 @@ const defaultRuleGroupProcessorSPARQL = (ruleGroup, options) => {
|
|
|
2685
2589
|
const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
2686
2590
|
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
2687
2591
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
2688
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression :
|
|
2592
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
2689
2593
|
const processedRules = [];
|
|
2690
2594
|
let precedingCombinator = "";
|
|
2691
2595
|
let firstRule = true;
|
|
@@ -2732,96 +2636,6 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
|
2732
2636
|
return processRuleGroup(ruleGroup, true);
|
|
2733
2637
|
};
|
|
2734
2638
|
//#endregion
|
|
2735
|
-
//#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
|
|
2736
|
-
/**
|
|
2737
|
-
* Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
2738
|
-
*
|
|
2739
|
-
* @group Export
|
|
2740
|
-
*/
|
|
2741
|
-
const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
2742
|
-
const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
2743
|
-
const ops = context.tanStackDbOperators;
|
|
2744
|
-
const refs = context._tanstackDbRefs;
|
|
2745
|
-
const primaryRef = context._tanstackDbPrimaryRef;
|
|
2746
|
-
if (!ops || !refs || !primaryRef) return void 0;
|
|
2747
|
-
const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
|
|
2748
|
-
const resolveField = (fieldName) => {
|
|
2749
|
-
const dotIdx = fieldName.indexOf(".");
|
|
2750
|
-
if (dotIdx > 0) {
|
|
2751
|
-
const prefix = fieldName.slice(0, dotIdx);
|
|
2752
|
-
const rest = fieldName.slice(dotIdx + 1);
|
|
2753
|
-
if (refs[prefix]) return refs[prefix][rest];
|
|
2754
|
-
}
|
|
2755
|
-
return refs[primaryRef][fieldName];
|
|
2756
|
-
};
|
|
2757
|
-
const { field, operator, value, valueSource } = rule;
|
|
2758
|
-
const column = resolveField(field);
|
|
2759
|
-
const operatorLC = lc(operator);
|
|
2760
|
-
const valueIsField = valueSource === "field";
|
|
2761
|
-
const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
|
|
2762
|
-
const maybeParseNumber = (v) => {
|
|
2763
|
-
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
2764
|
-
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
2765
|
-
};
|
|
2766
|
-
switch (operatorLC) {
|
|
2767
|
-
case "=": return eq(column, maybeParseNumber(value));
|
|
2768
|
-
case "!=": return not(eq(column, maybeParseNumber(value)));
|
|
2769
|
-
case ">": return gt(column, maybeParseNumber(value));
|
|
2770
|
-
case "<": return lt(column, maybeParseNumber(value));
|
|
2771
|
-
case ">=": return gte(column, maybeParseNumber(value));
|
|
2772
|
-
case "<=": return lte(column, maybeParseNumber(value));
|
|
2773
|
-
case "beginswith":
|
|
2774
|
-
case "doesnotbeginwith": {
|
|
2775
|
-
const expr = like(column, valueIsField ? void 0 : `${value}%`);
|
|
2776
|
-
return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
|
|
2777
|
-
}
|
|
2778
|
-
case "contains":
|
|
2779
|
-
case "doesnotcontain": {
|
|
2780
|
-
const expr = like(column, valueIsField ? void 0 : `%${value}%`);
|
|
2781
|
-
return operatorLC === "doesnotcontain" ? not(expr) : expr;
|
|
2782
|
-
}
|
|
2783
|
-
case "endswith":
|
|
2784
|
-
case "doesnotendwith": {
|
|
2785
|
-
const expr = like(column, valueIsField ? void 0 : `%${value}`);
|
|
2786
|
-
return operatorLC === "doesnotendwith" ? not(expr) : expr;
|
|
2787
|
-
}
|
|
2788
|
-
case "null": return isNull(column);
|
|
2789
|
-
case "notnull": return not(isNull(column));
|
|
2790
|
-
case "in":
|
|
2791
|
-
case "notin": {
|
|
2792
|
-
const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
|
|
2793
|
-
return operatorLC === "notin" ? not(expr) : expr;
|
|
2794
|
-
}
|
|
2795
|
-
case "between":
|
|
2796
|
-
case "notbetween": {
|
|
2797
|
-
const valueAsArray = toArray(value);
|
|
2798
|
-
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
2799
|
-
let [first, second] = valueAsArray;
|
|
2800
|
-
const shouldParseNumbers = !(parseNumbers === false);
|
|
2801
|
-
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
2802
|
-
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
2803
|
-
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
2804
|
-
if (!preserveValueOrder && secondNum < firstNum) {
|
|
2805
|
-
const tempNum = secondNum;
|
|
2806
|
-
second = firstNum;
|
|
2807
|
-
first = tempNum;
|
|
2808
|
-
} else {
|
|
2809
|
-
first = firstNum;
|
|
2810
|
-
second = secondNum;
|
|
2811
|
-
}
|
|
2812
|
-
} else if (valueIsField) {
|
|
2813
|
-
first = asFieldOrValue(first);
|
|
2814
|
-
second = asFieldOrValue(second);
|
|
2815
|
-
}
|
|
2816
|
-
const expr = and(gte(column, first), lte(column, second));
|
|
2817
|
-
return operatorLC === "notbetween" ? not(expr) : expr;
|
|
2818
|
-
}
|
|
2819
|
-
return;
|
|
2820
|
-
}
|
|
2821
|
-
default: return;
|
|
2822
|
-
}
|
|
2823
|
-
};
|
|
2824
|
-
//#endregion
|
|
2825
2639
|
//#region src/utils/formatQuery/defaultRuleGroupProcessorTanStackDB.ts
|
|
2826
2640
|
/**
|
|
2827
2641
|
* Default rule group processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
@@ -2834,7 +2648,7 @@ const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
|
2834
2648
|
* @group Export
|
|
2835
2649
|
*/
|
|
2836
2650
|
const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
|
|
2837
|
-
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {} } = options;
|
|
2651
|
+
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap, context = {}, ruleProcessor } = options;
|
|
2838
2652
|
const ops = context.tanStackDbOperators;
|
|
2839
2653
|
if (!ops) return void 0;
|
|
2840
2654
|
const { and, eq, not, or } = ops;
|
|
@@ -2842,7 +2656,6 @@ const defaultRuleGroupProcessorTanStackDB = (ruleGroup, options) => (refs) => {
|
|
|
2842
2656
|
const refKeys = Object.keys(refs);
|
|
2843
2657
|
/* v8 ignore next -- @preserve */
|
|
2844
2658
|
if (refKeys.length === 0) return fallback;
|
|
2845
|
-
const ruleProcessor = defaultRuleProcessorTanStackDB;
|
|
2846
2659
|
const processRuleGroup = (rg) => {
|
|
2847
2660
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
|
|
2848
2661
|
const processedRules = rg.rules.map((rule) => {
|
|
@@ -3240,6 +3053,106 @@ const defaultRuleProcessorCypher = (rule, opts = {}) => {
|
|
|
3240
3053
|
}
|
|
3241
3054
|
};
|
|
3242
3055
|
//#endregion
|
|
3056
|
+
//#region src/utils/formatQuery/defaultRuleProcessorDrizzle.ts
|
|
3057
|
+
/**
|
|
3058
|
+
* Default rule processor used by {@link formatQuery} for the "drizzle" format.
|
|
3059
|
+
*
|
|
3060
|
+
* @group Export
|
|
3061
|
+
*/
|
|
3062
|
+
const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
3063
|
+
const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
3064
|
+
// v8 ignore next
|
|
3065
|
+
const { parseNumbers, preserveValueOrder, context = {} } = opts;
|
|
3066
|
+
const { columns, drizzleOperators, useRawFields } = context;
|
|
3067
|
+
if (!columns || !drizzleOperators) return void 0;
|
|
3068
|
+
const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
|
|
3069
|
+
const { field, operator, value, valueSource } = rule;
|
|
3070
|
+
const column = useRawFields && /^[a-z_][a-z0-9_.]*$/i.test(field) ? sql.raw(field) : columns[field];
|
|
3071
|
+
const operatorLC = lc(operator);
|
|
3072
|
+
const valueIsField = valueSource === "field";
|
|
3073
|
+
const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
|
|
3074
|
+
const maybeParseNumber = (v) => {
|
|
3075
|
+
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
3076
|
+
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
3077
|
+
};
|
|
3078
|
+
if (!column) return void 0;
|
|
3079
|
+
const matchEval = processMatchMode(rule);
|
|
3080
|
+
if (matchEval === false) return;
|
|
3081
|
+
else if (matchEval) {
|
|
3082
|
+
if (opts.preset !== "postgresql") return void 0;
|
|
3083
|
+
const { mode, threshold } = matchEval;
|
|
3084
|
+
const arrayElementAlias = "elem_alias";
|
|
3085
|
+
const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
|
|
3086
|
+
...r,
|
|
3087
|
+
field: arrayElementAlias
|
|
3088
|
+
}) }), {
|
|
3089
|
+
...opts,
|
|
3090
|
+
context: {
|
|
3091
|
+
...opts.context,
|
|
3092
|
+
useRawFields: true
|
|
3093
|
+
}
|
|
3094
|
+
});
|
|
3095
|
+
switch (mode) {
|
|
3096
|
+
case "all": return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;
|
|
3097
|
+
case "none": return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
3098
|
+
case "some": return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;
|
|
3099
|
+
case "atleast":
|
|
3100
|
+
case "atmost":
|
|
3101
|
+
case "exactly": {
|
|
3102
|
+
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
3103
|
+
return threshold > 0 && threshold < 1 ? sql`(select count(*)::float / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}` : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;
|
|
3104
|
+
}
|
|
3105
|
+
}
|
|
3106
|
+
}
|
|
3107
|
+
switch (operatorLC) {
|
|
3108
|
+
case "=": return eq(column, maybeParseNumber(value));
|
|
3109
|
+
case "!=": return ne(column, maybeParseNumber(value));
|
|
3110
|
+
case ">": return gt(column, maybeParseNumber(value));
|
|
3111
|
+
case "<": return lt(column, maybeParseNumber(value));
|
|
3112
|
+
case ">=": return gte(column, maybeParseNumber(value));
|
|
3113
|
+
case "<=": return lte(column, maybeParseNumber(value));
|
|
3114
|
+
case "beginswith":
|
|
3115
|
+
case "doesnotbeginwith": return (operatorLC === "doesnotbeginwith" ? notLike : like)(column, valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`);
|
|
3116
|
+
case "contains":
|
|
3117
|
+
case "doesnotcontain": return (operatorLC === "doesnotcontain" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`);
|
|
3118
|
+
case "endswith":
|
|
3119
|
+
case "doesnotendwith": return (operatorLC === "doesnotendwith" ? notLike : like)(column, valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`);
|
|
3120
|
+
case "null": return isNull(column);
|
|
3121
|
+
case "notnull": return isNotNull(column);
|
|
3122
|
+
case "in":
|
|
3123
|
+
case "notin": {
|
|
3124
|
+
const valueAsArray = toArray(value).map((v) => maybeParseNumber(v));
|
|
3125
|
+
return operatorLC === "notin" ? notInArray(column, valueAsArray) : inArray(column, valueAsArray);
|
|
3126
|
+
}
|
|
3127
|
+
case "between":
|
|
3128
|
+
case "notbetween": {
|
|
3129
|
+
const valueAsArray = toArray(value);
|
|
3130
|
+
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
3131
|
+
let [first, second] = valueAsArray;
|
|
3132
|
+
const shouldParseNumbers = !(parseNumbers === false);
|
|
3133
|
+
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
3134
|
+
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
3135
|
+
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
3136
|
+
if (!preserveValueOrder && secondNum < firstNum) {
|
|
3137
|
+
const tempNum = secondNum;
|
|
3138
|
+
second = firstNum;
|
|
3139
|
+
first = tempNum;
|
|
3140
|
+
} else {
|
|
3141
|
+
first = firstNum;
|
|
3142
|
+
second = secondNum;
|
|
3143
|
+
}
|
|
3144
|
+
} else if (valueIsField) {
|
|
3145
|
+
first = asFieldOrValue(first);
|
|
3146
|
+
second = asFieldOrValue(second);
|
|
3147
|
+
}
|
|
3148
|
+
return operatorLC === "notbetween" ? notBetween(column, first, second) : between(column, first, second);
|
|
3149
|
+
}
|
|
3150
|
+
return;
|
|
3151
|
+
}
|
|
3152
|
+
default: return;
|
|
3153
|
+
}
|
|
3154
|
+
};
|
|
3155
|
+
//#endregion
|
|
3243
3156
|
//#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
|
|
3244
3157
|
const rangeOperatorMap = {
|
|
3245
3158
|
"<": "lt",
|
|
@@ -3889,7 +3802,7 @@ const defaultRuleProcessorSQL = (rule, opts = {}) => {
|
|
|
3889
3802
|
case "atmost":
|
|
3890
3803
|
case "exactly": {
|
|
3891
3804
|
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
3892
|
-
return `(select count(*)${threshold > 0 && threshold < 1 ?
|
|
3805
|
+
return `(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;
|
|
3893
3806
|
}
|
|
3894
3807
|
}
|
|
3895
3808
|
}
|
|
@@ -3956,7 +3869,7 @@ const defaultRuleProcessorParameterized = (rule, opts, meta) => {
|
|
|
3956
3869
|
case "atmost":
|
|
3957
3870
|
case "exactly": {
|
|
3958
3871
|
const op = mode === "atleast" ? ">=" : mode === "atmost" ? "<=" : "=";
|
|
3959
|
-
return finalize(`(select count(*)${threshold > 0 && threshold < 1 ?
|
|
3872
|
+
return finalize(`(select count(*)${threshold > 0 && threshold < 1 ? `::float / array_length(${ruleField}, 1)` : ""} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`);
|
|
3960
3873
|
}
|
|
3961
3874
|
}
|
|
3962
3875
|
}
|
|
@@ -4209,6 +4122,96 @@ const defaultRuleProcessorSPARQL = (rule, opts = {}) => {
|
|
|
4209
4122
|
}
|
|
4210
4123
|
};
|
|
4211
4124
|
//#endregion
|
|
4125
|
+
//#region src/utils/formatQuery/defaultRuleProcessorTanStackDB.ts
|
|
4126
|
+
/**
|
|
4127
|
+
* Default rule processor used by {@link formatQuery} for the "tanstack_db" format.
|
|
4128
|
+
*
|
|
4129
|
+
* @group Export
|
|
4130
|
+
*/
|
|
4131
|
+
const defaultRuleProcessorTanStackDB = (rule, _options) => {
|
|
4132
|
+
const { parseNumbers, preserveValueOrder, context = {} } = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
4133
|
+
const ops = context.tanStackDbOperators;
|
|
4134
|
+
const refs = context._tanstackDbRefs;
|
|
4135
|
+
const primaryRef = context._tanstackDbPrimaryRef;
|
|
4136
|
+
if (!ops || !refs || !primaryRef) return void 0;
|
|
4137
|
+
const { and, eq, gt, gte, inArray, isNull, like, lt, lte, not } = ops;
|
|
4138
|
+
const resolveField = (fieldName) => {
|
|
4139
|
+
const dotIdx = fieldName.indexOf(".");
|
|
4140
|
+
if (dotIdx > 0) {
|
|
4141
|
+
const prefix = fieldName.slice(0, dotIdx);
|
|
4142
|
+
const rest = fieldName.slice(dotIdx + 1);
|
|
4143
|
+
if (refs[prefix]) return refs[prefix][rest];
|
|
4144
|
+
}
|
|
4145
|
+
return refs[primaryRef][fieldName];
|
|
4146
|
+
};
|
|
4147
|
+
const { field, operator, value, valueSource } = rule;
|
|
4148
|
+
const column = resolveField(field);
|
|
4149
|
+
const operatorLC = lc(operator);
|
|
4150
|
+
const valueIsField = valueSource === "field";
|
|
4151
|
+
const asFieldOrValue = (v) => valueIsField ? resolveField(v) : v;
|
|
4152
|
+
const maybeParseNumber = (v) => {
|
|
4153
|
+
if (valueIsField || !parseNumbers) return asFieldOrValue(v);
|
|
4154
|
+
return shouldRenderAsNumber(v, true) ? parseNumber(v, { parseNumbers: true }) : v;
|
|
4155
|
+
};
|
|
4156
|
+
switch (operatorLC) {
|
|
4157
|
+
case "=": return eq(column, maybeParseNumber(value));
|
|
4158
|
+
case "!=": return not(eq(column, maybeParseNumber(value)));
|
|
4159
|
+
case ">": return gt(column, maybeParseNumber(value));
|
|
4160
|
+
case "<": return lt(column, maybeParseNumber(value));
|
|
4161
|
+
case ">=": return gte(column, maybeParseNumber(value));
|
|
4162
|
+
case "<=": return lte(column, maybeParseNumber(value));
|
|
4163
|
+
case "beginswith":
|
|
4164
|
+
case "doesnotbeginwith": {
|
|
4165
|
+
const expr = like(column, valueIsField ? void 0 : `${value}%`);
|
|
4166
|
+
return operatorLC === "doesnotbeginwith" ? not(expr) : expr;
|
|
4167
|
+
}
|
|
4168
|
+
case "contains":
|
|
4169
|
+
case "doesnotcontain": {
|
|
4170
|
+
const expr = like(column, valueIsField ? void 0 : `%${value}%`);
|
|
4171
|
+
return operatorLC === "doesnotcontain" ? not(expr) : expr;
|
|
4172
|
+
}
|
|
4173
|
+
case "endswith":
|
|
4174
|
+
case "doesnotendwith": {
|
|
4175
|
+
const expr = like(column, valueIsField ? void 0 : `%${value}`);
|
|
4176
|
+
return operatorLC === "doesnotendwith" ? not(expr) : expr;
|
|
4177
|
+
}
|
|
4178
|
+
case "null": return isNull(column);
|
|
4179
|
+
case "notnull": return not(isNull(column));
|
|
4180
|
+
case "in":
|
|
4181
|
+
case "notin": {
|
|
4182
|
+
const expr = inArray(column, toArray(value).map((v) => maybeParseNumber(v)));
|
|
4183
|
+
return operatorLC === "notin" ? not(expr) : expr;
|
|
4184
|
+
}
|
|
4185
|
+
case "between":
|
|
4186
|
+
case "notbetween": {
|
|
4187
|
+
const valueAsArray = toArray(value);
|
|
4188
|
+
if (valueAsArray.length >= 2 && isValidValue(valueAsArray[0]) && isValidValue(valueAsArray[1])) {
|
|
4189
|
+
let [first, second] = valueAsArray;
|
|
4190
|
+
const shouldParseNumbers = !(parseNumbers === false);
|
|
4191
|
+
if (!valueIsField && shouldRenderAsNumber(first, shouldParseNumbers) && shouldRenderAsNumber(second, shouldParseNumbers)) {
|
|
4192
|
+
const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });
|
|
4193
|
+
const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });
|
|
4194
|
+
if (!preserveValueOrder && secondNum < firstNum) {
|
|
4195
|
+
const tempNum = secondNum;
|
|
4196
|
+
second = firstNum;
|
|
4197
|
+
first = tempNum;
|
|
4198
|
+
} else {
|
|
4199
|
+
first = firstNum;
|
|
4200
|
+
second = secondNum;
|
|
4201
|
+
}
|
|
4202
|
+
} else if (valueIsField) {
|
|
4203
|
+
first = asFieldOrValue(first);
|
|
4204
|
+
second = asFieldOrValue(second);
|
|
4205
|
+
}
|
|
4206
|
+
const expr = and(gte(column, first), lte(column, second));
|
|
4207
|
+
return operatorLC === "notbetween" ? not(expr) : expr;
|
|
4208
|
+
}
|
|
4209
|
+
return;
|
|
4210
|
+
}
|
|
4211
|
+
default: return;
|
|
4212
|
+
}
|
|
4213
|
+
};
|
|
4214
|
+
//#endregion
|
|
4212
4215
|
//#region src/utils/formatQuery/formatQuery.ts
|
|
4213
4216
|
/**
|
|
4214
4217
|
* A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.
|
|
@@ -4458,6 +4461,8 @@ const generateValueProcessor = (vpbr) => (field, operator, value, valueSource) =
|
|
|
4458
4461
|
/**
|
|
4459
4462
|
* Default value processor used by {@link formatQuery} for "sql" format.
|
|
4460
4463
|
*
|
|
4464
|
+
* @deprecated Prefer {@link defaultValueProcessorByRule}.
|
|
4465
|
+
*
|
|
4461
4466
|
* @group Export
|
|
4462
4467
|
*/
|
|
4463
4468
|
const defaultValueProcessor = generateValueProcessor(defaultValueProcessorByRule);
|
|
@@ -4772,7 +4777,8 @@ const mergeClassnames = (...args) => ({
|
|
|
4772
4777
|
matchThreshold: joinClassnamesByName("matchThreshold", args),
|
|
4773
4778
|
branches: joinClassnamesByName("branches", args),
|
|
4774
4779
|
hasSubQuery: joinClassnamesByName("hasSubQuery", args),
|
|
4775
|
-
loading: joinClassnamesByName("loading", args)
|
|
4780
|
+
loading: joinClassnamesByName("loading", args),
|
|
4781
|
+
valueDateTimeRelative: joinClassnamesByName("valueDateTimeRelative", args)
|
|
4776
4782
|
});
|
|
4777
4783
|
//#endregion
|
|
4778
4784
|
//#region src/utils/preferProp.ts
|