@ricsam/formula-engine 0.2.6 → 0.2.8

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.
@@ -464,6 +464,12 @@ class EvaluationManager {
464
464
  if (node.resolved) {
465
465
  return;
466
466
  }
467
+ const finalizePersistentNode = () => {
468
+ if (node instanceof import_virtual_cell_value_node.VirtualCellValueNode) {
469
+ return;
470
+ }
471
+ this.dependencyManager.registerNode(node);
472
+ };
467
473
  if (!(node instanceof import_virtual_cell_value_node.VirtualCellValueNode)) {
468
474
  this.dependencyManager.unregisterNode(node);
469
475
  }
@@ -474,7 +480,7 @@ class EvaluationManager {
474
480
  if (spillOrigin.evaluationResult.type === "spilled-values") {
475
481
  const result = spillOrigin.evaluationResult.evaluate({ x: 0, y: 0 }, ctx);
476
482
  node.setEvaluationResult(result);
477
- this.dependencyManager.registerNode(node);
483
+ finalizePersistentNode();
478
484
  return;
479
485
  }
480
486
  }
@@ -503,7 +509,7 @@ class EvaluationManager {
503
509
  node.setEvaluationResult({
504
510
  type: "does-not-spill"
505
511
  });
506
- this.dependencyManager.registerNode(node);
512
+ finalizePersistentNode();
507
513
  return;
508
514
  }
509
515
  const result = {
@@ -511,9 +517,7 @@ class EvaluationManager {
511
517
  result: this.convertScalarValueToCellValue(content)
512
518
  };
513
519
  node.setEvaluationResult(result);
514
- if (!(node instanceof import_virtual_cell_value_node.VirtualCellValueNode)) {
515
- this.dependencyManager.registerNode(node);
516
- }
520
+ finalizePersistentNode();
517
521
  return;
518
522
  }
519
523
  let evaluation = import_utils.captureEvaluationErrors(node, () => this.formulaEvaluator.evaluateFormula(content.slice(1), ctx));
@@ -534,7 +538,7 @@ class EvaluationManager {
534
538
  }
535
539
  if (node instanceof import_spill_meta_node.SpillMetaNode) {
536
540
  node.setEvaluationResult(evaluation);
537
- this.dependencyManager.registerNode(node);
541
+ finalizePersistentNode();
538
542
  } else {
539
543
  const spillMetaNode = this.dependencyManager.getSpillMetaNode(node.key.replace(/^[^:]+:/, "spill-meta:"));
540
544
  node.addDependency(spillMetaNode);
@@ -548,9 +552,7 @@ class EvaluationManager {
548
552
  node.setEvaluationResult(evaluation);
549
553
  }
550
554
  }
551
- if (!(node instanceof import_virtual_cell_value_node.VirtualCellValueNode)) {
552
- this.dependencyManager.registerNode(node);
553
- }
555
+ finalizePersistentNode();
554
556
  return;
555
557
  }
556
558
  if (evaluation.type === "value") {
@@ -558,20 +560,16 @@ class EvaluationManager {
558
560
  node.setEvaluationResult({
559
561
  type: "does-not-spill"
560
562
  });
561
- this.dependencyManager.registerNode(node);
563
+ finalizePersistentNode();
562
564
  return;
563
565
  } else {
564
566
  node.setEvaluationResult(evaluation);
565
- if (!(node instanceof import_virtual_cell_value_node.VirtualCellValueNode)) {
566
- this.dependencyManager.registerNode(node);
567
- }
567
+ finalizePersistentNode();
568
568
  return;
569
569
  }
570
570
  }
571
571
  node.setEvaluationResult(evaluation);
572
- if (!(node instanceof import_virtual_cell_value_node.VirtualCellValueNode)) {
573
- this.dependencyManager.registerNode(node);
574
- }
572
+ finalizePersistentNode();
575
573
  }
576
574
  evaluateDependencyNode(dependency) {
577
575
  if (dependency instanceof import_empty_cell_evaluation_node.EmptyCellEvaluationNode) {
@@ -749,4 +747,4 @@ class EvaluationManager {
749
747
  }
750
748
  }
751
749
 
752
- //# debugId=7E0EFD821724911064756E2164756E21
750
+ //# debugId=82AA595E9C9D067964756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/core/managers/evaluation-manager.ts"],
4
4
  "sourcesContent": [
5
- "import { flags } from \"../../debug/flags.cjs\";\nimport { AstEvaluationNode } from \"../../evaluator/dependency-nodes/ast-evaluation-node.cjs\";\nimport { CellValueNode } from \"../../evaluator/dependency-nodes/cell-value-node.cjs\";\nimport { EvaluationContext } from \"../../evaluator/evaluation-context.cjs\";\nimport {\n EvaluationError,\n SheetNotFoundError,\n} from \"../../evaluator/evaluation-error.cjs\";\nimport { RangeEvaluationNode } from \"../../evaluator/range-evaluation-node.cjs\";\nimport { normalizeSerializedCellValue } from \"../../parser/formatter.cjs\";\nimport { FormulaEvaluator } from \"../../evaluator/formula-evaluator.cjs\";\nimport {\n FormulaError,\n type CellAddress,\n type CellInRangeResult,\n type CellValue,\n type ErrorEvaluationResult,\n type EvaluateAllCellsResult,\n type EvaluationOrder,\n type FunctionEvaluationResult,\n type SerializedCellValue,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type ValueEvaluationResult,\n} from \"../types.cjs\";\nimport {\n captureEvaluationErrors,\n getAbsoluteRange,\n cellAddressToKey,\n checkRangeIntersection,\n getCellReference,\n getRangeIntersection,\n getRelativeRange,\n isCellInRange,\n parseCellReference,\n rangeAddressToKey,\n} from \"../utils.cjs\";\nimport type { DependencyManager } from \"./dependency-manager.cjs\";\nimport type { WorkbookManager } from \"./workbook-manager.cjs\";\nimport { SpillMetaNode } from \"../../evaluator/dependency-nodes/spill-meta-node.cjs\";\nimport { EmptyCellEvaluationNode } from \"../../evaluator/dependency-nodes/empty-cell-evaluation-node.cjs\";\nimport type { TableManager } from \"./table-manager.cjs\";\nimport type { DependencyNode } from \"./dependency-node.cjs\";\nimport { VirtualCellValueNode } from \"../../evaluator/dependency-nodes/virtual-cell-value-node.cjs\";\nimport { ResourceDependencyNode } from \"../../evaluator/dependency-nodes/resource-dependency-node.cjs\";\nimport type {\n NodeSnapshotId,\n SerializedCellInRangeResultSnapshot,\n SerializedErrorEvaluationResultSnapshot,\n SerializedEvaluateAllCellsResultSnapshot,\n SerializedFunctionEvaluationResultSnapshot,\n SerializedSingleEvaluationResultSnapshot,\n SerializedSpillMetaEvaluationResultSnapshot,\n SerializedSpilledValuesEvaluationResultSnapshot,\n} from \"../engine-snapshot.cjs\";\nimport type { MutationInvalidation } from \"../commands/types.cjs\";\n\nexport class EvaluationManager {\n private isEvaluating = false;\n\n constructor(\n private workbookManager: WorkbookManager,\n private tableManager: TableManager,\n private formulaEvaluator: FormulaEvaluator,\n private dependencyManager: DependencyManager\n ) {}\n\n clearEvaluationCache(): void {\n this.dependencyManager.clearEvaluationCache();\n }\n\n private dependsOnNode(\n candidate: DependencyNode,\n target: DependencyNode,\n visited: Set<DependencyNode> = new Set()\n ): boolean {\n if (candidate === target) {\n return true;\n }\n\n if (visited.has(candidate)) {\n return false;\n }\n visited.add(candidate);\n\n for (const dep of candidate.getDependencies()) {\n if (this.dependsOnNode(dep, target, visited)) {\n return true;\n }\n }\n\n return false;\n }\n\n invalidateFromMutation(footprint: MutationInvalidation): void {\n this.dependencyManager.invalidateFromMutation(footprint);\n }\n\n evaluationResultToSerializedValue(\n evaluation: SingleEvaluationResult,\n cellAddress: CellAddress,\n debug?: boolean\n ): SerializedCellValue {\n if (\n evaluation.type !== \"error\" &&\n evaluation.type !== \"awaiting-evaluation\"\n ) {\n const value = evaluation.result;\n\n return value.type === \"infinity\"\n ? value.sign === \"positive\"\n ? \"INFINITY\"\n : \"-INFINITY\"\n : value.value;\n }\n\n if (evaluation.type === \"awaiting-evaluation\") {\n return (\n evaluation.errAddress.key +\n \" is awaiting evaluation of \" +\n evaluation.waitingFor.key\n );\n }\n\n if (debug) {\n const errAddress = evaluation.errAddress.key;\n if (errAddress === cellAddressToKey(cellAddress)) {\n return evaluation.err + \" \" + evaluation.message;\n }\n return (\n evaluation.err +\n \" in \" +\n evaluation.errAddress.key +\n \" \" +\n evaluation.message\n );\n }\n\n return evaluation.err;\n }\n\n private buildSnapshotOrigin(\n node: CellValueNode | SpillMetaNode | AstEvaluationNode\n ): CellAddress {\n if (\"cellAddress\" in node) {\n return node.cellAddress;\n }\n\n const contextDependency = node.getContextDependency();\n return {\n workbookName: contextDependency.workbookName ?? \"__snapshot__\",\n sheetName: contextDependency.sheetName ?? \"__snapshot__\",\n colIndex: contextDependency.colIndex ?? 0,\n rowIndex: contextDependency.rowIndex ?? 0,\n };\n }\n\n private serializeErrorEvaluationResultSnapshot(\n evaluation: Exclude<ErrorEvaluationResult, { type: \"awaiting-evaluation\" }>,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedErrorEvaluationResultSnapshot {\n return {\n type: \"error\",\n err: evaluation.err,\n message: evaluation.message,\n errAddressId: getNodeSnapshotId(evaluation.errAddress),\n sourceCell: evaluation.sourceCell,\n };\n }\n\n serializeSingleEvaluationResultSnapshot(\n evaluation: SingleEvaluationResult,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedSingleEvaluationResultSnapshot | undefined {\n if (evaluation.type === \"awaiting-evaluation\") {\n return undefined;\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n getNodeSnapshotId\n );\n }\n\n return {\n type: \"value\",\n result: evaluation.result,\n sourceCell: evaluation.sourceCell,\n };\n }\n\n deserializeSingleEvaluationResultSnapshot(\n evaluation: SerializedSingleEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): SingleEvaluationResult {\n if (evaluation.type === \"error\") {\n return {\n type: \"error\",\n err: evaluation.err,\n message: evaluation.message,\n errAddress: resolveNodeSnapshotId(evaluation.errAddressId),\n sourceCell: evaluation.sourceCell,\n };\n }\n\n return {\n type: \"value\",\n result: evaluation.result,\n sourceCell: evaluation.sourceCell,\n };\n }\n\n serializeEvaluateAllCellsResultSnapshot(\n evaluation: EvaluateAllCellsResult,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedEvaluateAllCellsResultSnapshot | undefined {\n if (evaluation.type === \"awaiting-evaluation\") {\n return undefined;\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n getNodeSnapshotId\n );\n }\n\n const values: SerializedCellInRangeResultSnapshot[] = [];\n for (const value of evaluation.values) {\n const serialized = this.serializeSingleEvaluationResultSnapshot(\n value.result,\n getNodeSnapshotId\n );\n if (!serialized) {\n return undefined;\n }\n values.push({\n relativePos: value.relativePos,\n result: serialized,\n });\n }\n\n return {\n type: \"values\",\n values,\n };\n }\n\n deserializeEvaluateAllCellsResultSnapshot(\n evaluation: SerializedEvaluateAllCellsResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): EvaluateAllCellsResult {\n if (evaluation.type === \"error\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as ErrorEvaluationResult;\n }\n\n return {\n type: \"values\",\n values: evaluation.values.map((value) => ({\n relativePos: value.relativePos,\n result: this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n })),\n };\n }\n\n serializeFunctionEvaluationResultSnapshot(\n evaluation: FunctionEvaluationResult,\n options: {\n sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n }\n ): SerializedFunctionEvaluationResultSnapshot | undefined {\n if (evaluation.type !== \"spilled-values\") {\n return this.serializeSingleEvaluationResultSnapshot(\n evaluation,\n options.getNodeSnapshotId\n );\n }\n\n const origin = this.buildSnapshotOrigin(options.sourceNode);\n const spillArea = evaluation.spillArea(origin);\n const relativeSpillArea = getRelativeRange(spillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n });\n\n if (evaluation.sourceRange) {\n return {\n type: \"spilled-values\",\n spill: {\n kind: \"source-range\",\n relativeSpillArea,\n source: evaluation.source,\n sourceCell: evaluation.sourceCell,\n sourceRange: evaluation.sourceRange,\n },\n };\n }\n\n if (\n relativeSpillArea.width.type !== \"number\" ||\n relativeSpillArea.height.type !== \"number\"\n ) {\n return undefined;\n }\n\n const context = new EvaluationContext(\n this.tableManager,\n options.sourceNode,\n origin\n );\n const values: SerializedCellInRangeResultSnapshot[] = [];\n\n for (let y = 0; y < relativeSpillArea.height.value; y++) {\n for (let x = 0; x < relativeSpillArea.width.value; x++) {\n const result = captureEvaluationErrors(options.sourceNode, () =>\n evaluation.evaluate({ x, y }, context)\n );\n const serialized = this.serializeSingleEvaluationResultSnapshot(\n result,\n options.getNodeSnapshotId\n );\n if (!serialized) {\n return undefined;\n }\n values.push({\n relativePos: { x, y },\n result: serialized,\n });\n }\n }\n\n return {\n type: \"spilled-values\",\n spill: {\n kind: \"materialized\",\n relativeSpillArea,\n source: evaluation.source,\n sourceCell: evaluation.sourceCell,\n sourceRange: evaluation.sourceRange,\n values,\n },\n };\n }\n\n deserializeFunctionEvaluationResultSnapshot(\n evaluation: SerializedFunctionEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): FunctionEvaluationResult {\n if (evaluation.type !== \"spilled-values\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n );\n }\n\n const spillSnapshot = evaluation.spill;\n if (spillSnapshot.kind === \"materialized\") {\n const values = new Map(\n spillSnapshot.values.map((value) => [\n `${value.relativePos.x},${value.relativePos.y}`,\n this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n ])\n );\n\n return {\n type: \"spilled-values\",\n source: spillSnapshot.source,\n sourceCell: spillSnapshot.sourceCell,\n sourceRange: spillSnapshot.sourceRange,\n spillArea: (origin) =>\n getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n }),\n evaluate: (spillOffset) =>\n values.get(`${spillOffset.x},${spillOffset.y}`) ?? {\n type: \"value\",\n result: this.convertScalarValueToCellValue(\"\"),\n },\n evaluateAllCells: () => ({\n type: \"values\",\n values: spillSnapshot.values.map((value) => ({\n relativePos: value.relativePos,\n result: this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n })),\n }),\n };\n }\n\n return {\n type: \"spilled-values\",\n source: spillSnapshot.source,\n sourceCell: spillSnapshot.sourceCell,\n sourceRange: spillSnapshot.sourceRange,\n spillArea: (origin) =>\n getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n }),\n evaluate: (spillOffset, context) => {\n const cellAddress: CellAddress = {\n workbookName: spillSnapshot.sourceRange.workbookName,\n sheetName: spillSnapshot.sourceRange.sheetName,\n colIndex: spillSnapshot.sourceRange.range.start.col + spillOffset.x,\n rowIndex: spillSnapshot.sourceRange.range.start.row + spillOffset.y,\n };\n\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(\n cellAddressToKey(cellAddress)\n );\n context.dependencyNode.addDependency(evalNode);\n return evalNode.evaluationResult;\n },\n evaluateAllCells: ({ intersection, context, origin }) => {\n let range = spillSnapshot.sourceRange.range;\n if (intersection) {\n const relativeRange = getRelativeRange(intersection, origin);\n const projectedIntersection = getAbsoluteRange(relativeRange, {\n colIndex: spillSnapshot.sourceRange.range.start.col,\n rowIndex: spillSnapshot.sourceRange.range.start.row,\n });\n const nextRange = getRangeIntersection(\n spillSnapshot.sourceRange.range,\n projectedIntersection\n );\n if (nextRange) {\n range = nextRange;\n }\n }\n\n const rangeAddress = {\n workbookName: spillSnapshot.sourceRange.workbookName,\n sheetName: spillSnapshot.sourceRange.sheetName,\n range,\n };\n\n const rangeNode = this.dependencyManager.getRangeNode(\n rangeAddressToKey(rangeAddress)\n );\n context.dependencyNode.addDependency(rangeNode);\n return rangeNode.result;\n },\n };\n }\n\n serializeSpillMetaEvaluationResultSnapshot(\n evaluation: SpillMetaNode[\"evaluationResult\"],\n options: {\n sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n }\n ): SerializedSpillMetaEvaluationResultSnapshot | undefined {\n if (evaluation.type === \"does-not-spill\") {\n return { type: \"does-not-spill\" };\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n options.getNodeSnapshotId\n );\n }\n\n const serialized = this.serializeFunctionEvaluationResultSnapshot(\n evaluation,\n options\n );\n if (!serialized || serialized.type !== \"spilled-values\") {\n return undefined;\n }\n\n return serialized;\n }\n\n deserializeSpillMetaEvaluationResultSnapshot(\n evaluation: SerializedSpillMetaEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): SpillMetaNode[\"evaluationResult\"] {\n if (evaluation.type === \"does-not-spill\") {\n return evaluation;\n }\n\n if (evaluation.type === \"error\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as SpillMetaNode[\"evaluationResult\"];\n }\n\n return this.deserializeFunctionEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as SpillMetaNode[\"evaluationResult\"];\n }\n\n evaluateEmptyCell(node: EmptyCellEvaluationNode): void {\n if (node.resolved) {\n const result = node.evaluationResult;\n if (result && result.type !== \"awaiting-evaluation\") {\n return;\n }\n }\n\n this.dependencyManager.unregisterNode(node);\n node.resetDirectDepsUpdated();\n\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n node.cellAddress\n );\n const inSpilled = this.dependencyManager.getSpillValue(node.cellAddress);\n\n if (inSpilled) {\n // if we are spilling then we can just add the spill origin as a dependency and evaluate the spilled value\n const spillTarget = this.dependencyManager.getSpilledAddress(\n node.cellAddress,\n inSpilled\n );\n const spillOriginKey = cellAddressToKey(inSpilled.origin).replace(\n /^[^:]+:/,\n \"spill-meta:\"\n );\n const spillMetaNode =\n this.dependencyManager.getSpillMetaNode(spillOriginKey);\n node.addDependency(spillMetaNode);\n const result = spillMetaNode.evaluationResult;\n if (result.type === \"spilled-values\") {\n // let's evaluate the spilled value to extract dependencies\n const evaluation = captureEvaluationErrors(spillMetaNode, () => {\n return result.evaluate(spillTarget.spillOffset, ctx);\n });\n node.setEvaluationResult(evaluation);\n }\n } else {\n // upgrade any frontier dependencies that spill into the range\n node.upgradeFrontierDependencies();\n\n const evaluationResult: SingleEvaluationResult = {\n type: \"value\",\n result: this.convertScalarValueToCellValue(\"\"),\n };\n // for now let's just store the empty value, the next time the cell is evaluated isSpilled will be true and the spilled value will be evaluated\n node.setEvaluationResult(evaluationResult);\n }\n\n this.dependencyManager.registerNode(node);\n }\n\n evaluateRangeNode(node: RangeEvaluationNode): void {\n if (node.resolved) {\n return;\n }\n\n this.dependencyManager.unregisterNode(node);\n node.resetDirectDepsUpdated();\n\n const result = captureEvaluationErrors(node, (): EvaluateAllCellsResult => {\n node.upgradeFrontierDependencies();\n\n const evalOrder = node.getRangeEvalOrder();\n const circularEntryCache = new Map<DependencyNode, boolean>();\n const shouldSkipCircularEntry = (candidate: DependencyNode) => {\n const cached = circularEntryCache.get(candidate);\n if (cached !== undefined) {\n return cached;\n }\n\n // If a cell inside the range depends back on the range itself, including\n // its current value would count a circular result back into the same\n // aggregate on a later rerun.\n const isCircular = this.dependsOnNode(candidate, node);\n circularEntryCache.set(candidate, isCircular);\n return isCircular;\n };\n\n const results: CellInRangeResult[] = [];\n\n for (const entry of evalOrder) {\n if (entry.type === \"value\") {\n if (shouldSkipCircularEntry(entry.node)) {\n continue;\n }\n\n const entryAddress = entry.address;\n const result = entry.node.evaluationResult;\n\n const relativePos = {\n x: entryAddress.colIndex - node.address.range.start.col,\n y: entryAddress.rowIndex - node.address.range.start.row,\n };\n\n results.push({ result: result, relativePos });\n } else if (\n entry.type === \"empty_cell\" ||\n entry.type === \"empty_range\"\n ) {\n for (const candidateNode of entry.candidates) {\n if (shouldSkipCircularEntry(candidateNode)) {\n continue;\n }\n\n if (candidateNode.evaluationResult.type === \"spilled-values\") {\n const spillArea = candidateNode.evaluationResult.spillArea(\n candidateNode.cellAddress\n );\n if (entry.type === \"empty_range\") {\n const intersects = checkRangeIntersection(\n spillArea,\n entry.address.range\n );\n if (intersects) {\n // When a spilled range intersects with our target range, we need to evaluate\n // only the cells that fall within the intersection area.\n //\n // Example: If cell A10 contains a spilled range that covers A10:B11,\n // and our target range is B10:INFINITY, then we only want to evaluate\n // the intersection B10:B11 from the spilled range.\n //\n // The evaluateAllCells method expects the intersection to be passed\n // so it can limit evaluation to only the relevant cells.\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n candidateNode.cellAddress\n );\n const spilledResults =\n candidateNode.evaluationResult.evaluateAllCells.call(\n this.formulaEvaluator,\n {\n context: ctx,\n evaluate: candidateNode.evaluationResult.evaluate,\n intersection: entry.address.range,\n origin: candidateNode.cellAddress,\n lookupOrder: \"col-major\",\n }\n );\n\n if (spilledResults.type === \"values\") {\n results.push(...spilledResults.values);\n } else {\n return spilledResults;\n }\n }\n } else {\n const intersects = isCellInRange(entry.address, spillArea);\n if (intersects) {\n // When a spilled range intersects with our target range, we need to evaluate\n // only the cells that fall within the intersection area.\n //\n // Example: If cell A10 contains a spilled range that covers A10:B11,\n // and our target range is B10:INFINITY, then we only want to evaluate\n // the intersection B10:B11 from the spilled range.\n //\n // The evaluateAllCells method expects the intersection to be passed\n // so it can limit evaluation to only the relevant cells.\n\n const relativePos = {\n x:\n entry.address.colIndex -\n candidateNode.cellAddress.colIndex,\n y:\n entry.address.rowIndex -\n candidateNode.cellAddress.rowIndex,\n };\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n candidateNode.cellAddress\n );\n const spilledResult = candidateNode.evaluationResult.evaluate(\n relativePos,\n ctx\n );\n\n results.push({\n relativePos: {\n x: entry.address.colIndex - node.address.range.start.col,\n y: entry.address.rowIndex - node.address.range.start.row,\n },\n result: spilledResult,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n type: \"values\",\n values: results,\n };\n });\n\n node.setResult(result);\n this.dependencyManager.registerNode(node);\n }\n\n evaluateCellNode(\n node: CellValueNode | SpillMetaNode | VirtualCellValueNode\n ): void {\n // Enable caching for resolved nodes\n if (node.resolved) {\n return;\n }\n\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.unregisterNode(node);\n }\n node.resetDirectDepsUpdated();\n\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n node.cellAddress\n );\n\n if (node instanceof CellValueNode && node.spillMeta) {\n // we are evaluating a e.g. A1 in A1=SEQUENCE(10), where we want the value in the cell in A1, i.e. 1\n // As A1 is already pointing to a spill meta node, everything has been setup already,\n // we just need to evaluate the spill origin and assign the result to the currentDepNode\n const spillOrigin = node.spillMeta;\n if (spillOrigin.evaluationResult.type === \"spilled-values\") {\n const result = spillOrigin.evaluationResult.evaluate(\n { x: 0, y: 0 },\n ctx\n );\n node.setEvaluationResult(result);\n this.dependencyManager.registerNode(node);\n return;\n }\n }\n\n let content: SerializedCellValue;\n try {\n if (node instanceof VirtualCellValueNode) {\n content = node.cellValue;\n } else {\n content = this.workbookManager.getSerializedCellValue(node.cellAddress);\n }\n } catch (err) {\n const evaluationResult: ErrorEvaluationResult = {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"Syntax error\",\n errAddress: node,\n };\n node.setEvaluationResult(evaluationResult);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n if (typeof content !== \"string\" || !content.startsWith(\"=\")) {\n if (node instanceof SpillMetaNode) {\n node.setEvaluationResult({\n type: \"does-not-spill\",\n });\n this.dependencyManager.registerNode(node);\n return;\n }\n // Static value cells cannot have frontier dependencies\n const result: ValueEvaluationResult = {\n type: \"value\",\n result: this.convertScalarValueToCellValue(content),\n };\n node.setEvaluationResult(result);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n let evaluation: FunctionEvaluationResult = captureEvaluationErrors(\n node,\n () => this.formulaEvaluator.evaluateFormula(content.slice(1), ctx)\n );\n\n // the evaluated cell IS A spilling formula, e.g. if dependencyKey points to A1, then the formula is e.g. A1=SEQUENCE(10), or A1=A3:B5\n if (evaluation.type === \"spilled-values\") {\n const spillArea = evaluation.spillArea(node.cellAddress);\n\n if (!this.canSpill(node.cellAddress, spillArea)) {\n // Override evaluation with SPILL error, but continue execution to set up nodes\n evaluation = {\n type: \"error\",\n err: FormulaError.SPILL,\n message: \"Cannot spill - area is blocked\",\n errAddress: node,\n };\n } else {\n // Spill succeeds - register it\n this.dependencyManager.setSpilledValue(node.key, {\n spillOnto: spillArea,\n origin: node.cellAddress,\n });\n }\n\n // Set up spill meta node and evaluation results (even if spill failed)\n if (node instanceof SpillMetaNode) {\n // we have already setup an origin/spill meta node relationship,\n // so we are just reevaluating the spill meta node here\n node.setEvaluationResult(evaluation);\n this.dependencyManager.registerNode(node);\n } else {\n const spillMetaNode = this.dependencyManager.getSpillMetaNode(\n node.key.replace(/^[^:]+:/, \"spill-meta:\")\n );\n\n node.addDependency(spillMetaNode);\n node.setSpillMetaNode(spillMetaNode);\n spillMetaNode.setEvaluationResult(evaluation);\n this.dependencyManager.registerNode(spillMetaNode);\n\n if (evaluation.type === \"spilled-values\") {\n const originResult = evaluation.evaluate({ x: 0, y: 0 }, ctx);\n node.setEvaluationResult(originResult);\n } else {\n // Spill failed - set error on origin cell\n node.setEvaluationResult(evaluation);\n }\n }\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n if (evaluation.type === \"value\") {\n if (node instanceof SpillMetaNode) {\n node.setEvaluationResult({\n type: \"does-not-spill\",\n });\n this.dependencyManager.registerNode(node);\n return;\n } else {\n node.setEvaluationResult(evaluation);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n }\n\n node.setEvaluationResult(evaluation);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n }\n\n evaluateDependencyNode(dependency: DependencyNode): void {\n if (dependency instanceof EmptyCellEvaluationNode) {\n this.evaluateEmptyCell(dependency);\n return;\n }\n if (dependency instanceof RangeEvaluationNode) {\n this.evaluateRangeNode(dependency);\n return;\n }\n if (\n dependency instanceof CellValueNode ||\n dependency instanceof VirtualCellValueNode\n ) {\n this.evaluateCellNode(dependency);\n return;\n }\n if (dependency instanceof AstEvaluationNode) {\n return;\n }\n if (dependency instanceof ResourceDependencyNode) {\n return;\n }\n if (dependency instanceof SpillMetaNode) {\n this.evaluateCellNode(dependency);\n return;\n }\n throw new Error(\"Invalid dependency: \" + (dependency as any).key);\n }\n\n /**\n * User exposed method to evaluate a formula\n */\n evaluateFormula(\n /**\n * formula for example\n */\n cellValue: SerializedCellValue,\n cellAddress: CellAddress\n ): SerializedCellValue {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n\n const node = this.dependencyManager.getVirtualCellValueNode(\n cellAddress,\n cellValue\n );\n\n if (node.evaluationResult.type === \"awaiting-evaluation\") {\n this.evaluateCell(node);\n }\n\n const result = node.evaluationResult;\n\n return this.evaluationResultToSerializedValue(result, cellAddress);\n }\n\n /**\n * Evaluates a cell by building the evaluation order and evaluating the dependencies in order\n */\n evaluateCell(\n node: CellValueNode | EmptyCellEvaluationNode | VirtualCellValueNode\n ): void {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n this.isEvaluating = true;\n\n let precalculatedPlan: EvaluationOrder | undefined;\n\n let requiresReRun = true;\n while (requiresReRun) {\n requiresReRun = false;\n\n // Use DependencyManager to build evaluation order\n const evaluationPlan =\n precalculatedPlan ?? this.dependencyManager.buildEvaluationOrder(node);\n\n if (evaluationPlan.hasCycle) {\n const evaluationResult: ErrorEvaluationResult = {\n type: \"error\",\n err: FormulaError.CYCLE,\n message: Array.from(evaluationPlan.cycleNodes ?? [])\n .map((node) => node.key)\n .join(\" -> \"),\n errAddress: node,\n };\n // cycle detected\n if (evaluationPlan.cycleNodes) {\n for (const node of evaluationPlan.cycleNodes) {\n if (\n !(node instanceof RangeEvaluationNode) &&\n !(node instanceof ResourceDependencyNode)\n ) {\n node.setEvaluationResult(evaluationResult);\n }\n }\n }\n this.isEvaluating = false;\n }\n\n // Evaluate all dependencies in order\n const timeStart = performance.now();\n const durations: { duration: number; key: string }[] = [];\n let numResolved = 0;\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n // console.profile();\n }\n evaluationPlan.evaluationOrder.forEach((dependency) => {\n const start = performance.now();\n if (dependency.resolved) {\n numResolved++;\n }\n this.evaluateDependencyNode(dependency);\n\n const end = performance.now();\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n durations.push({ duration: end - start, key: dependency.key });\n }\n });\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n // console.profileEnd();\n }\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n const percentResolved = Math.round(\n (100 * numResolved) / evaluationPlan.evaluationOrder.size\n );\n const avgDuration =\n durations.reduce((a, b) => a + b.duration, 0) / durations.length || 0;\n console.log(\n `%c[Evaluation] %c${evaluationPlan.evaluationOrder.size} deps | %c${(\n performance.now() - timeStart\n ).toFixed(\n 1\n )}ms | %c${percentResolved}% resolved | %c${avgDuration.toFixed(\n 2\n )}ms avg`,\n \"color:#83aaff;font-weight:bold;\",\n \"color:#fff;font-weight:bold;\",\n \"color:#7fff9e\",\n \"color:#85baff\",\n \"color:#ffdfa3\"\n );\n }\n\n this.dependencyManager.markResolvedNodes(node);\n\n const nextEvaluationPlan =\n this.dependencyManager.buildEvaluationOrder(node);\n\n this.dependencyManager.updateResolvedSCCs(nextEvaluationPlan);\n\n precalculatedPlan = nextEvaluationPlan;\n\n // Check if new dependencies were discovered during evaluation\n if (nextEvaluationPlan.hash !== evaluationPlan.hash) {\n requiresReRun = true;\n } else {\n this.isEvaluating = false;\n return;\n }\n }\n this.isEvaluating = false;\n }\n\n convertScalarValueToCellValue(val: SerializedCellValue): CellValue {\n if (val === \"INFINITY\") {\n return { type: \"infinity\", sign: \"positive\" };\n }\n if (val === \"-INFINITY\") {\n return { type: \"infinity\", sign: \"negative\" };\n }\n if (typeof val === \"number\") {\n return { type: \"number\", value: val };\n }\n if (typeof val === \"boolean\") {\n return { type: \"boolean\", value: val };\n }\n if (typeof val === \"undefined\") {\n return { type: \"string\", value: \"\" };\n }\n return { type: \"string\", value: val };\n }\n\n // todo optimize using workbook manager\n canSpill(spillCandidate: CellAddress, spillArea: SpreadsheetRange): boolean {\n // Check if the spill origin cell is inside a table - spilling formulas cannot exist in tables\n if (this.tableManager.isCellInTable(spillCandidate)) {\n return false;\n }\n\n // Check if the spill area would intersect with any table - formulas cannot spill into tables\n if (\n this.tableManager.doesRangeIntersectTable(\n spillCandidate.workbookName,\n spillCandidate.sheetName,\n spillArea\n )\n ) {\n return false;\n }\n\n const sheet = this.workbookManager.getSheet(spillCandidate);\n if (!sheet) {\n throw new SheetNotFoundError(spillCandidate.sheetName);\n }\n const cellId = getCellReference(spillCandidate);\n const content = sheet.content.get(cellId);\n if (!content) {\n throw new EvaluationError(FormulaError.REF, `Cell not found: ${cellId}`);\n }\n for (const spilledValue of this.dependencyManager.spilledValues) {\n if (\n spilledValue.origin.workbookName !== spillCandidate.workbookName ||\n spilledValue.origin.sheetName !== spillCandidate.sheetName\n ) {\n continue;\n }\n if (\n spilledValue.origin.colIndex === spillCandidate.colIndex &&\n spilledValue.origin.rowIndex === spillCandidate.rowIndex\n ) {\n // we are already have a spill, this one will be replaced\n continue;\n }\n\n if (checkRangeIntersection(spillArea, spilledValue.spillOnto)) {\n return false;\n }\n }\n // let's just check the raw data if there is something in the range\n for (const key of sheet.content.keys()) {\n const cellAddress = parseCellReference(key);\n const endCol = spillArea.end.col;\n const endRow = spillArea.end.row;\n\n if (\n cellAddress.colIndex === spillCandidate.colIndex &&\n cellAddress.rowIndex === spillCandidate.rowIndex\n ) {\n continue;\n }\n\n if (endCol.type === \"number\" && endRow.type === \"number\") {\n if (\n cellAddress.colIndex >= spillArea.start.col &&\n cellAddress.colIndex <= endCol.value &&\n cellAddress.rowIndex >= spillArea.start.row &&\n cellAddress.rowIndex <= endRow.value\n ) {\n if (\n normalizeSerializedCellValue(sheet.content.get(key)) !== undefined\n ) {\n // there is something in the range, so we can't spill\n return false;\n }\n }\n }\n }\n\n return true;\n }\n\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n\n const nodeKey = cellAddressToKey(cellAddress);\n const node = this.dependencyManager.getCellValueOrEmptyCellNode(nodeKey);\n\n const sheet = this.workbookManager.getSheet(cellAddress);\n if (!sheet) {\n throw new SheetNotFoundError(cellAddress.sheetName);\n }\n\n if (node.evaluationResult.type === \"awaiting-evaluation\") {\n // if (cellAddressToKey(cellAddress).includes(\"G10\")) {\n // console.group(\"Evaluation of G10\");\n // flags.isProfiling = true;\n // console.time(\"Evaluation of G10\");\n // console.profile(\"Evaluation of G10\");\n // }\n this.evaluateCell(node);\n // if (flags.isProfiling) {\n // flags.isProfiling = false;\n // console.timeEnd(\"Evaluation of G10\");\n // console.profileEnd(\"Evaluation of G10\");\n // console.groupEnd();\n // }\n }\n\n const result = node.evaluationResult;\n\n return result;\n }\n}\n"
5
+ "import { flags } from \"../../debug/flags.cjs\";\nimport { AstEvaluationNode } from \"../../evaluator/dependency-nodes/ast-evaluation-node.cjs\";\nimport { CellValueNode } from \"../../evaluator/dependency-nodes/cell-value-node.cjs\";\nimport { EvaluationContext } from \"../../evaluator/evaluation-context.cjs\";\nimport {\n EvaluationError,\n SheetNotFoundError,\n} from \"../../evaluator/evaluation-error.cjs\";\nimport { RangeEvaluationNode } from \"../../evaluator/range-evaluation-node.cjs\";\nimport { normalizeSerializedCellValue } from \"../../parser/formatter.cjs\";\nimport { FormulaEvaluator } from \"../../evaluator/formula-evaluator.cjs\";\nimport {\n FormulaError,\n type CellAddress,\n type CellInRangeResult,\n type CellValue,\n type ErrorEvaluationResult,\n type EvaluateAllCellsResult,\n type EvaluationOrder,\n type FunctionEvaluationResult,\n type SerializedCellValue,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type ValueEvaluationResult,\n} from \"../types.cjs\";\nimport {\n captureEvaluationErrors,\n getAbsoluteRange,\n cellAddressToKey,\n checkRangeIntersection,\n getCellReference,\n getRangeIntersection,\n getRelativeRange,\n isCellInRange,\n parseCellReference,\n rangeAddressToKey,\n} from \"../utils.cjs\";\nimport type { DependencyManager } from \"./dependency-manager.cjs\";\nimport type { WorkbookManager } from \"./workbook-manager.cjs\";\nimport { SpillMetaNode } from \"../../evaluator/dependency-nodes/spill-meta-node.cjs\";\nimport { EmptyCellEvaluationNode } from \"../../evaluator/dependency-nodes/empty-cell-evaluation-node.cjs\";\nimport type { TableManager } from \"./table-manager.cjs\";\nimport type { DependencyNode } from \"./dependency-node.cjs\";\nimport { VirtualCellValueNode } from \"../../evaluator/dependency-nodes/virtual-cell-value-node.cjs\";\nimport { ResourceDependencyNode } from \"../../evaluator/dependency-nodes/resource-dependency-node.cjs\";\nimport type {\n NodeSnapshotId,\n SerializedCellInRangeResultSnapshot,\n SerializedErrorEvaluationResultSnapshot,\n SerializedEvaluateAllCellsResultSnapshot,\n SerializedFunctionEvaluationResultSnapshot,\n SerializedSingleEvaluationResultSnapshot,\n SerializedSpillMetaEvaluationResultSnapshot,\n SerializedSpilledValuesEvaluationResultSnapshot,\n} from \"../engine-snapshot.cjs\";\nimport type { MutationInvalidation } from \"../commands/types.cjs\";\n\nexport class EvaluationManager {\n private isEvaluating = false;\n\n constructor(\n private workbookManager: WorkbookManager,\n private tableManager: TableManager,\n private formulaEvaluator: FormulaEvaluator,\n private dependencyManager: DependencyManager\n ) {}\n\n clearEvaluationCache(): void {\n this.dependencyManager.clearEvaluationCache();\n }\n\n private dependsOnNode(\n candidate: DependencyNode,\n target: DependencyNode,\n visited: Set<DependencyNode> = new Set()\n ): boolean {\n if (candidate === target) {\n return true;\n }\n\n if (visited.has(candidate)) {\n return false;\n }\n visited.add(candidate);\n\n for (const dep of candidate.getDependencies()) {\n if (this.dependsOnNode(dep, target, visited)) {\n return true;\n }\n }\n\n return false;\n }\n\n invalidateFromMutation(footprint: MutationInvalidation): void {\n this.dependencyManager.invalidateFromMutation(footprint);\n }\n\n evaluationResultToSerializedValue(\n evaluation: SingleEvaluationResult,\n cellAddress: CellAddress,\n debug?: boolean\n ): SerializedCellValue {\n if (\n evaluation.type !== \"error\" &&\n evaluation.type !== \"awaiting-evaluation\"\n ) {\n const value = evaluation.result;\n\n return value.type === \"infinity\"\n ? value.sign === \"positive\"\n ? \"INFINITY\"\n : \"-INFINITY\"\n : value.value;\n }\n\n if (evaluation.type === \"awaiting-evaluation\") {\n return (\n evaluation.errAddress.key +\n \" is awaiting evaluation of \" +\n evaluation.waitingFor.key\n );\n }\n\n if (debug) {\n const errAddress = evaluation.errAddress.key;\n if (errAddress === cellAddressToKey(cellAddress)) {\n return evaluation.err + \" \" + evaluation.message;\n }\n return (\n evaluation.err +\n \" in \" +\n evaluation.errAddress.key +\n \" \" +\n evaluation.message\n );\n }\n\n return evaluation.err;\n }\n\n private buildSnapshotOrigin(\n node: CellValueNode | SpillMetaNode | AstEvaluationNode\n ): CellAddress {\n if (\"cellAddress\" in node) {\n return node.cellAddress;\n }\n\n const contextDependency = node.getContextDependency();\n return {\n workbookName: contextDependency.workbookName ?? \"__snapshot__\",\n sheetName: contextDependency.sheetName ?? \"__snapshot__\",\n colIndex: contextDependency.colIndex ?? 0,\n rowIndex: contextDependency.rowIndex ?? 0,\n };\n }\n\n private serializeErrorEvaluationResultSnapshot(\n evaluation: Exclude<ErrorEvaluationResult, { type: \"awaiting-evaluation\" }>,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedErrorEvaluationResultSnapshot {\n return {\n type: \"error\",\n err: evaluation.err,\n message: evaluation.message,\n errAddressId: getNodeSnapshotId(evaluation.errAddress),\n sourceCell: evaluation.sourceCell,\n };\n }\n\n serializeSingleEvaluationResultSnapshot(\n evaluation: SingleEvaluationResult,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedSingleEvaluationResultSnapshot | undefined {\n if (evaluation.type === \"awaiting-evaluation\") {\n return undefined;\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n getNodeSnapshotId\n );\n }\n\n return {\n type: \"value\",\n result: evaluation.result,\n sourceCell: evaluation.sourceCell,\n };\n }\n\n deserializeSingleEvaluationResultSnapshot(\n evaluation: SerializedSingleEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): SingleEvaluationResult {\n if (evaluation.type === \"error\") {\n return {\n type: \"error\",\n err: evaluation.err,\n message: evaluation.message,\n errAddress: resolveNodeSnapshotId(evaluation.errAddressId),\n sourceCell: evaluation.sourceCell,\n };\n }\n\n return {\n type: \"value\",\n result: evaluation.result,\n sourceCell: evaluation.sourceCell,\n };\n }\n\n serializeEvaluateAllCellsResultSnapshot(\n evaluation: EvaluateAllCellsResult,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedEvaluateAllCellsResultSnapshot | undefined {\n if (evaluation.type === \"awaiting-evaluation\") {\n return undefined;\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n getNodeSnapshotId\n );\n }\n\n const values: SerializedCellInRangeResultSnapshot[] = [];\n for (const value of evaluation.values) {\n const serialized = this.serializeSingleEvaluationResultSnapshot(\n value.result,\n getNodeSnapshotId\n );\n if (!serialized) {\n return undefined;\n }\n values.push({\n relativePos: value.relativePos,\n result: serialized,\n });\n }\n\n return {\n type: \"values\",\n values,\n };\n }\n\n deserializeEvaluateAllCellsResultSnapshot(\n evaluation: SerializedEvaluateAllCellsResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): EvaluateAllCellsResult {\n if (evaluation.type === \"error\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as ErrorEvaluationResult;\n }\n\n return {\n type: \"values\",\n values: evaluation.values.map((value) => ({\n relativePos: value.relativePos,\n result: this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n })),\n };\n }\n\n serializeFunctionEvaluationResultSnapshot(\n evaluation: FunctionEvaluationResult,\n options: {\n sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n }\n ): SerializedFunctionEvaluationResultSnapshot | undefined {\n if (evaluation.type !== \"spilled-values\") {\n return this.serializeSingleEvaluationResultSnapshot(\n evaluation,\n options.getNodeSnapshotId\n );\n }\n\n const origin = this.buildSnapshotOrigin(options.sourceNode);\n const spillArea = evaluation.spillArea(origin);\n const relativeSpillArea = getRelativeRange(spillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n });\n\n if (evaluation.sourceRange) {\n return {\n type: \"spilled-values\",\n spill: {\n kind: \"source-range\",\n relativeSpillArea,\n source: evaluation.source,\n sourceCell: evaluation.sourceCell,\n sourceRange: evaluation.sourceRange,\n },\n };\n }\n\n if (\n relativeSpillArea.width.type !== \"number\" ||\n relativeSpillArea.height.type !== \"number\"\n ) {\n return undefined;\n }\n\n const context = new EvaluationContext(\n this.tableManager,\n options.sourceNode,\n origin\n );\n const values: SerializedCellInRangeResultSnapshot[] = [];\n\n for (let y = 0; y < relativeSpillArea.height.value; y++) {\n for (let x = 0; x < relativeSpillArea.width.value; x++) {\n const result = captureEvaluationErrors(options.sourceNode, () =>\n evaluation.evaluate({ x, y }, context)\n );\n const serialized = this.serializeSingleEvaluationResultSnapshot(\n result,\n options.getNodeSnapshotId\n );\n if (!serialized) {\n return undefined;\n }\n values.push({\n relativePos: { x, y },\n result: serialized,\n });\n }\n }\n\n return {\n type: \"spilled-values\",\n spill: {\n kind: \"materialized\",\n relativeSpillArea,\n source: evaluation.source,\n sourceCell: evaluation.sourceCell,\n sourceRange: evaluation.sourceRange,\n values,\n },\n };\n }\n\n deserializeFunctionEvaluationResultSnapshot(\n evaluation: SerializedFunctionEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): FunctionEvaluationResult {\n if (evaluation.type !== \"spilled-values\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n );\n }\n\n const spillSnapshot = evaluation.spill;\n if (spillSnapshot.kind === \"materialized\") {\n const values = new Map(\n spillSnapshot.values.map((value) => [\n `${value.relativePos.x},${value.relativePos.y}`,\n this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n ])\n );\n\n return {\n type: \"spilled-values\",\n source: spillSnapshot.source,\n sourceCell: spillSnapshot.sourceCell,\n sourceRange: spillSnapshot.sourceRange,\n spillArea: (origin) =>\n getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n }),\n evaluate: (spillOffset) =>\n values.get(`${spillOffset.x},${spillOffset.y}`) ?? {\n type: \"value\",\n result: this.convertScalarValueToCellValue(\"\"),\n },\n evaluateAllCells: () => ({\n type: \"values\",\n values: spillSnapshot.values.map((value) => ({\n relativePos: value.relativePos,\n result: this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n })),\n }),\n };\n }\n\n return {\n type: \"spilled-values\",\n source: spillSnapshot.source,\n sourceCell: spillSnapshot.sourceCell,\n sourceRange: spillSnapshot.sourceRange,\n spillArea: (origin) =>\n getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n }),\n evaluate: (spillOffset, context) => {\n const cellAddress: CellAddress = {\n workbookName: spillSnapshot.sourceRange.workbookName,\n sheetName: spillSnapshot.sourceRange.sheetName,\n colIndex: spillSnapshot.sourceRange.range.start.col + spillOffset.x,\n rowIndex: spillSnapshot.sourceRange.range.start.row + spillOffset.y,\n };\n\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(\n cellAddressToKey(cellAddress)\n );\n context.dependencyNode.addDependency(evalNode);\n return evalNode.evaluationResult;\n },\n evaluateAllCells: ({ intersection, context, origin }) => {\n let range = spillSnapshot.sourceRange.range;\n if (intersection) {\n const relativeRange = getRelativeRange(intersection, origin);\n const projectedIntersection = getAbsoluteRange(relativeRange, {\n colIndex: spillSnapshot.sourceRange.range.start.col,\n rowIndex: spillSnapshot.sourceRange.range.start.row,\n });\n const nextRange = getRangeIntersection(\n spillSnapshot.sourceRange.range,\n projectedIntersection\n );\n if (nextRange) {\n range = nextRange;\n }\n }\n\n const rangeAddress = {\n workbookName: spillSnapshot.sourceRange.workbookName,\n sheetName: spillSnapshot.sourceRange.sheetName,\n range,\n };\n\n const rangeNode = this.dependencyManager.getRangeNode(\n rangeAddressToKey(rangeAddress)\n );\n context.dependencyNode.addDependency(rangeNode);\n return rangeNode.result;\n },\n };\n }\n\n serializeSpillMetaEvaluationResultSnapshot(\n evaluation: SpillMetaNode[\"evaluationResult\"],\n options: {\n sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n }\n ): SerializedSpillMetaEvaluationResultSnapshot | undefined {\n if (evaluation.type === \"does-not-spill\") {\n return { type: \"does-not-spill\" };\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n options.getNodeSnapshotId\n );\n }\n\n const serialized = this.serializeFunctionEvaluationResultSnapshot(\n evaluation,\n options\n );\n if (!serialized || serialized.type !== \"spilled-values\") {\n return undefined;\n }\n\n return serialized;\n }\n\n deserializeSpillMetaEvaluationResultSnapshot(\n evaluation: SerializedSpillMetaEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): SpillMetaNode[\"evaluationResult\"] {\n if (evaluation.type === \"does-not-spill\") {\n return evaluation;\n }\n\n if (evaluation.type === \"error\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as SpillMetaNode[\"evaluationResult\"];\n }\n\n return this.deserializeFunctionEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as SpillMetaNode[\"evaluationResult\"];\n }\n\n evaluateEmptyCell(node: EmptyCellEvaluationNode): void {\n if (node.resolved) {\n const result = node.evaluationResult;\n if (result && result.type !== \"awaiting-evaluation\") {\n return;\n }\n }\n\n this.dependencyManager.unregisterNode(node);\n node.resetDirectDepsUpdated();\n\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n node.cellAddress\n );\n const inSpilled = this.dependencyManager.getSpillValue(node.cellAddress);\n\n if (inSpilled) {\n // if we are spilling then we can just add the spill origin as a dependency and evaluate the spilled value\n const spillTarget = this.dependencyManager.getSpilledAddress(\n node.cellAddress,\n inSpilled\n );\n const spillOriginKey = cellAddressToKey(inSpilled.origin).replace(\n /^[^:]+:/,\n \"spill-meta:\"\n );\n const spillMetaNode =\n this.dependencyManager.getSpillMetaNode(spillOriginKey);\n node.addDependency(spillMetaNode);\n const result = spillMetaNode.evaluationResult;\n if (result.type === \"spilled-values\") {\n // let's evaluate the spilled value to extract dependencies\n const evaluation = captureEvaluationErrors(spillMetaNode, () => {\n return result.evaluate(spillTarget.spillOffset, ctx);\n });\n node.setEvaluationResult(evaluation);\n }\n } else {\n // upgrade any frontier dependencies that spill into the range\n node.upgradeFrontierDependencies();\n\n const evaluationResult: SingleEvaluationResult = {\n type: \"value\",\n result: this.convertScalarValueToCellValue(\"\"),\n };\n // for now let's just store the empty value, the next time the cell is evaluated isSpilled will be true and the spilled value will be evaluated\n node.setEvaluationResult(evaluationResult);\n }\n\n this.dependencyManager.registerNode(node);\n }\n\n evaluateRangeNode(node: RangeEvaluationNode): void {\n if (node.resolved) {\n return;\n }\n\n this.dependencyManager.unregisterNode(node);\n node.resetDirectDepsUpdated();\n\n const result = captureEvaluationErrors(node, (): EvaluateAllCellsResult => {\n node.upgradeFrontierDependencies();\n\n const evalOrder = node.getRangeEvalOrder();\n const circularEntryCache = new Map<DependencyNode, boolean>();\n const shouldSkipCircularEntry = (candidate: DependencyNode) => {\n const cached = circularEntryCache.get(candidate);\n if (cached !== undefined) {\n return cached;\n }\n\n // If a cell inside the range depends back on the range itself, including\n // its current value would count a circular result back into the same\n // aggregate on a later rerun.\n const isCircular = this.dependsOnNode(candidate, node);\n circularEntryCache.set(candidate, isCircular);\n return isCircular;\n };\n\n const results: CellInRangeResult[] = [];\n\n for (const entry of evalOrder) {\n if (entry.type === \"value\") {\n if (shouldSkipCircularEntry(entry.node)) {\n continue;\n }\n\n const entryAddress = entry.address;\n const result = entry.node.evaluationResult;\n\n const relativePos = {\n x: entryAddress.colIndex - node.address.range.start.col,\n y: entryAddress.rowIndex - node.address.range.start.row,\n };\n\n results.push({ result: result, relativePos });\n } else if (\n entry.type === \"empty_cell\" ||\n entry.type === \"empty_range\"\n ) {\n for (const candidateNode of entry.candidates) {\n if (shouldSkipCircularEntry(candidateNode)) {\n continue;\n }\n\n if (candidateNode.evaluationResult.type === \"spilled-values\") {\n const spillArea = candidateNode.evaluationResult.spillArea(\n candidateNode.cellAddress\n );\n if (entry.type === \"empty_range\") {\n const intersects = checkRangeIntersection(\n spillArea,\n entry.address.range\n );\n if (intersects) {\n // When a spilled range intersects with our target range, we need to evaluate\n // only the cells that fall within the intersection area.\n //\n // Example: If cell A10 contains a spilled range that covers A10:B11,\n // and our target range is B10:INFINITY, then we only want to evaluate\n // the intersection B10:B11 from the spilled range.\n //\n // The evaluateAllCells method expects the intersection to be passed\n // so it can limit evaluation to only the relevant cells.\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n candidateNode.cellAddress\n );\n const spilledResults =\n candidateNode.evaluationResult.evaluateAllCells.call(\n this.formulaEvaluator,\n {\n context: ctx,\n evaluate: candidateNode.evaluationResult.evaluate,\n intersection: entry.address.range,\n origin: candidateNode.cellAddress,\n lookupOrder: \"col-major\",\n }\n );\n\n if (spilledResults.type === \"values\") {\n results.push(...spilledResults.values);\n } else {\n return spilledResults;\n }\n }\n } else {\n const intersects = isCellInRange(entry.address, spillArea);\n if (intersects) {\n // When a spilled range intersects with our target range, we need to evaluate\n // only the cells that fall within the intersection area.\n //\n // Example: If cell A10 contains a spilled range that covers A10:B11,\n // and our target range is B10:INFINITY, then we only want to evaluate\n // the intersection B10:B11 from the spilled range.\n //\n // The evaluateAllCells method expects the intersection to be passed\n // so it can limit evaluation to only the relevant cells.\n\n const relativePos = {\n x:\n entry.address.colIndex -\n candidateNode.cellAddress.colIndex,\n y:\n entry.address.rowIndex -\n candidateNode.cellAddress.rowIndex,\n };\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n candidateNode.cellAddress\n );\n const spilledResult = candidateNode.evaluationResult.evaluate(\n relativePos,\n ctx\n );\n\n results.push({\n relativePos: {\n x: entry.address.colIndex - node.address.range.start.col,\n y: entry.address.rowIndex - node.address.range.start.row,\n },\n result: spilledResult,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n type: \"values\",\n values: results,\n };\n });\n\n node.setResult(result);\n this.dependencyManager.registerNode(node);\n }\n\n evaluateCellNode(\n node: CellValueNode | SpillMetaNode | VirtualCellValueNode\n ): void {\n // Enable caching for resolved nodes\n if (node.resolved) {\n return;\n }\n\n const finalizePersistentNode = () => {\n if (node instanceof VirtualCellValueNode) {\n return;\n }\n\n this.dependencyManager.registerNode(node);\n };\n\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.unregisterNode(node);\n }\n node.resetDirectDepsUpdated();\n\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n node.cellAddress\n );\n\n if (node instanceof CellValueNode && node.spillMeta) {\n // we are evaluating a e.g. A1 in A1=SEQUENCE(10), where we want the value in the cell in A1, i.e. 1\n // As A1 is already pointing to a spill meta node, everything has been setup already,\n // we just need to evaluate the spill origin and assign the result to the currentDepNode\n const spillOrigin = node.spillMeta;\n if (spillOrigin.evaluationResult.type === \"spilled-values\") {\n const result = spillOrigin.evaluationResult.evaluate(\n { x: 0, y: 0 },\n ctx\n );\n node.setEvaluationResult(result);\n finalizePersistentNode();\n return;\n }\n }\n\n let content: SerializedCellValue;\n try {\n if (node instanceof VirtualCellValueNode) {\n content = node.cellValue;\n } else {\n content = this.workbookManager.getSerializedCellValue(node.cellAddress);\n }\n } catch (err) {\n const evaluationResult: ErrorEvaluationResult = {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"Syntax error\",\n errAddress: node,\n };\n node.setEvaluationResult(evaluationResult);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n if (typeof content !== \"string\" || !content.startsWith(\"=\")) {\n if (node instanceof SpillMetaNode) {\n node.setEvaluationResult({\n type: \"does-not-spill\",\n });\n finalizePersistentNode();\n return;\n }\n // Static value cells cannot have frontier dependencies\n const result: ValueEvaluationResult = {\n type: \"value\",\n result: this.convertScalarValueToCellValue(content),\n };\n node.setEvaluationResult(result);\n finalizePersistentNode();\n return;\n }\n\n let evaluation: FunctionEvaluationResult = captureEvaluationErrors(\n node,\n () => this.formulaEvaluator.evaluateFormula(content.slice(1), ctx)\n );\n\n // the evaluated cell IS A spilling formula, e.g. if dependencyKey points to A1, then the formula is e.g. A1=SEQUENCE(10), or A1=A3:B5\n if (evaluation.type === \"spilled-values\") {\n const spillArea = evaluation.spillArea(node.cellAddress);\n\n if (!this.canSpill(node.cellAddress, spillArea)) {\n // Override evaluation with SPILL error, but continue execution to set up nodes\n evaluation = {\n type: \"error\",\n err: FormulaError.SPILL,\n message: \"Cannot spill - area is blocked\",\n errAddress: node,\n };\n } else {\n // Spill succeeds - register it\n this.dependencyManager.setSpilledValue(node.key, {\n spillOnto: spillArea,\n origin: node.cellAddress,\n });\n }\n\n // Set up spill meta node and evaluation results (even if spill failed)\n if (node instanceof SpillMetaNode) {\n // we have already setup an origin/spill meta node relationship,\n // so we are just reevaluating the spill meta node here\n node.setEvaluationResult(evaluation);\n finalizePersistentNode();\n } else {\n const spillMetaNode = this.dependencyManager.getSpillMetaNode(\n node.key.replace(/^[^:]+:/, \"spill-meta:\")\n );\n\n node.addDependency(spillMetaNode);\n node.setSpillMetaNode(spillMetaNode);\n spillMetaNode.setEvaluationResult(evaluation);\n this.dependencyManager.registerNode(spillMetaNode);\n\n if (evaluation.type === \"spilled-values\") {\n const originResult = evaluation.evaluate({ x: 0, y: 0 }, ctx);\n node.setEvaluationResult(originResult);\n } else {\n // Spill failed - set error on origin cell\n node.setEvaluationResult(evaluation);\n }\n }\n finalizePersistentNode();\n return;\n }\n\n if (evaluation.type === \"value\") {\n if (node instanceof SpillMetaNode) {\n node.setEvaluationResult({\n type: \"does-not-spill\",\n });\n finalizePersistentNode();\n return;\n } else {\n node.setEvaluationResult(evaluation);\n finalizePersistentNode();\n return;\n }\n }\n\n node.setEvaluationResult(evaluation);\n finalizePersistentNode();\n }\n\n evaluateDependencyNode(dependency: DependencyNode): void {\n if (dependency instanceof EmptyCellEvaluationNode) {\n this.evaluateEmptyCell(dependency);\n return;\n }\n if (dependency instanceof RangeEvaluationNode) {\n this.evaluateRangeNode(dependency);\n return;\n }\n if (\n dependency instanceof CellValueNode ||\n dependency instanceof VirtualCellValueNode\n ) {\n this.evaluateCellNode(dependency);\n return;\n }\n if (dependency instanceof AstEvaluationNode) {\n return;\n }\n if (dependency instanceof ResourceDependencyNode) {\n return;\n }\n if (dependency instanceof SpillMetaNode) {\n this.evaluateCellNode(dependency);\n return;\n }\n throw new Error(\"Invalid dependency: \" + (dependency as any).key);\n }\n\n /**\n * User exposed method to evaluate a formula\n */\n evaluateFormula(\n /**\n * formula for example\n */\n cellValue: SerializedCellValue,\n cellAddress: CellAddress\n ): SerializedCellValue {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n\n const node = this.dependencyManager.getVirtualCellValueNode(\n cellAddress,\n cellValue\n );\n\n if (node.evaluationResult.type === \"awaiting-evaluation\") {\n this.evaluateCell(node);\n }\n\n const result = node.evaluationResult;\n\n return this.evaluationResultToSerializedValue(result, cellAddress);\n }\n\n /**\n * Evaluates a cell by building the evaluation order and evaluating the dependencies in order\n */\n evaluateCell(\n node: CellValueNode | EmptyCellEvaluationNode | VirtualCellValueNode\n ): void {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n this.isEvaluating = true;\n\n let precalculatedPlan: EvaluationOrder | undefined;\n\n let requiresReRun = true;\n while (requiresReRun) {\n requiresReRun = false;\n\n // Use DependencyManager to build evaluation order\n const evaluationPlan =\n precalculatedPlan ?? this.dependencyManager.buildEvaluationOrder(node);\n\n if (evaluationPlan.hasCycle) {\n const evaluationResult: ErrorEvaluationResult = {\n type: \"error\",\n err: FormulaError.CYCLE,\n message: Array.from(evaluationPlan.cycleNodes ?? [])\n .map((node) => node.key)\n .join(\" -> \"),\n errAddress: node,\n };\n // cycle detected\n if (evaluationPlan.cycleNodes) {\n for (const node of evaluationPlan.cycleNodes) {\n if (\n !(node instanceof RangeEvaluationNode) &&\n !(node instanceof ResourceDependencyNode)\n ) {\n node.setEvaluationResult(evaluationResult);\n }\n }\n }\n this.isEvaluating = false;\n }\n\n // Evaluate all dependencies in order\n const timeStart = performance.now();\n const durations: { duration: number; key: string }[] = [];\n let numResolved = 0;\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n // console.profile();\n }\n evaluationPlan.evaluationOrder.forEach((dependency) => {\n const start = performance.now();\n if (dependency.resolved) {\n numResolved++;\n }\n this.evaluateDependencyNode(dependency);\n\n const end = performance.now();\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n durations.push({ duration: end - start, key: dependency.key });\n }\n });\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n // console.profileEnd();\n }\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n const percentResolved = Math.round(\n (100 * numResolved) / evaluationPlan.evaluationOrder.size\n );\n const avgDuration =\n durations.reduce((a, b) => a + b.duration, 0) / durations.length || 0;\n console.log(\n `%c[Evaluation] %c${evaluationPlan.evaluationOrder.size} deps | %c${(\n performance.now() - timeStart\n ).toFixed(\n 1\n )}ms | %c${percentResolved}% resolved | %c${avgDuration.toFixed(\n 2\n )}ms avg`,\n \"color:#83aaff;font-weight:bold;\",\n \"color:#fff;font-weight:bold;\",\n \"color:#7fff9e\",\n \"color:#85baff\",\n \"color:#ffdfa3\"\n );\n }\n\n this.dependencyManager.markResolvedNodes(node);\n\n const nextEvaluationPlan =\n this.dependencyManager.buildEvaluationOrder(node);\n\n this.dependencyManager.updateResolvedSCCs(nextEvaluationPlan);\n\n precalculatedPlan = nextEvaluationPlan;\n\n // Check if new dependencies were discovered during evaluation\n if (nextEvaluationPlan.hash !== evaluationPlan.hash) {\n requiresReRun = true;\n } else {\n this.isEvaluating = false;\n return;\n }\n }\n this.isEvaluating = false;\n }\n\n convertScalarValueToCellValue(val: SerializedCellValue): CellValue {\n if (val === \"INFINITY\") {\n return { type: \"infinity\", sign: \"positive\" };\n }\n if (val === \"-INFINITY\") {\n return { type: \"infinity\", sign: \"negative\" };\n }\n if (typeof val === \"number\") {\n return { type: \"number\", value: val };\n }\n if (typeof val === \"boolean\") {\n return { type: \"boolean\", value: val };\n }\n if (typeof val === \"undefined\") {\n return { type: \"string\", value: \"\" };\n }\n return { type: \"string\", value: val };\n }\n\n // todo optimize using workbook manager\n canSpill(spillCandidate: CellAddress, spillArea: SpreadsheetRange): boolean {\n // Check if the spill origin cell is inside a table - spilling formulas cannot exist in tables\n if (this.tableManager.isCellInTable(spillCandidate)) {\n return false;\n }\n\n // Check if the spill area would intersect with any table - formulas cannot spill into tables\n if (\n this.tableManager.doesRangeIntersectTable(\n spillCandidate.workbookName,\n spillCandidate.sheetName,\n spillArea\n )\n ) {\n return false;\n }\n\n const sheet = this.workbookManager.getSheet(spillCandidate);\n if (!sheet) {\n throw new SheetNotFoundError(spillCandidate.sheetName);\n }\n const cellId = getCellReference(spillCandidate);\n const content = sheet.content.get(cellId);\n if (!content) {\n throw new EvaluationError(FormulaError.REF, `Cell not found: ${cellId}`);\n }\n for (const spilledValue of this.dependencyManager.spilledValues) {\n if (\n spilledValue.origin.workbookName !== spillCandidate.workbookName ||\n spilledValue.origin.sheetName !== spillCandidate.sheetName\n ) {\n continue;\n }\n if (\n spilledValue.origin.colIndex === spillCandidate.colIndex &&\n spilledValue.origin.rowIndex === spillCandidate.rowIndex\n ) {\n // we are already have a spill, this one will be replaced\n continue;\n }\n\n if (checkRangeIntersection(spillArea, spilledValue.spillOnto)) {\n return false;\n }\n }\n // let's just check the raw data if there is something in the range\n for (const key of sheet.content.keys()) {\n const cellAddress = parseCellReference(key);\n const endCol = spillArea.end.col;\n const endRow = spillArea.end.row;\n\n if (\n cellAddress.colIndex === spillCandidate.colIndex &&\n cellAddress.rowIndex === spillCandidate.rowIndex\n ) {\n continue;\n }\n\n if (endCol.type === \"number\" && endRow.type === \"number\") {\n if (\n cellAddress.colIndex >= spillArea.start.col &&\n cellAddress.colIndex <= endCol.value &&\n cellAddress.rowIndex >= spillArea.start.row &&\n cellAddress.rowIndex <= endRow.value\n ) {\n if (\n normalizeSerializedCellValue(sheet.content.get(key)) !== undefined\n ) {\n // there is something in the range, so we can't spill\n return false;\n }\n }\n }\n }\n\n return true;\n }\n\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n\n const nodeKey = cellAddressToKey(cellAddress);\n const node = this.dependencyManager.getCellValueOrEmptyCellNode(nodeKey);\n\n const sheet = this.workbookManager.getSheet(cellAddress);\n if (!sheet) {\n throw new SheetNotFoundError(cellAddress.sheetName);\n }\n\n if (node.evaluationResult.type === \"awaiting-evaluation\") {\n // if (cellAddressToKey(cellAddress).includes(\"G10\")) {\n // console.group(\"Evaluation of G10\");\n // flags.isProfiling = true;\n // console.time(\"Evaluation of G10\");\n // console.profile(\"Evaluation of G10\");\n // }\n this.evaluateCell(node);\n // if (flags.isProfiling) {\n // flags.isProfiling = false;\n // console.timeEnd(\"Evaluation of G10\");\n // console.profileEnd(\"Evaluation of G10\");\n // console.groupEnd();\n // }\n }\n\n const result = node.evaluationResult;\n\n return result;\n }\n}\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAsB,IAAtB;AACkC,IAAlC;AAC8B,IAA9B;AACkC,IAAlC;AAIO,IAHP;AAIoC,IAApC;AAC6C,IAA7C;AAeO,IAbP;AAyBO,IAXP;AAc8B,IAA9B;AACwC,IAAxC;AAGqC,IAArC;AACuC,IAAvC;AAAA;AAaO,MAAM,kBAAkB;AAAA,EAInB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EANF,eAAe;AAAA,EAEvB,WAAW,CACD,iBACA,cACA,kBACA,mBACR;AAAA,IAJQ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAGV,oBAAoB,GAAS;AAAA,IAC3B,KAAK,kBAAkB,qBAAqB;AAAA;AAAA,EAGtC,aAAa,CACnB,WACA,QACA,UAA+B,IAAI,KAC1B;AAAA,IACT,IAAI,cAAc,QAAQ;AAAA,MACxB,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,QAAQ,IAAI,SAAS,GAAG;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,IACA,QAAQ,IAAI,SAAS;AAAA,IAErB,WAAW,OAAO,UAAU,gBAAgB,GAAG;AAAA,MAC7C,IAAI,KAAK,cAAc,KAAK,QAAQ,OAAO,GAAG;AAAA,QAC5C,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAGT,sBAAsB,CAAC,WAAuC;AAAA,IAC5D,KAAK,kBAAkB,uBAAuB,SAAS;AAAA;AAAA,EAGzD,iCAAiC,CAC/B,YACA,aACA,OACqB;AAAA,IACrB,IACE,WAAW,SAAS,WACpB,WAAW,SAAS,uBACpB;AAAA,MACA,MAAM,QAAQ,WAAW;AAAA,MAEzB,OAAO,MAAM,SAAS,aAClB,MAAM,SAAS,aACb,aACA,cACF,MAAM;AAAA,IACZ;AAAA,IAEA,IAAI,WAAW,SAAS,uBAAuB;AAAA,MAC7C,OACE,WAAW,WAAW,MACtB,gCACA,WAAW,WAAW;AAAA,IAE1B;AAAA,IAEA,IAAI,OAAO;AAAA,MACT,MAAM,aAAa,WAAW,WAAW;AAAA,MACzC,IAAI,eAAe,8BAAiB,WAAW,GAAG;AAAA,QAChD,OAAO,WAAW,MAAM,MAAM,WAAW;AAAA,MAC3C;AAAA,MACA,OACE,WAAW,MACX,SACA,WAAW,WAAW,MACtB,MACA,WAAW;AAAA,IAEf;AAAA,IAEA,OAAO,WAAW;AAAA;AAAA,EAGZ,mBAAmB,CACzB,MACa;AAAA,IACb,IAAI,iBAAiB,MAAM;AAAA,MACzB,OAAO,KAAK;AAAA,IACd;AAAA,IAEA,MAAM,oBAAoB,KAAK,qBAAqB;AAAA,IACpD,OAAO;AAAA,MACL,cAAc,kBAAkB,gBAAgB;AAAA,MAChD,WAAW,kBAAkB,aAAa;AAAA,MAC1C,UAAU,kBAAkB,YAAY;AAAA,MACxC,UAAU,kBAAkB,YAAY;AAAA,IAC1C;AAAA;AAAA,EAGM,sCAAsC,CAC5C,YACA,mBACyC;AAAA,IACzC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,WAAW;AAAA,MAChB,SAAS,WAAW;AAAA,MACpB,cAAc,kBAAkB,WAAW,UAAU;AAAA,MACrD,YAAY,WAAW;AAAA,IACzB;AAAA;AAAA,EAGF,uCAAuC,CACrC,YACA,mBACsD;AAAA,IACtD,IAAI,WAAW,SAAS,uBAAuB;AAAA,MAC7C;AAAA,IACF;AAAA,IAEA,IAAI,WAAW,SAAS,SAAS;AAAA,MAC/B,OAAO,KAAK,uCACV,YACA,iBACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,WAAW;AAAA,MACnB,YAAY,WAAW;AAAA,IACzB;AAAA;AAAA,EAGF,yCAAyC,CACvC,YACA,uBACwB;AAAA,IACxB,IAAI,WAAW,SAAS,SAAS;AAAA,MAC/B,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,WAAW;AAAA,QAChB,SAAS,WAAW;AAAA,QACpB,YAAY,sBAAsB,WAAW,YAAY;AAAA,QACzD,YAAY,WAAW;AAAA,MACzB;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,WAAW;AAAA,MACnB,YAAY,WAAW;AAAA,IACzB;AAAA;AAAA,EAGF,uCAAuC,CACrC,YACA,mBACsD;AAAA,IACtD,IAAI,WAAW,SAAS,uBAAuB;AAAA,MAC7C;AAAA,IACF;AAAA,IAEA,IAAI,WAAW,SAAS,SAAS;AAAA,MAC/B,OAAO,KAAK,uCACV,YACA,iBACF;AAAA,IACF;AAAA,IAEA,MAAM,SAAgD,CAAC;AAAA,IACvD,WAAW,SAAS,WAAW,QAAQ;AAAA,MACrC,MAAM,aAAa,KAAK,wCACtB,MAAM,QACN,iBACF;AAAA,MACA,IAAI,CAAC,YAAY;AAAA,QACf;AAAA,MACF;AAAA,MACA,OAAO,KAAK;AAAA,QACV,aAAa,MAAM;AAAA,QACnB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA;AAAA,EAGF,yCAAyC,CACvC,YACA,uBACwB;AAAA,IACxB,IAAI,WAAW,SAAS,SAAS;AAAA,MAC/B,OAAO,KAAK,0CACV,YACA,qBACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,WAAW,OAAO,IAAI,CAAC,WAAW;AAAA,QACxC,aAAa,MAAM;AAAA,QACnB,QAAQ,KAAK,0CACX,MAAM,QACN,qBACF;AAAA,MACF,EAAE;AAAA,IACJ;AAAA;AAAA,EAGF,yCAAyC,CACvC,YACA,SAIwD;AAAA,IACxD,IAAI,WAAW,SAAS,kBAAkB;AAAA,MACxC,OAAO,KAAK,wCACV,YACA,QAAQ,iBACV;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,KAAK,oBAAoB,QAAQ,UAAU;AAAA,IAC1D,MAAM,YAAY,WAAW,UAAU,MAAM;AAAA,IAC7C,MAAM,oBAAoB,8BAAiB,WAAW;AAAA,MACpD,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,IACnB,CAAC;AAAA,IAED,IAAI,WAAW,aAAa;AAAA,MAC1B,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,WAAW;AAAA,UACnB,YAAY,WAAW;AAAA,UACvB,aAAa,WAAW;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IACE,kBAAkB,MAAM,SAAS,YACjC,kBAAkB,OAAO,SAAS,UAClC;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,IAAI,4CAClB,KAAK,cACL,QAAQ,YACR,MACF;AAAA,IACA,MAAM,SAAgD,CAAC;AAAA,IAEvD,SAAS,IAAI,EAAG,IAAI,kBAAkB,OAAO,OAAO,KAAK;AAAA,MACvD,SAAS,IAAI,EAAG,IAAI,kBAAkB,MAAM,OAAO,KAAK;AAAA,QACtD,MAAM,SAAS,qCAAwB,QAAQ,YAAY,MACzD,WAAW,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,CACvC;AAAA,QACA,MAAM,aAAa,KAAK,wCACtB,QACA,QAAQ,iBACV;AAAA,QACA,IAAI,CAAC,YAAY;AAAA,UACf;AAAA,QACF;AAAA,QACA,OAAO,KAAK;AAAA,UACV,aAAa,EAAE,GAAG,EAAE;AAAA,UACpB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,WAAW;AAAA,QACnB,YAAY,WAAW;AAAA,QACvB,aAAa,WAAW;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EAGF,2CAA2C,CACzC,YACA,uBAC0B;AAAA,IAC1B,IAAI,WAAW,SAAS,kBAAkB;AAAA,MACxC,OAAO,KAAK,0CACV,YACA,qBACF;AAAA,IACF;AAAA,IAEA,MAAM,gBAAgB,WAAW;AAAA,IACjC,IAAI,cAAc,SAAS,gBAAgB;AAAA,MACzC,MAAM,SAAS,IAAI,IACjB,cAAc,OAAO,IAAI,CAAC,UAAU;AAAA,QAClC,GAAG,MAAM,YAAY,KAAK,MAAM,YAAY;AAAA,QAC5C,KAAK,0CACH,MAAM,QACN,qBACF;AAAA,MACF,CAAC,CACH;AAAA,MAEA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,cAAc;AAAA,QACtB,YAAY,cAAc;AAAA,QAC1B,aAAa,cAAc;AAAA,QAC3B,WAAW,CAAC,WACV,8BAAiB,cAAc,mBAAmB;AAAA,UAChD,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO;AAAA,QACnB,CAAC;AAAA,QACH,UAAU,CAAC,gBACT,OAAO,IAAI,GAAG,YAAY,KAAK,YAAY,GAAG,KAAK;AAAA,UACjD,MAAM;AAAA,UACN,QAAQ,KAAK,8BAA8B,EAAE;AAAA,QAC/C;AAAA,QACF,kBAAkB,OAAO;AAAA,UACvB,MAAM;AAAA,UACN,QAAQ,cAAc,OAAO,IAAI,CAAC,WAAW;AAAA,YAC3C,aAAa,MAAM;AAAA,YACnB,QAAQ,KAAK,0CACX,MAAM,QACN,qBACF;AAAA,UACF,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,cAAc;AAAA,MACtB,YAAY,cAAc;AAAA,MAC1B,aAAa,cAAc;AAAA,MAC3B,WAAW,CAAC,WACV,8BAAiB,cAAc,mBAAmB;AAAA,QAChD,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,MACH,UAAU,CAAC,aAAa,YAAY;AAAA,QAClC,MAAM,cAA2B;AAAA,UAC/B,cAAc,cAAc,YAAY;AAAA,UACxC,WAAW,cAAc,YAAY;AAAA,UACrC,UAAU,cAAc,YAAY,MAAM,MAAM,MAAM,YAAY;AAAA,UAClE,UAAU,cAAc,YAAY,MAAM,MAAM,MAAM,YAAY;AAAA,QACpE;AAAA,QAEA,MAAM,WAAW,KAAK,kBAAkB,4BACtC,8BAAiB,WAAW,CAC9B;AAAA,QACA,QAAQ,eAAe,cAAc,QAAQ;AAAA,QAC7C,OAAO,SAAS;AAAA;AAAA,MAElB,kBAAkB,GAAG,cAAc,SAAS,aAAa;AAAA,QACvD,IAAI,QAAQ,cAAc,YAAY;AAAA,QACtC,IAAI,cAAc;AAAA,UAChB,MAAM,gBAAgB,8BAAiB,cAAc,MAAM;AAAA,UAC3D,MAAM,wBAAwB,8BAAiB,eAAe;AAAA,YAC5D,UAAU,cAAc,YAAY,MAAM,MAAM;AAAA,YAChD,UAAU,cAAc,YAAY,MAAM,MAAM;AAAA,UAClD,CAAC;AAAA,UACD,MAAM,YAAY,kCAChB,cAAc,YAAY,OAC1B,qBACF;AAAA,UACA,IAAI,WAAW;AAAA,YACb,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QAEA,MAAM,eAAe;AAAA,UACnB,cAAc,cAAc,YAAY;AAAA,UACxC,WAAW,cAAc,YAAY;AAAA,UACrC;AAAA,QACF;AAAA,QAEA,MAAM,YAAY,KAAK,kBAAkB,aACvC,+BAAkB,YAAY,CAChC;AAAA,QACA,QAAQ,eAAe,cAAc,SAAS;AAAA,QAC9C,OAAO,UAAU;AAAA;AAAA,IAErB;AAAA;AAAA,EAGF,0CAA0C,CACxC,YACA,SAIyD;AAAA,IACzD,IAAI,WAAW,SAAS,kBAAkB;AAAA,MACxC,OAAO,EAAE,MAAM,iBAAiB;AAAA,IAClC;AAAA,IAEA,IAAI,WAAW,SAAS,SAAS;AAAA,MAC/B,OAAO,KAAK,uCACV,YACA,QAAQ,iBACV;AAAA,IACF;AAAA,IAEA,MAAM,aAAa,KAAK,0CACtB,YACA,OACF;AAAA,IACA,IAAI,CAAC,cAAc,WAAW,SAAS,kBAAkB;AAAA,MACvD;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAGT,4CAA4C,CAC1C,YACA,uBACmC;AAAA,IACnC,IAAI,WAAW,SAAS,kBAAkB;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,WAAW,SAAS,SAAS;AAAA,MAC/B,OAAO,KAAK,0CACV,YACA,qBACF;AAAA,IACF;AAAA,IAEA,OAAO,KAAK,4CACV,YACA,qBACF;AAAA;AAAA,EAGF,iBAAiB,CAAC,MAAqC;AAAA,IACrD,IAAI,KAAK,UAAU;AAAA,MACjB,MAAM,SAAS,KAAK;AAAA,MACpB,IAAI,UAAU,OAAO,SAAS,uBAAuB;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,kBAAkB,eAAe,IAAI;AAAA,IAC1C,KAAK,uBAAuB;AAAA,IAE5B,MAAM,MAAM,IAAI,4CACd,KAAK,cACL,MACA,KAAK,WACP;AAAA,IACA,MAAM,YAAY,KAAK,kBAAkB,cAAc,KAAK,WAAW;AAAA,IAEvE,IAAI,WAAW;AAAA,MAEb,MAAM,cAAc,KAAK,kBAAkB,kBACzC,KAAK,aACL,SACF;AAAA,MACA,MAAM,iBAAiB,8BAAiB,UAAU,MAAM,EAAE,QACxD,WACA,aACF;AAAA,MACA,MAAM,gBACJ,KAAK,kBAAkB,iBAAiB,cAAc;AAAA,MACxD,KAAK,cAAc,aAAa;AAAA,MAChC,MAAM,SAAS,cAAc;AAAA,MAC7B,IAAI,OAAO,SAAS,kBAAkB;AAAA,QAEpC,MAAM,aAAa,qCAAwB,eAAe,MAAM;AAAA,UAC9D,OAAO,OAAO,SAAS,YAAY,aAAa,GAAG;AAAA,SACpD;AAAA,QACD,KAAK,oBAAoB,UAAU;AAAA,MACrC;AAAA,IACF,EAAO;AAAA,MAEL,KAAK,4BAA4B;AAAA,MAEjC,MAAM,mBAA2C;AAAA,QAC/C,MAAM;AAAA,QACN,QAAQ,KAAK,8BAA8B,EAAE;AAAA,MAC/C;AAAA,MAEA,KAAK,oBAAoB,gBAAgB;AAAA;AAAA,IAG3C,KAAK,kBAAkB,aAAa,IAAI;AAAA;AAAA,EAG1C,iBAAiB,CAAC,MAAiC;AAAA,IACjD,IAAI,KAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,KAAK,kBAAkB,eAAe,IAAI;AAAA,IAC1C,KAAK,uBAAuB;AAAA,IAE5B,MAAM,SAAS,qCAAwB,MAAM,MAA8B;AAAA,MACzE,KAAK,4BAA4B;AAAA,MAEjC,MAAM,YAAY,KAAK,kBAAkB;AAAA,MACzC,MAAM,qBAAqB,IAAI;AAAA,MAC/B,MAAM,0BAA0B,CAAC,cAA8B;AAAA,QAC7D,MAAM,SAAS,mBAAmB,IAAI,SAAS;AAAA,QAC/C,IAAI,WAAW,WAAW;AAAA,UACxB,OAAO;AAAA,QACT;AAAA,QAKA,MAAM,aAAa,KAAK,cAAc,WAAW,IAAI;AAAA,QACrD,mBAAmB,IAAI,WAAW,UAAU;AAAA,QAC5C,OAAO;AAAA;AAAA,MAGT,MAAM,UAA+B,CAAC;AAAA,MAEtC,WAAW,SAAS,WAAW;AAAA,QAC7B,IAAI,MAAM,SAAS,SAAS;AAAA,UAC1B,IAAI,wBAAwB,MAAM,IAAI,GAAG;AAAA,YACvC;AAAA,UACF;AAAA,UAEA,MAAM,eAAe,MAAM;AAAA,UAC3B,MAAM,UAAS,MAAM,KAAK;AAAA,UAE1B,MAAM,cAAc;AAAA,YAClB,GAAG,aAAa,WAAW,KAAK,QAAQ,MAAM,MAAM;AAAA,YACpD,GAAG,aAAa,WAAW,KAAK,QAAQ,MAAM,MAAM;AAAA,UACtD;AAAA,UAEA,QAAQ,KAAK,EAAE,QAAQ,SAAQ,YAAY,CAAC;AAAA,QAC9C,EAAO,SACL,MAAM,SAAS,gBACf,MAAM,SAAS,eACf;AAAA,UACA,WAAW,iBAAiB,MAAM,YAAY;AAAA,YAC5C,IAAI,wBAAwB,aAAa,GAAG;AAAA,cAC1C;AAAA,YACF;AAAA,YAEA,IAAI,cAAc,iBAAiB,SAAS,kBAAkB;AAAA,cAC5D,MAAM,YAAY,cAAc,iBAAiB,UAC/C,cAAc,WAChB;AAAA,cACA,IAAI,MAAM,SAAS,eAAe;AAAA,gBAChC,MAAM,aAAa,oCACjB,WACA,MAAM,QAAQ,KAChB;AAAA,gBACA,IAAI,YAAY;AAAA,kBAUd,MAAM,MAAM,IAAI,4CACd,KAAK,cACL,MACA,cAAc,WAChB;AAAA,kBACA,MAAM,iBACJ,cAAc,iBAAiB,iBAAiB,KAC9C,KAAK,kBACL;AAAA,oBACE,SAAS;AAAA,oBACT,UAAU,cAAc,iBAAiB;AAAA,oBACzC,cAAc,MAAM,QAAQ;AAAA,oBAC5B,QAAQ,cAAc;AAAA,oBACtB,aAAa;AAAA,kBACf,CACF;AAAA,kBAEF,IAAI,eAAe,SAAS,UAAU;AAAA,oBACpC,QAAQ,KAAK,GAAG,eAAe,MAAM;AAAA,kBACvC,EAAO;AAAA,oBACL,OAAO;AAAA;AAAA,gBAEX;AAAA,cACF,EAAO;AAAA,gBACL,MAAM,aAAa,2BAAc,MAAM,SAAS,SAAS;AAAA,gBACzD,IAAI,YAAY;AAAA,kBAWd,MAAM,cAAc;AAAA,oBAClB,GACE,MAAM,QAAQ,WACd,cAAc,YAAY;AAAA,oBAC5B,GACE,MAAM,QAAQ,WACd,cAAc,YAAY;AAAA,kBAC9B;AAAA,kBACA,MAAM,MAAM,IAAI,4CACd,KAAK,cACL,MACA,cAAc,WAChB;AAAA,kBACA,MAAM,gBAAgB,cAAc,iBAAiB,SACnD,aACA,GACF;AAAA,kBAEA,QAAQ,KAAK;AAAA,oBACX,aAAa;AAAA,sBACX,GAAG,MAAM,QAAQ,WAAW,KAAK,QAAQ,MAAM,MAAM;AAAA,sBACrD,GAAG,MAAM,QAAQ,WAAW,KAAK,QAAQ,MAAM,MAAM;AAAA,oBACvD;AAAA,oBACA,QAAQ;AAAA,kBACV,CAAC;AAAA,gBACH;AAAA;AAAA,YAEJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,KACD;AAAA,IAED,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,kBAAkB,aAAa,IAAI;AAAA;AAAA,EAG1C,gBAAgB,CACd,MACM;AAAA,IAEN,IAAI,KAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,IAAI,EAAE,gBAAgB,sDAAuB;AAAA,MAC3C,KAAK,kBAAkB,eAAe,IAAI;AAAA,IAC5C;AAAA,IACA,KAAK,uBAAuB;AAAA,IAE5B,MAAM,MAAM,IAAI,4CACd,KAAK,cACL,MACA,KAAK,WACP;AAAA,IAEA,IAAI,gBAAgB,wCAAiB,KAAK,WAAW;AAAA,MAInD,MAAM,cAAc,KAAK;AAAA,MACzB,IAAI,YAAY,iBAAiB,SAAS,kBAAkB;AAAA,QAC1D,MAAM,SAAS,YAAY,iBAAiB,SAC1C,EAAE,GAAG,GAAG,GAAG,EAAE,GACb,GACF;AAAA,QACA,KAAK,oBAAoB,MAAM;AAAA,QAC/B,KAAK,kBAAkB,aAAa,IAAI;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,IAAI,gBAAgB,qDAAsB;AAAA,QACxC,UAAU,KAAK;AAAA,MACjB,EAAO;AAAA,QACL,UAAU,KAAK,gBAAgB,uBAAuB,KAAK,WAAW;AAAA;AAAA,MAExE,OAAO,KAAK;AAAA,MACZ,MAAM,mBAA0C;AAAA,QAC9C,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MACA,KAAK,oBAAoB,gBAAgB;AAAA,MACzC,IAAI,EAAE,gBAAgB,sDAAuB;AAAA,QAC3C,KAAK,kBAAkB,aAAa,IAAI;AAAA,MAC1C;AAAA,MACA;AAAA;AAAA,IAGF,IAAI,OAAO,YAAY,YAAY,CAAC,QAAQ,WAAW,GAAG,GAAG;AAAA,MAC3D,IAAI,gBAAgB,sCAAe;AAAA,QACjC,KAAK,oBAAoB;AAAA,UACvB,MAAM;AAAA,QACR,CAAC;AAAA,QACD,KAAK,kBAAkB,aAAa,IAAI;AAAA,QACxC;AAAA,MACF;AAAA,MAEA,MAAM,SAAgC;AAAA,QACpC,MAAM;AAAA,QACN,QAAQ,KAAK,8BAA8B,OAAO;AAAA,MACpD;AAAA,MACA,KAAK,oBAAoB,MAAM;AAAA,MAC/B,IAAI,EAAE,gBAAgB,sDAAuB;AAAA,QAC3C,KAAK,kBAAkB,aAAa,IAAI;AAAA,MAC1C;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,aAAuC,qCACzC,MACA,MAAM,KAAK,iBAAiB,gBAAgB,QAAQ,MAAM,CAAC,GAAG,GAAG,CACnE;AAAA,IAGA,IAAI,WAAW,SAAS,kBAAkB;AAAA,MACxC,MAAM,YAAY,WAAW,UAAU,KAAK,WAAW;AAAA,MAEvD,IAAI,CAAC,KAAK,SAAS,KAAK,aAAa,SAAS,GAAG;AAAA,QAE/C,aAAa;AAAA,UACX,MAAM;AAAA,UACN,KAAK,0BAAa;AAAA,UAClB,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,MACF,EAAO;AAAA,QAEL,KAAK,kBAAkB,gBAAgB,KAAK,KAAK;AAAA,UAC/C,WAAW;AAAA,UACX,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA;AAAA,MAIH,IAAI,gBAAgB,sCAAe;AAAA,QAGjC,KAAK,oBAAoB,UAAU;AAAA,QACnC,KAAK,kBAAkB,aAAa,IAAI;AAAA,MAC1C,EAAO;AAAA,QACL,MAAM,gBAAgB,KAAK,kBAAkB,iBAC3C,KAAK,IAAI,QAAQ,WAAW,aAAa,CAC3C;AAAA,QAEA,KAAK,cAAc,aAAa;AAAA,QAChC,KAAK,iBAAiB,aAAa;AAAA,QACnC,cAAc,oBAAoB,UAAU;AAAA,QAC5C,KAAK,kBAAkB,aAAa,aAAa;AAAA,QAEjD,IAAI,WAAW,SAAS,kBAAkB;AAAA,UACxC,MAAM,eAAe,WAAW,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG;AAAA,UAC5D,KAAK,oBAAoB,YAAY;AAAA,QACvC,EAAO;AAAA,UAEL,KAAK,oBAAoB,UAAU;AAAA;AAAA;AAAA,MAGvC,IAAI,EAAE,gBAAgB,sDAAuB;AAAA,QAC3C,KAAK,kBAAkB,aAAa,IAAI;AAAA,MAC1C;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,WAAW,SAAS,SAAS;AAAA,MAC/B,IAAI,gBAAgB,sCAAe;AAAA,QACjC,KAAK,oBAAoB;AAAA,UACvB,MAAM;AAAA,QACR,CAAC;AAAA,QACD,KAAK,kBAAkB,aAAa,IAAI;AAAA,QACxC;AAAA,MACF,EAAO;AAAA,QACL,KAAK,oBAAoB,UAAU;AAAA,QACnC,IAAI,EAAE,gBAAgB,sDAAuB;AAAA,UAC3C,KAAK,kBAAkB,aAAa,IAAI;AAAA,QAC1C;AAAA,QACA;AAAA;AAAA,IAEJ;AAAA,IAEA,KAAK,oBAAoB,UAAU;AAAA,IACnC,IAAI,EAAE,gBAAgB,sDAAuB;AAAA,MAC3C,KAAK,kBAAkB,aAAa,IAAI;AAAA,IAC1C;AAAA;AAAA,EAGF,sBAAsB,CAAC,YAAkC;AAAA,IACvD,IAAI,sBAAsB,2DAAyB;AAAA,MACjD,KAAK,kBAAkB,UAAU;AAAA,MACjC;AAAA,IACF;AAAA,IACA,IAAI,sBAAsB,kDAAqB;AAAA,MAC7C,KAAK,kBAAkB,UAAU;AAAA,MACjC;AAAA,IACF;AAAA,IACA,IACE,sBAAsB,wCACtB,sBAAsB,qDACtB;AAAA,MACA,KAAK,iBAAiB,UAAU;AAAA,MAChC;AAAA,IACF;AAAA,IACA,IAAI,sBAAsB,8CAAmB;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,IAAI,sBAAsB,wDAAwB;AAAA,MAChD;AAAA,IACF;AAAA,IACA,IAAI,sBAAsB,sCAAe;AAAA,MACvC,KAAK,iBAAiB,UAAU;AAAA,MAChC;AAAA,IACF;AAAA,IACA,MAAM,IAAI,MAAM,yBAA0B,WAAmB,GAAG;AAAA;AAAA,EAMlE,eAAe,CAIb,WACA,aACqB;AAAA,IACrB,IAAI,KAAK,cAAc;AAAA,MACrB,MAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAAA,IAEA,MAAM,OAAO,KAAK,kBAAkB,wBAClC,aACA,SACF;AAAA,IAEA,IAAI,KAAK,iBAAiB,SAAS,uBAAuB;AAAA,MACxD,KAAK,aAAa,IAAI;AAAA,IACxB;AAAA,IAEA,MAAM,SAAS,KAAK;AAAA,IAEpB,OAAO,KAAK,kCAAkC,QAAQ,WAAW;AAAA;AAAA,EAMnE,YAAY,CACV,MACM;AAAA,IACN,IAAI,KAAK,cAAc;AAAA,MACrB,MAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAAA,IACA,KAAK,eAAe;AAAA,IAEpB,IAAI;AAAA,IAEJ,IAAI,gBAAgB;AAAA,IACpB,OAAO,eAAe;AAAA,MACpB,gBAAgB;AAAA,MAGhB,MAAM,iBACJ,qBAAqB,KAAK,kBAAkB,qBAAqB,IAAI;AAAA,MAEvE,IAAI,eAAe,UAAU;AAAA,QAC3B,MAAM,mBAA0C;AAAA,UAC9C,MAAM;AAAA,UACN,KAAK,0BAAa;AAAA,UAClB,SAAS,MAAM,KAAK,eAAe,cAAc,CAAC,CAAC,EAChD,IAAI,CAAC,UAAS,MAAK,GAAG,EACtB,KAAK,MAAM;AAAA,UACd,YAAY;AAAA,QACd;AAAA,QAEA,IAAI,eAAe,YAAY;AAAA,UAC7B,WAAW,SAAQ,eAAe,YAAY;AAAA,YAC5C,IACE,EAAE,iBAAgB,qDAClB,EAAE,iBAAgB,yDAClB;AAAA,cACA,MAAK,oBAAoB,gBAAgB;AAAA,YAC3C;AAAA,UACF;AAAA,QACF;AAAA,QACA,KAAK,eAAe;AAAA,MACtB;AAAA,MAGA,MAAM,YAAY,YAAY,IAAI;AAAA,MAClC,MAAM,YAAiD,CAAC;AAAA,MACxD,IAAI,cAAc;AAAA,MAClB,IAAI,mBAAM,eAAe,eAAe,gBAAgB,OAAO,IAAI,CAEnE;AAAA,MACA,eAAe,gBAAgB,QAAQ,CAAC,eAAe;AAAA,QACrD,MAAM,QAAQ,YAAY,IAAI;AAAA,QAC9B,IAAI,WAAW,UAAU;AAAA,UACvB;AAAA,QACF;AAAA,QACA,KAAK,uBAAuB,UAAU;AAAA,QAEtC,MAAM,MAAM,YAAY,IAAI;AAAA,QAC5B,IAAI,mBAAM,eAAe,eAAe,gBAAgB,OAAO,IAAI;AAAA,UACjE,UAAU,KAAK,EAAE,UAAU,MAAM,OAAO,KAAK,WAAW,IAAI,CAAC;AAAA,QAC/D;AAAA,OACD;AAAA,MACD,IAAI,mBAAM,eAAe,eAAe,gBAAgB,OAAO,IAAI,CAEnE;AAAA,MACA,IAAI,mBAAM,eAAe,eAAe,gBAAgB,OAAO,IAAI;AAAA,QACjE,MAAM,kBAAkB,KAAK,MAC1B,MAAM,cAAe,eAAe,gBAAgB,IACvD;AAAA,QACA,MAAM,cACJ,UAAU,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,UAAU,CAAC,IAAI,UAAU,UAAU;AAAA,QACtE,QAAQ,IACN,oBAAoB,eAAe,gBAAgB,kBACjD,YAAY,IAAI,IAAI,WACpB,QACA,CACF,WAAW,iCAAiC,YAAY,QACtD,CACF,WACA,mCACA,gCACA,iBACA,iBACA,eACF;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB,kBAAkB,IAAI;AAAA,MAE7C,MAAM,qBACJ,KAAK,kBAAkB,qBAAqB,IAAI;AAAA,MAElD,KAAK,kBAAkB,mBAAmB,kBAAkB;AAAA,MAE5D,oBAAoB;AAAA,MAGpB,IAAI,mBAAmB,SAAS,eAAe,MAAM;AAAA,QACnD,gBAAgB;AAAA,MAClB,EAAO;AAAA,QACL,KAAK,eAAe;AAAA,QACpB;AAAA;AAAA,IAEJ;AAAA,IACA,KAAK,eAAe;AAAA;AAAA,EAGtB,6BAA6B,CAAC,KAAqC;AAAA,IACjE,IAAI,QAAQ,YAAY;AAAA,MACtB,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC9C;AAAA,IACA,IAAI,QAAQ,aAAa;AAAA,MACvB,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC9C;AAAA,IACA,IAAI,OAAO,QAAQ,UAAU;AAAA,MAC3B,OAAO,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,IACtC;AAAA,IACA,IAAI,OAAO,QAAQ,WAAW;AAAA,MAC5B,OAAO,EAAE,MAAM,WAAW,OAAO,IAAI;AAAA,IACvC;AAAA,IACA,IAAI,OAAO,QAAQ,aAAa;AAAA,MAC9B,OAAO,EAAE,MAAM,UAAU,OAAO,GAAG;AAAA,IACrC;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA;AAAA,EAItC,QAAQ,CAAC,gBAA6B,WAAsC;AAAA,IAE1E,IAAI,KAAK,aAAa,cAAc,cAAc,GAAG;AAAA,MACnD,OAAO;AAAA,IACT;AAAA,IAGA,IACE,KAAK,aAAa,wBAChB,eAAe,cACf,eAAe,WACf,SACF,GACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,QAAQ,KAAK,gBAAgB,SAAS,cAAc;AAAA,IAC1D,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,2CAAmB,eAAe,SAAS;AAAA,IACvD;AAAA,IACA,MAAM,SAAS,8BAAiB,cAAc;AAAA,IAC9C,MAAM,UAAU,MAAM,QAAQ,IAAI,MAAM;AAAA,IACxC,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,IAAI,wCAAgB,0BAAa,KAAK,mBAAmB,QAAQ;AAAA,IACzE;AAAA,IACA,WAAW,gBAAgB,KAAK,kBAAkB,eAAe;AAAA,MAC/D,IACE,aAAa,OAAO,iBAAiB,eAAe,gBACpD,aAAa,OAAO,cAAc,eAAe,WACjD;AAAA,QACA;AAAA,MACF;AAAA,MACA,IACE,aAAa,OAAO,aAAa,eAAe,YAChD,aAAa,OAAO,aAAa,eAAe,UAChD;AAAA,QAEA;AAAA,MACF;AAAA,MAEA,IAAI,oCAAuB,WAAW,aAAa,SAAS,GAAG;AAAA,QAC7D,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,WAAW,OAAO,MAAM,QAAQ,KAAK,GAAG;AAAA,MACtC,MAAM,cAAc,gCAAmB,GAAG;AAAA,MAC1C,MAAM,SAAS,UAAU,IAAI;AAAA,MAC7B,MAAM,SAAS,UAAU,IAAI;AAAA,MAE7B,IACE,YAAY,aAAa,eAAe,YACxC,YAAY,aAAa,eAAe,UACxC;AAAA,QACA;AAAA,MACF;AAAA,MAEA,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AAAA,QACxD,IACE,YAAY,YAAY,UAAU,MAAM,OACxC,YAAY,YAAY,OAAO,SAC/B,YAAY,YAAY,UAAU,MAAM,OACxC,YAAY,YAAY,OAAO,OAC/B;AAAA,UACA,IACE,8CAA6B,MAAM,QAAQ,IAAI,GAAG,CAAC,MAAM,WACzD;AAAA,YAEA,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAGT,uBAAuB,CACrB,aACoC;AAAA,IACpC,IAAI,KAAK,cAAc;AAAA,MACrB,MAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAAA,IAEA,MAAM,UAAU,8BAAiB,WAAW;AAAA,IAC5C,MAAM,OAAO,KAAK,kBAAkB,4BAA4B,OAAO;AAAA,IAEvE,MAAM,QAAQ,KAAK,gBAAgB,SAAS,WAAW;AAAA,IACvD,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,2CAAmB,YAAY,SAAS;AAAA,IACpD;AAAA,IAEA,IAAI,KAAK,iBAAiB,SAAS,uBAAuB;AAAA,MAOxD,KAAK,aAAa,IAAI;AAAA,IAOxB;AAAA,IAEA,MAAM,SAAS,KAAK;AAAA,IAEpB,OAAO;AAAA;AAEX;",
8
- "debugId": "7E0EFD821724911064756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "82AA595E9C9D067964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -44,19 +44,23 @@ __export(exports_evaluation_context, {
44
44
  eligibleKeysForContext: () => eligibleKeysForContext,
45
45
  dependencyMatchesContext: () => dependencyMatchesContext,
46
46
  contextDependencyKeys: () => contextDependencyKeys,
47
+ NO_TABLE_CONTEXT_NAME: () => NO_TABLE_CONTEXT_NAME,
47
48
  EvaluationContext: () => EvaluationContext
48
49
  });
49
50
  module.exports = __toCommonJS(exports_evaluation_context);
51
+ var NO_TABLE_CONTEXT_NAME = "__no_current_table__";
50
52
 
51
53
  class EvaluationContext {
52
54
  _cellAddress;
53
55
  _tableName;
56
+ _cacheTableName;
54
57
  _dependencyNode;
55
58
  constructor(tableManager, dependencyNode, cellAddress) {
56
59
  this._dependencyNode = dependencyNode;
57
60
  this._cellAddress = cellAddress;
58
61
  const table = tableManager.isCellInTable(cellAddress);
59
62
  this._tableName = table?.name;
63
+ this._cacheTableName = table?.name ?? NO_TABLE_CONTEXT_NAME;
60
64
  }
61
65
  get dependencyNode() {
62
66
  return this._dependencyNode;
@@ -71,6 +75,9 @@ class EvaluationContext {
71
75
  get tableName() {
72
76
  return this._tableName;
73
77
  }
78
+ get cacheTableName() {
79
+ return this._cacheTableName;
80
+ }
74
81
  addContextDependency(...types) {
75
82
  for (const type of types) {
76
83
  switch (type) {
@@ -87,7 +94,7 @@ class EvaluationContext {
87
94
  this._contextDependency.sheetName = this._cellAddress.sheetName;
88
95
  break;
89
96
  case "table":
90
- this._contextDependency.tableName = this.tableName;
97
+ this._contextDependency.tableName = this.cacheTableName;
91
98
  break;
92
99
  default:
93
100
  throw new Error(`Invalid context dependency type: ${type}`);
@@ -136,18 +143,27 @@ function eligibleKeysForContext(ctx) {
136
143
  if (ctx.tableName === undefined && (mask >> tableIdx & 1) === 1)
137
144
  continue;
138
145
  const dep = {};
146
+ let specificity = 0;
139
147
  for (let i = 0;i < n; i++) {
140
148
  if ((mask >> i & 1) === 1) {
141
149
  const k = DIM_ORDER[i];
142
150
  const v = ctx[k];
143
- if (v !== undefined)
151
+ if (v !== undefined) {
144
152
  dep[k] = v;
153
+ specificity++;
154
+ }
145
155
  }
146
156
  }
147
- results.push(keyFromDependency(dep));
157
+ results.push({
158
+ key: keyFromDependency(dep),
159
+ specificity,
160
+ mask
161
+ });
148
162
  }
149
- contextCacheKey.set(mostRestrictiveKey, results);
150
- return results;
163
+ results.sort((left, right) => right.specificity - left.specificity || right.mask - left.mask);
164
+ const orderedKeys = results.map((result) => result.key);
165
+ contextCacheKey.set(mostRestrictiveKey, orderedKeys);
166
+ return orderedKeys;
151
167
  }
152
168
  function getContextDependencyKey(contextDependency) {
153
169
  const keys = [];
@@ -161,4 +177,4 @@ function getContextDependencyKey(contextDependency) {
161
177
  return keys.join(",");
162
178
  }
163
179
 
164
- //# debugId=010A8A123E9195BA64756E2164756E21
180
+ //# debugId=5F0D924C23ED7CD864756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/evaluator/evaluation-context.ts"],
4
4
  "sourcesContent": [
5
- "import type { DependencyNode } from \"../core/managers/dependency-node.cjs\";\nimport type { TableManager } from \"../core/managers/table-manager.cjs\";\nimport type { CellAddress } from \"../core/types.cjs\";\n\nexport class EvaluationContext {\n private _cellAddress: CellAddress;\n private _tableName: string | undefined;\n /**\n * Can be a range or a cell\n */\n private _dependencyNode: DependencyNode;\n constructor(\n tableManager: TableManager,\n dependencyNode: DependencyNode,\n cellAddress: CellAddress\n ) {\n this._dependencyNode = dependencyNode;\n this._cellAddress = cellAddress;\n const table = tableManager.isCellInTable(cellAddress);\n this._tableName = table?.name;\n }\n\n get dependencyNode() {\n return this._dependencyNode;\n }\n\n private _contextDependency: ContextDependency = {};\n\n getContextDependency() {\n return this._contextDependency;\n }\n\n /**\n * The cell context, the address of the cell being evaluated\n * and the context in which results should be stored\n */\n get cellAddress() {\n return this._cellAddress;\n }\n\n get tableName() {\n return this._tableName;\n }\n\n addContextDependency(...types: ContextDependencyType[]) {\n for (const type of types) {\n switch (type) {\n case \"row\":\n this._contextDependency.rowIndex = this._cellAddress.rowIndex;\n break;\n case \"col\":\n this._contextDependency.colIndex = this._cellAddress.colIndex;\n break;\n case \"workbook\":\n this._contextDependency.workbookName = this._cellAddress.workbookName;\n break;\n case \"sheet\":\n this._contextDependency.sheetName = this._cellAddress.sheetName;\n break;\n case \"table\":\n this._contextDependency.tableName = this.tableName;\n break;\n default:\n throw new Error(`Invalid context dependency type: ${type}`);\n }\n }\n }\n\n /**\n * When evaluating an AST node,\n * we need to append the subtree context\n * dependencies to the current context dependency\n */\n appendContextDependency(contextDependency: ContextDependency) {\n this._contextDependency = {\n ...this._contextDependency,\n ...Object.fromEntries(\n Object.entries(contextDependency).filter(\n ([key, value]) => value !== undefined\n )\n ),\n };\n }\n}\n\n/**\n * Each value has the same value as the origin cell\n * the defined keys are the ones the ast node is dependent on\n * e.g. A3=ROW() will have a context dependency of { rowIndex: 3 }\n *\n * The keys are ANDed together, e.g. { workbookName: \"Sheet1\", sheetName: \"Sheet2\" }\n * means the ast node is dependent on the workbook \"Sheet1\" and the sheet \"Sheet2\"\n */\nexport type ContextDependency = {\n workbookName?: string;\n sheetName?: string;\n tableName?: string;\n rowIndex?: number;\n colIndex?: number;\n};\n\nexport const contextDependencyKeys = [\n \"workbookName\",\n \"sheetName\",\n \"tableName\",\n \"rowIndex\",\n \"colIndex\",\n] as const;\n\n/**\n * These are some distinct scenarios where context dependencies are added\n */\nexport type ContextDependencyType =\n | \"row\"\n | \"col\"\n | \"workbook\"\n | \"sheet\"\n | \"table\";\n\n// * [astKey], // `=1+1`\n// * [astKey, sheetKey, workbookKey], // `B3`\n// * [astKey, workbookKey], // `Table1[Column1]`\n// * [astKey, workbookKey], // `Sheet1!B3`\n// * [astKey, cellAddress.rowIndex], // `ROW()`\n// * [astKey, cellAddress.colIndex], // `COL()`\n// * [astKey, cellAddress.rowIndex, cellAddress.colIndex] // `CELL(\"address\")`\n// * [astKey, tableKey, cellAddress.rowIndex], // `@Column1`\n// * [astKey, workbookKey, cellAddress.rowIndex], // `Table1[@Column1]`\n\ntype Dim = \"workbookName\" | \"sheetName\" | \"tableName\" | \"rowIndex\" | \"colIndex\";\nconst DIM_ORDER: readonly Dim[] = [\n \"workbookName\",\n \"sheetName\",\n \"tableName\",\n \"rowIndex\",\n \"colIndex\",\n] as const;\n\n/** Build the canonical cache key string for a dependency. */\nexport function keyFromDependency(dep: ContextDependency): string {\n return DIM_ORDER.map((k) =>\n dep[k] !== undefined ? `${k}:[${(dep as any)[k]}]` : `${k}:*`\n ).join(\",\");\n}\n\ntype Context = {\n workbookName: string;\n sheetName: string;\n tableName?: string;\n rowIndex: number;\n colIndex: number;\n};\n\n/** True if `dep` matches `ctx` (i.e., every specified field equals the context’s field). */\nexport function dependencyMatchesContext(\n ctx: Context,\n dep: ContextDependency\n): boolean {\n return DIM_ORDER.every(\n (k) => dep[k] === undefined || (dep as any)[k] === (ctx as any)[k]\n );\n}\n\nconst contextCacheKey = new Map<string, string[]>();\n\n/**\n * Generate every cache key that would be eligible for `ctx`.\n * By default returns keys ordered from most-specific to least-specific.\n */\nexport function eligibleKeysForContext(ctx: Context): string[] {\n const mostRestrictiveKey = keyFromDependency(ctx);\n const cachedKeys = contextCacheKey.get(mostRestrictiveKey);\n if (cachedKeys) {\n return cachedKeys;\n }\n\n const results: string[] = [];\n const n = DIM_ORDER.length;\n\n // If tableName is undefined in the context, the lookup is not modeling table\n // membership at all, so we cannot generate keys that specify it.\n const tableIdx = DIM_ORDER.indexOf(\"tableName\");\n\n const totalMasks = 1 << n; // 2^n\n for (let mask = 0; mask < totalMasks; mask++) {\n // Skip combos that specify tableName when ctx.tableName is undefined.\n if (ctx.tableName === undefined && ((mask >> tableIdx) & 1) === 1) continue;\n\n const dep: ContextDependency = {};\n for (let i = 0; i < n; i++) {\n if (((mask >> i) & 1) === 1) {\n const k = DIM_ORDER[i];\n const v = (ctx as any)[k!];\n // Only assign when the dimension participates in the context.\n if (v !== undefined) (dep as any)[k!] = v;\n }\n }\n results.push(keyFromDependency(dep));\n }\n\n contextCacheKey.set(mostRestrictiveKey, results);\n\n return results;\n}\n\nexport function getContextDependencyKey(contextDependency: ContextDependency) {\n const keys: (string | number)[] = [];\n contextDependencyKeys.forEach((key) => {\n if (contextDependency[key] !== undefined) {\n keys.push(`${key}:[${contextDependency[key]}]`);\n } else {\n keys.push(`${key}:*`);\n }\n });\n return keys.join(\",\");\n}\n"
5
+ "import type { DependencyNode } from \"../core/managers/dependency-node.cjs\";\nimport type { TableManager } from \"../core/managers/table-manager.cjs\";\nimport type { CellAddress } from \"../core/types.cjs\";\n\nexport const NO_TABLE_CONTEXT_NAME = \"__no_current_table__\";\n\nexport class EvaluationContext {\n private _cellAddress: CellAddress;\n private _tableName: string | undefined;\n private _cacheTableName: string;\n /**\n * Can be a range or a cell\n */\n private _dependencyNode: DependencyNode;\n constructor(\n tableManager: TableManager,\n dependencyNode: DependencyNode,\n cellAddress: CellAddress\n ) {\n this._dependencyNode = dependencyNode;\n this._cellAddress = cellAddress;\n const table = tableManager.isCellInTable(cellAddress);\n this._tableName = table?.name;\n this._cacheTableName = table?.name ?? NO_TABLE_CONTEXT_NAME;\n }\n\n get dependencyNode() {\n return this._dependencyNode;\n }\n\n private _contextDependency: ContextDependency = {};\n\n getContextDependency() {\n return this._contextDependency;\n }\n\n /**\n * The cell context, the address of the cell being evaluated\n * and the context in which results should be stored\n */\n get cellAddress() {\n return this._cellAddress;\n }\n\n get tableName() {\n return this._tableName;\n }\n\n get cacheTableName() {\n return this._cacheTableName;\n }\n\n addContextDependency(...types: ContextDependencyType[]) {\n for (const type of types) {\n switch (type) {\n case \"row\":\n this._contextDependency.rowIndex = this._cellAddress.rowIndex;\n break;\n case \"col\":\n this._contextDependency.colIndex = this._cellAddress.colIndex;\n break;\n case \"workbook\":\n this._contextDependency.workbookName = this._cellAddress.workbookName;\n break;\n case \"sheet\":\n this._contextDependency.sheetName = this._cellAddress.sheetName;\n break;\n case \"table\":\n this._contextDependency.tableName = this.cacheTableName;\n break;\n default:\n throw new Error(`Invalid context dependency type: ${type}`);\n }\n }\n }\n\n /**\n * When evaluating an AST node,\n * we need to append the subtree context\n * dependencies to the current context dependency\n */\n appendContextDependency(contextDependency: ContextDependency) {\n this._contextDependency = {\n ...this._contextDependency,\n ...Object.fromEntries(\n Object.entries(contextDependency).filter(\n ([key, value]) => value !== undefined\n )\n ),\n };\n }\n}\n\n/**\n * Each value has the same value as the origin cell\n * the defined keys are the ones the ast node is dependent on\n * e.g. A3=ROW() will have a context dependency of { rowIndex: 3 }\n *\n * The keys are ANDed together, e.g. { workbookName: \"Sheet1\", sheetName: \"Sheet2\" }\n * means the ast node is dependent on the workbook \"Sheet1\" and the sheet \"Sheet2\"\n */\nexport type ContextDependency = {\n workbookName?: string;\n sheetName?: string;\n tableName?: string;\n rowIndex?: number;\n colIndex?: number;\n};\n\nexport const contextDependencyKeys = [\n \"workbookName\",\n \"sheetName\",\n \"tableName\",\n \"rowIndex\",\n \"colIndex\",\n] as const;\n\n/**\n * These are some distinct scenarios where context dependencies are added\n */\nexport type ContextDependencyType =\n | \"row\"\n | \"col\"\n | \"workbook\"\n | \"sheet\"\n | \"table\";\n\n// * [astKey], // `=1+1`\n// * [astKey, sheetKey, workbookKey], // `B3`\n// * [astKey, workbookKey], // `Table1[Column1]`\n// * [astKey, workbookKey], // `Sheet1!B3`\n// * [astKey, cellAddress.rowIndex], // `ROW()`\n// * [astKey, cellAddress.colIndex], // `COL()`\n// * [astKey, cellAddress.rowIndex, cellAddress.colIndex] // `CELL(\"address\")`\n// * [astKey, tableKey, cellAddress.rowIndex], // `@Column1`\n// * [astKey, workbookKey, cellAddress.rowIndex], // `Table1[@Column1]`\n\ntype Dim = \"workbookName\" | \"sheetName\" | \"tableName\" | \"rowIndex\" | \"colIndex\";\nconst DIM_ORDER: readonly Dim[] = [\n \"workbookName\",\n \"sheetName\",\n \"tableName\",\n \"rowIndex\",\n \"colIndex\",\n] as const;\n\n/** Build the canonical cache key string for a dependency. */\nexport function keyFromDependency(dep: ContextDependency): string {\n return DIM_ORDER.map((k) =>\n dep[k] !== undefined ? `${k}:[${(dep as any)[k]}]` : `${k}:*`\n ).join(\",\");\n}\n\ntype Context = {\n workbookName: string;\n sheetName: string;\n tableName?: string;\n rowIndex: number;\n colIndex: number;\n};\n\n/** True if `dep` matches `ctx` (i.e., every specified field equals the context’s field). */\nexport function dependencyMatchesContext(\n ctx: Context,\n dep: ContextDependency\n): boolean {\n return DIM_ORDER.every(\n (k) => dep[k] === undefined || (dep as any)[k] === (ctx as any)[k]\n );\n}\n\nconst contextCacheKey = new Map<string, string[]>();\n\n/**\n * Generate every cache key that would be eligible for `ctx`.\n * By default returns keys ordered from most-specific to least-specific.\n */\nexport function eligibleKeysForContext(ctx: Context): string[] {\n const mostRestrictiveKey = keyFromDependency(ctx);\n const cachedKeys = contextCacheKey.get(mostRestrictiveKey);\n if (cachedKeys) {\n return cachedKeys;\n }\n\n const results: Array<{ key: string; specificity: number; mask: number }> = [];\n const n = DIM_ORDER.length;\n\n // If tableName is undefined in the context, the lookup is not modeling table\n // membership at all, so we cannot generate keys that specify it.\n const tableIdx = DIM_ORDER.indexOf(\"tableName\");\n\n const totalMasks = 1 << n; // 2^n\n for (let mask = 0; mask < totalMasks; mask++) {\n // Skip combos that specify tableName when ctx.tableName is undefined.\n if (ctx.tableName === undefined && ((mask >> tableIdx) & 1) === 1) continue;\n\n const dep: ContextDependency = {};\n let specificity = 0;\n for (let i = 0; i < n; i++) {\n if (((mask >> i) & 1) === 1) {\n const k = DIM_ORDER[i];\n const v = (ctx as any)[k!];\n // Only assign when the dimension participates in the context.\n if (v !== undefined) {\n (dep as any)[k!] = v;\n specificity++;\n }\n }\n }\n results.push({\n key: keyFromDependency(dep),\n specificity,\n mask,\n });\n }\n\n results.sort(\n (left, right) =>\n right.specificity - left.specificity || right.mask - left.mask\n );\n\n const orderedKeys = results.map((result) => result.key);\n\n contextCacheKey.set(mostRestrictiveKey, orderedKeys);\n\n return orderedKeys;\n}\n\nexport function getContextDependencyKey(contextDependency: ContextDependency) {\n const keys: (string | number)[] = [];\n contextDependencyKeys.forEach((key) => {\n if (contextDependency[key] !== undefined) {\n keys.push(`${key}:[${contextDependency[key]}]`);\n } else {\n keys.push(`${key}:*`);\n }\n });\n return keys.join(\",\");\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "010A8A123E9195BA64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "5F0D924C23ED7CD864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -82,7 +82,7 @@ class FormulaEvaluator {
82
82
  evaluateNode(node, context) {
83
83
  const currentContext = {
84
84
  ...context.cellAddress,
85
- tableName: context.tableName
85
+ tableName: context.cacheTableName
86
86
  };
87
87
  const astNode = this.dependencyManager.getAstNode(node, currentContext);
88
88
  context.dependencyNode.addDependency(astNode);
@@ -159,7 +159,7 @@ class FormulaEvaluator {
159
159
  context.addContextDependency("workbook");
160
160
  table = this.tableManager.getTables(context.cellAddress.workbookName).get(node.tableName);
161
161
  } else {
162
- context.addContextDependency("workbook", "table");
162
+ context.addContextDependency("workbook", "sheet", "table");
163
163
  table = this.tableManager.isCellInTable(context.cellAddress);
164
164
  }
165
165
  if (node.isCurrentRow) {
@@ -837,4 +837,4 @@ class FormulaEvaluator {
837
837
  }
838
838
  }
839
839
 
840
- //# debugId=A2D09ED3DA1B826064756E2164756E21
840
+ //# debugId=B36B15FC774F83C164756E2164756E21