{"version":3,"file":"parseMongoDB.mjs","names":[],"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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"}