{"version":3,"file":"mongrule.mjs","names":["paddedVersionString","_regexCache","evalCondition","obj","condition","savedGroups","k","v","Object","entries","evalOr","evalAnd","evalConditionValue","getPath","path","parts","split","current","i","length","getRegex","regex","insensitive","arguments","undefined","cacheKey","concat","RegExp","replace","value","String","toLowerCase","Array","isArray","isOperatorObject","JSON","stringify","op","evalOperatorCondition","keys","filter","getType","t","includes","elemMatch","actual","expected","check","isIn","caseFold","val","some","el","exp","isInAll","passed","j","operator","test","e","console","error","conditions"],"sources":["../../src/mongrule.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { SavedGroupsValues } from \"./types/growthbook\";\nimport {\n  ConditionInterface,\n  TestedObj,\n  ConditionValue,\n  Operator,\n  OperatorConditionValue,\n  VarType,\n} from \"./types/mongrule\";\nimport { paddedVersionString } from \"./util\";\n\nconst _regexCache: { [key: string]: RegExp } = {};\n\n// The top-level condition evaluation function\nexport function evalCondition(\n  obj: TestedObj,\n  condition: ConditionInterface,\n  // Must be included for `condition` to correctly evaluate group Operators\n  savedGroups?: SavedGroupsValues,\n): boolean {\n  savedGroups = savedGroups || {};\n  // Condition is an object, keys are either specific operators or object paths\n  // values are either arguments for operators or conditions for paths\n  for (const [k, v] of Object.entries(condition)) {\n    switch (k) {\n      case \"$or\":\n        if (!evalOr(obj, v as ConditionInterface[], savedGroups)) return false;\n        break;\n      case \"$nor\":\n        if (evalOr(obj, v as ConditionInterface[], savedGroups)) return false;\n        break;\n      case \"$and\":\n        if (!evalAnd(obj, v as ConditionInterface[], savedGroups)) return false;\n        break;\n      case \"$not\":\n        if (evalCondition(obj, v as ConditionInterface, savedGroups))\n          return false;\n        break;\n      default:\n        if (!evalConditionValue(v, getPath(obj, k), savedGroups)) return false;\n    }\n  }\n  return true;\n}\n\n// Return value at dot-separated path of an object\nfunction getPath(obj: TestedObj, path: string) {\n  const parts = path.split(\".\");\n  let current: any = obj;\n  for (let i = 0; i < parts.length; i++) {\n    if (current && typeof current === \"object\" && parts[i] in current) {\n      current = current[parts[i]];\n    } else {\n      return null;\n    }\n  }\n  return current;\n}\n\n// Transform a regex string into a real RegExp object\nfunction getRegex(regex: string, insensitive = false): RegExp {\n  const cacheKey = `${regex}${insensitive ? \"/i\" : \"\"}`;\n  if (!_regexCache[cacheKey]) {\n    _regexCache[cacheKey] = new RegExp(\n      regex.replace(/([^\\\\])\\//g, \"$1\\\\/\"),\n      insensitive ? \"i\" : undefined,\n    );\n  }\n  return _regexCache[cacheKey];\n}\n\n// Evaluate a single value against a condition\nfunction evalConditionValue(\n  condition: ConditionValue,\n  value: any,\n  savedGroups: SavedGroupsValues,\n  insensitive: boolean = false,\n) {\n  // Simple equality comparisons\n  if (typeof condition === \"string\") {\n    if (insensitive) {\n      return String(value).toLowerCase() === condition.toLowerCase();\n    }\n    return value + \"\" === condition;\n  }\n  if (typeof condition === \"number\") {\n    return value * 1 === condition;\n  }\n  if (typeof condition === \"boolean\") {\n    return value !== null && !!value === condition;\n  }\n\n  if (condition === null) {\n    return value === null;\n  }\n\n  if (Array.isArray(condition) || !isOperatorObject(condition)) {\n    return JSON.stringify(value) === JSON.stringify(condition);\n  }\n\n  // This is a special operator condition and we should evaluate each one separately\n  for (const op in condition) {\n    if (\n      !evalOperatorCondition(\n        op as Operator,\n        value,\n        condition[op as keyof OperatorConditionValue],\n        savedGroups,\n      )\n    ) {\n      return false;\n    }\n  }\n  return true;\n}\n\n// If the object has only keys that start with '$'\nfunction isOperatorObject(obj: any): boolean {\n  const keys = Object.keys(obj);\n  return (\n    keys.length > 0 && keys.filter((k) => k[0] === \"$\").length === keys.length\n  );\n}\n\n// Return the data type of a value\nfunction getType(v: any): VarType | \"unknown\" {\n  if (v === null) return \"null\";\n  if (Array.isArray(v)) return \"array\";\n  const t = typeof v;\n  if ([\"string\", \"number\", \"boolean\", \"object\", \"undefined\"].includes(t)) {\n    return t as VarType;\n  }\n  return \"unknown\";\n}\n\n// At least one element of actual must match the expected condition/value\nfunction elemMatch(actual: any, expected: any, savedGroups: SavedGroupsValues) {\n  if (!Array.isArray(actual)) return false;\n  const check = isOperatorObject(expected)\n    ? (v: any) => evalConditionValue(expected, v, savedGroups)\n    : (v: any) => evalCondition(v, expected, savedGroups);\n  for (let i = 0; i < actual.length; i++) {\n    if (actual[i] && check(actual[i])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction isIn(\n  actual: any,\n  expected: Array<any>,\n  insensitive: boolean = false,\n): boolean {\n  if (insensitive) {\n    const caseFold = (val: any) =>\n      typeof val === \"string\" ? val.toLowerCase() : val;\n    // Do an intersection if attribute is an array (insensitive)\n    if (Array.isArray(actual)) {\n      return actual.some((el) =>\n        expected.some((exp) => caseFold(el) === caseFold(exp)),\n      );\n    }\n    return expected.some((exp) => caseFold(actual) === caseFold(exp));\n  }\n  // Do an intersection if attribute is an array\n  if (Array.isArray(actual)) {\n    return actual.some((el) => expected.includes(el));\n  }\n  return expected.includes(actual);\n}\n\nfunction isInAll(\n  actual: any,\n  expected: ConditionValue[],\n  savedGroups: SavedGroupsValues,\n  insensitive: boolean = false,\n): boolean {\n  if (!Array.isArray(actual)) return false;\n  for (let i = 0; i < expected.length; i++) {\n    let passed = false;\n    for (let j = 0; j < actual.length; j++) {\n      if (\n        evalConditionValue(expected[i], actual[j], savedGroups, insensitive)\n      ) {\n        passed = true;\n        break;\n      }\n    }\n    if (!passed) return false;\n  }\n  return true;\n}\n\n// Evaluate a single operator condition\nfunction evalOperatorCondition(\n  operator: Operator,\n  actual: any,\n  expected: any,\n  savedGroups: SavedGroupsValues,\n): boolean {\n  switch (operator) {\n    case \"$veq\":\n      return paddedVersionString(actual) === paddedVersionString(expected);\n    case \"$vne\":\n      return paddedVersionString(actual) !== paddedVersionString(expected);\n    case \"$vgt\":\n      return paddedVersionString(actual) > paddedVersionString(expected);\n    case \"$vgte\":\n      return paddedVersionString(actual) >= paddedVersionString(expected);\n    case \"$vlt\":\n      return paddedVersionString(actual) < paddedVersionString(expected);\n    case \"$vlte\":\n      return paddedVersionString(actual) <= paddedVersionString(expected);\n    case \"$eq\":\n      return actual === expected;\n    case \"$ne\":\n      return actual !== expected;\n    case \"$lt\":\n      return actual < expected;\n    case \"$lte\":\n      return actual <= expected;\n    case \"$gt\":\n      return actual > expected;\n    case \"$gte\":\n      return actual >= expected;\n    case \"$exists\":\n      // Using `!=` and `==` instead of strict checks so it also matches for undefined\n      return expected ? actual != null : actual == null;\n    case \"$in\":\n      if (!Array.isArray(expected)) return false;\n      return isIn(actual, expected);\n    case \"$ini\":\n      if (!Array.isArray(expected)) return false;\n      return isIn(actual, expected, true);\n    case \"$inGroup\":\n      return isIn(actual, savedGroups[expected] || []);\n    case \"$notInGroup\":\n      return !isIn(actual, savedGroups[expected] || []);\n    case \"$nin\":\n      if (!Array.isArray(expected)) return false;\n      return !isIn(actual, expected);\n    case \"$nini\":\n      if (!Array.isArray(expected)) return false;\n      return !isIn(actual, expected, true);\n    case \"$not\":\n      return !evalConditionValue(expected, actual, savedGroups);\n    case \"$size\":\n      if (!Array.isArray(actual)) return false;\n      return evalConditionValue(expected, actual.length, savedGroups);\n    case \"$elemMatch\":\n      return elemMatch(actual, expected, savedGroups);\n    case \"$all\":\n      if (!Array.isArray(expected)) return false;\n      return isInAll(actual, expected, savedGroups);\n    case \"$alli\":\n      if (!Array.isArray(expected)) return false;\n      return isInAll(actual, expected, savedGroups, true);\n    case \"$regex\":\n      try {\n        return getRegex(expected).test(actual);\n      } catch (e) {\n        return false;\n      }\n    case \"$regexi\":\n      try {\n        return getRegex(expected, true).test(actual);\n      } catch (e) {\n        return false;\n      }\n    case \"$type\":\n      return getType(actual) === expected;\n    default:\n      console.error(\"Unknown operator: \" + operator);\n      return false;\n  }\n}\n\n// Recursive $or rule\nfunction evalOr(\n  obj: TestedObj,\n  conditions: ConditionInterface[],\n  savedGroups: SavedGroupsValues,\n): boolean {\n  if (!conditions.length) return true;\n  for (let i = 0; i < conditions.length; i++) {\n    if (evalCondition(obj, conditions[i], savedGroups)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// Recursive $and rule\nfunction evalAnd(\n  obj: TestedObj,\n  conditions: ConditionInterface[],\n  savedGroups: SavedGroupsValues,\n): boolean {\n  for (let i = 0; i < conditions.length; i++) {\n    if (!evalCondition(obj, conditions[i], savedGroups)) {\n      return false;\n    }\n  }\n  return true;\n}\n"],"mappings":"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","ignoreList":[]}