@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.
Files changed (95) hide show
  1. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +201 -8
  2. package/dist/cjs/react-querybuilder_core.cjs.development.js +400 -62
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  4. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +201 -8
  5. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  6. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  7. package/dist/{convertQuery-CeJSNn37.mjs → convertQuery-BeJJH9BI.mjs} +2 -2
  8. package/dist/convertQuery-BeJJH9BI.mjs.map +1 -0
  9. package/dist/{convertQuery-J8LpTG-7.js → convertQuery-Lx2HQa0m.js} +2 -2
  10. package/dist/convertQuery-Lx2HQa0m.js.map +1 -0
  11. package/dist/formatQuery.d.mts +24 -3
  12. package/dist/formatQuery.d.ts +24 -3
  13. package/dist/formatQuery.js +379 -51
  14. package/dist/formatQuery.js.map +1 -1
  15. package/dist/formatQuery.mjs +379 -52
  16. package/dist/formatQuery.mjs.map +1 -1
  17. package/dist/{import-Bltb2mT4.d.mts → import-0wp72lLT.d.mts} +2 -2
  18. package/dist/{import-B5Iq8XmL.d.ts → import-yRVJh7E1.d.ts} +2 -2
  19. package/dist/{basic-BXJVfD0P.d.ts → index-D5TXNIzF.d.ts} +595 -3
  20. package/dist/{basic-CNIjb6rI.d.mts → index-Lht_Wq3V.d.mts} +595 -3
  21. package/dist/{objectUtils-ButT0Mng.js → objectUtils-Bzug_QfX.js} +2 -2
  22. package/dist/objectUtils-Bzug_QfX.js.map +1 -0
  23. package/dist/{objectUtils-C0WB-8ex.mjs → objectUtils-D96eEEzL.mjs} +2 -2
  24. package/dist/objectUtils-D96eEEzL.mjs.map +1 -0
  25. package/dist/parseCEL.d.mts +2 -2
  26. package/dist/parseCEL.d.ts +2 -2
  27. package/dist/parseCEL.js +35 -35
  28. package/dist/parseCEL.js.map +1 -1
  29. package/dist/parseCEL.mjs +35 -35
  30. package/dist/parseCEL.mjs.map +1 -1
  31. package/dist/parseJSONata.d.mts +2 -2
  32. package/dist/parseJSONata.d.ts +2 -2
  33. package/dist/parseJSONata.js +11 -11
  34. package/dist/parseJSONata.js.map +1 -1
  35. package/dist/parseJSONata.mjs +11 -11
  36. package/dist/parseJSONata.mjs.map +1 -1
  37. package/dist/parseJsonLogic.d.mts +2 -3
  38. package/dist/parseJsonLogic.d.ts +2 -3
  39. package/dist/parseJsonLogic.js +6 -6
  40. package/dist/parseJsonLogic.js.map +1 -1
  41. package/dist/parseJsonLogic.mjs +6 -6
  42. package/dist/parseJsonLogic.mjs.map +1 -1
  43. package/dist/parseMongoDB.d.mts +2 -2
  44. package/dist/parseMongoDB.d.ts +2 -2
  45. package/dist/parseMongoDB.js +6 -6
  46. package/dist/parseMongoDB.js.map +1 -1
  47. package/dist/parseMongoDB.mjs +6 -6
  48. package/dist/parseMongoDB.mjs.map +1 -1
  49. package/dist/parseSQL.d.mts +2 -2
  50. package/dist/parseSQL.d.ts +2 -2
  51. package/dist/parseSQL.js +16 -16
  52. package/dist/parseSQL.js.map +1 -1
  53. package/dist/parseSQL.mjs +16 -16
  54. package/dist/parseSQL.mjs.map +1 -1
  55. package/dist/parseSpEL.d.mts +2 -2
  56. package/dist/parseSpEL.d.ts +2 -2
  57. package/dist/parseSpEL.js +10 -10
  58. package/dist/parseSpEL.js.map +1 -1
  59. package/dist/parseSpEL.mjs +10 -10
  60. package/dist/parseSpEL.mjs.map +1 -1
  61. package/dist/{prepareQueryObjects-DO3qXriW.js → prepareQueryObjects-BoG5Rt8z.js} +6 -6
  62. package/dist/prepareQueryObjects-BoG5Rt8z.js.map +1 -0
  63. package/dist/{prepareQueryObjects-BfMlS4ql.mjs → prepareQueryObjects-uA10ZpZX.mjs} +6 -6
  64. package/dist/prepareQueryObjects-uA10ZpZX.mjs.map +1 -0
  65. package/dist/query-builder.css +1 -1
  66. package/dist/query-builder.css.map +1 -1
  67. package/dist/react-querybuilder_core.d.mts +201 -8
  68. package/dist/react-querybuilder_core.legacy-esm.d.ts +201 -8
  69. package/dist/react-querybuilder_core.legacy-esm.js +441 -93
  70. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  71. package/dist/react-querybuilder_core.mjs +399 -63
  72. package/dist/react-querybuilder_core.mjs.map +1 -1
  73. package/dist/react-querybuilder_core.production.d.mts +201 -8
  74. package/dist/react-querybuilder_core.production.mjs +1 -1
  75. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  76. package/dist/styles/_main.scss +4 -0
  77. package/dist/transformQuery.d.mts +1 -1
  78. package/dist/transformQuery.d.ts +1 -1
  79. package/dist/transformQuery.js +1 -1
  80. package/dist/transformQuery.mjs +1 -1
  81. package/dist/{utils-BlMGIhvx.mjs → utils-ChLG90DP.mjs} +3 -3
  82. package/dist/utils-ChLG90DP.mjs.map +1 -0
  83. package/dist/{utils-CZRhzje-.js → utils-Qwkq2Q0F.js} +3 -3
  84. package/dist/utils-Qwkq2Q0F.js.map +1 -0
  85. package/package.json +12 -16
  86. package/dist/convertQuery-CeJSNn37.mjs.map +0 -1
  87. package/dist/convertQuery-J8LpTG-7.js.map +0 -1
  88. package/dist/export-6x7MilFR.d.mts +0 -451
  89. package/dist/export-CpJOQuZv.d.ts +0 -451
  90. package/dist/objectUtils-ButT0Mng.js.map +0 -1
  91. package/dist/objectUtils-C0WB-8ex.mjs.map +0 -1
  92. package/dist/prepareQueryObjects-BfMlS4ql.mjs.map +0 -1
  93. package/dist/prepareQueryObjects-DO3qXriW.js.map +0 -1
  94. package/dist/utils-BlMGIhvx.mjs.map +0 -1
  95. package/dist/utils-CZRhzje-.js.map +0 -1
@@ -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-BlMGIhvx.mjs";
2
- import { a as isRuleGroupTypeIC, c as nullOrUndefinedOrEmpty, i as isRuleGroupType, o as isPojo, r as isRuleGroup, s as lc } from "./objectUtils-C0WB-8ex.mjs";
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-CeJSNn37.mjs";
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
- // istanbul ignore else
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 ?? ( /* istanbul ignore next */ {});
545
- // istanbul ignore next
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 ? `"$not":${isBracketed(result) ? result : `{${result}}`}` : result;
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
- // istanbul ignore else
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
- // istanbul ignore else
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
- // istanbul ignore else
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
- // istanbul ignore next
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
- // istanbul ignore else
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
- // istanbul ignore next
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 ?? ( /* istanbul ignore next */ {});
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
- /* istanbul ignore next */
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
- // istanbul ignore next
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
- // istanbul ignore next
1643
- const { fieldData, quoteFieldNamesWith = ["", ""], fieldIdentifierSeparator = "", quoteValuesWith = `'`, operatorProcessor = defaultOperatorProcessorNL, valueProcessor = defaultValueProcessorNL, concatOperator = "||", wordOrder = "SVO" } = opts ?? ( /* istanbul ignore next */ {});
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
- // istanbul ignore next
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
- // istanbul ignore next
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
- /* istanbul ignore next */
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
- // istanbul ignore else
2437
+ // v8 ignore else
2114
2438
  if (typeof validator === "function") {
2115
2439
  const validationResult = validator(ruleGroup);
2116
2440
  if (typeof validationResult === "boolean") {
2117
- // istanbul ignore else
2118
- if (!validationResult) return format === "parameterized" ? {
2119
- sql: fallbackExpression,
2120
- params: []
2121
- } : format === "parameterized_named" ? {
2122
- sql: fallbackExpression,
2123
- params: {}
2124
- } : format === "mongodb" ? `{${fallbackExpression}}` : format === "mongodb_query" ? mongoDbFallback : format === "prisma" ? prismaFallback : format === "jsonlogic" ? false : format === "elasticsearch" ? {} : format === "drizzle" || format === "sequelize" ? void 0 : fallbackExpression;
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
- // istanbul ignore else
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
- // istanbul ignore else
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