@react-querybuilder/core 8.9.1 → 8.10.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/arrayUtils-C9sO4qLO.mjs +50 -0
- package/dist/arrayUtils-C9sO4qLO.mjs.map +1 -0
- package/dist/arrayUtils-QxZOZTf6.js +73 -0
- package/dist/arrayUtils-QxZOZTf6.js.map +1 -0
- package/dist/basic-BmpEwexQ.d.mts +363 -0
- package/dist/basic-CDDA-KZa.d.ts +363 -0
- package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +569 -1252
- package/dist/cjs/react-querybuilder_core.cjs.development.js +430 -140
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +569 -1252
- 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-BUgyz1GA.mjs +75 -0
- package/dist/convertQuery-BUgyz1GA.mjs.map +1 -0
- package/dist/export-Ccjfea21.d.mts +453 -0
- package/dist/{export-DyrnTh6K.d.ts → export-GUuxJ7zR.d.ts} +3 -2
- package/dist/formatQuery.d.mts +668 -0
- package/dist/formatQuery.d.ts +3 -2
- package/dist/formatQuery.js +217 -87
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +2496 -0
- package/dist/formatQuery.mjs.map +1 -0
- package/dist/{import-Cksobmln.d.ts → import-D-hm1phN.d.ts} +2 -2
- package/dist/import-Dxevzw_-.d.mts +28 -0
- package/dist/isRuleGroup-CGe_rb2w.mjs +40 -0
- package/dist/isRuleGroup-CGe_rb2w.mjs.map +1 -0
- package/dist/isRuleGroup-DqAs2x4E.js.map +1 -1
- package/dist/{optGroupUtils-CXLgyg2i.js → optGroupUtils-B0hTpodo.js} +114 -1
- package/dist/optGroupUtils-B0hTpodo.js.map +1 -0
- package/dist/optGroupUtils-DrubUpx0.mjs +185 -0
- package/dist/optGroupUtils-DrubUpx0.mjs.map +1 -0
- package/dist/parseCEL.d.mts +315 -0
- package/dist/parseCEL.d.ts +292 -11
- package/dist/parseCEL.js +114 -30
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs +2631 -0
- package/dist/parseCEL.mjs.map +1 -0
- package/dist/parseJSONata.d.mts +37 -0
- package/dist/parseJSONata.d.ts +3 -2
- package/dist/parseJSONata.js +49 -77
- package/dist/parseJSONata.js.map +1 -1
- package/dist/parseJSONata.mjs +267 -0
- package/dist/parseJSONata.mjs.map +1 -0
- package/dist/parseJsonLogic.d.mts +37 -0
- package/dist/parseJsonLogic.d.ts +4 -3
- package/dist/parseJsonLogic.js +5 -6
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +190 -0
- package/dist/parseJsonLogic.mjs.map +1 -0
- package/dist/parseMongoDB.d.mts +80 -0
- package/dist/parseMongoDB.d.ts +3 -2
- package/dist/parseMongoDB.js +15 -16
- package/dist/parseMongoDB.js.map +1 -1
- package/dist/parseMongoDB.mjs +266 -0
- package/dist/parseMongoDB.mjs.map +1 -0
- package/dist/parseNumber-B_-sR6d5.mjs +24 -0
- package/dist/parseNumber-B_-sR6d5.mjs.map +1 -0
- package/dist/{parseNumber-Bcys1kOH.js → parseNumber-D4iQDxK-.js} +1 -1
- package/dist/{parseNumber-Bcys1kOH.js.map → parseNumber-D4iQDxK-.js.map} +1 -1
- package/dist/parseSQL.d.mts +38 -0
- package/dist/parseSQL.d.ts +3 -2
- package/dist/parseSQL.js +11 -15
- package/dist/parseSQL.js.map +1 -1
- package/dist/parseSQL.mjs +6622 -0
- package/dist/parseSQL.mjs.map +1 -0
- package/dist/parseSpEL.d.mts +35 -0
- package/dist/parseSpEL.d.ts +3 -2
- package/dist/parseSpEL.js +7 -9
- package/dist/parseSpEL.js.map +1 -1
- package/dist/parseSpEL.mjs +272 -0
- package/dist/parseSpEL.mjs.map +1 -0
- package/dist/{prepareQueryObjects-BqFEs4eV.js → prepareQueryObjects-BOUWfel5.js} +4 -5
- package/dist/prepareQueryObjects-BOUWfel5.js.map +1 -0
- package/dist/prepareQueryObjects-CJNpnGcJ.mjs +153 -0
- package/dist/prepareQueryObjects-CJNpnGcJ.mjs.map +1 -0
- package/dist/query-builder-layout.css +1 -1
- package/dist/query-builder-layout.css.map +1 -1
- package/dist/query-builder.css +1 -1
- package/dist/query-builder.css.map +1 -1
- package/dist/react-querybuilder_core.d.mts +569 -1252
- package/dist/react-querybuilder_core.legacy-esm.d.ts +569 -1252
- package/dist/react-querybuilder_core.legacy-esm.js +430 -136
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +426 -141
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +569 -1252
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/styles/_layout.scss +61 -17
- package/dist/styles/_main.scss +17 -4
- package/dist/{transformQuery-FL_nlpp5.js → transformQuery-CWDPogO5.js} +1 -1
- package/dist/{transformQuery-FL_nlpp5.js.map → transformQuery-CWDPogO5.js.map} +1 -1
- package/dist/transformQuery-DHvtgDgZ.mjs +41 -0
- package/dist/transformQuery-DHvtgDgZ.mjs.map +1 -0
- package/dist/transformQuery.d.mts +118 -0
- package/dist/transformQuery.d.ts +1 -1
- package/dist/transformQuery.js +1 -1
- package/dist/transformQuery.mjs +4 -0
- package/package.json +78 -28
- package/dist/arrayUtils-D5EoIsKP.js +0 -164
- package/dist/arrayUtils-D5EoIsKP.js.map +0 -1
- package/dist/basic-C8xXKHIA.d.ts +0 -1235
- package/dist/objectUtils-BBZSfZJz.js +0 -17
- package/dist/objectUtils-BBZSfZJz.js.map +0 -1
- package/dist/optGroupUtils-CXLgyg2i.js.map +0 -1
- package/dist/prepareQueryObjects-BqFEs4eV.js.map +0 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { defaultOperatorNegationMap, objectKeys } from "./optGroupUtils-DrubUpx0.mjs";
|
|
2
|
+
import { joinWith } from "./arrayUtils-C9sO4qLO.mjs";
|
|
3
|
+
import { isPojo, isRuleGroupType } from "./isRuleGroup-CGe_rb2w.mjs";
|
|
4
|
+
import { convertToIC } from "./convertQuery-BUgyz1GA.mjs";
|
|
5
|
+
import { fieldIsValidUtil, getFieldsArray, prepareRuleGroup } from "./prepareQueryObjects-CJNpnGcJ.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/utils/parseMongoDB/utils.ts
|
|
8
|
+
const getRegExStr = (re) => typeof re === "string" ? re : re.source;
|
|
9
|
+
const isPrimitive = (v) => typeof v === "string" || typeof v === "number" || typeof v === "boolean";
|
|
10
|
+
const mongoDbToRqbOperatorMap = {
|
|
11
|
+
$eq: "=",
|
|
12
|
+
$ne: "!=",
|
|
13
|
+
$gt: ">",
|
|
14
|
+
$gte: ">=",
|
|
15
|
+
$lt: "<",
|
|
16
|
+
$lte: "<="
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/utils/parseMongoDB/parseMongoDB.ts
|
|
21
|
+
const emptyRuleGroup = {
|
|
22
|
+
combinator: "and",
|
|
23
|
+
rules: []
|
|
24
|
+
};
|
|
25
|
+
function parseMongoDB(mongoDbRules, options = {}) {
|
|
26
|
+
const listsAsArrays = !!options.listsAsArrays;
|
|
27
|
+
const fieldsFlat = getFieldsArray(options.fields);
|
|
28
|
+
const getValueSources = options.getValueSources;
|
|
29
|
+
const additionalOperators = options.additionalOperators ?? {};
|
|
30
|
+
const preventOperatorNegation = !!options.preventOperatorNegation;
|
|
31
|
+
const { additionalOperators: _ao,...otherOptions } = options;
|
|
32
|
+
const fieldIsValid = (fieldName, operator, subordinateFieldName) => fieldIsValidUtil({
|
|
33
|
+
fieldName,
|
|
34
|
+
fieldsFlat,
|
|
35
|
+
operator,
|
|
36
|
+
subordinateFieldName,
|
|
37
|
+
getValueSources
|
|
38
|
+
});
|
|
39
|
+
function processMongoDbQueryBooleanOperator(field, mdbOperator, keyValue) {
|
|
40
|
+
let operator = "=";
|
|
41
|
+
let value = "";
|
|
42
|
+
// istanbul ignore else
|
|
43
|
+
if (mdbOperator === "$eq" || mdbOperator === "$ne" || mdbOperator === "$gt" || mdbOperator === "$gte" || mdbOperator === "$lt" || mdbOperator === "$lte") if (mdbOperator === "$ne" && keyValue === null) {
|
|
44
|
+
if (fieldIsValid(field, "notNull")) return {
|
|
45
|
+
field,
|
|
46
|
+
operator: "notNull",
|
|
47
|
+
value: null
|
|
48
|
+
};
|
|
49
|
+
} else {
|
|
50
|
+
operator = mongoDbToRqbOperatorMap[mdbOperator];
|
|
51
|
+
if (fieldIsValid(field, operator)) return {
|
|
52
|
+
field,
|
|
53
|
+
operator,
|
|
54
|
+
value: keyValue
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
else if (mdbOperator === "$regex" && /^[^$^]$|^[^^].*[^$]$/.test(getRegExStr(keyValue))) {
|
|
58
|
+
if (fieldIsValid(field, "contains")) return {
|
|
59
|
+
field,
|
|
60
|
+
operator: "contains",
|
|
61
|
+
value: getRegExStr(keyValue)
|
|
62
|
+
};
|
|
63
|
+
} else if (mdbOperator === "$regex" && /^\^.*[^$]/.test(getRegExStr(keyValue))) {
|
|
64
|
+
if (fieldIsValid(field, "beginsWith")) return {
|
|
65
|
+
field,
|
|
66
|
+
operator: "beginsWith",
|
|
67
|
+
value: getRegExStr(keyValue).replace(/^\^/, "")
|
|
68
|
+
};
|
|
69
|
+
} else if (mdbOperator === "$regex" && /[^^].*\$/.test(getRegExStr(keyValue))) {
|
|
70
|
+
if (fieldIsValid(field, "endsWith")) return {
|
|
71
|
+
field,
|
|
72
|
+
operator: "endsWith",
|
|
73
|
+
value: getRegExStr(keyValue).replace(/\$$/, "")
|
|
74
|
+
};
|
|
75
|
+
} else if (mdbOperator === "$in" && Array.isArray(keyValue)) {
|
|
76
|
+
if (fieldIsValid(field, "in")) {
|
|
77
|
+
value = listsAsArrays ? keyValue : joinWith(keyValue.map((v) => `${v}`), ",");
|
|
78
|
+
return {
|
|
79
|
+
field,
|
|
80
|
+
operator: "in",
|
|
81
|
+
value
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
} else if (mdbOperator === "$nin" && Array.isArray(keyValue) && fieldIsValid(field, "notIn")) {
|
|
85
|
+
value = listsAsArrays ? keyValue : joinWith(keyValue.map((v) => `${v}`), ",");
|
|
86
|
+
return {
|
|
87
|
+
field,
|
|
88
|
+
operator: "notIn",
|
|
89
|
+
value
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
function processMongoDbQueryObjectKey(key, keyValue) {
|
|
95
|
+
let field = "";
|
|
96
|
+
// istanbul ignore else
|
|
97
|
+
if (key === "$and") {
|
|
98
|
+
if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => isPojo(v))) return false;
|
|
99
|
+
if (keyValue.length === 2 && keyValue.every((kv) => objectKeys(kv).length === 1)) {
|
|
100
|
+
const [rule1, rule2] = keyValue;
|
|
101
|
+
const [ruleKey1, ruleKey2] = keyValue.map((kv) => objectKeys(kv)[0]);
|
|
102
|
+
if (ruleKey1 === ruleKey2 && isPojo(rule1[ruleKey1]) && objectKeys(rule1[ruleKey1]).length === 1 && isPojo(rule2[ruleKey2]) && 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)) {
|
|
103
|
+
const [val1, val2] = [rule1[ruleKey1].$gte ?? rule1[ruleKey1].$lte, rule2[ruleKey2].$lte ?? rule2[ruleKey2].$gte];
|
|
104
|
+
let value = listsAsArrays ? [val1, val2] : joinWith([val1, val2], ",");
|
|
105
|
+
if (val1 > val2) value = listsAsArrays ? [val2, val1] : joinWith([val2, val1], ",");
|
|
106
|
+
return {
|
|
107
|
+
field: ruleKey1,
|
|
108
|
+
operator: "between",
|
|
109
|
+
value
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const rules = keyValue.map((l) => processMongoDbQueryObject(l)).filter(Boolean);
|
|
114
|
+
return rules.length > 0 ? {
|
|
115
|
+
combinator: "and",
|
|
116
|
+
rules
|
|
117
|
+
} : false;
|
|
118
|
+
} else if (key === "$or") {
|
|
119
|
+
if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => isPojo(v))) return false;
|
|
120
|
+
if (keyValue.length === 2 && keyValue.every((kv) => objectKeys(kv).length === 1)) {
|
|
121
|
+
const [rule1, rule2] = keyValue;
|
|
122
|
+
const [ruleKey1, ruleKey2] = keyValue.map((kv) => objectKeys(kv)[0]);
|
|
123
|
+
if (ruleKey1 === ruleKey2 && isPojo(rule1[ruleKey1]) && objectKeys(rule1[ruleKey1]).length === 1 && isPojo(rule2[ruleKey2]) && 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)) {
|
|
124
|
+
const [val1, val2] = [rule1[ruleKey1].$gt ?? rule1[ruleKey1].$lt, rule2[ruleKey2].$lt ?? rule2[ruleKey2].$gt];
|
|
125
|
+
let value = listsAsArrays ? [val1, val2] : `${val1},${val2}`;
|
|
126
|
+
if (val1 > val2) value = listsAsArrays ? [val2, val1] : `${val2},${val1}`;
|
|
127
|
+
return {
|
|
128
|
+
field: ruleKey1,
|
|
129
|
+
operator: "notBetween",
|
|
130
|
+
value
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const rules = keyValue.map((l) => processMongoDbQueryObject(l)).filter(Boolean);
|
|
135
|
+
return rules.length > 0 ? {
|
|
136
|
+
combinator: "or",
|
|
137
|
+
rules
|
|
138
|
+
} : false;
|
|
139
|
+
} else if (key === "$not" && isPojo(keyValue)) {
|
|
140
|
+
const ruleOrGroup = processMongoDbQueryObject(keyValue);
|
|
141
|
+
if (ruleOrGroup) {
|
|
142
|
+
if (isRuleGroupType(ruleOrGroup)) return ruleOrGroup.not ? {
|
|
143
|
+
combinator: "and",
|
|
144
|
+
rules: [ruleOrGroup],
|
|
145
|
+
not: true
|
|
146
|
+
} : {
|
|
147
|
+
...ruleOrGroup,
|
|
148
|
+
not: true
|
|
149
|
+
};
|
|
150
|
+
return preventOperatorNegation ? {
|
|
151
|
+
combinator: "and",
|
|
152
|
+
rules: [ruleOrGroup],
|
|
153
|
+
not: true
|
|
154
|
+
} : {
|
|
155
|
+
...ruleOrGroup,
|
|
156
|
+
operator: defaultOperatorNegationMap[ruleOrGroup.operator]
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
} else if (key === "$expr") {
|
|
161
|
+
const op = objectKeys(keyValue)[0];
|
|
162
|
+
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("$")) {
|
|
163
|
+
field = keyValue[op][0].replace(/^\$/, "");
|
|
164
|
+
const val = keyValue[op][1];
|
|
165
|
+
if (typeof val === "string" && val.startsWith("$") || Array.isArray(val) && val.every((v) => typeof v === "string") && val.every((v) => v.startsWith("$"))) {
|
|
166
|
+
const valForProcessing = Array.isArray(val) ? val.map((v) => v.replace(/^\$/, "")) : val.replace(/^\$/, "");
|
|
167
|
+
const tempRule = processMongoDbQueryBooleanOperator(field, op, valForProcessing);
|
|
168
|
+
if (tempRule) {
|
|
169
|
+
if (typeof tempRule.value === "string" && !fieldIsValid(field, tempRule.operator, tempRule.value)) return false;
|
|
170
|
+
return {
|
|
171
|
+
...tempRule,
|
|
172
|
+
valueSource: "field"
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return processMongoDbQueryBooleanOperator(field, op, keyValue[op][1]);
|
|
177
|
+
}
|
|
178
|
+
} else if (/^[^$]/.test(key)) {
|
|
179
|
+
field = key;
|
|
180
|
+
if (isPrimitive(keyValue)) {
|
|
181
|
+
if (fieldIsValid(field, "=")) return {
|
|
182
|
+
field,
|
|
183
|
+
operator: "=",
|
|
184
|
+
value: keyValue
|
|
185
|
+
};
|
|
186
|
+
} else if (keyValue === null) {
|
|
187
|
+
if (fieldIsValid(field, "null")) return {
|
|
188
|
+
field,
|
|
189
|
+
operator: "null",
|
|
190
|
+
value: keyValue
|
|
191
|
+
};
|
|
192
|
+
} else if (isPojo(keyValue)) {
|
|
193
|
+
let betweenRule = false;
|
|
194
|
+
let notRule = false;
|
|
195
|
+
const allOps = [
|
|
196
|
+
"eq",
|
|
197
|
+
"ne",
|
|
198
|
+
"gte?",
|
|
199
|
+
"lte?",
|
|
200
|
+
"n?in",
|
|
201
|
+
"regex",
|
|
202
|
+
"not",
|
|
203
|
+
...objectKeys(additionalOperators).map((o) => o.replace(/^\$/, ""))
|
|
204
|
+
];
|
|
205
|
+
const acceptedOpsRegExp = /* @__PURE__ */ new RegExp(`^\\$(${allOps.join("|")})$`);
|
|
206
|
+
const operators = objectKeys(keyValue).filter((o) => acceptedOpsRegExp.test(o)).sort();
|
|
207
|
+
if (operators.length === 0) return false;
|
|
208
|
+
if ("$not" in keyValue && isPojo(keyValue.$not)) {
|
|
209
|
+
const invertedNotRule = processMongoDbQueryObject({ [field]: keyValue.$not });
|
|
210
|
+
if (invertedNotRule) if (isRuleGroupType(invertedNotRule)) notRule = {
|
|
211
|
+
...invertedNotRule,
|
|
212
|
+
not: true
|
|
213
|
+
};
|
|
214
|
+
else notRule = preventOperatorNegation ? {
|
|
215
|
+
combinator: "and",
|
|
216
|
+
rules: [invertedNotRule],
|
|
217
|
+
not: true
|
|
218
|
+
} : {
|
|
219
|
+
...invertedNotRule,
|
|
220
|
+
operator: defaultOperatorNegationMap[invertedNotRule.operator]
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
if ("$gte" in keyValue && "$lte" in keyValue) betweenRule = {
|
|
224
|
+
field,
|
|
225
|
+
operator: "between",
|
|
226
|
+
value: listsAsArrays ? [keyValue.$gte, keyValue.$lte] : `${keyValue.$gte},${keyValue.$lte}`
|
|
227
|
+
};
|
|
228
|
+
const rules = operators.filter((op) => !(notRule && op === "$not")).filter((op) => !(betweenRule && (op === "$gte" || op === "$lte"))).map((op) => op in additionalOperators && typeof additionalOperators[op] === "function" ? additionalOperators[op](field, op, keyValue[op], otherOptions) : processMongoDbQueryBooleanOperator(field, op, keyValue[op])).filter(Boolean);
|
|
229
|
+
if (notRule) rules.unshift(notRule);
|
|
230
|
+
if (betweenRule) rules.unshift(betweenRule);
|
|
231
|
+
if (rules.length === 0) return false;
|
|
232
|
+
if (rules.length === 1) return rules[0];
|
|
233
|
+
return {
|
|
234
|
+
combinator: "and",
|
|
235
|
+
rules
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
function processMongoDbQueryObject(mongoDbQueryObject) {
|
|
242
|
+
const rules = objectKeys(mongoDbQueryObject).map((k) => processMongoDbQueryObjectKey(k, mongoDbQueryObject[k])).filter(Boolean);
|
|
243
|
+
return rules.length === 1 ? rules[0] : rules.length > 1 ? {
|
|
244
|
+
combinator: "and",
|
|
245
|
+
rules
|
|
246
|
+
} : false;
|
|
247
|
+
}
|
|
248
|
+
const prepare = options.generateIDs ? prepareRuleGroup : (g) => g;
|
|
249
|
+
let mongoDbPOJO = mongoDbRules;
|
|
250
|
+
if (typeof mongoDbRules === "string") try {
|
|
251
|
+
mongoDbPOJO = JSON.parse(mongoDbRules);
|
|
252
|
+
} catch {
|
|
253
|
+
return prepare(emptyRuleGroup);
|
|
254
|
+
}
|
|
255
|
+
if (!isPojo(mongoDbPOJO)) return prepare(emptyRuleGroup);
|
|
256
|
+
const result = processMongoDbQueryObject(mongoDbPOJO);
|
|
257
|
+
const finalQuery = result ? isRuleGroupType(result) ? result : {
|
|
258
|
+
combinator: "and",
|
|
259
|
+
rules: [result]
|
|
260
|
+
} : emptyRuleGroup;
|
|
261
|
+
return prepare(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
//#endregion
|
|
265
|
+
export { parseMongoDB };
|
|
266
|
+
//# sourceMappingURL=parseMongoDB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseMongoDB.mjs","names":["mongoDbToRqbOperatorMap: Partial<\n Record<MongoDbSupportedOperators, DefaultOperatorName>\n>","emptyRuleGroup: DefaultRuleGroupType","operator: DefaultOperatorName","value: any","betweenRule: DefaultRuleType | false","notRule: DefaultRuleType | DefaultRuleGroupType | false","finalQuery: DefaultRuleGroupType"],"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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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { numericQuantity } from "numeric-quantity";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/parseNumber.ts
|
|
4
|
+
/**
|
|
5
|
+
* Converts a string to a number. Uses native `parseFloat` if `parseNumbers` is "native",
|
|
6
|
+
* otherwise uses [`numeric-quantity`](https://jakeboone02.github.io/numeric-quantity/).
|
|
7
|
+
* If that returns `NaN`, the string is returned unchanged. Numeric values are returned
|
|
8
|
+
* as-is regardless of the `parseNumbers` option.
|
|
9
|
+
*/
|
|
10
|
+
const parseNumber = (val, { parseNumbers, bigIntOnOverflow } = {}) => {
|
|
11
|
+
if (!parseNumbers || typeof val === "bigint" || typeof val === "number") return val;
|
|
12
|
+
if (parseNumbers === "native") return Number.parseFloat(val);
|
|
13
|
+
const valAsNum = numericQuantity(val, {
|
|
14
|
+
allowTrailingInvalid: parseNumbers === "enhanced",
|
|
15
|
+
bigIntOnOverflow,
|
|
16
|
+
romanNumerals: false,
|
|
17
|
+
round: false
|
|
18
|
+
});
|
|
19
|
+
return typeof valAsNum === "bigint" || !Number.isNaN(valAsNum) ? valAsNum : val;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { parseNumber };
|
|
24
|
+
//# sourceMappingURL=parseNumber-B_-sR6d5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseNumber-B_-sR6d5.mjs","names":["valAsNum: number | bigint"],"sources":["../src/utils/parseNumber.ts"],"sourcesContent":["import { numericQuantity } from 'numeric-quantity';\nimport type { ParseNumberMethod } from '../types';\n\n/**\n * Options object for {@link parseNumber}.\n */\nexport interface ParseNumberOptions {\n parseNumbers?: ParseNumberMethod;\n /**\n * Generates a `bigint` value if the string represents a valid integer\n * outside the safe boundaries of the `number` type.\n */\n bigIntOnOverflow?: boolean;\n}\n\n/**\n * Converts a string to a number. Uses native `parseFloat` if `parseNumbers` is \"native\",\n * otherwise uses [`numeric-quantity`](https://jakeboone02.github.io/numeric-quantity/).\n * If that returns `NaN`, the string is returned unchanged. Numeric values are returned\n * as-is regardless of the `parseNumbers` option.\n */\nexport const parseNumber = (\n // oxlint-disable-next-line typescript/no-explicit-any\n val: any,\n { parseNumbers, bigIntOnOverflow }: ParseNumberOptions = {}\n // oxlint-disable-next-line typescript/no-explicit-any\n): any => {\n if (!parseNumbers || typeof val === 'bigint' || typeof val === 'number') {\n return val;\n }\n\n if (parseNumbers === 'native') {\n return Number.parseFloat(val);\n }\n\n const valAsNum: number | bigint =\n // TODO: Should these options be configurable?\n numericQuantity(val, {\n allowTrailingInvalid: parseNumbers === 'enhanced',\n bigIntOnOverflow,\n romanNumerals: false,\n round: false,\n });\n\n return typeof valAsNum === 'bigint' || !Number.isNaN(valAsNum) ? valAsNum : val;\n};\n"],"mappings":";;;;;;;;;AAqBA,MAAa,eAEX,KACA,EAAE,cAAc,qBAAyC,EAAE,KAEnD;AACR,KAAI,CAAC,gBAAgB,OAAO,QAAQ,YAAY,OAAO,QAAQ,SAC7D,QAAO;AAGT,KAAI,iBAAiB,SACnB,QAAO,OAAO,WAAW,IAAI;CAG/B,MAAMA,WAEJ,gBAAgB,KAAK;EACnB,sBAAsB,iBAAiB;EACvC;EACA,eAAe;EACf,OAAO;EACR,CAAC;AAEJ,QAAO,OAAO,aAAa,YAAY,CAAC,OAAO,MAAM,SAAS,GAAG,WAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseNumber-
|
|
1
|
+
{"version":3,"file":"parseNumber-D4iQDxK-.js","names":["valAsNum: number | bigint"],"sources":["../src/utils/parseNumber.ts"],"sourcesContent":["import { numericQuantity } from 'numeric-quantity';\nimport type { ParseNumberMethod } from '../types';\n\n/**\n * Options object for {@link parseNumber}.\n */\nexport interface ParseNumberOptions {\n parseNumbers?: ParseNumberMethod;\n /**\n * Generates a `bigint` value if the string represents a valid integer\n * outside the safe boundaries of the `number` type.\n */\n bigIntOnOverflow?: boolean;\n}\n\n/**\n * Converts a string to a number. Uses native `parseFloat` if `parseNumbers` is \"native\",\n * otherwise uses [`numeric-quantity`](https://jakeboone02.github.io/numeric-quantity/).\n * If that returns `NaN`, the string is returned unchanged. Numeric values are returned\n * as-is regardless of the `parseNumbers` option.\n */\nexport const parseNumber = (\n // oxlint-disable-next-line typescript/no-explicit-any\n val: any,\n { parseNumbers, bigIntOnOverflow }: ParseNumberOptions = {}\n // oxlint-disable-next-line typescript/no-explicit-any\n): any => {\n if (!parseNumbers || typeof val === 'bigint' || typeof val === 'number') {\n return val;\n }\n\n if (parseNumbers === 'native') {\n return Number.parseFloat(val);\n }\n\n const valAsNum: number | bigint =\n // TODO: Should these options be configurable?\n numericQuantity(val, {\n allowTrailingInvalid: parseNumbers === 'enhanced',\n bigIntOnOverflow,\n romanNumerals: false,\n round: false,\n });\n\n return typeof valAsNum === 'bigint' || !Number.isNaN(valAsNum) ? valAsNum : val;\n};\n"],"mappings":";;;;;;;;;;;AAqBA,MAAa,eAEX,KACA,EAAE,cAAc,qBAAyC,EAAE,KAEnD;AACR,KAAI,CAAC,gBAAgB,OAAO,QAAQ,YAAY,OAAO,QAAQ,SAC7D,QAAO;AAGT,KAAI,iBAAiB,SACnB,QAAO,OAAO,WAAW,IAAI;CAG/B,MAAMA,iDAEY,KAAK;EACnB,sBAAsB,iBAAiB;EACvC;EACA,eAAe;EACf,OAAO;EACR,CAAC;AAEJ,QAAO,OAAO,aAAa,YAAY,CAAC,OAAO,MAAM,SAAS,GAAG,WAAW"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { DefaultRuleGroupType, DefaultRuleGroupTypeIC } from "./basic-BmpEwexQ.mjs";
|
|
2
|
+
import { ParserCommonOptions } from "./import-Dxevzw_-.mjs";
|
|
3
|
+
import { Except } from "type-fest";
|
|
4
|
+
|
|
5
|
+
//#region src/utils/parseSQL/parseSQL.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Options object for {@link parseSQL}.
|
|
9
|
+
*/
|
|
10
|
+
interface ParseSQLOptions extends ParserCommonOptions {
|
|
11
|
+
paramPrefix?: string;
|
|
12
|
+
params?: any[] | Record<string, any>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Converts a SQL `SELECT` statement into a query suitable for the
|
|
16
|
+
* {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
|
|
17
|
+
* ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
|
|
18
|
+
*/
|
|
19
|
+
declare function parseSQL(sql: string): DefaultRuleGroupType;
|
|
20
|
+
/**
|
|
21
|
+
* Converts a SQL `SELECT` statement into a query suitable for the
|
|
22
|
+
* {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
|
|
23
|
+
* ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
|
|
24
|
+
*/
|
|
25
|
+
declare function parseSQL(sql: string, options: Except<ParseSQLOptions, "independentCombinators"> & {
|
|
26
|
+
independentCombinators?: false;
|
|
27
|
+
}): DefaultRuleGroupType;
|
|
28
|
+
/**
|
|
29
|
+
* Converts a SQL `SELECT` statement into a query suitable for the
|
|
30
|
+
* {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
|
|
31
|
+
* ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
|
|
32
|
+
*/
|
|
33
|
+
declare function parseSQL(sql: string, options: Except<ParseSQLOptions, "independentCombinators"> & {
|
|
34
|
+
independentCombinators: true;
|
|
35
|
+
}): DefaultRuleGroupTypeIC;
|
|
36
|
+
//#endregion
|
|
37
|
+
export { ParseSQLOptions, parseSQL };
|
|
38
|
+
//# sourceMappingURL=parseSQL.d.mts.map
|
package/dist/parseSQL.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { DefaultRuleGroupType, DefaultRuleGroupTypeIC
|
|
2
|
-
import { ParserCommonOptions } from "./import-
|
|
1
|
+
import { DefaultRuleGroupType, DefaultRuleGroupTypeIC } from "./basic-CDDA-KZa.js";
|
|
2
|
+
import { ParserCommonOptions } from "./import-D-hm1phN.js";
|
|
3
|
+
import { Except } from "type-fest";
|
|
3
4
|
|
|
4
5
|
//#region src/utils/parseSQL/parseSQL.d.ts
|
|
5
6
|
|
package/dist/parseSQL.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const require_isRuleGroup = require('./isRuleGroup-DqAs2x4E.js');
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
require('./
|
|
5
|
-
const require_prepareQueryObjects = require('./prepareQueryObjects-
|
|
2
|
+
require('./optGroupUtils-B0hTpodo.js');
|
|
3
|
+
const require_arrayUtils = require('./arrayUtils-QxZOZTf6.js');
|
|
4
|
+
const require_parseNumber = require('./parseNumber-D4iQDxK-.js');
|
|
5
|
+
const require_prepareQueryObjects = require('./prepareQueryObjects-BOUWfel5.js');
|
|
6
6
|
|
|
7
7
|
//#region src/utils/parseSQL/sqlParser.js
|
|
8
8
|
var sqlParser = (function() {
|
|
@@ -6401,8 +6401,7 @@ function parseSQL(sql, options = {}) {
|
|
|
6401
6401
|
const processSQLExpression = (expr) => {
|
|
6402
6402
|
switch (expr.type) {
|
|
6403
6403
|
case "NotExpression": {
|
|
6404
|
-
const
|
|
6405
|
-
const rule = processSQLExpression(val);
|
|
6404
|
+
const rule = processSQLExpression(expr.value.type === "SimpleExprParentheses" ? expr.value.value.value[0] : expr.value);
|
|
6406
6405
|
if (rule) {
|
|
6407
6406
|
if (require_isRuleGroup.isRuleGroup(rule)) return {
|
|
6408
6407
|
...rule,
|
|
@@ -6536,15 +6535,12 @@ function parseSQL(sql, options = {}) {
|
|
|
6536
6535
|
const f = getFieldName(expr.left);
|
|
6537
6536
|
const valueArray = [expr.right.left, expr.right.right].map((v) => getFieldName(v));
|
|
6538
6537
|
const operator = expr.hasNot ? "notBetween" : "between";
|
|
6539
|
-
if (valueArray.every((sf) => fieldIsValid(f, operator, sf))) {
|
|
6540
|
-
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
|
|
6544
|
-
|
|
6545
|
-
valueSource: "field"
|
|
6546
|
-
};
|
|
6547
|
-
}
|
|
6538
|
+
if (valueArray.every((sf) => fieldIsValid(f, operator, sf))) return {
|
|
6539
|
+
field: f,
|
|
6540
|
+
operator,
|
|
6541
|
+
value: options?.listsAsArrays ? valueArray : require_arrayUtils.joinWith(valueArray, ", "),
|
|
6542
|
+
valueSource: "field"
|
|
6543
|
+
};
|
|
6548
6544
|
}
|
|
6549
6545
|
break;
|
|
6550
6546
|
case "LikePredicate":
|