{
  "version": 3,
  "sources": ["../../../../../src/functions/logical/iferror/iferror.ts"],
  "sourcesContent": [
    "import {\n  FormulaError,\n  type CellValue,\n  type CellNumber,\n  type FunctionDefinition,\n  type FunctionEvaluationResult,\n  type ValueEvaluationResult,\n  type CellAddress,\n  type SpreadsheetRange,\n  type SpilledValuesEvaluationResult,\n  type SingleEvaluationResult,\n  type ErrorEvaluationResult,\n} from \"../../../core/types.cjs\";\nimport { captureEvaluationErrors } from \"../../../core/utils.cjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.cjs\";\nimport type { FormulaEvaluator } from \"../../../evaluator/formula-evaluator.cjs\";\n\n/**\n * IFERROR function - Returns a value you specify if a formula evaluates to an error\n *\n * Usage: IFERROR(value, value_if_error)\n *\n * value: The expression to check for errors (required)\n * value_if_error: The value to return if the expression is an error (required)\n *\n * Examples:\n *   IFERROR(A1/B1, \"Division error\") - returns \"Division error\" if B1 is 0\n *   IFERROR(VLOOKUP(A1, table, 2), \"Not found\") - returns \"Not found\" if lookup fails\n *   IFERROR(1/0, 0) - returns 0 instead of #DIV/0! error\n *\n * Note:\n * - If value is not an error, returns the value unchanged\n * - If value is an error, returns value_if_error\n * - Supports spilled values (dynamic arrays) for both arguments\n * - Any error type (#VALUE!, #DIV/0!, #N/A, etc.) triggers the error handling\n */\n\n/**\n * Helper for creating spilled-values result for IFERROR function\n */\nfunction createIfErrorSpilledResult(\n  this: FormulaEvaluator,\n  {\n    valueResult,\n    valueIfErrorResult,\n    context,\n  }: {\n    valueResult: FunctionEvaluationResult;\n    valueIfErrorResult: FunctionEvaluationResult;\n    context: EvaluationContext;\n  }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n  const hasSpilledValue = valueResult.type === \"spilled-values\";\n  const hasSpilledError = valueIfErrorResult.type === \"spilled-values\";\n\n  if (!hasSpilledValue && !hasSpilledError) {\n    throw new Error(\"createIfErrorSpilledResult called without spilled values\");\n  }\n\n  return {\n    type: \"spilled-values\",\n    spillArea: (origin: CellAddress): SpreadsheetRange => {\n      // Calculate spill area (union of spilled ranges)\n      if (hasSpilledValue && valueResult.type === \"spilled-values\") {\n        const spillArea = valueResult.spillArea(origin);\n        if (hasSpilledError && valueIfErrorResult.type === \"spilled-values\") {\n          return this.unionRanges(\n            this.projectRange(spillArea, origin),\n            this.projectRange(valueIfErrorResult.spillArea(origin), origin)\n          );\n        }\n        return spillArea;\n      } else if (\n        hasSpilledError &&\n        valueIfErrorResult.type === \"spilled-values\"\n      ) {\n        return valueIfErrorResult.spillArea(origin);\n      } else {\n        throw new Error(\"No spilled values found\");\n      }\n    },\n    source: \"IFERROR with spilled values\",\n    evaluate: (spilledCell: any, evalContext: any): SingleEvaluationResult => {\n      // Evaluate arguments at this spilled position\n      const spillValueResult = hasSpilledValue\n        ? valueResult.evaluate(spilledCell, evalContext)\n        : valueResult;\n      const spillErrorResult = hasSpilledError\n        ? valueIfErrorResult.evaluate(spilledCell, evalContext)\n        : valueIfErrorResult;\n\n      if (spillValueResult === undefined) {\n        return {\n          type: \"error\",\n          err: FormulaError.REF,\n          message: \"The spilled value has not been evaluated\",\n          errAddress: context.dependencyNode,\n        };\n      }\n\n      if (spillErrorResult === undefined) {\n        return {\n          type: \"error\",\n          err: FormulaError.REF,\n          message: \"The spilled error value has not been evaluated\",\n          errAddress: context.dependencyNode,\n        };\n      }\n\n      // IFERROR logic: if first argument is error, return second argument\n      if (\n        spillValueResult.type === \"error\" ||\n        spillValueResult.type === \"awaiting-evaluation\"\n      ) {\n        return spillErrorResult;\n      }\n\n      // If first argument is not an error, return it\n      return spillValueResult;\n    },\n    evaluateAllCells: (intersectingRange: any) => {\n      throw new Error(\"WIP: evaluateAllCells for IFERROR is not implemented\");\n    },\n  };\n}\n\n/**\n * IFERROR function implementation\n */\nexport const IFERROR: FunctionDefinition = {\n  name: \"IFERROR\",\n  evaluate: function (node, context): FunctionEvaluationResult {\n    if (node.args.length !== 2) {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"IFERROR function takes exactly 2 arguments\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Evaluate the value argument (the expression to check for errors)\n    const valueResult = captureEvaluationErrors(\n      context.dependencyNode,\n      () => this.evaluateNode(node.args[0]!, context)\n    );\n\n    if (valueResult.type === \"awaiting-evaluation\") {\n      return valueResult;\n    }\n\n    // Handle spilled values - we need to evaluate both branches\n    // because different cells might have errors or not\n    if (valueResult.type === \"spilled-values\") {\n      // Evaluate the value_if_error argument\n      const valueIfErrorResult = this.evaluateNode(node.args[1]!, context);\n      if (\n        valueIfErrorResult.type === \"error\" ||\n        valueIfErrorResult.type === \"awaiting-evaluation\"\n      ) {\n        return valueIfErrorResult; // Error in the error handler itself\n      }\n\n      return createIfErrorSpilledResult.call(this, {\n        valueResult,\n        valueIfErrorResult,\n        context,\n      });\n    }\n\n    // LAZY EVALUATION: Only evaluate error handler if we have an error\n    // IFERROR logic: if first argument is error, return second argument\n    if (valueResult.type === \"error\") {\n      const valueIfErrorResult = this.evaluateNode(node.args[1]!, context);\n      return valueIfErrorResult;\n    }\n\n    // If first argument is not an error, return it unchanged\n    // WITHOUT evaluating the error handler\n    return valueResult;\n  },\n};\n"
  ],
  "mappings": "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",
  "debugId": "F45A586A133DA69564756E2164756E21",
  "names": []
}