@ricsam/formula-engine 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/cjs/core/engine-snapshot.cjs +2 -2
  2. package/dist/cjs/core/engine-snapshot.cjs.map +2 -2
  3. package/dist/cjs/core/engine.cjs +3 -3
  4. package/dist/cjs/core/engine.cjs.map +3 -3
  5. package/dist/cjs/core/managers/dependency-manager.cjs +15 -17
  6. package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
  7. package/dist/cjs/core/managers/evaluation-manager.cjs +15 -17
  8. package/dist/cjs/core/managers/evaluation-manager.cjs.map +3 -3
  9. package/dist/cjs/evaluator/evaluation-context.cjs +22 -6
  10. package/dist/cjs/evaluator/evaluation-context.cjs.map +3 -3
  11. package/dist/cjs/evaluator/formula-evaluator.cjs +3 -3
  12. package/dist/cjs/evaluator/formula-evaluator.cjs.map +3 -3
  13. package/dist/cjs/package.json +1 -1
  14. package/dist/mjs/core/engine-snapshot.mjs +2 -2
  15. package/dist/mjs/core/engine-snapshot.mjs.map +2 -2
  16. package/dist/mjs/core/engine.mjs +3 -3
  17. package/dist/mjs/core/engine.mjs.map +3 -3
  18. package/dist/mjs/core/managers/dependency-manager.mjs +15 -17
  19. package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
  20. package/dist/mjs/core/managers/evaluation-manager.mjs +15 -17
  21. package/dist/mjs/core/managers/evaluation-manager.mjs.map +3 -3
  22. package/dist/mjs/evaluator/evaluation-context.mjs +23 -6
  23. package/dist/mjs/evaluator/evaluation-context.mjs.map +3 -3
  24. package/dist/mjs/evaluator/formula-evaluator.mjs +3 -3
  25. package/dist/mjs/evaluator/formula-evaluator.mjs.map +3 -3
  26. package/dist/mjs/package.json +1 -1
  27. package/dist/types/core/engine-snapshot.d.ts +13 -13
  28. package/dist/types/core/managers/dependency-manager.d.ts +0 -1
  29. package/dist/types/evaluator/evaluation-context.d.ts +3 -0
  30. package/package.json +1 -1
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/evaluator/formula-evaluator.ts"],
4
4
  "sourcesContent": [
5
- "import type {\n LocalCellAddress,\n RangeAddress,\n SingleEvaluationResult,\n} from \"../core/types.cjs\";\nimport {\n FormulaError,\n type CellAddress,\n type CellValue,\n type FunctionEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"../core/types.cjs\";\nimport { parseFormula } from \"../parser/parser.cjs\";\n\nimport type { DependencyManager } from \"../core/managers/dependency-manager.cjs\";\nimport type { NamedExpressionManager } from \"../core/managers/named-expression-manager.cjs\";\nimport type { TableManager } from \"../core/managers/table-manager.cjs\";\nimport {\n captureEvaluationErrors,\n cellAddressToKey,\n getAbsoluteRange,\n getRangeIntersection,\n getRangeKey,\n getRelativeRange,\n isRangeOneCell,\n rangeAddressToKey,\n} from \"../core/utils.cjs\";\nimport {\n getNamedExpressionResourceKey,\n getSheetResourceKey,\n getTableResourceKey,\n getWorkbookResourceKey,\n} from \"../core/resource-keys.cjs\";\nimport {\n evaluateScalarOperator,\n type EvaluateScalarOperatorOptions,\n} from \"../evaluator/evaluate-scalar-operator.cjs\";\nimport { functions } from \"../functions/function-registry.cjs\";\nimport type {\n ArrayNode,\n ASTNode,\n BinaryOpNode,\n FunctionNode,\n NamedExpressionNode,\n RangeNode,\n ReferenceNode,\n StructuredReferenceNode,\n ThreeDRangeNode,\n UnaryOpNode,\n ValueNode,\n} from \"../parser/ast.cjs\";\nimport { add } from \"./arithmetic/add/add.cjs\";\nimport { divide } from \"./arithmetic/divide/divide.cjs\";\nimport { multiply } from \"./arithmetic/multiply/multiply.cjs\";\nimport { power } from \"./arithmetic/power/power.cjs\";\nimport { subtract } from \"./arithmetic/subtract/subtract.cjs\";\nimport { equals } from \"./comparison/equals.cjs\";\nimport { greaterThan } from \"./comparison/greater-than.cjs\";\nimport { greaterThanOrEqual } from \"./comparison/greater-than-or-equal.cjs\";\nimport { lessThan } from \"./comparison/less-than.cjs\";\nimport { lessThanOrEqual } from \"./comparison/less-than-or-equal.cjs\";\nimport { notEquals } from \"./comparison/not-equals.cjs\";\nimport { concatenate } from \"./concatenation/concatenate.cjs\";\nimport { CellValueNode } from \"./dependency-nodes/cell-value-node.cjs\";\nimport { EvaluationContext } from \"./evaluation-context.cjs\";\n\nexport class FormulaEvaluator {\n constructor(\n private tableManager: TableManager,\n private dependencyManager: DependencyManager,\n private namedExpressionManager: NamedExpressionManager\n ) {}\n\n // evaluator methods\n evaluateFormula(\n /**\n * formula is the formula to evaluate, without the leading =\n */\n formula: string,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const ast = parseFormula(formula);\n\n return captureEvaluationErrors(context.dependencyNode, () => {\n const result = this.evaluateNode(ast, context);\n return result;\n });\n }\n\n evaluateNode(\n node: ASTNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const currentContext = {\n ...context.cellAddress,\n tableName: context.tableName,\n };\n\n const astNode = this.dependencyManager.getAstNode(node, currentContext);\n context.dependencyNode.addDependency(astNode);\n\n // if (astNode.evaluationResult.type !== \"awaiting-evaluation\") {\n // return astNode.evaluationResult;\n // }\n\n if (astNode.resolved) {\n const astContextDependency = astNode.getContextDependency();\n context.appendContextDependency(astContextDependency);\n return astNode.evaluationResult;\n }\n\n this.dependencyManager.unregisterNode(astNode);\n astNode.resetDirectDepsUpdated();\n\n function runEvaluation(\n this: FormulaEvaluator,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n switch (node.type) {\n case \"value\":\n return {\n type: \"value\",\n result: this.evaluateValue(node),\n };\n case \"infinity\":\n return {\n type: \"value\",\n result: {\n type: \"infinity\",\n sign: \"positive\",\n },\n };\n case \"binary-op\":\n return this.evaluateBinaryOp(node, context);\n\n case \"reference\":\n return this.evaluateReference(node, context);\n\n case \"named-expression\":\n return this.evaluateNamedExpression(node, context);\n\n case \"structured-reference\":\n return this.evaluateStructuredReference(node, context);\n\n case \"function\":\n return this.evaluateFunction(node, context);\n\n case \"range\":\n return this.evaluateRange(node, context);\n\n case \"unary-op\":\n return this.evaluateUnaryOp(node, context);\n\n case \"3d-range\":\n return this.evaluate3DRange(node, context);\n\n case \"array\":\n return this.evaluateArray(node, context);\n\n default:\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"WIP: unimplemented support for \" + node.type,\n errAddress: context.dependencyNode,\n };\n }\n }\n const newContext = new EvaluationContext(\n this.tableManager,\n astNode,\n context.cellAddress\n );\n const result = captureEvaluationErrors(astNode, () =>\n runEvaluation.call(this, newContext)\n );\n astNode.setEvaluationResult(result);\n const astContextDependency = newContext.getContextDependency();\n\n astNode.setContextDependency(astContextDependency);\n this.dependencyManager.registerNode(astNode);\n\n context.appendContextDependency(astContextDependency);\n\n return result;\n }\n\n evaluateStructuredReference(\n node: StructuredReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const resourceWorkbookName =\n node.workbookName ?? context.cellAddress.workbookName;\n if (node.tableName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getTableResourceKey({\n workbookName: resourceWorkbookName,\n tableName: node.tableName,\n })\n )\n );\n }\n\n // the tables are never dependent on the sheet, interesetingly enough\n let table: TableDefinition | undefined;\n if (node.tableName && node.workbookName) {\n // this expression will evaluate to the same value regardless of where in the workbooks we are evaluating it in\n table = this.tableManager\n .getTables(node.workbookName)\n .get(node.tableName);\n } else if (node.tableName) {\n // different workbooks could have different tables with the same name\n // so it can differ based on the workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n table = this.tableManager\n .getTables(context.cellAddress.workbookName)\n .get(node.tableName);\n } else {\n // If no table nor workbook name is provided, the current cell's table\n // membership determines the result.\n context.addContextDependency(\"workbook\", \"table\");\n table = this.tableManager.isCellInTable(context.cellAddress);\n }\n\n if (node.isCurrentRow) {\n context.addContextDependency(\"row\");\n }\n\n if (!table) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Table ${node.tableName} not found`,\n errAddress: context.dependencyNode,\n };\n }\n\n const rowIndex = context.cellAddress.rowIndex;\n const tableStart = table.start;\n\n // Handle selector-based references\n if (node.selector) {\n let startRow: number;\n let endRow: SpreadsheetRangeEnd;\n\n switch (node.selector) {\n case \"#Headers\":\n startRow = table.start.rowIndex;\n endRow = { type: \"number\", value: table.start.rowIndex };\n break;\n case \"#Data\":\n startRow = table.start.rowIndex + 1;\n endRow = table.endRow;\n break;\n case \"#All\":\n startRow = table.start.rowIndex;\n endRow = table.endRow;\n break;\n default:\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Unknown table selector: ${node.selector}`,\n errAddress: context.dependencyNode,\n };\n }\n\n // If we also have column specification, use those columns\n if (node.cols) {\n const startCol = table.headers.get(node.cols.startCol);\n const endCol = table.headers.get(node.cols.endCol);\n if (!startCol || !endCol) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Column ${node.cols.startCol} or ${node.cols.endCol} not found in table ${table.name}`,\n errAddress: context.dependencyNode,\n };\n }\n const startColIndex = tableStart.colIndex + startCol.index;\n const endColIndex = tableStart.colIndex + endCol.index;\n\n const range: SpreadsheetRange = {\n start: {\n row: startRow,\n col: startColIndex,\n },\n end: {\n row: endRow,\n col: { type: \"number\", value: endColIndex },\n },\n };\n\n return this.evaluateRange(\n {\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n },\n context\n );\n } else {\n // No column specification, return entire row(s) for the selector\n const range: SpreadsheetRange = {\n start: {\n row: startRow,\n col: tableStart.colIndex,\n },\n end: {\n row: endRow,\n col: {\n type: \"number\",\n value: tableStart.colIndex + table.headers.size - 1,\n },\n },\n };\n\n return this.evaluateRange(\n {\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n },\n context\n );\n }\n }\n\n // Handle column-only references (no selector)\n if (node.cols) {\n const startCol = table.headers.get(node.cols.startCol);\n const endCol = table.headers.get(node.cols.endCol);\n if (!startCol || !endCol) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Column ${node.cols.startCol} or ${node.cols.endCol} not found in table ${table.name}`,\n errAddress: context.dependencyNode,\n };\n }\n const startColIndex = tableStart.colIndex + startCol.index;\n const endColIndex = tableStart.colIndex + endCol.index;\n const range: SpreadsheetRange = {\n start: {\n row: node.isCurrentRow ? rowIndex : table.start.rowIndex + 1,\n col: startColIndex,\n },\n end: {\n row: node.isCurrentRow\n ? { type: \"number\", value: rowIndex }\n : table.endRow,\n col: { type: \"number\", value: endColIndex },\n },\n };\n\n return this.evaluateRange(\n {\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n },\n context\n );\n }\n\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Structured reference must specify either a selector or columns\",\n errAddress: context.dependencyNode,\n };\n }\n\n /**\n * Evaluates a value node\n */\n evaluateValue(node: ValueNode): CellValue {\n return node.value;\n }\n\n evaluate3DRange(\n node: ThreeDRangeNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n throw new Error(\"WIP: 3d range is not implemented\");\n /*\n const startSheet = this.sheets.get(node.startSheet);\n const endSheet = this.sheets.get(node.endSheet);\n if (!startSheet || !endSheet) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Sheet ${node.startSheet} or ${node.endSheet} not found`,\n };\n }\n\n let numCols = 0;\n let numRows = 0;\n for (let i = startSheet.index; i <= endSheet.index; i++) {\n if (node.reference.type === \"reference\") {\n numCols += 1;\n } else {\n numCols += node.reference.range.end.col.value - node.reference.range.start.col.value + 1;\n }\n\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Sheet ${i} not found`,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => ({\n start: {\n col: origin.colIndex,\n row: origin.rowIndex,\n },\n end: {\n col: { type: \"number\", value: origin.colIndex },\n row: {\n type: \"number\",\n value: origin.rowIndex + numSheets - 1,\n },\n },\n }),\n source: `range`,\n originResult:\n originResult.type === \"value\"\n ? originResult.result\n : originResult.originResult,\n evaluate: (spilledCell, context) => {\n const colIndex = range.start.col + spilledCell.spillOffset.x;\n const rowIndex = range.start.row + spilledCell.spillOffset.y;\n const sheetName = node.sheetName ?? context.currentSheet;\n return this.evalTimeSafeEvaluateCell(\n {\n colIndex,\n rowIndex,\n sheetName,\n },\n context\n );\n },\n };\n */\n }\n\n evaluateRange(\n node: RangeNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n if (isRangeOneCell(node.range)) {\n return this.evaluateReference(\n {\n type: \"reference\",\n address: {\n colIndex: node.range.start.col,\n rowIndex: node.range.start.row,\n },\n isAbsolute: {\n col: node.isAbsolute.start.col || node.isAbsolute.end.col,\n row: node.isAbsolute.start.row || node.isAbsolute.end.row,\n },\n sheetName: node.sheetName,\n },\n context\n );\n }\n\n const debugRange = getRangeKey(node.range);\n\n const rangeAddress: RangeAddress = {\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n range: node.range,\n };\n\n if (node.workbookName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getWorkbookResourceKey(node.workbookName)\n )\n );\n }\n if (node.sheetName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getSheetResourceKey({\n workbookName: rangeAddress.workbookName,\n sheetName: node.sheetName,\n })\n )\n );\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin) => this.projectRange(node.range, origin),\n source: `range ${debugRange}`,\n sourceRange: rangeAddress,\n evaluate: (spillOffset, context) => {\n if (!node.sheetName && !node.workbookName) {\n // e.g. the result from A4:A9 will depend in which sheet and workbook we are evaluating it in\n context.addContextDependency(\"workbook\", \"sheet\");\n } else if (!node.sheetName) {\n // e.g. the result from [Workbook1]A4:A9 will depend in which sheet we are evaluating it in\n context.addContextDependency(\"sheet\");\n } else if (!node.workbookName) {\n // e.g. the result from Sheet1!A4:A9 will depend in which workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n } else {\n // if we have both sheetName and workbookName, we don't need to add any context dependencies\n }\n\n const originSheetName = node.sheetName ?? context.cellAddress.sheetName;\n const originWorkbookName =\n node.workbookName ?? context.cellAddress.workbookName;\n const colIndex = node.range.start.col + spillOffset.x;\n const rowIndex = node.range.start.row + spillOffset.y;\n\n const cellAddress: CellAddress = {\n colIndex,\n rowIndex,\n sheetName: originSheetName,\n workbookName: originWorkbookName,\n };\n\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(\n cellAddressToKey(cellAddress)\n );\n context.dependencyNode.addDependency(evalNode);\n\n const result = evalNode.evaluationResult;\n\n return result;\n },\n evaluateAllCells: function ({\n evaluate,\n intersection,\n context,\n origin,\n lookupOrder,\n }) {\n let range = node.range;\n if (intersection) {\n // When we have an intersection, it's defined relative to where the spilled range\n // will appear (the origin). However, we need to evaluate cells from the source\n // range (node.range). So we must translate the intersection coordinates back\n // to the source range's coordinate system.\n //\n // Example: If source range A1:C3 spills to D5:F7, and we want intersection E6:F7,\n // we need to translate E6:F7 (relative to D5) to B2:C3 (relative to A1).\n\n // Calculate the offset of the intersection from the spill origin\n const relativeRange = getRelativeRange(intersection, origin);\n const start: LocalCellAddress = {\n colIndex: node.range.start.col,\n rowIndex: node.range.start.row,\n };\n const projectedIntersection = getAbsoluteRange(relativeRange, start);\n const calculateIntersection = getRangeIntersection(\n node.range,\n projectedIntersection\n );\n if (calculateIntersection) {\n range = calculateIntersection;\n }\n }\n\n const address: RangeAddress = {\n range,\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n };\n\n const rangeNode = this.dependencyManager.getRangeNode(\n rangeAddressToKey(address)\n );\n\n context.dependencyNode.addDependency(rangeNode);\n\n return this.dependencyManager.getRangeNode(rangeAddressToKey(address))\n .result;\n },\n };\n }\n\n evaluateArray(\n node: ArrayNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const firstRow = node.elements[0];\n if (!firstRow) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const firstCell = firstRow[0];\n if (!firstCell) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const originResult = this.evaluateNode(firstCell, context);\n if (\n originResult.type === \"error\" ||\n originResult.type === \"awaiting-evaluation\"\n ) {\n return originResult;\n }\n return {\n type: \"spilled-values\",\n spillArea: (origin) => ({\n start: {\n col: origin.colIndex,\n row: origin.rowIndex,\n },\n end: {\n col: {\n type: \"number\",\n value: origin.colIndex + firstRow.length - 1,\n },\n row: {\n type: \"number\",\n value: origin.rowIndex + node.elements.length - 1,\n },\n },\n }),\n source: `array`,\n evaluate: (spillOffset, context) => {\n const row = node.elements[spillOffset.y];\n if (!row) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const cell = row[spillOffset.x];\n if (!cell) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const result = this.evaluateNode(cell, context);\n if (result.type === \"spilled-values\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Arrays cannot contain spilled values\",\n errAddress: context.dependencyNode,\n };\n }\n return result;\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for array is not implemented\");\n },\n };\n }\n\n /**\n * Evaluates a unary operation\n */\n evaluateUnaryOp(\n node: UnaryOpNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const operandResult = this.evaluateNode(node.operand, context);\n\n if (\n operandResult.type === \"error\" ||\n operandResult.type === \"awaiting-evaluation\"\n ) {\n return operandResult;\n }\n\n if (operandResult.type === \"spilled-values\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin) => operandResult.spillArea(origin),\n source: `unary ${node.operator} operation`,\n evaluate: (spilledCell, context) => {\n const spillResult = operandResult.evaluate(spilledCell, context);\n if (\n !spillResult ||\n spillResult.type === \"error\" ||\n spillResult.type === \"awaiting-evaluation\"\n ) {\n return spillResult;\n }\n if (spillResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid spilled result for unary operation\",\n errAddress: context.dependencyNode,\n };\n }\n return this.evaluateUnaryScalar(\n node.operator,\n spillResult.result,\n context\n );\n },\n evaluateAllCells: function (options) {\n const cellValues = operandResult.evaluateAllCells.call(this, options);\n if (cellValues.type !== \"values\") {\n return cellValues;\n }\n return {\n type: \"values\",\n values: cellValues.values.map((cellValue) => {\n if (\n cellValue.result.type === \"error\" ||\n cellValue.result.type === \"awaiting-evaluation\"\n ) {\n return cellValue;\n } else {\n return {\n result: this.evaluateUnaryScalar(\n node.operator,\n cellValue.result.result,\n context\n ),\n relativePos: cellValue.relativePos,\n };\n }\n }),\n };\n },\n };\n }\n\n if (operandResult.type === \"value\") {\n return this.evaluateUnaryScalar(\n node.operator,\n operandResult.result,\n context\n );\n }\n\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid operand for unary operation\",\n errAddress: context.dependencyNode,\n };\n }\n\n /**\n * Evaluates a unary scalar operation\n */\n private evaluateUnaryScalar(\n operator: \"+\" | \"-\" | \"%\",\n operand: CellValue,\n context: EvaluationContext\n ): SingleEvaluationResult {\n if (operand.type !== \"number\" && operand.type !== \"infinity\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Cannot apply unary ${operator} to non-number`,\n errAddress: context.dependencyNode,\n };\n }\n if (operand.type === \"infinity\") {\n if (operator === \"%\") {\n return {\n type: \"error\",\n err: FormulaError.NUM,\n message: \"Cannot apply % to infinity\",\n errAddress: context.dependencyNode,\n };\n }\n return {\n type: \"value\",\n result: {\n type: \"infinity\",\n sign: operator === \"+\" ? \"positive\" : \"negative\",\n },\n };\n }\n switch (operator) {\n case \"+\":\n return { type: \"value\", result: operand };\n\n case \"-\":\n return {\n type: \"value\",\n result: {\n type: \"number\",\n value: -operand.value,\n },\n };\n\n case \"%\":\n return {\n type: \"value\",\n result: { type: \"number\", value: operand.value / 100 },\n };\n\n default:\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Unknown unary operator: ${operator}`,\n errAddress: context.dependencyNode,\n };\n }\n }\n\n /**\n * Evaluates a binary operation\n */\n evaluateBinaryOp(\n node: BinaryOpNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const left = this.evaluateNode(node.left, context);\n const right = this.evaluateNode(node.right, context);\n\n if (left.type === \"error\" || left.type === \"awaiting-evaluation\") {\n return left;\n }\n if (right.type === \"error\" || right.type === \"awaiting-evaluation\") {\n return right;\n }\n\n // Scalar operation\n return this.evaluateBinaryScalar(node.operator, left, right, context);\n }\n\n /**\n * Evaluates a reference node\n */\n evaluateReference(\n node: ReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const cellAddress: CellAddress = {\n ...node.address,\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n };\n\n if (node.workbookName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getWorkbookResourceKey(node.workbookName)\n )\n );\n }\n if (node.sheetName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getSheetResourceKey({\n workbookName: cellAddress.workbookName,\n sheetName: node.sheetName,\n })\n )\n );\n }\n\n const key = cellAddressToKey(cellAddress);\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(key);\n context.dependencyNode.addDependency(evalNode);\n\n if (!node.sheetName && !node.workbookName) {\n // e.g. the result from A4:A9 will depend in which sheet and workbook we are evaluating it in\n context.addContextDependency(\"workbook\", \"sheet\");\n } else if (!node.sheetName) {\n // e.g. the result from [Workbook1]A4:A9 will depend in which sheet we are evaluating it in\n context.addContextDependency(\"sheet\");\n } else if (!node.workbookName) {\n // e.g. the result from Sheet1!A4:A9 will depend in which workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n } else {\n // if we have both sheetName and workbookName, we don't need to add any context dependencies\n }\n\n if (evalNode instanceof CellValueNode && evalNode.spillMeta) {\n if (evalNode.spillMeta.evaluationResult.type === \"spilled-values\") {\n return {\n ...evalNode.spillMeta.evaluationResult,\n sourceCell: cellAddress,\n sourceRange: undefined,\n };\n }\n }\n\n return { ...evalNode.evaluationResult, sourceCell: cellAddress };\n }\n\n /**\n * Evaluates a named expression node\n */\n evaluateNamedExpression(\n node: NamedExpressionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const resolvedExpression =\n this.namedExpressionManager.resolveNamedExpressionWithScope(\n node,\n context\n );\n\n if (!resolvedExpression) {\n return {\n type: \"error\",\n err: FormulaError.NAME,\n message: `Named expression ${node.name} not found`,\n errAddress: context.dependencyNode,\n };\n }\n\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getNamedExpressionResourceKey({\n expressionName: node.name,\n workbookName:\n resolvedExpression.scope.type === \"global\"\n ? undefined\n : resolvedExpression.scope.workbookName,\n sheetName:\n resolvedExpression.scope.type === \"sheet\"\n ? resolvedExpression.scope.sheetName\n : undefined,\n })\n )\n );\n\n return this.evaluateFormula(resolvedExpression.expression, context);\n }\n\n /**\n * Binary scalar operations\n */\n evaluateBinaryScalar(\n operator: string,\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n switch (operator) {\n case \"+\":\n return this.add(left, right, context);\n case \"-\":\n return this.subtract(left, right, context);\n case \"*\":\n return this.multiply(left, right, context);\n case \"/\":\n return this.divide(left, right, context);\n case \"^\":\n return this.power(left, right, context);\n\n case \"&\":\n return this.concatenateOp(left, right, context);\n case \"=\":\n return this.equalsOp(left, right, context);\n case \"<>\":\n return this.notEqualsOp(left, right, context);\n case \"<\":\n return this.lessThanOp(left, right, context);\n case \"<=\":\n return this.lessThanOrEqualOp(left, right, context);\n case \">\":\n return this.greaterThanOp(left, right, context);\n case \">=\":\n return this.greaterThanOrEqualOp(left, right, context);\n default:\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: `Unknown binary operator: ${operator}`,\n errAddress: context.dependencyNode,\n };\n }\n }\n\n evaluateFunction(\n node: FunctionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const func = functions[node.name];\n if (!func) {\n return {\n type: \"error\",\n err: FormulaError.NAME,\n message: `Function ${node.name} not found`,\n errAddress: context.dependencyNode,\n };\n }\n return func.evaluate.call(this, node, context);\n }\n\n // Arithmetic operations\n add(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: add,\n context,\n name: \"add\",\n });\n }\n\n multiply(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: multiply,\n context,\n name: \"multiply\",\n });\n }\n\n divide(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: divide,\n context,\n name: \"divide\",\n });\n }\n\n evaluateScalarOperator(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n options: EvaluateScalarOperatorOptions\n ): FunctionEvaluationResult {\n return evaluateScalarOperator.call(this, left, right, options);\n }\n\n subtract(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: subtract,\n context,\n name: \"subtract\",\n });\n }\n\n power(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: power,\n context,\n name: \"power\",\n });\n }\n\n // Comparison operations\n equalsOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: equals,\n context,\n name: \"equals\",\n });\n }\n\n notEqualsOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: notEquals,\n context,\n name: \"notEquals\",\n });\n }\n\n lessThanOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: lessThan,\n context,\n name: \"lessThan\",\n });\n }\n\n lessThanOrEqualOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: lessThanOrEqual,\n context,\n name: \"lessThanOrEqual\",\n });\n }\n\n greaterThanOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: greaterThan,\n context,\n name: \"greaterThan\",\n });\n }\n\n greaterThanOrEqualOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: greaterThanOrEqual,\n context,\n name: \"greaterThanOrEqual\",\n });\n }\n\n // Concatenation operation\n concatenateOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: concatenate,\n context,\n name: \"concatenate\",\n });\n }\n\n projectRange(\n range: SpreadsheetRange,\n originCellAddress: CellAddress\n ): SpreadsheetRange {\n const offsetLeft = originCellAddress.colIndex - range.start.col;\n const offsetTop = originCellAddress.rowIndex - range.start.row;\n return {\n start: {\n col: range.start.col + offsetLeft,\n row: range.start.row + offsetTop,\n },\n end: {\n col:\n range.end.col.type === \"number\"\n ? { type: \"number\", value: range.end.col.value + offsetLeft }\n : range.end.col,\n row:\n range.end.row.type === \"number\"\n ? { type: \"number\", value: range.end.row.value + offsetTop }\n : range.end.row,\n },\n };\n }\n\n unionRanges(\n range1: SpreadsheetRange,\n range2: SpreadsheetRange\n ): SpreadsheetRange {\n const endCol = ((): SpreadsheetRangeEnd => {\n if (\n range1.end.col.type === \"infinity\" ||\n range2.end.col.type === \"infinity\"\n ) {\n return { type: \"infinity\", sign: \"positive\" };\n }\n return {\n type: \"number\",\n value: Math.max(range1.end.col.value, range2.end.col.value),\n };\n })();\n\n const endRow = ((): SpreadsheetRangeEnd => {\n if (\n range1.end.row.type === \"infinity\" ||\n range2.end.row.type === \"infinity\"\n ) {\n return { type: \"infinity\", sign: \"positive\" };\n }\n return {\n type: \"number\",\n value: Math.max(range1.end.row.value, range2.end.row.value),\n };\n })();\n\n return {\n start: {\n col: Math.min(range1.start.col, range2.start.col),\n row: Math.min(range1.start.row, range2.start.row),\n },\n end: {\n col: endCol,\n row: endRow,\n },\n };\n }\n}\n"
5
+ "import type {\n LocalCellAddress,\n RangeAddress,\n SingleEvaluationResult,\n} from \"../core/types.cjs\";\nimport {\n FormulaError,\n type CellAddress,\n type CellValue,\n type FunctionEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"../core/types.cjs\";\nimport { parseFormula } from \"../parser/parser.cjs\";\n\nimport type { DependencyManager } from \"../core/managers/dependency-manager.cjs\";\nimport type { NamedExpressionManager } from \"../core/managers/named-expression-manager.cjs\";\nimport type { TableManager } from \"../core/managers/table-manager.cjs\";\nimport {\n captureEvaluationErrors,\n cellAddressToKey,\n getAbsoluteRange,\n getRangeIntersection,\n getRangeKey,\n getRelativeRange,\n isRangeOneCell,\n rangeAddressToKey,\n} from \"../core/utils.cjs\";\nimport {\n getNamedExpressionResourceKey,\n getSheetResourceKey,\n getTableResourceKey,\n getWorkbookResourceKey,\n} from \"../core/resource-keys.cjs\";\nimport {\n evaluateScalarOperator,\n type EvaluateScalarOperatorOptions,\n} from \"../evaluator/evaluate-scalar-operator.cjs\";\nimport { functions } from \"../functions/function-registry.cjs\";\nimport type {\n ArrayNode,\n ASTNode,\n BinaryOpNode,\n FunctionNode,\n NamedExpressionNode,\n RangeNode,\n ReferenceNode,\n StructuredReferenceNode,\n ThreeDRangeNode,\n UnaryOpNode,\n ValueNode,\n} from \"../parser/ast.cjs\";\nimport { add } from \"./arithmetic/add/add.cjs\";\nimport { divide } from \"./arithmetic/divide/divide.cjs\";\nimport { multiply } from \"./arithmetic/multiply/multiply.cjs\";\nimport { power } from \"./arithmetic/power/power.cjs\";\nimport { subtract } from \"./arithmetic/subtract/subtract.cjs\";\nimport { equals } from \"./comparison/equals.cjs\";\nimport { greaterThan } from \"./comparison/greater-than.cjs\";\nimport { greaterThanOrEqual } from \"./comparison/greater-than-or-equal.cjs\";\nimport { lessThan } from \"./comparison/less-than.cjs\";\nimport { lessThanOrEqual } from \"./comparison/less-than-or-equal.cjs\";\nimport { notEquals } from \"./comparison/not-equals.cjs\";\nimport { concatenate } from \"./concatenation/concatenate.cjs\";\nimport { CellValueNode } from \"./dependency-nodes/cell-value-node.cjs\";\nimport { EvaluationContext } from \"./evaluation-context.cjs\";\n\nexport class FormulaEvaluator {\n constructor(\n private tableManager: TableManager,\n private dependencyManager: DependencyManager,\n private namedExpressionManager: NamedExpressionManager\n ) {}\n\n // evaluator methods\n evaluateFormula(\n /**\n * formula is the formula to evaluate, without the leading =\n */\n formula: string,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const ast = parseFormula(formula);\n\n return captureEvaluationErrors(context.dependencyNode, () => {\n const result = this.evaluateNode(ast, context);\n return result;\n });\n }\n\n evaluateNode(\n node: ASTNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const currentContext = {\n ...context.cellAddress,\n tableName: context.cacheTableName,\n };\n\n const astNode = this.dependencyManager.getAstNode(node, currentContext);\n context.dependencyNode.addDependency(astNode);\n\n // if (astNode.evaluationResult.type !== \"awaiting-evaluation\") {\n // return astNode.evaluationResult;\n // }\n\n if (astNode.resolved) {\n const astContextDependency = astNode.getContextDependency();\n context.appendContextDependency(astContextDependency);\n return astNode.evaluationResult;\n }\n\n this.dependencyManager.unregisterNode(astNode);\n astNode.resetDirectDepsUpdated();\n\n function runEvaluation(\n this: FormulaEvaluator,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n switch (node.type) {\n case \"value\":\n return {\n type: \"value\",\n result: this.evaluateValue(node),\n };\n case \"infinity\":\n return {\n type: \"value\",\n result: {\n type: \"infinity\",\n sign: \"positive\",\n },\n };\n case \"binary-op\":\n return this.evaluateBinaryOp(node, context);\n\n case \"reference\":\n return this.evaluateReference(node, context);\n\n case \"named-expression\":\n return this.evaluateNamedExpression(node, context);\n\n case \"structured-reference\":\n return this.evaluateStructuredReference(node, context);\n\n case \"function\":\n return this.evaluateFunction(node, context);\n\n case \"range\":\n return this.evaluateRange(node, context);\n\n case \"unary-op\":\n return this.evaluateUnaryOp(node, context);\n\n case \"3d-range\":\n return this.evaluate3DRange(node, context);\n\n case \"array\":\n return this.evaluateArray(node, context);\n\n default:\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"WIP: unimplemented support for \" + node.type,\n errAddress: context.dependencyNode,\n };\n }\n }\n const newContext = new EvaluationContext(\n this.tableManager,\n astNode,\n context.cellAddress\n );\n const result = captureEvaluationErrors(astNode, () =>\n runEvaluation.call(this, newContext)\n );\n astNode.setEvaluationResult(result);\n const astContextDependency = newContext.getContextDependency();\n\n astNode.setContextDependency(astContextDependency);\n this.dependencyManager.registerNode(astNode);\n\n context.appendContextDependency(astContextDependency);\n\n return result;\n }\n\n evaluateStructuredReference(\n node: StructuredReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const resourceWorkbookName =\n node.workbookName ?? context.cellAddress.workbookName;\n if (node.tableName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getTableResourceKey({\n workbookName: resourceWorkbookName,\n tableName: node.tableName,\n })\n )\n );\n }\n\n // the tables are never dependent on the sheet, interesetingly enough\n let table: TableDefinition | undefined;\n if (node.tableName && node.workbookName) {\n // this expression will evaluate to the same value regardless of where in the workbooks we are evaluating it in\n table = this.tableManager\n .getTables(node.workbookName)\n .get(node.tableName);\n } else if (node.tableName) {\n // different workbooks could have different tables with the same name\n // so it can differ based on the workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n table = this.tableManager\n .getTables(context.cellAddress.workbookName)\n .get(node.tableName);\n } else {\n // If no table nor workbook name is provided, the current cell's table\n // membership determines the result.\n context.addContextDependency(\"workbook\", \"sheet\", \"table\");\n table = this.tableManager.isCellInTable(context.cellAddress);\n }\n\n if (node.isCurrentRow) {\n context.addContextDependency(\"row\");\n }\n\n if (!table) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Table ${node.tableName} not found`,\n errAddress: context.dependencyNode,\n };\n }\n\n const rowIndex = context.cellAddress.rowIndex;\n const tableStart = table.start;\n\n // Handle selector-based references\n if (node.selector) {\n let startRow: number;\n let endRow: SpreadsheetRangeEnd;\n\n switch (node.selector) {\n case \"#Headers\":\n startRow = table.start.rowIndex;\n endRow = { type: \"number\", value: table.start.rowIndex };\n break;\n case \"#Data\":\n startRow = table.start.rowIndex + 1;\n endRow = table.endRow;\n break;\n case \"#All\":\n startRow = table.start.rowIndex;\n endRow = table.endRow;\n break;\n default:\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Unknown table selector: ${node.selector}`,\n errAddress: context.dependencyNode,\n };\n }\n\n // If we also have column specification, use those columns\n if (node.cols) {\n const startCol = table.headers.get(node.cols.startCol);\n const endCol = table.headers.get(node.cols.endCol);\n if (!startCol || !endCol) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Column ${node.cols.startCol} or ${node.cols.endCol} not found in table ${table.name}`,\n errAddress: context.dependencyNode,\n };\n }\n const startColIndex = tableStart.colIndex + startCol.index;\n const endColIndex = tableStart.colIndex + endCol.index;\n\n const range: SpreadsheetRange = {\n start: {\n row: startRow,\n col: startColIndex,\n },\n end: {\n row: endRow,\n col: { type: \"number\", value: endColIndex },\n },\n };\n\n return this.evaluateRange(\n {\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n },\n context\n );\n } else {\n // No column specification, return entire row(s) for the selector\n const range: SpreadsheetRange = {\n start: {\n row: startRow,\n col: tableStart.colIndex,\n },\n end: {\n row: endRow,\n col: {\n type: \"number\",\n value: tableStart.colIndex + table.headers.size - 1,\n },\n },\n };\n\n return this.evaluateRange(\n {\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n },\n context\n );\n }\n }\n\n // Handle column-only references (no selector)\n if (node.cols) {\n const startCol = table.headers.get(node.cols.startCol);\n const endCol = table.headers.get(node.cols.endCol);\n if (!startCol || !endCol) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Column ${node.cols.startCol} or ${node.cols.endCol} not found in table ${table.name}`,\n errAddress: context.dependencyNode,\n };\n }\n const startColIndex = tableStart.colIndex + startCol.index;\n const endColIndex = tableStart.colIndex + endCol.index;\n const range: SpreadsheetRange = {\n start: {\n row: node.isCurrentRow ? rowIndex : table.start.rowIndex + 1,\n col: startColIndex,\n },\n end: {\n row: node.isCurrentRow\n ? { type: \"number\", value: rowIndex }\n : table.endRow,\n col: { type: \"number\", value: endColIndex },\n },\n };\n\n return this.evaluateRange(\n {\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n },\n context\n );\n }\n\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Structured reference must specify either a selector or columns\",\n errAddress: context.dependencyNode,\n };\n }\n\n /**\n * Evaluates a value node\n */\n evaluateValue(node: ValueNode): CellValue {\n return node.value;\n }\n\n evaluate3DRange(\n node: ThreeDRangeNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n throw new Error(\"WIP: 3d range is not implemented\");\n /*\n const startSheet = this.sheets.get(node.startSheet);\n const endSheet = this.sheets.get(node.endSheet);\n if (!startSheet || !endSheet) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Sheet ${node.startSheet} or ${node.endSheet} not found`,\n };\n }\n\n let numCols = 0;\n let numRows = 0;\n for (let i = startSheet.index; i <= endSheet.index; i++) {\n if (node.reference.type === \"reference\") {\n numCols += 1;\n } else {\n numCols += node.reference.range.end.col.value - node.reference.range.start.col.value + 1;\n }\n\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Sheet ${i} not found`,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => ({\n start: {\n col: origin.colIndex,\n row: origin.rowIndex,\n },\n end: {\n col: { type: \"number\", value: origin.colIndex },\n row: {\n type: \"number\",\n value: origin.rowIndex + numSheets - 1,\n },\n },\n }),\n source: `range`,\n originResult:\n originResult.type === \"value\"\n ? originResult.result\n : originResult.originResult,\n evaluate: (spilledCell, context) => {\n const colIndex = range.start.col + spilledCell.spillOffset.x;\n const rowIndex = range.start.row + spilledCell.spillOffset.y;\n const sheetName = node.sheetName ?? context.currentSheet;\n return this.evalTimeSafeEvaluateCell(\n {\n colIndex,\n rowIndex,\n sheetName,\n },\n context\n );\n },\n };\n */\n }\n\n evaluateRange(\n node: RangeNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n if (isRangeOneCell(node.range)) {\n return this.evaluateReference(\n {\n type: \"reference\",\n address: {\n colIndex: node.range.start.col,\n rowIndex: node.range.start.row,\n },\n isAbsolute: {\n col: node.isAbsolute.start.col || node.isAbsolute.end.col,\n row: node.isAbsolute.start.row || node.isAbsolute.end.row,\n },\n sheetName: node.sheetName,\n },\n context\n );\n }\n\n const debugRange = getRangeKey(node.range);\n\n const rangeAddress: RangeAddress = {\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n range: node.range,\n };\n\n if (node.workbookName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getWorkbookResourceKey(node.workbookName)\n )\n );\n }\n if (node.sheetName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getSheetResourceKey({\n workbookName: rangeAddress.workbookName,\n sheetName: node.sheetName,\n })\n )\n );\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin) => this.projectRange(node.range, origin),\n source: `range ${debugRange}`,\n sourceRange: rangeAddress,\n evaluate: (spillOffset, context) => {\n if (!node.sheetName && !node.workbookName) {\n // e.g. the result from A4:A9 will depend in which sheet and workbook we are evaluating it in\n context.addContextDependency(\"workbook\", \"sheet\");\n } else if (!node.sheetName) {\n // e.g. the result from [Workbook1]A4:A9 will depend in which sheet we are evaluating it in\n context.addContextDependency(\"sheet\");\n } else if (!node.workbookName) {\n // e.g. the result from Sheet1!A4:A9 will depend in which workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n } else {\n // if we have both sheetName and workbookName, we don't need to add any context dependencies\n }\n\n const originSheetName = node.sheetName ?? context.cellAddress.sheetName;\n const originWorkbookName =\n node.workbookName ?? context.cellAddress.workbookName;\n const colIndex = node.range.start.col + spillOffset.x;\n const rowIndex = node.range.start.row + spillOffset.y;\n\n const cellAddress: CellAddress = {\n colIndex,\n rowIndex,\n sheetName: originSheetName,\n workbookName: originWorkbookName,\n };\n\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(\n cellAddressToKey(cellAddress)\n );\n context.dependencyNode.addDependency(evalNode);\n\n const result = evalNode.evaluationResult;\n\n return result;\n },\n evaluateAllCells: function ({\n evaluate,\n intersection,\n context,\n origin,\n lookupOrder,\n }) {\n let range = node.range;\n if (intersection) {\n // When we have an intersection, it's defined relative to where the spilled range\n // will appear (the origin). However, we need to evaluate cells from the source\n // range (node.range). So we must translate the intersection coordinates back\n // to the source range's coordinate system.\n //\n // Example: If source range A1:C3 spills to D5:F7, and we want intersection E6:F7,\n // we need to translate E6:F7 (relative to D5) to B2:C3 (relative to A1).\n\n // Calculate the offset of the intersection from the spill origin\n const relativeRange = getRelativeRange(intersection, origin);\n const start: LocalCellAddress = {\n colIndex: node.range.start.col,\n rowIndex: node.range.start.row,\n };\n const projectedIntersection = getAbsoluteRange(relativeRange, start);\n const calculateIntersection = getRangeIntersection(\n node.range,\n projectedIntersection\n );\n if (calculateIntersection) {\n range = calculateIntersection;\n }\n }\n\n const address: RangeAddress = {\n range,\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n };\n\n const rangeNode = this.dependencyManager.getRangeNode(\n rangeAddressToKey(address)\n );\n\n context.dependencyNode.addDependency(rangeNode);\n\n return this.dependencyManager.getRangeNode(rangeAddressToKey(address))\n .result;\n },\n };\n }\n\n evaluateArray(\n node: ArrayNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const firstRow = node.elements[0];\n if (!firstRow) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const firstCell = firstRow[0];\n if (!firstCell) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const originResult = this.evaluateNode(firstCell, context);\n if (\n originResult.type === \"error\" ||\n originResult.type === \"awaiting-evaluation\"\n ) {\n return originResult;\n }\n return {\n type: \"spilled-values\",\n spillArea: (origin) => ({\n start: {\n col: origin.colIndex,\n row: origin.rowIndex,\n },\n end: {\n col: {\n type: \"number\",\n value: origin.colIndex + firstRow.length - 1,\n },\n row: {\n type: \"number\",\n value: origin.rowIndex + node.elements.length - 1,\n },\n },\n }),\n source: `array`,\n evaluate: (spillOffset, context) => {\n const row = node.elements[spillOffset.y];\n if (!row) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const cell = row[spillOffset.x];\n if (!cell) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const result = this.evaluateNode(cell, context);\n if (result.type === \"spilled-values\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Arrays cannot contain spilled values\",\n errAddress: context.dependencyNode,\n };\n }\n return result;\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for array is not implemented\");\n },\n };\n }\n\n /**\n * Evaluates a unary operation\n */\n evaluateUnaryOp(\n node: UnaryOpNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const operandResult = this.evaluateNode(node.operand, context);\n\n if (\n operandResult.type === \"error\" ||\n operandResult.type === \"awaiting-evaluation\"\n ) {\n return operandResult;\n }\n\n if (operandResult.type === \"spilled-values\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin) => operandResult.spillArea(origin),\n source: `unary ${node.operator} operation`,\n evaluate: (spilledCell, context) => {\n const spillResult = operandResult.evaluate(spilledCell, context);\n if (\n !spillResult ||\n spillResult.type === \"error\" ||\n spillResult.type === \"awaiting-evaluation\"\n ) {\n return spillResult;\n }\n if (spillResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid spilled result for unary operation\",\n errAddress: context.dependencyNode,\n };\n }\n return this.evaluateUnaryScalar(\n node.operator,\n spillResult.result,\n context\n );\n },\n evaluateAllCells: function (options) {\n const cellValues = operandResult.evaluateAllCells.call(this, options);\n if (cellValues.type !== \"values\") {\n return cellValues;\n }\n return {\n type: \"values\",\n values: cellValues.values.map((cellValue) => {\n if (\n cellValue.result.type === \"error\" ||\n cellValue.result.type === \"awaiting-evaluation\"\n ) {\n return cellValue;\n } else {\n return {\n result: this.evaluateUnaryScalar(\n node.operator,\n cellValue.result.result,\n context\n ),\n relativePos: cellValue.relativePos,\n };\n }\n }),\n };\n },\n };\n }\n\n if (operandResult.type === \"value\") {\n return this.evaluateUnaryScalar(\n node.operator,\n operandResult.result,\n context\n );\n }\n\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid operand for unary operation\",\n errAddress: context.dependencyNode,\n };\n }\n\n /**\n * Evaluates a unary scalar operation\n */\n private evaluateUnaryScalar(\n operator: \"+\" | \"-\" | \"%\",\n operand: CellValue,\n context: EvaluationContext\n ): SingleEvaluationResult {\n if (operand.type !== \"number\" && operand.type !== \"infinity\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Cannot apply unary ${operator} to non-number`,\n errAddress: context.dependencyNode,\n };\n }\n if (operand.type === \"infinity\") {\n if (operator === \"%\") {\n return {\n type: \"error\",\n err: FormulaError.NUM,\n message: \"Cannot apply % to infinity\",\n errAddress: context.dependencyNode,\n };\n }\n return {\n type: \"value\",\n result: {\n type: \"infinity\",\n sign: operator === \"+\" ? \"positive\" : \"negative\",\n },\n };\n }\n switch (operator) {\n case \"+\":\n return { type: \"value\", result: operand };\n\n case \"-\":\n return {\n type: \"value\",\n result: {\n type: \"number\",\n value: -operand.value,\n },\n };\n\n case \"%\":\n return {\n type: \"value\",\n result: { type: \"number\", value: operand.value / 100 },\n };\n\n default:\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Unknown unary operator: ${operator}`,\n errAddress: context.dependencyNode,\n };\n }\n }\n\n /**\n * Evaluates a binary operation\n */\n evaluateBinaryOp(\n node: BinaryOpNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const left = this.evaluateNode(node.left, context);\n const right = this.evaluateNode(node.right, context);\n\n if (left.type === \"error\" || left.type === \"awaiting-evaluation\") {\n return left;\n }\n if (right.type === \"error\" || right.type === \"awaiting-evaluation\") {\n return right;\n }\n\n // Scalar operation\n return this.evaluateBinaryScalar(node.operator, left, right, context);\n }\n\n /**\n * Evaluates a reference node\n */\n evaluateReference(\n node: ReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const cellAddress: CellAddress = {\n ...node.address,\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n };\n\n if (node.workbookName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getWorkbookResourceKey(node.workbookName)\n )\n );\n }\n if (node.sheetName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getSheetResourceKey({\n workbookName: cellAddress.workbookName,\n sheetName: node.sheetName,\n })\n )\n );\n }\n\n const key = cellAddressToKey(cellAddress);\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(key);\n context.dependencyNode.addDependency(evalNode);\n\n if (!node.sheetName && !node.workbookName) {\n // e.g. the result from A4:A9 will depend in which sheet and workbook we are evaluating it in\n context.addContextDependency(\"workbook\", \"sheet\");\n } else if (!node.sheetName) {\n // e.g. the result from [Workbook1]A4:A9 will depend in which sheet we are evaluating it in\n context.addContextDependency(\"sheet\");\n } else if (!node.workbookName) {\n // e.g. the result from Sheet1!A4:A9 will depend in which workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n } else {\n // if we have both sheetName and workbookName, we don't need to add any context dependencies\n }\n\n if (evalNode instanceof CellValueNode && evalNode.spillMeta) {\n if (evalNode.spillMeta.evaluationResult.type === \"spilled-values\") {\n return {\n ...evalNode.spillMeta.evaluationResult,\n sourceCell: cellAddress,\n sourceRange: undefined,\n };\n }\n }\n\n return { ...evalNode.evaluationResult, sourceCell: cellAddress };\n }\n\n /**\n * Evaluates a named expression node\n */\n evaluateNamedExpression(\n node: NamedExpressionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const resolvedExpression =\n this.namedExpressionManager.resolveNamedExpressionWithScope(\n node,\n context\n );\n\n if (!resolvedExpression) {\n return {\n type: \"error\",\n err: FormulaError.NAME,\n message: `Named expression ${node.name} not found`,\n errAddress: context.dependencyNode,\n };\n }\n\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getNamedExpressionResourceKey({\n expressionName: node.name,\n workbookName:\n resolvedExpression.scope.type === \"global\"\n ? undefined\n : resolvedExpression.scope.workbookName,\n sheetName:\n resolvedExpression.scope.type === \"sheet\"\n ? resolvedExpression.scope.sheetName\n : undefined,\n })\n )\n );\n\n return this.evaluateFormula(resolvedExpression.expression, context);\n }\n\n /**\n * Binary scalar operations\n */\n evaluateBinaryScalar(\n operator: string,\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n switch (operator) {\n case \"+\":\n return this.add(left, right, context);\n case \"-\":\n return this.subtract(left, right, context);\n case \"*\":\n return this.multiply(left, right, context);\n case \"/\":\n return this.divide(left, right, context);\n case \"^\":\n return this.power(left, right, context);\n\n case \"&\":\n return this.concatenateOp(left, right, context);\n case \"=\":\n return this.equalsOp(left, right, context);\n case \"<>\":\n return this.notEqualsOp(left, right, context);\n case \"<\":\n return this.lessThanOp(left, right, context);\n case \"<=\":\n return this.lessThanOrEqualOp(left, right, context);\n case \">\":\n return this.greaterThanOp(left, right, context);\n case \">=\":\n return this.greaterThanOrEqualOp(left, right, context);\n default:\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: `Unknown binary operator: ${operator}`,\n errAddress: context.dependencyNode,\n };\n }\n }\n\n evaluateFunction(\n node: FunctionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const func = functions[node.name];\n if (!func) {\n return {\n type: \"error\",\n err: FormulaError.NAME,\n message: `Function ${node.name} not found`,\n errAddress: context.dependencyNode,\n };\n }\n return func.evaluate.call(this, node, context);\n }\n\n // Arithmetic operations\n add(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: add,\n context,\n name: \"add\",\n });\n }\n\n multiply(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: multiply,\n context,\n name: \"multiply\",\n });\n }\n\n divide(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: divide,\n context,\n name: \"divide\",\n });\n }\n\n evaluateScalarOperator(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n options: EvaluateScalarOperatorOptions\n ): FunctionEvaluationResult {\n return evaluateScalarOperator.call(this, left, right, options);\n }\n\n subtract(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: subtract,\n context,\n name: \"subtract\",\n });\n }\n\n power(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: power,\n context,\n name: \"power\",\n });\n }\n\n // Comparison operations\n equalsOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: equals,\n context,\n name: \"equals\",\n });\n }\n\n notEqualsOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: notEquals,\n context,\n name: \"notEquals\",\n });\n }\n\n lessThanOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: lessThan,\n context,\n name: \"lessThan\",\n });\n }\n\n lessThanOrEqualOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: lessThanOrEqual,\n context,\n name: \"lessThanOrEqual\",\n });\n }\n\n greaterThanOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: greaterThan,\n context,\n name: \"greaterThan\",\n });\n }\n\n greaterThanOrEqualOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: greaterThanOrEqual,\n context,\n name: \"greaterThanOrEqual\",\n });\n }\n\n // Concatenation operation\n concatenateOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: concatenate,\n context,\n name: \"concatenate\",\n });\n }\n\n projectRange(\n range: SpreadsheetRange,\n originCellAddress: CellAddress\n ): SpreadsheetRange {\n const offsetLeft = originCellAddress.colIndex - range.start.col;\n const offsetTop = originCellAddress.rowIndex - range.start.row;\n return {\n start: {\n col: range.start.col + offsetLeft,\n row: range.start.row + offsetTop,\n },\n end: {\n col:\n range.end.col.type === \"number\"\n ? { type: \"number\", value: range.end.col.value + offsetLeft }\n : range.end.col,\n row:\n range.end.row.type === \"number\"\n ? { type: \"number\", value: range.end.row.value + offsetTop }\n : range.end.row,\n },\n };\n }\n\n unionRanges(\n range1: SpreadsheetRange,\n range2: SpreadsheetRange\n ): SpreadsheetRange {\n const endCol = ((): SpreadsheetRangeEnd => {\n if (\n range1.end.col.type === \"infinity\" ||\n range2.end.col.type === \"infinity\"\n ) {\n return { type: \"infinity\", sign: \"positive\" };\n }\n return {\n type: \"number\",\n value: Math.max(range1.end.col.value, range2.end.col.value),\n };\n })();\n\n const endRow = ((): SpreadsheetRangeEnd => {\n if (\n range1.end.row.type === \"infinity\" ||\n range2.end.row.type === \"infinity\"\n ) {\n return { type: \"infinity\", sign: \"positive\" };\n }\n return {\n type: \"number\",\n value: Math.max(range1.end.row.value, range2.end.row.value),\n };\n })();\n\n return {\n start: {\n col: Math.min(range1.start.col, range2.start.col),\n row: Math.min(range1.start.row, range2.start.row),\n },\n end: {\n col: endCol,\n row: endRow,\n },\n };\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "A2D09ED3DA1B826064756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "B36B15FC774F83C164756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/formula-engine",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "type": "commonjs"
5
5
  }
@@ -1,5 +1,5 @@
1
1
  // src/core/engine-snapshot.ts
2
- var ENGINE_SNAPSHOT_VERSION = 3;
2
+ var ENGINE_SNAPSHOT_VERSION = 4;
3
3
  function getAstNodeSnapshotId(node) {
4
4
  return `${node.key}::${JSON.stringify(node.getContextDependency())}`;
5
5
  }
@@ -8,4 +8,4 @@ export {
8
8
  ENGINE_SNAPSHOT_VERSION
9
9
  };
10
10
 
11
- //# debugId=73CCFF3C522568BD64756E2164756E21
11
+ //# debugId=CE5DBCDE2F63792D64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/engine-snapshot.ts"],
4
4
  "sourcesContent": [
5
- "import type { ContextDependency } from \"../evaluator/evaluation-context.mjs\";\nimport type { DependencyNode } from \"./managers/dependency-node.mjs\";\nimport type {\n CellAddress,\n CellInRangeResult,\n CellValue,\n ConditionalStyle,\n DirectCellStyle,\n FormulaError,\n NamedExpression,\n RangeAddress,\n RelativeRange,\n SpreadsheetRange,\n TableDefinition,\n TrackedReference,\n Workbook,\n} from \"./types.mjs\";\n\nexport const ENGINE_SNAPSHOT_VERSION = 3 as const;\n\nexport type NodeSnapshotId = string;\n\nexport type NamedExpressionManagerSnapshot = {\n sheetExpressions: Map<string, Map<string, Map<string, NamedExpression>>>;\n workbookExpressions: Map<string, Map<string, NamedExpression>>;\n globalExpressions: Map<string, NamedExpression>;\n};\n\nexport type WorkbookManagerSnapshot = Map<string, Workbook>;\n\nexport type TableManagerSnapshot = Map<string, Map<string, TableDefinition>>;\n\nexport type StyleManagerSnapshot = {\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n};\n\nexport type ReferenceManagerSnapshot = Map<string, TrackedReference>;\n\nexport type SerializedValueEvaluationResultSnapshot = {\n type: \"value\";\n result: CellValue;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedErrorEvaluationResultSnapshot = {\n type: \"error\";\n err: FormulaError;\n message: string;\n errAddressId: NodeSnapshotId;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedSingleEvaluationResultSnapshot =\n | SerializedValueEvaluationResultSnapshot\n | SerializedErrorEvaluationResultSnapshot;\n\nexport type SerializedCellInRangeResultSnapshot = {\n relativePos: CellInRangeResult[\"relativePos\"];\n result: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedEvaluateAllCellsResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | {\n type: \"values\";\n values: SerializedCellInRangeResultSnapshot[];\n };\n\nexport type SerializedMaterializedSpillSnapshot = {\n kind: \"materialized\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange?: RangeAddress;\n values: SerializedCellInRangeResultSnapshot[];\n};\n\nexport type SerializedSourceRangeSpillSnapshot = {\n kind: \"source-range\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange: RangeAddress;\n};\n\nexport type SerializedSpillResultSnapshot =\n | SerializedMaterializedSpillSnapshot\n | SerializedSourceRangeSpillSnapshot;\n\nexport type SerializedSpilledValuesEvaluationResultSnapshot = {\n type: \"spilled-values\";\n spill: SerializedSpillResultSnapshot;\n};\n\nexport type SerializedFunctionEvaluationResultSnapshot =\n | SerializedSingleEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot;\n\nexport type SerializedSpillMetaEvaluationResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot\n | {\n type: \"does-not-spill\";\n };\n\ntype SerializedBaseNodeSnapshot = {\n snapshotId: NodeSnapshotId;\n key: string;\n dependencies: NodeSnapshotId[];\n};\n\nexport type SerializedCellValueNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"cell-value\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n spillMetaSnapshotId?: NodeSnapshotId;\n};\n\nexport type SerializedSpillMetaNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"spill-meta\";\n evaluationResult: SerializedSpillMetaEvaluationResultSnapshot;\n};\n\nexport type SerializedEmptyCellNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"empty\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedRangeNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"range\";\n result: SerializedEvaluateAllCellsResultSnapshot;\n};\n\nexport type SerializedAstNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"ast\";\n contextDependency: ContextDependency;\n evaluationResult: SerializedFunctionEvaluationResultSnapshot;\n};\n\nexport type SerializedResourceNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"resource\";\n};\n\nexport type SerializedDependencyNodeSnapshot =\n | SerializedCellValueNodeSnapshot\n | SerializedSpillMetaNodeSnapshot\n | SerializedEmptyCellNodeSnapshot\n | SerializedRangeNodeSnapshot\n | SerializedAstNodeSnapshot\n | SerializedResourceNodeSnapshot;\n\nexport type DependencyManagerSnapshot = {\n nodes: SerializedDependencyNodeSnapshot[];\n spilledValues: Array<[string, { origin: CellAddress; spillOnto: SpreadsheetRange }]>;\n};\n\nexport type SerializedSCCSnapshot = {\n id: number;\n nodes: NodeSnapshotId[];\n evaluationOrder: NodeSnapshotId[];\n resolved: boolean;\n hardEdgeSCCs: NodeSnapshotId[][];\n};\n\nexport type SerializedEvaluationOrderSnapshot = {\n nodeKey: string;\n evaluationOrder: NodeSnapshotId[];\n hasCycle: boolean;\n cycleNodes?: NodeSnapshotId[];\n hash: string;\n};\n\nexport type CacheManagerSnapshot = {\n evaluationOrders: SerializedEvaluationOrderSnapshot[];\n sccs: Array<{\n hash: string;\n scc: SerializedSCCSnapshot;\n }>;\n};\n\nexport type EngineSnapshotV3 = {\n version: typeof ENGINE_SNAPSHOT_VERSION;\n managers: {\n workbook: WorkbookManagerSnapshot;\n namedExpression: NamedExpressionManagerSnapshot;\n table: TableManagerSnapshot;\n style: StyleManagerSnapshot;\n reference: ReferenceManagerSnapshot;\n dependency: DependencyManagerSnapshot;\n cache: CacheManagerSnapshot;\n };\n};\n\nexport type EngineSnapshotV2 = EngineSnapshotV3;\n\nexport function getAstNodeSnapshotId(\n node: DependencyNode & { getContextDependency(): ContextDependency }\n): NodeSnapshotId {\n return `${node.key}::${JSON.stringify(node.getContextDependency())}`;\n}\n"
5
+ "import type { ContextDependency } from \"../evaluator/evaluation-context.mjs\";\nimport type { DependencyNode } from \"./managers/dependency-node.mjs\";\nimport type {\n CellAddress,\n CellInRangeResult,\n CellValue,\n ConditionalStyle,\n DirectCellStyle,\n FormulaError,\n NamedExpression,\n RangeAddress,\n RelativeRange,\n SpreadsheetRange,\n TableDefinition,\n TrackedReference,\n Workbook,\n} from \"./types.mjs\";\n\nexport const ENGINE_SNAPSHOT_VERSION = 4 as const;\n\nexport type NodeSnapshotId = string;\n\nexport type NamedExpressionManagerSnapshot = {\n sheetExpressions: Map<string, Map<string, Map<string, NamedExpression>>>;\n workbookExpressions: Map<string, Map<string, NamedExpression>>;\n globalExpressions: Map<string, NamedExpression>;\n};\n\nexport type WorkbookManagerSnapshot = Map<string, Workbook>;\n\nexport type TableManagerSnapshot = Map<string, Map<string, TableDefinition>>;\n\nexport type StyleManagerSnapshot = {\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n};\n\nexport type ReferenceManagerSnapshot = Map<string, TrackedReference>;\n\nexport type SerializedValueEvaluationResultSnapshot = {\n type: \"value\";\n result: CellValue;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedErrorEvaluationResultSnapshot = {\n type: \"error\";\n err: FormulaError;\n message: string;\n errAddressId: NodeSnapshotId;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedSingleEvaluationResultSnapshot =\n | SerializedValueEvaluationResultSnapshot\n | SerializedErrorEvaluationResultSnapshot;\n\nexport type SerializedCellInRangeResultSnapshot = {\n relativePos: CellInRangeResult[\"relativePos\"];\n result: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedEvaluateAllCellsResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | {\n type: \"values\";\n values: SerializedCellInRangeResultSnapshot[];\n };\n\nexport type SerializedMaterializedSpillSnapshot = {\n kind: \"materialized\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange?: RangeAddress;\n values: SerializedCellInRangeResultSnapshot[];\n};\n\nexport type SerializedSourceRangeSpillSnapshot = {\n kind: \"source-range\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange: RangeAddress;\n};\n\nexport type SerializedSpillResultSnapshot =\n | SerializedMaterializedSpillSnapshot\n | SerializedSourceRangeSpillSnapshot;\n\nexport type SerializedSpilledValuesEvaluationResultSnapshot = {\n type: \"spilled-values\";\n spill: SerializedSpillResultSnapshot;\n};\n\nexport type SerializedFunctionEvaluationResultSnapshot =\n | SerializedSingleEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot;\n\nexport type SerializedSpillMetaEvaluationResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot\n | {\n type: \"does-not-spill\";\n };\n\ntype SerializedBaseNodeSnapshot = {\n snapshotId: NodeSnapshotId;\n key: string;\n dependencies: NodeSnapshotId[];\n};\n\nexport type SerializedCellValueNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"cell-value\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n spillMetaSnapshotId?: NodeSnapshotId;\n};\n\nexport type SerializedSpillMetaNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"spill-meta\";\n evaluationResult: SerializedSpillMetaEvaluationResultSnapshot;\n};\n\nexport type SerializedEmptyCellNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"empty\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedRangeNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"range\";\n result: SerializedEvaluateAllCellsResultSnapshot;\n};\n\nexport type SerializedAstNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"ast\";\n contextDependency: ContextDependency;\n evaluationResult: SerializedFunctionEvaluationResultSnapshot;\n};\n\nexport type SerializedResourceNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"resource\";\n};\n\nexport type SerializedDependencyNodeSnapshot =\n | SerializedCellValueNodeSnapshot\n | SerializedSpillMetaNodeSnapshot\n | SerializedEmptyCellNodeSnapshot\n | SerializedRangeNodeSnapshot\n | SerializedAstNodeSnapshot\n | SerializedResourceNodeSnapshot;\n\nexport type DependencyManagerSnapshot = {\n nodes: SerializedDependencyNodeSnapshot[];\n spilledValues: Array<[string, { origin: CellAddress; spillOnto: SpreadsheetRange }]>;\n};\n\nexport type SerializedSCCSnapshot = {\n id: number;\n nodes: NodeSnapshotId[];\n evaluationOrder: NodeSnapshotId[];\n resolved: boolean;\n hardEdgeSCCs: NodeSnapshotId[][];\n};\n\nexport type SerializedEvaluationOrderSnapshot = {\n nodeKey: string;\n evaluationOrder: NodeSnapshotId[];\n hasCycle: boolean;\n cycleNodes?: NodeSnapshotId[];\n hash: string;\n};\n\nexport type CacheManagerSnapshot = {\n evaluationOrders: SerializedEvaluationOrderSnapshot[];\n sccs: Array<{\n hash: string;\n scc: SerializedSCCSnapshot;\n }>;\n};\n\ntype EngineSnapshotManagers = {\n workbook: WorkbookManagerSnapshot;\n namedExpression: NamedExpressionManagerSnapshot;\n table: TableManagerSnapshot;\n style: StyleManagerSnapshot;\n reference: ReferenceManagerSnapshot;\n dependency: DependencyManagerSnapshot;\n cache: CacheManagerSnapshot;\n};\n\nexport type EngineSnapshot = {\n version: typeof ENGINE_SNAPSHOT_VERSION;\n managers: EngineSnapshotManagers;\n};\n\nexport function getAstNodeSnapshotId(\n node: DependencyNode & { getContextDependency(): ContextDependency }\n): NodeSnapshotId {\n return `${node.key}::${JSON.stringify(node.getContextDependency())}`;\n}\n"
6
6
  ],
7
7
  "mappings": ";AAkBO,IAAM,0BAA0B;AAiLhC,SAAS,oBAAoB,CAClC,MACgB;AAAA,EAChB,OAAO,GAAG,KAAK,QAAQ,KAAK,UAAU,KAAK,qBAAqB,CAAC;AAAA;",
8
- "debugId": "73CCFF3C522568BD64756E2164756E21",
8
+ "debugId": "CE5DBCDE2F63792D64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -517,8 +517,8 @@ class FormulaEngine {
517
517
  }
518
518
  resetToSerializedEngine(data) {
519
519
  const deserialized = deserialize(data);
520
- if (!deserialized || typeof deserialized !== "object" || deserialized.version !== ENGINE_SNAPSHOT_VERSION || !deserialized.managers) {
521
- throw new Error("Unsupported serialized engine format. Expected EngineSnapshot version 3.");
520
+ if (!deserialized || typeof deserialized !== "object" || !("version" in deserialized) || deserialized.version !== ENGINE_SNAPSHOT_VERSION || !deserialized.managers) {
521
+ throw new Error(`Unsupported serialized engine format. Expected EngineSnapshot version ${ENGINE_SNAPSHOT_VERSION}.`);
522
522
  }
523
523
  this.workbookManager.restoreFromSnapshot(deserialized.managers.workbook);
524
524
  deserialized.managers.workbook.forEach((workbook) => {
@@ -597,4 +597,4 @@ export {
597
597
  FormulaEngine
598
598
  };
599
599
 
600
- //# debugId=409380DB7CA67E5264756E2164756E21
600
+ //# debugId=140E8246E7C976AF64756E2164756E21