@react-querybuilder/core 8.22.5 → 8.23.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 (120) hide show
  1. package/derivations/package.json +4 -0
  2. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +2078 -1665
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js +1293 -422
  4. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  5. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +2078 -1665
  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-Cw76XFIn.js → convertQuery-BLT0GIhM.js} +17 -8
  9. package/dist/{convertQuery-Cw76XFIn.js.map → convertQuery-BLT0GIhM.js.map} +1 -1
  10. package/dist/{convertQuery-D_4J7E-Z.mjs → convertQuery-DaXv3h7S.mjs} +6 -3
  11. package/dist/{convertQuery-D_4J7E-Z.mjs.map → convertQuery-DaXv3h7S.mjs.map} +1 -1
  12. package/dist/derivations.d.mts +2902 -0
  13. package/dist/derivations.d.ts +2902 -0
  14. package/dist/derivations.js +2845 -0
  15. package/dist/derivations.js.map +1 -0
  16. package/dist/derivations.mjs +2678 -0
  17. package/dist/derivations.mjs.map +1 -0
  18. package/dist/formatQuery.d.mts +2 -895
  19. package/dist/formatQuery.d.ts +2 -895
  20. package/dist/formatQuery.js +120 -140
  21. package/dist/formatQuery.js.map +1 -1
  22. package/dist/formatQuery.mjs +8 -28
  23. package/dist/formatQuery.mjs.map +1 -1
  24. package/dist/{import-DVWI7Fdh.d.mts → import-BdKPtLzo.d.mts} +2 -2
  25. package/dist/{import-6ExjhifL.d.ts → import-BfZTwhp2.d.ts} +2 -2
  26. package/dist/{index-CX9mehdL.d.mts → index-DOIE2pwx.d.mts} +274 -3
  27. package/dist/{index-CX9mehdL.d.ts → index-DOIE2pwx.d.ts} +274 -3
  28. package/dist/index-OF2Q1gTp.d.mts +895 -0
  29. package/dist/index-XueTy_XQ.d.ts +895 -0
  30. package/dist/isRuleOrGroupValid-CIMZNkt4.mjs +27 -0
  31. package/dist/isRuleOrGroupValid-CIMZNkt4.mjs.map +1 -0
  32. package/dist/isRuleOrGroupValid-CtUf4_4x.js +38 -0
  33. package/dist/isRuleOrGroupValid-CtUf4_4x.js.map +1 -0
  34. package/dist/{isRuleGroup-CqLThsbu.mjs → objectUtils-DDZ-KhV5.mjs} +25 -2
  35. package/dist/objectUtils-DDZ-KhV5.mjs.map +1 -0
  36. package/dist/{isRuleGroup-0JNiQgLg.js → objectUtils-DfnEmDSV.js} +48 -1
  37. package/dist/objectUtils-DfnEmDSV.js.map +1 -0
  38. package/dist/parseCEL.d.mts +2 -2
  39. package/dist/parseCEL.d.ts +2 -2
  40. package/dist/parseCEL.js +19 -16
  41. package/dist/parseCEL.js.map +1 -1
  42. package/dist/parseCEL.mjs +12 -9
  43. package/dist/parseCEL.mjs.map +1 -1
  44. package/dist/parseCypher.d.mts +1 -1
  45. package/dist/parseCypher.d.ts +1 -1
  46. package/dist/parseGremlin.d.mts +1 -1
  47. package/dist/parseGremlin.d.ts +1 -1
  48. package/dist/parseJSONata.d.mts +2 -2
  49. package/dist/parseJSONata.d.ts +2 -2
  50. package/dist/parseJSONata.js +17 -14
  51. package/dist/parseJSONata.js.map +1 -1
  52. package/dist/parseJSONata.mjs +11 -8
  53. package/dist/parseJSONata.mjs.map +1 -1
  54. package/dist/parseJsonLogic.d.mts +2 -2
  55. package/dist/parseJsonLogic.d.ts +2 -2
  56. package/dist/parseJsonLogic.js +38 -38
  57. package/dist/parseJsonLogic.js.map +1 -1
  58. package/dist/parseJsonLogic.mjs +5 -5
  59. package/dist/parseMongoDB.d.mts +2 -2
  60. package/dist/parseMongoDB.d.ts +2 -2
  61. package/dist/parseMongoDB.js +50 -47
  62. package/dist/parseMongoDB.js.map +1 -1
  63. package/dist/parseMongoDB.mjs +35 -32
  64. package/dist/parseMongoDB.mjs.map +1 -1
  65. package/dist/parseSPARQL.d.mts +1 -1
  66. package/dist/parseSPARQL.d.ts +1 -1
  67. package/dist/parseSQL.d.mts +2 -2
  68. package/dist/parseSQL.d.ts +2 -2
  69. package/dist/parseSQL.js +27 -23
  70. package/dist/parseSQL.js.map +1 -1
  71. package/dist/parseSQL.mjs +21 -17
  72. package/dist/parseSQL.mjs.map +1 -1
  73. package/dist/parseSpEL.d.mts +2 -2
  74. package/dist/parseSpEL.d.ts +2 -2
  75. package/dist/parseSpEL.js +16 -13
  76. package/dist/parseSpEL.js.map +1 -1
  77. package/dist/parseSpEL.mjs +12 -9
  78. package/dist/parseSpEL.mjs.map +1 -1
  79. package/dist/parserUtils-BKPstAaO.mjs +30 -0
  80. package/dist/parserUtils-BKPstAaO.mjs.map +1 -0
  81. package/dist/parserUtils-DbBXyAht.js +41 -0
  82. package/dist/parserUtils-DbBXyAht.js.map +1 -0
  83. package/dist/{prepareQueryObjects-BnGL91Tt.js → prepareQueryObjects-Dj9cTl9D.js} +90 -63
  84. package/dist/prepareQueryObjects-Dj9cTl9D.js.map +1 -0
  85. package/dist/{prepareQueryObjects-ChINDIap.mjs → prepareQueryObjects-Dmyf3Wi_.mjs} +56 -59
  86. package/dist/prepareQueryObjects-Dmyf3Wi_.mjs.map +1 -0
  87. package/dist/react-querybuilder_core.d.mts +2078 -1665
  88. package/dist/react-querybuilder_core.legacy-esm.d.ts +2078 -1665
  89. package/dist/react-querybuilder_core.legacy-esm.js +1445 -635
  90. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  91. package/dist/react-querybuilder_core.mjs +1288 -424
  92. package/dist/react-querybuilder_core.mjs.map +1 -1
  93. package/dist/react-querybuilder_core.production.d.mts +2078 -1665
  94. package/dist/react-querybuilder_core.production.mjs +1 -1
  95. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  96. package/dist/transformQuery-B7d9AWUf.d.mts +116 -0
  97. package/dist/transformQuery-BXDiUBGB.d.ts +116 -0
  98. package/dist/transformQuery.d.mts +2 -116
  99. package/dist/transformQuery.d.ts +2 -116
  100. package/dist/transformQuery.js +3 -4
  101. package/dist/transformQuery.js.map +1 -1
  102. package/dist/transformQuery.mjs +1 -2
  103. package/dist/transformQuery.mjs.map +1 -1
  104. package/dist/utils-CP5Jqy1P.mjs +1294 -0
  105. package/dist/utils-CP5Jqy1P.mjs.map +1 -0
  106. package/dist/utils-e-7KHkjV.js +1779 -0
  107. package/dist/utils-e-7KHkjV.js.map +1 -0
  108. package/package.json +33 -22
  109. package/dist/isRuleGroup-0JNiQgLg.js.map +0 -1
  110. package/dist/isRuleGroup-CqLThsbu.mjs.map +0 -1
  111. package/dist/objectUtils-Cr02aGxb.js +0 -27
  112. package/dist/objectUtils-Cr02aGxb.js.map +0 -1
  113. package/dist/objectUtils-DBlmJgBf.mjs +0 -16
  114. package/dist/objectUtils-DBlmJgBf.mjs.map +0 -1
  115. package/dist/prepareQueryObjects-BnGL91Tt.js.map +0 -1
  116. package/dist/prepareQueryObjects-ChINDIap.mjs.map +0 -1
  117. package/dist/utils-4k-j5FBa.mjs +0 -537
  118. package/dist/utils-4k-j5FBa.mjs.map +0 -1
  119. package/dist/utils-C79dxwZb.js +0 -752
  120. package/dist/utils-C79dxwZb.js.map +0 -1
@@ -1 +1 @@
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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"}
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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"}
@@ -1,8 +1,8 @@
1
- import { I as defaultOperatorNegationMap, N as joinWith } from "./utils-4k-j5FBa.mjs";
2
- import { i as isPojo, n as isRuleGroupType } from "./isRuleGroup-CqLThsbu.mjs";
3
- import { n as objectKeys } from "./objectUtils-DBlmJgBf.mjs";
4
- import { n as convertToIC } from "./convertQuery-D_4J7E-Z.mjs";
5
- import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-ChINDIap.mjs";
1
+ import { U as joinWith, ot as defaultOperatorNegationMap } from "./utils-CP5Jqy1P.mjs";
2
+ import { a as isRuleGroupType, c as isPojo, r as objectKeys } from "./objectUtils-DDZ-KhV5.mjs";
3
+ import { r as convertToIC } from "./convertQuery-DaXv3h7S.mjs";
4
+ import { n as prepareRuleGroup } from "./prepareQueryObjects-Dmyf3Wi_.mjs";
5
+ import { n as getFieldsArray, t as fieldIsValidUtil } from "./parserUtils-BKPstAaO.mjs";
6
6
  //#region src/utils/parseMongoDB/utils.ts
7
7
  const getRegExStr = (re) => typeof re === "string" ? re : re.source;
8
8
  const isPrimitive = (v) => typeof v === "string" || typeof v === "number" || typeof v === "boolean";
@@ -155,21 +155,22 @@ function parseMongoDB(mongoDbRules, options = {}) {
155
155
  let operator = "=";
156
156
  let value = "";
157
157
  // v8 ignore else
158
- if (mdbOperator === "$eq" || mdbOperator === "$ne" || mdbOperator === "$gt" || mdbOperator === "$gte" || mdbOperator === "$lt" || mdbOperator === "$lte") if (mdbOperator === "$ne" && keyValue === null) {
159
- if (fieldIsValid(field, "notNull")) return {
160
- field,
161
- operator: "notNull",
162
- value: null
163
- };
164
- } else {
165
- operator = mongoDbToRqbOperatorMap[mdbOperator];
166
- if (fieldIsValid(field, operator)) return {
167
- field,
168
- operator,
169
- value: keyValue
170
- };
171
- }
172
- else if (mdbOperator === "$regex" && /^[^$^]$|^[^^].*[^$]$/.test(getRegExStr(keyValue))) {
158
+ if (mdbOperator === "$eq" || mdbOperator === "$ne" || mdbOperator === "$gt" || mdbOperator === "$gte" || mdbOperator === "$lt" || mdbOperator === "$lte") {
159
+ if (mdbOperator === "$ne" && keyValue === null) {
160
+ if (fieldIsValid(field, "notNull")) return {
161
+ field,
162
+ operator: "notNull",
163
+ value: null
164
+ };
165
+ } else {
166
+ operator = mongoDbToRqbOperatorMap[mdbOperator];
167
+ if (fieldIsValid(field, operator)) return {
168
+ field,
169
+ operator,
170
+ value: keyValue
171
+ };
172
+ }
173
+ } else if (mdbOperator === "$regex" && /^[^$^]$|^[^^].*[^$]$/.test(getRegExStr(keyValue))) {
173
174
  if (fieldIsValid(field, "contains")) return {
174
175
  field,
175
176
  operator: "contains",
@@ -327,18 +328,20 @@ function parseMongoDB(mongoDbRules, options = {}) {
327
328
  if (operators.length === 0) return false;
328
329
  if ("$not" in keyValue && isPojo(keyValue.$not)) {
329
330
  const invertedNotRule = processMongoDbQueryObject({ [field]: keyValue.$not });
330
- if (invertedNotRule) if (isRuleGroupType(invertedNotRule)) notRule = {
331
- ...invertedNotRule,
332
- not: true
333
- };
334
- else notRule = preventOperatorNegation ? {
335
- combinator: "and",
336
- rules: [invertedNotRule],
337
- not: true
338
- } : {
339
- ...invertedNotRule,
340
- operator: defaultOperatorNegationMap[invertedNotRule.operator]
341
- };
331
+ if (invertedNotRule) {
332
+ if (isRuleGroupType(invertedNotRule)) notRule = {
333
+ ...invertedNotRule,
334
+ not: true
335
+ };
336
+ else notRule = preventOperatorNegation ? {
337
+ combinator: "and",
338
+ rules: [invertedNotRule],
339
+ not: true
340
+ } : {
341
+ ...invertedNotRule,
342
+ operator: defaultOperatorNegationMap[invertedNotRule.operator]
343
+ };
344
+ }
342
345
  }
343
346
  if ("$gte" in keyValue && "$lte" in keyValue) betweenRule = {
344
347
  field,
@@ -1 +1 @@
1
- {"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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"}
1
+ {"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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"}
@@ -1,4 +1,4 @@
1
- import { T as DefaultRuleGroupTypeIC, j as DefaultRuleGroupType } from "./index-CX9mehdL.mjs";
1
+ import { $t as DefaultRuleGroupType, Pt as DefaultRuleGroupTypeIC } from "./index-DOIE2pwx.mjs";
2
2
  //#region src/utils/parseSPARQL/parseSPARQL.d.ts
3
3
  /**
4
4
  * Options for {@link parseSPARQL}.
@@ -1,4 +1,4 @@
1
- import { T as DefaultRuleGroupTypeIC, j as DefaultRuleGroupType } from "./index-CX9mehdL.js";
1
+ import { $t as DefaultRuleGroupType, Pt as DefaultRuleGroupTypeIC } from "./index-DOIE2pwx.js";
2
2
  //#region src/utils/parseSPARQL/parseSPARQL.d.ts
3
3
  /**
4
4
  * Options for {@link parseSPARQL}.
@@ -1,5 +1,5 @@
1
- import { A as DefaultOperatorName, L as Except, P as ExpressionNode, T as DefaultRuleGroupTypeIC, j as DefaultRuleGroupType, k as DefaultCombinatorNameExtended } from "./index-CX9mehdL.mjs";
2
- import { t as ParserCommonOptions } from "./import-DVWI7Fdh.mjs";
1
+ import { $t as DefaultRuleGroupType, Pt as DefaultRuleGroupTypeIC, Yt as DefaultCombinatorNameExtended, Zt as DefaultOperatorName, jn as Except, on as ExpressionNode } from "./index-DOIE2pwx.mjs";
2
+ import { t as ParserCommonOptions } from "./import-BdKPtLzo.mjs";
3
3
  //#region src/utils/parseSQL/types.d.ts
4
4
  type AnyCase<T extends string> = string extends T ? string : T extends `${infer F1}${infer F2}${infer R}` ? `${Uppercase<F1> | Lowercase<F1>}${Uppercase<F2> | Lowercase<F2>}${AnyCase<R>}` : T extends `${infer F}${infer R}` ? `${Uppercase<F> | Lowercase<F>}${AnyCase<R>}` : "";
5
5
  type TokenType = "AndExpression" | "BetweenPredicate" | "BitExpression" | "Boolean" | "BooleanExtra" | "CaseWhen" | "ComparisonBooleanPrimary" | "ComparisonSubQueryBooleanPrimary" | "ContainsExpr" | "EndsWithExpr" | "ExpressionList" | "ForceIndexHint" | "ForOptIndexHint" | "FunctionCall" | "FunctionCallParam" | "GroupBy" | "GroupByOrderByItem" | "Identifier" | "IdentifierExpr" | "IdentifierList" | "IgnoreIndexHint" | "IndexHintList" | "InExpressionListPredicate" | "InnerCrossJoinTable" | "InSubQueryPredicate" | "IsExpression" | "IsNullBooleanPrimary" | "LeftRightJoinTable" | "LikePredicate" | "Limit" | "Main" | "NaturalJoinTable" | "NotExpression" | "Null" | "Number" | "OnJoinCondition" | "OrderBy" | "OrExpression" | "Partitions" | "PlaceHolder" | "Prefix" | "RegexpPredicate" | "Select" | "SelectExpr" | "SelectParenthesized" | "SimpleExprParentheses" | "SoundsLikePredicate" | "StartsWithExpr" | "StraightJoinTable" | "String" | "SubQuery" | "TableFactor" | "TableReference" | "TableReferences" | "Union" | "UseIndexHint" | "UsingJoinCondition" | "WhenThenList" | "XorExpression";
@@ -1,5 +1,5 @@
1
- import { A as DefaultOperatorName, L as Except, P as ExpressionNode, T as DefaultRuleGroupTypeIC, j as DefaultRuleGroupType, k as DefaultCombinatorNameExtended } from "./index-CX9mehdL.js";
2
- import { t as ParserCommonOptions } from "./import-6ExjhifL.js";
1
+ import { $t as DefaultRuleGroupType, Pt as DefaultRuleGroupTypeIC, Yt as DefaultCombinatorNameExtended, Zt as DefaultOperatorName, jn as Except, on as ExpressionNode } from "./index-DOIE2pwx.js";
2
+ import { t as ParserCommonOptions } from "./import-BfZTwhp2.js";
3
3
  //#region src/utils/parseSQL/types.d.ts
4
4
  type AnyCase<T extends string> = string extends T ? string : T extends `${infer F1}${infer F2}${infer R}` ? `${Uppercase<F1> | Lowercase<F1>}${Uppercase<F2> | Lowercase<F2>}${AnyCase<R>}` : T extends `${infer F}${infer R}` ? `${Uppercase<F> | Lowercase<F>}${AnyCase<R>}` : "";
5
5
  type TokenType = "AndExpression" | "BetweenPredicate" | "BitExpression" | "Boolean" | "BooleanExtra" | "CaseWhen" | "ComparisonBooleanPrimary" | "ComparisonSubQueryBooleanPrimary" | "ContainsExpr" | "EndsWithExpr" | "ExpressionList" | "ForceIndexHint" | "ForOptIndexHint" | "FunctionCall" | "FunctionCallParam" | "GroupBy" | "GroupByOrderByItem" | "Identifier" | "IdentifierExpr" | "IdentifierList" | "IgnoreIndexHint" | "IndexHintList" | "InExpressionListPredicate" | "InnerCrossJoinTable" | "InSubQueryPredicate" | "IsExpression" | "IsNullBooleanPrimary" | "LeftRightJoinTable" | "LikePredicate" | "Limit" | "Main" | "NaturalJoinTable" | "NotExpression" | "Null" | "Number" | "OnJoinCondition" | "OrderBy" | "OrExpression" | "Partitions" | "PlaceHolder" | "Prefix" | "RegexpPredicate" | "Select" | "SelectExpr" | "SelectParenthesized" | "SimpleExprParentheses" | "SoundsLikePredicate" | "StartsWithExpr" | "StraightJoinTable" | "String" | "SubQuery" | "TableFactor" | "TableReference" | "TableReferences" | "Union" | "UseIndexHint" | "UsingJoinCondition" | "WhenThenList" | "XorExpression";
package/dist/parseSQL.js CHANGED
@@ -1,7 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_utils = require("./utils-C79dxwZb.js");
3
- const require_isRuleGroup = require("./isRuleGroup-0JNiQgLg.js");
4
- const require_prepareQueryObjects = require("./prepareQueryObjects-BnGL91Tt.js");
2
+ const require_utils = require("./utils-e-7KHkjV.js");
3
+ const require_objectUtils = require("./objectUtils-DfnEmDSV.js");
4
+ const require_prepareQueryObjects = require("./prepareQueryObjects-Dj9cTl9D.js");
5
+ const require_parserUtils = require("./parserUtils-DbBXyAht.js");
5
6
  let _ts_jison_parser = require("@ts-jison/parser");
6
7
  let _ts_jison_lexer = require("@ts-jison/lexer");
7
8
  //#region src/utils/parseSQL/sqlParser.ts
@@ -5909,7 +5910,7 @@ const getFieldName = (f) => {
5909
5910
  else if (fieldName.startsWith("[") && fieldName.endsWith("]")) return fieldName.replaceAll(/(^\[|]$)/g, "").replaceAll("]]", "]");
5910
5911
  return fieldName;
5911
5912
  };
5912
- const normalizeCombinator = (c) => require_isRuleGroup.lc(c.replace("&&", "and").replace("||", "or"));
5913
+ const normalizeCombinator = (c) => require_objectUtils.lc(c.replace("&&", "and").replace("||", "or"));
5913
5914
  const normalizeOperator = (op, flip) => {
5914
5915
  if (flip) {
5915
5916
  if (op === "<") return ">";
@@ -5925,7 +5926,7 @@ const evalSQLLiteralValue = (valueObj, { bigIntOnOverflow } = {}) => {
5925
5926
  const valueString = valueObj.value;
5926
5927
  if (valueString.startsWith(`'`) && valueString.endsWith(`'`) || valueString.startsWith(`"`) && valueString.endsWith(`"`)) return valueString.slice(1, -1).replaceAll(/''/gm, "'");
5927
5928
  return valueString;
5928
- } else if (valueObj.type === "Boolean") return require_isRuleGroup.lc(valueObj.value) === "true";
5929
+ } else if (valueObj.type === "Boolean") return require_objectUtils.lc(valueObj.value) === "true";
5929
5930
  else if (isSQLSignedNumber(valueObj)) return require_utils.parseNumber(`${valueObj.prefix}${valueObj.value.value}`, {
5930
5931
  parseNumbers: true,
5931
5932
  bigIntOnOverflow
@@ -6024,9 +6025,10 @@ const generateMixedAndXorOrList = (expr) => {
6024
6025
  combinator: "or",
6025
6026
  expressions: []
6026
6027
  };
6027
- for (const o of orArray.expressions) if ("combinator" in o) if ("combinator" in o.expressions[0] && o.expressions.length === 1) returnArray.expressions.push(o.expressions[0]);
6028
- else returnArray.expressions.push(o);
6029
- else returnArray.expressions.push(o);
6028
+ for (const o of orArray.expressions) if ("combinator" in o) {
6029
+ if ("combinator" in o.expressions[0] && o.expressions.length === 1) returnArray.expressions.push(o.expressions[0]);
6030
+ else returnArray.expressions.push(o);
6031
+ } else returnArray.expressions.push(o);
6030
6032
  return returnArray;
6031
6033
  };
6032
6034
  //#endregion
@@ -6089,20 +6091,22 @@ function parseSQL(sql, options = {}) {
6089
6091
  const { params, paramPrefix, independentCombinators, fields, getValueSources, bigIntOnOverflow, getExpression, parseParameters } = options;
6090
6092
  let sqlString = /^\s*select\b/i.test(sql) ? sql : /^\s*where\b/i.test(sql) ? `SELECT * FROM t ${sql}` : `SELECT * FROM t WHERE ${sql}`;
6091
6093
  let ic = false;
6092
- const fieldsFlat = require_prepareQueryObjects.getFieldsArray(fields);
6094
+ const fieldsFlat = require_parserUtils.getFieldsArray(fields);
6093
6095
  ic = !!independentCombinators;
6094
6096
  /* v8 ignore else -- @preserve */
6095
- if (params) if (Array.isArray(params)) {
6096
- let i = 0;
6097
- sqlString = sqlString.replaceAll("?", () => {
6098
- const paramString = getParamString(params[i]);
6099
- i++;
6100
- return paramString;
6101
- });
6102
- } else {
6103
- const keys = Object.keys(params);
6104
- const prefix = paramPrefix ?? ":";
6105
- for (const p of keys) sqlString = sqlString.replaceAll(new RegExp(`\\${prefix}${p}\\b`, "ig"), getParamString(params[p]));
6097
+ if (params) {
6098
+ if (Array.isArray(params)) {
6099
+ let i = 0;
6100
+ sqlString = sqlString.replaceAll("?", () => {
6101
+ const paramString = getParamString(params[i]);
6102
+ i++;
6103
+ return paramString;
6104
+ });
6105
+ } else {
6106
+ const keys = Object.keys(params);
6107
+ const prefix = paramPrefix ?? ":";
6108
+ for (const p of keys) sqlString = sqlString.replaceAll(new RegExp(`\\${prefix}${p}\\b`, "ig"), getParamString(params[p]));
6109
+ }
6106
6110
  }
6107
6111
  if (parseParameters) {
6108
6112
  const cfg = parseParameters === true ? {} : parseParameters;
@@ -6111,7 +6115,7 @@ function parseSQL(sql, options = {}) {
6111
6115
  const positional = cfg.positional ?? true;
6112
6116
  sqlString = normalizeParameterPlaceholders(sqlString, prefixes, positional);
6113
6117
  }
6114
- const fieldIsValid = (fieldName, operator, subordinateFieldName) => require_prepareQueryObjects.fieldIsValidUtil({
6118
+ const fieldIsValid = (fieldName, operator, subordinateFieldName) => require_parserUtils.fieldIsValidUtil({
6115
6119
  fieldName,
6116
6120
  fieldsFlat,
6117
6121
  operator,
@@ -6128,7 +6132,7 @@ function parseSQL(sql, options = {}) {
6128
6132
  const val = expr.value.type === "SimpleExprParentheses" ? expr.value.value.value[0] : expr.value;
6129
6133
  const rule = processSQLExpression(val);
6130
6134
  if (rule) {
6131
- if (require_isRuleGroup.isRuleGroup(rule)) return {
6135
+ if (require_objectUtils.isRuleGroup(rule)) return {
6132
6136
  ...rule,
6133
6137
  not: true
6134
6138
  };
@@ -6392,7 +6396,7 @@ function parseSQL(sql, options = {}) {
6392
6396
  if (where) {
6393
6397
  const result = processSQLExpression(where);
6394
6398
  if (result) {
6395
- if (require_isRuleGroup.isRuleGroup(result)) return prepare(result);
6399
+ if (require_objectUtils.isRuleGroup(result)) return prepare(result);
6396
6400
  return prepare({
6397
6401
  rules: [result],
6398
6402
  ...ic ? {} : { combinator: "and" }