@react-querybuilder/core 8.14.3 → 8.15.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 +201 -8
- package/dist/cjs/react-querybuilder_core.cjs.development.js +400 -62
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +201 -8
- 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-CeJSNn37.mjs → convertQuery-BeJJH9BI.mjs} +2 -2
- package/dist/convertQuery-BeJJH9BI.mjs.map +1 -0
- package/dist/{convertQuery-J8LpTG-7.js → convertQuery-Lx2HQa0m.js} +2 -2
- package/dist/convertQuery-Lx2HQa0m.js.map +1 -0
- package/dist/formatQuery.d.mts +24 -3
- package/dist/formatQuery.d.ts +24 -3
- package/dist/formatQuery.js +379 -51
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +379 -52
- package/dist/formatQuery.mjs.map +1 -1
- package/dist/{import-Bltb2mT4.d.mts → import-0wp72lLT.d.mts} +2 -2
- package/dist/{import-B5Iq8XmL.d.ts → import-yRVJh7E1.d.ts} +2 -2
- package/dist/{basic-BXJVfD0P.d.ts → index-D5TXNIzF.d.ts} +595 -3
- package/dist/{basic-CNIjb6rI.d.mts → index-Lht_Wq3V.d.mts} +595 -3
- package/dist/{objectUtils-ButT0Mng.js → objectUtils-Bzug_QfX.js} +2 -2
- package/dist/objectUtils-Bzug_QfX.js.map +1 -0
- package/dist/{objectUtils-C0WB-8ex.mjs → objectUtils-D96eEEzL.mjs} +2 -2
- package/dist/objectUtils-D96eEEzL.mjs.map +1 -0
- package/dist/parseCEL.d.mts +2 -2
- package/dist/parseCEL.d.ts +2 -2
- package/dist/parseCEL.js +35 -35
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs +35 -35
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseJSONata.d.mts +2 -2
- package/dist/parseJSONata.d.ts +2 -2
- package/dist/parseJSONata.js +11 -11
- package/dist/parseJSONata.js.map +1 -1
- package/dist/parseJSONata.mjs +11 -11
- package/dist/parseJSONata.mjs.map +1 -1
- package/dist/parseJsonLogic.d.mts +2 -3
- package/dist/parseJsonLogic.d.ts +2 -3
- package/dist/parseJsonLogic.js +6 -6
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +6 -6
- 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 +6 -6
- package/dist/parseMongoDB.js.map +1 -1
- package/dist/parseMongoDB.mjs +6 -6
- package/dist/parseMongoDB.mjs.map +1 -1
- package/dist/parseSQL.d.mts +2 -2
- package/dist/parseSQL.d.ts +2 -2
- package/dist/parseSQL.js +16 -16
- package/dist/parseSQL.js.map +1 -1
- package/dist/parseSQL.mjs +16 -16
- 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 +10 -10
- package/dist/parseSpEL.js.map +1 -1
- package/dist/parseSpEL.mjs +10 -10
- package/dist/parseSpEL.mjs.map +1 -1
- package/dist/{prepareQueryObjects-DO3qXriW.js → prepareQueryObjects-BoG5Rt8z.js} +6 -6
- package/dist/prepareQueryObjects-BoG5Rt8z.js.map +1 -0
- package/dist/{prepareQueryObjects-BfMlS4ql.mjs → prepareQueryObjects-uA10ZpZX.mjs} +6 -6
- package/dist/prepareQueryObjects-uA10ZpZX.mjs.map +1 -0
- package/dist/query-builder.css +1 -1
- package/dist/query-builder.css.map +1 -1
- package/dist/react-querybuilder_core.d.mts +201 -8
- package/dist/react-querybuilder_core.legacy-esm.d.ts +201 -8
- package/dist/react-querybuilder_core.legacy-esm.js +441 -93
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +399 -63
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +201 -8
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/styles/_main.scss +4 -0
- 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-BlMGIhvx.mjs → utils-ChLG90DP.mjs} +3 -3
- package/dist/utils-ChLG90DP.mjs.map +1 -0
- package/dist/{utils-CZRhzje-.js → utils-Qwkq2Q0F.js} +3 -3
- package/dist/utils-Qwkq2Q0F.js.map +1 -0
- package/package.json +12 -16
- package/dist/convertQuery-CeJSNn37.mjs.map +0 -1
- package/dist/convertQuery-J8LpTG-7.js.map +0 -1
- package/dist/export-6x7MilFR.d.mts +0 -451
- package/dist/export-CpJOQuZv.d.ts +0 -451
- package/dist/objectUtils-ButT0Mng.js.map +0 -1
- package/dist/objectUtils-C0WB-8ex.mjs.map +0 -1
- package/dist/prepareQueryObjects-BfMlS4ql.mjs.map +0 -1
- package/dist/prepareQueryObjects-DO3qXriW.js.map +0 -1
- package/dist/utils-BlMGIhvx.mjs.map +0 -1
- package/dist/utils-CZRhzje-.js.map +0 -1
package/dist/formatQuery.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { D as toArray, O as trimIfString, S as toFlatOptionArray, T as parseNumber, _ as shouldRenderAsNumber, a as getNLTranslataion, c as isValidValue, d as mapSQLOperator, f as mongoOperators, g as processMatchMode, h as prismaOperators, i as defaultNLTranslations, l as isValueProcessorLegacy, m as numerifyValues, n as bigIntJsonStringifyReplacer, o as getQuoteFieldNamesWithArray, p as normalizeConstituentWordOrder, r as celCombinatorMap, s as getQuotedFieldName, t as bigIntJsonParseReviver, u as jsonLogicAdditionalOperators, v as getParseNumberMethod, w as toFullOptionList, y as getOption } from "./utils-
|
|
2
|
-
import { a as isRuleGroupTypeIC, c as nullOrUndefinedOrEmpty, i as isRuleGroupType, o as isPojo, r as isRuleGroup, s as lc } from "./objectUtils-
|
|
1
|
+
import { D as toArray, O as trimIfString, S as toFlatOptionArray, T as parseNumber, _ as shouldRenderAsNumber, a as getNLTranslataion, c as isValidValue, d as mapSQLOperator, f as mongoOperators, g as processMatchMode, h as prismaOperators, i as defaultNLTranslations, l as isValueProcessorLegacy, m as numerifyValues, n as bigIntJsonStringifyReplacer, o as getQuoteFieldNamesWithArray, p as normalizeConstituentWordOrder, r as celCombinatorMap, s as getQuotedFieldName, t as bigIntJsonParseReviver, u as jsonLogicAdditionalOperators, v as getParseNumberMethod, w as toFullOptionList, y as getOption } from "./utils-ChLG90DP.mjs";
|
|
2
|
+
import { a as isRuleGroupTypeIC, c as nullOrUndefinedOrEmpty, i as isRuleGroupType, l as numericRegex, o as isPojo, r as isRuleGroup, s as lc } from "./objectUtils-D96eEEzL.mjs";
|
|
3
3
|
import { transformQuery } from "./transformQuery.mjs";
|
|
4
|
-
import { t as convertFromIC } from "./convertQuery-
|
|
4
|
+
import { t as convertFromIC } from "./convertQuery-BeJJH9BI.mjs";
|
|
5
5
|
//#region src/utils/isRuleOrGroupValid.ts
|
|
6
6
|
/**
|
|
7
7
|
* Determines if an object is useful as a validation result.
|
|
@@ -19,7 +19,7 @@ const isRuleOrGroupValid = (rg, validationResult, validator) => {
|
|
|
19
19
|
if (typeof validator === "function" && !isRuleGroup(rg)) {
|
|
20
20
|
const vr = validator(rg);
|
|
21
21
|
if (typeof vr === "boolean") return vr;
|
|
22
|
-
//
|
|
22
|
+
// v8 ignore else
|
|
23
23
|
if (isValidationResult(vr)) return vr.valid;
|
|
24
24
|
}
|
|
25
25
|
return true;
|
|
@@ -173,7 +173,8 @@ const mongoDbFallback = { $and: [{ $expr: true }] };
|
|
|
173
173
|
* @group Export
|
|
174
174
|
*/
|
|
175
175
|
const defaultRuleGroupProcessorMongoDBQuery = (ruleGroup, options, meta) => {
|
|
176
|
-
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
176
|
+
const { context, fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
177
|
+
const { inExpressionContext } = context ?? {};
|
|
177
178
|
const processRuleGroup = (rg, outermost) => {
|
|
178
179
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermost ? mongoDbFallback : false;
|
|
179
180
|
const combinator = `$${lc(rg.combinator)}`;
|
|
@@ -197,7 +198,7 @@ const defaultRuleGroupProcessorMongoDBQuery = (ruleGroup, options, meta) => {
|
|
|
197
198
|
}, meta);
|
|
198
199
|
}).filter(Boolean);
|
|
199
200
|
const result = expressions.length > 0 ? expressions.length === 1 && !hasChildRules ? expressions[0] : { [combinator]: expressions } : mongoDbFallback;
|
|
200
|
-
return rg.not ? { $not: result } : result;
|
|
201
|
+
return rg.not ? inExpressionContext ? { $not: result } : { $nor: [result] } : result;
|
|
201
202
|
};
|
|
202
203
|
return processRuleGroup(convertFromIC(ruleGroup), true);
|
|
203
204
|
};
|
|
@@ -238,7 +239,8 @@ const defaultRuleProcessorMongoDBQuery = (rule, options = {}) => {
|
|
|
238
239
|
ruleProcessor: defaultRuleProcessorMongoDBQuery,
|
|
239
240
|
context: {
|
|
240
241
|
...options.context,
|
|
241
|
-
avoidFieldsAsKeys: true
|
|
242
|
+
avoidFieldsAsKeys: true,
|
|
243
|
+
inExpressionContext: true
|
|
242
244
|
}
|
|
243
245
|
});
|
|
244
246
|
const filteredCount = { $size: { $ifNull: [{ $filter: {
|
|
@@ -541,22 +543,22 @@ const defaultValueProcessorByRule = ({ operator, value, valueSource }, { escapeQ
|
|
|
541
543
|
* @group Export
|
|
542
544
|
*/
|
|
543
545
|
const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
544
|
-
const opts = _options ?? ( /*
|
|
545
|
-
//
|
|
546
|
+
const opts = _options ?? ( /* v8 ignore start -- @preserve */ {});
|
|
547
|
+
// v8 ignore next
|
|
546
548
|
const { parseNumbers, preserveValueOrder, context = {} } = opts;
|
|
547
549
|
const { columns, drizzleOperators, useRawFields } = context;
|
|
548
|
-
if (!columns || !drizzleOperators) return;
|
|
550
|
+
if (!columns || !drizzleOperators) return void 0;
|
|
549
551
|
const { between, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, notBetween, notInArray, notLike, sql } = drizzleOperators;
|
|
550
552
|
const { field, operator, value, valueSource } = rule;
|
|
551
553
|
const column = useRawFields && /[a-z][a-z0-9]*/i.test(field) ? sql.raw(field) : columns[field];
|
|
552
554
|
const operatorLC = lc(operator);
|
|
553
555
|
const valueIsField = valueSource === "field";
|
|
554
556
|
const asFieldOrValue = (v) => valueIsField ? columns[v] : v;
|
|
555
|
-
if (!column) return;
|
|
557
|
+
if (!column) return void 0;
|
|
556
558
|
const matchEval = processMatchMode(rule);
|
|
557
559
|
if (matchEval === false) return;
|
|
558
560
|
else if (matchEval) {
|
|
559
|
-
if (opts.preset !== "postgresql") return;
|
|
561
|
+
if (opts.preset !== "postgresql") return void 0;
|
|
560
562
|
const { mode, threshold } = matchEval;
|
|
561
563
|
const arrayElementAlias = "elem_alias";
|
|
562
564
|
const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(transformQuery(rule.value, { ruleProcessor: (r) => ({
|
|
@@ -645,7 +647,7 @@ const defaultRuleProcessorDrizzle = (rule, _options) => {
|
|
|
645
647
|
*/
|
|
646
648
|
const defaultRuleGroupProcessorDrizzle = (ruleGroup, options, _meta) => (columns, drizzleOperators) => {
|
|
647
649
|
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
|
|
648
|
-
if (!columns || !drizzleOperators) return;
|
|
650
|
+
if (!columns || !drizzleOperators) return void 0;
|
|
649
651
|
const { and, not, or } = drizzleOperators;
|
|
650
652
|
const ruleProcessor = defaultRuleProcessorDrizzle;
|
|
651
653
|
const processRuleGroup = (rg, _outermost) => {
|
|
@@ -849,7 +851,7 @@ const defaultRuleGroupProcessorMongoDB = (ruleGroup, options, meta) => {
|
|
|
849
851
|
}, meta);
|
|
850
852
|
}).filter(Boolean);
|
|
851
853
|
const result = expressions.length > 0 ? expressions.length === 1 && !hasChildRules ? expressions[0] : `${combinator}:[${expressions.join(",")}]` : fallbackExpression;
|
|
852
|
-
return rg.not ? `"$
|
|
854
|
+
return rg.not ? `"$nor":[${isBracketed(result) ? result : `{${result}}`}]` : result;
|
|
853
855
|
};
|
|
854
856
|
const processedQuery = processRuleGroup(convertFromIC(ruleGroup), true);
|
|
855
857
|
return isBracketed(processedQuery) ? processedQuery : `{${processedQuery}}`;
|
|
@@ -864,7 +866,7 @@ const defaultRuleGroupProcessorMongoDB = (ruleGroup, options, meta) => {
|
|
|
864
866
|
const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
865
867
|
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, translations, validateRule, validationMap } = options;
|
|
866
868
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
867
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
869
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : /* v8 ignore next -- @preserve */ "";
|
|
868
870
|
const rg2 = isRuleGroupTypeIC(rg) && rg.rules.some((r) => typeof r === "string" && lc(r) === "xor") ? convertFromIC(rg) : rg;
|
|
869
871
|
const processedRules = [];
|
|
870
872
|
let precedingCombinator = "";
|
|
@@ -876,7 +878,7 @@ const defaultRuleGroupProcessorNL = (ruleGroup, options) => {
|
|
|
876
878
|
}
|
|
877
879
|
if (isRuleGroup(rule)) {
|
|
878
880
|
const processedGroup = processRuleGroup(rule, rg2.rules.length === 1 && !(rg2.not || /^xor$/i.test(rg2.combinator ?? "")));
|
|
879
|
-
//
|
|
881
|
+
// v8 ignore else
|
|
880
882
|
if (processedGroup) {
|
|
881
883
|
if (!firstRule && precedingCombinator) {
|
|
882
884
|
processedRules.push(precedingCombinator);
|
|
@@ -952,7 +954,7 @@ const defaultRuleGroupProcessorParameterized = (ruleGroup, options) => {
|
|
|
952
954
|
if (!isPojo(processedRule)) return "";
|
|
953
955
|
const { sql, params: customParams } = processedRule;
|
|
954
956
|
if (typeof sql !== "string" || !sql) return "";
|
|
955
|
-
//
|
|
957
|
+
// v8 ignore else
|
|
956
958
|
if (format === "parameterized" && Array.isArray(customParams)) params.push(...customParams);
|
|
957
959
|
else if (format === "parameterized_named" && isPojo(customParams)) {
|
|
958
960
|
Object.assign(paramsNamed, customParams);
|
|
@@ -961,7 +963,7 @@ const defaultRuleGroupProcessorParameterized = (ruleGroup, options) => {
|
|
|
961
963
|
return sql;
|
|
962
964
|
};
|
|
963
965
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
964
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
966
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : /* v8 ignore next -- @preserve */ "";
|
|
965
967
|
const processedRules = [];
|
|
966
968
|
let precedingCombinator = "";
|
|
967
969
|
let firstRule = true;
|
|
@@ -972,7 +974,7 @@ const defaultRuleGroupProcessorParameterized = (ruleGroup, options) => {
|
|
|
972
974
|
}
|
|
973
975
|
if (isRuleGroup(rule)) {
|
|
974
976
|
const processedGroup = processRuleGroup(rule, rg.rules.length === 1);
|
|
975
|
-
//
|
|
977
|
+
// v8 ignore else
|
|
976
978
|
if (processedGroup) {
|
|
977
979
|
if (!firstRule && precedingCombinator) {
|
|
978
980
|
processedRules.push(precedingCombinator);
|
|
@@ -1055,10 +1057,10 @@ const defaultRuleGroupProcessorPrisma = (ruleGroup, options) => {
|
|
|
1055
1057
|
* @group Export
|
|
1056
1058
|
*/
|
|
1057
1059
|
const defaultRuleGroupProcessorSequelize = (ruleGroup, options) => {
|
|
1058
|
-
//
|
|
1060
|
+
// v8 ignore next
|
|
1059
1061
|
const { fields, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap, context = {} } = options;
|
|
1060
1062
|
const { sequelizeOperators: Op } = context;
|
|
1061
|
-
if (!Op) return;
|
|
1063
|
+
if (!Op) return void 0;
|
|
1062
1064
|
const processRuleGroup = (rg, _outermost) => {
|
|
1063
1065
|
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return;
|
|
1064
1066
|
const combinator = rg.combinator.toUpperCase();
|
|
@@ -1081,7 +1083,7 @@ const defaultRuleGroupProcessorSequelize = (ruleGroup, options) => {
|
|
|
1081
1083
|
fieldData
|
|
1082
1084
|
});
|
|
1083
1085
|
}).filter(Boolean);
|
|
1084
|
-
if (expressions.length === 0) return;
|
|
1086
|
+
if (expressions.length === 0) return void 0;
|
|
1085
1087
|
const result = expressions.length === 1 && !hasChildRules ? expressions[0] : { [lc(combinator) === "or" ? Op.or : Op.and]: expressions };
|
|
1086
1088
|
return rg.not ? { [Op.not]: result } : result;
|
|
1087
1089
|
};
|
|
@@ -1097,7 +1099,7 @@ const defaultRuleGroupProcessorSequelize = (ruleGroup, options) => {
|
|
|
1097
1099
|
const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
1098
1100
|
const { fields, fallbackExpression, getParseNumberBoolean, placeholderFieldName, placeholderOperatorName, placeholderValueName, ruleProcessor, validateRule, validationMap } = options;
|
|
1099
1101
|
const processRuleGroup = (rg, outermostOrLonelyInGroup) => {
|
|
1100
|
-
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : "";
|
|
1102
|
+
if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? ""])) return outermostOrLonelyInGroup ? fallbackExpression : /* v8 ignore next -- @preserve */ "";
|
|
1101
1103
|
const processedRules = [];
|
|
1102
1104
|
let precedingCombinator = "";
|
|
1103
1105
|
let firstRule = true;
|
|
@@ -1108,7 +1110,7 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
|
1108
1110
|
}
|
|
1109
1111
|
if (isRuleGroup(rule)) {
|
|
1110
1112
|
const processedGroup = processRuleGroup(rule, rg.rules.length === 1);
|
|
1111
|
-
//
|
|
1113
|
+
// v8 ignore else
|
|
1112
1114
|
if (processedGroup) {
|
|
1113
1115
|
if (!firstRule && precedingCombinator) {
|
|
1114
1116
|
processedRules.push(precedingCombinator);
|
|
@@ -1144,6 +1146,325 @@ const defaultRuleGroupProcessorSQL = (ruleGroup, options) => {
|
|
|
1144
1146
|
return processRuleGroup(ruleGroup, true);
|
|
1145
1147
|
};
|
|
1146
1148
|
//#endregion
|
|
1149
|
+
//#region src/utils/formatQuery/defaultRuleGroupProcessorDiagnostics.ts
|
|
1150
|
+
const numericInputTypes = new Set([
|
|
1151
|
+
"number",
|
|
1152
|
+
"range",
|
|
1153
|
+
"bigint"
|
|
1154
|
+
]);
|
|
1155
|
+
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
|
|
1156
|
+
const timeRegex = /^\d{2}:\d{2}(:\d{2}(\.\d+)?)?$/;
|
|
1157
|
+
const monthRegex = /^\d{4}-\d{2}$/;
|
|
1158
|
+
const weekRegex = /^\d{4}-W\d{2}$/;
|
|
1159
|
+
const colorRegex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
1160
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
1161
|
+
const isValidDateComponents = (y, m, d) => {
|
|
1162
|
+
const date = new Date(Date.UTC(y, m - 1, d));
|
|
1163
|
+
return date.getUTCFullYear() === y && date.getUTCMonth() === m - 1 && date.getUTCDate() === d;
|
|
1164
|
+
};
|
|
1165
|
+
const isValidTimeComponents = (s) => {
|
|
1166
|
+
const parts = s.split(":");
|
|
1167
|
+
const h = Number(parts[0]);
|
|
1168
|
+
const m = Number(parts[1]);
|
|
1169
|
+
const sec = parts[2] ? Number.parseFloat(parts[2]) : 0;
|
|
1170
|
+
return h >= 0 && h <= 23 && m >= 0 && m <= 59 && sec >= 0 && sec < 60;
|
|
1171
|
+
};
|
|
1172
|
+
/**
|
|
1173
|
+
* Checks whether a value is compatible with the given {@link FullField.inputType}.
|
|
1174
|
+
* Returns a diagnostic code string if there is a mismatch, or `undefined` if OK.
|
|
1175
|
+
*/
|
|
1176
|
+
const checkValueTypeMismatch = (value, inputType) => {
|
|
1177
|
+
if (value === null || value === void 0 || value === "") return void 0;
|
|
1178
|
+
if (numericInputTypes.has(inputType)) {
|
|
1179
|
+
const v = typeof value === "string" ? value.trim() : value;
|
|
1180
|
+
if (typeof v === "number" || typeof v === "bigint") return void 0;
|
|
1181
|
+
if (typeof v === "string" && numericRegex.test(v)) return void 0;
|
|
1182
|
+
return "VALUE_TYPE_MISMATCH";
|
|
1183
|
+
}
|
|
1184
|
+
if (inputType === "date") {
|
|
1185
|
+
if (typeof value !== "string") return "VALUE_TYPE_MISMATCH";
|
|
1186
|
+
const v = value.trim();
|
|
1187
|
+
if (!dateRegex.test(v)) return "VALUE_TYPE_MISMATCH";
|
|
1188
|
+
const [y, m, d] = v.split("-").map(Number);
|
|
1189
|
+
return isValidDateComponents(y, m, d) ? void 0 : "VALUE_TYPE_MISMATCH";
|
|
1190
|
+
}
|
|
1191
|
+
if (inputType === "datetime-local") {
|
|
1192
|
+
if (typeof value !== "string") return "VALUE_TYPE_MISMATCH";
|
|
1193
|
+
const base = value.trim().replace(/(Z|[+-]\d{2}:?\d{2}|[+-]\d{2})$/, "");
|
|
1194
|
+
const tIndex = base.indexOf("T");
|
|
1195
|
+
if (tIndex === -1) return "VALUE_TYPE_MISMATCH";
|
|
1196
|
+
const datePart = base.slice(0, tIndex);
|
|
1197
|
+
const timePart = base.slice(tIndex + 1);
|
|
1198
|
+
if (!dateRegex.test(datePart) || !timeRegex.test(timePart)) return "VALUE_TYPE_MISMATCH";
|
|
1199
|
+
const [y, m, d] = datePart.split("-").map(Number);
|
|
1200
|
+
if (!isValidDateComponents(y, m, d)) return "VALUE_TYPE_MISMATCH";
|
|
1201
|
+
return isValidTimeComponents(timePart) ? void 0 : "VALUE_TYPE_MISMATCH";
|
|
1202
|
+
}
|
|
1203
|
+
if (inputType === "time") {
|
|
1204
|
+
if (typeof value !== "string") return "VALUE_TYPE_MISMATCH";
|
|
1205
|
+
const v = value.trim();
|
|
1206
|
+
if (!timeRegex.test(v)) return "VALUE_TYPE_MISMATCH";
|
|
1207
|
+
return isValidTimeComponents(v) ? void 0 : "VALUE_TYPE_MISMATCH";
|
|
1208
|
+
}
|
|
1209
|
+
if (inputType === "month") {
|
|
1210
|
+
if (typeof value !== "string") return "VALUE_TYPE_MISMATCH";
|
|
1211
|
+
const v = value.trim();
|
|
1212
|
+
if (!monthRegex.test(v)) return "VALUE_TYPE_MISMATCH";
|
|
1213
|
+
const m = Number(v.slice(5));
|
|
1214
|
+
return m >= 1 && m <= 12 ? void 0 : "VALUE_TYPE_MISMATCH";
|
|
1215
|
+
}
|
|
1216
|
+
if (inputType === "week") {
|
|
1217
|
+
if (typeof value !== "string") return "VALUE_TYPE_MISMATCH";
|
|
1218
|
+
const v = value.trim();
|
|
1219
|
+
if (!weekRegex.test(v)) return "VALUE_TYPE_MISMATCH";
|
|
1220
|
+
const w = Number(v.slice(6));
|
|
1221
|
+
return w >= 1 && w <= 53 ? void 0 : "VALUE_TYPE_MISMATCH";
|
|
1222
|
+
}
|
|
1223
|
+
if (inputType === "color") {
|
|
1224
|
+
if (typeof value !== "string") return "VALUE_TYPE_MISMATCH";
|
|
1225
|
+
return colorRegex.test(value.trim()) ? void 0 : "VALUE_TYPE_MISMATCH";
|
|
1226
|
+
}
|
|
1227
|
+
if (inputType === "url") {
|
|
1228
|
+
if (typeof value !== "string") return "VALUE_TYPE_MISMATCH";
|
|
1229
|
+
try {
|
|
1230
|
+
new URL(value.trim());
|
|
1231
|
+
return;
|
|
1232
|
+
} catch {
|
|
1233
|
+
return "VALUE_TYPE_MISMATCH";
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
if (inputType === "email") {
|
|
1237
|
+
if (typeof value !== "string") return "VALUE_TYPE_MISMATCH";
|
|
1238
|
+
return emailRegex.test(value.trim()) ? void 0 : "VALUE_TYPE_MISMATCH";
|
|
1239
|
+
}
|
|
1240
|
+
};
|
|
1241
|
+
/**
|
|
1242
|
+
* Rule group processor used by {@link formatQuery} for "diagnostics" format.
|
|
1243
|
+
*
|
|
1244
|
+
* Produces a {@link DiagnosticsResult} containing an annotated copy of the query
|
|
1245
|
+
* tree (`query`) with `valid`, `reasons`, `path`, and `level` properties on every
|
|
1246
|
+
* rule and group; a flat `diagnostics` array; aggregate `stats`; and a per-field
|
|
1247
|
+
* `fieldSummary`.
|
|
1248
|
+
*
|
|
1249
|
+
* @group Export
|
|
1250
|
+
*/
|
|
1251
|
+
const defaultRuleGroupProcessorDiagnostics = (ruleGroup, options) => {
|
|
1252
|
+
const { fields: fieldsOption, placeholderFieldName, placeholderOperatorName, placeholderValueName, validateRule, validationMap } = options;
|
|
1253
|
+
const diagnostics = [];
|
|
1254
|
+
const stats = {
|
|
1255
|
+
totalRules: 0,
|
|
1256
|
+
totalGroups: 0,
|
|
1257
|
+
validRules: 0,
|
|
1258
|
+
invalidRules: 0,
|
|
1259
|
+
validGroups: 0,
|
|
1260
|
+
invalidGroups: 0
|
|
1261
|
+
};
|
|
1262
|
+
const fieldSummary = {};
|
|
1263
|
+
const uniqueFields = toFlatOptionArray(fieldsOption);
|
|
1264
|
+
const fieldsByName = /* @__PURE__ */ new Map();
|
|
1265
|
+
for (const f of uniqueFields) fieldsByName.set(f.name, f);
|
|
1266
|
+
const hasFieldsConfig = fieldsByName.size > 0;
|
|
1267
|
+
const processRuleGroup = (rg, path) => {
|
|
1268
|
+
stats.totalGroups++;
|
|
1269
|
+
const level = path.length;
|
|
1270
|
+
const groupValidationEntry = validationMap[rg.id ?? ""];
|
|
1271
|
+
const groupSelfValid = isRuleOrGroupValid(rg, groupValidationEntry);
|
|
1272
|
+
const groupReasons = getReasons(groupValidationEntry);
|
|
1273
|
+
if (rg.muted) diagnostics.push({
|
|
1274
|
+
id: rg.id ?? "",
|
|
1275
|
+
path,
|
|
1276
|
+
code: "MUTED",
|
|
1277
|
+
message: "Group is muted",
|
|
1278
|
+
source: "muted"
|
|
1279
|
+
});
|
|
1280
|
+
else if (!groupSelfValid && groupValidationEntry !== void 0) diagnostics.push({
|
|
1281
|
+
id: rg.id ?? "",
|
|
1282
|
+
path,
|
|
1283
|
+
code: "CUSTOM_VALIDATOR",
|
|
1284
|
+
message: groupReasons ? `Invalid: ${groupReasons.join(", ")}` : "Group failed validation",
|
|
1285
|
+
source: "query-validator"
|
|
1286
|
+
});
|
|
1287
|
+
let allChildrenValid = true;
|
|
1288
|
+
let ruleIndex = 0;
|
|
1289
|
+
const annotatedRules = [];
|
|
1290
|
+
for (const rule of rg.rules) {
|
|
1291
|
+
if (typeof rule === "string") {
|
|
1292
|
+
annotatedRules.push(rule);
|
|
1293
|
+
ruleIndex++;
|
|
1294
|
+
continue;
|
|
1295
|
+
}
|
|
1296
|
+
const childPath = [...path, ruleIndex];
|
|
1297
|
+
if (isRuleGroup(rule)) {
|
|
1298
|
+
const annotatedGroup = processRuleGroup(rule, childPath);
|
|
1299
|
+
if (!annotatedGroup.valid) allChildrenValid = false;
|
|
1300
|
+
annotatedRules.push(annotatedGroup);
|
|
1301
|
+
ruleIndex++;
|
|
1302
|
+
continue;
|
|
1303
|
+
}
|
|
1304
|
+
stats.totalRules++;
|
|
1305
|
+
const childLevel = childPath.length;
|
|
1306
|
+
const [validationResult, fieldValidator] = validateRule(rule);
|
|
1307
|
+
const ruleValid = isRuleOrGroupValid(rule, validationResult, fieldValidator) && rule.field !== placeholderFieldName && rule.operator !== placeholderOperatorName && !(placeholderValueName !== void 0 && rule.value === placeholderValueName);
|
|
1308
|
+
collectRuleDiagnostics(rule, childPath, validationResult, fieldValidator, ruleValid, diagnostics, placeholderFieldName, placeholderOperatorName, placeholderValueName, hasFieldsConfig, fieldsByName);
|
|
1309
|
+
if (!ruleValid) {
|
|
1310
|
+
allChildrenValid = false;
|
|
1311
|
+
stats.invalidRules++;
|
|
1312
|
+
} else stats.validRules++;
|
|
1313
|
+
const fieldName = rule.field;
|
|
1314
|
+
if (!fieldSummary[fieldName]) fieldSummary[fieldName] = {
|
|
1315
|
+
ruleCount: 0,
|
|
1316
|
+
invalidCount: 0
|
|
1317
|
+
};
|
|
1318
|
+
fieldSummary[fieldName].ruleCount++;
|
|
1319
|
+
if (!ruleValid) fieldSummary[fieldName].invalidCount++;
|
|
1320
|
+
const ruleReasons = getReasons(validationResult) ?? getFieldValidatorReasons(rule, fieldValidator);
|
|
1321
|
+
const annotatedRule = {
|
|
1322
|
+
...rule,
|
|
1323
|
+
valid: ruleValid,
|
|
1324
|
+
...ruleReasons ? { reasons: ruleReasons } : null,
|
|
1325
|
+
path: childPath,
|
|
1326
|
+
level: childLevel
|
|
1327
|
+
};
|
|
1328
|
+
annotatedRules.push(annotatedRule);
|
|
1329
|
+
ruleIndex++;
|
|
1330
|
+
}
|
|
1331
|
+
const groupValid = groupSelfValid && allChildrenValid;
|
|
1332
|
+
if (groupValid) stats.validGroups++;
|
|
1333
|
+
else stats.invalidGroups++;
|
|
1334
|
+
if (isRuleGroupType(rg)) return {
|
|
1335
|
+
...rg,
|
|
1336
|
+
valid: groupValid,
|
|
1337
|
+
...groupReasons ? { reasons: groupReasons } : null,
|
|
1338
|
+
path,
|
|
1339
|
+
level,
|
|
1340
|
+
rules: annotatedRules
|
|
1341
|
+
};
|
|
1342
|
+
return {
|
|
1343
|
+
...rg,
|
|
1344
|
+
valid: groupValid,
|
|
1345
|
+
...groupReasons ? { reasons: groupReasons } : null,
|
|
1346
|
+
path,
|
|
1347
|
+
level,
|
|
1348
|
+
rules: annotatedRules
|
|
1349
|
+
};
|
|
1350
|
+
};
|
|
1351
|
+
const query = processRuleGroup(ruleGroup, []);
|
|
1352
|
+
if (hasFieldsConfig) {
|
|
1353
|
+
const referencedFields = new Set(Object.keys(fieldSummary));
|
|
1354
|
+
for (const [fieldName] of fieldsByName) if (!referencedFields.has(fieldName)) diagnostics.push({
|
|
1355
|
+
id: "",
|
|
1356
|
+
path: [],
|
|
1357
|
+
code: "UNREFERENCED_FIELD",
|
|
1358
|
+
message: `Field "${fieldName}" is defined in the fields config but not used in the query`,
|
|
1359
|
+
source: "field-check"
|
|
1360
|
+
});
|
|
1361
|
+
}
|
|
1362
|
+
return {
|
|
1363
|
+
query,
|
|
1364
|
+
diagnostics,
|
|
1365
|
+
stats,
|
|
1366
|
+
fieldSummary
|
|
1367
|
+
};
|
|
1368
|
+
};
|
|
1369
|
+
/**
|
|
1370
|
+
* Collects diagnostic entries for a single rule.
|
|
1371
|
+
*/
|
|
1372
|
+
const collectRuleDiagnostics = (rule, path, validationResult, fieldValidator, ruleValid, diagnostics, placeholderFieldName, placeholderOperatorName, placeholderValueName, hasFieldsConfig, fieldsByName) => {
|
|
1373
|
+
const id = rule.id ?? "";
|
|
1374
|
+
if (rule.muted) diagnostics.push({
|
|
1375
|
+
id,
|
|
1376
|
+
path,
|
|
1377
|
+
code: "MUTED",
|
|
1378
|
+
message: "Rule is muted",
|
|
1379
|
+
source: "muted"
|
|
1380
|
+
});
|
|
1381
|
+
if (rule.field === placeholderFieldName) diagnostics.push({
|
|
1382
|
+
id,
|
|
1383
|
+
path,
|
|
1384
|
+
code: "PLACEHOLDER_FIELD",
|
|
1385
|
+
message: "Rule has a placeholder field",
|
|
1386
|
+
source: "placeholder"
|
|
1387
|
+
});
|
|
1388
|
+
if (rule.operator === placeholderOperatorName) diagnostics.push({
|
|
1389
|
+
id,
|
|
1390
|
+
path,
|
|
1391
|
+
code: "PLACEHOLDER_OPERATOR",
|
|
1392
|
+
message: "Rule has a placeholder operator",
|
|
1393
|
+
source: "placeholder"
|
|
1394
|
+
});
|
|
1395
|
+
if (placeholderValueName !== void 0 && rule.value === placeholderValueName) diagnostics.push({
|
|
1396
|
+
id,
|
|
1397
|
+
path,
|
|
1398
|
+
code: "PLACEHOLDER_VALUE",
|
|
1399
|
+
message: "Rule has a placeholder value",
|
|
1400
|
+
source: "placeholder"
|
|
1401
|
+
});
|
|
1402
|
+
if (!rule.muted && rule.field !== placeholderFieldName && rule.operator !== placeholderOperatorName && !(placeholderValueName !== void 0 && rule.value === placeholderValueName)) {
|
|
1403
|
+
if (typeof validationResult === "boolean" && !validationResult) diagnostics.push({
|
|
1404
|
+
id,
|
|
1405
|
+
path,
|
|
1406
|
+
code: "CUSTOM_VALIDATOR",
|
|
1407
|
+
message: "Rule failed validation",
|
|
1408
|
+
source: "query-validator"
|
|
1409
|
+
});
|
|
1410
|
+
else if (typeof validationResult !== "boolean" && isValidationResult(validationResult) && !validationResult.valid) {
|
|
1411
|
+
const reasons = validationResult.reasons;
|
|
1412
|
+
diagnostics.push({
|
|
1413
|
+
id,
|
|
1414
|
+
path,
|
|
1415
|
+
code: "CUSTOM_VALIDATOR",
|
|
1416
|
+
message: reasons ? `Invalid: ${reasons.join(", ")}` : "Rule failed validation",
|
|
1417
|
+
source: "query-validator"
|
|
1418
|
+
});
|
|
1419
|
+
} else if (!ruleValid && typeof fieldValidator === "function") {
|
|
1420
|
+
const vr = fieldValidator(rule);
|
|
1421
|
+
const reasons = typeof vr !== "boolean" && isValidationResult(vr) && !vr.valid ? vr.reasons : void 0;
|
|
1422
|
+
diagnostics.push({
|
|
1423
|
+
id,
|
|
1424
|
+
path,
|
|
1425
|
+
code: "CUSTOM_VALIDATOR",
|
|
1426
|
+
message: reasons ? `Invalid: ${reasons.join(", ")}` : "Rule failed field validation",
|
|
1427
|
+
source: "field-validator"
|
|
1428
|
+
});
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
if (hasFieldsConfig && !fieldsByName.has(rule.field) && rule.field !== placeholderFieldName) diagnostics.push({
|
|
1432
|
+
id,
|
|
1433
|
+
path,
|
|
1434
|
+
code: "UNDEFINED_FIELD",
|
|
1435
|
+
message: `Field "${rule.field}" is not defined in the fields config`,
|
|
1436
|
+
source: "field-check"
|
|
1437
|
+
});
|
|
1438
|
+
if (hasFieldsConfig) {
|
|
1439
|
+
const fieldDef = fieldsByName.get(rule.field);
|
|
1440
|
+
if (fieldDef?.inputType) {
|
|
1441
|
+
const mismatchCode = checkValueTypeMismatch(rule.value, fieldDef.inputType);
|
|
1442
|
+
if (mismatchCode) diagnostics.push({
|
|
1443
|
+
id,
|
|
1444
|
+
path,
|
|
1445
|
+
code: mismatchCode,
|
|
1446
|
+
message: `Value "${rule.value}" is not compatible with input type "${fieldDef.inputType}"`,
|
|
1447
|
+
source: "type-check"
|
|
1448
|
+
});
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
};
|
|
1452
|
+
/**
|
|
1453
|
+
* Extracts `reasons` from a validation result, if present.
|
|
1454
|
+
*/
|
|
1455
|
+
const getReasons = (validationResult) => {
|
|
1456
|
+
if (typeof validationResult !== "boolean" && isValidationResult(validationResult) && !validationResult.valid && validationResult.reasons) return validationResult.reasons;
|
|
1457
|
+
};
|
|
1458
|
+
/**
|
|
1459
|
+
* Runs a field-level validator and extracts `reasons` if present.
|
|
1460
|
+
*/
|
|
1461
|
+
const getFieldValidatorReasons = (rule, fieldValidator) => {
|
|
1462
|
+
if (typeof fieldValidator === "function") {
|
|
1463
|
+
const vr = fieldValidator(rule);
|
|
1464
|
+
if (typeof vr !== "boolean" && isValidationResult(vr) && !vr.valid && vr.reasons) return vr.reasons;
|
|
1465
|
+
}
|
|
1466
|
+
};
|
|
1467
|
+
//#endregion
|
|
1147
1468
|
//#region src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts
|
|
1148
1469
|
const rangeOperatorMap = {
|
|
1149
1470
|
"<": "lt",
|
|
@@ -1522,12 +1843,12 @@ const defaultRuleProcessorLDAP = (rule, options = {}) => {
|
|
|
1522
1843
|
return negateIf(`(&(${field}>=${ldapEscape(firstValue)})(${field}<=${ldapEscape(secondValue)}))`, operatorLC === "notbetween");
|
|
1523
1844
|
}
|
|
1524
1845
|
}
|
|
1525
|
-
//
|
|
1846
|
+
// v8 ignore next
|
|
1526
1847
|
return "";
|
|
1527
1848
|
};
|
|
1528
1849
|
//#endregion
|
|
1529
1850
|
//#region src/utils/formatQuery/defaultValueProcessorNL.ts
|
|
1530
|
-
const escapeStringValueQuotes = (v, quoteChar, escapeQuotes) => escapeQuotes && typeof v === "string" ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`) : v;
|
|
1851
|
+
const escapeStringValueQuotes = (v, quoteChar, escapeQuotes) => escapeQuotes && typeof v === "string" ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`) : /* v8 ignore next -- @preserve */ v;
|
|
1531
1852
|
/**
|
|
1532
1853
|
* Default value processor used by {@link formatQuery} for "natural_language" format.
|
|
1533
1854
|
*
|
|
@@ -1545,7 +1866,7 @@ const defaultValueProcessorNL = (rule, opts = {}) => {
|
|
|
1545
1866
|
quoteFieldNamesWith,
|
|
1546
1867
|
fieldIdentifierSeparator
|
|
1547
1868
|
});
|
|
1548
|
-
const t = translations ?? ( /*
|
|
1869
|
+
const t = translations ?? ( /* v8 ignore start -- @preserve */ {});
|
|
1549
1870
|
const orTL = t.or ?? "or";
|
|
1550
1871
|
const trueTL = t.true ?? "true";
|
|
1551
1872
|
const falseTL = t.false ?? "false";
|
|
@@ -1601,7 +1922,7 @@ const defaultExportOperatorMap = {
|
|
|
1601
1922
|
between: ["is between", "is between the values in"],
|
|
1602
1923
|
notbetween: ["is not between", "is not between the values in"]
|
|
1603
1924
|
};
|
|
1604
|
-
/*
|
|
1925
|
+
/* v8 ignore next -- @preserve */
|
|
1605
1926
|
const defaultGetOperators = () => [];
|
|
1606
1927
|
/**
|
|
1607
1928
|
* Default operator processor used by {@link formatQuery} for "natural_language" format.
|
|
@@ -1610,7 +1931,7 @@ const defaultGetOperators = () => [];
|
|
|
1610
1931
|
*/
|
|
1611
1932
|
const defaultOperatorProcessorNL = (rule, opts = {}) => {
|
|
1612
1933
|
const { field, operator, valueSource = "value" } = rule;
|
|
1613
|
-
//
|
|
1934
|
+
// v8 ignore next
|
|
1614
1935
|
const { getOperators = defaultGetOperators, operatorMap: operatorMapParam = defaultExportOperatorMap } = opts;
|
|
1615
1936
|
const mergedOperatorMap = new Map(Object.entries(defaultExportOperatorMap));
|
|
1616
1937
|
for (const [key, value] of Object.entries(operatorMapParam)) mergedOperatorMap.set(lc(key), value);
|
|
@@ -1639,8 +1960,8 @@ const defaultOperatorProcessorNL = (rule, opts = {}) => {
|
|
|
1639
1960
|
*/
|
|
1640
1961
|
const defaultRuleProcessorNL = (rule, opts) => {
|
|
1641
1962
|
const { field, operator } = rule;
|
|
1642
|
-
//
|
|
1643
|
-
const { fieldData, quoteFieldNamesWith = ["", ""], fieldIdentifierSeparator = "", quoteValuesWith = `'`, operatorProcessor = defaultOperatorProcessorNL, valueProcessor = defaultValueProcessorNL, concatOperator = "||", wordOrder = "SVO" } = opts ?? ( /*
|
|
1963
|
+
// v8 ignore next
|
|
1964
|
+
const { fieldData, quoteFieldNamesWith = ["", ""], fieldIdentifierSeparator = "", quoteValuesWith = `'`, operatorProcessor = defaultOperatorProcessorNL, valueProcessor = defaultValueProcessorNL, concatOperator = "||", wordOrder = "SVO" } = opts ?? ( /* v8 ignore start -- @preserve */ {});
|
|
1644
1965
|
const processedField = getQuotedFieldName(fieldData?.label ?? field, {
|
|
1645
1966
|
quoteFieldNamesWith,
|
|
1646
1967
|
fieldIdentifierSeparator
|
|
@@ -1746,7 +2067,7 @@ const defaultRuleProcessorSQL = (rule, opts = {}) => {
|
|
|
1746
2067
|
* @group Export
|
|
1747
2068
|
*/
|
|
1748
2069
|
const defaultRuleProcessorParameterized = (rule, opts, meta) => {
|
|
1749
|
-
//
|
|
2070
|
+
// v8 ignore next
|
|
1750
2071
|
const { fieldData, format, getNextNamedParam, parseNumbers, paramPrefix, paramsKeepPrefix, numberedParams, quoteFieldNamesWith = ["", ""], fieldIdentifierSeparator, concatOperator, operatorProcessor = defaultOperatorProcessorSQL, valueProcessor = defaultValueProcessorByRule } = opts ?? {};
|
|
1751
2072
|
const { processedParams = [] } = meta ?? {};
|
|
1752
2073
|
const parameterized = format === "parameterized";
|
|
@@ -1765,6 +2086,7 @@ const defaultRuleProcessorParameterized = (rule, opts, meta) => {
|
|
|
1765
2086
|
});
|
|
1766
2087
|
const ruleField = wrapFieldName(rule.field);
|
|
1767
2088
|
const matchEval = processMatchMode(rule);
|
|
2089
|
+
/* v8 ignore start -- @preserve */
|
|
1768
2090
|
if (matchEval === false) return;
|
|
1769
2091
|
else if (matchEval) {
|
|
1770
2092
|
if (opts?.preset !== "postgresql") return finalize("");
|
|
@@ -1777,7 +2099,6 @@ const defaultRuleProcessorParameterized = (rule, opts, meta) => {
|
|
|
1777
2099
|
...opts,
|
|
1778
2100
|
fields: []
|
|
1779
2101
|
});
|
|
1780
|
-
// istanbul ignore else
|
|
1781
2102
|
if (Array.isArray(nestedParams)) params.push(...nestedParams);
|
|
1782
2103
|
else Object.assign(paramsNamed, nestedParams);
|
|
1783
2104
|
switch (mode) {
|
|
@@ -1792,6 +2113,7 @@ const defaultRuleProcessorParameterized = (rule, opts, meta) => {
|
|
|
1792
2113
|
}
|
|
1793
2114
|
}
|
|
1794
2115
|
}
|
|
2116
|
+
/* v8 ignore stop -- @preserve */
|
|
1795
2117
|
const value = valueProcessor(rule, {
|
|
1796
2118
|
parseNumbers,
|
|
1797
2119
|
quoteFieldNamesWith,
|
|
@@ -1832,7 +2154,7 @@ const defaultRuleProcessorParameterized = (rule, opts, meta) => {
|
|
|
1832
2154
|
}
|
|
1833
2155
|
let paramValue = rule.value;
|
|
1834
2156
|
if (typeof rule.value === "string") if (shouldRenderAsNumber(rule.value, parseNumbers)) paramValue = parseNumber(rule.value, { parseNumbers });
|
|
1835
|
-
else paramValue = /^'.*'$/g.test(value) ? value.replaceAll(/(^'|'$)/g, "") : value;
|
|
2157
|
+
else paramValue = /^'.*'$/g.test(value) ? value.replaceAll(/(^'|'$)/g, "") : /* v8 ignore next -- @preserve */ value;
|
|
1836
2158
|
let paramName = "";
|
|
1837
2159
|
if (parameterized) params.push(paramValue);
|
|
1838
2160
|
else {
|
|
@@ -1851,9 +2173,9 @@ const processNumber = (value, fallback, parseNumbers) => shouldRenderAsNumber(va
|
|
|
1851
2173
|
*/
|
|
1852
2174
|
const defaultRuleProcessorPrisma = (rule, options = {}) => {
|
|
1853
2175
|
const { field, operator, value, valueSource } = rule;
|
|
1854
|
-
//
|
|
2176
|
+
// v8 ignore next
|
|
1855
2177
|
const { parseNumbers, preserveValueOrder } = options;
|
|
1856
|
-
if (valueSource === "field" || processMatchMode(rule)) return;
|
|
2178
|
+
if (valueSource === "field" || processMatchMode(rule)) return void 0;
|
|
1857
2179
|
const operatorLC = lc(operator);
|
|
1858
2180
|
switch (operatorLC) {
|
|
1859
2181
|
case "=": return { [field]: processNumber(value, value, parseNumbers) };
|
|
@@ -1911,7 +2233,7 @@ const defaultRuleProcessorPrisma = (rule, options = {}) => {
|
|
|
1911
2233
|
*/
|
|
1912
2234
|
const defaultRuleProcessorSequelize = (rule, { parseNumbers, preserveValueOrder, context = {} } = {}) => {
|
|
1913
2235
|
const { sequelizeOperators: Op, sequelizeCol: col, sequelizeFn: fn } = context;
|
|
1914
|
-
if (processMatchMode(rule)) return;
|
|
2236
|
+
if (processMatchMode(rule)) return void 0;
|
|
1915
2237
|
const { field, operator, value, valueSource } = rule;
|
|
1916
2238
|
const valueIsField = valueSource === "field";
|
|
1917
2239
|
const operatorLC = lc(operator);
|
|
@@ -2015,9 +2337,10 @@ const defaultRuleProcessors = {
|
|
|
2015
2337
|
prisma: defaultRuleProcessorPrisma,
|
|
2016
2338
|
sequelize: defaultRuleProcessorSequelize,
|
|
2017
2339
|
spel: defaultRuleProcessorSpEL,
|
|
2018
|
-
sql: defaultRuleProcessorSQL
|
|
2340
|
+
sql: defaultRuleProcessorSQL,
|
|
2341
|
+
diagnostics: defaultRuleProcessorSQL
|
|
2019
2342
|
};
|
|
2020
|
-
/*
|
|
2343
|
+
/* v8 ignore next -- @preserve */
|
|
2021
2344
|
const defaultOperatorProcessor = (r) => r.operator;
|
|
2022
2345
|
const defaultOperatorProcessors = {
|
|
2023
2346
|
cel: defaultOperatorProcessor,
|
|
@@ -2036,7 +2359,8 @@ const defaultOperatorProcessors = {
|
|
|
2036
2359
|
prisma: defaultOperatorProcessor,
|
|
2037
2360
|
sequelize: defaultOperatorProcessor,
|
|
2038
2361
|
spel: defaultOperatorProcessor,
|
|
2039
|
-
sql: defaultOperatorProcessorSQL
|
|
2362
|
+
sql: defaultOperatorProcessorSQL,
|
|
2363
|
+
diagnostics: defaultOperatorProcessor
|
|
2040
2364
|
};
|
|
2041
2365
|
const defaultFallbackExpressions = {
|
|
2042
2366
|
cel: "1 == 1",
|
|
@@ -2110,24 +2434,26 @@ function formatQuery(ruleGroup, optionParam = {}) {
|
|
|
2110
2434
|
const getOperators = (f, m) => toFullOptionList(getOperators_option(f, m) ?? []);
|
|
2111
2435
|
const fallbackExpression = fallbackExpression_option ?? defaultFallbackExpressions[format] ?? defaultFallbackExpressions.sql;
|
|
2112
2436
|
let validationMap = {};
|
|
2113
|
-
//
|
|
2437
|
+
// v8 ignore else
|
|
2114
2438
|
if (typeof validator === "function") {
|
|
2115
2439
|
const validationResult = validator(ruleGroup);
|
|
2116
2440
|
if (typeof validationResult === "boolean") {
|
|
2117
|
-
//
|
|
2118
|
-
if (!validationResult)
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2441
|
+
// v8 ignore else
|
|
2442
|
+
if (!validationResult) {
|
|
2443
|
+
if (format !== "diagnostics") return format === "parameterized" ? {
|
|
2444
|
+
sql: fallbackExpression,
|
|
2445
|
+
params: []
|
|
2446
|
+
} : format === "parameterized_named" ? {
|
|
2447
|
+
sql: fallbackExpression,
|
|
2448
|
+
params: {}
|
|
2449
|
+
} : format === "mongodb" ? `{${fallbackExpression}}` : format === "mongodb_query" ? mongoDbFallback : format === "prisma" ? prismaFallback : format === "jsonlogic" ? false : format === "elasticsearch" ? {} : format === "drizzle" || format === "sequelize" ? void 0 : fallbackExpression;
|
|
2450
|
+
}
|
|
2125
2451
|
} else validationMap = validationResult;
|
|
2126
2452
|
}
|
|
2127
2453
|
const validatorMap = {};
|
|
2128
2454
|
const uniqueFields = toFlatOptionArray(fields);
|
|
2129
2455
|
for (const f of uniqueFields)
|
|
2130
|
-
//
|
|
2456
|
+
// v8 ignore else
|
|
2131
2457
|
if (typeof f.validator === "function") validatorMap[f.value ?? f.name] = f.validator;
|
|
2132
2458
|
const validateRule = (rule) => {
|
|
2133
2459
|
let validationResult;
|
|
@@ -2137,7 +2463,7 @@ function formatQuery(ruleGroup, optionParam = {}) {
|
|
|
2137
2463
|
const fieldArr = uniqueFields.filter((f) => f.name === rule.field);
|
|
2138
2464
|
if (fieldArr.length > 0) {
|
|
2139
2465
|
const field = fieldArr[0];
|
|
2140
|
-
//
|
|
2466
|
+
// v8 ignore else
|
|
2141
2467
|
if (typeof field.validator === "function") fieldValidator = field.validator;
|
|
2142
2468
|
}
|
|
2143
2469
|
}
|
|
@@ -2181,6 +2507,7 @@ function formatQuery(ruleGroup, optionParam = {}) {
|
|
|
2181
2507
|
case "prisma": return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);
|
|
2182
2508
|
case "drizzle": return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);
|
|
2183
2509
|
case "sequelize": return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);
|
|
2510
|
+
case "diagnostics": return defaultRuleGroupProcessorDiagnostics(ruleGroup, finalOptions);
|
|
2184
2511
|
default: return "";
|
|
2185
2512
|
}
|
|
2186
2513
|
}
|
|
@@ -2235,6 +2562,6 @@ const defaultValueProcessorMongoDBByRule = defaultRuleProcessorMongoDB;
|
|
|
2235
2562
|
*/
|
|
2236
2563
|
const defaultValueProcessorSpELByRule = defaultRuleProcessorSpEL;
|
|
2237
2564
|
//#endregion
|
|
2238
|
-
export { bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, defaultCELValueProcessor, defaultExportOperatorMap, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultRuleGroupProcessorCEL, defaultRuleGroupProcessorDrizzle, defaultRuleGroupProcessorElasticSearch, defaultRuleGroupProcessorJSONata, defaultRuleGroupProcessorJsonLogic, defaultRuleGroupProcessorLDAP, defaultRuleGroupProcessorMongoDB, defaultRuleGroupProcessorMongoDBQuery, defaultRuleGroupProcessorNL, defaultRuleGroupProcessorParameterized, defaultRuleGroupProcessorPrisma, defaultRuleGroupProcessorSQL, defaultRuleGroupProcessorSequelize, defaultRuleGroupProcessorSpEL, defaultRuleProcessorCEL, defaultRuleProcessorDrizzle, defaultRuleProcessorElasticSearch, defaultRuleProcessorJSONata, defaultRuleProcessorJsonLogic, defaultRuleProcessorLDAP, defaultRuleProcessorMongoDB, defaultRuleProcessorMongoDBQuery, defaultRuleProcessorNL, defaultRuleProcessorParameterized, defaultRuleProcessorPrisma, defaultRuleProcessorSQL, defaultRuleProcessorSequelize, defaultRuleProcessorSpEL, defaultSpELValueProcessor, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, formatQuery, formatQueryOptionPresets, getNLTranslataion, getQuoteFieldNamesWithArray, getQuotedFieldName, isValidValue, isValueProcessorLegacy, jsonLogicAdditionalOperators, mapSQLOperator, mongoDbFallback, mongoOperators, normalizeConstituentWordOrder, numerifyValues, prismaFallback, prismaOperators, processMatchMode, shouldRenderAsNumber, sqlDialectPresets };
|
|
2565
|
+
export { bigIntJsonParseReviver, bigIntJsonStringifyReplacer, celCombinatorMap, defaultCELValueProcessor, defaultExportOperatorMap, defaultMongoDBValueProcessor, defaultNLTranslations, defaultOperatorProcessorNL, defaultOperatorProcessorSQL, defaultRuleGroupProcessorCEL, defaultRuleGroupProcessorDiagnostics, defaultRuleGroupProcessorDrizzle, defaultRuleGroupProcessorElasticSearch, defaultRuleGroupProcessorJSONata, defaultRuleGroupProcessorJsonLogic, defaultRuleGroupProcessorLDAP, defaultRuleGroupProcessorMongoDB, defaultRuleGroupProcessorMongoDBQuery, defaultRuleGroupProcessorNL, defaultRuleGroupProcessorParameterized, defaultRuleGroupProcessorPrisma, defaultRuleGroupProcessorSQL, defaultRuleGroupProcessorSequelize, defaultRuleGroupProcessorSpEL, defaultRuleProcessorCEL, defaultRuleProcessorDrizzle, defaultRuleProcessorElasticSearch, defaultRuleProcessorJSONata, defaultRuleProcessorJsonLogic, defaultRuleProcessorLDAP, defaultRuleProcessorMongoDB, defaultRuleProcessorMongoDBQuery, defaultRuleProcessorNL, defaultRuleProcessorParameterized, defaultRuleProcessorPrisma, defaultRuleProcessorSQL, defaultRuleProcessorSequelize, defaultRuleProcessorSpEL, defaultSpELValueProcessor, defaultValueProcessor, defaultValueProcessorByRule, defaultValueProcessorCELByRule, defaultValueProcessorMongoDBByRule, defaultValueProcessorNL, defaultValueProcessorSpELByRule, formatQuery, formatQueryOptionPresets, getNLTranslataion, getQuoteFieldNamesWithArray, getQuotedFieldName, isValidValue, isValueProcessorLegacy, jsonLogicAdditionalOperators, mapSQLOperator, mongoDbFallback, mongoOperators, normalizeConstituentWordOrder, numerifyValues, prismaFallback, prismaOperators, processMatchMode, shouldRenderAsNumber, sqlDialectPresets };
|
|
2239
2566
|
|
|
2240
2567
|
//# sourceMappingURL=formatQuery.mjs.map
|