@react-querybuilder/core 8.14.1 → 8.14.3-alpha.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 +6 -1
- package/dist/cjs/react-querybuilder_core.cjs.development.js +18 -7
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +6 -1
- 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-B5Qm_6ut.mjs → convertQuery-CeJSNn37.mjs} +2 -2
- package/dist/{convertQuery-B5Qm_6ut.mjs.map → convertQuery-CeJSNn37.mjs.map} +1 -1
- package/dist/{convertQuery-DfZehtnd.js → convertQuery-J8LpTG-7.js} +8 -8
- package/dist/{convertQuery-DfZehtnd.js.map → convertQuery-J8LpTG-7.js.map} +1 -1
- package/dist/formatQuery.js +60 -60
- package/dist/formatQuery.mjs +3 -3
- package/dist/{isRuleGroup-BCwaLzDj.js → objectUtils-ButT0Mng.js} +26 -1
- package/dist/objectUtils-ButT0Mng.js.map +1 -0
- package/dist/{isRuleGroup-LzP0HCKh.mjs → objectUtils-C0WB-8ex.mjs} +15 -2
- package/dist/objectUtils-C0WB-8ex.mjs.map +1 -0
- package/dist/parseCEL.js +8 -8
- package/dist/parseCEL.mjs +3 -3
- package/dist/parseJSONata.js +6 -6
- package/dist/parseJSONata.mjs +2 -2
- package/dist/parseJsonLogic.js +34 -34
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +4 -4
- package/dist/parseMongoDB.js +23 -23
- package/dist/parseMongoDB.js.map +1 -1
- package/dist/parseMongoDB.mjs +4 -4
- package/dist/parseSQL.js +7 -7
- package/dist/parseSQL.mjs +3 -3
- package/dist/parseSpEL.js +5 -5
- package/dist/parseSpEL.mjs +3 -3
- package/dist/{prepareQueryObjects-tMukQHT9.mjs → prepareQueryObjects-BfMlS4ql.mjs} +3 -3
- package/dist/{prepareQueryObjects-tMukQHT9.mjs.map → prepareQueryObjects-BfMlS4ql.mjs.map} +1 -1
- package/dist/{prepareQueryObjects-Dc8rqsYM.js → prepareQueryObjects-DO3qXriW.js} +5 -5
- package/dist/{prepareQueryObjects-Dc8rqsYM.js.map → prepareQueryObjects-DO3qXriW.js.map} +1 -1
- package/dist/react-querybuilder_core.d.mts +6 -1
- package/dist/react-querybuilder_core.legacy-esm.d.ts +6 -1
- package/dist/react-querybuilder_core.legacy-esm.js +15 -5
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +18 -8
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +6 -1
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/transformQuery.js +5 -4
- package/dist/transformQuery.js.map +1 -1
- package/dist/transformQuery.mjs +3 -2
- package/dist/transformQuery.mjs.map +1 -1
- package/dist/{utils-DQoYnxpa.mjs → utils-BlMGIhvx.mjs} +3 -11
- package/dist/utils-BlMGIhvx.mjs.map +1 -0
- package/dist/{utils-EsYRkPtf.js → utils-CZRhzje-.js} +12 -26
- package/dist/utils-CZRhzje-.js.map +1 -0
- package/package.json +2 -2
- package/dist/isRuleGroup-BCwaLzDj.js.map +0 -1
- package/dist/isRuleGroup-LzP0HCKh.mjs.map +0 -1
- package/dist/utils-DQoYnxpa.mjs.map +0 -1
- package/dist/utils-EsYRkPtf.js.map +0 -1
package/dist/parseMongoDB.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_utils = require("./utils-
|
|
3
|
-
const
|
|
4
|
-
const require_convertQuery = require("./convertQuery-
|
|
5
|
-
const require_prepareQueryObjects = require("./prepareQueryObjects-
|
|
2
|
+
const require_utils = require("./utils-CZRhzje-.js");
|
|
3
|
+
const require_objectUtils = require("./objectUtils-ButT0Mng.js");
|
|
4
|
+
const require_convertQuery = require("./convertQuery-J8LpTG-7.js");
|
|
5
|
+
const require_prepareQueryObjects = require("./prepareQueryObjects-DO3qXriW.js");
|
|
6
6
|
//#region src/utils/parseMongoDB/utils.ts
|
|
7
7
|
const getRegExStr = (re) => typeof re === "string" ? re : re.source;
|
|
8
8
|
const isPrimitive = (v) => typeof v === "string" || typeof v === "number" || typeof v === "boolean";
|
|
@@ -93,11 +93,11 @@ function parseMongoDB(mongoDbRules, options = {}) {
|
|
|
93
93
|
let field = "";
|
|
94
94
|
// istanbul ignore else
|
|
95
95
|
if (key === "$and") {
|
|
96
|
-
if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) =>
|
|
97
|
-
if (keyValue.length === 2 && keyValue.every((kv) =>
|
|
96
|
+
if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => require_objectUtils.isPojo(v))) return false;
|
|
97
|
+
if (keyValue.length === 2 && keyValue.every((kv) => require_objectUtils.objectKeys(kv).length === 1)) {
|
|
98
98
|
const [rule1, rule2] = keyValue;
|
|
99
|
-
const [ruleKey1, ruleKey2] = keyValue.map((kv) =>
|
|
100
|
-
if (ruleKey1 === ruleKey2 &&
|
|
99
|
+
const [ruleKey1, ruleKey2] = keyValue.map((kv) => require_objectUtils.objectKeys(kv)[0]);
|
|
100
|
+
if (ruleKey1 === ruleKey2 && require_objectUtils.isPojo(rule1[ruleKey1]) && require_objectUtils.objectKeys(rule1[ruleKey1]).length === 1 && require_objectUtils.isPojo(rule2[ruleKey2]) && require_objectUtils.objectKeys(rule2[ruleKey2]).length === 1 && ("$gte" in rule1[ruleKey1] && "$lte" in rule2[ruleKey2] && rule2[ruleKey2].$lte >= rule1[ruleKey1].$gte || "$lte" in rule1[ruleKey1] && "$gte" in rule2[ruleKey2] && rule1[ruleKey1].$lte >= rule2[ruleKey2].$gte)) {
|
|
101
101
|
const [val1, val2] = [rule1[ruleKey1].$gte ?? rule1[ruleKey1].$lte, rule2[ruleKey2].$lte ?? rule2[ruleKey2].$gte];
|
|
102
102
|
let value = listsAsArrays ? [val1, val2] : require_utils.joinWith([val1, val2], ",");
|
|
103
103
|
if (val1 > val2) value = listsAsArrays ? [val2, val1] : require_utils.joinWith([val2, val1], ",");
|
|
@@ -114,11 +114,11 @@ function parseMongoDB(mongoDbRules, options = {}) {
|
|
|
114
114
|
rules
|
|
115
115
|
} : false;
|
|
116
116
|
} else if (key === "$or") {
|
|
117
|
-
if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) =>
|
|
118
|
-
if (keyValue.length === 2 && keyValue.every((kv) =>
|
|
117
|
+
if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => require_objectUtils.isPojo(v))) return false;
|
|
118
|
+
if (keyValue.length === 2 && keyValue.every((kv) => require_objectUtils.objectKeys(kv).length === 1)) {
|
|
119
119
|
const [rule1, rule2] = keyValue;
|
|
120
|
-
const [ruleKey1, ruleKey2] = keyValue.map((kv) =>
|
|
121
|
-
if (ruleKey1 === ruleKey2 &&
|
|
120
|
+
const [ruleKey1, ruleKey2] = keyValue.map((kv) => require_objectUtils.objectKeys(kv)[0]);
|
|
121
|
+
if (ruleKey1 === ruleKey2 && require_objectUtils.isPojo(rule1[ruleKey1]) && require_objectUtils.objectKeys(rule1[ruleKey1]).length === 1 && require_objectUtils.isPojo(rule2[ruleKey2]) && require_objectUtils.objectKeys(rule2[ruleKey2]).length === 1 && ("$gt" in rule1[ruleKey1] && "$lt" in rule2[ruleKey2] && rule1[ruleKey1].$gt >= rule2[ruleKey2].$lt || "$lt" in rule1[ruleKey1] && "$gt" in rule2[ruleKey2] && rule2[ruleKey2].$gt >= rule1[ruleKey1].$lt)) {
|
|
122
122
|
const [val1, val2] = [rule1[ruleKey1].$gt ?? rule1[ruleKey1].$lt, rule2[ruleKey2].$lt ?? rule2[ruleKey2].$gt];
|
|
123
123
|
let value = listsAsArrays ? [val1, val2] : `${val1},${val2}`;
|
|
124
124
|
if (val1 > val2) value = listsAsArrays ? [val2, val1] : `${val2},${val1}`;
|
|
@@ -134,10 +134,10 @@ function parseMongoDB(mongoDbRules, options = {}) {
|
|
|
134
134
|
combinator: "or",
|
|
135
135
|
rules
|
|
136
136
|
} : false;
|
|
137
|
-
} else if (key === "$not" &&
|
|
137
|
+
} else if (key === "$not" && require_objectUtils.isPojo(keyValue)) {
|
|
138
138
|
const ruleOrGroup = processMongoDbQueryObject(keyValue);
|
|
139
139
|
if (ruleOrGroup) {
|
|
140
|
-
if (
|
|
140
|
+
if (require_objectUtils.isRuleGroupType(ruleOrGroup)) return ruleOrGroup.not ? {
|
|
141
141
|
combinator: "and",
|
|
142
142
|
rules: [ruleOrGroup],
|
|
143
143
|
not: true
|
|
@@ -156,7 +156,7 @@ function parseMongoDB(mongoDbRules, options = {}) {
|
|
|
156
156
|
}
|
|
157
157
|
return false;
|
|
158
158
|
} else if (key === "$expr") {
|
|
159
|
-
const op =
|
|
159
|
+
const op = require_objectUtils.objectKeys(keyValue)[0];
|
|
160
160
|
if (/^\$(eq|gte?|lte?|n?in)$/.test(op) && Array.isArray(keyValue[op]) && keyValue[op].length === 2 && typeof keyValue[op][0] === "string" && keyValue[op][0].startsWith("$")) {
|
|
161
161
|
field = keyValue[op][0].replace(/^\$/, "");
|
|
162
162
|
const val = keyValue[op][1];
|
|
@@ -187,7 +187,7 @@ function parseMongoDB(mongoDbRules, options = {}) {
|
|
|
187
187
|
operator: "null",
|
|
188
188
|
value: keyValue
|
|
189
189
|
};
|
|
190
|
-
} else if (
|
|
190
|
+
} else if (require_objectUtils.isPojo(keyValue)) {
|
|
191
191
|
let betweenRule = false;
|
|
192
192
|
let notRule = false;
|
|
193
193
|
const allOps = [
|
|
@@ -198,14 +198,14 @@ function parseMongoDB(mongoDbRules, options = {}) {
|
|
|
198
198
|
"n?in",
|
|
199
199
|
"regex",
|
|
200
200
|
"not",
|
|
201
|
-
...
|
|
201
|
+
...require_objectUtils.objectKeys(additionalOperators).map((o) => o.replace(/^\$/, ""))
|
|
202
202
|
];
|
|
203
203
|
const acceptedOpsRegExp = new RegExp(`^\\$(${allOps.join("|")})$`);
|
|
204
|
-
const operators =
|
|
204
|
+
const operators = require_objectUtils.objectKeys(keyValue).filter((o) => acceptedOpsRegExp.test(o)).sort();
|
|
205
205
|
if (operators.length === 0) return false;
|
|
206
|
-
if ("$not" in keyValue &&
|
|
206
|
+
if ("$not" in keyValue && require_objectUtils.isPojo(keyValue.$not)) {
|
|
207
207
|
const invertedNotRule = processMongoDbQueryObject({ [field]: keyValue.$not });
|
|
208
|
-
if (invertedNotRule) if (
|
|
208
|
+
if (invertedNotRule) if (require_objectUtils.isRuleGroupType(invertedNotRule)) notRule = {
|
|
209
209
|
...invertedNotRule,
|
|
210
210
|
not: true
|
|
211
211
|
};
|
|
@@ -237,7 +237,7 @@ function parseMongoDB(mongoDbRules, options = {}) {
|
|
|
237
237
|
return false;
|
|
238
238
|
}
|
|
239
239
|
function processMongoDbQueryObject(mongoDbQueryObject) {
|
|
240
|
-
const rules =
|
|
240
|
+
const rules = require_objectUtils.objectKeys(mongoDbQueryObject).map((k) => processMongoDbQueryObjectKey(k, mongoDbQueryObject[k])).filter(Boolean);
|
|
241
241
|
return rules.length === 1 ? rules[0] : rules.length > 1 ? {
|
|
242
242
|
combinator: "and",
|
|
243
243
|
rules
|
|
@@ -250,9 +250,9 @@ function parseMongoDB(mongoDbRules, options = {}) {
|
|
|
250
250
|
} catch {
|
|
251
251
|
return prepare(emptyRuleGroup);
|
|
252
252
|
}
|
|
253
|
-
if (!
|
|
253
|
+
if (!require_objectUtils.isPojo(mongoDbPOJO)) return prepare(emptyRuleGroup);
|
|
254
254
|
const result = processMongoDbQueryObject(mongoDbPOJO);
|
|
255
|
-
const finalQuery = result ?
|
|
255
|
+
const finalQuery = result ? require_objectUtils.isRuleGroupType(result) ? result : {
|
|
256
256
|
combinator: "and",
|
|
257
257
|
rules: [result]
|
|
258
258
|
} : emptyRuleGroup;
|
package/dist/parseMongoDB.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseMongoDB.js","names":["getFieldsArray","fieldIsValidUtil","joinWith","isPojo","objectKeys","isRuleGroupType","defaultOperatorNegationMap","prepareRuleGroup","convertToIC"],"sources":["../src/utils/parseMongoDB/utils.ts","../src/utils/parseMongoDB/parseMongoDB.ts"],"sourcesContent":["import type { DefaultOperatorName } from '../../types';\nimport type { MongoDbSupportedOperators } from './types';\n\nexport const getRegExStr = (re: string | RegExp): string =>\n typeof re === 'string' ? re : re.source;\n\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isPrimitive = (v: any): v is string | number | boolean =>\n typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean';\n\nexport const mongoDbToRqbOperatorMap: Partial<\n Record<MongoDbSupportedOperators, DefaultOperatorName>\n> = {\n $eq: '=',\n $ne: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n} satisfies Partial<Record<MongoDbSupportedOperators, DefaultOperatorName>>;\n","import type { Except } from 'type-fest';\nimport { defaultOperatorNegationMap } from '../../defaults';\nimport type {\n DefaultOperatorName,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n RuleGroupType,\n RuleType,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { convertToIC } from '../convertQuery';\nimport { isRuleGroupType } from '../isRuleGroup';\nimport { isPojo } from '../misc';\nimport { objectKeys } from '../objectUtils';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type { MongoDbSupportedOperators } from './types';\nimport { getRegExStr, isPrimitive, mongoDbToRqbOperatorMap } from './utils';\n\n/**\n * Options object for {@link parseMongoDB}.\n */\nexport interface ParseMongoDbOptions extends ParserCommonOptions {\n /**\n * When `true`, MongoDB rules in the form of `{ fieldName: { $not: { <...rule> } } }`\n * will be parsed into a rule group with the `not` attribute set to `true`. By default\n * (i.e., when this attribute is `false`), such \"`$not`\" rules will be parsed into a\n * rule with a negated operator.\n *\n * For example, with `preventOperatorNegation` set to `true`, a MongoDB rule like this...\n *\n * ```ts\n * { fieldName: { $not: { $eq: 1 } } }\n * ```\n *\n * ...would yield a rule group like this:\n *\n * ```ts\n * {\n * combinator: 'and',\n * not: true,\n * rules: [{ field: 'fieldName', operator: '=', value: 1 }]\n * }\n * ```\n *\n * By default, the same MongoDB rule would yield a rule like this:\n *\n * ```ts\n * { field: 'fieldName', operator: '!=', value: 1 }\n * // negated operator ^\n * ```\n *\n * @default false\n */\n preventOperatorNegation?: boolean;\n /**\n * Map of additional operators to their respective processing functions. Operators\n * must begin with `\"$\"`. Processing functions should return either a {@link index!RuleType RuleType}\n * or {@link index!RuleGroupType RuleGroupType}.\n *\n * (The functions should _not_ return {@link index!RuleGroupTypeIC RuleGroupTypeIC}, even if using independent\n * combinators. If the `independentCombinators` option is `true`, `parseMongoDB`\n * will convert the final query to {@link index!RuleGroupTypeIC RuleGroupTypeIC} before returning it.)\n *\n * @default {}\n */\n additionalOperators?: Record<\n `$${string}`,\n (\n field: string,\n operator: string,\n // oxlint-disable-next-line typescript/no-explicit-any\n value: any,\n options: ParserCommonOptions\n ) => RuleType | RuleGroupType\n >;\n}\n\nconst emptyRuleGroup: DefaultRuleGroupType = { combinator: 'and', rules: [] };\n\n/**\n * Converts a MongoDB query object or parseable string into a query suitable\n * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nfunction parseMongoDB(mongoDbRules: string | Record<string, any>): DefaultRuleGroupType;\n/**\n * Converts a MongoDB query object or parseable string into a query suitable\n * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseMongoDB(\n // oxlint-disable-next-line typescript/no-explicit-any\n mongoDbRules: string | Record<string, any>,\n options: Except<ParseMongoDbOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a MongoDB query object or parseable string into a query suitable\n * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseMongoDB(\n // oxlint-disable-next-line typescript/no-explicit-any\n mongoDbRules: string | Record<string, any>,\n options: Except<ParseMongoDbOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseMongoDB(\n // oxlint-disable-next-line typescript/no-explicit-any\n mongoDbRules: string | Record<string, any>,\n options: ParseMongoDbOptions = {}\n): DefaultRuleGroupTypeAny {\n const listsAsArrays = !!options.listsAsArrays;\n const fieldsFlat = getFieldsArray(options.fields);\n const getValueSources = options.getValueSources;\n const additionalOperators = options.additionalOperators ?? {};\n const preventOperatorNegation = !!options.preventOperatorNegation;\n const { additionalOperators: _ao, ...otherOptions } = options;\n\n const fieldIsValid = (\n fieldName: string,\n operator: DefaultOperatorName,\n subordinateFieldName?: string\n ) =>\n fieldIsValidUtil({\n fieldName,\n fieldsFlat,\n operator,\n subordinateFieldName,\n getValueSources,\n });\n\n function processMongoDbQueryBooleanOperator(\n field: string,\n mdbOperator: MongoDbSupportedOperators,\n // oxlint-disable-next-line typescript/no-explicit-any\n keyValue: any\n ): DefaultRuleType | false {\n let operator: DefaultOperatorName = '=';\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = '';\n\n // istanbul ignore else\n if (\n mdbOperator === '$eq' ||\n mdbOperator === '$ne' ||\n mdbOperator === '$gt' ||\n mdbOperator === '$gte' ||\n mdbOperator === '$lt' ||\n mdbOperator === '$lte'\n ) {\n if (mdbOperator === '$ne' && keyValue === null) {\n if (fieldIsValid(field, 'notNull')) {\n return { field, operator: 'notNull', value: null };\n }\n } else {\n operator = mongoDbToRqbOperatorMap[mdbOperator]!;\n if (fieldIsValid(field, operator)) {\n return { field, operator, value: keyValue };\n }\n }\n } else if (mdbOperator === '$regex' && /^[^$^]$|^[^^].*[^$]$/.test(getRegExStr(keyValue))) {\n if (fieldIsValid(field, 'contains')) {\n return {\n field,\n operator: 'contains',\n value: getRegExStr(keyValue),\n };\n }\n } else if (mdbOperator === '$regex' && /^\\^.*[^$]/.test(getRegExStr(keyValue))) {\n if (fieldIsValid(field, 'beginsWith')) {\n return {\n field,\n operator: 'beginsWith',\n value: getRegExStr(keyValue).replace(/^\\^/, ''),\n };\n }\n } else if (mdbOperator === '$regex' && /[^^].*\\$/.test(getRegExStr(keyValue))) {\n if (fieldIsValid(field, 'endsWith')) {\n return {\n field,\n operator: 'endsWith',\n value: getRegExStr(keyValue).replace(/\\$$/, ''),\n };\n }\n } else if (mdbOperator === '$in' && Array.isArray(keyValue)) {\n if (fieldIsValid(field, 'in')) {\n value = listsAsArrays\n ? keyValue\n : joinWith(\n keyValue.map(v => `${v}`),\n ','\n );\n return { field, operator: 'in', value };\n }\n } else if (mdbOperator === '$nin' && Array.isArray(keyValue) && fieldIsValid(field, 'notIn')) {\n value = listsAsArrays\n ? keyValue\n : joinWith(\n keyValue.map(v => `${v}`),\n ','\n );\n return { field, operator: 'notIn', value };\n }\n\n return false;\n }\n\n function processMongoDbQueryObjectKey(\n key: string,\n // oxlint-disable-next-line typescript/no-explicit-any\n keyValue: any\n ): DefaultRuleType | DefaultRuleGroupType | false {\n let field = '';\n\n // istanbul ignore else\n if (key === '$and') {\n if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every(v => isPojo(v))) {\n return false;\n }\n\n // Check if this should result in a \"between\" clause\n if (keyValue.length === 2 && keyValue.every(kv => objectKeys(kv).length === 1)) {\n const [rule1, rule2] = keyValue;\n const [ruleKey1, ruleKey2] = keyValue.map(kv => objectKeys(kv)[0]);\n if (\n ruleKey1 === ruleKey2 &&\n isPojo(rule1[ruleKey1]) &&\n objectKeys(rule1[ruleKey1]).length === 1 &&\n isPojo(rule2[ruleKey2]) &&\n objectKeys(rule2[ruleKey2]).length === 1 &&\n (('$gte' in rule1[ruleKey1] &&\n '$lte' in rule2[ruleKey2] &&\n rule2[ruleKey2].$lte >= rule1[ruleKey1].$gte) ||\n ('$lte' in rule1[ruleKey1] &&\n '$gte' in rule2[ruleKey2] &&\n rule1[ruleKey1].$lte >= rule2[ruleKey2].$gte))\n ) {\n const [val1, val2] = [\n rule1[ruleKey1].$gte ?? rule1[ruleKey1].$lte,\n rule2[ruleKey2].$lte ?? rule2[ruleKey2].$gte,\n ];\n let value = listsAsArrays ? [val1, val2] : joinWith([val1, val2], ',');\n if (val1 > val2) {\n value = listsAsArrays ? [val2, val1] : joinWith([val2, val1], ',');\n }\n return { field: ruleKey1, operator: 'between', value };\n }\n }\n\n const rules = keyValue.map(l => processMongoDbQueryObject(l)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[];\n\n return rules.length > 0 ? { combinator: 'and', rules } : false;\n } else if (key === '$or') {\n if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every(v => isPojo(v))) {\n return false;\n }\n\n // Check if this should result in \"notBetween\"\n if (keyValue.length === 2 && keyValue.every(kv => objectKeys(kv).length === 1)) {\n const [rule1, rule2] = keyValue;\n const [ruleKey1, ruleKey2] = keyValue.map(kv => objectKeys(kv)[0]);\n if (\n ruleKey1 === ruleKey2 &&\n isPojo(rule1[ruleKey1]) &&\n objectKeys(rule1[ruleKey1]).length === 1 &&\n isPojo(rule2[ruleKey2]) &&\n objectKeys(rule2[ruleKey2]).length === 1 &&\n (('$gt' in rule1[ruleKey1] &&\n '$lt' in rule2[ruleKey2] &&\n rule1[ruleKey1].$gt >= rule2[ruleKey2].$lt) ||\n ('$lt' in rule1[ruleKey1] &&\n '$gt' in rule2[ruleKey2] &&\n rule2[ruleKey2].$gt >= rule1[ruleKey1].$lt))\n ) {\n const [val1, val2] = [\n rule1[ruleKey1].$gt ?? rule1[ruleKey1].$lt,\n rule2[ruleKey2].$lt ?? rule2[ruleKey2].$gt,\n ];\n let value = listsAsArrays ? [val1, val2] : `${val1},${val2}`;\n if (val1 > val2) {\n value = listsAsArrays ? [val2, val1] : `${val2},${val1}`;\n }\n return { field: ruleKey1, operator: 'notBetween', value };\n }\n }\n\n const rules = keyValue.map(l => processMongoDbQueryObject(l)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[];\n\n return rules.length > 0 ? { combinator: 'or', rules } : false;\n } else if (key === '$not' && isPojo(keyValue)) {\n const ruleOrGroup = processMongoDbQueryObject(keyValue);\n if (ruleOrGroup) {\n if (isRuleGroupType(ruleOrGroup)) {\n return ruleOrGroup.not\n ? { combinator: 'and', rules: [ruleOrGroup], not: true }\n : { ...ruleOrGroup, not: true };\n }\n return preventOperatorNegation\n ? { combinator: 'and', rules: [ruleOrGroup], not: true }\n : { ...ruleOrGroup, operator: defaultOperatorNegationMap[ruleOrGroup.operator] };\n }\n return false;\n } else if (key === '$expr') {\n const op = objectKeys(keyValue)[0] as MongoDbSupportedOperators;\n if (\n /^\\$(eq|gte?|lte?|n?in)$/.test(op) &&\n Array.isArray(keyValue[op]) &&\n keyValue[op].length === 2 &&\n typeof keyValue[op][0] === 'string' &&\n keyValue[op][0].startsWith('$')\n ) {\n field = keyValue[op][0].replace(/^\\$/, '');\n const val = keyValue[op][1];\n if (\n (typeof val === 'string' && val.startsWith('$')) ||\n (Array.isArray(val) &&\n val.every(v => typeof v === 'string') &&\n val.every(v => v.startsWith('$')))\n ) {\n const valForProcessing = Array.isArray(val)\n ? val.map(v => v.replace(/^\\$/, ''))\n : val.replace(/^\\$/, '');\n const tempRule = processMongoDbQueryBooleanOperator(field, op, valForProcessing);\n if (tempRule) {\n if (\n typeof tempRule.value === 'string' &&\n !fieldIsValid(field, tempRule.operator, tempRule.value)\n ) {\n return false;\n }\n return { ...tempRule, valueSource: 'field' };\n }\n }\n return processMongoDbQueryBooleanOperator(field, op, keyValue[op][1]);\n }\n } else if (/^[^$]/.test(key)) {\n field = key;\n\n if (isPrimitive(keyValue)) {\n if (fieldIsValid(field, '=')) {\n return { field, operator: '=', value: keyValue };\n }\n } else if (keyValue === null) {\n if (fieldIsValid(field, 'null')) {\n return { field, operator: 'null', value: keyValue };\n }\n } else if (isPojo(keyValue)) {\n let betweenRule: DefaultRuleType | false = false;\n let notRule: DefaultRuleType | DefaultRuleGroupType | false = false;\n const additionalOpKeys = objectKeys(additionalOperators).map(o => o.replace(/^\\$/, ''));\n const allOps = ['eq', 'ne', 'gte?', 'lte?', 'n?in', 'regex', 'not', ...additionalOpKeys];\n const acceptedOpsRegExp = new RegExp(`^\\\\$(${allOps.join('|')})$`);\n\n const operators = objectKeys<Record<MongoDbSupportedOperators, unknown>>(keyValue)\n .filter(o => acceptedOpsRegExp.test(o))\n // oxlint-disable-next-line no-array-sort\n .sort();\n\n if (operators.length === 0) {\n return false;\n }\n\n if ('$not' in keyValue && isPojo(keyValue.$not)) {\n const invertedNotRule = processMongoDbQueryObject({ [field]: keyValue.$not });\n if (invertedNotRule) {\n if (isRuleGroupType(invertedNotRule)) {\n notRule = { ...invertedNotRule, not: true };\n } else {\n notRule = preventOperatorNegation\n ? { combinator: 'and', rules: [invertedNotRule], not: true }\n : {\n ...invertedNotRule,\n operator: defaultOperatorNegationMap[invertedNotRule.operator],\n };\n }\n }\n }\n\n if ('$gte' in keyValue && '$lte' in keyValue) {\n // This is (at least) a compact \"between\" clause\n betweenRule = {\n field,\n operator: 'between',\n value: listsAsArrays\n ? [keyValue.$gte, keyValue.$lte]\n : `${keyValue.$gte},${keyValue.$lte}`,\n };\n }\n\n const rules = operators\n // filter out $not\n .filter(op => !(notRule && op === '$not'))\n // filter out $gte and $lte if they were both present\n .filter(op => !(betweenRule && (op === '$gte' || op === '$lte')))\n .map(op =>\n op in additionalOperators && typeof additionalOperators[op] === 'function'\n ? additionalOperators[op](field, op, keyValue[op], otherOptions)\n : processMongoDbQueryBooleanOperator(field, op, keyValue[op])\n )\n .filter(Boolean) as (DefaultRuleGroupType | DefaultRuleType)[];\n\n if (notRule) {\n rules.unshift(notRule);\n }\n\n if (betweenRule) {\n rules.unshift(betweenRule);\n }\n\n if (rules.length === 0) {\n return false;\n }\n if (rules.length === 1) {\n return rules[0];\n }\n return { combinator: 'and', rules };\n }\n }\n\n return false;\n }\n\n function processMongoDbQueryObject(\n // oxlint-disable-next-line typescript/no-explicit-any\n mongoDbQueryObject: Record<string, any>\n ): DefaultRuleGroupType | DefaultRuleType | false {\n const rules = objectKeys(mongoDbQueryObject)\n .map(k => processMongoDbQueryObjectKey(k, mongoDbQueryObject[k]))\n .filter(Boolean) as DefaultRuleGroupType[];\n return rules.length === 1 ? rules[0] : rules.length > 1 ? { combinator: 'and', rules } : false;\n }\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let mongoDbPOJO = mongoDbRules;\n if (typeof mongoDbRules === 'string') {\n try {\n mongoDbPOJO = JSON.parse(mongoDbRules);\n } catch {\n return prepare(emptyRuleGroup);\n }\n }\n\n // Bail if the mongoDbPOJO is not actually a POJO\n if (!isPojo(mongoDbPOJO)) {\n return prepare(emptyRuleGroup);\n }\n\n const result = processMongoDbQueryObject(mongoDbPOJO);\n const finalQuery: DefaultRuleGroupType = result\n ? isRuleGroupType(result)\n ? result\n : { combinator: 'and', rules: [result] }\n : emptyRuleGroup;\n return prepare(\n options.independentCombinators ? convertToIC<DefaultRuleGroupTypeIC>(finalQuery) : finalQuery\n );\n}\n\nexport { parseMongoDB };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parseMongoDB.js","names":["getFieldsArray","fieldIsValidUtil","joinWith","isPojo","objectKeys","isRuleGroupType","defaultOperatorNegationMap","prepareRuleGroup","convertToIC"],"sources":["../src/utils/parseMongoDB/utils.ts","../src/utils/parseMongoDB/parseMongoDB.ts"],"sourcesContent":["import type { DefaultOperatorName } from '../../types';\nimport type { MongoDbSupportedOperators } from './types';\n\nexport const getRegExStr = (re: string | RegExp): string =>\n typeof re === 'string' ? re : re.source;\n\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isPrimitive = (v: any): v is string | number | boolean =>\n typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean';\n\nexport const mongoDbToRqbOperatorMap: Partial<\n Record<MongoDbSupportedOperators, DefaultOperatorName>\n> = {\n $eq: '=',\n $ne: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n} satisfies Partial<Record<MongoDbSupportedOperators, DefaultOperatorName>>;\n","import type { Except } from 'type-fest';\nimport { defaultOperatorNegationMap } from '../../defaults';\nimport type {\n DefaultOperatorName,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n RuleGroupType,\n RuleType,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { convertToIC } from '../convertQuery';\nimport { isRuleGroupType } from '../isRuleGroup';\nimport { isPojo } from '../misc';\nimport { objectKeys } from '../objectUtils';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type { MongoDbSupportedOperators } from './types';\nimport { getRegExStr, isPrimitive, mongoDbToRqbOperatorMap } from './utils';\n\n/**\n * Options object for {@link parseMongoDB}.\n */\nexport interface ParseMongoDbOptions extends ParserCommonOptions {\n /**\n * When `true`, MongoDB rules in the form of `{ fieldName: { $not: { <...rule> } } }`\n * will be parsed into a rule group with the `not` attribute set to `true`. By default\n * (i.e., when this attribute is `false`), such \"`$not`\" rules will be parsed into a\n * rule with a negated operator.\n *\n * For example, with `preventOperatorNegation` set to `true`, a MongoDB rule like this...\n *\n * ```ts\n * { fieldName: { $not: { $eq: 1 } } }\n * ```\n *\n * ...would yield a rule group like this:\n *\n * ```ts\n * {\n * combinator: 'and',\n * not: true,\n * rules: [{ field: 'fieldName', operator: '=', value: 1 }]\n * }\n * ```\n *\n * By default, the same MongoDB rule would yield a rule like this:\n *\n * ```ts\n * { field: 'fieldName', operator: '!=', value: 1 }\n * // negated operator ^\n * ```\n *\n * @default false\n */\n preventOperatorNegation?: boolean;\n /**\n * Map of additional operators to their respective processing functions. Operators\n * must begin with `\"$\"`. Processing functions should return either a {@link index!RuleType RuleType}\n * or {@link index!RuleGroupType RuleGroupType}.\n *\n * (The functions should _not_ return {@link index!RuleGroupTypeIC RuleGroupTypeIC}, even if using independent\n * combinators. If the `independentCombinators` option is `true`, `parseMongoDB`\n * will convert the final query to {@link index!RuleGroupTypeIC RuleGroupTypeIC} before returning it.)\n *\n * @default {}\n */\n additionalOperators?: Record<\n `$${string}`,\n (\n field: string,\n operator: string,\n // oxlint-disable-next-line typescript/no-explicit-any\n value: any,\n options: ParserCommonOptions\n ) => RuleType | RuleGroupType\n >;\n}\n\nconst emptyRuleGroup: DefaultRuleGroupType = { combinator: 'and', rules: [] };\n\n/**\n * Converts a MongoDB query object or parseable string into a query suitable\n * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nfunction parseMongoDB(mongoDbRules: string | Record<string, any>): DefaultRuleGroupType;\n/**\n * Converts a MongoDB query object or parseable string into a query suitable\n * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseMongoDB(\n // oxlint-disable-next-line typescript/no-explicit-any\n mongoDbRules: string | Record<string, any>,\n options: Except<ParseMongoDbOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a MongoDB query object or parseable string into a query suitable\n * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseMongoDB(\n // oxlint-disable-next-line typescript/no-explicit-any\n mongoDbRules: string | Record<string, any>,\n options: Except<ParseMongoDbOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseMongoDB(\n // oxlint-disable-next-line typescript/no-explicit-any\n mongoDbRules: string | Record<string, any>,\n options: ParseMongoDbOptions = {}\n): DefaultRuleGroupTypeAny {\n const listsAsArrays = !!options.listsAsArrays;\n const fieldsFlat = getFieldsArray(options.fields);\n const getValueSources = options.getValueSources;\n const additionalOperators = options.additionalOperators ?? {};\n const preventOperatorNegation = !!options.preventOperatorNegation;\n const { additionalOperators: _ao, ...otherOptions } = options;\n\n const fieldIsValid = (\n fieldName: string,\n operator: DefaultOperatorName,\n subordinateFieldName?: string\n ) =>\n fieldIsValidUtil({\n fieldName,\n fieldsFlat,\n operator,\n subordinateFieldName,\n getValueSources,\n });\n\n function processMongoDbQueryBooleanOperator(\n field: string,\n mdbOperator: MongoDbSupportedOperators,\n // oxlint-disable-next-line typescript/no-explicit-any\n keyValue: any\n ): DefaultRuleType | false {\n let operator: DefaultOperatorName = '=';\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = '';\n\n // istanbul ignore else\n if (\n mdbOperator === '$eq' ||\n mdbOperator === '$ne' ||\n mdbOperator === '$gt' ||\n mdbOperator === '$gte' ||\n mdbOperator === '$lt' ||\n mdbOperator === '$lte'\n ) {\n if (mdbOperator === '$ne' && keyValue === null) {\n if (fieldIsValid(field, 'notNull')) {\n return { field, operator: 'notNull', value: null };\n }\n } else {\n operator = mongoDbToRqbOperatorMap[mdbOperator]!;\n if (fieldIsValid(field, operator)) {\n return { field, operator, value: keyValue };\n }\n }\n } else if (mdbOperator === '$regex' && /^[^$^]$|^[^^].*[^$]$/.test(getRegExStr(keyValue))) {\n if (fieldIsValid(field, 'contains')) {\n return {\n field,\n operator: 'contains',\n value: getRegExStr(keyValue),\n };\n }\n } else if (mdbOperator === '$regex' && /^\\^.*[^$]/.test(getRegExStr(keyValue))) {\n if (fieldIsValid(field, 'beginsWith')) {\n return {\n field,\n operator: 'beginsWith',\n value: getRegExStr(keyValue).replace(/^\\^/, ''),\n };\n }\n } else if (mdbOperator === '$regex' && /[^^].*\\$/.test(getRegExStr(keyValue))) {\n if (fieldIsValid(field, 'endsWith')) {\n return {\n field,\n operator: 'endsWith',\n value: getRegExStr(keyValue).replace(/\\$$/, ''),\n };\n }\n } else if (mdbOperator === '$in' && Array.isArray(keyValue)) {\n if (fieldIsValid(field, 'in')) {\n value = listsAsArrays\n ? keyValue\n : joinWith(\n keyValue.map(v => `${v}`),\n ','\n );\n return { field, operator: 'in', value };\n }\n } else if (mdbOperator === '$nin' && Array.isArray(keyValue) && fieldIsValid(field, 'notIn')) {\n value = listsAsArrays\n ? keyValue\n : joinWith(\n keyValue.map(v => `${v}`),\n ','\n );\n return { field, operator: 'notIn', value };\n }\n\n return false;\n }\n\n function processMongoDbQueryObjectKey(\n key: string,\n // oxlint-disable-next-line typescript/no-explicit-any\n keyValue: any\n ): DefaultRuleType | DefaultRuleGroupType | false {\n let field = '';\n\n // istanbul ignore else\n if (key === '$and') {\n if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every(v => isPojo(v))) {\n return false;\n }\n\n // Check if this should result in a \"between\" clause\n if (keyValue.length === 2 && keyValue.every(kv => objectKeys(kv).length === 1)) {\n const [rule1, rule2] = keyValue;\n const [ruleKey1, ruleKey2] = keyValue.map(kv => objectKeys(kv)[0]);\n if (\n ruleKey1 === ruleKey2 &&\n isPojo(rule1[ruleKey1]) &&\n objectKeys(rule1[ruleKey1]).length === 1 &&\n isPojo(rule2[ruleKey2]) &&\n objectKeys(rule2[ruleKey2]).length === 1 &&\n (('$gte' in rule1[ruleKey1] &&\n '$lte' in rule2[ruleKey2] &&\n rule2[ruleKey2].$lte >= rule1[ruleKey1].$gte) ||\n ('$lte' in rule1[ruleKey1] &&\n '$gte' in rule2[ruleKey2] &&\n rule1[ruleKey1].$lte >= rule2[ruleKey2].$gte))\n ) {\n const [val1, val2] = [\n rule1[ruleKey1].$gte ?? rule1[ruleKey1].$lte,\n rule2[ruleKey2].$lte ?? rule2[ruleKey2].$gte,\n ];\n let value = listsAsArrays ? [val1, val2] : joinWith([val1, val2], ',');\n if (val1 > val2) {\n value = listsAsArrays ? [val2, val1] : joinWith([val2, val1], ',');\n }\n return { field: ruleKey1, operator: 'between', value };\n }\n }\n\n const rules = keyValue.map(l => processMongoDbQueryObject(l)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[];\n\n return rules.length > 0 ? { combinator: 'and', rules } : false;\n } else if (key === '$or') {\n if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every(v => isPojo(v))) {\n return false;\n }\n\n // Check if this should result in \"notBetween\"\n if (keyValue.length === 2 && keyValue.every(kv => objectKeys(kv).length === 1)) {\n const [rule1, rule2] = keyValue;\n const [ruleKey1, ruleKey2] = keyValue.map(kv => objectKeys(kv)[0]);\n if (\n ruleKey1 === ruleKey2 &&\n isPojo(rule1[ruleKey1]) &&\n objectKeys(rule1[ruleKey1]).length === 1 &&\n isPojo(rule2[ruleKey2]) &&\n objectKeys(rule2[ruleKey2]).length === 1 &&\n (('$gt' in rule1[ruleKey1] &&\n '$lt' in rule2[ruleKey2] &&\n rule1[ruleKey1].$gt >= rule2[ruleKey2].$lt) ||\n ('$lt' in rule1[ruleKey1] &&\n '$gt' in rule2[ruleKey2] &&\n rule2[ruleKey2].$gt >= rule1[ruleKey1].$lt))\n ) {\n const [val1, val2] = [\n rule1[ruleKey1].$gt ?? rule1[ruleKey1].$lt,\n rule2[ruleKey2].$lt ?? rule2[ruleKey2].$gt,\n ];\n let value = listsAsArrays ? [val1, val2] : `${val1},${val2}`;\n if (val1 > val2) {\n value = listsAsArrays ? [val2, val1] : `${val2},${val1}`;\n }\n return { field: ruleKey1, operator: 'notBetween', value };\n }\n }\n\n const rules = keyValue.map(l => processMongoDbQueryObject(l)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[];\n\n return rules.length > 0 ? { combinator: 'or', rules } : false;\n } else if (key === '$not' && isPojo(keyValue)) {\n const ruleOrGroup = processMongoDbQueryObject(keyValue);\n if (ruleOrGroup) {\n if (isRuleGroupType(ruleOrGroup)) {\n return ruleOrGroup.not\n ? { combinator: 'and', rules: [ruleOrGroup], not: true }\n : { ...ruleOrGroup, not: true };\n }\n return preventOperatorNegation\n ? { combinator: 'and', rules: [ruleOrGroup], not: true }\n : { ...ruleOrGroup, operator: defaultOperatorNegationMap[ruleOrGroup.operator] };\n }\n return false;\n } else if (key === '$expr') {\n const op = objectKeys(keyValue)[0] as MongoDbSupportedOperators;\n if (\n /^\\$(eq|gte?|lte?|n?in)$/.test(op) &&\n Array.isArray(keyValue[op]) &&\n keyValue[op].length === 2 &&\n typeof keyValue[op][0] === 'string' &&\n keyValue[op][0].startsWith('$')\n ) {\n field = keyValue[op][0].replace(/^\\$/, '');\n const val = keyValue[op][1];\n if (\n (typeof val === 'string' && val.startsWith('$')) ||\n (Array.isArray(val) &&\n val.every(v => typeof v === 'string') &&\n val.every(v => v.startsWith('$')))\n ) {\n const valForProcessing = Array.isArray(val)\n ? val.map(v => v.replace(/^\\$/, ''))\n : val.replace(/^\\$/, '');\n const tempRule = processMongoDbQueryBooleanOperator(field, op, valForProcessing);\n if (tempRule) {\n if (\n typeof tempRule.value === 'string' &&\n !fieldIsValid(field, tempRule.operator, tempRule.value)\n ) {\n return false;\n }\n return { ...tempRule, valueSource: 'field' };\n }\n }\n return processMongoDbQueryBooleanOperator(field, op, keyValue[op][1]);\n }\n } else if (/^[^$]/.test(key)) {\n field = key;\n\n if (isPrimitive(keyValue)) {\n if (fieldIsValid(field, '=')) {\n return { field, operator: '=', value: keyValue };\n }\n } else if (keyValue === null) {\n if (fieldIsValid(field, 'null')) {\n return { field, operator: 'null', value: keyValue };\n }\n } else if (isPojo(keyValue)) {\n let betweenRule: DefaultRuleType | false = false;\n let notRule: DefaultRuleType | DefaultRuleGroupType | false = false;\n const additionalOpKeys = objectKeys(additionalOperators).map(o => o.replace(/^\\$/, ''));\n const allOps = ['eq', 'ne', 'gte?', 'lte?', 'n?in', 'regex', 'not', ...additionalOpKeys];\n const acceptedOpsRegExp = new RegExp(`^\\\\$(${allOps.join('|')})$`);\n\n const operators = objectKeys<Record<MongoDbSupportedOperators, unknown>>(keyValue)\n .filter(o => acceptedOpsRegExp.test(o))\n // oxlint-disable-next-line no-array-sort\n .sort();\n\n if (operators.length === 0) {\n return false;\n }\n\n if ('$not' in keyValue && isPojo(keyValue.$not)) {\n const invertedNotRule = processMongoDbQueryObject({ [field]: keyValue.$not });\n if (invertedNotRule) {\n if (isRuleGroupType(invertedNotRule)) {\n notRule = { ...invertedNotRule, not: true };\n } else {\n notRule = preventOperatorNegation\n ? { combinator: 'and', rules: [invertedNotRule], not: true }\n : {\n ...invertedNotRule,\n operator: defaultOperatorNegationMap[invertedNotRule.operator],\n };\n }\n }\n }\n\n if ('$gte' in keyValue && '$lte' in keyValue) {\n // This is (at least) a compact \"between\" clause\n betweenRule = {\n field,\n operator: 'between',\n value: listsAsArrays\n ? [keyValue.$gte, keyValue.$lte]\n : `${keyValue.$gte},${keyValue.$lte}`,\n };\n }\n\n const rules = operators\n // filter out $not\n .filter(op => !(notRule && op === '$not'))\n // filter out $gte and $lte if they were both present\n .filter(op => !(betweenRule && (op === '$gte' || op === '$lte')))\n .map(op =>\n op in additionalOperators && typeof additionalOperators[op] === 'function'\n ? additionalOperators[op](field, op, keyValue[op], otherOptions)\n : processMongoDbQueryBooleanOperator(field, op, keyValue[op])\n )\n .filter(Boolean) as (DefaultRuleGroupType | DefaultRuleType)[];\n\n if (notRule) {\n rules.unshift(notRule);\n }\n\n if (betweenRule) {\n rules.unshift(betweenRule);\n }\n\n if (rules.length === 0) {\n return false;\n }\n if (rules.length === 1) {\n return rules[0];\n }\n return { combinator: 'and', rules };\n }\n }\n\n return false;\n }\n\n function processMongoDbQueryObject(\n // oxlint-disable-next-line typescript/no-explicit-any\n mongoDbQueryObject: Record<string, any>\n ): DefaultRuleGroupType | DefaultRuleType | false {\n const rules = objectKeys(mongoDbQueryObject)\n .map(k => processMongoDbQueryObjectKey(k, mongoDbQueryObject[k]))\n .filter(Boolean) as DefaultRuleGroupType[];\n return rules.length === 1 ? rules[0] : rules.length > 1 ? { combinator: 'and', rules } : false;\n }\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let mongoDbPOJO = mongoDbRules;\n if (typeof mongoDbRules === 'string') {\n try {\n mongoDbPOJO = JSON.parse(mongoDbRules);\n } catch {\n return prepare(emptyRuleGroup);\n }\n }\n\n // Bail if the mongoDbPOJO is not actually a POJO\n if (!isPojo(mongoDbPOJO)) {\n return prepare(emptyRuleGroup);\n }\n\n const result = processMongoDbQueryObject(mongoDbPOJO);\n const finalQuery: DefaultRuleGroupType = result\n ? isRuleGroupType(result)\n ? result\n : { combinator: 'and', rules: [result] }\n : emptyRuleGroup;\n return prepare(\n options.independentCombinators ? convertToIC<DefaultRuleGroupTypeIC>(finalQuery) : finalQuery\n );\n}\n\nexport { parseMongoDB };\n"],"mappings":"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"}
|
package/dist/parseMongoDB.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { i as
|
|
3
|
-
import { n as convertToIC } from "./convertQuery-
|
|
4
|
-
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-
|
|
1
|
+
import { E as joinWith, k as defaultOperatorNegationMap } from "./utils-BlMGIhvx.mjs";
|
|
2
|
+
import { i as isRuleGroupType, n as objectKeys, o as isPojo } from "./objectUtils-C0WB-8ex.mjs";
|
|
3
|
+
import { n as convertToIC } from "./convertQuery-CeJSNn37.mjs";
|
|
4
|
+
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-BfMlS4ql.mjs";
|
|
5
5
|
//#region src/utils/parseMongoDB/utils.ts
|
|
6
6
|
const getRegExStr = (re) => typeof re === "string" ? re : re.source;
|
|
7
7
|
const isPrimitive = (v) => typeof v === "string" || typeof v === "number" || typeof v === "boolean";
|
package/dist/parseSQL.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_utils = require("./utils-
|
|
3
|
-
const
|
|
4
|
-
const require_prepareQueryObjects = require("./prepareQueryObjects-
|
|
2
|
+
const require_utils = require("./utils-CZRhzje-.js");
|
|
3
|
+
const require_objectUtils = require("./objectUtils-ButT0Mng.js");
|
|
4
|
+
const require_prepareQueryObjects = require("./prepareQueryObjects-DO3qXriW.js");
|
|
5
5
|
require("./parseJSONata.js");
|
|
6
6
|
let _ts_jison_parser = require("@ts-jison/parser");
|
|
7
7
|
let _ts_jison_lexer = require("@ts-jison/lexer");
|
|
@@ -5903,7 +5903,7 @@ const getFieldName = (f) => {
|
|
|
5903
5903
|
else if (fieldName.startsWith("[") && fieldName.endsWith("]")) return fieldName.replaceAll(/(^\[|]$)/g, "").replaceAll("]]", "]");
|
|
5904
5904
|
return fieldName;
|
|
5905
5905
|
};
|
|
5906
|
-
const normalizeCombinator = (c) =>
|
|
5906
|
+
const normalizeCombinator = (c) => require_objectUtils.lc(c.replace("&&", "and").replace("||", "or"));
|
|
5907
5907
|
const normalizeOperator = (op, flip) => {
|
|
5908
5908
|
if (flip) {
|
|
5909
5909
|
if (op === "<") return ">";
|
|
@@ -5919,7 +5919,7 @@ const evalSQLLiteralValue = (valueObj, { bigIntOnOverflow } = {}) => {
|
|
|
5919
5919
|
const valueString = valueObj.value;
|
|
5920
5920
|
if (valueString.startsWith(`'`) && valueString.endsWith(`'`) || valueString.startsWith(`"`) && valueString.endsWith(`"`)) return valueString.slice(1, -1).replaceAll(/''/gm, "'");
|
|
5921
5921
|
return valueString;
|
|
5922
|
-
} else if (valueObj.type === "Boolean") return
|
|
5922
|
+
} else if (valueObj.type === "Boolean") return require_objectUtils.lc(valueObj.value) === "true";
|
|
5923
5923
|
else if (isSQLSignedNumber(valueObj)) return require_utils.parseNumber(`${valueObj.prefix}${valueObj.value.value}`, {
|
|
5924
5924
|
parseNumbers: true,
|
|
5925
5925
|
bigIntOnOverflow
|
|
@@ -6058,7 +6058,7 @@ function parseSQL(sql, options = {}) {
|
|
|
6058
6058
|
case "NotExpression": {
|
|
6059
6059
|
const rule = processSQLExpression(expr.value.type === "SimpleExprParentheses" ? expr.value.value.value[0] : expr.value);
|
|
6060
6060
|
if (rule) {
|
|
6061
|
-
if (
|
|
6061
|
+
if (require_objectUtils.isRuleGroup(rule)) return {
|
|
6062
6062
|
...rule,
|
|
6063
6063
|
not: true
|
|
6064
6064
|
};
|
|
@@ -6259,7 +6259,7 @@ function parseSQL(sql, options = {}) {
|
|
|
6259
6259
|
if (where) {
|
|
6260
6260
|
const result = processSQLExpression(where);
|
|
6261
6261
|
if (result) {
|
|
6262
|
-
if (
|
|
6262
|
+
if (require_objectUtils.isRuleGroup(result)) return prepare(result);
|
|
6263
6263
|
return prepare({
|
|
6264
6264
|
rules: [result],
|
|
6265
6265
|
...ic ? {} : { combinator: "and" }
|
package/dist/parseSQL.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-
|
|
1
|
+
import { E as joinWith, T as parseNumber } from "./utils-BlMGIhvx.mjs";
|
|
2
|
+
import { r as isRuleGroup, s as lc } from "./objectUtils-C0WB-8ex.mjs";
|
|
3
|
+
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-BfMlS4ql.mjs";
|
|
4
4
|
import { JisonParser } from "@ts-jison/parser";
|
|
5
5
|
import { JisonLexer } from "@ts-jison/lexer";
|
|
6
6
|
//#region src/utils/parseSQL/sqlParser.ts
|
package/dist/parseSpEL.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_utils = require("./utils-
|
|
3
|
-
const
|
|
4
|
-
const require_prepareQueryObjects = require("./prepareQueryObjects-
|
|
2
|
+
const require_utils = require("./utils-CZRhzje-.js");
|
|
3
|
+
const require_objectUtils = require("./objectUtils-ButT0Mng.js");
|
|
4
|
+
const require_prepareQueryObjects = require("./prepareQueryObjects-DO3qXriW.js");
|
|
5
5
|
require("./parseJSONata.js");
|
|
6
6
|
let spel2js = require("spel2js");
|
|
7
7
|
//#region src/utils/parseSpEL/utils.ts
|
|
@@ -118,7 +118,7 @@ function parseSpEL(spel, options = {}) {
|
|
|
118
118
|
const negatedExpr = parseProcessedSpEL(expr.children[0]);
|
|
119
119
|
// istanbul ignore else
|
|
120
120
|
if (negatedExpr) {
|
|
121
|
-
if (!
|
|
121
|
+
if (!require_objectUtils.isRuleGroup(negatedExpr) && (negatedExpr.operator === "contains" || negatedExpr.operator === "beginsWith" || negatedExpr.operator === "endsWith")) return {
|
|
122
122
|
...negatedExpr,
|
|
123
123
|
operator: `doesNot${negatedExpr.operator[0].toUpperCase()}${negatedExpr.operator.slice(1).replace("s", "")}`
|
|
124
124
|
};
|
|
@@ -257,7 +257,7 @@ function parseSpEL(spel, options = {}) {
|
|
|
257
257
|
}
|
|
258
258
|
const result = parseProcessedSpEL(processCompiledExpression(compiledSpEL));
|
|
259
259
|
if (result) {
|
|
260
|
-
if (
|
|
260
|
+
if (require_objectUtils.isRuleGroup(result)) return prepare(result);
|
|
261
261
|
return prepare({
|
|
262
262
|
rules: [result],
|
|
263
263
|
...ic ? {} : { combinator: "and" }
|
package/dist/parseSpEL.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-
|
|
1
|
+
import { E as joinWith } from "./utils-BlMGIhvx.mjs";
|
|
2
|
+
import { r as isRuleGroup } from "./objectUtils-C0WB-8ex.mjs";
|
|
3
|
+
import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-BfMlS4ql.mjs";
|
|
4
4
|
import { SpelExpressionEvaluator } from "spel2js";
|
|
5
5
|
//#region src/utils/parseSpEL/utils.ts
|
|
6
6
|
const isSpELPropertyNode = (expr) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as toFullOption, S as toFlatOptionArray, b as isFlexibleOptionArray, g as processMatchMode, w as toFullOptionList, x as isFlexibleOptionGroupArray } from "./utils-
|
|
2
|
-
import {
|
|
1
|
+
import { C as toFullOption, S as toFlatOptionArray, b as isFlexibleOptionArray, g as processMatchMode, w as toFullOptionList, x as isFlexibleOptionGroupArray } from "./utils-BlMGIhvx.mjs";
|
|
2
|
+
import { r as isRuleGroup, s as lc } from "./objectUtils-C0WB-8ex.mjs";
|
|
3
3
|
//#region src/utils/filterFieldsByComparator.ts
|
|
4
4
|
const filterByComparator = (field, operator, fieldToCompare) => {
|
|
5
5
|
const fullField = toFullOption(field);
|
|
@@ -164,4 +164,4 @@ const prepareRuleGroup = (queryObject, { idGenerator = generateID } = {}) => {
|
|
|
164
164
|
//#endregion
|
|
165
165
|
export { fieldIsValidUtil as n, getFieldsArray as r, prepareRuleGroup as t };
|
|
166
166
|
|
|
167
|
-
//# sourceMappingURL=prepareQueryObjects-
|
|
167
|
+
//# sourceMappingURL=prepareQueryObjects-BfMlS4ql.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareQueryObjects-tMukQHT9.mjs","names":[],"sources":["../src/utils/filterFieldsByComparator.ts","../src/utils/getValueSourcesUtil.ts","../src/utils/parserUtils.ts","../src/utils/generateID.ts","../src/utils/prepareQueryObjects.ts"],"sourcesContent":["import type { FullField, OptionList, WithUnknownIndex } from '../types';\nimport { isFlexibleOptionGroupArray, toFullOption } from './optGroupUtils';\n\nconst filterByComparator = (field: FullField, operator: string, fieldToCompare: FullField) => {\n const fullField = toFullOption(field);\n const fullFieldToCompare = toFullOption(fieldToCompare);\n if (fullField.value === fullFieldToCompare.value) {\n return false;\n }\n if (typeof fullField.comparator === 'string') {\n return fullField[fullField.comparator] === fullFieldToCompare[fullField.comparator];\n }\n return fullField.comparator?.(fullFieldToCompare, operator) ?? /* istanbul ignore next */ false;\n};\n\n/**\n * For a given {@link FullField}, returns the `fields` list filtered for\n * other fields that match by `comparator`. Only fields *other than the\n * one in question* will ever be included, even if `comparator` is `null`\n * or `undefined`. If `comparator` is a string, fields with the same value\n * for that property will be included. If `comparator` is a function, each\n * field will be passed to the function along with the `operator` and fields\n * for which the function returns `true` will be included.\n *\n * @group Option Lists\n */\nexport const filterFieldsByComparator = (\n /** The field in question. */\n field: FullField,\n /** The full {@link FullField} list to be filtered. */\n fields: OptionList<FullField>,\n operator: string\n):\n | FullField[]\n | {\n options: WithUnknownIndex<FullField>[];\n label: string;\n }[] => {\n if (!field.comparator) {\n const filterOutSameField = (f: FullField) =>\n (f.value ?? /* istanbul ignore next */ f.name) !==\n (field.value ?? /* istanbul ignore next */ field.name);\n if (isFlexibleOptionGroupArray(fields)) {\n return fields.map(og => ({\n ...og,\n options: og.options.filter(v => filterOutSameField(v)),\n }));\n }\n return fields.filter(v => filterOutSameField(v));\n }\n\n if (isFlexibleOptionGroupArray(fields)) {\n return fields\n .map(og => ({\n ...og,\n options: og.options.filter(f => filterByComparator(field, operator, f)),\n }))\n .filter(og => og.options.length > 0);\n }\n\n return fields.filter(f => filterByComparator(field, operator, f));\n};\n","import type {\n FullField,\n GetOptionIdentifierType,\n ValueSourceFlexibleOptions,\n ValueSourceFullOptions,\n ValueSources,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst defaultValueSourcesArray: ValueSourceFullOptions = [\n { name: 'value', value: 'value', label: 'value' },\n];\n\nconst dummyFD = {\n name: 'name',\n value: 'name',\n valueSources: null,\n label: 'label',\n};\n\n/**\n * Utility function to get the value sources array for the given\n * field and operator. If the field definition does not define a\n * `valueSources` property, the `getValueSources` prop is used.\n * Returns `[FullOption<\"value\">]` by default.\n */\nexport const getValueSourcesUtil = <F extends FullField, O extends string>(\n fieldData: F,\n operator: string,\n getValueSources?: (\n field: GetOptionIdentifierType<F>,\n operator: O,\n misc: { fieldData: F }\n ) => ValueSources | ValueSourceFlexibleOptions\n): ValueSourceFullOptions => {\n // TypeScript doesn't allow it directly, but in practice\n // `fieldData` can end up being undefined or null. The nullish\n // coalescing assignment below avoids errors like\n // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n const fd = fieldData ? toFullOption(fieldData) : dummyFD;\n\n let valueSourcesNEW:\n | false\n | ValueSources\n | ValueSourceFlexibleOptions\n | ((operator: string) => ValueSources | ValueSourceFlexibleOptions) = fd.valueSources ?? false;\n\n if (typeof valueSourcesNEW === 'function') {\n valueSourcesNEW = valueSourcesNEW(operator as O);\n }\n\n if (!valueSourcesNEW && getValueSources) {\n valueSourcesNEW = getValueSources(fd.value as GetOptionIdentifierType<F>, operator as O, {\n fieldData: fd as F,\n });\n }\n\n if (!valueSourcesNEW) {\n return defaultValueSourcesArray;\n }\n\n if (isFlexibleOptionArray(valueSourcesNEW)) {\n return toFullOptionList(valueSourcesNEW as ValueSourceFullOptions) as ValueSourceFullOptions;\n }\n\n return valueSourcesNEW.map(\n vs =>\n defaultValueSourcesArray.find(dmm => dmm.value === lc(vs)) ?? {\n name: vs,\n value: vs,\n label: vs,\n }\n ) as ValueSourceFullOptions;\n};\n","import type {\n DefaultOperatorName,\n FullField,\n FullOption,\n OptionList,\n ValueSource,\n ValueSourceFlexibleOptions,\n ValueSources,\n} from '../types';\nimport { filterFieldsByComparator } from './filterFieldsByComparator';\nimport { getValueSourcesUtil } from './getValueSourcesUtil';\nimport { isFlexibleOptionArray, toFlatOptionArray, toFullOption } from './optGroupUtils';\n\nexport const getFieldsArray = (\n fields?: OptionList<FullField> | Record<string, FullField>\n): FullOption[] => {\n const fieldsArray = fields\n ? Array.isArray(fields)\n ? fields\n : Object.keys(fields)\n .map(fld => Object.assign({}, fields[fld], { name: fld }))\n // oxlint-disable-next-line no-array-sort\n .sort((a, b) => a.label.localeCompare(b.label))\n : [];\n return toFlatOptionArray(fieldsArray);\n};\n\nexport function fieldIsValidUtil(params: {\n fieldsFlat: FullField[];\n getValueSources?: (field: string, operator: string) => ValueSources | ValueSourceFlexibleOptions;\n fieldName: string;\n operator: DefaultOperatorName;\n subordinateFieldName?: string;\n}): boolean {\n const { fieldsFlat, fieldName, operator, subordinateFieldName, getValueSources } = params;\n\n const vsIncludes = (vs: ValueSource) => {\n const vss = getValueSourcesUtil(primaryField, operator, getValueSources);\n return isFlexibleOptionArray(vss) && vss.some(vso => vso.value === vs || vso.name === vs);\n };\n\n // If fields option was an empty array or undefined, then all identifiers\n // are considered valid.\n if (fieldsFlat.length === 0) return true;\n\n let valid = false;\n\n const primaryField = toFullOption(fieldsFlat.find(ff => ff.name === fieldName)!);\n if (primaryField) {\n valid = !(\n !subordinateFieldName &&\n operator !== 'notNull' &&\n operator !== 'null' &&\n !vsIncludes('value')\n );\n\n if (valid && !!subordinateFieldName) {\n if (vsIncludes('field') && fieldName !== subordinateFieldName) {\n const validSubordinateFields = filterFieldsByComparator(\n primaryField,\n fieldsFlat,\n operator\n ) as FullField[];\n if (!validSubordinateFields.some(vsf => vsf.name === subordinateFieldName)) {\n valid = false;\n }\n } else {\n valid = false;\n }\n }\n }\n\n return valid;\n}\n","// import type { UUID } from 'node:crypto';\ntype UUID = `${string}-${string}-${string}-${string}-${string}`;\n\nconst cryptoModule = globalThis.crypto;\n\n/**\n * Default `id` generator. Generates a valid v4 UUID. Uses `crypto.randomUUID()`\n * when available, otherwise uses an alternate method based on `getRandomValues`.\n * The returned string is guaranteed to match this regex:\n * ```\n * /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i\n * ```\n * @returns Valid v4 UUID\n */\n// Default implementation adapted from https://stackoverflow.com/a/68141099/217579\n// istanbul ignore next\nexport let generateID = (): UUID =>\n '00-0-4-2-000'.replaceAll(/[^-]/g, s =>\n (((Math.random() + Math.trunc(s as unknown as number)) * 0x1_00_00) >> Number.parseInt(s))\n .toString(16)\n .padStart(4, '0')\n ) as UUID;\n\n// Improve on the default implementation by using the crypto package if it's available\n// istanbul ignore else\nif (cryptoModule) {\n // istanbul ignore else\n if (typeof cryptoModule.randomUUID === 'function') {\n generateID = () => cryptoModule.randomUUID();\n } else if (typeof cryptoModule.getRandomValues === 'function') {\n // `randomUUID` is much simpler and faster, but it's only guaranteed to be\n // available in secure contexts (server-side, https, etc.). `generateID`\n // doesn't really need to be cryptographically secure, it only needs a\n // fairly low chance of collisions. We fall back to the always-available\n // `getRandomValues` here (while still generating a valid v4 UUID) when\n // `randomUUID` is not available.\n const position19vals = '89ab';\n const container = new Uint32Array(32);\n\n generateID = () => {\n cryptoModule.getRandomValues(container);\n let id = (container[0] % 16).toString(16);\n for (let i = 1; i < 32; i++) {\n if (i === 12) {\n id = `${id}${'4'}`;\n } else if (i === 16) {\n id = `${id}${position19vals[container[17] % 4]}`;\n } else {\n id = `${id}${(container[i] % 16).toString(16)}`;\n }\n\n if (i === 7 || i === 11 || i === 15 || i === 19) {\n id = `${id}${'-'}`;\n }\n }\n return id as UUID;\n };\n }\n}\n","import type {\n RuleGroupArray,\n RuleGroupICArray,\n RuleGroupType,\n RuleGroupTypeAny,\n RuleGroupTypeIC,\n RuleType,\n} from '../types';\nimport { processMatchMode } from './formatQuery/utils';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\n\n/**\n * Options for {@link prepareRule}/{@link prepareRuleGroup}.\n */\nexport interface PreparerOptions {\n idGenerator?: () => string;\n}\n\n/**\n * Ensures that a rule is valid by adding an `id` property if it does not already exist.\n */\nexport const prepareRule = (\n rule: RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleType => {\n const needsId = !rule.id;\n const hasMatchMode = processMatchMode(rule);\n\n if (!needsId && !hasMatchMode) {\n return rule;\n }\n\n return {\n ...rule,\n ...(needsId && { id: idGenerator() }),\n ...(hasMatchMode && { value: prepareRuleGroup(rule.value, { idGenerator }) }),\n };\n};\n\n/**\n * Ensures that a rule group is valid by recursively adding an `id` property to the group itself\n * and all its rules and subgroups where one does not already exist.\n */\nexport const prepareRuleGroup = <RG extends RuleGroupTypeAny>(\n queryObject: RG,\n { idGenerator = generateID }: PreparerOptions = {}\n): RG => {\n const needsId = !queryObject.id;\n let rulesChanged = false;\n const newRules: (RuleGroupTypeAny | RuleType | string)[] = [];\n\n for (let i = 0; i < queryObject.rules.length; i++) {\n const r = queryObject.rules[i];\n if (typeof r === 'string') {\n newRules.push(r);\n } else {\n const prepared = isRuleGroup(r)\n ? prepareRuleGroup(r, { idGenerator })\n : prepareRule(r, { idGenerator });\n newRules.push(prepared);\n if (prepared !== r) {\n rulesChanged = true;\n }\n }\n }\n\n if (!needsId && !rulesChanged) {\n return queryObject;\n }\n\n return {\n ...queryObject,\n ...(needsId && { id: idGenerator() }),\n rules: newRules as RuleGroupArray | RuleGroupICArray,\n };\n};\n\n/**\n * Ensures that a rule or group is valid. See {@link prepareRule} and {@link prepareRuleGroup}.\n */\nexport const prepareRuleOrGroup = <RG extends RuleGroupTypeAny>(\n rg: RG | RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleGroupType | RuleGroupTypeIC | RuleType =>\n isRuleGroup(rg) ? prepareRuleGroup(rg, { idGenerator }) : prepareRule(rg, { idGenerator });\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prepareQueryObjects-BfMlS4ql.mjs","names":[],"sources":["../src/utils/filterFieldsByComparator.ts","../src/utils/getValueSourcesUtil.ts","../src/utils/parserUtils.ts","../src/utils/generateID.ts","../src/utils/prepareQueryObjects.ts"],"sourcesContent":["import type { FullField, OptionList, WithUnknownIndex } from '../types';\nimport { isFlexibleOptionGroupArray, toFullOption } from './optGroupUtils';\n\nconst filterByComparator = (field: FullField, operator: string, fieldToCompare: FullField) => {\n const fullField = toFullOption(field);\n const fullFieldToCompare = toFullOption(fieldToCompare);\n if (fullField.value === fullFieldToCompare.value) {\n return false;\n }\n if (typeof fullField.comparator === 'string') {\n return fullField[fullField.comparator] === fullFieldToCompare[fullField.comparator];\n }\n return fullField.comparator?.(fullFieldToCompare, operator) ?? /* istanbul ignore next */ false;\n};\n\n/**\n * For a given {@link FullField}, returns the `fields` list filtered for\n * other fields that match by `comparator`. Only fields *other than the\n * one in question* will ever be included, even if `comparator` is `null`\n * or `undefined`. If `comparator` is a string, fields with the same value\n * for that property will be included. If `comparator` is a function, each\n * field will be passed to the function along with the `operator` and fields\n * for which the function returns `true` will be included.\n *\n * @group Option Lists\n */\nexport const filterFieldsByComparator = (\n /** The field in question. */\n field: FullField,\n /** The full {@link FullField} list to be filtered. */\n fields: OptionList<FullField>,\n operator: string\n):\n | FullField[]\n | {\n options: WithUnknownIndex<FullField>[];\n label: string;\n }[] => {\n if (!field.comparator) {\n const filterOutSameField = (f: FullField) =>\n (f.value ?? /* istanbul ignore next */ f.name) !==\n (field.value ?? /* istanbul ignore next */ field.name);\n if (isFlexibleOptionGroupArray(fields)) {\n return fields.map(og => ({\n ...og,\n options: og.options.filter(v => filterOutSameField(v)),\n }));\n }\n return fields.filter(v => filterOutSameField(v));\n }\n\n if (isFlexibleOptionGroupArray(fields)) {\n return fields\n .map(og => ({\n ...og,\n options: og.options.filter(f => filterByComparator(field, operator, f)),\n }))\n .filter(og => og.options.length > 0);\n }\n\n return fields.filter(f => filterByComparator(field, operator, f));\n};\n","import type {\n FullField,\n GetOptionIdentifierType,\n ValueSourceFlexibleOptions,\n ValueSourceFullOptions,\n ValueSources,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst defaultValueSourcesArray: ValueSourceFullOptions = [\n { name: 'value', value: 'value', label: 'value' },\n];\n\nconst dummyFD = {\n name: 'name',\n value: 'name',\n valueSources: null,\n label: 'label',\n};\n\n/**\n * Utility function to get the value sources array for the given\n * field and operator. If the field definition does not define a\n * `valueSources` property, the `getValueSources` prop is used.\n * Returns `[FullOption<\"value\">]` by default.\n */\nexport const getValueSourcesUtil = <F extends FullField, O extends string>(\n fieldData: F,\n operator: string,\n getValueSources?: (\n field: GetOptionIdentifierType<F>,\n operator: O,\n misc: { fieldData: F }\n ) => ValueSources | ValueSourceFlexibleOptions\n): ValueSourceFullOptions => {\n // TypeScript doesn't allow it directly, but in practice\n // `fieldData` can end up being undefined or null. The nullish\n // coalescing assignment below avoids errors like\n // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n const fd = fieldData ? toFullOption(fieldData) : dummyFD;\n\n let valueSourcesNEW:\n | false\n | ValueSources\n | ValueSourceFlexibleOptions\n | ((operator: string) => ValueSources | ValueSourceFlexibleOptions) = fd.valueSources ?? false;\n\n if (typeof valueSourcesNEW === 'function') {\n valueSourcesNEW = valueSourcesNEW(operator as O);\n }\n\n if (!valueSourcesNEW && getValueSources) {\n valueSourcesNEW = getValueSources(fd.value as GetOptionIdentifierType<F>, operator as O, {\n fieldData: fd as F,\n });\n }\n\n if (!valueSourcesNEW) {\n return defaultValueSourcesArray;\n }\n\n if (isFlexibleOptionArray(valueSourcesNEW)) {\n return toFullOptionList(valueSourcesNEW as ValueSourceFullOptions) as ValueSourceFullOptions;\n }\n\n return valueSourcesNEW.map(\n vs =>\n defaultValueSourcesArray.find(dmm => dmm.value === lc(vs)) ?? {\n name: vs,\n value: vs,\n label: vs,\n }\n ) as ValueSourceFullOptions;\n};\n","import type {\n DefaultOperatorName,\n FullField,\n FullOption,\n OptionList,\n ValueSource,\n ValueSourceFlexibleOptions,\n ValueSources,\n} from '../types';\nimport { filterFieldsByComparator } from './filterFieldsByComparator';\nimport { getValueSourcesUtil } from './getValueSourcesUtil';\nimport { isFlexibleOptionArray, toFlatOptionArray, toFullOption } from './optGroupUtils';\n\nexport const getFieldsArray = (\n fields?: OptionList<FullField> | Record<string, FullField>\n): FullOption[] => {\n const fieldsArray = fields\n ? Array.isArray(fields)\n ? fields\n : Object.keys(fields)\n .map(fld => Object.assign({}, fields[fld], { name: fld }))\n // oxlint-disable-next-line no-array-sort\n .sort((a, b) => a.label.localeCompare(b.label))\n : [];\n return toFlatOptionArray(fieldsArray);\n};\n\nexport function fieldIsValidUtil(params: {\n fieldsFlat: FullField[];\n getValueSources?: (field: string, operator: string) => ValueSources | ValueSourceFlexibleOptions;\n fieldName: string;\n operator: DefaultOperatorName;\n subordinateFieldName?: string;\n}): boolean {\n const { fieldsFlat, fieldName, operator, subordinateFieldName, getValueSources } = params;\n\n const vsIncludes = (vs: ValueSource) => {\n const vss = getValueSourcesUtil(primaryField, operator, getValueSources);\n return isFlexibleOptionArray(vss) && vss.some(vso => vso.value === vs || vso.name === vs);\n };\n\n // If fields option was an empty array or undefined, then all identifiers\n // are considered valid.\n if (fieldsFlat.length === 0) return true;\n\n let valid = false;\n\n const primaryField = toFullOption(fieldsFlat.find(ff => ff.name === fieldName)!);\n if (primaryField) {\n valid = !(\n !subordinateFieldName &&\n operator !== 'notNull' &&\n operator !== 'null' &&\n !vsIncludes('value')\n );\n\n if (valid && !!subordinateFieldName) {\n if (vsIncludes('field') && fieldName !== subordinateFieldName) {\n const validSubordinateFields = filterFieldsByComparator(\n primaryField,\n fieldsFlat,\n operator\n ) as FullField[];\n if (!validSubordinateFields.some(vsf => vsf.name === subordinateFieldName)) {\n valid = false;\n }\n } else {\n valid = false;\n }\n }\n }\n\n return valid;\n}\n","// import type { UUID } from 'node:crypto';\ntype UUID = `${string}-${string}-${string}-${string}-${string}`;\n\nconst cryptoModule = globalThis.crypto;\n\n/**\n * Default `id` generator. Generates a valid v4 UUID. Uses `crypto.randomUUID()`\n * when available, otherwise uses an alternate method based on `getRandomValues`.\n * The returned string is guaranteed to match this regex:\n * ```\n * /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i\n * ```\n * @returns Valid v4 UUID\n */\n// Default implementation adapted from https://stackoverflow.com/a/68141099/217579\n// istanbul ignore next\nexport let generateID = (): UUID =>\n '00-0-4-2-000'.replaceAll(/[^-]/g, s =>\n (((Math.random() + Math.trunc(s as unknown as number)) * 0x1_00_00) >> Number.parseInt(s))\n .toString(16)\n .padStart(4, '0')\n ) as UUID;\n\n// Improve on the default implementation by using the crypto package if it's available\n// istanbul ignore else\nif (cryptoModule) {\n // istanbul ignore else\n if (typeof cryptoModule.randomUUID === 'function') {\n generateID = () => cryptoModule.randomUUID();\n } else if (typeof cryptoModule.getRandomValues === 'function') {\n // `randomUUID` is much simpler and faster, but it's only guaranteed to be\n // available in secure contexts (server-side, https, etc.). `generateID`\n // doesn't really need to be cryptographically secure, it only needs a\n // fairly low chance of collisions. We fall back to the always-available\n // `getRandomValues` here (while still generating a valid v4 UUID) when\n // `randomUUID` is not available.\n const position19vals = '89ab';\n const container = new Uint32Array(32);\n\n generateID = () => {\n cryptoModule.getRandomValues(container);\n let id = (container[0] % 16).toString(16);\n for (let i = 1; i < 32; i++) {\n if (i === 12) {\n id = `${id}${'4'}`;\n } else if (i === 16) {\n id = `${id}${position19vals[container[17] % 4]}`;\n } else {\n id = `${id}${(container[i] % 16).toString(16)}`;\n }\n\n if (i === 7 || i === 11 || i === 15 || i === 19) {\n id = `${id}${'-'}`;\n }\n }\n return id as UUID;\n };\n }\n}\n","import type {\n RuleGroupArray,\n RuleGroupICArray,\n RuleGroupType,\n RuleGroupTypeAny,\n RuleGroupTypeIC,\n RuleType,\n} from '../types';\nimport { processMatchMode } from './formatQuery/utils';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\n\n/**\n * Options for {@link prepareRule}/{@link prepareRuleGroup}.\n */\nexport interface PreparerOptions {\n idGenerator?: () => string;\n}\n\n/**\n * Ensures that a rule is valid by adding an `id` property if it does not already exist.\n */\nexport const prepareRule = (\n rule: RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleType => {\n const needsId = !rule.id;\n const hasMatchMode = processMatchMode(rule);\n\n if (!needsId && !hasMatchMode) {\n return rule;\n }\n\n return {\n ...rule,\n ...(needsId && { id: idGenerator() }),\n ...(hasMatchMode && { value: prepareRuleGroup(rule.value, { idGenerator }) }),\n };\n};\n\n/**\n * Ensures that a rule group is valid by recursively adding an `id` property to the group itself\n * and all its rules and subgroups where one does not already exist.\n */\nexport const prepareRuleGroup = <RG extends RuleGroupTypeAny>(\n queryObject: RG,\n { idGenerator = generateID }: PreparerOptions = {}\n): RG => {\n const needsId = !queryObject.id;\n let rulesChanged = false;\n const newRules: (RuleGroupTypeAny | RuleType | string)[] = [];\n\n for (let i = 0; i < queryObject.rules.length; i++) {\n const r = queryObject.rules[i];\n if (typeof r === 'string') {\n newRules.push(r);\n } else {\n const prepared = isRuleGroup(r)\n ? prepareRuleGroup(r, { idGenerator })\n : prepareRule(r, { idGenerator });\n newRules.push(prepared);\n if (prepared !== r) {\n rulesChanged = true;\n }\n }\n }\n\n if (!needsId && !rulesChanged) {\n return queryObject;\n }\n\n return {\n ...queryObject,\n ...(needsId && { id: idGenerator() }),\n rules: newRules as RuleGroupArray | RuleGroupICArray,\n };\n};\n\n/**\n * Ensures that a rule or group is valid. See {@link prepareRule} and {@link prepareRuleGroup}.\n */\nexport const prepareRuleOrGroup = <RG extends RuleGroupTypeAny>(\n rg: RG | RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleGroupType | RuleGroupTypeIC | RuleType =>\n isRuleGroup(rg) ? prepareRuleGroup(rg, { idGenerator }) : prepareRule(rg, { idGenerator });\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const require_utils = require("./utils-
|
|
2
|
-
const
|
|
1
|
+
const require_utils = require("./utils-CZRhzje-.js");
|
|
2
|
+
const require_objectUtils = require("./objectUtils-ButT0Mng.js");
|
|
3
3
|
//#region src/utils/filterFieldsByComparator.ts
|
|
4
4
|
const filterByComparator = (field, operator, fieldToCompare) => {
|
|
5
5
|
const fullField = require_utils.toFullOption(field);
|
|
@@ -60,7 +60,7 @@ const getValueSourcesUtil = (fieldData, operator, getValueSources) => {
|
|
|
60
60
|
if (!valueSourcesNEW && getValueSources) valueSourcesNEW = getValueSources(fd.value, operator, { fieldData: fd });
|
|
61
61
|
if (!valueSourcesNEW) return defaultValueSourcesArray;
|
|
62
62
|
if (require_utils.isFlexibleOptionArray(valueSourcesNEW)) return require_utils.toFullOptionList(valueSourcesNEW);
|
|
63
|
-
return valueSourcesNEW.map((vs) => defaultValueSourcesArray.find((dmm) => dmm.value ===
|
|
63
|
+
return valueSourcesNEW.map((vs) => defaultValueSourcesArray.find((dmm) => dmm.value === require_objectUtils.lc(vs)) ?? {
|
|
64
64
|
name: vs,
|
|
65
65
|
value: vs,
|
|
66
66
|
label: vs
|
|
@@ -149,7 +149,7 @@ const prepareRuleGroup = (queryObject, { idGenerator = generateID } = {}) => {
|
|
|
149
149
|
const r = queryObject.rules[i];
|
|
150
150
|
if (typeof r === "string") newRules.push(r);
|
|
151
151
|
else {
|
|
152
|
-
const prepared =
|
|
152
|
+
const prepared = require_objectUtils.isRuleGroup(r) ? prepareRuleGroup(r, { idGenerator }) : prepareRule(r, { idGenerator });
|
|
153
153
|
newRules.push(prepared);
|
|
154
154
|
if (prepared !== r) rulesChanged = true;
|
|
155
155
|
}
|
|
@@ -181,4 +181,4 @@ Object.defineProperty(exports, "prepareRuleGroup", {
|
|
|
181
181
|
}
|
|
182
182
|
});
|
|
183
183
|
|
|
184
|
-
//# sourceMappingURL=prepareQueryObjects-
|
|
184
|
+
//# sourceMappingURL=prepareQueryObjects-DO3qXriW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareQueryObjects-Dc8rqsYM.js","names":["toFullOption","isFlexibleOptionGroupArray","toFullOption","isFlexibleOptionArray","toFullOptionList","lc","toFlatOptionArray","isFlexibleOptionArray","toFullOption","processMatchMode","isRuleGroup"],"sources":["../src/utils/filterFieldsByComparator.ts","../src/utils/getValueSourcesUtil.ts","../src/utils/parserUtils.ts","../src/utils/generateID.ts","../src/utils/prepareQueryObjects.ts"],"sourcesContent":["import type { FullField, OptionList, WithUnknownIndex } from '../types';\nimport { isFlexibleOptionGroupArray, toFullOption } from './optGroupUtils';\n\nconst filterByComparator = (field: FullField, operator: string, fieldToCompare: FullField) => {\n const fullField = toFullOption(field);\n const fullFieldToCompare = toFullOption(fieldToCompare);\n if (fullField.value === fullFieldToCompare.value) {\n return false;\n }\n if (typeof fullField.comparator === 'string') {\n return fullField[fullField.comparator] === fullFieldToCompare[fullField.comparator];\n }\n return fullField.comparator?.(fullFieldToCompare, operator) ?? /* istanbul ignore next */ false;\n};\n\n/**\n * For a given {@link FullField}, returns the `fields` list filtered for\n * other fields that match by `comparator`. Only fields *other than the\n * one in question* will ever be included, even if `comparator` is `null`\n * or `undefined`. If `comparator` is a string, fields with the same value\n * for that property will be included. If `comparator` is a function, each\n * field will be passed to the function along with the `operator` and fields\n * for which the function returns `true` will be included.\n *\n * @group Option Lists\n */\nexport const filterFieldsByComparator = (\n /** The field in question. */\n field: FullField,\n /** The full {@link FullField} list to be filtered. */\n fields: OptionList<FullField>,\n operator: string\n):\n | FullField[]\n | {\n options: WithUnknownIndex<FullField>[];\n label: string;\n }[] => {\n if (!field.comparator) {\n const filterOutSameField = (f: FullField) =>\n (f.value ?? /* istanbul ignore next */ f.name) !==\n (field.value ?? /* istanbul ignore next */ field.name);\n if (isFlexibleOptionGroupArray(fields)) {\n return fields.map(og => ({\n ...og,\n options: og.options.filter(v => filterOutSameField(v)),\n }));\n }\n return fields.filter(v => filterOutSameField(v));\n }\n\n if (isFlexibleOptionGroupArray(fields)) {\n return fields\n .map(og => ({\n ...og,\n options: og.options.filter(f => filterByComparator(field, operator, f)),\n }))\n .filter(og => og.options.length > 0);\n }\n\n return fields.filter(f => filterByComparator(field, operator, f));\n};\n","import type {\n FullField,\n GetOptionIdentifierType,\n ValueSourceFlexibleOptions,\n ValueSourceFullOptions,\n ValueSources,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst defaultValueSourcesArray: ValueSourceFullOptions = [\n { name: 'value', value: 'value', label: 'value' },\n];\n\nconst dummyFD = {\n name: 'name',\n value: 'name',\n valueSources: null,\n label: 'label',\n};\n\n/**\n * Utility function to get the value sources array for the given\n * field and operator. If the field definition does not define a\n * `valueSources` property, the `getValueSources` prop is used.\n * Returns `[FullOption<\"value\">]` by default.\n */\nexport const getValueSourcesUtil = <F extends FullField, O extends string>(\n fieldData: F,\n operator: string,\n getValueSources?: (\n field: GetOptionIdentifierType<F>,\n operator: O,\n misc: { fieldData: F }\n ) => ValueSources | ValueSourceFlexibleOptions\n): ValueSourceFullOptions => {\n // TypeScript doesn't allow it directly, but in practice\n // `fieldData` can end up being undefined or null. The nullish\n // coalescing assignment below avoids errors like\n // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n const fd = fieldData ? toFullOption(fieldData) : dummyFD;\n\n let valueSourcesNEW:\n | false\n | ValueSources\n | ValueSourceFlexibleOptions\n | ((operator: string) => ValueSources | ValueSourceFlexibleOptions) = fd.valueSources ?? false;\n\n if (typeof valueSourcesNEW === 'function') {\n valueSourcesNEW = valueSourcesNEW(operator as O);\n }\n\n if (!valueSourcesNEW && getValueSources) {\n valueSourcesNEW = getValueSources(fd.value as GetOptionIdentifierType<F>, operator as O, {\n fieldData: fd as F,\n });\n }\n\n if (!valueSourcesNEW) {\n return defaultValueSourcesArray;\n }\n\n if (isFlexibleOptionArray(valueSourcesNEW)) {\n return toFullOptionList(valueSourcesNEW as ValueSourceFullOptions) as ValueSourceFullOptions;\n }\n\n return valueSourcesNEW.map(\n vs =>\n defaultValueSourcesArray.find(dmm => dmm.value === lc(vs)) ?? {\n name: vs,\n value: vs,\n label: vs,\n }\n ) as ValueSourceFullOptions;\n};\n","import type {\n DefaultOperatorName,\n FullField,\n FullOption,\n OptionList,\n ValueSource,\n ValueSourceFlexibleOptions,\n ValueSources,\n} from '../types';\nimport { filterFieldsByComparator } from './filterFieldsByComparator';\nimport { getValueSourcesUtil } from './getValueSourcesUtil';\nimport { isFlexibleOptionArray, toFlatOptionArray, toFullOption } from './optGroupUtils';\n\nexport const getFieldsArray = (\n fields?: OptionList<FullField> | Record<string, FullField>\n): FullOption[] => {\n const fieldsArray = fields\n ? Array.isArray(fields)\n ? fields\n : Object.keys(fields)\n .map(fld => Object.assign({}, fields[fld], { name: fld }))\n // oxlint-disable-next-line no-array-sort\n .sort((a, b) => a.label.localeCompare(b.label))\n : [];\n return toFlatOptionArray(fieldsArray);\n};\n\nexport function fieldIsValidUtil(params: {\n fieldsFlat: FullField[];\n getValueSources?: (field: string, operator: string) => ValueSources | ValueSourceFlexibleOptions;\n fieldName: string;\n operator: DefaultOperatorName;\n subordinateFieldName?: string;\n}): boolean {\n const { fieldsFlat, fieldName, operator, subordinateFieldName, getValueSources } = params;\n\n const vsIncludes = (vs: ValueSource) => {\n const vss = getValueSourcesUtil(primaryField, operator, getValueSources);\n return isFlexibleOptionArray(vss) && vss.some(vso => vso.value === vs || vso.name === vs);\n };\n\n // If fields option was an empty array or undefined, then all identifiers\n // are considered valid.\n if (fieldsFlat.length === 0) return true;\n\n let valid = false;\n\n const primaryField = toFullOption(fieldsFlat.find(ff => ff.name === fieldName)!);\n if (primaryField) {\n valid = !(\n !subordinateFieldName &&\n operator !== 'notNull' &&\n operator !== 'null' &&\n !vsIncludes('value')\n );\n\n if (valid && !!subordinateFieldName) {\n if (vsIncludes('field') && fieldName !== subordinateFieldName) {\n const validSubordinateFields = filterFieldsByComparator(\n primaryField,\n fieldsFlat,\n operator\n ) as FullField[];\n if (!validSubordinateFields.some(vsf => vsf.name === subordinateFieldName)) {\n valid = false;\n }\n } else {\n valid = false;\n }\n }\n }\n\n return valid;\n}\n","// import type { UUID } from 'node:crypto';\ntype UUID = `${string}-${string}-${string}-${string}-${string}`;\n\nconst cryptoModule = globalThis.crypto;\n\n/**\n * Default `id` generator. Generates a valid v4 UUID. Uses `crypto.randomUUID()`\n * when available, otherwise uses an alternate method based on `getRandomValues`.\n * The returned string is guaranteed to match this regex:\n * ```\n * /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i\n * ```\n * @returns Valid v4 UUID\n */\n// Default implementation adapted from https://stackoverflow.com/a/68141099/217579\n// istanbul ignore next\nexport let generateID = (): UUID =>\n '00-0-4-2-000'.replaceAll(/[^-]/g, s =>\n (((Math.random() + Math.trunc(s as unknown as number)) * 0x1_00_00) >> Number.parseInt(s))\n .toString(16)\n .padStart(4, '0')\n ) as UUID;\n\n// Improve on the default implementation by using the crypto package if it's available\n// istanbul ignore else\nif (cryptoModule) {\n // istanbul ignore else\n if (typeof cryptoModule.randomUUID === 'function') {\n generateID = () => cryptoModule.randomUUID();\n } else if (typeof cryptoModule.getRandomValues === 'function') {\n // `randomUUID` is much simpler and faster, but it's only guaranteed to be\n // available in secure contexts (server-side, https, etc.). `generateID`\n // doesn't really need to be cryptographically secure, it only needs a\n // fairly low chance of collisions. We fall back to the always-available\n // `getRandomValues` here (while still generating a valid v4 UUID) when\n // `randomUUID` is not available.\n const position19vals = '89ab';\n const container = new Uint32Array(32);\n\n generateID = () => {\n cryptoModule.getRandomValues(container);\n let id = (container[0] % 16).toString(16);\n for (let i = 1; i < 32; i++) {\n if (i === 12) {\n id = `${id}${'4'}`;\n } else if (i === 16) {\n id = `${id}${position19vals[container[17] % 4]}`;\n } else {\n id = `${id}${(container[i] % 16).toString(16)}`;\n }\n\n if (i === 7 || i === 11 || i === 15 || i === 19) {\n id = `${id}${'-'}`;\n }\n }\n return id as UUID;\n };\n }\n}\n","import type {\n RuleGroupArray,\n RuleGroupICArray,\n RuleGroupType,\n RuleGroupTypeAny,\n RuleGroupTypeIC,\n RuleType,\n} from '../types';\nimport { processMatchMode } from './formatQuery/utils';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\n\n/**\n * Options for {@link prepareRule}/{@link prepareRuleGroup}.\n */\nexport interface PreparerOptions {\n idGenerator?: () => string;\n}\n\n/**\n * Ensures that a rule is valid by adding an `id` property if it does not already exist.\n */\nexport const prepareRule = (\n rule: RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleType => {\n const needsId = !rule.id;\n const hasMatchMode = processMatchMode(rule);\n\n if (!needsId && !hasMatchMode) {\n return rule;\n }\n\n return {\n ...rule,\n ...(needsId && { id: idGenerator() }),\n ...(hasMatchMode && { value: prepareRuleGroup(rule.value, { idGenerator }) }),\n };\n};\n\n/**\n * Ensures that a rule group is valid by recursively adding an `id` property to the group itself\n * and all its rules and subgroups where one does not already exist.\n */\nexport const prepareRuleGroup = <RG extends RuleGroupTypeAny>(\n queryObject: RG,\n { idGenerator = generateID }: PreparerOptions = {}\n): RG => {\n const needsId = !queryObject.id;\n let rulesChanged = false;\n const newRules: (RuleGroupTypeAny | RuleType | string)[] = [];\n\n for (let i = 0; i < queryObject.rules.length; i++) {\n const r = queryObject.rules[i];\n if (typeof r === 'string') {\n newRules.push(r);\n } else {\n const prepared = isRuleGroup(r)\n ? prepareRuleGroup(r, { idGenerator })\n : prepareRule(r, { idGenerator });\n newRules.push(prepared);\n if (prepared !== r) {\n rulesChanged = true;\n }\n }\n }\n\n if (!needsId && !rulesChanged) {\n return queryObject;\n }\n\n return {\n ...queryObject,\n ...(needsId && { id: idGenerator() }),\n rules: newRules as RuleGroupArray | RuleGroupICArray,\n };\n};\n\n/**\n * Ensures that a rule or group is valid. See {@link prepareRule} and {@link prepareRuleGroup}.\n */\nexport const prepareRuleOrGroup = <RG extends RuleGroupTypeAny>(\n rg: RG | RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleGroupType | RuleGroupTypeIC | RuleType =>\n isRuleGroup(rg) ? prepareRuleGroup(rg, { idGenerator }) : prepareRule(rg, { idGenerator });\n"],"mappings":";;;AAGA,MAAM,sBAAsB,OAAkB,UAAkB,mBAA8B;CAC5F,MAAM,YAAYA,cAAAA,aAAa,MAAM;CACrC,MAAM,qBAAqBA,cAAAA,aAAa,eAAe;AACvD,KAAI,UAAU,UAAU,mBAAmB,MACzC,QAAO;AAET,KAAI,OAAO,UAAU,eAAe,SAClC,QAAO,UAAU,UAAU,gBAAgB,mBAAmB,UAAU;AAE1E,QAAO,UAAU,aAAa,oBAAoB,SAAS,IAA+B;;;;;;;;;;;;;AAc5F,MAAa,4BAEX,OAEA,QACA,aAMS;AACT,KAAI,CAAC,MAAM,YAAY;EACrB,MAAM,sBAAsB,OACzB,EAAE,SAAoC,EAAE,WACxC,MAAM,SAAoC,MAAM;AACnD,MAAIC,cAAAA,2BAA2B,OAAO,CACpC,QAAO,OAAO,KAAI,QAAO;GACvB,GAAG;GACH,SAAS,GAAG,QAAQ,QAAO,MAAK,mBAAmB,EAAE,CAAC;GACvD,EAAE;AAEL,SAAO,OAAO,QAAO,MAAK,mBAAmB,EAAE,CAAC;;AAGlD,KAAIA,cAAAA,2BAA2B,OAAO,CACpC,QAAO,OACJ,KAAI,QAAO;EACV,GAAG;EACH,SAAS,GAAG,QAAQ,QAAO,MAAK,mBAAmB,OAAO,UAAU,EAAE,CAAC;EACxE,EAAE,CACF,QAAO,OAAM,GAAG,QAAQ,SAAS,EAAE;AAGxC,QAAO,OAAO,QAAO,MAAK,mBAAmB,OAAO,UAAU,EAAE,CAAC;;;;AClDnE,MAAM,2BAAmD,CACvD;CAAE,MAAM;CAAS,OAAO;CAAS,OAAO;CAAS,CAClD;AAED,MAAM,UAAU;CACd,MAAM;CACN,OAAO;CACP,cAAc;CACd,OAAO;CACR;;;;;;;AAQD,MAAa,uBACX,WACA,UACA,oBAK2B;CAK3B,MAAM,KAAK,YAAYC,cAAAA,aAAa,UAAU,GAAG;CAEjD,IAAI,kBAIoE,GAAG,gBAAgB;AAE3F,KAAI,OAAO,oBAAoB,WAC7B,mBAAkB,gBAAgB,SAAc;AAGlD,KAAI,CAAC,mBAAmB,gBACtB,mBAAkB,gBAAgB,GAAG,OAAqC,UAAe,EACvF,WAAW,IACZ,CAAC;AAGJ,KAAI,CAAC,gBACH,QAAO;AAGT,KAAIC,cAAAA,sBAAsB,gBAAgB,CACxC,QAAOC,cAAAA,iBAAiB,gBAA0C;AAGpE,QAAO,gBAAgB,KACrB,OACE,yBAAyB,MAAK,QAAO,IAAI,UAAUC,oBAAAA,GAAG,GAAG,CAAC,IAAI;EAC5D,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACJ;;;;AC5DH,MAAa,kBACX,WACiB;AASjB,QAAOC,cAAAA,kBARa,SAChB,MAAM,QAAQ,OAAO,GACnB,SACA,OAAO,KAAK,OAAO,CAChB,KAAI,QAAO,OAAO,OAAO,EAAE,EAAE,OAAO,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,CAEzD,MAAM,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,MAAM,CAAC,GACnD,EAAE,CAC+B;;AAGvC,SAAgB,iBAAiB,QAMrB;CACV,MAAM,EAAE,YAAY,WAAW,UAAU,sBAAsB,oBAAoB;CAEnF,MAAM,cAAc,OAAoB;EACtC,MAAM,MAAM,oBAAoB,cAAc,UAAU,gBAAgB;AACxE,SAAOC,cAAAA,sBAAsB,IAAI,IAAI,IAAI,MAAK,QAAO,IAAI,UAAU,MAAM,IAAI,SAAS,GAAG;;AAK3F,KAAI,WAAW,WAAW,EAAG,QAAO;CAEpC,IAAI,QAAQ;CAEZ,MAAM,eAAeC,cAAAA,aAAa,WAAW,MAAK,OAAM,GAAG,SAAS,UAAU,CAAE;AAChF,KAAI,cAAc;AAChB,UAAQ,EACN,CAAC,wBACD,aAAa,aACb,aAAa,UACb,CAAC,WAAW,QAAQ;AAGtB,MAAI,SAAS,CAAC,CAAC,qBACb,KAAI,WAAW,QAAQ,IAAI,cAAc;OAMnC,CAL2B,yBAC7B,cACA,YACA,SACD,CAC2B,MAAK,QAAO,IAAI,SAAS,qBAAqB,CACxE,SAAQ;QAGV,SAAQ;;AAKd,QAAO;;;;ACrET,MAAM,eAAe,WAAW;;;;;;;;;;;AAahC,IAAW,mBACT,eAAe,WAAW,UAAS,QAC9B,KAAK,QAAQ,GAAG,KAAK,MAAM,EAAuB,IAAI,SAAc,OAAO,SAAS,EAAE,EACtF,SAAS,GAAG,CACZ,SAAS,GAAG,IAAI,CACpB;;AAIH,IAAI;;KAEE,OAAO,aAAa,eAAe,WACrC,oBAAmB,aAAa,YAAY;UACnC,OAAO,aAAa,oBAAoB,YAAY;EAO7D,MAAM,iBAAiB;EACvB,MAAM,YAAY,IAAI,YAAY,GAAG;AAErC,qBAAmB;AACjB,gBAAa,gBAAgB,UAAU;GACvC,IAAI,MAAM,UAAU,KAAK,IAAI,SAAS,GAAG;AACzC,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,QAAI,MAAM,GACR,MAAK,GAAG,GAAA;aACC,MAAM,GACf,MAAK,GAAG,KAAK,eAAe,UAAU,MAAM;QAE5C,MAAK,GAAG,MAAM,UAAU,KAAK,IAAI,SAAS,GAAG;AAG/C,QAAI,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,GAC3C,MAAK,GAAG,GAAA;;AAGZ,UAAO;;;;;;;;;ACjCb,MAAa,eACX,MACA,EAAE,cAAc,eAAgC,EAAE,KACrC;CACb,MAAM,UAAU,CAAC,KAAK;CACtB,MAAM,eAAeC,cAAAA,iBAAiB,KAAK;AAE3C,KAAI,CAAC,WAAW,CAAC,aACf,QAAO;AAGT,QAAO;EACL,GAAG;EACH,GAAI,WAAW,EAAE,IAAI,aAAa,EAAE;EACpC,GAAI,gBAAgB,EAAE,OAAO,iBAAiB,KAAK,OAAO,EAAE,aAAa,CAAC,EAAE;EAC7E;;;;;;AAOH,MAAa,oBACX,aACA,EAAE,cAAc,eAAgC,EAAE,KAC3C;CACP,MAAM,UAAU,CAAC,YAAY;CAC7B,IAAI,eAAe;CACnB,MAAM,WAAqD,EAAE;AAE7D,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,MAAM,QAAQ,KAAK;EACjD,MAAM,IAAI,YAAY,MAAM;AAC5B,MAAI,OAAO,MAAM,SACf,UAAS,KAAK,EAAE;OACX;GACL,MAAM,WAAWC,oBAAAA,YAAY,EAAE,GAC3B,iBAAiB,GAAG,EAAE,aAAa,CAAC,GACpC,YAAY,GAAG,EAAE,aAAa,CAAC;AACnC,YAAS,KAAK,SAAS;AACvB,OAAI,aAAa,EACf,gBAAe;;;AAKrB,KAAI,CAAC,WAAW,CAAC,aACf,QAAO;AAGT,QAAO;EACL,GAAG;EACH,GAAI,WAAW,EAAE,IAAI,aAAa,EAAE;EACpC,OAAO;EACR"}
|
|
1
|
+
{"version":3,"file":"prepareQueryObjects-DO3qXriW.js","names":["toFullOption","isFlexibleOptionGroupArray","toFullOption","isFlexibleOptionArray","toFullOptionList","lc","toFlatOptionArray","isFlexibleOptionArray","toFullOption","processMatchMode","isRuleGroup"],"sources":["../src/utils/filterFieldsByComparator.ts","../src/utils/getValueSourcesUtil.ts","../src/utils/parserUtils.ts","../src/utils/generateID.ts","../src/utils/prepareQueryObjects.ts"],"sourcesContent":["import type { FullField, OptionList, WithUnknownIndex } from '../types';\nimport { isFlexibleOptionGroupArray, toFullOption } from './optGroupUtils';\n\nconst filterByComparator = (field: FullField, operator: string, fieldToCompare: FullField) => {\n const fullField = toFullOption(field);\n const fullFieldToCompare = toFullOption(fieldToCompare);\n if (fullField.value === fullFieldToCompare.value) {\n return false;\n }\n if (typeof fullField.comparator === 'string') {\n return fullField[fullField.comparator] === fullFieldToCompare[fullField.comparator];\n }\n return fullField.comparator?.(fullFieldToCompare, operator) ?? /* istanbul ignore next */ false;\n};\n\n/**\n * For a given {@link FullField}, returns the `fields` list filtered for\n * other fields that match by `comparator`. Only fields *other than the\n * one in question* will ever be included, even if `comparator` is `null`\n * or `undefined`. If `comparator` is a string, fields with the same value\n * for that property will be included. If `comparator` is a function, each\n * field will be passed to the function along with the `operator` and fields\n * for which the function returns `true` will be included.\n *\n * @group Option Lists\n */\nexport const filterFieldsByComparator = (\n /** The field in question. */\n field: FullField,\n /** The full {@link FullField} list to be filtered. */\n fields: OptionList<FullField>,\n operator: string\n):\n | FullField[]\n | {\n options: WithUnknownIndex<FullField>[];\n label: string;\n }[] => {\n if (!field.comparator) {\n const filterOutSameField = (f: FullField) =>\n (f.value ?? /* istanbul ignore next */ f.name) !==\n (field.value ?? /* istanbul ignore next */ field.name);\n if (isFlexibleOptionGroupArray(fields)) {\n return fields.map(og => ({\n ...og,\n options: og.options.filter(v => filterOutSameField(v)),\n }));\n }\n return fields.filter(v => filterOutSameField(v));\n }\n\n if (isFlexibleOptionGroupArray(fields)) {\n return fields\n .map(og => ({\n ...og,\n options: og.options.filter(f => filterByComparator(field, operator, f)),\n }))\n .filter(og => og.options.length > 0);\n }\n\n return fields.filter(f => filterByComparator(field, operator, f));\n};\n","import type {\n FullField,\n GetOptionIdentifierType,\n ValueSourceFlexibleOptions,\n ValueSourceFullOptions,\n ValueSources,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst defaultValueSourcesArray: ValueSourceFullOptions = [\n { name: 'value', value: 'value', label: 'value' },\n];\n\nconst dummyFD = {\n name: 'name',\n value: 'name',\n valueSources: null,\n label: 'label',\n};\n\n/**\n * Utility function to get the value sources array for the given\n * field and operator. If the field definition does not define a\n * `valueSources` property, the `getValueSources` prop is used.\n * Returns `[FullOption<\"value\">]` by default.\n */\nexport const getValueSourcesUtil = <F extends FullField, O extends string>(\n fieldData: F,\n operator: string,\n getValueSources?: (\n field: GetOptionIdentifierType<F>,\n operator: O,\n misc: { fieldData: F }\n ) => ValueSources | ValueSourceFlexibleOptions\n): ValueSourceFullOptions => {\n // TypeScript doesn't allow it directly, but in practice\n // `fieldData` can end up being undefined or null. The nullish\n // coalescing assignment below avoids errors like\n // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n const fd = fieldData ? toFullOption(fieldData) : dummyFD;\n\n let valueSourcesNEW:\n | false\n | ValueSources\n | ValueSourceFlexibleOptions\n | ((operator: string) => ValueSources | ValueSourceFlexibleOptions) = fd.valueSources ?? false;\n\n if (typeof valueSourcesNEW === 'function') {\n valueSourcesNEW = valueSourcesNEW(operator as O);\n }\n\n if (!valueSourcesNEW && getValueSources) {\n valueSourcesNEW = getValueSources(fd.value as GetOptionIdentifierType<F>, operator as O, {\n fieldData: fd as F,\n });\n }\n\n if (!valueSourcesNEW) {\n return defaultValueSourcesArray;\n }\n\n if (isFlexibleOptionArray(valueSourcesNEW)) {\n return toFullOptionList(valueSourcesNEW as ValueSourceFullOptions) as ValueSourceFullOptions;\n }\n\n return valueSourcesNEW.map(\n vs =>\n defaultValueSourcesArray.find(dmm => dmm.value === lc(vs)) ?? {\n name: vs,\n value: vs,\n label: vs,\n }\n ) as ValueSourceFullOptions;\n};\n","import type {\n DefaultOperatorName,\n FullField,\n FullOption,\n OptionList,\n ValueSource,\n ValueSourceFlexibleOptions,\n ValueSources,\n} from '../types';\nimport { filterFieldsByComparator } from './filterFieldsByComparator';\nimport { getValueSourcesUtil } from './getValueSourcesUtil';\nimport { isFlexibleOptionArray, toFlatOptionArray, toFullOption } from './optGroupUtils';\n\nexport const getFieldsArray = (\n fields?: OptionList<FullField> | Record<string, FullField>\n): FullOption[] => {\n const fieldsArray = fields\n ? Array.isArray(fields)\n ? fields\n : Object.keys(fields)\n .map(fld => Object.assign({}, fields[fld], { name: fld }))\n // oxlint-disable-next-line no-array-sort\n .sort((a, b) => a.label.localeCompare(b.label))\n : [];\n return toFlatOptionArray(fieldsArray);\n};\n\nexport function fieldIsValidUtil(params: {\n fieldsFlat: FullField[];\n getValueSources?: (field: string, operator: string) => ValueSources | ValueSourceFlexibleOptions;\n fieldName: string;\n operator: DefaultOperatorName;\n subordinateFieldName?: string;\n}): boolean {\n const { fieldsFlat, fieldName, operator, subordinateFieldName, getValueSources } = params;\n\n const vsIncludes = (vs: ValueSource) => {\n const vss = getValueSourcesUtil(primaryField, operator, getValueSources);\n return isFlexibleOptionArray(vss) && vss.some(vso => vso.value === vs || vso.name === vs);\n };\n\n // If fields option was an empty array or undefined, then all identifiers\n // are considered valid.\n if (fieldsFlat.length === 0) return true;\n\n let valid = false;\n\n const primaryField = toFullOption(fieldsFlat.find(ff => ff.name === fieldName)!);\n if (primaryField) {\n valid = !(\n !subordinateFieldName &&\n operator !== 'notNull' &&\n operator !== 'null' &&\n !vsIncludes('value')\n );\n\n if (valid && !!subordinateFieldName) {\n if (vsIncludes('field') && fieldName !== subordinateFieldName) {\n const validSubordinateFields = filterFieldsByComparator(\n primaryField,\n fieldsFlat,\n operator\n ) as FullField[];\n if (!validSubordinateFields.some(vsf => vsf.name === subordinateFieldName)) {\n valid = false;\n }\n } else {\n valid = false;\n }\n }\n }\n\n return valid;\n}\n","// import type { UUID } from 'node:crypto';\ntype UUID = `${string}-${string}-${string}-${string}-${string}`;\n\nconst cryptoModule = globalThis.crypto;\n\n/**\n * Default `id` generator. Generates a valid v4 UUID. Uses `crypto.randomUUID()`\n * when available, otherwise uses an alternate method based on `getRandomValues`.\n * The returned string is guaranteed to match this regex:\n * ```\n * /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i\n * ```\n * @returns Valid v4 UUID\n */\n// Default implementation adapted from https://stackoverflow.com/a/68141099/217579\n// istanbul ignore next\nexport let generateID = (): UUID =>\n '00-0-4-2-000'.replaceAll(/[^-]/g, s =>\n (((Math.random() + Math.trunc(s as unknown as number)) * 0x1_00_00) >> Number.parseInt(s))\n .toString(16)\n .padStart(4, '0')\n ) as UUID;\n\n// Improve on the default implementation by using the crypto package if it's available\n// istanbul ignore else\nif (cryptoModule) {\n // istanbul ignore else\n if (typeof cryptoModule.randomUUID === 'function') {\n generateID = () => cryptoModule.randomUUID();\n } else if (typeof cryptoModule.getRandomValues === 'function') {\n // `randomUUID` is much simpler and faster, but it's only guaranteed to be\n // available in secure contexts (server-side, https, etc.). `generateID`\n // doesn't really need to be cryptographically secure, it only needs a\n // fairly low chance of collisions. We fall back to the always-available\n // `getRandomValues` here (while still generating a valid v4 UUID) when\n // `randomUUID` is not available.\n const position19vals = '89ab';\n const container = new Uint32Array(32);\n\n generateID = () => {\n cryptoModule.getRandomValues(container);\n let id = (container[0] % 16).toString(16);\n for (let i = 1; i < 32; i++) {\n if (i === 12) {\n id = `${id}${'4'}`;\n } else if (i === 16) {\n id = `${id}${position19vals[container[17] % 4]}`;\n } else {\n id = `${id}${(container[i] % 16).toString(16)}`;\n }\n\n if (i === 7 || i === 11 || i === 15 || i === 19) {\n id = `${id}${'-'}`;\n }\n }\n return id as UUID;\n };\n }\n}\n","import type {\n RuleGroupArray,\n RuleGroupICArray,\n RuleGroupType,\n RuleGroupTypeAny,\n RuleGroupTypeIC,\n RuleType,\n} from '../types';\nimport { processMatchMode } from './formatQuery/utils';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\n\n/**\n * Options for {@link prepareRule}/{@link prepareRuleGroup}.\n */\nexport interface PreparerOptions {\n idGenerator?: () => string;\n}\n\n/**\n * Ensures that a rule is valid by adding an `id` property if it does not already exist.\n */\nexport const prepareRule = (\n rule: RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleType => {\n const needsId = !rule.id;\n const hasMatchMode = processMatchMode(rule);\n\n if (!needsId && !hasMatchMode) {\n return rule;\n }\n\n return {\n ...rule,\n ...(needsId && { id: idGenerator() }),\n ...(hasMatchMode && { value: prepareRuleGroup(rule.value, { idGenerator }) }),\n };\n};\n\n/**\n * Ensures that a rule group is valid by recursively adding an `id` property to the group itself\n * and all its rules and subgroups where one does not already exist.\n */\nexport const prepareRuleGroup = <RG extends RuleGroupTypeAny>(\n queryObject: RG,\n { idGenerator = generateID }: PreparerOptions = {}\n): RG => {\n const needsId = !queryObject.id;\n let rulesChanged = false;\n const newRules: (RuleGroupTypeAny | RuleType | string)[] = [];\n\n for (let i = 0; i < queryObject.rules.length; i++) {\n const r = queryObject.rules[i];\n if (typeof r === 'string') {\n newRules.push(r);\n } else {\n const prepared = isRuleGroup(r)\n ? prepareRuleGroup(r, { idGenerator })\n : prepareRule(r, { idGenerator });\n newRules.push(prepared);\n if (prepared !== r) {\n rulesChanged = true;\n }\n }\n }\n\n if (!needsId && !rulesChanged) {\n return queryObject;\n }\n\n return {\n ...queryObject,\n ...(needsId && { id: idGenerator() }),\n rules: newRules as RuleGroupArray | RuleGroupICArray,\n };\n};\n\n/**\n * Ensures that a rule or group is valid. See {@link prepareRule} and {@link prepareRuleGroup}.\n */\nexport const prepareRuleOrGroup = <RG extends RuleGroupTypeAny>(\n rg: RG | RuleType,\n { idGenerator = generateID }: PreparerOptions = {}\n): RuleGroupType | RuleGroupTypeIC | RuleType =>\n isRuleGroup(rg) ? prepareRuleGroup(rg, { idGenerator }) : prepareRule(rg, { idGenerator });\n"],"mappings":"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"}
|