@react-querybuilder/core 8.9.2 → 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.
Files changed (111) hide show
  1. package/dist/{arrayUtils-BF1P8iHS.mjs → arrayUtils-C9sO4qLO.mjs} +3 -75
  2. package/dist/arrayUtils-C9sO4qLO.mjs.map +1 -0
  3. package/dist/arrayUtils-QxZOZTf6.js +73 -0
  4. package/dist/arrayUtils-QxZOZTf6.js.map +1 -0
  5. package/dist/basic-BmpEwexQ.d.mts +363 -0
  6. package/dist/basic-CDDA-KZa.d.ts +363 -0
  7. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +553 -1247
  8. package/dist/cjs/react-querybuilder_core.cjs.development.js +408 -121
  9. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  10. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +553 -1247
  11. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  12. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  13. package/dist/{convertQuery-H7RhQiIc.mjs → convertQuery-BUgyz1GA.mjs} +2 -2
  14. package/dist/{convertQuery-H7RhQiIc.mjs.map → convertQuery-BUgyz1GA.mjs.map} +1 -1
  15. package/dist/{export-r-V7bU31.d.mts → export-Ccjfea21.d.mts} +3 -2
  16. package/dist/{export-DyrnTh6K.d.ts → export-GUuxJ7zR.d.ts} +3 -2
  17. package/dist/formatQuery.d.mts +3 -2
  18. package/dist/formatQuery.d.ts +3 -2
  19. package/dist/formatQuery.js +217 -87
  20. package/dist/formatQuery.js.map +1 -1
  21. package/dist/formatQuery.mjs +217 -87
  22. package/dist/formatQuery.mjs.map +1 -1
  23. package/dist/{import-Cksobmln.d.ts → import-D-hm1phN.d.ts} +2 -2
  24. package/dist/{import-BwbbP4oU.d.mts → import-Dxevzw_-.d.mts} +2 -2
  25. package/dist/{isRuleGroup-CnhYpLOM.mjs → isRuleGroup-CGe_rb2w.mjs} +1 -1
  26. package/dist/{isRuleGroup-CnhYpLOM.mjs.map → isRuleGroup-CGe_rb2w.mjs.map} +1 -1
  27. package/dist/{optGroupUtils-CXLgyg2i.js → optGroupUtils-B0hTpodo.js} +114 -1
  28. package/dist/optGroupUtils-B0hTpodo.js.map +1 -0
  29. package/dist/{optGroupUtils-Duv-M8rf.mjs → optGroupUtils-DrubUpx0.mjs} +86 -3
  30. package/dist/optGroupUtils-DrubUpx0.mjs.map +1 -0
  31. package/dist/parseCEL.d.mts +292 -11
  32. package/dist/parseCEL.d.ts +292 -11
  33. package/dist/parseCEL.js +114 -30
  34. package/dist/parseCEL.js.map +1 -1
  35. package/dist/parseCEL.mjs +69 -31
  36. package/dist/parseCEL.mjs.map +1 -1
  37. package/dist/parseJSONata.d.mts +3 -2
  38. package/dist/parseJSONata.d.ts +3 -2
  39. package/dist/parseJSONata.js +49 -77
  40. package/dist/parseJSONata.js.map +1 -1
  41. package/dist/parseJSONata.mjs +4 -5
  42. package/dist/parseJSONata.mjs.map +1 -1
  43. package/dist/parseJsonLogic.d.mts +4 -3
  44. package/dist/parseJsonLogic.d.ts +4 -3
  45. package/dist/parseJsonLogic.js +5 -6
  46. package/dist/parseJsonLogic.js.map +1 -1
  47. package/dist/parseJsonLogic.mjs +5 -6
  48. package/dist/parseJsonLogic.mjs.map +1 -1
  49. package/dist/parseMongoDB.d.mts +3 -2
  50. package/dist/parseMongoDB.d.ts +3 -2
  51. package/dist/parseMongoDB.js +15 -16
  52. package/dist/parseMongoDB.js.map +1 -1
  53. package/dist/parseMongoDB.mjs +5 -6
  54. package/dist/parseMongoDB.mjs.map +1 -1
  55. package/dist/{parseNumber-BtGKa58z.mjs → parseNumber-B_-sR6d5.mjs} +1 -1
  56. package/dist/{parseNumber-BtGKa58z.mjs.map → parseNumber-B_-sR6d5.mjs.map} +1 -1
  57. package/dist/{parseNumber-Bcys1kOH.js → parseNumber-D4iQDxK-.js} +1 -1
  58. package/dist/{parseNumber-Bcys1kOH.js.map → parseNumber-D4iQDxK-.js.map} +1 -1
  59. package/dist/parseSQL.d.mts +3 -2
  60. package/dist/parseSQL.d.ts +3 -2
  61. package/dist/parseSQL.js +11 -15
  62. package/dist/parseSQL.js.map +1 -1
  63. package/dist/parseSQL.mjs +12 -16
  64. package/dist/parseSQL.mjs.map +1 -1
  65. package/dist/parseSpEL.d.mts +3 -2
  66. package/dist/parseSpEL.d.ts +3 -2
  67. package/dist/parseSpEL.js +7 -9
  68. package/dist/parseSpEL.js.map +1 -1
  69. package/dist/parseSpEL.mjs +5 -6
  70. package/dist/parseSpEL.mjs.map +1 -1
  71. package/dist/{prepareQueryObjects-BqFEs4eV.js → prepareQueryObjects-BOUWfel5.js} +4 -5
  72. package/dist/prepareQueryObjects-BOUWfel5.js.map +1 -0
  73. package/dist/{prepareQueryObjects-CS6Wmhmf.mjs → prepareQueryObjects-CJNpnGcJ.mjs} +5 -6
  74. package/dist/prepareQueryObjects-CJNpnGcJ.mjs.map +1 -0
  75. package/dist/query-builder-layout.css +1 -1
  76. package/dist/query-builder-layout.css.map +1 -1
  77. package/dist/query-builder.css +1 -1
  78. package/dist/query-builder.css.map +1 -1
  79. package/dist/react-querybuilder_core.d.mts +553 -1247
  80. package/dist/react-querybuilder_core.legacy-esm.d.ts +553 -1247
  81. package/dist/react-querybuilder_core.legacy-esm.js +412 -119
  82. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  83. package/dist/react-querybuilder_core.mjs +405 -122
  84. package/dist/react-querybuilder_core.mjs.map +1 -1
  85. package/dist/react-querybuilder_core.production.d.mts +553 -1247
  86. package/dist/react-querybuilder_core.production.mjs +1 -1
  87. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  88. package/dist/styles/_layout.scss +61 -17
  89. package/dist/styles/_main.scss +17 -4
  90. package/dist/{transformQuery-FL_nlpp5.js → transformQuery-CWDPogO5.js} +1 -1
  91. package/dist/{transformQuery-FL_nlpp5.js.map → transformQuery-CWDPogO5.js.map} +1 -1
  92. package/dist/{transformQuery-DdMvmrCh.mjs → transformQuery-DHvtgDgZ.mjs} +2 -2
  93. package/dist/{transformQuery-DdMvmrCh.mjs.map → transformQuery-DHvtgDgZ.mjs.map} +1 -1
  94. package/dist/transformQuery.d.mts +1 -1
  95. package/dist/transformQuery.d.ts +1 -1
  96. package/dist/transformQuery.js +1 -1
  97. package/dist/transformQuery.mjs +2 -2
  98. package/package.json +14 -12
  99. package/dist/arrayUtils-BF1P8iHS.mjs.map +0 -1
  100. package/dist/arrayUtils-D5EoIsKP.js +0 -164
  101. package/dist/arrayUtils-D5EoIsKP.js.map +0 -1
  102. package/dist/basic-BfD-7CN3.d.mts +0 -1235
  103. package/dist/basic-C8xXKHIA.d.ts +0 -1235
  104. package/dist/objectUtils-BBZSfZJz.js +0 -17
  105. package/dist/objectUtils-BBZSfZJz.js.map +0 -1
  106. package/dist/objectUtils-BtWdcZVG.mjs +0 -11
  107. package/dist/objectUtils-BtWdcZVG.mjs.map +0 -1
  108. package/dist/optGroupUtils-CXLgyg2i.js.map +0 -1
  109. package/dist/optGroupUtils-Duv-M8rf.mjs.map +0 -1
  110. package/dist/prepareQueryObjects-BqFEs4eV.js.map +0 -1
  111. package/dist/prepareQueryObjects-CS6Wmhmf.mjs.map +0 -1
@@ -1,9 +1,8 @@
1
1
  const require_isRuleGroup = require('./isRuleGroup-DqAs2x4E.js');
2
- const require_arrayUtils = require('./arrayUtils-D5EoIsKP.js');
3
- require('./optGroupUtils-CXLgyg2i.js');
2
+ const require_optGroupUtils = require('./optGroupUtils-B0hTpodo.js');
3
+ const require_arrayUtils = require('./arrayUtils-QxZOZTf6.js');
4
4
  const require_convertQuery = require('./convertQuery-DAqoID3O.js');
5
- const require_prepareQueryObjects = require('./prepareQueryObjects-BqFEs4eV.js');
6
- const require_objectUtils = require('./objectUtils-BBZSfZJz.js');
5
+ const require_prepareQueryObjects = require('./prepareQueryObjects-BOUWfel5.js');
7
6
 
8
7
  //#region src/utils/parseMongoDB/utils.ts
9
8
  const getRegExStr = (re) => typeof re === "string" ? re : re.source;
@@ -97,10 +96,10 @@ function parseMongoDB(mongoDbRules, options = {}) {
97
96
  // istanbul ignore else
98
97
  if (key === "$and") {
99
98
  if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => require_isRuleGroup.isPojo(v))) return false;
100
- if (keyValue.length === 2 && keyValue.every((kv) => require_objectUtils.objectKeys(kv).length === 1)) {
99
+ if (keyValue.length === 2 && keyValue.every((kv) => require_optGroupUtils.objectKeys(kv).length === 1)) {
101
100
  const [rule1, rule2] = keyValue;
102
- const [ruleKey1, ruleKey2] = keyValue.map((kv) => require_objectUtils.objectKeys(kv)[0]);
103
- if (ruleKey1 === ruleKey2 && require_isRuleGroup.isPojo(rule1[ruleKey1]) && require_objectUtils.objectKeys(rule1[ruleKey1]).length === 1 && require_isRuleGroup.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
+ const [ruleKey1, ruleKey2] = keyValue.map((kv) => require_optGroupUtils.objectKeys(kv)[0]);
102
+ if (ruleKey1 === ruleKey2 && require_isRuleGroup.isPojo(rule1[ruleKey1]) && require_optGroupUtils.objectKeys(rule1[ruleKey1]).length === 1 && require_isRuleGroup.isPojo(rule2[ruleKey2]) && require_optGroupUtils.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)) {
104
103
  const [val1, val2] = [rule1[ruleKey1].$gte ?? rule1[ruleKey1].$lte, rule2[ruleKey2].$lte ?? rule2[ruleKey2].$gte];
105
104
  let value = listsAsArrays ? [val1, val2] : require_arrayUtils.joinWith([val1, val2], ",");
106
105
  if (val1 > val2) value = listsAsArrays ? [val2, val1] : require_arrayUtils.joinWith([val2, val1], ",");
@@ -118,10 +117,10 @@ function parseMongoDB(mongoDbRules, options = {}) {
118
117
  } : false;
119
118
  } else if (key === "$or") {
120
119
  if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => require_isRuleGroup.isPojo(v))) return false;
121
- if (keyValue.length === 2 && keyValue.every((kv) => require_objectUtils.objectKeys(kv).length === 1)) {
120
+ if (keyValue.length === 2 && keyValue.every((kv) => require_optGroupUtils.objectKeys(kv).length === 1)) {
122
121
  const [rule1, rule2] = keyValue;
123
- const [ruleKey1, ruleKey2] = keyValue.map((kv) => require_objectUtils.objectKeys(kv)[0]);
124
- if (ruleKey1 === ruleKey2 && require_isRuleGroup.isPojo(rule1[ruleKey1]) && require_objectUtils.objectKeys(rule1[ruleKey1]).length === 1 && require_isRuleGroup.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
+ const [ruleKey1, ruleKey2] = keyValue.map((kv) => require_optGroupUtils.objectKeys(kv)[0]);
123
+ if (ruleKey1 === ruleKey2 && require_isRuleGroup.isPojo(rule1[ruleKey1]) && require_optGroupUtils.objectKeys(rule1[ruleKey1]).length === 1 && require_isRuleGroup.isPojo(rule2[ruleKey2]) && require_optGroupUtils.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)) {
125
124
  const [val1, val2] = [rule1[ruleKey1].$gt ?? rule1[ruleKey1].$lt, rule2[ruleKey2].$lt ?? rule2[ruleKey2].$gt];
126
125
  let value = listsAsArrays ? [val1, val2] : `${val1},${val2}`;
127
126
  if (val1 > val2) value = listsAsArrays ? [val2, val1] : `${val2},${val1}`;
@@ -154,12 +153,12 @@ function parseMongoDB(mongoDbRules, options = {}) {
154
153
  not: true
155
154
  } : {
156
155
  ...ruleOrGroup,
157
- operator: require_arrayUtils.defaultOperatorNegationMap[ruleOrGroup.operator]
156
+ operator: require_optGroupUtils.defaultOperatorNegationMap[ruleOrGroup.operator]
158
157
  };
159
158
  }
160
159
  return false;
161
160
  } else if (key === "$expr") {
162
- const op = require_objectUtils.objectKeys(keyValue)[0];
161
+ const op = require_optGroupUtils.objectKeys(keyValue)[0];
163
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("$")) {
164
163
  field = keyValue[op][0].replace(/^\$/, "");
165
164
  const val = keyValue[op][1];
@@ -201,10 +200,10 @@ function parseMongoDB(mongoDbRules, options = {}) {
201
200
  "n?in",
202
201
  "regex",
203
202
  "not",
204
- ...require_objectUtils.objectKeys(additionalOperators).map((o) => o.replace(/^\$/, ""))
203
+ ...require_optGroupUtils.objectKeys(additionalOperators).map((o) => o.replace(/^\$/, ""))
205
204
  ];
206
205
  const acceptedOpsRegExp = /* @__PURE__ */ new RegExp(`^\\$(${allOps.join("|")})$`);
207
- const operators = require_objectUtils.objectKeys(keyValue).filter((o) => acceptedOpsRegExp.test(o)).sort();
206
+ const operators = require_optGroupUtils.objectKeys(keyValue).filter((o) => acceptedOpsRegExp.test(o)).sort();
208
207
  if (operators.length === 0) return false;
209
208
  if ("$not" in keyValue && require_isRuleGroup.isPojo(keyValue.$not)) {
210
209
  const invertedNotRule = processMongoDbQueryObject({ [field]: keyValue.$not });
@@ -218,7 +217,7 @@ function parseMongoDB(mongoDbRules, options = {}) {
218
217
  not: true
219
218
  } : {
220
219
  ...invertedNotRule,
221
- operator: require_arrayUtils.defaultOperatorNegationMap[invertedNotRule.operator]
220
+ operator: require_optGroupUtils.defaultOperatorNegationMap[invertedNotRule.operator]
222
221
  };
223
222
  }
224
223
  if ("$gte" in keyValue && "$lte" in keyValue) betweenRule = {
@@ -240,7 +239,7 @@ function parseMongoDB(mongoDbRules, options = {}) {
240
239
  return false;
241
240
  }
242
241
  function processMongoDbQueryObject(mongoDbQueryObject) {
243
- const rules = require_objectUtils.objectKeys(mongoDbQueryObject).map((k) => processMongoDbQueryObjectKey(k, mongoDbQueryObject[k])).filter(Boolean);
242
+ const rules = require_optGroupUtils.objectKeys(mongoDbQueryObject).map((k) => processMongoDbQueryObjectKey(k, mongoDbQueryObject[k])).filter(Boolean);
244
243
  return rules.length === 1 ? rules[0] : rules.length > 1 ? {
245
244
  combinator: "and",
246
245
  rules
@@ -1 +1 @@
1
- {"version":3,"file":"parseMongoDB.js","names":["mongoDbToRqbOperatorMap: Partial<\n Record<MongoDbSupportedOperators, DefaultOperatorName>\n>","emptyRuleGroup: DefaultRuleGroupType","getFieldsArray","fieldIsValidUtil","operator: DefaultOperatorName","value: any","joinWith","isPojo","objectKeys","isRuleGroupType","defaultOperatorNegationMap","betweenRule: DefaultRuleType | false","notRule: DefaultRuleType | DefaultRuleGroupType | false","prepareRuleGroup","finalQuery: DefaultRuleGroupType","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 { defaultOperatorNegationMap } from '../../defaults';\nimport type {\n DefaultOperatorName,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n Except,\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 .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":["mongoDbToRqbOperatorMap: Partial<\n Record<MongoDbSupportedOperators, DefaultOperatorName>\n>","emptyRuleGroup: DefaultRuleGroupType","getFieldsArray","fieldIsValidUtil","operator: DefaultOperatorName","value: any","joinWith","isPojo","objectKeys","isRuleGroupType","defaultOperatorNegationMap","betweenRule: DefaultRuleType | false","notRule: DefaultRuleType | DefaultRuleGroupType | false","prepareRuleGroup","finalQuery: DefaultRuleGroupType","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,9 +1,8 @@
1
- import { defaultOperatorNegationMap, joinWith } from "./arrayUtils-BF1P8iHS.mjs";
2
- import { isPojo, isRuleGroupType } from "./isRuleGroup-CnhYpLOM.mjs";
3
- import "./optGroupUtils-Duv-M8rf.mjs";
4
- import { convertToIC } from "./convertQuery-H7RhQiIc.mjs";
5
- import { fieldIsValidUtil, getFieldsArray, prepareRuleGroup } from "./prepareQueryObjects-CS6Wmhmf.mjs";
6
- import { objectKeys } from "./objectUtils-BtWdcZVG.mjs";
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";
7
6
 
8
7
  //#region src/utils/parseMongoDB/utils.ts
9
8
  const getRegExStr = (re) => typeof re === "string" ? re : re.source;
@@ -1 +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 { defaultOperatorNegationMap } from '../../defaults';\nimport type {\n DefaultOperatorName,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n Except,\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 .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.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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"}
@@ -21,4 +21,4 @@ const parseNumber = (val, { parseNumbers, bigIntOnOverflow } = {}) => {
21
21
 
22
22
  //#endregion
23
23
  export { parseNumber };
24
- //# sourceMappingURL=parseNumber-BtGKa58z.mjs.map
24
+ //# sourceMappingURL=parseNumber-B_-sR6d5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseNumber-BtGKa58z.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
+ {"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"}
@@ -28,4 +28,4 @@ Object.defineProperty(exports, 'parseNumber', {
28
28
  return parseNumber;
29
29
  }
30
30
  });
31
- //# sourceMappingURL=parseNumber-Bcys1kOH.js.map
31
+ //# sourceMappingURL=parseNumber-D4iQDxK-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseNumber-Bcys1kOH.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"}
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"}
@@ -1,5 +1,6 @@
1
- import { DefaultRuleGroupType, DefaultRuleGroupTypeIC, Except } from "./basic-BfD-7CN3.mjs";
2
- import { ParserCommonOptions } from "./import-BwbbP4oU.mjs";
1
+ import { DefaultRuleGroupType, DefaultRuleGroupTypeIC } from "./basic-BmpEwexQ.mjs";
2
+ import { ParserCommonOptions } from "./import-Dxevzw_-.mjs";
3
+ import { Except } from "type-fest";
3
4
 
4
5
  //#region src/utils/parseSQL/parseSQL.d.ts
5
6
 
@@ -1,5 +1,6 @@
1
- import { DefaultRuleGroupType, DefaultRuleGroupTypeIC, Except } from "./basic-C8xXKHIA.js";
2
- import { ParserCommonOptions } from "./import-Cksobmln.js";
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
- const require_arrayUtils = require('./arrayUtils-D5EoIsKP.js');
3
- const require_parseNumber = require('./parseNumber-Bcys1kOH.js');
4
- require('./optGroupUtils-CXLgyg2i.js');
5
- const require_prepareQueryObjects = require('./prepareQueryObjects-BqFEs4eV.js');
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 val = expr.value.type === "SimpleExprParentheses" ? expr.value.value.value[0] : expr.value;
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
- const value = options?.listsAsArrays ? valueArray : require_arrayUtils.joinWith(valueArray, ", ");
6541
- return {
6542
- field: f,
6543
- operator,
6544
- value,
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":