{"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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"}