{
  "version": 3,
  "sources": ["../../../../../src/functions/information/row/row.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 CellInRangeResult,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\nimport type { ReferenceNode, RangeNode } from \"../../../parser/ast.mjs\";\nimport { EvaluationError } from \"../../../evaluator/evaluation-error.mjs\";\nimport {\n  getRangeIntersection,\n  isCellAddress,\n  isRangeAddress,\n} from \"../../../core/utils.mjs\";\n\n/**\n * ROW function - Returns the row number of a reference\n *\n * Usage: ROW([reference])\n *\n * If reference is omitted, returns the row number of the cell in which the formula appears.\n *\n * Examples:\n * - ROW() returns the row number of the current cell\n * - ROW(A5) returns 5\n * - ROW(A5:A10) returns an array of row numbers {5;6;7;8;9;10}\n */\nexport const ROW: FunctionDefinition = {\n  name: \"ROW\",\n  evaluate: function (node, context): FunctionEvaluationResult {\n    // If no arguments, return the row of the current cell (1-based)\n    if (node.args.length === 0) {\n      context.addContextDependency(\"row\");\n      return {\n        type: \"value\",\n        result: {\n          type: \"number\",\n          value: context.cellAddress.rowIndex + 1,\n        },\n      };\n    }\n\n    if (node.args.length > 1) {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"ROW function takes at most 1 argument\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    const argNode = node.args[0]!;\n\n    // Evaluate the argument\n    const argResult = this.evaluateNode(argNode, context);\n\n    // Handle errors and awaiting evaluation\n    if (\n      argResult.type === \"error\" ||\n      argResult.type === \"awaiting-evaluation\"\n    ) {\n      return argResult;\n    }\n\n    // Check if we have a cell or range reference\n    const cellOrRange =\n      argResult.type === \"spilled-values\"\n        ? (argResult.sourceCell ?? argResult.sourceRange)\n        : argResult.sourceCell;\n\n    // If we don't have a sourceCell or sourceRange, the argument is invalid\n    if (!cellOrRange) {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"ROW function requires a cell or range reference\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // If we have a sourceCell (single cell reference), return its row\n    if (isCellAddress(cellOrRange)) {\n      return {\n        type: \"value\",\n        result: { type: \"number\", value: cellOrRange.rowIndex + 1 },\n      };\n    }\n\n    // If we have a sourceRange, return spilled row numbers\n    if (isRangeAddress(cellOrRange) && argResult.type === \"spilled-values\") {\n      const sourceRange = cellOrRange.range;\n\n      // Return as spilled values - evaluate returns row numbers based on position\n      return {\n        type: \"spilled-values\",\n        spillArea: (origin) => argResult.spillArea(origin),\n        sourceRange: cellOrRange,\n        source: \"ROW with range/array argument\",\n        evaluate: (spillOffset, evalContext) => {\n          // If we have a sourceRange, use it to get the actual row number\n          if (sourceRange) {\n            const actualRow = sourceRange.start.row + spillOffset.y;\n            return {\n              type: \"value\",\n              result: { type: \"number\", value: actualRow + 1 }, // 1-based\n            };\n          }\n\n          // Otherwise, use spillArea to get the row number relative to where it appears\n          const spillArea = argResult.spillArea(evalContext.cellAddress);\n          const actualRow = spillArea.start.row + spillOffset.y;\n          return {\n            type: \"value\",\n            result: { type: \"number\", value: actualRow + 1 }, // 1-based\n          };\n        },\n        evaluateAllCells: ({ evaluate, intersection, context, origin }) => {\n          // Determine the actual range to evaluate\n          let rangeToEvaluate = cellOrRange.range;\n\n          // Apply intersection if provided\n          if (intersection) {\n            // Use the intersection range\n            const newRange = getRangeIntersection(\n              rangeToEvaluate,\n              intersection\n            );\n            if (!newRange) {\n              return {\n                type: \"error\",\n                err: FormulaError.VALUE,\n                message: \"Intersection range is not valid\",\n                errAddress: context.dependencyNode,\n              };\n            }\n            rangeToEvaluate = newRange;\n          }\n\n          // Check if the range is infinite\n          if (\n            rangeToEvaluate.end.row.type === \"infinity\" ||\n            rangeToEvaluate.end.col.type === \"infinity\"\n          ) {\n            throw new EvaluationError(\n              FormulaError.VALUE,\n              \"ROW function cannot evaluate all cells over an infinite range\"\n            );\n          }\n\n          // Extract unique row numbers from the range\n          const startRow = rangeToEvaluate.start.row;\n          const endRow = rangeToEvaluate.end.row.value;\n\n          const rowSet = new Set<number>();\n          for (let row = startRow; row <= endRow; row++) {\n            rowSet.add(row + 1); // 1-based\n          }\n          const rows = Array.from(rowSet).sort((a, b) => a - b);\n\n          const results: CellInRangeResult[] = [];\n          for (let i = 0; i < rows.length; i++) {\n            const relativePos = { x: 0, y: i };\n            const evaled = evaluate(relativePos, context);\n            results.push({\n              result: evaled,\n              relativePos,\n            });\n          }\n          return {\n            type: \"values\",\n            values: results,\n          };\n        },\n      };\n    }\n\n    // If we reach here, cellOrRange type is unknown\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: \"ROW function requires a cell or range reference\",\n      errAddress: context.dependencyNode,\n    };\n  },\n};\n"
  ],
  "mappings": "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",
  "debugId": "06BB67FD2627AC3D64756E2164756E21",
  "names": []
}