@react-querybuilder/core 8.20.2 → 8.21.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 (108) hide show
  1. package/README.md +4 -0
  2. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +2261 -2113
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js +319 -22
  4. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  5. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +2261 -2113
  6. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  7. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  8. package/dist/{convertQuery-BJKNgecE.js → convertQuery-Cw76XFIn.js} +8 -8
  9. package/dist/{convertQuery-BJKNgecE.js.map → convertQuery-Cw76XFIn.js.map} +1 -1
  10. package/dist/{convertQuery-J1CaoDxe.mjs → convertQuery-D_4J7E-Z.mjs} +2 -2
  11. package/dist/{convertQuery-J1CaoDxe.mjs.map → convertQuery-D_4J7E-Z.mjs.map} +1 -1
  12. package/dist/formatQuery.d.mts +499 -459
  13. package/dist/formatQuery.d.ts +499 -459
  14. package/dist/formatQuery.js +170 -88
  15. package/dist/formatQuery.js.map +1 -1
  16. package/dist/formatQuery.mjs +97 -20
  17. package/dist/formatQuery.mjs.map +1 -1
  18. package/dist/import-BVdxeIBO.d.mts +26 -0
  19. package/dist/import-Ddc3d_8q.d.ts +26 -0
  20. package/dist/{index-DlVg-QXo.d.mts → index-BSwFvkeI.d.mts} +679 -648
  21. package/dist/{index-DlVg-QXo.d.ts → index-BSwFvkeI.d.ts} +679 -648
  22. package/dist/{objectUtils-DBJI82bl.js → isRuleGroup-0JNiQgLg.js} +1 -26
  23. package/dist/isRuleGroup-0JNiQgLg.js.map +1 -0
  24. package/dist/{objectUtils-ZvPkF6u6.mjs → isRuleGroup-CqLThsbu.mjs} +2 -15
  25. package/dist/isRuleGroup-CqLThsbu.mjs.map +1 -0
  26. package/dist/objectUtils-Cr02aGxb.js +27 -0
  27. package/dist/objectUtils-Cr02aGxb.js.map +1 -0
  28. package/dist/objectUtils-DBlmJgBf.mjs +16 -0
  29. package/dist/objectUtils-DBlmJgBf.mjs.map +1 -0
  30. package/dist/parseCEL.d.mts +64 -30
  31. package/dist/parseCEL.d.ts +64 -30
  32. package/dist/parseCEL.js +91 -12
  33. package/dist/parseCEL.js.map +1 -1
  34. package/dist/parseCEL.mjs +85 -8
  35. package/dist/parseCEL.mjs.map +1 -1
  36. package/dist/parseCypher.d.mts +24 -25
  37. package/dist/parseCypher.d.ts +24 -25
  38. package/dist/parseGremlin.d.mts +18 -19
  39. package/dist/parseGremlin.d.ts +18 -19
  40. package/dist/parseJSONata.d.mts +207 -20
  41. package/dist/parseJSONata.d.ts +207 -20
  42. package/dist/parseJSONata.js +92 -7
  43. package/dist/parseJSONata.js.map +1 -1
  44. package/dist/parseJSONata.mjs +80 -4
  45. package/dist/parseJSONata.mjs.map +1 -1
  46. package/dist/parseJsonLogic.d.mts +51 -18
  47. package/dist/parseJsonLogic.d.ts +51 -18
  48. package/dist/parseJsonLogic.js +95 -34
  49. package/dist/parseJsonLogic.js.map +1 -1
  50. package/dist/parseJsonLogic.mjs +65 -6
  51. package/dist/parseJsonLogic.mjs.map +1 -1
  52. package/dist/parseMongoDB.d.mts +89 -58
  53. package/dist/parseMongoDB.d.ts +89 -58
  54. package/dist/parseMongoDB.js +140 -15
  55. package/dist/parseMongoDB.js.map +1 -1
  56. package/dist/parseMongoDB.mjs +128 -5
  57. package/dist/parseMongoDB.mjs.map +1 -1
  58. package/dist/parseSPARQL.d.mts +17 -18
  59. package/dist/parseSPARQL.d.ts +17 -18
  60. package/dist/parseSPARQL.js.map +1 -1
  61. package/dist/parseSPARQL.mjs.map +1 -1
  62. package/dist/parseSQL.d.mts +266 -18
  63. package/dist/parseSQL.d.ts +266 -18
  64. package/dist/parseSQL.js +163 -10
  65. package/dist/parseSQL.js.map +1 -1
  66. package/dist/parseSQL.mjs +149 -7
  67. package/dist/parseSQL.mjs.map +1 -1
  68. package/dist/parseSpEL.d.mts +193 -19
  69. package/dist/parseSpEL.d.ts +193 -19
  70. package/dist/parseSpEL.js +166 -7
  71. package/dist/parseSpEL.js.map +1 -1
  72. package/dist/parseSpEL.mjs +142 -6
  73. package/dist/parseSpEL.mjs.map +1 -1
  74. package/dist/{prepareQueryObjects-Bni5VgYM.js → prepareQueryObjects-C2-kTZvR.js} +5 -5
  75. package/dist/prepareQueryObjects-C2-kTZvR.js.map +1 -0
  76. package/dist/{prepareQueryObjects-BCLU20Cg.mjs → prepareQueryObjects-Q18lHCKl.mjs} +3 -3
  77. package/dist/prepareQueryObjects-Q18lHCKl.mjs.map +1 -0
  78. package/dist/query-builder-layout.css.map +1 -1
  79. package/dist/query-builder.css.map +1 -1
  80. package/dist/react-querybuilder_core.d.mts +2261 -2113
  81. package/dist/react-querybuilder_core.legacy-esm.d.ts +2261 -2113
  82. package/dist/react-querybuilder_core.legacy-esm.js +335 -40
  83. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  84. package/dist/react-querybuilder_core.mjs +309 -23
  85. package/dist/react-querybuilder_core.mjs.map +1 -1
  86. package/dist/react-querybuilder_core.production.d.mts +2261 -2113
  87. package/dist/react-querybuilder_core.production.mjs +1 -1
  88. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  89. package/dist/styles/_layout.scss +4 -10
  90. package/dist/transformQuery.d.mts +91 -92
  91. package/dist/transformQuery.d.ts +91 -92
  92. package/dist/transformQuery.js +4 -3
  93. package/dist/transformQuery.js.map +1 -1
  94. package/dist/transformQuery.mjs +2 -1
  95. package/dist/transformQuery.mjs.map +1 -1
  96. package/dist/{utils-BpaOtylk.js → utils-DEwV7F6B.js} +108 -12
  97. package/dist/utils-DEwV7F6B.js.map +1 -0
  98. package/dist/{utils-CJRGiPb-.mjs → utils-Dt0D_DMV.mjs} +69 -3
  99. package/dist/utils-Dt0D_DMV.mjs.map +1 -0
  100. package/package.json +14 -14
  101. package/dist/import-Qs1-kgv5.d.ts +0 -27
  102. package/dist/import-ShTj5IdB.d.mts +0 -27
  103. package/dist/objectUtils-DBJI82bl.js.map +0 -1
  104. package/dist/objectUtils-ZvPkF6u6.mjs.map +0 -1
  105. package/dist/prepareQueryObjects-BCLU20Cg.mjs.map +0 -1
  106. package/dist/prepareQueryObjects-Bni5VgYM.js.map +0 -1
  107. package/dist/utils-BpaOtylk.js.map +0 -1
  108. package/dist/utils-CJRGiPb-.mjs.map +0 -1
@@ -1,78 +1,109 @@
1
- import { D as RuleGroupType, E as DefaultRuleGroupType, O as RuleType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-DlVg-QXo.js";
2
- import { t as ParserCommonOptions } from "./import-Qs1-kgv5.js";
3
-
1
+ import { L as Except, M as RuleGroupType, N as RuleType, P as ExpressionNode, T as DefaultRuleGroupTypeIC, j as DefaultRuleGroupType } from "./index-BSwFvkeI.js";
2
+ import { t as ParserCommonOptions } from "./import-Ddc3d_8q.js";
3
+ //#region src/utils/parseMongoDB/types.d.ts
4
+ type MongoDbSupportedOperators = "$and" | "$or" | "$not" | "$eq" | "$gt" | "$gte" | "$in" | "$lt" | "$lte" | "$ne" | "$nin" | "$regex" | "$expr";
5
+ /**
6
+ * A MongoDB aggregation-expression operand that {@link parseMongoDB!ParseMongoDbOptions.getExpression}
7
+ * may receive — an aggregation-operator object (`{ $add: [...] }`, `{ $abs: x }`, etc.), a
8
+ * `"$field"` path reference, or a literal.
9
+ */
10
+ type MongoDBExpressionOperand = unknown;
11
+ /** Context passed to {@link parseMongoDB!ParseMongoDbOptions.getExpression}. */
12
+ interface ParseMongoDBExpressionContext {
13
+ /** Returns `true` if the field is configured (or if no `fields` were supplied). */
14
+ fieldExists: (fieldName: string) => boolean;
15
+ }
16
+ //#endregion
4
17
  //#region src/utils/parseMongoDB/parseMongoDB.d.ts
5
18
  /**
6
- * Options object for {@link parseMongoDB}.
7
- */
19
+ * Options object for {@link parseMongoDB}.
20
+ */
8
21
  interface ParseMongoDbOptions extends ParserCommonOptions {
9
22
  /**
10
- * When `true`, MongoDB rules in the form of `{ fieldName: { $not: { <...rule> } } }`
11
- * will be parsed into a rule group with the `not` attribute set to `true`. By default
12
- * (i.e., when this attribute is `false`), such "`$not`" rules will be parsed into a
13
- * rule with a negated operator.
14
- *
15
- * For example, with `preventOperatorNegation` set to `true`, a MongoDB rule like this...
16
- *
17
- * ```ts
18
- * { fieldName: { $not: { $eq: 1 } } }
19
- * ```
20
- *
21
- * ...would yield a rule group like this:
22
- *
23
- * ```ts
24
- * {
25
- * combinator: 'and',
26
- * not: true,
27
- * rules: [{ field: 'fieldName', operator: '=', value: 1 }]
28
- * }
29
- * ```
30
- *
31
- * By default, the same MongoDB rule would yield a rule like this:
32
- *
33
- * ```ts
34
- * { field: 'fieldName', operator: '!=', value: 1 }
35
- * // negated operator ^
36
- * ```
37
- *
38
- * @default false
39
- */
23
+ * When `true`, MongoDB rules in the form of `{ fieldName: { $not: { <...rule> } } }`
24
+ * will be parsed into a rule group with the `not` attribute set to `true`. By default
25
+ * (i.e., when this attribute is `false`), such "`$not`" rules will be parsed into a
26
+ * rule with a negated operator.
27
+ *
28
+ * For example, with `preventOperatorNegation` set to `true`, a MongoDB rule like this...
29
+ *
30
+ * ```ts
31
+ * { fieldName: { $not: { $eq: 1 } } }
32
+ * ```
33
+ *
34
+ * ...would yield a rule group like this:
35
+ *
36
+ * ```ts
37
+ * {
38
+ * combinator: 'and',
39
+ * not: true,
40
+ * rules: [{ field: 'fieldName', operator: '=', value: 1 }]
41
+ * }
42
+ * ```
43
+ *
44
+ * By default, the same MongoDB rule would yield a rule like this:
45
+ *
46
+ * ```ts
47
+ * { field: 'fieldName', operator: '!=', value: 1 }
48
+ * // negated operator ^
49
+ * ```
50
+ *
51
+ * @default false
52
+ */
40
53
  preventOperatorNegation?: boolean;
41
54
  /**
42
- * Map of additional operators to their respective processing functions. Operators
43
- * must begin with `"$"`. Processing functions should return either a {@link index!RuleType RuleType}
44
- * or {@link index!RuleGroupType RuleGroupType}.
45
- *
46
- * (The functions should _not_ return {@link index!RuleGroupTypeIC RuleGroupTypeIC}, even if using independent
47
- * combinators. If the `independentCombinators` option is `true`, `parseMongoDB`
48
- * will convert the final query to {@link index!RuleGroupTypeIC RuleGroupTypeIC} before returning it.)
49
- *
50
- * @default {}
51
- */
55
+ * Map of additional operators to their respective processing functions. Operators
56
+ * must begin with `"$"`. Processing functions should return either a {@link index!RuleType RuleType}
57
+ * or {@link index!RuleGroupType RuleGroupType}.
58
+ *
59
+ * (The functions should _not_ return {@link index!RuleGroupTypeIC RuleGroupTypeIC}, even if using independent
60
+ * combinators. If the `independentCombinators` option is `true`, `parseMongoDB`
61
+ * will convert the final query to {@link index!RuleGroupTypeIC RuleGroupTypeIC} before returning it.)
62
+ *
63
+ * @default {}
64
+ */
52
65
  additionalOperators?: Record<`$${string}`, (field: string, operator: string, value: any, options: ParserCommonOptions) => RuleType | RuleGroupType>;
66
+ /**
67
+ * Handler that converts a MongoDB aggregation-expression operand (within `$expr`) into an
68
+ * {@link ExpressionNode}. Return `null` to reject (the rule is dropped). Supplied by
69
+ * `@react-querybuilder/expr` (`expressionParserMongoDB`). When omitted, expression
70
+ * operands are ignored (rule dropped).
71
+ */
72
+ getExpression?: (node: MongoDBExpressionOperand, ctx: ParseMongoDBExpressionContext) => ExpressionNode | null;
53
73
  }
54
74
  /**
55
- * Converts a MongoDB query object or parseable string into a query suitable
56
- * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
57
- * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
58
- */
75
+ * Converts a MongoDB query object or parseable string into a query suitable
76
+ * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
77
+ * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
78
+ */
59
79
  declare function parseMongoDB(mongoDbRules: string | Record<string, any>): DefaultRuleGroupType;
60
80
  /**
61
- * Converts a MongoDB query object or parseable string into a query suitable
62
- * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
63
- * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
64
- */
81
+ * Converts a MongoDB query object or parseable string into a query suitable
82
+ * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
83
+ * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
84
+ */
65
85
  declare function parseMongoDB(mongoDbRules: string | Record<string, any>, options: Except<ParseMongoDbOptions, "independentCombinators"> & {
66
86
  independentCombinators?: false;
67
87
  }): DefaultRuleGroupType;
68
88
  /**
69
- * Converts a MongoDB query object or parseable string into a query suitable
70
- * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
71
- * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).
72
- */
89
+ * Converts a MongoDB query object or parseable string into a query suitable
90
+ * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
91
+ * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).
92
+ */
73
93
  declare function parseMongoDB(mongoDbRules: string | Record<string, any>, options: Except<ParseMongoDbOptions, "independentCombinators"> & {
74
94
  independentCombinators: true;
75
95
  }): DefaultRuleGroupTypeIC;
76
96
  //#endregion
77
- export { ParseMongoDbOptions, parseMongoDB };
97
+ //#region src/utils/parseMongoDB/utils.d.ts
98
+ /**
99
+ * A MongoDB `$expr` comparison operand that is a candidate expression subtree: an
100
+ * aggregation-operator object (e.g. `{ $multiply: [...] }`). Bare `"$field"` strings and
101
+ * literals are not expression operands. The expr-supplied `getExpression` handler decides
102
+ * whether it maps to a known function.
103
+ */
104
+ declare const isMongoDBExpressionOperand: (operand: unknown) => boolean;
105
+ /** Reads a MongoDB field-path operand (`"$field"`), returning the field name or `null`. */
106
+ declare const mongoDbFieldRef: (operand: unknown) => string | null;
107
+ //#endregion
108
+ export { MongoDBExpressionOperand, MongoDbSupportedOperators, ParseMongoDBExpressionContext, ParseMongoDbOptions, isMongoDBExpressionOperand, mongoDbFieldRef, parseMongoDB };
78
109
  //# sourceMappingURL=parseMongoDB.d.ts.map
@@ -1,8 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_utils = require("./utils-BpaOtylk.js");
3
- const require_objectUtils = require("./objectUtils-DBJI82bl.js");
4
- const require_convertQuery = require("./convertQuery-BJKNgecE.js");
5
- const require_prepareQueryObjects = require("./prepareQueryObjects-Bni5VgYM.js");
2
+ const require_utils = require("./utils-DEwV7F6B.js");
3
+ const require_isRuleGroup = require("./isRuleGroup-0JNiQgLg.js");
4
+ const require_objectUtils = require("./objectUtils-Cr02aGxb.js");
5
+ const require_convertQuery = require("./convertQuery-Cw76XFIn.js");
6
+ const require_prepareQueryObjects = require("./prepareQueryObjects-C2-kTZvR.js");
6
7
  //#region src/utils/parseMongoDB/utils.ts
7
8
  const getRegExStr = (re) => typeof re === "string" ? re : re.source;
8
9
  const isPrimitive = (v) => typeof v === "string" || typeof v === "number" || typeof v === "boolean";
@@ -14,6 +15,26 @@ const mongoDbToRqbOperatorMap = {
14
15
  $lt: "<",
15
16
  $lte: "<="
16
17
  };
18
+ /** Comparison aggregation operators that can carry expression operands, mapped to RQB operators. */
19
+ const mongoDbExprComparisonMap = {
20
+ $eq: "=",
21
+ $ne: "!=",
22
+ $gt: ">",
23
+ $gte: ">=",
24
+ $lt: "<",
25
+ $lte: "<="
26
+ };
27
+ /** Flips a comparison operator (for operand order reversal); non-comparisons pass through. */
28
+ const flipMongoDbOperator = (op) => op === "<" ? ">" : op === "<=" ? ">=" : op === ">" ? "<" : op === ">=" ? "<=" : op;
29
+ /**
30
+ * A MongoDB `$expr` comparison operand that is a candidate expression subtree: an
31
+ * aggregation-operator object (e.g. `{ $multiply: [...] }`). Bare `"$field"` strings and
32
+ * literals are not expression operands. The expr-supplied `getExpression` handler decides
33
+ * whether it maps to a known function.
34
+ */
35
+ const isMongoDBExpressionOperand = (operand) => require_isRuleGroup.isPojo(operand);
36
+ /** Reads a MongoDB field-path operand (`"$field"`), returning the field name or `null`. */
37
+ const mongoDbFieldRef = (operand) => typeof operand === "string" && operand.startsWith("$") ? operand.slice(1) : null;
17
38
  //#endregion
18
39
  //#region src/utils/parseMongoDB/parseMongoDB.ts
19
40
  const emptyRuleGroup = {
@@ -26,6 +47,7 @@ function parseMongoDB(mongoDbRules, options = {}) {
26
47
  const getValueSources = options.getValueSources;
27
48
  const additionalOperators = options.additionalOperators ?? {};
28
49
  const preventOperatorNegation = !!options.preventOperatorNegation;
50
+ const getExpression = options.getExpression;
29
51
  const { additionalOperators: _ao, ...otherOptions } = options;
30
52
  const fieldIsValid = (fieldName, operator, subordinateFieldName) => require_prepareQueryObjects.fieldIsValidUtil({
31
53
  fieldName,
@@ -34,6 +56,102 @@ function parseMongoDB(mongoDbRules, options = {}) {
34
56
  subordinateFieldName,
35
57
  getValueSources
36
58
  });
59
+ const exprCtx = { fieldExists: (fieldName) => fieldsFlat.length === 0 || fieldsFlat.some((f) => f.name === fieldName) };
60
+ /**
61
+ * Parses a `$expr` payload that carries arithmetic/function expression operands. Returns a
62
+ * rule, `false` to drop, or `undefined` when the payload is not an expression form (so the
63
+ * caller falls through to the stock `$expr` handling).
64
+ */
65
+ function processMongoDbExprExpression(op, payload) {
66
+ // v8 ignore next -- guarded at call site
67
+ if (!getExpression) return void 0;
68
+ if (op in mongoDbExprComparisonMap && Array.isArray(payload) && payload.length === 2) {
69
+ const [l, r] = payload;
70
+ const lIsExpr = isMongoDBExpressionOperand(l);
71
+ const rIsExpr = isMongoDBExpressionOperand(r);
72
+ if (!lIsExpr && !rIsExpr) return void 0;
73
+ const rqbOp = mongoDbExprComparisonMap[op];
74
+ if (lIsExpr && rIsExpr) {
75
+ const lhs = getExpression(l, exprCtx);
76
+ const rhs = getExpression(r, exprCtx);
77
+ if (lhs && rhs) return {
78
+ field: "",
79
+ operator: rqbOp,
80
+ lhs,
81
+ value: rhs,
82
+ valueSource: "expression"
83
+ };
84
+ return false;
85
+ }
86
+ if (rIsExpr) {
87
+ const field = mongoDbFieldRef(l);
88
+ if (field !== null) {
89
+ const node = getExpression(r, exprCtx);
90
+ if (node && fieldIsValid(field, rqbOp)) return {
91
+ field,
92
+ operator: rqbOp,
93
+ value: node,
94
+ valueSource: "expression"
95
+ };
96
+ return false;
97
+ }
98
+ const node = getExpression(r, exprCtx);
99
+ if (node) return {
100
+ field: "",
101
+ operator: flipMongoDbOperator(rqbOp),
102
+ lhs: node,
103
+ value: l
104
+ };
105
+ return false;
106
+ }
107
+ const field = mongoDbFieldRef(r);
108
+ if (field !== null) {
109
+ const flipped = flipMongoDbOperator(rqbOp);
110
+ const node = getExpression(l, exprCtx);
111
+ if (node && fieldIsValid(field, flipped)) return {
112
+ field,
113
+ operator: flipped,
114
+ value: node,
115
+ valueSource: "expression"
116
+ };
117
+ return false;
118
+ }
119
+ const node = getExpression(l, exprCtx);
120
+ if (node) return {
121
+ field: "",
122
+ operator: rqbOp,
123
+ lhs: node,
124
+ value: r
125
+ };
126
+ return false;
127
+ }
128
+ if ((op === "$and" || op === "$or") && Array.isArray(payload) && payload.length === 2) {
129
+ const between = op === "$and";
130
+ const [c1, c2] = payload;
131
+ if (!require_isRuleGroup.isPojo(c1) || !require_isRuleGroup.isPojo(c2)) return void 0;
132
+ const k1 = require_objectUtils.objectKeys(c1)[0];
133
+ const k2 = require_objectUtils.objectKeys(c2)[0];
134
+ const [expK1, expK2] = between ? ["$gte", "$lte"] : ["$lt", "$gt"];
135
+ if (k1 !== expK1 || k2 !== expK2) return void 0;
136
+ const a1 = c1[k1];
137
+ const a2 = c2[k2];
138
+ if (!Array.isArray(a1) || a1.length !== 2 || !Array.isArray(a2) || a2.length !== 2) return;
139
+ const field = mongoDbFieldRef(a1[0]);
140
+ if (field === null || field !== mongoDbFieldRef(a2[0])) return void 0;
141
+ const [from, to] = [a1[1], a2[1]];
142
+ if (!isMongoDBExpressionOperand(from) && !isMongoDBExpressionOperand(to)) return void 0;
143
+ const fromNode = getExpression(from, exprCtx);
144
+ const toNode = getExpression(to, exprCtx);
145
+ const operator = between ? "between" : "notBetween";
146
+ if (fromNode && toNode && fieldIsValid(field, operator)) return {
147
+ field,
148
+ operator,
149
+ value: [fromNode, toNode],
150
+ valueSource: "expression"
151
+ };
152
+ return false;
153
+ }
154
+ }
37
155
  function processMongoDbQueryBooleanOperator(field, mdbOperator, keyValue) {
38
156
  let operator = "=";
39
157
  let value = "";
@@ -93,11 +211,11 @@ function parseMongoDB(mongoDbRules, options = {}) {
93
211
  let field = "";
94
212
  // v8 ignore else
95
213
  if (key === "$and") {
96
- if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => require_objectUtils.isPojo(v))) return false;
214
+ if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => require_isRuleGroup.isPojo(v))) return false;
97
215
  if (keyValue.length === 2 && keyValue.every((kv) => require_objectUtils.objectKeys(kv).length === 1)) {
98
216
  const [rule1, rule2] = keyValue;
99
217
  const [ruleKey1, ruleKey2] = keyValue.map((kv) => require_objectUtils.objectKeys(kv)[0]);
100
- if (ruleKey1 === ruleKey2 && require_objectUtils.isPojo(rule1[ruleKey1]) && require_objectUtils.objectKeys(rule1[ruleKey1]).length === 1 && require_objectUtils.isPojo(rule2[ruleKey2]) && require_objectUtils.objectKeys(rule2[ruleKey2]).length === 1 && ("$gte" in rule1[ruleKey1] && "$lte" in rule2[ruleKey2] && rule2[ruleKey2].$lte >= rule1[ruleKey1].$gte || "$lte" in rule1[ruleKey1] && "$gte" in rule2[ruleKey2] && rule1[ruleKey1].$lte >= rule2[ruleKey2].$gte)) {
218
+ 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
219
  const [val1, val2] = [rule1[ruleKey1].$gte ?? rule1[ruleKey1].$lte, rule2[ruleKey2].$lte ?? rule2[ruleKey2].$gte];
102
220
  let value = listsAsArrays ? [val1, val2] : require_utils.joinWith([val1, val2], ",");
103
221
  if (val1 > val2) value = listsAsArrays ? [val2, val1] : require_utils.joinWith([val2, val1], ",");
@@ -114,11 +232,11 @@ function parseMongoDB(mongoDbRules, options = {}) {
114
232
  rules
115
233
  } : false;
116
234
  } else if (key === "$or") {
117
- if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => require_objectUtils.isPojo(v))) return false;
235
+ if (!Array.isArray(keyValue) || keyValue.length === 0 || !keyValue.every((v) => require_isRuleGroup.isPojo(v))) return false;
118
236
  if (keyValue.length === 2 && keyValue.every((kv) => require_objectUtils.objectKeys(kv).length === 1)) {
119
237
  const [rule1, rule2] = keyValue;
120
238
  const [ruleKey1, ruleKey2] = keyValue.map((kv) => require_objectUtils.objectKeys(kv)[0]);
121
- if (ruleKey1 === ruleKey2 && require_objectUtils.isPojo(rule1[ruleKey1]) && require_objectUtils.objectKeys(rule1[ruleKey1]).length === 1 && require_objectUtils.isPojo(rule2[ruleKey2]) && require_objectUtils.objectKeys(rule2[ruleKey2]).length === 1 && ("$gt" in rule1[ruleKey1] && "$lt" in rule2[ruleKey2] && rule1[ruleKey1].$gt >= rule2[ruleKey2].$lt || "$lt" in rule1[ruleKey1] && "$gt" in rule2[ruleKey2] && rule2[ruleKey2].$gt >= rule1[ruleKey1].$lt)) {
239
+ 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
240
  const [val1, val2] = [rule1[ruleKey1].$gt ?? rule1[ruleKey1].$lt, rule2[ruleKey2].$lt ?? rule2[ruleKey2].$gt];
123
241
  let value = listsAsArrays ? [val1, val2] : `${val1},${val2}`;
124
242
  if (val1 > val2) value = listsAsArrays ? [val2, val1] : `${val2},${val1}`;
@@ -134,10 +252,10 @@ function parseMongoDB(mongoDbRules, options = {}) {
134
252
  combinator: "or",
135
253
  rules
136
254
  } : false;
137
- } else if (key === "$not" && require_objectUtils.isPojo(keyValue)) {
255
+ } else if (key === "$not" && require_isRuleGroup.isPojo(keyValue)) {
138
256
  const ruleOrGroup = processMongoDbQueryObject(keyValue);
139
257
  if (ruleOrGroup) {
140
- if (require_objectUtils.isRuleGroupType(ruleOrGroup)) return ruleOrGroup.not ? {
258
+ if (require_isRuleGroup.isRuleGroupType(ruleOrGroup)) return ruleOrGroup.not ? {
141
259
  combinator: "and",
142
260
  rules: [ruleOrGroup],
143
261
  not: true
@@ -157,6 +275,10 @@ function parseMongoDB(mongoDbRules, options = {}) {
157
275
  return false;
158
276
  } else if (key === "$expr") {
159
277
  const op = require_objectUtils.objectKeys(keyValue)[0];
278
+ if (getExpression) {
279
+ const exprRule = processMongoDbExprExpression(op, keyValue[op]);
280
+ if (exprRule !== void 0) return exprRule;
281
+ }
160
282
  if (/^\$(eq|gte?|lte?|n?in)$/.test(op) && Array.isArray(keyValue[op]) && keyValue[op].length === 2 && typeof keyValue[op][0] === "string" && keyValue[op][0].startsWith("$")) {
161
283
  field = keyValue[op][0].replace(/^\$/, "");
162
284
  const val = keyValue[op][1];
@@ -171,6 +293,7 @@ function parseMongoDB(mongoDbRules, options = {}) {
171
293
  };
172
294
  }
173
295
  }
296
+ if (require_isRuleGroup.isPojo(keyValue[op][1])) return false;
174
297
  return processMongoDbQueryBooleanOperator(field, op, keyValue[op][1]);
175
298
  }
176
299
  } else if (/^[^$]/.test(key)) {
@@ -187,7 +310,7 @@ function parseMongoDB(mongoDbRules, options = {}) {
187
310
  operator: "null",
188
311
  value: keyValue
189
312
  };
190
- } else if (require_objectUtils.isPojo(keyValue)) {
313
+ } else if (require_isRuleGroup.isPojo(keyValue)) {
191
314
  let betweenRule = false;
192
315
  let notRule = false;
193
316
  const allOps = [
@@ -203,9 +326,9 @@ function parseMongoDB(mongoDbRules, options = {}) {
203
326
  const acceptedOpsRegExp = new RegExp(`^\\$(${allOps.join("|")})$`);
204
327
  const operators = require_objectUtils.objectKeys(keyValue).filter((o) => acceptedOpsRegExp.test(o)).sort();
205
328
  if (operators.length === 0) return false;
206
- if ("$not" in keyValue && require_objectUtils.isPojo(keyValue.$not)) {
329
+ if ("$not" in keyValue && require_isRuleGroup.isPojo(keyValue.$not)) {
207
330
  const invertedNotRule = processMongoDbQueryObject({ [field]: keyValue.$not });
208
- if (invertedNotRule) if (require_objectUtils.isRuleGroupType(invertedNotRule)) notRule = {
331
+ if (invertedNotRule) if (require_isRuleGroup.isRuleGroupType(invertedNotRule)) notRule = {
209
332
  ...invertedNotRule,
210
333
  not: true
211
334
  };
@@ -250,15 +373,17 @@ function parseMongoDB(mongoDbRules, options = {}) {
250
373
  } catch {
251
374
  return prepare(emptyRuleGroup);
252
375
  }
253
- if (!require_objectUtils.isPojo(mongoDbPOJO)) return prepare(emptyRuleGroup);
376
+ if (!require_isRuleGroup.isPojo(mongoDbPOJO)) return prepare(emptyRuleGroup);
254
377
  const result = processMongoDbQueryObject(mongoDbPOJO);
255
- const finalQuery = result ? require_objectUtils.isRuleGroupType(result) ? result : {
378
+ const finalQuery = result ? require_isRuleGroup.isRuleGroupType(result) ? result : {
256
379
  combinator: "and",
257
380
  rules: [result]
258
381
  } : emptyRuleGroup;
259
382
  return prepare(options.independentCombinators ? require_convertQuery.convertToIC(finalQuery) : finalQuery);
260
383
  }
261
384
  //#endregion
385
+ exports.isMongoDBExpressionOperand = isMongoDBExpressionOperand;
386
+ exports.mongoDbFieldRef = mongoDbFieldRef;
262
387
  exports.parseMongoDB = parseMongoDB;
263
388
 
264
389
  //# sourceMappingURL=parseMongoDB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseMongoDB.js","names":["getFieldsArray","fieldIsValidUtil","joinWith","isPojo","objectKeys","isRuleGroupType","defaultOperatorNegationMap","prepareRuleGroup","convertToIC"],"sources":["../src/utils/parseMongoDB/utils.ts","../src/utils/parseMongoDB/parseMongoDB.ts"],"sourcesContent":["import type { DefaultOperatorName } from '../../types';\nimport type { MongoDbSupportedOperators } from './types';\n\nexport const getRegExStr = (re: string | RegExp): string =>\n typeof re === 'string' ? re : re.source;\n\nexport const isPrimitive = (v: unknown): 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 // v8 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 // v8 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(keyValue)\n .filter(o => acceptedOpsRegExp.test(o))\n // oxlint-disable-next-line no-array-sort\n .sort() as MongoDbSupportedOperators[];\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(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);\n}\n\nexport { parseMongoDB };\n"],"mappings":"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"}
1
+ {"version":3,"file":"parseMongoDB.js","names":["isPojo","getFieldsArray","fieldIsValidUtil","isPojo","objectKeys","joinWith","isRuleGroupType","defaultOperatorNegationMap","prepareRuleGroup","convertToIC"],"sources":["../src/utils/parseMongoDB/utils.ts","../src/utils/parseMongoDB/parseMongoDB.ts"],"sourcesContent":["import type { DefaultOperatorName } from '../../types';\nimport { isPojo } from '../misc';\nimport type { MongoDbSupportedOperators } from './types';\n\nexport const getRegExStr = (re: string | RegExp): string =>\n typeof re === 'string' ? re : re.source;\n\nexport const isPrimitive = (v: unknown): 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\n/** Comparison aggregation operators that can carry expression operands, mapped to RQB operators. */\nexport const mongoDbExprComparisonMap: Record<string, DefaultOperatorName> = {\n $eq: '=',\n $ne: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n};\n\n/** Flips a comparison operator (for operand order reversal); non-comparisons pass through. */\nexport const flipMongoDbOperator = (op: DefaultOperatorName): DefaultOperatorName =>\n op === '<' ? '>' : op === '<=' ? '>=' : op === '>' ? '<' : op === '>=' ? '<=' : op;\n\n/**\n * A MongoDB `$expr` comparison operand that is a candidate expression subtree: an\n * aggregation-operator object (e.g. `{ $multiply: [...] }`). Bare `\"$field\"` strings and\n * literals are not expression operands. The expr-supplied `getExpression` handler decides\n * whether it maps to a known function.\n */\nexport const isMongoDBExpressionOperand = (operand: unknown): boolean => isPojo(operand);\n\n/** Reads a MongoDB field-path operand (`\"$field\"`), returning the field name or `null`. */\nexport const mongoDbFieldRef = (operand: unknown): string | null =>\n typeof operand === 'string' && operand.startsWith('$') ? operand.slice(1) : null;\n","import type { Except } from 'type-fest';\nimport { defaultOperatorNegationMap } from '../../defaults';\nimport type {\n DefaultOperatorName,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n ExpressionNode,\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 {\n MongoDBExpressionOperand,\n MongoDbSupportedOperators,\n ParseMongoDBExpressionContext,\n} from './types';\nimport {\n flipMongoDbOperator,\n getRegExStr,\n isMongoDBExpressionOperand,\n isPrimitive,\n mongoDbExprComparisonMap,\n mongoDbFieldRef,\n mongoDbToRqbOperatorMap,\n} 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 * Handler that converts a MongoDB aggregation-expression operand (within `$expr`) into an\n * {@link ExpressionNode}. Return `null` to reject (the rule is dropped). Supplied by\n * `@react-querybuilder/expr` (`expressionParserMongoDB`). When omitted, expression\n * operands are ignored (rule dropped).\n */\n getExpression?: (\n node: MongoDBExpressionOperand,\n ctx: ParseMongoDBExpressionContext\n ) => ExpressionNode | null;\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 getExpression = options.getExpression;\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 const exprCtx: ParseMongoDBExpressionContext = {\n fieldExists: fieldName => fieldsFlat.length === 0 || fieldsFlat.some(f => f.name === fieldName),\n };\n\n /**\n * Parses a `$expr` payload that carries arithmetic/function expression operands. Returns a\n * rule, `false` to drop, or `undefined` when the payload is not an expression form (so the\n * caller falls through to the stock `$expr` handling).\n */\n function processMongoDbExprExpression(\n op: string,\n // oxlint-disable-next-line typescript/no-explicit-any\n payload: any\n ): DefaultRuleType | false | undefined {\n // v8 ignore next -- guarded at call site\n if (!getExpression) return undefined;\n\n // Comparison: { $gt: [lhs, rhs] } with an expression operand\n if (op in mongoDbExprComparisonMap && Array.isArray(payload) && payload.length === 2) {\n const [l, r] = payload;\n const lIsExpr = isMongoDBExpressionOperand(l);\n const rIsExpr = isMongoDBExpressionOperand(r);\n if (!lIsExpr && !rIsExpr) return undefined;\n const rqbOp = mongoDbExprComparisonMap[op];\n\n if (lIsExpr && rIsExpr) {\n // expression <op> expression → both sides on lhs/value\n const lhs = getExpression(l, exprCtx);\n const rhs = getExpression(r, exprCtx);\n if (lhs && rhs) {\n return { field: '', operator: rqbOp, lhs, value: rhs, valueSource: 'expression' };\n }\n return false;\n }\n\n if (rIsExpr) {\n const field = mongoDbFieldRef(l);\n if (field !== null) {\n // field <op> expression → rhs expression\n const node = getExpression(r, exprCtx);\n if (node && fieldIsValid(field, rqbOp)) {\n return { field, operator: rqbOp, value: node, valueSource: 'expression' };\n }\n return false;\n }\n // literal <op> expression → lhs = expression, flip operator\n const node = getExpression(r, exprCtx);\n if (node) {\n return { field: '', operator: flipMongoDbOperator(rqbOp), lhs: node, value: l };\n }\n return false;\n }\n\n // lIsExpr && !rIsExpr\n const field = mongoDbFieldRef(r);\n if (field !== null) {\n // expression <op> field → flip to field <op> expression\n const flipped = flipMongoDbOperator(rqbOp);\n const node = getExpression(l, exprCtx);\n if (node && fieldIsValid(field, flipped)) {\n return { field, operator: flipped, value: node, valueSource: 'expression' };\n }\n return false;\n }\n // expression <op> literal → lhs = expression, plain value\n const node = getExpression(l, exprCtx);\n if (node) {\n return { field: '', operator: rqbOp, lhs: node, value: r };\n }\n return false;\n }\n\n // Between: { $and: [{ $gte: [lhs, from] }, { $lte: [lhs, to] }] }\n // notBetween: { $or: [{ $lt: [lhs, from] }, { $gt: [lhs, to] }] }\n if ((op === '$and' || op === '$or') && Array.isArray(payload) && payload.length === 2) {\n const between = op === '$and';\n const [c1, c2] = payload;\n if (!isPojo(c1) || !isPojo(c2)) return undefined;\n const k1 = objectKeys(c1)[0];\n const k2 = objectKeys(c2)[0];\n const [expK1, expK2] = between ? ['$gte', '$lte'] : ['$lt', '$gt'];\n if (k1 !== expK1 || k2 !== expK2) return undefined;\n const a1 = c1[k1];\n const a2 = c2[k2];\n if (!Array.isArray(a1) || a1.length !== 2 || !Array.isArray(a2) || a2.length !== 2) {\n return undefined;\n }\n const field = mongoDbFieldRef(a1[0]);\n if (field === null || field !== mongoDbFieldRef(a2[0])) return undefined;\n const [from, to] = [a1[1], a2[1]];\n if (!isMongoDBExpressionOperand(from) && !isMongoDBExpressionOperand(to)) return undefined;\n const fromNode = getExpression(from, exprCtx);\n const toNode = getExpression(to, exprCtx);\n const operator: DefaultOperatorName = between ? 'between' : 'notBetween';\n if (fromNode && toNode && fieldIsValid(field, operator)) {\n return { field, operator, value: [fromNode, toNode], valueSource: 'expression' };\n }\n return false;\n }\n\n return undefined;\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 // v8 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 // v8 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 (getExpression) {\n const exprRule = processMongoDbExprExpression(op, keyValue[op]);\n if (exprRule !== undefined) return exprRule;\n }\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 // An aggregation-object operand requires a `getExpression` handler; without one it\n // cannot be represented, so drop the rule rather than emit an object-valued rule.\n if (isPojo(keyValue[op][1])) {\n return false;\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(keyValue)\n .filter(o => acceptedOpsRegExp.test(o))\n // oxlint-disable-next-line no-array-sort\n .sort() as MongoDbSupportedOperators[];\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(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);\n}\n\nexport { parseMongoDB };\n"],"mappings":"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"}