{
  "version": 3,
  "sources": ["../../../src/core/utils.ts"],
  "sourcesContent": [
    "import {\n  AwaitingEvaluationError,\n  EvaluationError,\n} from \"../evaluator/evaluation-error.mjs\";\nimport {\n  FormulaError,\n  type CellAddress,\n  type ErrorEvaluationResult,\n  type LocalCellAddress,\n  type RangeAddress,\n  type RelativeRange,\n  type SpreadsheetRange,\n  type SpreadsheetRangeEnd,\n} from \"./types.mjs\";\nimport type { DependencyNode } from \"./managers/dependency-node.mjs\";\n\n// Type narrowing utilities\nexport function isCellAddress(\n  obj: RangeAddress | CellAddress\n): obj is CellAddress {\n  return (\n    obj &&\n    typeof obj === \"object\" &&\n    \"rowIndex\" in obj &&\n    \"colIndex\" in obj &&\n    \"sheetName\" in obj &&\n    \"workbookName\" in obj &&\n    !(\"range\" in obj)\n  );\n}\n\nexport function isRangeAddress(\n  obj: RangeAddress | CellAddress\n): obj is RangeAddress {\n  return (\n    obj &&\n    typeof obj === \"object\" &&\n    \"range\" in obj &&\n    \"sheetName\" in obj &&\n    \"workbookName\" in obj\n  );\n}\n\n// Column utilities\nexport const columnToIndex = (col: string): number => {\n  let result = 0;\n  for (let i = 0; i < col.length; i++) {\n    result = result * 26 + (col.charCodeAt(i) - 64); // A=1, B=2, etc.\n  }\n  return result - 1; // Convert to 0-based index\n};\n\nexport const indexToColumn = (index: number): string => {\n  let result = \"\";\n  let num = index + 1; // Convert to 1-based\n\n  while (num > 0) {\n    const remainder = (num - 1) % 26;\n    result = String.fromCharCode(65 + remainder) + result;\n    num = Math.floor((num - 1) / 26);\n  }\n\n  return result;\n};\n\nexport function getRowNumber(index: number): number {\n  return index + 1;\n}\n\nexport function getCellReference({\n  rowIndex,\n  colIndex,\n}: {\n  rowIndex: number;\n  colIndex: number;\n}) {\n  return `${indexToColumn(colIndex)}${getRowNumber(rowIndex)}`;\n}\n\n// Convert row number to letter(s) for reversed headers (1 -> A, 2 -> B, etc.)\nexport function rowToLetter(row: number): string {\n  let result = \"\";\n  let num = row - 1; // Convert to 0-based\n\n  do {\n    result = String.fromCharCode(65 + (num % 26)) + result;\n    num = Math.floor(num / 26) - 1;\n  } while (num >= 0);\n\n  return result;\n}\n\n// Convert letter(s) to row number for reversed headers (A -> 1, B -> 2, etc.)\nexport function letterToRow(letter: string): number {\n  let result = 0;\n  for (let i = 0; i < letter.length; i++) {\n    result = result * 26 + (letter.charCodeAt(i) - 64);\n  }\n  return result;\n}\n\nexport const parseCellReference = (\n  cellReference: string\n): {\n  colIndex: number;\n  rowIndex: number;\n} => {\n  const match = cellReference.match(/^([A-Z]+)(\\d+)$/);\n  if (!match) {\n    throw new Error(`Invalid cell reference: ${cellReference}`);\n  }\n\n  const column = match[1];\n  if (match[2] === undefined || column === undefined) {\n    throw new Error(`Invalid cell reference: ${cellReference}`);\n  }\n  const row = parseInt(match[2], 10);\n  const colIndex = columnToIndex(column);\n  const rowIndex = row - 1; // Convert to 0-based index\n\n  return {\n    colIndex,\n    rowIndex,\n  };\n};\n\n/**\n * Returns true if the range is a single cell, false otherwise\n */\nexport function isRangeOneCell(range: SpreadsheetRange) {\n  if (range.end.col.type === \"infinity\" || range.end.row.type === \"infinity\") {\n    return false;\n  }\n  return (\n    range.start.col === range.end.col.value &&\n    range.start.row === range.end.row.value\n  );\n}\n\nexport function isCellInRange(\n  cellAddress: LocalCellAddress,\n  range: SpreadsheetRange\n) {\n  const endCol = range.end.col;\n  const endRow = range.end.row;\n  if (endCol.type === \"number\" && endRow.type === \"number\") {\n    return (\n      cellAddress.colIndex >= range.start.col &&\n      cellAddress.colIndex <= endCol.value &&\n      cellAddress.rowIndex >= range.start.row &&\n      cellAddress.rowIndex <= endRow.value\n    );\n  } else if (endCol.type === \"infinity\" && endRow.type === \"number\") {\n    return (\n      cellAddress.colIndex >= range.start.col &&\n      cellAddress.rowIndex >= range.start.row &&\n      cellAddress.rowIndex <= endRow.value\n    );\n  } else if (endCol.type === \"number\" && endRow.type === \"infinity\") {\n    return (\n      cellAddress.rowIndex >= range.start.row &&\n      cellAddress.colIndex >= range.start.col &&\n      cellAddress.colIndex <= endCol.value\n    );\n  } else if (endCol.type === \"infinity\" && endRow.type === \"infinity\") {\n    return (\n      cellAddress.colIndex >= range.start.col &&\n      cellAddress.rowIndex >= range.start.row\n    );\n  }\n  return false;\n}\n\nexport function getRangeKey(range: SpreadsheetRange) {\n  let rangeKey = \"\";\n  rangeKey += getCellReference({\n    rowIndex: range.start.row,\n    colIndex: range.start.col,\n  });\n  rangeKey += \":\";\n  if (range.end.col.type === \"number\" && range.end.row.type === \"number\") {\n    rangeKey += getCellReference({\n      rowIndex: range.end.row.value,\n      colIndex: range.end.col.value,\n    });\n  } else if (\n    range.end.col.type === \"infinity\" &&\n    range.end.row.type === \"number\"\n  ) {\n    rangeKey += `${getRowNumber(range.end.row.value)}`;\n  } else if (\n    range.end.col.type === \"number\" &&\n    range.end.row.type === \"infinity\"\n  ) {\n    rangeKey += indexToColumn(range.end.col.value);\n  } else if (\n    range.end.col.type === \"infinity\" &&\n    range.end.row.type === \"infinity\"\n  ) {\n    rangeKey += \"INFINITY\";\n  }\n  return rangeKey;\n}\n\nexport function getRelativeRangeKey(range: RelativeRange): string {\n  let rangeKey = \"\";\n  rangeKey += getCellReference({\n    rowIndex: range.start.row,\n    colIndex: range.start.col,\n  });\n  rangeKey += \":\";\n\n  if (range.width.type === \"number\") {\n    rangeKey += range.width.value;\n  } else {\n    rangeKey += \"INFINITY\";\n  }\n\n  rangeKey += \"x\";\n\n  if (range.height.type === \"number\") {\n    rangeKey += range.height.value;\n  } else {\n    rangeKey += \"INFINITY\";\n  }\n\n  return rangeKey;\n}\n\nexport function getRelativeRange(\n  range: SpreadsheetRange,\n  relativeTo: LocalCellAddress\n): RelativeRange {\n  const dx = range.start.col - relativeTo.colIndex;\n  const dy = range.start.row - relativeTo.rowIndex;\n  const relativeRange: RelativeRange = {\n    start: {\n      col: dx,\n      row: dy,\n    },\n    width:\n      range.end.col.type === \"number\"\n        ? {\n            type: \"number\",\n            value: range.end.col.value - range.start.col + 1,\n          }\n        : range.end.col,\n    height:\n      range.end.row.type === \"number\"\n        ? {\n            type: \"number\",\n            value: range.end.row.value - range.start.row + 1,\n          }\n        : range.end.row,\n  };\n\n  return relativeRange;\n}\n\nexport function getAbsoluteRange(\n  range: RelativeRange,\n  relativeTo: LocalCellAddress\n): SpreadsheetRange {\n  return {\n    start: {\n      col: range.start.col + relativeTo.colIndex,\n      row: range.start.row + relativeTo.rowIndex,\n    },\n    end: {\n      col:\n        range.width.type === \"number\"\n          ? {\n              type: \"number\",\n              value:\n                range.start.col + range.width.value - 1 + relativeTo.colIndex,\n            }\n          : range.width,\n      row:\n        range.height.type === \"number\"\n          ? {\n              type: \"number\",\n              value:\n                range.start.row + range.height.value - 1 + relativeTo.rowIndex,\n            }\n          : range.height,\n    },\n  };\n}\n\nexport function keyToCellAddress(key: string): CellAddress {\n  const parts = key.split(\":\");\n\n  if (parts.length < 2) {\n    throw new Error(`Invalid dependency key format: ${key}`);\n  }\n\n  if (parts.length !== 4) {\n    throw new Error(`Invalid cell key format: ${key}`);\n  }\n  const workbookName = parts[1];\n  const sheetName = parts[2];\n  const cellRef = parts[3];\n\n  if (\n    workbookName === undefined ||\n    sheetName === undefined ||\n    cellRef === undefined\n  ) {\n    throw new Error(`Invalid cell key format: ${key}`);\n  }\n\n  const { rowIndex, colIndex } = parseCellReference(cellRef);\n\n  if (\n    rowIndex === undefined ||\n    colIndex === undefined ||\n    Number.isNaN(rowIndex) ||\n    Number.isNaN(colIndex)\n  ) {\n    throw new Error(`Invalid cell reference: ${cellRef}`);\n  }\n\n  return {\n    workbookName,\n    sheetName,\n    colIndex,\n    rowIndex,\n  };\n}\n\n/**\n * For cache lookups, use dependencyManager.getCellNode(cellAddressToKey(cellAddress)).key\n * because it may be an empty cell node key\n */\nexport function cellAddressToKey(cellAddress: CellAddress): string {\n  if (\n    cellAddress.rowIndex === undefined ||\n    cellAddress.colIndex === undefined\n  ) {\n    throw new Error(\n      `Invalid cell address: rowIndex and colIndex must be defined (got rowIndex=${cellAddress.rowIndex}, colIndex=${cellAddress.colIndex})`\n    );\n  }\n  const cellRef = getCellReference(cellAddress);\n  return `cell-value:${cellAddress.workbookName}:${cellAddress.sheetName}:${cellRef}`;\n}\n\nexport function rangeAddressToKey(rangeAddress: RangeAddress): string {\n  return `range:${rangeAddress.workbookName}:${rangeAddress.sheetName}:${getRangeKey(rangeAddress.range)}`;\n}\n\n/**\n *\n * @param key - the range key to parse e.g. range:workbook:sheet:A3:A5\n * @returns\n */\nexport function keyToRangeAddress(key: string): RangeAddress {\n  const parts = key.split(\":\");\n  if (parts.length !== 5) {\n    throw new Error(`Invalid range key format: ${key}`);\n  }\n  const workbookName = parts[1];\n  const sheetName = parts[2];\n  const rangeKey = parts[3] + \":\" + parts[4];\n  return {\n    workbookName: workbookName!,\n    sheetName: sheetName!,\n    range: parseRangeKey(rangeKey!),\n  };\n}\n\n/**\n *\n * @param key - the range key to parse e.g. A3:A5 or A4:INFINITY\n * @returns\n */\nfunction parseRangeKey(key: string): SpreadsheetRange {\n  const parts = key.split(\":\");\n  if (parts.length !== 2) {\n    throw new Error(`Invalid range key format: ${key}`);\n  }\n\n  const start = parseCellReference(parts[0]!);\n  const end = parts[1]!;\n\n  let endRow: SpreadsheetRangeEnd;\n  let endCol: SpreadsheetRangeEnd;\n\n  if (end === \"INFINITY\") {\n    endRow = {\n      type: \"infinity\",\n      sign: \"positive\",\n    };\n    endCol = {\n      type: \"infinity\",\n      sign: \"positive\",\n    };\n  } else if (!end?.match(/\\d/)) {\n    endRow = {\n      type: \"infinity\",\n      sign: \"positive\",\n    };\n    endCol = {\n      type: \"number\",\n      value: columnToIndex(end!),\n    };\n  } else if (!end?.match(/[A-Z]/)) {\n    endRow = {\n      type: \"number\",\n      value: parseInt(end!, 10) - 1,\n    };\n    endCol = {\n      type: \"infinity\",\n      sign: \"positive\",\n    };\n  } else {\n    const { rowIndex, colIndex } = parseCellReference(end!);\n    endRow = {\n      type: \"number\",\n      value: rowIndex,\n    };\n    endCol = {\n      type: \"number\",\n      value: colIndex,\n    };\n  }\n\n  return {\n    start: {\n      col: start.colIndex,\n      row: start.rowIndex,\n    },\n    end: {\n      row: endRow,\n      col: endCol,\n    },\n  };\n}\n\n/**\n * Check if two ranges intersect\n */\nexport function checkRangeIntersection(\n  range1: SpreadsheetRange,\n  range2: SpreadsheetRange\n): boolean {\n  // Check if ranges don't intersect\n  if (\n    range1.end.col.type === \"number\" &&\n    range2.start.col > range1.end.col.value\n  )\n    return false;\n  if (\n    range2.end.col.type === \"number\" &&\n    range1.start.col > range2.end.col.value\n  )\n    return false;\n  if (\n    range1.end.row.type === \"number\" &&\n    range2.start.row > range1.end.row.value\n  )\n    return false;\n  if (\n    range2.end.row.type === \"number\" &&\n    range1.start.row > range2.end.row.value\n  )\n    return false;\n\n  return true;\n}\n\n/**\n * Get the intersection of two ranges\n */\nexport function getRangeIntersection(\n  range1: SpreadsheetRange,\n  range2: SpreadsheetRange\n): SpreadsheetRange | null {\n  if (!checkRangeIntersection(range1, range2)) {\n    return null;\n  }\n\n  const startRow = Math.max(range1.start.row, range2.start.row);\n  const startCol = Math.max(range1.start.col, range2.start.col);\n\n  let endRow, endCol;\n\n  // Handle end row\n  if (\n    range1.end.row.type === \"infinity\" &&\n    range2.end.row.type === \"infinity\"\n  ) {\n    endRow = { type: \"infinity\" as const, sign: \"positive\" as const };\n  } else if (\n    range1.end.row.type === \"number\" &&\n    range2.end.row.type === \"number\"\n  ) {\n    endRow = {\n      type: \"number\" as const,\n      value: Math.min(range1.end.row.value, range2.end.row.value),\n    };\n  } else {\n    // One is finite, one is infinite\n    endRow = range1.end.row.type === \"number\" ? range1.end.row : range2.end.row;\n  }\n\n  // Handle end col\n  if (\n    range1.end.col.type === \"infinity\" &&\n    range2.end.col.type === \"infinity\"\n  ) {\n    endCol = { type: \"infinity\" as const, sign: \"positive\" as const };\n  } else if (\n    range1.end.col.type === \"number\" &&\n    range2.end.col.type === \"number\"\n  ) {\n    endCol = {\n      type: \"number\" as const,\n      value: Math.min(range1.end.col.value, range2.end.col.value),\n    };\n  } else {\n    // One is finite, one is infinite\n    endCol = range1.end.col.type === \"number\" ? range1.end.col : range2.end.col;\n  }\n\n  return {\n    start: { row: startRow, col: startCol },\n    end: { row: endRow, col: endCol },\n  };\n}\n\nexport function captureEvaluationErrors<T>(\n  errAddress: DependencyNode,\n  fn: () => T\n): T | ErrorEvaluationResult {\n  try {\n    return fn();\n  } catch (error) {\n    if (error instanceof EvaluationError) {\n      return {\n        type: \"error\",\n        err: error.type,\n        message: error.message,\n        errAddress: error.errAddress ?? errAddress,\n      };\n    }\n    if (error instanceof AwaitingEvaluationError) {\n      return {\n        type: \"awaiting-evaluation\",\n        waitingFor: error.waitingFor,\n        errAddress: error.errAddress,\n      };\n    }\n\n    // Convert JavaScript errors to formula errors\n    const formulaError =\n      error instanceof Error\n        ? mapJSErrorToFormulaError(error)\n        : FormulaError.ERROR;\n\n    return {\n      type: \"error\",\n      err: formulaError,\n      message: (error as any)?.stack || \"An error was thrown\",\n      errAddress,\n    };\n  }\n}\n\nfunction isFormulaError(value: string): value is FormulaError {\n  if (typeof value !== \"string\") return false;\n\n  // Check for all known formula errors\n  const errors: FormulaError[] = Object.values(FormulaError);\n\n  return errors.includes(value as FormulaError);\n}\n\n/**\n * Maps JavaScript errors to formula errors\n */\nfunction mapJSErrorToFormulaError(error: Error): FormulaError {\n  const message = error.message.toLowerCase();\n\n  if (isFormulaError(error.message)) {\n    return error.message;\n  }\n\n  if (\n    message.includes(\"division by zero\") ||\n    message.includes(\"divide by zero\")\n  ) {\n    return FormulaError.DIV0;\n  }\n  if (message.includes(\"circular\") || message.includes(\"cycle\")) {\n    return FormulaError.CYCLE;\n  }\n  if (\n    message.includes(\"invalid reference\") ||\n    (message.includes(\"reference\") && !message.includes(\"circular\"))\n  ) {\n    return FormulaError.REF;\n  }\n  if (\n    message.includes(\"invalid name\") ||\n    message.includes(\"unknown function\")\n  ) {\n    return FormulaError.NAME;\n  }\n  if (\n    message.includes(\"invalid number\") ||\n    message.includes(\"nan\") ||\n    message.includes(\"infinity\")\n  ) {\n    return FormulaError.NUM;\n  }\n  if (message.includes(\"type\") || message.includes(\"invalid argument\")) {\n    return FormulaError.VALUE;\n  }\n  if (message.includes(\"not available\") || message.includes(\"n/a\")) {\n    return FormulaError.NA;\n  }\n\n  return FormulaError.ERROR;\n}\n"
  ],
  "mappings": "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",
  "debugId": "76D7EC912EF53F9A64756E2164756E21",
  "names": []
}