@react-querybuilder/core 8.20.2 → 8.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +4 -0
  2. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +2261 -2113
  3. package/dist/cjs/react-querybuilder_core.cjs.development.js +319 -22
  4. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  5. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +2261 -2113
  6. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  7. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  8. package/dist/{convertQuery-BJKNgecE.js → convertQuery-Cw76XFIn.js} +8 -8
  9. package/dist/{convertQuery-BJKNgecE.js.map → convertQuery-Cw76XFIn.js.map} +1 -1
  10. package/dist/{convertQuery-J1CaoDxe.mjs → convertQuery-D_4J7E-Z.mjs} +2 -2
  11. package/dist/{convertQuery-J1CaoDxe.mjs.map → convertQuery-D_4J7E-Z.mjs.map} +1 -1
  12. package/dist/formatQuery.d.mts +499 -459
  13. package/dist/formatQuery.d.ts +499 -459
  14. package/dist/formatQuery.js +170 -88
  15. package/dist/formatQuery.js.map +1 -1
  16. package/dist/formatQuery.mjs +97 -20
  17. package/dist/formatQuery.mjs.map +1 -1
  18. package/dist/import-BVdxeIBO.d.mts +26 -0
  19. package/dist/import-Ddc3d_8q.d.ts +26 -0
  20. package/dist/{index-DlVg-QXo.d.mts → index-BSwFvkeI.d.mts} +679 -648
  21. package/dist/{index-DlVg-QXo.d.ts → index-BSwFvkeI.d.ts} +679 -648
  22. package/dist/{objectUtils-DBJI82bl.js → isRuleGroup-0JNiQgLg.js} +1 -26
  23. package/dist/isRuleGroup-0JNiQgLg.js.map +1 -0
  24. package/dist/{objectUtils-ZvPkF6u6.mjs → isRuleGroup-CqLThsbu.mjs} +2 -15
  25. package/dist/isRuleGroup-CqLThsbu.mjs.map +1 -0
  26. package/dist/objectUtils-Cr02aGxb.js +27 -0
  27. package/dist/objectUtils-Cr02aGxb.js.map +1 -0
  28. package/dist/objectUtils-DBlmJgBf.mjs +16 -0
  29. package/dist/objectUtils-DBlmJgBf.mjs.map +1 -0
  30. package/dist/parseCEL.d.mts +64 -30
  31. package/dist/parseCEL.d.ts +64 -30
  32. package/dist/parseCEL.js +91 -12
  33. package/dist/parseCEL.js.map +1 -1
  34. package/dist/parseCEL.mjs +85 -8
  35. package/dist/parseCEL.mjs.map +1 -1
  36. package/dist/parseCypher.d.mts +24 -25
  37. package/dist/parseCypher.d.ts +24 -25
  38. package/dist/parseGremlin.d.mts +18 -19
  39. package/dist/parseGremlin.d.ts +18 -19
  40. package/dist/parseJSONata.d.mts +207 -20
  41. package/dist/parseJSONata.d.ts +207 -20
  42. package/dist/parseJSONata.js +92 -7
  43. package/dist/parseJSONata.js.map +1 -1
  44. package/dist/parseJSONata.mjs +80 -4
  45. package/dist/parseJSONata.mjs.map +1 -1
  46. package/dist/parseJsonLogic.d.mts +51 -18
  47. package/dist/parseJsonLogic.d.ts +51 -18
  48. package/dist/parseJsonLogic.js +95 -34
  49. package/dist/parseJsonLogic.js.map +1 -1
  50. package/dist/parseJsonLogic.mjs +65 -6
  51. package/dist/parseJsonLogic.mjs.map +1 -1
  52. package/dist/parseMongoDB.d.mts +89 -58
  53. package/dist/parseMongoDB.d.ts +89 -58
  54. package/dist/parseMongoDB.js +140 -15
  55. package/dist/parseMongoDB.js.map +1 -1
  56. package/dist/parseMongoDB.mjs +128 -5
  57. package/dist/parseMongoDB.mjs.map +1 -1
  58. package/dist/parseSPARQL.d.mts +17 -18
  59. package/dist/parseSPARQL.d.ts +17 -18
  60. package/dist/parseSPARQL.js.map +1 -1
  61. package/dist/parseSPARQL.mjs.map +1 -1
  62. package/dist/parseSQL.d.mts +266 -18
  63. package/dist/parseSQL.d.ts +266 -18
  64. package/dist/parseSQL.js +163 -10
  65. package/dist/parseSQL.js.map +1 -1
  66. package/dist/parseSQL.mjs +149 -7
  67. package/dist/parseSQL.mjs.map +1 -1
  68. package/dist/parseSpEL.d.mts +193 -19
  69. package/dist/parseSpEL.d.ts +193 -19
  70. package/dist/parseSpEL.js +166 -7
  71. package/dist/parseSpEL.js.map +1 -1
  72. package/dist/parseSpEL.mjs +142 -6
  73. package/dist/parseSpEL.mjs.map +1 -1
  74. package/dist/{prepareQueryObjects-Bni5VgYM.js → prepareQueryObjects-C2-kTZvR.js} +5 -5
  75. package/dist/prepareQueryObjects-C2-kTZvR.js.map +1 -0
  76. package/dist/{prepareQueryObjects-BCLU20Cg.mjs → prepareQueryObjects-Q18lHCKl.mjs} +3 -3
  77. package/dist/prepareQueryObjects-Q18lHCKl.mjs.map +1 -0
  78. package/dist/query-builder-layout.css.map +1 -1
  79. package/dist/query-builder.css.map +1 -1
  80. package/dist/react-querybuilder_core.d.mts +2261 -2113
  81. package/dist/react-querybuilder_core.legacy-esm.d.ts +2261 -2113
  82. package/dist/react-querybuilder_core.legacy-esm.js +335 -40
  83. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  84. package/dist/react-querybuilder_core.mjs +309 -23
  85. package/dist/react-querybuilder_core.mjs.map +1 -1
  86. package/dist/react-querybuilder_core.production.d.mts +2261 -2113
  87. package/dist/react-querybuilder_core.production.mjs +1 -1
  88. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  89. package/dist/styles/_layout.scss +4 -10
  90. package/dist/transformQuery.d.mts +91 -92
  91. package/dist/transformQuery.d.ts +91 -92
  92. package/dist/transformQuery.js +4 -3
  93. package/dist/transformQuery.js.map +1 -1
  94. package/dist/transformQuery.mjs +2 -1
  95. package/dist/transformQuery.mjs.map +1 -1
  96. package/dist/{utils-BpaOtylk.js → utils-DEwV7F6B.js} +108 -12
  97. package/dist/utils-DEwV7F6B.js.map +1 -0
  98. package/dist/{utils-CJRGiPb-.mjs → utils-Dt0D_DMV.mjs} +69 -3
  99. package/dist/utils-Dt0D_DMV.mjs.map +1 -0
  100. package/package.json +14 -14
  101. package/dist/import-Qs1-kgv5.d.ts +0 -27
  102. package/dist/import-ShTj5IdB.d.mts +0 -27
  103. package/dist/objectUtils-DBJI82bl.js.map +0 -1
  104. package/dist/objectUtils-ZvPkF6u6.mjs.map +0 -1
  105. package/dist/prepareQueryObjects-BCLU20Cg.mjs.map +0 -1
  106. package/dist/prepareQueryObjects-Bni5VgYM.js.map +0 -1
  107. package/dist/utils-BpaOtylk.js.map +0 -1
  108. package/dist/utils-CJRGiPb-.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"parseJsonLogic.js","names":["isPojo","getFieldsArray","fieldIsValidUtil","isPojo","objectKeys","isRuleGroup","isRuleGroupType","defaultOperatorNegationMap","joinWith","prepareRuleGroup","convertToIC"],"sources":["../src/utils/parseJsonLogic/utils.ts","../src/utils/parseJsonLogic/parseJsonLogic.ts"],"sourcesContent":["import type {\n JsonLogicAll,\n JsonLogicAnd,\n JsonLogicDoubleNegation,\n JsonLogicEqual,\n JsonLogicGreaterThan,\n JsonLogicGreaterThanOrEqual,\n JsonLogicInArray,\n JsonLogicInString,\n JsonLogicLessThan,\n JsonLogicLessThanOrEqual,\n JsonLogicNegation,\n JsonLogicNone,\n JsonLogicNotEqual,\n JsonLogicOr,\n JsonLogicSome,\n JsonLogicStrictEqual,\n JsonLogicStrictNotEqual,\n JsonLogicVar,\n RQBJsonLogicEndsWith,\n RQBJsonLogicStartsWith,\n RQBJsonLogicVar,\n} from '../../types';\nimport { isPojo } from '../misc';\nimport type { JsonLogicBetweenExclusive, JsonLogicBetweenInclusive } from './types';\n\n// Standard JsonLogic operations\nexport const isJsonLogicVar = (\n logic: unknown\n): logic is JsonLogicVar<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'var' in logic;\nexport const isRQBJsonLogicVar = (logic: unknown): logic is RQBJsonLogicVar =>\n isJsonLogicVar(logic) && typeof logic.var === 'string';\nexport const isJsonLogicEqual = (logic: unknown): logic is JsonLogicEqual =>\n isPojo(logic) && '==' in logic;\nexport const isJsonLogicStrictEqual = (logic: unknown): logic is JsonLogicStrictEqual =>\n isPojo(logic) && '===' in logic;\nexport const isJsonLogicNotEqual = (logic: unknown): logic is JsonLogicNotEqual =>\n isPojo(logic) && '!=' in logic;\nexport const isJsonLogicStrictNotEqual = (logic: unknown): logic is JsonLogicStrictNotEqual =>\n isPojo(logic) && '!==' in logic;\nexport const isJsonLogicNegation = (logic: unknown): logic is JsonLogicNegation =>\n isPojo(logic) && '!' in logic;\nexport const isJsonLogicDoubleNegation = (logic: unknown): logic is JsonLogicDoubleNegation =>\n isPojo(logic) && '!!' in logic;\nexport const isJsonLogicOr = (\n logic: unknown\n): logic is JsonLogicOr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'or' in logic;\nexport const isJsonLogicAnd = (\n logic: unknown\n): logic is JsonLogicAnd<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'and' in logic;\nexport const isJsonLogicGreaterThan = (\n logic: unknown\n): logic is JsonLogicGreaterThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>' in logic;\nexport const isJsonLogicGreaterThanOrEqual = (\n logic: unknown\n): logic is JsonLogicGreaterThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>=' in logic;\nexport const isJsonLogicLessThan = (\n logic: unknown\n): logic is JsonLogicLessThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<' in logic && logic['<'].length === 2;\nexport const isJsonLogicLessThanOrEqual = (\n logic: unknown\n): logic is JsonLogicLessThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<=' in logic && logic['<='].length === 2;\nexport const isJsonLogicInArray = (\n logic: unknown\n): logic is JsonLogicInArray<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && Array.isArray(logic.in[1]);\nexport const isJsonLogicInString = (\n logic: unknown\n): logic is JsonLogicInString<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && !Array.isArray(logic.in[1]);\nexport const isJsonLogicAll = (\n logic: unknown\n): logic is JsonLogicAll<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'all' in logic;\nexport const isJsonLogicNone = (\n logic: unknown\n): logic is JsonLogicNone<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'none' in logic;\nexport const isJsonLogicSome = (\n logic: unknown\n): logic is JsonLogicSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'some' in logic;\n\n// \"Between\" operations are special cases of '<' and '<='\nexport const isJsonLogicBetweenExclusive = (logic: unknown): logic is JsonLogicBetweenExclusive =>\n isPojo(logic) && '<' in logic && Array.isArray(logic['<']) && logic['<'].length === 3;\nexport const isJsonLogicBetweenInclusive = (logic: unknown): logic is JsonLogicBetweenInclusive =>\n isPojo(logic) && '<=' in logic && Array.isArray(logic['<=']) && logic['<='].length === 3;\n\n// RQB extensions\nexport const isRQBJsonLogicStartsWith = (logic: unknown): logic is RQBJsonLogicStartsWith =>\n isPojo(logic) && 'startsWith' in logic;\nexport const isRQBJsonLogicEndsWith = (logic: unknown): logic is RQBJsonLogicEndsWith =>\n isPojo(logic) && 'endsWith' in logic;\n\n// Type guards for unused JsonLogic operations\n\n// import type {\n// JsonLogicCat,\n// JsonLogicDifference,\n// JsonLogicFilter,\n// JsonLogicIf,\n// JsonLogicLog,\n// JsonLogicMap,\n// JsonLogicMax,\n// JsonLogicMerge,\n// JsonLogicMin,\n// JsonLogicMissing,\n// JsonLogicMissingSome,\n// JsonLogicProduct,\n// JsonLogicQuotient,\n// JsonLogicReduce,\n// JsonLogicRemainder,\n// JsonLogicSubstr,\n// JsonLogicSum,\n// } from '../../types';\n//\n// export const isJsonLogicMissing = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissing<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing' in logic;\n// export const isJsonLogicMissingSome = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissingSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing_some' in logic;\n// export const isJsonLogicIf = (logic: RQBJsonLogic): logic is JsonLogicIf =>\n// isPojo(logic) && 'if' in logic;\n// export const isJsonLogicMax = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMax<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'max' in logic;\n// export const isJsonLogicMin = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMin<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'min' in logic;\n// export const isJsonLogicSum = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSum<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '+' in logic;\n// export const isJsonLogicDifference = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicDifference<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '-' in logic;\n// export const isJsonLogicProduct = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicProduct<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '*' in logic;\n// export const isJsonLogicQuotient = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicQuotient<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '/' in logic;\n// export const isJsonLogicRemainder = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicRemainder<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '%' in logic;\n// export const isJsonLogicMap = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMap<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'map' in logic;\n// export const isJsonLogicFilter = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicFilter<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'filter' in logic;\n// export const isJsonLogicReduce = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicReduce<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'reduce' in logic;\n// export const isJsonLogicMerge = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMerge<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'merge' in logic;\n// export const isJsonLogicCat = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicCat<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'cat' in logic;\n// export const isJsonLogicSubstr = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSubstr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'substr' in logic;\n// export const isJsonLogicLog = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicLog<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'log' in logic;\n","import type { Except } from 'type-fest';\nimport { defaultOperatorNegationMap } from '../../defaults';\nimport type {\n DefaultOperatorName,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n MatchConfig,\n RQBJsonLogic,\n RQBJsonLogicVar,\n RuleGroupTypeAny,\n RuleType,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { convertToIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isPojo } from '../misc';\nimport { objectKeys } from '../objectUtils';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport {\n isJsonLogicAll,\n isJsonLogicAnd,\n isJsonLogicBetweenExclusive,\n isJsonLogicBetweenInclusive,\n isJsonLogicDoubleNegation,\n isJsonLogicEqual,\n isJsonLogicGreaterThan,\n isJsonLogicGreaterThanOrEqual,\n isJsonLogicInArray,\n isJsonLogicInString,\n isJsonLogicLessThan,\n isJsonLogicLessThanOrEqual,\n isJsonLogicNegation,\n isJsonLogicNone,\n isJsonLogicNotEqual,\n isJsonLogicOr,\n isJsonLogicSome,\n isJsonLogicStrictEqual,\n isJsonLogicStrictNotEqual,\n isRQBJsonLogicEndsWith,\n isRQBJsonLogicStartsWith,\n isRQBJsonLogicVar,\n} from './utils';\n\n/**\n * Options object for {@link parseJsonLogic}.\n */\nexport interface ParseJsonLogicOptions extends ParserCommonOptions {\n // oxlint-disable-next-line typescript/no-explicit-any\n jsonLogicOperations?: Record<string, (value: any) => RuleType | RuleGroupTypeAny | false>;\n}\n\nconst emptyRuleGroup: DefaultRuleGroupType = { combinator: 'and', rules: [] };\n\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(rqbJsonLogic: string | RQBJsonLogic): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: ParseJsonLogicOptions = {}\n): DefaultRuleGroupTypeAny {\n const fieldsFlat = getFieldsArray(options.fields);\n const { getValueSources, listsAsArrays, jsonLogicOperations } = 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 // Overload 1: Always return a rule group or false for the outermost logic object\n function processLogic(logic: RQBJsonLogic, outermost: true): DefaultRuleGroupType | false;\n // Overload 2: If not the outermost object, return value could also be a rule\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: false,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false;\n // Implementation\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: boolean,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false {\n // Bail if the outermost logic is not a plain object\n if (outermost && !isPojo(logic)) {\n return false;\n }\n const [key, keyValue] = Object.entries(logic || {})?.[0] ?? [];\n\n // Custom operations process logic\n if (jsonLogicOperations && objectKeys(jsonLogicOperations).includes(key)) {\n const rule = jsonLogicOperations[key](keyValue) as DefaultRuleType;\n return rule\n ? outermost && !isRuleGroup(rule)\n ? { combinator: 'and', rules: [rule] }\n : rule\n : false;\n }\n\n // Rule groups\n if (isJsonLogicAnd(logic)) {\n return {\n combinator: 'and',\n rules: logic.and.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicOr(logic)) {\n return {\n combinator: 'or',\n rules: logic.or.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicNegation(logic)) {\n const rule = processLogic(logic['!'], false, inSubquery);\n if (rule) {\n if (\n !isRuleGroupType(rule) &&\n (rule.operator === 'between' ||\n rule.operator === 'in' ||\n rule.operator === 'contains' ||\n rule.operator === 'beginsWith' ||\n rule.operator === 'endsWith')\n ) {\n const newRule = { ...rule, operator: defaultOperatorNegationMap[rule.operator] };\n if (outermost) {\n return { combinator: 'and', rules: [newRule] };\n }\n return newRule;\n } else if (isJsonLogicBetweenExclusive(logic['!']) || isRuleGroupType(rule)) {\n return { ...rule, not: true };\n }\n return { combinator: 'and', rules: [rule], not: true };\n }\n return false;\n } else if (isJsonLogicDoubleNegation(logic)) {\n const rule = processLogic(logic['!!'], false, inSubquery);\n return rule || false;\n }\n\n // All other keys represent rules\n let rule: DefaultRuleType | false = false;\n let field = '';\n let operator: DefaultOperatorName = '=';\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = '';\n let valueSource: ValueSource | undefined = undefined;\n\n if (\n // Basic boolean operations\n isJsonLogicEqual(logic) ||\n isJsonLogicStrictEqual(logic) ||\n isJsonLogicNotEqual(logic) ||\n isJsonLogicStrictNotEqual(logic) ||\n isJsonLogicGreaterThan(logic) ||\n isJsonLogicGreaterThanOrEqual(logic) ||\n isJsonLogicLessThan(logic) ||\n isJsonLogicLessThanOrEqual(logic) ||\n isJsonLogicInString(logic) ||\n isRQBJsonLogicStartsWith(logic) ||\n isRQBJsonLogicEndsWith(logic)\n ) {\n const [first, second] = keyValue;\n if (isRQBJsonLogicVar(first) && !isPojo(second)) {\n field = first.var;\n value = second;\n } else if (!isPojo(first) && isRQBJsonLogicVar(second)) {\n field = second.var;\n value = first;\n } else if (isRQBJsonLogicVar(first) && isRQBJsonLogicVar(second)) {\n field = first.var;\n value = second.var;\n valueSource = 'field';\n } else {\n return false;\n }\n\n // Translate operator if necessary\n if (isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic)) {\n operator = value === null ? 'null' : '=';\n } else if (isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic)) {\n operator = value === null ? 'notNull' : '!=';\n } else if (isJsonLogicInString(logic)) {\n operator = 'contains';\n } else if (isRQBJsonLogicStartsWith(logic)) {\n operator = 'beginsWith';\n } else if (isRQBJsonLogicEndsWith(logic)) {\n operator = 'endsWith';\n } else {\n operator = key as DefaultOperatorName;\n }\n\n if (\n inSubquery ||\n fieldIsValid(field, operator, valueSource === 'field' ? value : undefined)\n ) {\n rule = { field, operator, value, valueSource };\n }\n } else if (\n (isJsonLogicAll(logic) && isRQBJsonLogicVar(logic['all'][0])) ||\n (isJsonLogicNone(logic) && isRQBJsonLogicVar(logic['none'][0])) ||\n (isJsonLogicSome(logic) && isRQBJsonLogicVar(logic['some'][0]))\n ) {\n // The array coverage functions must have a field as their first element.\n // Otherwise we'd be comparing values to values, which is not supported.\n const match: MatchConfig = {\n mode: isJsonLogicNone(logic) ? 'none' : isJsonLogicSome(logic) ? 'some' : 'all',\n };\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const [{ var: fld }, operation] = (logic as any)[match.mode];\n const matcher = processLogic(operation, false, true);\n\n if (!matcher) return false;\n\n rule = {\n field: fld,\n operator: '=',\n match,\n value: isRuleGroup(matcher) ? matcher : { combinator: 'and', rules: [matcher] },\n };\n } else if (isJsonLogicBetweenExclusive(logic) && isRQBJsonLogicVar(logic['<'][1])) {\n field = logic['<'][1].var;\n const values = [logic['<'][0], logic['<'][2]];\n // v8 ignore else\n if (\n values.every(v => isRQBJsonLogicVar(v)) ||\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n return (\n processLogic({\n and: [{ '>': [{ var: field }, values[0]] }, { '<': [{ var: field }, values[1]] }],\n }) || /* v8 ignore start -- @preserve */ false /* v8 ignore stop -- @preserve */\n );\n }\n } else if (isJsonLogicBetweenInclusive(logic) && isRQBJsonLogicVar(logic['<='][1])) {\n field = logic['<='][1].var;\n operator = 'between';\n const values = [logic['<='][0], logic['<='][2]];\n if (logic['<='].every(v => isRQBJsonLogicVar(v))) {\n const vars = values as RQBJsonLogicVar[];\n valueSource = 'field';\n const fieldList = vars.map(el => el.var).filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? values\n : joinWith(\n values.map(el => `${el}`),\n ','\n );\n }\n }\n\n if (fieldIsValid(field, operator) && value.length >= 2) {\n rule = { field, operator, value, valueSource };\n }\n } else if (isJsonLogicInArray(logic) && isRQBJsonLogicVar(keyValue[0])) {\n field = keyValue[0].var;\n operator = 'in';\n if (logic.in[1].every(v => isRQBJsonLogicVar(v))) {\n valueSource = 'field';\n const fieldList = logic.in[1]\n .map(el => el.var)\n .filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n logic.in[1].every(el => typeof el === 'string') ||\n logic.in[1].every(el => typeof el === 'number') ||\n logic.in[1].every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? logic.in[1]\n : joinWith(\n logic.in[1].map(el => `${el}`),\n ','\n );\n }\n }\n\n // v8 ignore else\n if (value.length > 0) {\n rule = { field, operator, value, valueSource };\n }\n }\n\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let logicRoot = rqbJsonLogic;\n if (typeof rqbJsonLogic === 'string') {\n try {\n logicRoot = JSON.parse(rqbJsonLogic);\n } catch {\n return prepare(emptyRuleGroup);\n }\n }\n\n const result = processLogic(logicRoot, true);\n const finalQuery: DefaultRuleGroupType = result || emptyRuleGroup;\n return prepare(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);\n}\n\nexport { parseJsonLogic };\n"],"mappings":"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"}
1
+ {"version":3,"file":"parseJsonLogic.js","names":["isPojo","getFieldsArray","fieldIsValidUtil","isPojo","objectKeys","isRuleGroup","isRuleGroupType","defaultOperatorNegationMap","joinWith","prepareRuleGroup","convertToIC"],"sources":["../src/utils/parseJsonLogic/utils.ts","../src/utils/parseJsonLogic/parseJsonLogic.ts"],"sourcesContent":["import type {\n JsonLogicAll,\n JsonLogicAnd,\n JsonLogicDoubleNegation,\n JsonLogicEqual,\n JsonLogicGreaterThan,\n JsonLogicGreaterThanOrEqual,\n JsonLogicInArray,\n JsonLogicInString,\n JsonLogicLessThan,\n JsonLogicLessThanOrEqual,\n JsonLogicNegation,\n JsonLogicNone,\n JsonLogicNotEqual,\n JsonLogicOr,\n JsonLogicSome,\n JsonLogicStrictEqual,\n JsonLogicStrictNotEqual,\n JsonLogicVar,\n RQBJsonLogicEndsWith,\n RQBJsonLogicStartsWith,\n RQBJsonLogicVar,\n} from '../../types';\nimport { isPojo } from '../misc';\nimport type {\n JsonLogicBetweenExclusive,\n JsonLogicBetweenInclusive,\n JsonLogicExpressionOperand,\n} from './types';\n\n// Standard JsonLogic operations\nexport const isJsonLogicVar = (\n logic: unknown\n): logic is JsonLogicVar<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'var' in logic;\nexport const isRQBJsonLogicVar = (logic: unknown): logic is RQBJsonLogicVar =>\n isJsonLogicVar(logic) && typeof logic.var === 'string';\nexport const isJsonLogicEqual = (logic: unknown): logic is JsonLogicEqual =>\n isPojo(logic) && '==' in logic;\nexport const isJsonLogicStrictEqual = (logic: unknown): logic is JsonLogicStrictEqual =>\n isPojo(logic) && '===' in logic;\nexport const isJsonLogicNotEqual = (logic: unknown): logic is JsonLogicNotEqual =>\n isPojo(logic) && '!=' in logic;\nexport const isJsonLogicStrictNotEqual = (logic: unknown): logic is JsonLogicStrictNotEqual =>\n isPojo(logic) && '!==' in logic;\nexport const isJsonLogicNegation = (logic: unknown): logic is JsonLogicNegation =>\n isPojo(logic) && '!' in logic;\nexport const isJsonLogicDoubleNegation = (logic: unknown): logic is JsonLogicDoubleNegation =>\n isPojo(logic) && '!!' in logic;\nexport const isJsonLogicOr = (\n logic: unknown\n): logic is JsonLogicOr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'or' in logic;\nexport const isJsonLogicAnd = (\n logic: unknown\n): logic is JsonLogicAnd<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'and' in logic;\nexport const isJsonLogicGreaterThan = (\n logic: unknown\n): logic is JsonLogicGreaterThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>' in logic;\nexport const isJsonLogicGreaterThanOrEqual = (\n logic: unknown\n): logic is JsonLogicGreaterThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>=' in logic;\nexport const isJsonLogicLessThan = (\n logic: unknown\n): logic is JsonLogicLessThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<' in logic && logic['<'].length === 2;\nexport const isJsonLogicLessThanOrEqual = (\n logic: unknown\n): logic is JsonLogicLessThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<=' in logic && logic['<='].length === 2;\nexport const isJsonLogicInArray = (\n logic: unknown\n): logic is JsonLogicInArray<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && Array.isArray(logic.in[1]);\nexport const isJsonLogicInString = (\n logic: unknown\n): logic is JsonLogicInString<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && !Array.isArray(logic.in[1]);\nexport const isJsonLogicAll = (\n logic: unknown\n): logic is JsonLogicAll<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'all' in logic;\nexport const isJsonLogicNone = (\n logic: unknown\n): logic is JsonLogicNone<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'none' in logic;\nexport const isJsonLogicSome = (\n logic: unknown\n): logic is JsonLogicSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'some' in logic;\n\n// \"Between\" operations are special cases of '<' and '<='\nexport const isJsonLogicBetweenExclusive = (logic: unknown): logic is JsonLogicBetweenExclusive =>\n isPojo(logic) && '<' in logic && Array.isArray(logic['<']) && logic['<'].length === 3;\nexport const isJsonLogicBetweenInclusive = (logic: unknown): logic is JsonLogicBetweenInclusive =>\n isPojo(logic) && '<=' in logic && Array.isArray(logic['<=']) && logic['<='].length === 3;\n\n// RQB extensions\nexport const isRQBJsonLogicStartsWith = (logic: unknown): logic is RQBJsonLogicStartsWith =>\n isPojo(logic) && 'startsWith' in logic;\nexport const isRQBJsonLogicEndsWith = (logic: unknown): logic is RQBJsonLogicEndsWith =>\n isPojo(logic) && 'endsWith' in logic;\n\n/**\n * A JsonLogic comparison operand that is a candidate expression subtree: a plain object that\n * is not a variable reference (i.e. an arithmetic/function operation object). The\n * expr-supplied `getExpression` handler decides whether it maps to a known function.\n */\nexport const isJsonLogicExpressionOperand = (logic: unknown): logic is JsonLogicExpressionOperand =>\n isPojo(logic) && !isRQBJsonLogicVar(logic);\n\n// Type guards for unused JsonLogic operations\n\n// import type {\n// JsonLogicCat,\n// JsonLogicDifference,\n// JsonLogicFilter,\n// JsonLogicIf,\n// JsonLogicLog,\n// JsonLogicMap,\n// JsonLogicMax,\n// JsonLogicMerge,\n// JsonLogicMin,\n// JsonLogicMissing,\n// JsonLogicMissingSome,\n// JsonLogicProduct,\n// JsonLogicQuotient,\n// JsonLogicReduce,\n// JsonLogicRemainder,\n// JsonLogicSubstr,\n// JsonLogicSum,\n// } from '../../types';\n//\n// export const isJsonLogicMissing = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissing<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing' in logic;\n// export const isJsonLogicMissingSome = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissingSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing_some' in logic;\n// export const isJsonLogicIf = (logic: RQBJsonLogic): logic is JsonLogicIf =>\n// isPojo(logic) && 'if' in logic;\n// export const isJsonLogicMax = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMax<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'max' in logic;\n// export const isJsonLogicMin = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMin<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'min' in logic;\n// export const isJsonLogicSum = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSum<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '+' in logic;\n// export const isJsonLogicDifference = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicDifference<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '-' in logic;\n// export const isJsonLogicProduct = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicProduct<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '*' in logic;\n// export const isJsonLogicQuotient = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicQuotient<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '/' in logic;\n// export const isJsonLogicRemainder = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicRemainder<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '%' in logic;\n// export const isJsonLogicMap = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMap<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'map' in logic;\n// export const isJsonLogicFilter = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicFilter<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'filter' in logic;\n// export const isJsonLogicReduce = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicReduce<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'reduce' in logic;\n// export const isJsonLogicMerge = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMerge<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'merge' in logic;\n// export const isJsonLogicCat = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicCat<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'cat' in logic;\n// export const isJsonLogicSubstr = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSubstr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'substr' in logic;\n// export const isJsonLogicLog = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicLog<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'log' in logic;\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 MatchConfig,\n RQBJsonLogic,\n RQBJsonLogicVar,\n RuleGroupTypeAny,\n RuleType,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { convertToIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isPojo } from '../misc';\nimport { objectKeys } from '../objectUtils';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type { JsonLogicExpressionOperand, ParseJsonLogicExpressionContext } from './types';\nimport {\n isJsonLogicAll,\n isJsonLogicAnd,\n isJsonLogicBetweenExclusive,\n isJsonLogicBetweenInclusive,\n isJsonLogicDoubleNegation,\n isJsonLogicEqual,\n isJsonLogicExpressionOperand,\n isJsonLogicGreaterThan,\n isJsonLogicGreaterThanOrEqual,\n isJsonLogicInArray,\n isJsonLogicInString,\n isJsonLogicLessThan,\n isJsonLogicLessThanOrEqual,\n isJsonLogicNegation,\n isJsonLogicNone,\n isJsonLogicNotEqual,\n isJsonLogicOr,\n isJsonLogicSome,\n isJsonLogicStrictEqual,\n isJsonLogicStrictNotEqual,\n isRQBJsonLogicEndsWith,\n isRQBJsonLogicStartsWith,\n isRQBJsonLogicVar,\n} from './utils';\n\n/**\n * Options object for {@link parseJsonLogic}.\n */\nexport interface ParseJsonLogicOptions extends ParserCommonOptions {\n // oxlint-disable-next-line typescript/no-explicit-any\n jsonLogicOperations?: Record<string, (value: any) => RuleType | RuleGroupTypeAny | false>;\n /**\n * Handler that converts a JsonLogic arithmetic/function operation object into an\n * {@link ExpressionNode}. Return `null` to reject (the rule is dropped). Supplied by\n * `@react-querybuilder/expr` (`expressionParserJsonLogic`). When omitted, expression\n * operands are ignored (rule dropped).\n */\n getExpression?: (\n node: JsonLogicExpressionOperand,\n ctx: ParseJsonLogicExpressionContext\n ) => ExpressionNode | null;\n}\n\nconst emptyRuleGroup: DefaultRuleGroupType = { combinator: 'and', rules: [] };\n\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(rqbJsonLogic: string | RQBJsonLogic): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: ParseJsonLogicOptions = {}\n): DefaultRuleGroupTypeAny {\n const fieldsFlat = getFieldsArray(options.fields);\n const { getValueSources, listsAsArrays, jsonLogicOperations, getExpression } = 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: ParseJsonLogicExpressionContext = {\n fieldExists: fieldName => fieldsFlat.length === 0 || fieldsFlat.some(f => f.name === fieldName),\n };\n\n // Overload 1: Always return a rule group or false for the outermost logic object\n function processLogic(logic: RQBJsonLogic, outermost: true): DefaultRuleGroupType | false;\n // Overload 2: If not the outermost object, return value could also be a rule\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: false,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false;\n // Implementation\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: boolean,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false {\n // Bail if the outermost logic is not a plain object\n if (outermost && !isPojo(logic)) {\n return false;\n }\n const [key, keyValue] = Object.entries(logic || {})?.[0] ?? [];\n\n // Custom operations process logic\n if (jsonLogicOperations && objectKeys(jsonLogicOperations).includes(key)) {\n const rule = jsonLogicOperations[key](keyValue) as DefaultRuleType;\n return rule\n ? outermost && !isRuleGroup(rule)\n ? { combinator: 'and', rules: [rule] }\n : rule\n : false;\n }\n\n // Rule groups\n if (isJsonLogicAnd(logic)) {\n return {\n combinator: 'and',\n rules: logic.and.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicOr(logic)) {\n return {\n combinator: 'or',\n rules: logic.or.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicNegation(logic)) {\n const rule = processLogic(logic['!'], false, inSubquery);\n if (rule) {\n if (\n !isRuleGroupType(rule) &&\n (rule.operator === 'between' ||\n rule.operator === 'in' ||\n rule.operator === 'contains' ||\n rule.operator === 'beginsWith' ||\n rule.operator === 'endsWith')\n ) {\n const newRule = { ...rule, operator: defaultOperatorNegationMap[rule.operator] };\n if (outermost) {\n return { combinator: 'and', rules: [newRule] };\n }\n return newRule;\n } else if (isJsonLogicBetweenExclusive(logic['!']) || isRuleGroupType(rule)) {\n return { ...rule, not: true };\n }\n return { combinator: 'and', rules: [rule], not: true };\n }\n return false;\n } else if (isJsonLogicDoubleNegation(logic)) {\n const rule = processLogic(logic['!!'], false, inSubquery);\n return rule || false;\n }\n\n // All other keys represent rules\n let rule: DefaultRuleType | false = false;\n let field = '';\n let operator: DefaultOperatorName = '=';\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = '';\n let valueSource: ValueSource | undefined = undefined;\n\n if (\n // Basic boolean operations\n isJsonLogicEqual(logic) ||\n isJsonLogicStrictEqual(logic) ||\n isJsonLogicNotEqual(logic) ||\n isJsonLogicStrictNotEqual(logic) ||\n isJsonLogicGreaterThan(logic) ||\n isJsonLogicGreaterThanOrEqual(logic) ||\n isJsonLogicLessThan(logic) ||\n isJsonLogicLessThanOrEqual(logic) ||\n isJsonLogicInString(logic) ||\n isRQBJsonLogicStartsWith(logic) ||\n isRQBJsonLogicEndsWith(logic)\n ) {\n const [first, second] = keyValue;\n // Scalar comparisons (not string-match) may carry arithmetic/function expression operands\n const scalarComparison =\n isJsonLogicEqual(logic) ||\n isJsonLogicStrictEqual(logic) ||\n isJsonLogicNotEqual(logic) ||\n isJsonLogicStrictNotEqual(logic) ||\n isJsonLogicGreaterThan(logic) ||\n isJsonLogicGreaterThanOrEqual(logic) ||\n isJsonLogicLessThan(logic) ||\n isJsonLogicLessThanOrEqual(logic);\n const firstIsExpr = isJsonLogicExpressionOperand(first);\n const secondIsExpr = isJsonLogicExpressionOperand(second);\n\n if (getExpression && scalarComparison && (firstIsExpr || secondIsExpr)) {\n // Operator is lhs-first (export never flips), '=='/'===' → '=', '!='/'!==' → '!='\n const exprOperator: DefaultOperatorName =\n isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic)\n ? '='\n : isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic)\n ? '!='\n : (key as DefaultOperatorName);\n\n if (firstIsExpr && secondIsExpr) {\n // expression <op> expression → both sides on lhs/value\n const lhs = getExpression(first, exprCtx);\n const rhs = getExpression(second, exprCtx);\n if (lhs && rhs) {\n rule = {\n field: '',\n operator: exprOperator,\n lhs,\n value: rhs,\n valueSource: 'expression',\n };\n }\n } else if (firstIsExpr && !isPojo(second)) {\n // expression <op> literal → lhs = expression\n const lhs = getExpression(first, exprCtx);\n if (lhs) {\n rule = { field: '', operator: exprOperator, lhs, value: second };\n }\n } else if (isRQBJsonLogicVar(first) && secondIsExpr) {\n // field <op> expression → rhs expression\n const node = getExpression(second, exprCtx);\n if (node && (inSubquery || fieldIsValid(first.var, exprOperator))) {\n rule = {\n field: first.var,\n operator: exprOperator,\n value: node,\n valueSource: 'expression',\n };\n }\n }\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n\n if (isRQBJsonLogicVar(first) && !isPojo(second)) {\n field = first.var;\n value = second;\n } else if (!isPojo(first) && isRQBJsonLogicVar(second)) {\n field = second.var;\n value = first;\n } else if (isRQBJsonLogicVar(first) && isRQBJsonLogicVar(second)) {\n field = first.var;\n value = second.var;\n valueSource = 'field';\n } else {\n return false;\n }\n\n // Translate operator if necessary\n if (isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic)) {\n operator = value === null ? 'null' : '=';\n } else if (isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic)) {\n operator = value === null ? 'notNull' : '!=';\n } else if (isJsonLogicInString(logic)) {\n operator = 'contains';\n } else if (isRQBJsonLogicStartsWith(logic)) {\n operator = 'beginsWith';\n } else if (isRQBJsonLogicEndsWith(logic)) {\n operator = 'endsWith';\n } else {\n operator = key as DefaultOperatorName;\n }\n\n if (\n inSubquery ||\n fieldIsValid(field, operator, valueSource === 'field' ? value : undefined)\n ) {\n rule = { field, operator, value, valueSource };\n }\n } else if (\n (isJsonLogicAll(logic) && isRQBJsonLogicVar(logic['all'][0])) ||\n (isJsonLogicNone(logic) && isRQBJsonLogicVar(logic['none'][0])) ||\n (isJsonLogicSome(logic) && isRQBJsonLogicVar(logic['some'][0]))\n ) {\n // The array coverage functions must have a field as their first element.\n // Otherwise we'd be comparing values to values, which is not supported.\n const match: MatchConfig = {\n mode: isJsonLogicNone(logic) ? 'none' : isJsonLogicSome(logic) ? 'some' : 'all',\n };\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const [{ var: fld }, operation] = (logic as any)[match.mode];\n const matcher = processLogic(operation, false, true);\n\n if (!matcher) return false;\n\n rule = {\n field: fld,\n operator: '=',\n match,\n value: isRuleGroup(matcher) ? matcher : { combinator: 'and', rules: [matcher] },\n };\n } else if (isJsonLogicBetweenExclusive(logic) && isRQBJsonLogicVar(logic['<'][1])) {\n field = logic['<'][1].var;\n const values = [logic['<'][0], logic['<'][2]];\n // v8 ignore else\n if (\n values.every(v => isRQBJsonLogicVar(v)) ||\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n return (\n processLogic({\n and: [{ '>': [{ var: field }, values[0]] }, { '<': [{ var: field }, values[1]] }],\n }) || /* v8 ignore start -- @preserve */ false /* v8 ignore stop -- @preserve */\n );\n }\n } else if (isJsonLogicBetweenInclusive(logic) && isRQBJsonLogicVar(logic['<='][1])) {\n field = logic['<='][1].var;\n operator = 'between';\n const values = [logic['<='][0], logic['<='][2]];\n if (\n getExpression &&\n (isJsonLogicExpressionOperand(values[0]) || isJsonLogicExpressionOperand(values[1]))\n ) {\n // field between expression and expression → expression-sourced bounds\n const from = getExpression(values[0], exprCtx);\n const to = getExpression(values[1], exprCtx);\n if (from && to && fieldIsValid(field, operator)) {\n rule = { field, operator, value: [from, to], valueSource: 'expression' };\n }\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n if (logic['<='].every(v => isRQBJsonLogicVar(v))) {\n const vars = values as RQBJsonLogicVar[];\n valueSource = 'field';\n const fieldList = vars.map(el => el.var).filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? values\n : joinWith(\n values.map(el => `${el}`),\n ','\n );\n }\n }\n\n if (fieldIsValid(field, operator) && value.length >= 2) {\n rule = { field, operator, value, valueSource };\n }\n } else if (isJsonLogicInArray(logic) && isRQBJsonLogicVar(keyValue[0])) {\n field = keyValue[0].var;\n operator = 'in';\n if (logic.in[1].every(v => isRQBJsonLogicVar(v))) {\n valueSource = 'field';\n const fieldList = logic.in[1]\n .map(el => el.var)\n .filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n logic.in[1].every(el => typeof el === 'string') ||\n logic.in[1].every(el => typeof el === 'number') ||\n logic.in[1].every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? logic.in[1]\n : joinWith(\n logic.in[1].map(el => `${el}`),\n ','\n );\n }\n }\n\n // v8 ignore else\n if (value.length > 0) {\n rule = { field, operator, value, valueSource };\n }\n }\n\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let logicRoot = rqbJsonLogic;\n if (typeof rqbJsonLogic === 'string') {\n try {\n logicRoot = JSON.parse(rqbJsonLogic);\n } catch {\n return prepare(emptyRuleGroup);\n }\n }\n\n const result = processLogic(logicRoot, true);\n const finalQuery: DefaultRuleGroupType = result || emptyRuleGroup;\n return prepare(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);\n}\n\nexport { parseJsonLogic };\n"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import { E as joinWith, k as defaultOperatorNegationMap } from "./utils-CJRGiPb-.mjs";
2
- import { i as isRuleGroupType, n as objectKeys, o as isPojo, r as isRuleGroup } from "./objectUtils-ZvPkF6u6.mjs";
3
- import { n as convertToIC } from "./convertQuery-J1CaoDxe.mjs";
4
- import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-BCLU20Cg.mjs";
1
+ import { P as defaultOperatorNegationMap, j as joinWith } from "./utils-Dt0D_DMV.mjs";
2
+ import { i as isPojo, n as isRuleGroupType, t as isRuleGroup } from "./isRuleGroup-CqLThsbu.mjs";
3
+ import { n as objectKeys } from "./objectUtils-DBlmJgBf.mjs";
4
+ import { n as convertToIC } from "./convertQuery-D_4J7E-Z.mjs";
5
+ import { n as fieldIsValidUtil, r as getFieldsArray, t as prepareRuleGroup } from "./prepareQueryObjects-Q18lHCKl.mjs";
5
6
  //#region src/utils/parseJsonLogic/utils.ts
6
7
  const isJsonLogicVar = (logic) => isPojo(logic) && "var" in logic;
7
8
  const isRQBJsonLogicVar = (logic) => isJsonLogicVar(logic) && typeof logic.var === "string";
@@ -26,6 +27,12 @@ const isJsonLogicBetweenExclusive = (logic) => isPojo(logic) && "<" in logic &&
26
27
  const isJsonLogicBetweenInclusive = (logic) => isPojo(logic) && "<=" in logic && Array.isArray(logic["<="]) && logic["<="].length === 3;
27
28
  const isRQBJsonLogicStartsWith = (logic) => isPojo(logic) && "startsWith" in logic;
28
29
  const isRQBJsonLogicEndsWith = (logic) => isPojo(logic) && "endsWith" in logic;
30
+ /**
31
+ * A JsonLogic comparison operand that is a candidate expression subtree: a plain object that
32
+ * is not a variable reference (i.e. an arithmetic/function operation object). The
33
+ * expr-supplied `getExpression` handler decides whether it maps to a known function.
34
+ */
35
+ const isJsonLogicExpressionOperand = (logic) => isPojo(logic) && !isRQBJsonLogicVar(logic);
29
36
  //#endregion
30
37
  //#region src/utils/parseJsonLogic/parseJsonLogic.ts
31
38
  const emptyRuleGroup = {
@@ -34,7 +41,7 @@ const emptyRuleGroup = {
34
41
  };
35
42
  function parseJsonLogic(rqbJsonLogic, options = {}) {
36
43
  const fieldsFlat = getFieldsArray(options.fields);
37
- const { getValueSources, listsAsArrays, jsonLogicOperations } = options;
44
+ const { getValueSources, listsAsArrays, jsonLogicOperations, getExpression } = options;
38
45
  const fieldIsValid = (fieldName, operator, subordinateFieldName) => fieldIsValidUtil({
39
46
  fieldName,
40
47
  fieldsFlat,
@@ -42,6 +49,7 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
42
49
  subordinateFieldName,
43
50
  getValueSources
44
51
  });
52
+ const exprCtx = { fieldExists: (fieldName) => fieldsFlat.length === 0 || fieldsFlat.some((f) => f.name === fieldName) };
45
53
  function processLogic(logic, outermost, inSubquery) {
46
54
  if (outermost && !isPojo(logic)) return false;
47
55
  const [key, keyValue] = Object.entries(logic || {})?.[0] ?? [];
@@ -92,6 +100,43 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
92
100
  let valueSource = void 0;
93
101
  if (isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic) || isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic) || isJsonLogicGreaterThan(logic) || isJsonLogicGreaterThanOrEqual(logic) || isJsonLogicLessThan(logic) || isJsonLogicLessThanOrEqual(logic) || isJsonLogicInString(logic) || isRQBJsonLogicStartsWith(logic) || isRQBJsonLogicEndsWith(logic)) {
94
102
  const [first, second] = keyValue;
103
+ const scalarComparison = isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic) || isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic) || isJsonLogicGreaterThan(logic) || isJsonLogicGreaterThanOrEqual(logic) || isJsonLogicLessThan(logic) || isJsonLogicLessThanOrEqual(logic);
104
+ const firstIsExpr = isJsonLogicExpressionOperand(first);
105
+ const secondIsExpr = isJsonLogicExpressionOperand(second);
106
+ if (getExpression && scalarComparison && (firstIsExpr || secondIsExpr)) {
107
+ const exprOperator = isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic) ? "=" : isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic) ? "!=" : key;
108
+ if (firstIsExpr && secondIsExpr) {
109
+ const lhs = getExpression(first, exprCtx);
110
+ const rhs = getExpression(second, exprCtx);
111
+ if (lhs && rhs) rule = {
112
+ field: "",
113
+ operator: exprOperator,
114
+ lhs,
115
+ value: rhs,
116
+ valueSource: "expression"
117
+ };
118
+ } else if (firstIsExpr && !isPojo(second)) {
119
+ const lhs = getExpression(first, exprCtx);
120
+ if (lhs) rule = {
121
+ field: "",
122
+ operator: exprOperator,
123
+ lhs,
124
+ value: second
125
+ };
126
+ } else if (isRQBJsonLogicVar(first) && secondIsExpr) {
127
+ const node = getExpression(second, exprCtx);
128
+ if (node && (inSubquery || fieldIsValid(first.var, exprOperator))) rule = {
129
+ field: first.var,
130
+ operator: exprOperator,
131
+ value: node,
132
+ valueSource: "expression"
133
+ };
134
+ }
135
+ return rule ? outermost ? {
136
+ combinator: "and",
137
+ rules: [rule]
138
+ } : rule : false;
139
+ }
95
140
  if (isRQBJsonLogicVar(first) && !isPojo(second)) {
96
141
  field = first.var;
97
142
  value = second;
@@ -138,6 +183,20 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
138
183
  field = logic["<="][1].var;
139
184
  operator = "between";
140
185
  const values = [logic["<="][0], logic["<="][2]];
186
+ if (getExpression && (isJsonLogicExpressionOperand(values[0]) || isJsonLogicExpressionOperand(values[1]))) {
187
+ const from = getExpression(values[0], exprCtx);
188
+ const to = getExpression(values[1], exprCtx);
189
+ if (from && to && fieldIsValid(field, operator)) rule = {
190
+ field,
191
+ operator,
192
+ value: [from, to],
193
+ valueSource: "expression"
194
+ };
195
+ return rule ? outermost ? {
196
+ combinator: "and",
197
+ rules: [rule]
198
+ } : rule : false;
199
+ }
141
200
  if (logic["<="].every((v) => isRQBJsonLogicVar(v))) {
142
201
  const vars = values;
143
202
  valueSource = "field";
@@ -182,6 +241,6 @@ function parseJsonLogic(rqbJsonLogic, options = {}) {
182
241
  return prepare(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);
183
242
  }
184
243
  //#endregion
185
- export { parseJsonLogic };
244
+ export { isJsonLogicExpressionOperand, isRQBJsonLogicVar, parseJsonLogic };
186
245
 
187
246
  //# sourceMappingURL=parseJsonLogic.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseJsonLogic.mjs","names":[],"sources":["../src/utils/parseJsonLogic/utils.ts","../src/utils/parseJsonLogic/parseJsonLogic.ts"],"sourcesContent":["import type {\n JsonLogicAll,\n JsonLogicAnd,\n JsonLogicDoubleNegation,\n JsonLogicEqual,\n JsonLogicGreaterThan,\n JsonLogicGreaterThanOrEqual,\n JsonLogicInArray,\n JsonLogicInString,\n JsonLogicLessThan,\n JsonLogicLessThanOrEqual,\n JsonLogicNegation,\n JsonLogicNone,\n JsonLogicNotEqual,\n JsonLogicOr,\n JsonLogicSome,\n JsonLogicStrictEqual,\n JsonLogicStrictNotEqual,\n JsonLogicVar,\n RQBJsonLogicEndsWith,\n RQBJsonLogicStartsWith,\n RQBJsonLogicVar,\n} from '../../types';\nimport { isPojo } from '../misc';\nimport type { JsonLogicBetweenExclusive, JsonLogicBetweenInclusive } from './types';\n\n// Standard JsonLogic operations\nexport const isJsonLogicVar = (\n logic: unknown\n): logic is JsonLogicVar<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'var' in logic;\nexport const isRQBJsonLogicVar = (logic: unknown): logic is RQBJsonLogicVar =>\n isJsonLogicVar(logic) && typeof logic.var === 'string';\nexport const isJsonLogicEqual = (logic: unknown): logic is JsonLogicEqual =>\n isPojo(logic) && '==' in logic;\nexport const isJsonLogicStrictEqual = (logic: unknown): logic is JsonLogicStrictEqual =>\n isPojo(logic) && '===' in logic;\nexport const isJsonLogicNotEqual = (logic: unknown): logic is JsonLogicNotEqual =>\n isPojo(logic) && '!=' in logic;\nexport const isJsonLogicStrictNotEqual = (logic: unknown): logic is JsonLogicStrictNotEqual =>\n isPojo(logic) && '!==' in logic;\nexport const isJsonLogicNegation = (logic: unknown): logic is JsonLogicNegation =>\n isPojo(logic) && '!' in logic;\nexport const isJsonLogicDoubleNegation = (logic: unknown): logic is JsonLogicDoubleNegation =>\n isPojo(logic) && '!!' in logic;\nexport const isJsonLogicOr = (\n logic: unknown\n): logic is JsonLogicOr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'or' in logic;\nexport const isJsonLogicAnd = (\n logic: unknown\n): logic is JsonLogicAnd<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'and' in logic;\nexport const isJsonLogicGreaterThan = (\n logic: unknown\n): logic is JsonLogicGreaterThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>' in logic;\nexport const isJsonLogicGreaterThanOrEqual = (\n logic: unknown\n): logic is JsonLogicGreaterThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>=' in logic;\nexport const isJsonLogicLessThan = (\n logic: unknown\n): logic is JsonLogicLessThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<' in logic && logic['<'].length === 2;\nexport const isJsonLogicLessThanOrEqual = (\n logic: unknown\n): logic is JsonLogicLessThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<=' in logic && logic['<='].length === 2;\nexport const isJsonLogicInArray = (\n logic: unknown\n): logic is JsonLogicInArray<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && Array.isArray(logic.in[1]);\nexport const isJsonLogicInString = (\n logic: unknown\n): logic is JsonLogicInString<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && !Array.isArray(logic.in[1]);\nexport const isJsonLogicAll = (\n logic: unknown\n): logic is JsonLogicAll<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'all' in logic;\nexport const isJsonLogicNone = (\n logic: unknown\n): logic is JsonLogicNone<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'none' in logic;\nexport const isJsonLogicSome = (\n logic: unknown\n): logic is JsonLogicSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'some' in logic;\n\n// \"Between\" operations are special cases of '<' and '<='\nexport const isJsonLogicBetweenExclusive = (logic: unknown): logic is JsonLogicBetweenExclusive =>\n isPojo(logic) && '<' in logic && Array.isArray(logic['<']) && logic['<'].length === 3;\nexport const isJsonLogicBetweenInclusive = (logic: unknown): logic is JsonLogicBetweenInclusive =>\n isPojo(logic) && '<=' in logic && Array.isArray(logic['<=']) && logic['<='].length === 3;\n\n// RQB extensions\nexport const isRQBJsonLogicStartsWith = (logic: unknown): logic is RQBJsonLogicStartsWith =>\n isPojo(logic) && 'startsWith' in logic;\nexport const isRQBJsonLogicEndsWith = (logic: unknown): logic is RQBJsonLogicEndsWith =>\n isPojo(logic) && 'endsWith' in logic;\n\n// Type guards for unused JsonLogic operations\n\n// import type {\n// JsonLogicCat,\n// JsonLogicDifference,\n// JsonLogicFilter,\n// JsonLogicIf,\n// JsonLogicLog,\n// JsonLogicMap,\n// JsonLogicMax,\n// JsonLogicMerge,\n// JsonLogicMin,\n// JsonLogicMissing,\n// JsonLogicMissingSome,\n// JsonLogicProduct,\n// JsonLogicQuotient,\n// JsonLogicReduce,\n// JsonLogicRemainder,\n// JsonLogicSubstr,\n// JsonLogicSum,\n// } from '../../types';\n//\n// export const isJsonLogicMissing = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissing<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing' in logic;\n// export const isJsonLogicMissingSome = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissingSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing_some' in logic;\n// export const isJsonLogicIf = (logic: RQBJsonLogic): logic is JsonLogicIf =>\n// isPojo(logic) && 'if' in logic;\n// export const isJsonLogicMax = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMax<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'max' in logic;\n// export const isJsonLogicMin = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMin<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'min' in logic;\n// export const isJsonLogicSum = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSum<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '+' in logic;\n// export const isJsonLogicDifference = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicDifference<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '-' in logic;\n// export const isJsonLogicProduct = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicProduct<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '*' in logic;\n// export const isJsonLogicQuotient = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicQuotient<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '/' in logic;\n// export const isJsonLogicRemainder = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicRemainder<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '%' in logic;\n// export const isJsonLogicMap = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMap<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'map' in logic;\n// export const isJsonLogicFilter = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicFilter<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'filter' in logic;\n// export const isJsonLogicReduce = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicReduce<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'reduce' in logic;\n// export const isJsonLogicMerge = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMerge<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'merge' in logic;\n// export const isJsonLogicCat = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicCat<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'cat' in logic;\n// export const isJsonLogicSubstr = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSubstr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'substr' in logic;\n// export const isJsonLogicLog = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicLog<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'log' in logic;\n","import type { Except } from 'type-fest';\nimport { defaultOperatorNegationMap } from '../../defaults';\nimport type {\n DefaultOperatorName,\n DefaultRuleGroupType,\n DefaultRuleGroupTypeAny,\n DefaultRuleGroupTypeIC,\n DefaultRuleType,\n MatchConfig,\n RQBJsonLogic,\n RQBJsonLogicVar,\n RuleGroupTypeAny,\n RuleType,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { convertToIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isPojo } from '../misc';\nimport { objectKeys } from '../objectUtils';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport {\n isJsonLogicAll,\n isJsonLogicAnd,\n isJsonLogicBetweenExclusive,\n isJsonLogicBetweenInclusive,\n isJsonLogicDoubleNegation,\n isJsonLogicEqual,\n isJsonLogicGreaterThan,\n isJsonLogicGreaterThanOrEqual,\n isJsonLogicInArray,\n isJsonLogicInString,\n isJsonLogicLessThan,\n isJsonLogicLessThanOrEqual,\n isJsonLogicNegation,\n isJsonLogicNone,\n isJsonLogicNotEqual,\n isJsonLogicOr,\n isJsonLogicSome,\n isJsonLogicStrictEqual,\n isJsonLogicStrictNotEqual,\n isRQBJsonLogicEndsWith,\n isRQBJsonLogicStartsWith,\n isRQBJsonLogicVar,\n} from './utils';\n\n/**\n * Options object for {@link parseJsonLogic}.\n */\nexport interface ParseJsonLogicOptions extends ParserCommonOptions {\n // oxlint-disable-next-line typescript/no-explicit-any\n jsonLogicOperations?: Record<string, (value: any) => RuleType | RuleGroupTypeAny | false>;\n}\n\nconst emptyRuleGroup: DefaultRuleGroupType = { combinator: 'and', rules: [] };\n\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(rqbJsonLogic: string | RQBJsonLogic): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: ParseJsonLogicOptions = {}\n): DefaultRuleGroupTypeAny {\n const fieldsFlat = getFieldsArray(options.fields);\n const { getValueSources, listsAsArrays, jsonLogicOperations } = 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 // Overload 1: Always return a rule group or false for the outermost logic object\n function processLogic(logic: RQBJsonLogic, outermost: true): DefaultRuleGroupType | false;\n // Overload 2: If not the outermost object, return value could also be a rule\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: false,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false;\n // Implementation\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: boolean,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false {\n // Bail if the outermost logic is not a plain object\n if (outermost && !isPojo(logic)) {\n return false;\n }\n const [key, keyValue] = Object.entries(logic || {})?.[0] ?? [];\n\n // Custom operations process logic\n if (jsonLogicOperations && objectKeys(jsonLogicOperations).includes(key)) {\n const rule = jsonLogicOperations[key](keyValue) as DefaultRuleType;\n return rule\n ? outermost && !isRuleGroup(rule)\n ? { combinator: 'and', rules: [rule] }\n : rule\n : false;\n }\n\n // Rule groups\n if (isJsonLogicAnd(logic)) {\n return {\n combinator: 'and',\n rules: logic.and.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicOr(logic)) {\n return {\n combinator: 'or',\n rules: logic.or.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicNegation(logic)) {\n const rule = processLogic(logic['!'], false, inSubquery);\n if (rule) {\n if (\n !isRuleGroupType(rule) &&\n (rule.operator === 'between' ||\n rule.operator === 'in' ||\n rule.operator === 'contains' ||\n rule.operator === 'beginsWith' ||\n rule.operator === 'endsWith')\n ) {\n const newRule = { ...rule, operator: defaultOperatorNegationMap[rule.operator] };\n if (outermost) {\n return { combinator: 'and', rules: [newRule] };\n }\n return newRule;\n } else if (isJsonLogicBetweenExclusive(logic['!']) || isRuleGroupType(rule)) {\n return { ...rule, not: true };\n }\n return { combinator: 'and', rules: [rule], not: true };\n }\n return false;\n } else if (isJsonLogicDoubleNegation(logic)) {\n const rule = processLogic(logic['!!'], false, inSubquery);\n return rule || false;\n }\n\n // All other keys represent rules\n let rule: DefaultRuleType | false = false;\n let field = '';\n let operator: DefaultOperatorName = '=';\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = '';\n let valueSource: ValueSource | undefined = undefined;\n\n if (\n // Basic boolean operations\n isJsonLogicEqual(logic) ||\n isJsonLogicStrictEqual(logic) ||\n isJsonLogicNotEqual(logic) ||\n isJsonLogicStrictNotEqual(logic) ||\n isJsonLogicGreaterThan(logic) ||\n isJsonLogicGreaterThanOrEqual(logic) ||\n isJsonLogicLessThan(logic) ||\n isJsonLogicLessThanOrEqual(logic) ||\n isJsonLogicInString(logic) ||\n isRQBJsonLogicStartsWith(logic) ||\n isRQBJsonLogicEndsWith(logic)\n ) {\n const [first, second] = keyValue;\n if (isRQBJsonLogicVar(first) && !isPojo(second)) {\n field = first.var;\n value = second;\n } else if (!isPojo(first) && isRQBJsonLogicVar(second)) {\n field = second.var;\n value = first;\n } else if (isRQBJsonLogicVar(first) && isRQBJsonLogicVar(second)) {\n field = first.var;\n value = second.var;\n valueSource = 'field';\n } else {\n return false;\n }\n\n // Translate operator if necessary\n if (isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic)) {\n operator = value === null ? 'null' : '=';\n } else if (isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic)) {\n operator = value === null ? 'notNull' : '!=';\n } else if (isJsonLogicInString(logic)) {\n operator = 'contains';\n } else if (isRQBJsonLogicStartsWith(logic)) {\n operator = 'beginsWith';\n } else if (isRQBJsonLogicEndsWith(logic)) {\n operator = 'endsWith';\n } else {\n operator = key as DefaultOperatorName;\n }\n\n if (\n inSubquery ||\n fieldIsValid(field, operator, valueSource === 'field' ? value : undefined)\n ) {\n rule = { field, operator, value, valueSource };\n }\n } else if (\n (isJsonLogicAll(logic) && isRQBJsonLogicVar(logic['all'][0])) ||\n (isJsonLogicNone(logic) && isRQBJsonLogicVar(logic['none'][0])) ||\n (isJsonLogicSome(logic) && isRQBJsonLogicVar(logic['some'][0]))\n ) {\n // The array coverage functions must have a field as their first element.\n // Otherwise we'd be comparing values to values, which is not supported.\n const match: MatchConfig = {\n mode: isJsonLogicNone(logic) ? 'none' : isJsonLogicSome(logic) ? 'some' : 'all',\n };\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const [{ var: fld }, operation] = (logic as any)[match.mode];\n const matcher = processLogic(operation, false, true);\n\n if (!matcher) return false;\n\n rule = {\n field: fld,\n operator: '=',\n match,\n value: isRuleGroup(matcher) ? matcher : { combinator: 'and', rules: [matcher] },\n };\n } else if (isJsonLogicBetweenExclusive(logic) && isRQBJsonLogicVar(logic['<'][1])) {\n field = logic['<'][1].var;\n const values = [logic['<'][0], logic['<'][2]];\n // v8 ignore else\n if (\n values.every(v => isRQBJsonLogicVar(v)) ||\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n return (\n processLogic({\n and: [{ '>': [{ var: field }, values[0]] }, { '<': [{ var: field }, values[1]] }],\n }) || /* v8 ignore start -- @preserve */ false /* v8 ignore stop -- @preserve */\n );\n }\n } else if (isJsonLogicBetweenInclusive(logic) && isRQBJsonLogicVar(logic['<='][1])) {\n field = logic['<='][1].var;\n operator = 'between';\n const values = [logic['<='][0], logic['<='][2]];\n if (logic['<='].every(v => isRQBJsonLogicVar(v))) {\n const vars = values as RQBJsonLogicVar[];\n valueSource = 'field';\n const fieldList = vars.map(el => el.var).filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? values\n : joinWith(\n values.map(el => `${el}`),\n ','\n );\n }\n }\n\n if (fieldIsValid(field, operator) && value.length >= 2) {\n rule = { field, operator, value, valueSource };\n }\n } else if (isJsonLogicInArray(logic) && isRQBJsonLogicVar(keyValue[0])) {\n field = keyValue[0].var;\n operator = 'in';\n if (logic.in[1].every(v => isRQBJsonLogicVar(v))) {\n valueSource = 'field';\n const fieldList = logic.in[1]\n .map(el => el.var)\n .filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n logic.in[1].every(el => typeof el === 'string') ||\n logic.in[1].every(el => typeof el === 'number') ||\n logic.in[1].every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? logic.in[1]\n : joinWith(\n logic.in[1].map(el => `${el}`),\n ','\n );\n }\n }\n\n // v8 ignore else\n if (value.length > 0) {\n rule = { field, operator, value, valueSource };\n }\n }\n\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let logicRoot = rqbJsonLogic;\n if (typeof rqbJsonLogic === 'string') {\n try {\n logicRoot = JSON.parse(rqbJsonLogic);\n } catch {\n return prepare(emptyRuleGroup);\n }\n }\n\n const result = processLogic(logicRoot, true);\n const finalQuery: DefaultRuleGroupType = result || emptyRuleGroup;\n return prepare(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);\n}\n\nexport { parseJsonLogic };\n"],"mappings":"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"}
1
+ {"version":3,"file":"parseJsonLogic.mjs","names":[],"sources":["../src/utils/parseJsonLogic/utils.ts","../src/utils/parseJsonLogic/parseJsonLogic.ts"],"sourcesContent":["import type {\n JsonLogicAll,\n JsonLogicAnd,\n JsonLogicDoubleNegation,\n JsonLogicEqual,\n JsonLogicGreaterThan,\n JsonLogicGreaterThanOrEqual,\n JsonLogicInArray,\n JsonLogicInString,\n JsonLogicLessThan,\n JsonLogicLessThanOrEqual,\n JsonLogicNegation,\n JsonLogicNone,\n JsonLogicNotEqual,\n JsonLogicOr,\n JsonLogicSome,\n JsonLogicStrictEqual,\n JsonLogicStrictNotEqual,\n JsonLogicVar,\n RQBJsonLogicEndsWith,\n RQBJsonLogicStartsWith,\n RQBJsonLogicVar,\n} from '../../types';\nimport { isPojo } from '../misc';\nimport type {\n JsonLogicBetweenExclusive,\n JsonLogicBetweenInclusive,\n JsonLogicExpressionOperand,\n} from './types';\n\n// Standard JsonLogic operations\nexport const isJsonLogicVar = (\n logic: unknown\n): logic is JsonLogicVar<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'var' in logic;\nexport const isRQBJsonLogicVar = (logic: unknown): logic is RQBJsonLogicVar =>\n isJsonLogicVar(logic) && typeof logic.var === 'string';\nexport const isJsonLogicEqual = (logic: unknown): logic is JsonLogicEqual =>\n isPojo(logic) && '==' in logic;\nexport const isJsonLogicStrictEqual = (logic: unknown): logic is JsonLogicStrictEqual =>\n isPojo(logic) && '===' in logic;\nexport const isJsonLogicNotEqual = (logic: unknown): logic is JsonLogicNotEqual =>\n isPojo(logic) && '!=' in logic;\nexport const isJsonLogicStrictNotEqual = (logic: unknown): logic is JsonLogicStrictNotEqual =>\n isPojo(logic) && '!==' in logic;\nexport const isJsonLogicNegation = (logic: unknown): logic is JsonLogicNegation =>\n isPojo(logic) && '!' in logic;\nexport const isJsonLogicDoubleNegation = (logic: unknown): logic is JsonLogicDoubleNegation =>\n isPojo(logic) && '!!' in logic;\nexport const isJsonLogicOr = (\n logic: unknown\n): logic is JsonLogicOr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'or' in logic;\nexport const isJsonLogicAnd = (\n logic: unknown\n): logic is JsonLogicAnd<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'and' in logic;\nexport const isJsonLogicGreaterThan = (\n logic: unknown\n): logic is JsonLogicGreaterThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>' in logic;\nexport const isJsonLogicGreaterThanOrEqual = (\n logic: unknown\n): logic is JsonLogicGreaterThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '>=' in logic;\nexport const isJsonLogicLessThan = (\n logic: unknown\n): logic is JsonLogicLessThan<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<' in logic && logic['<'].length === 2;\nexport const isJsonLogicLessThanOrEqual = (\n logic: unknown\n): logic is JsonLogicLessThanOrEqual<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && '<=' in logic && logic['<='].length === 2;\nexport const isJsonLogicInArray = (\n logic: unknown\n): logic is JsonLogicInArray<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && Array.isArray(logic.in[1]);\nexport const isJsonLogicInString = (\n logic: unknown\n): logic is JsonLogicInString<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'in' in logic && !Array.isArray(logic.in[1]);\nexport const isJsonLogicAll = (\n logic: unknown\n): logic is JsonLogicAll<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'all' in logic;\nexport const isJsonLogicNone = (\n logic: unknown\n): logic is JsonLogicNone<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'none' in logic;\nexport const isJsonLogicSome = (\n logic: unknown\n): logic is JsonLogicSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n isPojo(logic) && 'some' in logic;\n\n// \"Between\" operations are special cases of '<' and '<='\nexport const isJsonLogicBetweenExclusive = (logic: unknown): logic is JsonLogicBetweenExclusive =>\n isPojo(logic) && '<' in logic && Array.isArray(logic['<']) && logic['<'].length === 3;\nexport const isJsonLogicBetweenInclusive = (logic: unknown): logic is JsonLogicBetweenInclusive =>\n isPojo(logic) && '<=' in logic && Array.isArray(logic['<=']) && logic['<='].length === 3;\n\n// RQB extensions\nexport const isRQBJsonLogicStartsWith = (logic: unknown): logic is RQBJsonLogicStartsWith =>\n isPojo(logic) && 'startsWith' in logic;\nexport const isRQBJsonLogicEndsWith = (logic: unknown): logic is RQBJsonLogicEndsWith =>\n isPojo(logic) && 'endsWith' in logic;\n\n/**\n * A JsonLogic comparison operand that is a candidate expression subtree: a plain object that\n * is not a variable reference (i.e. an arithmetic/function operation object). The\n * expr-supplied `getExpression` handler decides whether it maps to a known function.\n */\nexport const isJsonLogicExpressionOperand = (logic: unknown): logic is JsonLogicExpressionOperand =>\n isPojo(logic) && !isRQBJsonLogicVar(logic);\n\n// Type guards for unused JsonLogic operations\n\n// import type {\n// JsonLogicCat,\n// JsonLogicDifference,\n// JsonLogicFilter,\n// JsonLogicIf,\n// JsonLogicLog,\n// JsonLogicMap,\n// JsonLogicMax,\n// JsonLogicMerge,\n// JsonLogicMin,\n// JsonLogicMissing,\n// JsonLogicMissingSome,\n// JsonLogicProduct,\n// JsonLogicQuotient,\n// JsonLogicReduce,\n// JsonLogicRemainder,\n// JsonLogicSubstr,\n// JsonLogicSum,\n// } from '../../types';\n//\n// export const isJsonLogicMissing = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissing<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing' in logic;\n// export const isJsonLogicMissingSome = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMissingSome<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'missing_some' in logic;\n// export const isJsonLogicIf = (logic: RQBJsonLogic): logic is JsonLogicIf =>\n// isPojo(logic) && 'if' in logic;\n// export const isJsonLogicMax = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMax<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'max' in logic;\n// export const isJsonLogicMin = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMin<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'min' in logic;\n// export const isJsonLogicSum = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSum<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '+' in logic;\n// export const isJsonLogicDifference = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicDifference<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '-' in logic;\n// export const isJsonLogicProduct = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicProduct<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '*' in logic;\n// export const isJsonLogicQuotient = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicQuotient<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '/' in logic;\n// export const isJsonLogicRemainder = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicRemainder<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && '%' in logic;\n// export const isJsonLogicMap = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMap<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'map' in logic;\n// export const isJsonLogicFilter = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicFilter<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'filter' in logic;\n// export const isJsonLogicReduce = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicReduce<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'reduce' in logic;\n// export const isJsonLogicMerge = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicMerge<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'merge' in logic;\n// export const isJsonLogicCat = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicCat<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'cat' in logic;\n// export const isJsonLogicSubstr = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicSubstr<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'substr' in logic;\n// export const isJsonLogicLog = (\n// logic: RQBJsonLogic\n// ): logic is JsonLogicLog<RQBJsonLogicStartsWith | RQBJsonLogicEndsWith> =>\n// isPojo(logic) && 'log' in logic;\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 MatchConfig,\n RQBJsonLogic,\n RQBJsonLogicVar,\n RuleGroupTypeAny,\n RuleType,\n ValueSource,\n} from '../../types';\nimport type { ParserCommonOptions } from '../../types/import';\nimport { joinWith } from '../arrayUtils';\nimport { convertToIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isPojo } from '../misc';\nimport { objectKeys } from '../objectUtils';\nimport { fieldIsValidUtil, getFieldsArray } from '../parserUtils';\nimport { prepareRuleGroup } from '../prepareQueryObjects';\nimport type { JsonLogicExpressionOperand, ParseJsonLogicExpressionContext } from './types';\nimport {\n isJsonLogicAll,\n isJsonLogicAnd,\n isJsonLogicBetweenExclusive,\n isJsonLogicBetweenInclusive,\n isJsonLogicDoubleNegation,\n isJsonLogicEqual,\n isJsonLogicExpressionOperand,\n isJsonLogicGreaterThan,\n isJsonLogicGreaterThanOrEqual,\n isJsonLogicInArray,\n isJsonLogicInString,\n isJsonLogicLessThan,\n isJsonLogicLessThanOrEqual,\n isJsonLogicNegation,\n isJsonLogicNone,\n isJsonLogicNotEqual,\n isJsonLogicOr,\n isJsonLogicSome,\n isJsonLogicStrictEqual,\n isJsonLogicStrictNotEqual,\n isRQBJsonLogicEndsWith,\n isRQBJsonLogicStartsWith,\n isRQBJsonLogicVar,\n} from './utils';\n\n/**\n * Options object for {@link parseJsonLogic}.\n */\nexport interface ParseJsonLogicOptions extends ParserCommonOptions {\n // oxlint-disable-next-line typescript/no-explicit-any\n jsonLogicOperations?: Record<string, (value: any) => RuleType | RuleGroupTypeAny | false>;\n /**\n * Handler that converts a JsonLogic arithmetic/function operation object into an\n * {@link ExpressionNode}. Return `null` to reject (the rule is dropped). Supplied by\n * `@react-querybuilder/expr` (`expressionParserJsonLogic`). When omitted, expression\n * operands are ignored (rule dropped).\n */\n getExpression?: (\n node: JsonLogicExpressionOperand,\n ctx: ParseJsonLogicExpressionContext\n ) => ExpressionNode | null;\n}\n\nconst emptyRuleGroup: DefaultRuleGroupType = { combinator: 'and', rules: [] };\n\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(rqbJsonLogic: string | RQBJsonLogic): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators?: false;\n }\n): DefaultRuleGroupType;\n/**\n * Converts a JsonLogic object into a query suitable for the\n * {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props\n * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).\n */\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: Except<ParseJsonLogicOptions, 'independentCombinators'> & {\n independentCombinators: true;\n }\n): DefaultRuleGroupTypeIC;\nfunction parseJsonLogic(\n rqbJsonLogic: string | RQBJsonLogic,\n options: ParseJsonLogicOptions = {}\n): DefaultRuleGroupTypeAny {\n const fieldsFlat = getFieldsArray(options.fields);\n const { getValueSources, listsAsArrays, jsonLogicOperations, getExpression } = 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: ParseJsonLogicExpressionContext = {\n fieldExists: fieldName => fieldsFlat.length === 0 || fieldsFlat.some(f => f.name === fieldName),\n };\n\n // Overload 1: Always return a rule group or false for the outermost logic object\n function processLogic(logic: RQBJsonLogic, outermost: true): DefaultRuleGroupType | false;\n // Overload 2: If not the outermost object, return value could also be a rule\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: false,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false;\n // Implementation\n function processLogic(\n logic: RQBJsonLogic,\n outermost?: boolean,\n inSubquery?: boolean\n ): DefaultRuleGroupType | DefaultRuleType | false {\n // Bail if the outermost logic is not a plain object\n if (outermost && !isPojo(logic)) {\n return false;\n }\n const [key, keyValue] = Object.entries(logic || {})?.[0] ?? [];\n\n // Custom operations process logic\n if (jsonLogicOperations && objectKeys(jsonLogicOperations).includes(key)) {\n const rule = jsonLogicOperations[key](keyValue) as DefaultRuleType;\n return rule\n ? outermost && !isRuleGroup(rule)\n ? { combinator: 'and', rules: [rule] }\n : rule\n : false;\n }\n\n // Rule groups\n if (isJsonLogicAnd(logic)) {\n return {\n combinator: 'and',\n rules: logic.and.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicOr(logic)) {\n return {\n combinator: 'or',\n rules: logic.or.map(l => processLogic(l, false, inSubquery)).filter(Boolean) as (\n | DefaultRuleType\n | DefaultRuleGroupType\n )[],\n };\n } else if (isJsonLogicNegation(logic)) {\n const rule = processLogic(logic['!'], false, inSubquery);\n if (rule) {\n if (\n !isRuleGroupType(rule) &&\n (rule.operator === 'between' ||\n rule.operator === 'in' ||\n rule.operator === 'contains' ||\n rule.operator === 'beginsWith' ||\n rule.operator === 'endsWith')\n ) {\n const newRule = { ...rule, operator: defaultOperatorNegationMap[rule.operator] };\n if (outermost) {\n return { combinator: 'and', rules: [newRule] };\n }\n return newRule;\n } else if (isJsonLogicBetweenExclusive(logic['!']) || isRuleGroupType(rule)) {\n return { ...rule, not: true };\n }\n return { combinator: 'and', rules: [rule], not: true };\n }\n return false;\n } else if (isJsonLogicDoubleNegation(logic)) {\n const rule = processLogic(logic['!!'], false, inSubquery);\n return rule || false;\n }\n\n // All other keys represent rules\n let rule: DefaultRuleType | false = false;\n let field = '';\n let operator: DefaultOperatorName = '=';\n // oxlint-disable-next-line typescript/no-explicit-any\n let value: any = '';\n let valueSource: ValueSource | undefined = undefined;\n\n if (\n // Basic boolean operations\n isJsonLogicEqual(logic) ||\n isJsonLogicStrictEqual(logic) ||\n isJsonLogicNotEqual(logic) ||\n isJsonLogicStrictNotEqual(logic) ||\n isJsonLogicGreaterThan(logic) ||\n isJsonLogicGreaterThanOrEqual(logic) ||\n isJsonLogicLessThan(logic) ||\n isJsonLogicLessThanOrEqual(logic) ||\n isJsonLogicInString(logic) ||\n isRQBJsonLogicStartsWith(logic) ||\n isRQBJsonLogicEndsWith(logic)\n ) {\n const [first, second] = keyValue;\n // Scalar comparisons (not string-match) may carry arithmetic/function expression operands\n const scalarComparison =\n isJsonLogicEqual(logic) ||\n isJsonLogicStrictEqual(logic) ||\n isJsonLogicNotEqual(logic) ||\n isJsonLogicStrictNotEqual(logic) ||\n isJsonLogicGreaterThan(logic) ||\n isJsonLogicGreaterThanOrEqual(logic) ||\n isJsonLogicLessThan(logic) ||\n isJsonLogicLessThanOrEqual(logic);\n const firstIsExpr = isJsonLogicExpressionOperand(first);\n const secondIsExpr = isJsonLogicExpressionOperand(second);\n\n if (getExpression && scalarComparison && (firstIsExpr || secondIsExpr)) {\n // Operator is lhs-first (export never flips), '=='/'===' → '=', '!='/'!==' → '!='\n const exprOperator: DefaultOperatorName =\n isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic)\n ? '='\n : isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic)\n ? '!='\n : (key as DefaultOperatorName);\n\n if (firstIsExpr && secondIsExpr) {\n // expression <op> expression → both sides on lhs/value\n const lhs = getExpression(first, exprCtx);\n const rhs = getExpression(second, exprCtx);\n if (lhs && rhs) {\n rule = {\n field: '',\n operator: exprOperator,\n lhs,\n value: rhs,\n valueSource: 'expression',\n };\n }\n } else if (firstIsExpr && !isPojo(second)) {\n // expression <op> literal → lhs = expression\n const lhs = getExpression(first, exprCtx);\n if (lhs) {\n rule = { field: '', operator: exprOperator, lhs, value: second };\n }\n } else if (isRQBJsonLogicVar(first) && secondIsExpr) {\n // field <op> expression → rhs expression\n const node = getExpression(second, exprCtx);\n if (node && (inSubquery || fieldIsValid(first.var, exprOperator))) {\n rule = {\n field: first.var,\n operator: exprOperator,\n value: node,\n valueSource: 'expression',\n };\n }\n }\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n\n if (isRQBJsonLogicVar(first) && !isPojo(second)) {\n field = first.var;\n value = second;\n } else if (!isPojo(first) && isRQBJsonLogicVar(second)) {\n field = second.var;\n value = first;\n } else if (isRQBJsonLogicVar(first) && isRQBJsonLogicVar(second)) {\n field = first.var;\n value = second.var;\n valueSource = 'field';\n } else {\n return false;\n }\n\n // Translate operator if necessary\n if (isJsonLogicEqual(logic) || isJsonLogicStrictEqual(logic)) {\n operator = value === null ? 'null' : '=';\n } else if (isJsonLogicNotEqual(logic) || isJsonLogicStrictNotEqual(logic)) {\n operator = value === null ? 'notNull' : '!=';\n } else if (isJsonLogicInString(logic)) {\n operator = 'contains';\n } else if (isRQBJsonLogicStartsWith(logic)) {\n operator = 'beginsWith';\n } else if (isRQBJsonLogicEndsWith(logic)) {\n operator = 'endsWith';\n } else {\n operator = key as DefaultOperatorName;\n }\n\n if (\n inSubquery ||\n fieldIsValid(field, operator, valueSource === 'field' ? value : undefined)\n ) {\n rule = { field, operator, value, valueSource };\n }\n } else if (\n (isJsonLogicAll(logic) && isRQBJsonLogicVar(logic['all'][0])) ||\n (isJsonLogicNone(logic) && isRQBJsonLogicVar(logic['none'][0])) ||\n (isJsonLogicSome(logic) && isRQBJsonLogicVar(logic['some'][0]))\n ) {\n // The array coverage functions must have a field as their first element.\n // Otherwise we'd be comparing values to values, which is not supported.\n const match: MatchConfig = {\n mode: isJsonLogicNone(logic) ? 'none' : isJsonLogicSome(logic) ? 'some' : 'all',\n };\n\n // oxlint-disable-next-line typescript/no-explicit-any\n const [{ var: fld }, operation] = (logic as any)[match.mode];\n const matcher = processLogic(operation, false, true);\n\n if (!matcher) return false;\n\n rule = {\n field: fld,\n operator: '=',\n match,\n value: isRuleGroup(matcher) ? matcher : { combinator: 'and', rules: [matcher] },\n };\n } else if (isJsonLogicBetweenExclusive(logic) && isRQBJsonLogicVar(logic['<'][1])) {\n field = logic['<'][1].var;\n const values = [logic['<'][0], logic['<'][2]];\n // v8 ignore else\n if (\n values.every(v => isRQBJsonLogicVar(v)) ||\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n return (\n processLogic({\n and: [{ '>': [{ var: field }, values[0]] }, { '<': [{ var: field }, values[1]] }],\n }) || /* v8 ignore start -- @preserve */ false /* v8 ignore stop -- @preserve */\n );\n }\n } else if (isJsonLogicBetweenInclusive(logic) && isRQBJsonLogicVar(logic['<='][1])) {\n field = logic['<='][1].var;\n operator = 'between';\n const values = [logic['<='][0], logic['<='][2]];\n if (\n getExpression &&\n (isJsonLogicExpressionOperand(values[0]) || isJsonLogicExpressionOperand(values[1]))\n ) {\n // field between expression and expression → expression-sourced bounds\n const from = getExpression(values[0], exprCtx);\n const to = getExpression(values[1], exprCtx);\n if (from && to && fieldIsValid(field, operator)) {\n rule = { field, operator, value: [from, to], valueSource: 'expression' };\n }\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n if (logic['<='].every(v => isRQBJsonLogicVar(v))) {\n const vars = values as RQBJsonLogicVar[];\n valueSource = 'field';\n const fieldList = vars.map(el => el.var).filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n values.every(el => typeof el === 'string') ||\n values.every(el => typeof el === 'number') ||\n values.every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? values\n : joinWith(\n values.map(el => `${el}`),\n ','\n );\n }\n }\n\n if (fieldIsValid(field, operator) && value.length >= 2) {\n rule = { field, operator, value, valueSource };\n }\n } else if (isJsonLogicInArray(logic) && isRQBJsonLogicVar(keyValue[0])) {\n field = keyValue[0].var;\n operator = 'in';\n if (logic.in[1].every(v => isRQBJsonLogicVar(v))) {\n valueSource = 'field';\n const fieldList = logic.in[1]\n .map(el => el.var)\n .filter(sf => fieldIsValid(field, operator, sf));\n value = listsAsArrays ? fieldList : joinWith(fieldList, ',');\n } else {\n // v8 ignore else\n if (\n logic.in[1].every(el => typeof el === 'string') ||\n logic.in[1].every(el => typeof el === 'number') ||\n logic.in[1].every(el => typeof el === 'boolean')\n ) {\n value = listsAsArrays\n ? logic.in[1]\n : joinWith(\n logic.in[1].map(el => `${el}`),\n ','\n );\n }\n }\n\n // v8 ignore else\n if (value.length > 0) {\n rule = { field, operator, value, valueSource };\n }\n }\n\n return rule ? (outermost ? { combinator: 'and', rules: [rule] } : rule) : false;\n }\n\n const prepare = options.generateIDs ? prepareRuleGroup : <T>(g: T) => g;\n\n let logicRoot = rqbJsonLogic;\n if (typeof rqbJsonLogic === 'string') {\n try {\n logicRoot = JSON.parse(rqbJsonLogic);\n } catch {\n return prepare(emptyRuleGroup);\n }\n }\n\n const result = processLogic(logicRoot, true);\n const finalQuery: DefaultRuleGroupType = result || emptyRuleGroup;\n return prepare(options.independentCombinators ? convertToIC(finalQuery) : finalQuery);\n}\n\nexport { parseJsonLogic };\n"],"mappings":"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"}
@@ -1,78 +1,109 @@
1
- import { D as RuleGroupType, E as DefaultRuleGroupType, O as RuleType, j as Except, x as DefaultRuleGroupTypeIC } from "./index-DlVg-QXo.mjs";
2
- import { t as ParserCommonOptions } from "./import-ShTj5IdB.mjs";
3
-
1
+ import { L as Except, M as RuleGroupType, N as RuleType, P as ExpressionNode, T as DefaultRuleGroupTypeIC, j as DefaultRuleGroupType } from "./index-BSwFvkeI.mjs";
2
+ import { t as ParserCommonOptions } from "./import-BVdxeIBO.mjs";
3
+ //#region src/utils/parseMongoDB/types.d.ts
4
+ type MongoDbSupportedOperators = "$and" | "$or" | "$not" | "$eq" | "$gt" | "$gte" | "$in" | "$lt" | "$lte" | "$ne" | "$nin" | "$regex" | "$expr";
5
+ /**
6
+ * A MongoDB aggregation-expression operand that {@link parseMongoDB!ParseMongoDbOptions.getExpression}
7
+ * may receive — an aggregation-operator object (`{ $add: [...] }`, `{ $abs: x }`, etc.), a
8
+ * `"$field"` path reference, or a literal.
9
+ */
10
+ type MongoDBExpressionOperand = unknown;
11
+ /** Context passed to {@link parseMongoDB!ParseMongoDbOptions.getExpression}. */
12
+ interface ParseMongoDBExpressionContext {
13
+ /** Returns `true` if the field is configured (or if no `fields` were supplied). */
14
+ fieldExists: (fieldName: string) => boolean;
15
+ }
16
+ //#endregion
4
17
  //#region src/utils/parseMongoDB/parseMongoDB.d.ts
5
18
  /**
6
- * Options object for {@link parseMongoDB}.
7
- */
19
+ * Options object for {@link parseMongoDB}.
20
+ */
8
21
  interface ParseMongoDbOptions extends ParserCommonOptions {
9
22
  /**
10
- * When `true`, MongoDB rules in the form of `{ fieldName: { $not: { <...rule> } } }`
11
- * will be parsed into a rule group with the `not` attribute set to `true`. By default
12
- * (i.e., when this attribute is `false`), such "`$not`" rules will be parsed into a
13
- * rule with a negated operator.
14
- *
15
- * For example, with `preventOperatorNegation` set to `true`, a MongoDB rule like this...
16
- *
17
- * ```ts
18
- * { fieldName: { $not: { $eq: 1 } } }
19
- * ```
20
- *
21
- * ...would yield a rule group like this:
22
- *
23
- * ```ts
24
- * {
25
- * combinator: 'and',
26
- * not: true,
27
- * rules: [{ field: 'fieldName', operator: '=', value: 1 }]
28
- * }
29
- * ```
30
- *
31
- * By default, the same MongoDB rule would yield a rule like this:
32
- *
33
- * ```ts
34
- * { field: 'fieldName', operator: '!=', value: 1 }
35
- * // negated operator ^
36
- * ```
37
- *
38
- * @default false
39
- */
23
+ * When `true`, MongoDB rules in the form of `{ fieldName: { $not: { <...rule> } } }`
24
+ * will be parsed into a rule group with the `not` attribute set to `true`. By default
25
+ * (i.e., when this attribute is `false`), such "`$not`" rules will be parsed into a
26
+ * rule with a negated operator.
27
+ *
28
+ * For example, with `preventOperatorNegation` set to `true`, a MongoDB rule like this...
29
+ *
30
+ * ```ts
31
+ * { fieldName: { $not: { $eq: 1 } } }
32
+ * ```
33
+ *
34
+ * ...would yield a rule group like this:
35
+ *
36
+ * ```ts
37
+ * {
38
+ * combinator: 'and',
39
+ * not: true,
40
+ * rules: [{ field: 'fieldName', operator: '=', value: 1 }]
41
+ * }
42
+ * ```
43
+ *
44
+ * By default, the same MongoDB rule would yield a rule like this:
45
+ *
46
+ * ```ts
47
+ * { field: 'fieldName', operator: '!=', value: 1 }
48
+ * // negated operator ^
49
+ * ```
50
+ *
51
+ * @default false
52
+ */
40
53
  preventOperatorNegation?: boolean;
41
54
  /**
42
- * Map of additional operators to their respective processing functions. Operators
43
- * must begin with `"$"`. Processing functions should return either a {@link index!RuleType RuleType}
44
- * or {@link index!RuleGroupType RuleGroupType}.
45
- *
46
- * (The functions should _not_ return {@link index!RuleGroupTypeIC RuleGroupTypeIC}, even if using independent
47
- * combinators. If the `independentCombinators` option is `true`, `parseMongoDB`
48
- * will convert the final query to {@link index!RuleGroupTypeIC RuleGroupTypeIC} before returning it.)
49
- *
50
- * @default {}
51
- */
55
+ * Map of additional operators to their respective processing functions. Operators
56
+ * must begin with `"$"`. Processing functions should return either a {@link index!RuleType RuleType}
57
+ * or {@link index!RuleGroupType RuleGroupType}.
58
+ *
59
+ * (The functions should _not_ return {@link index!RuleGroupTypeIC RuleGroupTypeIC}, even if using independent
60
+ * combinators. If the `independentCombinators` option is `true`, `parseMongoDB`
61
+ * will convert the final query to {@link index!RuleGroupTypeIC RuleGroupTypeIC} before returning it.)
62
+ *
63
+ * @default {}
64
+ */
52
65
  additionalOperators?: Record<`$${string}`, (field: string, operator: string, value: any, options: ParserCommonOptions) => RuleType | RuleGroupType>;
66
+ /**
67
+ * Handler that converts a MongoDB aggregation-expression operand (within `$expr`) into an
68
+ * {@link ExpressionNode}. Return `null` to reject (the rule is dropped). Supplied by
69
+ * `@react-querybuilder/expr` (`expressionParserMongoDB`). When omitted, expression
70
+ * operands are ignored (rule dropped).
71
+ */
72
+ getExpression?: (node: MongoDBExpressionOperand, ctx: ParseMongoDBExpressionContext) => ExpressionNode | null;
53
73
  }
54
74
  /**
55
- * Converts a MongoDB query object or parseable string into a query suitable
56
- * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
57
- * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
58
- */
75
+ * Converts a MongoDB query object or parseable string into a query suitable
76
+ * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
77
+ * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
78
+ */
59
79
  declare function parseMongoDB(mongoDbRules: string | Record<string, any>): DefaultRuleGroupType;
60
80
  /**
61
- * Converts a MongoDB query object or parseable string into a query suitable
62
- * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
63
- * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
64
- */
81
+ * Converts a MongoDB query object or parseable string into a query suitable
82
+ * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
83
+ * ({@link index!DefaultRuleGroupType DefaultRuleGroupType}).
84
+ */
65
85
  declare function parseMongoDB(mongoDbRules: string | Record<string, any>, options: Except<ParseMongoDbOptions, "independentCombinators"> & {
66
86
  independentCombinators?: false;
67
87
  }): DefaultRuleGroupType;
68
88
  /**
69
- * Converts a MongoDB query object or parseable string into a query suitable
70
- * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
71
- * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).
72
- */
89
+ * Converts a MongoDB query object or parseable string into a query suitable
90
+ * for the {@link index!QueryBuilder QueryBuilder} component's `query` or `defaultQuery` props
91
+ * ({@link index!DefaultRuleGroupTypeIC DefaultRuleGroupTypeIC}).
92
+ */
73
93
  declare function parseMongoDB(mongoDbRules: string | Record<string, any>, options: Except<ParseMongoDbOptions, "independentCombinators"> & {
74
94
  independentCombinators: true;
75
95
  }): DefaultRuleGroupTypeIC;
76
96
  //#endregion
77
- export { ParseMongoDbOptions, parseMongoDB };
97
+ //#region src/utils/parseMongoDB/utils.d.ts
98
+ /**
99
+ * A MongoDB `$expr` comparison operand that is a candidate expression subtree: an
100
+ * aggregation-operator object (e.g. `{ $multiply: [...] }`). Bare `"$field"` strings and
101
+ * literals are not expression operands. The expr-supplied `getExpression` handler decides
102
+ * whether it maps to a known function.
103
+ */
104
+ declare const isMongoDBExpressionOperand: (operand: unknown) => boolean;
105
+ /** Reads a MongoDB field-path operand (`"$field"`), returning the field name or `null`. */
106
+ declare const mongoDbFieldRef: (operand: unknown) => string | null;
107
+ //#endregion
108
+ export { MongoDBExpressionOperand, MongoDbSupportedOperators, ParseMongoDBExpressionContext, ParseMongoDbOptions, isMongoDBExpressionOperand, mongoDbFieldRef, parseMongoDB };
78
109
  //# sourceMappingURL=parseMongoDB.d.mts.map