@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.
- package/derivations/package.json +4 -0
- package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +2078 -1665
- package/dist/cjs/react-querybuilder_core.cjs.development.js +1293 -422
- package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +2078 -1665
- package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
- package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
- package/dist/{convertQuery-Cw76XFIn.js → convertQuery-BLT0GIhM.js} +17 -8
- package/dist/{convertQuery-Cw76XFIn.js.map → convertQuery-BLT0GIhM.js.map} +1 -1
- package/dist/{convertQuery-D_4J7E-Z.mjs → convertQuery-DaXv3h7S.mjs} +6 -3
- package/dist/{convertQuery-D_4J7E-Z.mjs.map → convertQuery-DaXv3h7S.mjs.map} +1 -1
- package/dist/derivations.d.mts +2902 -0
- package/dist/derivations.d.ts +2902 -0
- package/dist/derivations.js +2845 -0
- package/dist/derivations.js.map +1 -0
- package/dist/derivations.mjs +2678 -0
- package/dist/derivations.mjs.map +1 -0
- package/dist/formatQuery.d.mts +2 -895
- package/dist/formatQuery.d.ts +2 -895
- package/dist/formatQuery.js +120 -140
- package/dist/formatQuery.js.map +1 -1
- package/dist/formatQuery.mjs +8 -28
- package/dist/formatQuery.mjs.map +1 -1
- package/dist/{import-DVWI7Fdh.d.mts → import-BdKPtLzo.d.mts} +2 -2
- package/dist/{import-6ExjhifL.d.ts → import-BfZTwhp2.d.ts} +2 -2
- package/dist/{index-CX9mehdL.d.mts → index-DOIE2pwx.d.mts} +274 -3
- package/dist/{index-CX9mehdL.d.ts → index-DOIE2pwx.d.ts} +274 -3
- package/dist/index-OF2Q1gTp.d.mts +895 -0
- package/dist/index-XueTy_XQ.d.ts +895 -0
- package/dist/isRuleOrGroupValid-CIMZNkt4.mjs +27 -0
- package/dist/isRuleOrGroupValid-CIMZNkt4.mjs.map +1 -0
- package/dist/isRuleOrGroupValid-CtUf4_4x.js +38 -0
- package/dist/isRuleOrGroupValid-CtUf4_4x.js.map +1 -0
- package/dist/{isRuleGroup-CqLThsbu.mjs → objectUtils-DDZ-KhV5.mjs} +25 -2
- package/dist/objectUtils-DDZ-KhV5.mjs.map +1 -0
- package/dist/{isRuleGroup-0JNiQgLg.js → objectUtils-DfnEmDSV.js} +48 -1
- package/dist/objectUtils-DfnEmDSV.js.map +1 -0
- package/dist/parseCEL.d.mts +2 -2
- package/dist/parseCEL.d.ts +2 -2
- package/dist/parseCEL.js +19 -16
- package/dist/parseCEL.js.map +1 -1
- package/dist/parseCEL.mjs +12 -9
- package/dist/parseCEL.mjs.map +1 -1
- package/dist/parseCypher.d.mts +1 -1
- package/dist/parseCypher.d.ts +1 -1
- package/dist/parseGremlin.d.mts +1 -1
- package/dist/parseGremlin.d.ts +1 -1
- package/dist/parseJSONata.d.mts +2 -2
- package/dist/parseJSONata.d.ts +2 -2
- package/dist/parseJSONata.js +17 -14
- package/dist/parseJSONata.js.map +1 -1
- package/dist/parseJSONata.mjs +11 -8
- package/dist/parseJSONata.mjs.map +1 -1
- package/dist/parseJsonLogic.d.mts +2 -2
- package/dist/parseJsonLogic.d.ts +2 -2
- package/dist/parseJsonLogic.js +38 -38
- package/dist/parseJsonLogic.js.map +1 -1
- package/dist/parseJsonLogic.mjs +5 -5
- package/dist/parseMongoDB.d.mts +2 -2
- package/dist/parseMongoDB.d.ts +2 -2
- package/dist/parseMongoDB.js +50 -47
- package/dist/parseMongoDB.js.map +1 -1
- package/dist/parseMongoDB.mjs +35 -32
- package/dist/parseMongoDB.mjs.map +1 -1
- package/dist/parseSPARQL.d.mts +1 -1
- package/dist/parseSPARQL.d.ts +1 -1
- package/dist/parseSQL.d.mts +2 -2
- package/dist/parseSQL.d.ts +2 -2
- package/dist/parseSQL.js +27 -23
- package/dist/parseSQL.js.map +1 -1
- package/dist/parseSQL.mjs +21 -17
- package/dist/parseSQL.mjs.map +1 -1
- package/dist/parseSpEL.d.mts +2 -2
- package/dist/parseSpEL.d.ts +2 -2
- package/dist/parseSpEL.js +16 -13
- package/dist/parseSpEL.js.map +1 -1
- package/dist/parseSpEL.mjs +12 -9
- package/dist/parseSpEL.mjs.map +1 -1
- package/dist/parserUtils-BKPstAaO.mjs +30 -0
- package/dist/parserUtils-BKPstAaO.mjs.map +1 -0
- package/dist/parserUtils-DbBXyAht.js +41 -0
- package/dist/parserUtils-DbBXyAht.js.map +1 -0
- package/dist/{prepareQueryObjects-BnGL91Tt.js → prepareQueryObjects-Dj9cTl9D.js} +90 -63
- package/dist/prepareQueryObjects-Dj9cTl9D.js.map +1 -0
- package/dist/{prepareQueryObjects-ChINDIap.mjs → prepareQueryObjects-Dmyf3Wi_.mjs} +56 -59
- package/dist/prepareQueryObjects-Dmyf3Wi_.mjs.map +1 -0
- package/dist/react-querybuilder_core.d.mts +2078 -1665
- package/dist/react-querybuilder_core.legacy-esm.d.ts +2078 -1665
- package/dist/react-querybuilder_core.legacy-esm.js +1445 -635
- package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
- package/dist/react-querybuilder_core.mjs +1288 -424
- package/dist/react-querybuilder_core.mjs.map +1 -1
- package/dist/react-querybuilder_core.production.d.mts +2078 -1665
- package/dist/react-querybuilder_core.production.mjs +1 -1
- package/dist/react-querybuilder_core.production.mjs.map +1 -1
- package/dist/transformQuery-B7d9AWUf.d.mts +116 -0
- package/dist/transformQuery-BXDiUBGB.d.ts +116 -0
- package/dist/transformQuery.d.mts +2 -116
- package/dist/transformQuery.d.ts +2 -116
- package/dist/transformQuery.js +3 -4
- package/dist/transformQuery.js.map +1 -1
- package/dist/transformQuery.mjs +1 -2
- package/dist/transformQuery.mjs.map +1 -1
- package/dist/utils-CP5Jqy1P.mjs +1294 -0
- package/dist/utils-CP5Jqy1P.mjs.map +1 -0
- package/dist/utils-e-7KHkjV.js +1779 -0
- package/dist/utils-e-7KHkjV.js.map +1 -0
- package/package.json +33 -22
- package/dist/isRuleGroup-0JNiQgLg.js.map +0 -1
- package/dist/isRuleGroup-CqLThsbu.mjs.map +0 -1
- package/dist/objectUtils-Cr02aGxb.js +0 -27
- package/dist/objectUtils-Cr02aGxb.js.map +0 -1
- package/dist/objectUtils-DBlmJgBf.mjs +0 -16
- package/dist/objectUtils-DBlmJgBf.mjs.map +0 -1
- package/dist/prepareQueryObjects-BnGL91Tt.js.map +0 -1
- package/dist/prepareQueryObjects-ChINDIap.mjs.map +0 -1
- package/dist/utils-4k-j5FBa.mjs +0 -537
- package/dist/utils-4k-j5FBa.mjs.map +0 -1
- package/dist/utils-C79dxwZb.js +0 -752
- package/dist/utils-C79dxwZb.js.map +0 -1
package/dist/parseMongoDB.js.map
CHANGED
|
@@ -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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"}
|
package/dist/parseMongoDB.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { n as
|
|
5
|
-
import { n as
|
|
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")
|
|
159
|
-
if (
|
|
160
|
-
field,
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
field,
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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)
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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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"}
|
package/dist/parseSPARQL.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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}.
|
package/dist/parseSPARQL.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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}.
|
package/dist/parseSQL.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as ParserCommonOptions } from "./import-
|
|
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";
|
package/dist/parseSQL.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as ParserCommonOptions } from "./import-
|
|
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-
|
|
3
|
-
const
|
|
4
|
-
const require_prepareQueryObjects = require("./prepareQueryObjects-
|
|
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) =>
|
|
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
|
|
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)
|
|
6028
|
-
|
|
6029
|
-
|
|
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 =
|
|
6094
|
+
const fieldsFlat = require_parserUtils.getFieldsArray(fields);
|
|
6093
6095
|
ic = !!independentCombinators;
|
|
6094
6096
|
/* v8 ignore else -- @preserve */
|
|
6095
|
-
if (params)
|
|
6096
|
-
|
|
6097
|
-
|
|
6098
|
-
|
|
6099
|
-
|
|
6100
|
-
|
|
6101
|
-
|
|
6102
|
-
|
|
6103
|
-
|
|
6104
|
-
|
|
6105
|
-
|
|
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) =>
|
|
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 (
|
|
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 (
|
|
6399
|
+
if (require_objectUtils.isRuleGroup(result)) return prepare(result);
|
|
6396
6400
|
return prepare({
|
|
6397
6401
|
rules: [result],
|
|
6398
6402
|
...ic ? {} : { combinator: "and" }
|