@ricsam/formula-engine 0.2.10 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/cjs/core/autofill-utils.cjs +68 -2
  2. package/dist/cjs/core/autofill-utils.cjs.map +3 -3
  3. package/dist/cjs/core/engine-snapshot.cjs +2 -2
  4. package/dist/cjs/core/engine-snapshot.cjs.map +3 -3
  5. package/dist/cjs/core/engine.cjs +89 -5
  6. package/dist/cjs/core/engine.cjs.map +3 -3
  7. package/dist/cjs/core/managers/copy-manager.cjs +163 -14
  8. package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
  9. package/dist/cjs/core/managers/named-expression-manager.cjs +18 -16
  10. package/dist/cjs/core/managers/named-expression-manager.cjs.map +3 -3
  11. package/dist/cjs/core/managers/range-metadata-manager.cjs +135 -0
  12. package/dist/cjs/core/managers/range-metadata-manager.cjs.map +10 -0
  13. package/dist/cjs/core/types.cjs.map +1 -1
  14. package/dist/cjs/package.json +1 -1
  15. package/dist/mjs/core/autofill-utils.mjs +68 -2
  16. package/dist/mjs/core/autofill-utils.mjs.map +3 -3
  17. package/dist/mjs/core/engine-snapshot.mjs +2 -2
  18. package/dist/mjs/core/engine-snapshot.mjs.map +3 -3
  19. package/dist/mjs/core/engine.mjs +89 -5
  20. package/dist/mjs/core/engine.mjs.map +3 -3
  21. package/dist/mjs/core/managers/copy-manager.mjs +163 -14
  22. package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
  23. package/dist/mjs/core/managers/named-expression-manager.mjs +18 -16
  24. package/dist/mjs/core/managers/named-expression-manager.mjs.map +3 -3
  25. package/dist/mjs/core/managers/range-metadata-manager.mjs +95 -0
  26. package/dist/mjs/core/managers/range-metadata-manager.mjs.map +10 -0
  27. package/dist/mjs/core/types.mjs.map +1 -1
  28. package/dist/mjs/package.json +1 -1
  29. package/dist/types/core/autofill-utils.d.ts +7 -1
  30. package/dist/types/core/engine-snapshot.d.ts +4 -2
  31. package/dist/types/core/engine.d.ts +34 -1
  32. package/dist/types/core/managers/copy-manager.d.ts +11 -1
  33. package/dist/types/core/managers/named-expression-manager.d.ts +1 -0
  34. package/dist/types/core/managers/range-metadata-manager.d.ts +22 -0
  35. package/dist/types/core/types.d.ts +19 -6
  36. package/package.json +1 -1
@@ -51,9 +51,11 @@ var import_range_utils = require("./utils/range-utils.cjs");
51
51
  class AutoFill {
52
52
  workbookManager;
53
53
  styleManager;
54
- constructor(workbookManager, styleManager) {
54
+ rangeMetadataManager;
55
+ constructor(workbookManager, styleManager, rangeMetadataManager) {
55
56
  this.workbookManager = workbookManager;
56
57
  this.styleManager = styleManager;
58
+ this.rangeMetadataManager = rangeMetadataManager;
57
59
  }
58
60
  toFiniteRange(range) {
59
61
  if (range.end.col.type === "infinity" || range.end.row.type === "infinity") {
@@ -105,6 +107,7 @@ class AutoFill {
105
107
  this.workbookManager.setSheetContent(opts, newContent);
106
108
  this.fillStyles(opts, finiteSeedRange, finiteFillRange, direction);
107
109
  this.fillMetadata(opts, finiteSeedRange, finiteFillRange, direction);
110
+ this.fillRangeMetadata(opts, finiteSeedRange, finiteFillRange, direction);
108
111
  }
109
112
  getSeedCells(opts, seedRange) {
110
113
  const cells = [];
@@ -449,6 +452,69 @@ class AutoFill {
449
452
  }
450
453
  }
451
454
  }
455
+ fillRangeMetadata(opts, seedRange, fillRange, direction) {
456
+ const fillRangeAddress = {
457
+ workbookName: opts.workbookName,
458
+ sheetName: opts.sheetName,
459
+ range: {
460
+ start: { col: fillRange.start.col, row: fillRange.start.row },
461
+ end: {
462
+ col: { type: "number", value: fillRange.end.col },
463
+ row: { type: "number", value: fillRange.end.row }
464
+ }
465
+ }
466
+ };
467
+ this.rangeMetadataManager.clearRangeMetadataInRange(fillRangeAddress);
468
+ const seedWidth = seedRange.end.col - seedRange.start.col + 1;
469
+ const seedHeight = seedRange.end.row - seedRange.start.row + 1;
470
+ const allRangeMetadata = this.rangeMetadataManager.getAllRangeMetadata();
471
+ for (let row = fillRange.start.row;row <= fillRange.end.row; row++) {
472
+ for (let col = fillRange.start.col;col <= fillRange.end.col; col++) {
473
+ let seedCol;
474
+ let seedRow;
475
+ if (direction === "down" || direction === "up") {
476
+ seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;
477
+ seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;
478
+ } else {
479
+ seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;
480
+ seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;
481
+ }
482
+ const sourceCellRange = {
483
+ start: { col: seedCol, row: seedRow },
484
+ end: {
485
+ col: { type: "number", value: seedCol },
486
+ row: { type: "number", value: seedRow }
487
+ }
488
+ };
489
+ const targetCellRange = {
490
+ workbookName: opts.workbookName,
491
+ sheetName: opts.sheetName,
492
+ range: {
493
+ start: { col, row },
494
+ end: {
495
+ col: { type: "number", value: col },
496
+ row: { type: "number", value: row }
497
+ }
498
+ }
499
+ };
500
+ for (const entry of allRangeMetadata) {
501
+ for (const area of entry.areas) {
502
+ if (area.workbookName !== opts.workbookName || area.sheetName !== opts.sheetName) {
503
+ continue;
504
+ }
505
+ const intersection = import_range_utils.intersectRanges(area.range, sourceCellRange);
506
+ if (!intersection) {
507
+ continue;
508
+ }
509
+ this.rangeMetadataManager.addRangeMetadata({
510
+ areas: [targetCellRange],
511
+ metadata: entry.metadata
512
+ });
513
+ }
514
+ }
515
+ }
516
+ }
517
+ }
452
518
  }
453
519
 
454
- //# debugId=BDF9CFA9262E823764756E2164756E21
520
+ //# debugId=8E57D9B15294B64364756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/autofill-utils.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * AutoFill class for handling spreadsheet autofill functionality\n */\n\nimport type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRange,\n FiniteSpreadsheetRange,\n LocalCellAddress,\n ConditionalStyle,\n DirectCellStyle,\n RangeAddress,\n} from \"./types.cjs\";\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { parseFormula } from \"../parser/parser.cjs\";\nimport { astToString } from \"../parser/formatter.cjs\";\nimport { transformAST } from \"./ast-traverser.cjs\";\nimport type { ReferenceNode, RangeNode } from \"../parser/ast.cjs\";\nimport { getCellReference } from \"./utils.cjs\";\nimport type { WorkbookManager } from \"./managers/workbook-manager.cjs\";\nimport type { StyleManager } from \"./managers/style-manager.cjs\";\nimport { intersectRanges } from \"./utils/range-utils.cjs\";\n\nexport class AutoFill {\n constructor(\n private workbookManager: WorkbookManager,\n private styleManager: StyleManager\n ) {}\n\n /**\n * Converts a SpreadsheetRange to FiniteSpreadsheetRange, throwing an error if infinite\n */\n private toFiniteRange(range: SpreadsheetRange): FiniteSpreadsheetRange {\n if (\n range.end.col.type === \"infinity\" ||\n range.end.row.type === \"infinity\"\n ) {\n throw new Error(\"AutoFill with infinite ranges is not supported\");\n }\n\n return {\n start: range.start,\n end: {\n col: range.end.col.value,\n row: range.end.row.value,\n },\n };\n }\n\n private getCellContent(address: CellAddress): SerializedCellValue {\n const sheet = this.workbookManager.getSheet(address);\n if (!sheet) {\n throw new Error(\"Sheet not found\");\n }\n return sheet.content.get(getCellReference(address));\n }\n\n fill(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRanges: SpreadsheetRange[],\n direction: FillDirection\n ) {\n // Process each fill range\n for (const fillRange of fillRanges) {\n this.fillSingleRange(opts, seedRange, fillRange, direction);\n }\n }\n\n /**\n * Fill a single range with seed data and styles\n */\n private fillSingleRange(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRange: SpreadsheetRange,\n direction: FillDirection\n ) {\n // Convert to finite ranges (throws error if infinite)\n const finiteSeedRange = this.toFiniteRange(seedRange);\n const finiteFillRange = this.toFiniteRange(fillRange);\n\n // Get seed cells data\n const seedCells = this.getSeedCells(opts, finiteSeedRange);\n\n // Collect all changes to apply in a single batch\n const changes = new Map<string, SerializedCellValue>();\n\n // Determine if we have a single cell or multi-cell seed\n const isSingleCell = seedCells.length === 1;\n\n if (isSingleCell) {\n const seedCell = seedCells[0];\n if (seedCell) {\n this.collectSingleCellPattern(\n seedCell,\n finiteFillRange,\n direction,\n changes\n );\n }\n } else {\n this.collectMultiCellPattern(\n seedCells,\n finiteSeedRange,\n finiteFillRange,\n direction,\n changes\n );\n }\n\n // Get current sheet content and merge with changes\n const currentContent = this.workbookManager.getSheetSerialized(opts);\n const newContent = new Map(currentContent);\n\n // Apply all changes\n changes.forEach((value, key) => {\n if (value === undefined) {\n newContent.delete(key);\n } else {\n newContent.set(key, value);\n }\n });\n\n // Update sheet content in a single operation (direct manager call, not through engine)\n this.workbookManager.setSheetContent(opts, newContent);\n\n // Copy styles from seed to fill range\n this.fillStyles(opts, finiteSeedRange, finiteFillRange, direction);\n\n // Copy metadata from seed to fill range\n this.fillMetadata(opts, finiteSeedRange, finiteFillRange, direction);\n }\n\n private getSeedCells(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange\n ) {\n const cells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }> = [];\n\n const startCol = seedRange.start.col;\n const startRow = seedRange.start.row;\n const endCol = seedRange.end.col;\n const endRow = seedRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const address: CellAddress = {\n sheetName: opts.sheetName,\n workbookName: opts.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n const content = this.getCellContent(address);\n cells.push({\n address,\n content,\n rowOffset: row - startRow,\n colOffset: col - startCol,\n });\n }\n }\n\n return cells;\n }\n\n private collectSingleCellPattern(\n seedCell: { address: CellAddress; content: SerializedCellValue },\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n const { content } = seedCell;\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: CellAddress = {\n sheetName: seedCell.address.sheetName,\n workbookName: seedCell.address.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (content === undefined || content === \"\") {\n // Blank cell - fills blanks (effectively clears targets)\n newContent = undefined;\n } else if (typeof content === \"string\" && content.startsWith(\"=\")) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n content,\n seedCell.address,\n targetAddress\n );\n } else {\n // Number or text - copy by default\n newContent = content;\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private collectMultiCellPattern(\n seedCells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n // Try to infer linear step from numbers\n const step = this.inferLinearStep(seedCells, direction);\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: LocalCellAddress = {\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (step !== null) {\n // Use linear progression\n newContent = this.applyLinearStep(\n seedCells,\n targetAddress,\n seedRange,\n step,\n direction\n );\n } else {\n // Repeat pattern (cycle through seed block)\n const seedColOffset = (col - startCol) % seedWidth;\n const seedRowOffset = (row - startRow) % seedHeight;\n\n const seedCell = seedCells.find(\n (cell) =>\n cell.colOffset === seedColOffset &&\n cell.rowOffset === seedRowOffset\n );\n\n if (seedCell) {\n if (\n typeof seedCell.content === \"string\" &&\n seedCell.content.startsWith(\"=\")\n ) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n seedCell.content,\n seedCell.address,\n targetAddress\n );\n } else {\n newContent = seedCell.content;\n }\n } else {\n newContent = undefined;\n }\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private inferLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n direction: FillDirection\n ): number | null {\n // Extract numeric values in the direction of fill\n const values: number[] = [];\n\n if (direction === \"down\" || direction === \"up\") {\n // Look at first column, different rows\n const firstColCells = seedCells\n .filter((cell) => cell.colOffset === 0)\n .sort((a, b) => a.rowOffset - b.rowOffset);\n\n for (const cell of firstColCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n } else {\n // Look at first row, different columns\n const firstRowCells = seedCells\n .filter((cell) => cell.rowOffset === 0)\n .sort((a, b) => a.colOffset - b.colOffset);\n\n for (const cell of firstRowCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n }\n\n if (values.length < 2) {\n return null;\n }\n\n // Check if there's a consistent step\n const step = values[1]! - values[0]!;\n for (let i = 2; i < values.length; i++) {\n if (Math.abs(values[i]! - values[i - 1]! - step) > 1e-10) {\n return null; // Inconsistent step\n }\n }\n\n return step;\n }\n\n private applyLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n targetAddress: LocalCellAddress,\n seedRange: FiniteSpreadsheetRange,\n step: number,\n direction: FillDirection\n ): SerializedCellValue {\n // Calculate the position in the overall sequence\n let positionInSequence: number;\n let baseValue: number;\n\n if (direction === \"down\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"up\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed (same as down direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"right\") {\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else {\n // left\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed (same as right direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n }\n\n if (isNaN(baseValue)) {\n return undefined;\n }\n\n const result = baseValue + step * positionInSequence;\n return typeof seedCells[0]?.content === \"string\"\n ? result.toString()\n : result;\n }\n\n private adjustFormulaReferences(\n formula: string,\n sourceAddress: LocalCellAddress,\n targetAddress: LocalCellAddress\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const rowDelta = targetAddress.rowIndex - sourceAddress.rowIndex;\n const colDelta = targetAddress.colIndex - sourceAddress.colIndex;\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula references:\", error);\n return formula;\n }\n }\n\n /**\n * Fill styles from seed range to fill range based on direction\n * Clears existing cell styles in fill range first (Excel behavior)\n */\n private fillStyles(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n // STEP 1: Clear existing cell styles in fill range (Excel-like replacement)\n const fillRangeAddress: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: fillRange.start.col, row: fillRange.start.row },\n end: {\n col: { type: \"number\", value: fillRange.end.col },\n row: { type: \"number\", value: fillRange.end.row },\n },\n },\n };\n \n this.styleManager.clearCellStylesInRange(fillRangeAddress);\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // STEP 2: Get all styles intersecting with seed range\n const seedSpreadsheetRange: SpreadsheetRange = {\n start: { col: seedRange.start.col, row: seedRange.start.row },\n end: {\n col: { type: \"number\", value: seedRange.end.col },\n row: { type: \"number\", value: seedRange.end.row },\n },\n };\n\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n // STEP 3: For each cell in fill range, determine corresponding seed cell and copy styles\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: seedCol, row: seedRow },\n end: {\n col: { type: \"number\", value: seedCol },\n row: { type: \"number\", value: seedRow },\n },\n };\n\n const targetCell: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy conditional styles\n for (const style of allConditionalStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: ConditionalStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n }\n\n // Copy cell styles\n for (const style of allCellStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: DirectCellStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Copy metadata from seed range to fill range with pattern repetition\n */\n private fillMetadata(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // For each cell in fill range, copy metadata from corresponding seed cell\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: seedCol,\n rowIndex: seedRow,\n };\n\n const targetCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy metadata from source to target\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCellAddress);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCellAddress, { ...sourceMetadata });\n }\n }\n }\n }\n}\n"
5
+ "/**\n * AutoFill class for handling spreadsheet autofill functionality\n */\n\nimport type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRange,\n FiniteSpreadsheetRange,\n LocalCellAddress,\n ConditionalStyle,\n DirectCellStyle,\n RangeAddress,\n} from \"./types.cjs\";\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { parseFormula } from \"../parser/parser.cjs\";\nimport { astToString } from \"../parser/formatter.cjs\";\nimport { transformAST } from \"./ast-traverser.cjs\";\nimport type { ReferenceNode, RangeNode } from \"../parser/ast.cjs\";\nimport { getCellReference } from \"./utils.cjs\";\nimport type { WorkbookManager } from \"./managers/workbook-manager.cjs\";\nimport type { StyleManager } from \"./managers/style-manager.cjs\";\nimport type { RangeMetadataManager } from \"./managers/range-metadata-manager.cjs\";\nimport { intersectRanges } from \"./utils/range-utils.cjs\";\n\nexport class AutoFill {\n constructor(\n private workbookManager: WorkbookManager,\n private styleManager: StyleManager,\n private rangeMetadataManager: RangeMetadataManager\n ) {}\n\n /**\n * Converts a SpreadsheetRange to FiniteSpreadsheetRange, throwing an error if infinite\n */\n private toFiniteRange(range: SpreadsheetRange): FiniteSpreadsheetRange {\n if (\n range.end.col.type === \"infinity\" ||\n range.end.row.type === \"infinity\"\n ) {\n throw new Error(\"AutoFill with infinite ranges is not supported\");\n }\n\n return {\n start: range.start,\n end: {\n col: range.end.col.value,\n row: range.end.row.value,\n },\n };\n }\n\n private getCellContent(address: CellAddress): SerializedCellValue {\n const sheet = this.workbookManager.getSheet(address);\n if (!sheet) {\n throw new Error(\"Sheet not found\");\n }\n return sheet.content.get(getCellReference(address));\n }\n\n fill(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRanges: SpreadsheetRange[],\n direction: FillDirection\n ) {\n // Process each fill range\n for (const fillRange of fillRanges) {\n this.fillSingleRange(opts, seedRange, fillRange, direction);\n }\n }\n\n /**\n * Fill a single range with seed data and styles\n */\n private fillSingleRange(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRange: SpreadsheetRange,\n direction: FillDirection\n ) {\n // Convert to finite ranges (throws error if infinite)\n const finiteSeedRange = this.toFiniteRange(seedRange);\n const finiteFillRange = this.toFiniteRange(fillRange);\n\n // Get seed cells data\n const seedCells = this.getSeedCells(opts, finiteSeedRange);\n\n // Collect all changes to apply in a single batch\n const changes = new Map<string, SerializedCellValue>();\n\n // Determine if we have a single cell or multi-cell seed\n const isSingleCell = seedCells.length === 1;\n\n if (isSingleCell) {\n const seedCell = seedCells[0];\n if (seedCell) {\n this.collectSingleCellPattern(\n seedCell,\n finiteFillRange,\n direction,\n changes\n );\n }\n } else {\n this.collectMultiCellPattern(\n seedCells,\n finiteSeedRange,\n finiteFillRange,\n direction,\n changes\n );\n }\n\n // Get current sheet content and merge with changes\n const currentContent = this.workbookManager.getSheetSerialized(opts);\n const newContent = new Map(currentContent);\n\n // Apply all changes\n changes.forEach((value, key) => {\n if (value === undefined) {\n newContent.delete(key);\n } else {\n newContent.set(key, value);\n }\n });\n\n // Update sheet content in a single operation (direct manager call, not through engine)\n this.workbookManager.setSheetContent(opts, newContent);\n\n // Copy styles from seed to fill range\n this.fillStyles(opts, finiteSeedRange, finiteFillRange, direction);\n\n // Copy metadata from seed to fill range\n this.fillMetadata(opts, finiteSeedRange, finiteFillRange, direction);\n\n // Copy range metadata from seed to fill range\n this.fillRangeMetadata(opts, finiteSeedRange, finiteFillRange, direction);\n }\n\n private getSeedCells(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange\n ) {\n const cells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }> = [];\n\n const startCol = seedRange.start.col;\n const startRow = seedRange.start.row;\n const endCol = seedRange.end.col;\n const endRow = seedRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const address: CellAddress = {\n sheetName: opts.sheetName,\n workbookName: opts.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n const content = this.getCellContent(address);\n cells.push({\n address,\n content,\n rowOffset: row - startRow,\n colOffset: col - startCol,\n });\n }\n }\n\n return cells;\n }\n\n private collectSingleCellPattern(\n seedCell: { address: CellAddress; content: SerializedCellValue },\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n const { content } = seedCell;\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: CellAddress = {\n sheetName: seedCell.address.sheetName,\n workbookName: seedCell.address.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (content === undefined || content === \"\") {\n // Blank cell - fills blanks (effectively clears targets)\n newContent = undefined;\n } else if (typeof content === \"string\" && content.startsWith(\"=\")) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n content,\n seedCell.address,\n targetAddress\n );\n } else {\n // Number or text - copy by default\n newContent = content;\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private collectMultiCellPattern(\n seedCells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n // Try to infer linear step from numbers\n const step = this.inferLinearStep(seedCells, direction);\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: LocalCellAddress = {\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (step !== null) {\n // Use linear progression\n newContent = this.applyLinearStep(\n seedCells,\n targetAddress,\n seedRange,\n step,\n direction\n );\n } else {\n // Repeat pattern (cycle through seed block)\n const seedColOffset = (col - startCol) % seedWidth;\n const seedRowOffset = (row - startRow) % seedHeight;\n\n const seedCell = seedCells.find(\n (cell) =>\n cell.colOffset === seedColOffset &&\n cell.rowOffset === seedRowOffset\n );\n\n if (seedCell) {\n if (\n typeof seedCell.content === \"string\" &&\n seedCell.content.startsWith(\"=\")\n ) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n seedCell.content,\n seedCell.address,\n targetAddress\n );\n } else {\n newContent = seedCell.content;\n }\n } else {\n newContent = undefined;\n }\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private inferLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n direction: FillDirection\n ): number | null {\n // Extract numeric values in the direction of fill\n const values: number[] = [];\n\n if (direction === \"down\" || direction === \"up\") {\n // Look at first column, different rows\n const firstColCells = seedCells\n .filter((cell) => cell.colOffset === 0)\n .sort((a, b) => a.rowOffset - b.rowOffset);\n\n for (const cell of firstColCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n } else {\n // Look at first row, different columns\n const firstRowCells = seedCells\n .filter((cell) => cell.rowOffset === 0)\n .sort((a, b) => a.colOffset - b.colOffset);\n\n for (const cell of firstRowCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n }\n\n if (values.length < 2) {\n return null;\n }\n\n // Check if there's a consistent step\n const step = values[1]! - values[0]!;\n for (let i = 2; i < values.length; i++) {\n if (Math.abs(values[i]! - values[i - 1]! - step) > 1e-10) {\n return null; // Inconsistent step\n }\n }\n\n return step;\n }\n\n private applyLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n targetAddress: LocalCellAddress,\n seedRange: FiniteSpreadsheetRange,\n step: number,\n direction: FillDirection\n ): SerializedCellValue {\n // Calculate the position in the overall sequence\n let positionInSequence: number;\n let baseValue: number;\n\n if (direction === \"down\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"up\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed (same as down direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"right\") {\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else {\n // left\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed (same as right direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n }\n\n if (isNaN(baseValue)) {\n return undefined;\n }\n\n const result = baseValue + step * positionInSequence;\n return typeof seedCells[0]?.content === \"string\"\n ? result.toString()\n : result;\n }\n\n private adjustFormulaReferences(\n formula: string,\n sourceAddress: LocalCellAddress,\n targetAddress: LocalCellAddress\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const rowDelta = targetAddress.rowIndex - sourceAddress.rowIndex;\n const colDelta = targetAddress.colIndex - sourceAddress.colIndex;\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula references:\", error);\n return formula;\n }\n }\n\n /**\n * Fill styles from seed range to fill range based on direction\n * Clears existing cell styles in fill range first (Excel behavior)\n */\n private fillStyles(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n // STEP 1: Clear existing cell styles in fill range (Excel-like replacement)\n const fillRangeAddress: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: fillRange.start.col, row: fillRange.start.row },\n end: {\n col: { type: \"number\", value: fillRange.end.col },\n row: { type: \"number\", value: fillRange.end.row },\n },\n },\n };\n \n this.styleManager.clearCellStylesInRange(fillRangeAddress);\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // STEP 2: Get all styles intersecting with seed range\n const seedSpreadsheetRange: SpreadsheetRange = {\n start: { col: seedRange.start.col, row: seedRange.start.row },\n end: {\n col: { type: \"number\", value: seedRange.end.col },\n row: { type: \"number\", value: seedRange.end.row },\n },\n };\n\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n // STEP 3: For each cell in fill range, determine corresponding seed cell and copy styles\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: seedCol, row: seedRow },\n end: {\n col: { type: \"number\", value: seedCol },\n row: { type: \"number\", value: seedRow },\n },\n };\n\n const targetCell: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy conditional styles\n for (const style of allConditionalStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: ConditionalStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n }\n\n // Copy cell styles\n for (const style of allCellStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: DirectCellStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Copy metadata from seed range to fill range with pattern repetition\n */\n private fillMetadata(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // For each cell in fill range, copy metadata from corresponding seed cell\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: seedCol,\n rowIndex: seedRow,\n };\n\n const targetCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy metadata from source to target\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCellAddress);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCellAddress, { ...sourceMetadata });\n }\n }\n }\n }\n\n /**\n * Copy range metadata from seed range to fill range with pattern repetition.\n */\n private fillRangeMetadata(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n const fillRangeAddress: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: fillRange.start.col, row: fillRange.start.row },\n end: {\n col: { type: \"number\", value: fillRange.end.col },\n row: { type: \"number\", value: fillRange.end.row },\n },\n },\n };\n\n this.rangeMetadataManager.clearRangeMetadataInRange(fillRangeAddress);\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n const allRangeMetadata = this.rangeMetadataManager.getAllRangeMetadata();\n\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: seedCol, row: seedRow },\n end: {\n col: { type: \"number\", value: seedCol },\n row: { type: \"number\", value: seedRow },\n },\n };\n\n const targetCellRange: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col, row },\n end: {\n col: { type: \"number\", value: col },\n row: { type: \"number\", value: row },\n },\n },\n };\n\n for (const entry of allRangeMetadata) {\n for (const area of entry.areas) {\n if (\n area.workbookName !== opts.workbookName ||\n area.sheetName !== opts.sheetName\n ) {\n continue;\n }\n\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (!intersection) {\n continue;\n }\n\n this.rangeMetadataManager.addRangeMetadata({\n areas: [targetCellRange],\n metadata: entry.metadata,\n });\n }\n }\n }\n }\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "BDF9CFA9262E823764756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "8E57D9B15294B64364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -43,9 +43,9 @@ __export(exports_engine_snapshot, {
43
43
  ENGINE_SNAPSHOT_VERSION: () => ENGINE_SNAPSHOT_VERSION
44
44
  });
45
45
  module.exports = __toCommonJS(exports_engine_snapshot);
46
- var ENGINE_SNAPSHOT_VERSION = 4;
46
+ var ENGINE_SNAPSHOT_VERSION = 5;
47
47
  function getAstNodeSnapshotId(node) {
48
48
  return `${node.key}::${JSON.stringify(node.getContextDependency())}`;
49
49
  }
50
50
 
51
- //# debugId=B0DBBBA2B6EB8C4A64756E2164756E21
51
+ //# debugId=BC7158447FA0E78F64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/engine-snapshot.ts"],
4
4
  "sourcesContent": [
5
- "import type { ContextDependency } from \"../evaluator/evaluation-context.cjs\";\nimport type { DependencyNode } from \"./managers/dependency-node.cjs\";\nimport type {\n CellAddress,\n CellInRangeResult,\n CellValue,\n ConditionalStyle,\n DirectCellStyle,\n FormulaError,\n NamedExpression,\n RangeAddress,\n RelativeRange,\n SpreadsheetRange,\n TableDefinition,\n TrackedReference,\n Workbook,\n} from \"./types.cjs\";\n\nexport const ENGINE_SNAPSHOT_VERSION = 4 as const;\n\nexport type NodeSnapshotId = string;\n\nexport type NamedExpressionManagerSnapshot = {\n sheetExpressions: Map<string, Map<string, Map<string, NamedExpression>>>;\n workbookExpressions: Map<string, Map<string, NamedExpression>>;\n globalExpressions: Map<string, NamedExpression>;\n};\n\nexport type WorkbookManagerSnapshot = Map<string, Workbook>;\n\nexport type TableManagerSnapshot = Map<string, Map<string, TableDefinition>>;\n\nexport type StyleManagerSnapshot = {\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n};\n\nexport type ReferenceManagerSnapshot = Map<string, TrackedReference>;\n\nexport type SerializedValueEvaluationResultSnapshot = {\n type: \"value\";\n result: CellValue;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedErrorEvaluationResultSnapshot = {\n type: \"error\";\n err: FormulaError;\n message: string;\n errAddressId: NodeSnapshotId;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedSingleEvaluationResultSnapshot =\n | SerializedValueEvaluationResultSnapshot\n | SerializedErrorEvaluationResultSnapshot;\n\nexport type SerializedCellInRangeResultSnapshot = {\n relativePos: CellInRangeResult[\"relativePos\"];\n result: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedEvaluateAllCellsResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | {\n type: \"values\";\n values: SerializedCellInRangeResultSnapshot[];\n };\n\nexport type SerializedMaterializedSpillSnapshot = {\n kind: \"materialized\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange?: RangeAddress;\n values: SerializedCellInRangeResultSnapshot[];\n};\n\nexport type SerializedSourceRangeSpillSnapshot = {\n kind: \"source-range\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange: RangeAddress;\n};\n\nexport type SerializedSpillResultSnapshot =\n | SerializedMaterializedSpillSnapshot\n | SerializedSourceRangeSpillSnapshot;\n\nexport type SerializedSpilledValuesEvaluationResultSnapshot = {\n type: \"spilled-values\";\n spill: SerializedSpillResultSnapshot;\n};\n\nexport type SerializedFunctionEvaluationResultSnapshot =\n | SerializedSingleEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot;\n\nexport type SerializedSpillMetaEvaluationResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot\n | {\n type: \"does-not-spill\";\n };\n\ntype SerializedBaseNodeSnapshot = {\n snapshotId: NodeSnapshotId;\n key: string;\n dependencies: NodeSnapshotId[];\n};\n\nexport type SerializedCellValueNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"cell-value\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n spillMetaSnapshotId?: NodeSnapshotId;\n};\n\nexport type SerializedSpillMetaNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"spill-meta\";\n evaluationResult: SerializedSpillMetaEvaluationResultSnapshot;\n};\n\nexport type SerializedEmptyCellNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"empty\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedRangeNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"range\";\n result: SerializedEvaluateAllCellsResultSnapshot;\n};\n\nexport type SerializedAstNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"ast\";\n contextDependency: ContextDependency;\n evaluationResult: SerializedFunctionEvaluationResultSnapshot;\n};\n\nexport type SerializedResourceNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"resource\";\n};\n\nexport type SerializedDependencyNodeSnapshot =\n | SerializedCellValueNodeSnapshot\n | SerializedSpillMetaNodeSnapshot\n | SerializedEmptyCellNodeSnapshot\n | SerializedRangeNodeSnapshot\n | SerializedAstNodeSnapshot\n | SerializedResourceNodeSnapshot;\n\nexport type DependencyManagerSnapshot = {\n nodes: SerializedDependencyNodeSnapshot[];\n spilledValues: Array<[string, { origin: CellAddress; spillOnto: SpreadsheetRange }]>;\n};\n\nexport type SerializedSCCSnapshot = {\n id: number;\n nodes: NodeSnapshotId[];\n evaluationOrder: NodeSnapshotId[];\n resolved: boolean;\n hardEdgeSCCs: NodeSnapshotId[][];\n};\n\nexport type SerializedEvaluationOrderSnapshot = {\n nodeKey: string;\n evaluationOrder: NodeSnapshotId[];\n hasCycle: boolean;\n cycleNodes?: NodeSnapshotId[];\n hash: string;\n};\n\nexport type CacheManagerSnapshot = {\n evaluationOrders: SerializedEvaluationOrderSnapshot[];\n sccs: Array<{\n hash: string;\n scc: SerializedSCCSnapshot;\n }>;\n};\n\ntype EngineSnapshotManagers = {\n workbook: WorkbookManagerSnapshot;\n namedExpression: NamedExpressionManagerSnapshot;\n table: TableManagerSnapshot;\n style: StyleManagerSnapshot;\n reference: ReferenceManagerSnapshot;\n dependency: DependencyManagerSnapshot;\n cache: CacheManagerSnapshot;\n};\n\nexport type EngineSnapshot = {\n version: typeof ENGINE_SNAPSHOT_VERSION;\n managers: EngineSnapshotManagers;\n};\n\nexport function getAstNodeSnapshotId(\n node: DependencyNode & { getContextDependency(): ContextDependency }\n): NodeSnapshotId {\n return `${node.key}::${JSON.stringify(node.getContextDependency())}`;\n}\n"
5
+ "import type { ContextDependency } from \"../evaluator/evaluation-context.cjs\";\nimport type { DependencyNode } from \"./managers/dependency-node.cjs\";\nimport type {\n CellAddress,\n CellInRangeResult,\n CellValue,\n ConditionalStyle,\n DirectCellStyle,\n FormulaError,\n NamedExpression,\n RangeAddress,\n RangeMetadata,\n RelativeRange,\n SpreadsheetRange,\n TableDefinition,\n TrackedReference,\n Workbook,\n} from \"./types.cjs\";\n\nexport const ENGINE_SNAPSHOT_VERSION = 5 as const;\n\nexport type NodeSnapshotId = string;\n\nexport type NamedExpressionManagerSnapshot = {\n sheetExpressions: Map<string, Map<string, Map<string, NamedExpression>>>;\n workbookExpressions: Map<string, Map<string, NamedExpression>>;\n globalExpressions: Map<string, NamedExpression>;\n};\n\nexport type WorkbookManagerSnapshot = Map<string, Workbook>;\n\nexport type TableManagerSnapshot = Map<string, Map<string, TableDefinition>>;\n\nexport type StyleManagerSnapshot = {\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n};\n\nexport type RangeMetadataManagerSnapshot = RangeMetadata[];\n\nexport type ReferenceManagerSnapshot = Map<string, TrackedReference>;\n\nexport type SerializedValueEvaluationResultSnapshot = {\n type: \"value\";\n result: CellValue;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedErrorEvaluationResultSnapshot = {\n type: \"error\";\n err: FormulaError;\n message: string;\n errAddressId: NodeSnapshotId;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedSingleEvaluationResultSnapshot =\n | SerializedValueEvaluationResultSnapshot\n | SerializedErrorEvaluationResultSnapshot;\n\nexport type SerializedCellInRangeResultSnapshot = {\n relativePos: CellInRangeResult[\"relativePos\"];\n result: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedEvaluateAllCellsResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | {\n type: \"values\";\n values: SerializedCellInRangeResultSnapshot[];\n };\n\nexport type SerializedMaterializedSpillSnapshot = {\n kind: \"materialized\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange?: RangeAddress;\n values: SerializedCellInRangeResultSnapshot[];\n};\n\nexport type SerializedSourceRangeSpillSnapshot = {\n kind: \"source-range\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange: RangeAddress;\n};\n\nexport type SerializedSpillResultSnapshot =\n | SerializedMaterializedSpillSnapshot\n | SerializedSourceRangeSpillSnapshot;\n\nexport type SerializedSpilledValuesEvaluationResultSnapshot = {\n type: \"spilled-values\";\n spill: SerializedSpillResultSnapshot;\n};\n\nexport type SerializedFunctionEvaluationResultSnapshot =\n | SerializedSingleEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot;\n\nexport type SerializedSpillMetaEvaluationResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot\n | {\n type: \"does-not-spill\";\n };\n\ntype SerializedBaseNodeSnapshot = {\n snapshotId: NodeSnapshotId;\n key: string;\n dependencies: NodeSnapshotId[];\n};\n\nexport type SerializedCellValueNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"cell-value\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n spillMetaSnapshotId?: NodeSnapshotId;\n};\n\nexport type SerializedSpillMetaNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"spill-meta\";\n evaluationResult: SerializedSpillMetaEvaluationResultSnapshot;\n};\n\nexport type SerializedEmptyCellNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"empty\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedRangeNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"range\";\n result: SerializedEvaluateAllCellsResultSnapshot;\n};\n\nexport type SerializedAstNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"ast\";\n contextDependency: ContextDependency;\n evaluationResult: SerializedFunctionEvaluationResultSnapshot;\n};\n\nexport type SerializedResourceNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"resource\";\n};\n\nexport type SerializedDependencyNodeSnapshot =\n | SerializedCellValueNodeSnapshot\n | SerializedSpillMetaNodeSnapshot\n | SerializedEmptyCellNodeSnapshot\n | SerializedRangeNodeSnapshot\n | SerializedAstNodeSnapshot\n | SerializedResourceNodeSnapshot;\n\nexport type DependencyManagerSnapshot = {\n nodes: SerializedDependencyNodeSnapshot[];\n spilledValues: Array<[string, { origin: CellAddress; spillOnto: SpreadsheetRange }]>;\n};\n\nexport type SerializedSCCSnapshot = {\n id: number;\n nodes: NodeSnapshotId[];\n evaluationOrder: NodeSnapshotId[];\n resolved: boolean;\n hardEdgeSCCs: NodeSnapshotId[][];\n};\n\nexport type SerializedEvaluationOrderSnapshot = {\n nodeKey: string;\n evaluationOrder: NodeSnapshotId[];\n hasCycle: boolean;\n cycleNodes?: NodeSnapshotId[];\n hash: string;\n};\n\nexport type CacheManagerSnapshot = {\n evaluationOrders: SerializedEvaluationOrderSnapshot[];\n sccs: Array<{\n hash: string;\n scc: SerializedSCCSnapshot;\n }>;\n};\n\ntype EngineSnapshotManagers = {\n workbook: WorkbookManagerSnapshot;\n namedExpression: NamedExpressionManagerSnapshot;\n table: TableManagerSnapshot;\n style: StyleManagerSnapshot;\n rangeMetadata: RangeMetadataManagerSnapshot;\n reference: ReferenceManagerSnapshot;\n dependency: DependencyManagerSnapshot;\n cache: CacheManagerSnapshot;\n};\n\nexport type EngineSnapshot = {\n version: typeof ENGINE_SNAPSHOT_VERSION;\n managers: EngineSnapshotManagers;\n};\n\nexport function getAstNodeSnapshotId(\n node: DependencyNode & { getContextDependency(): ContextDependency }\n): NodeSnapshotId {\n return `${node.key}::${JSON.stringify(node.getContextDependency())}`;\n}\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,IAAM,0BAA0B;AAiLhC,SAAS,oBAAoB,CAClC,MACgB;AAAA,EAChB,OAAO,GAAG,KAAK,QAAQ,KAAK,UAAU,KAAK,qBAAqB,CAAC;AAAA;",
8
- "debugId": "B0DBBBA2B6EB8C4A64756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,IAAM,0BAA0B;AAoLhC,SAAS,oBAAoB,CAClC,MACgB;AAAA,EAChB,OAAO,GAAG,KAAK,QAAQ,KAAK,UAAU,KAAK,qBAAqB,CAAC;AAAA;",
8
+ "debugId": "BC7158447FA0E78F64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -59,6 +59,7 @@ var import_dependency_manager = require("./managers/dependency-manager.cjs");
59
59
  var import_style_manager = require("./managers/style-manager.cjs");
60
60
  var import_copy_manager = require("./managers/copy-manager.cjs");
61
61
  var import_reference_manager = require("./managers/reference-manager.cjs");
62
+ var import_range_metadata_manager = require("./managers/range-metadata-manager.cjs");
62
63
  var import_engine_snapshot = require("./engine-snapshot.cjs");
63
64
  var import_mutation_invalidation = require("./mutation-invalidation.cjs");
64
65
  var import_resource_keys = require("./resource-keys.cjs");
@@ -72,6 +73,7 @@ class FormulaEngine {
72
73
  autoFillManager;
73
74
  dependencyManager;
74
75
  styleManager;
76
+ rangeMetadataManager;
75
77
  copyManager;
76
78
  referenceManager;
77
79
  _workbookManager;
@@ -82,6 +84,7 @@ class FormulaEngine {
82
84
  _autoFillManager;
83
85
  _dependencyManager;
84
86
  _styleManager;
87
+ _rangeMetadataManager;
85
88
  constructor() {
86
89
  this.eventManager = new import_event_manager.EventManager;
87
90
  this.workbookManager = new import_workbook_manager.WorkbookManager;
@@ -92,8 +95,9 @@ class FormulaEngine {
92
95
  const formulaEvaluator = new import_formula_evaluator.FormulaEvaluator(this.tableManager, this.dependencyManager, this.namedExpressionManager);
93
96
  this.evaluationManager = new import_evaluation_manager.EvaluationManager(this.workbookManager, this.tableManager, formulaEvaluator, this.dependencyManager);
94
97
  this.styleManager = new import_style_manager.StyleManager(this.evaluationManager);
95
- this.copyManager = new import_copy_manager.CopyManager(this.workbookManager, this.evaluationManager, this.styleManager);
96
- this.autoFillManager = new import_autofill_utils.AutoFill(this.workbookManager, this.styleManager);
98
+ this.rangeMetadataManager = new import_range_metadata_manager.RangeMetadataManager;
99
+ this.copyManager = new import_copy_manager.CopyManager(this.workbookManager, this.evaluationManager, this.styleManager, this.rangeMetadataManager);
100
+ this.autoFillManager = new import_autofill_utils.AutoFill(this.workbookManager, this.styleManager, this.rangeMetadataManager);
97
101
  this.referenceManager = new import_reference_manager.ReferenceManager;
98
102
  this._workbookManager = this.workbookManager;
99
103
  this._namedExpressionManager = this.namedExpressionManager;
@@ -103,6 +107,7 @@ class FormulaEngine {
103
107
  this._autoFillManager = this.autoFillManager;
104
108
  this._dependencyManager = this.dependencyManager;
105
109
  this._styleManager = this.styleManager;
110
+ this._rangeMetadataManager = this.rangeMetadataManager;
106
111
  }
107
112
  static buildEmpty() {
108
113
  return new FormulaEngine;
@@ -162,6 +167,23 @@ class FormulaEngine {
162
167
  }
163
168
  return Array.from(resourceKeys);
164
169
  }
170
+ assertNamedExpressionScopeExists(opts) {
171
+ if (opts.sheetName && !opts.workbookName) {
172
+ throw new Error("Missing workbookName");
173
+ }
174
+ if (!opts.workbookName) {
175
+ return;
176
+ }
177
+ if (!this.workbookManager.getWorkbooks().has(opts.workbookName)) {
178
+ throw new Error(`Workbook not found: ${opts.workbookName}`);
179
+ }
180
+ if (opts.sheetName && !this.workbookManager.getSheet({
181
+ workbookName: opts.workbookName,
182
+ sheetName: opts.sheetName
183
+ })) {
184
+ throw new Error(`Sheet not found: ${opts.sheetName}`);
185
+ }
186
+ }
165
187
  getCellEvaluationResult(cellAddress) {
166
188
  return this.evaluationManager.getCellEvaluationResult(cellAddress);
167
189
  }
@@ -197,6 +219,30 @@ class FormulaEngine {
197
219
  getWorkbookMetadata(workbookName) {
198
220
  return this.workbookManager.getWorkbookMetadata(workbookName);
199
221
  }
222
+ addRangeMetadata(metadata) {
223
+ const id = this.rangeMetadataManager.addRangeMetadata(metadata);
224
+ this.emitUpdate();
225
+ return id;
226
+ }
227
+ removeRangeMetadata(id) {
228
+ const removed = this.rangeMetadataManager.removeRangeMetadata(id);
229
+ if (removed) {
230
+ this.emitUpdate();
231
+ }
232
+ }
233
+ getAllRangeMetadata() {
234
+ return this.rangeMetadataManager.getAllRangeMetadata();
235
+ }
236
+ getRangeMetadataForCell(address) {
237
+ return this.rangeMetadataManager.getRangeMetadataForCell(address);
238
+ }
239
+ getRangeMetadataIntersectingWithRange(range) {
240
+ return this.rangeMetadataManager.getRangeMetadataIntersectingWithRange(range);
241
+ }
242
+ clearRangeMetadata(range) {
243
+ this.rangeMetadataManager.clearRangeMetadataInRange(range);
244
+ this.emitUpdate();
245
+ }
200
246
  createRef(address) {
201
247
  return this.referenceManager.createRef(address);
202
248
  }
@@ -219,6 +265,7 @@ class FormulaEngine {
219
265
  throw new Error("Not implemented");
220
266
  }
221
267
  addNamedExpression(opts) {
268
+ this.assertNamedExpressionScopeExists(opts);
222
269
  this.namedExpressionManager.addNamedExpression(opts);
223
270
  this.emitMutation({
224
271
  touchedCells: [],
@@ -656,6 +703,7 @@ class FormulaEngine {
656
703
  this.namedExpressionManager.removeSheet(opts);
657
704
  this.tableManager.removeSheet(opts);
658
705
  this.styleManager.removeSheetStyles(opts.workbookName, opts.sheetName);
706
+ this.rangeMetadataManager.removeSheetRangeMetadata(opts.workbookName, opts.sheetName);
659
707
  this.referenceManager.invalidateSheet(opts.workbookName, opts.sheetName);
660
708
  this.emitMutation({
661
709
  touchedCells: [],
@@ -669,6 +717,7 @@ class FormulaEngine {
669
717
  this.namedExpressionManager.renameSheet(opts);
670
718
  this.tableManager.updateTablesForSheetRename(opts);
671
719
  this.styleManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
720
+ this.rangeMetadataManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
672
721
  const changedCells = this.workbookManager.updateAllFormulas((formula) => import_sheet_renamer.renameSheetInFormula({
673
722
  formula,
674
723
  oldSheetName: opts.sheetName,
@@ -761,6 +810,7 @@ class FormulaEngine {
761
810
  this.namedExpressionManager.removeWorkbook(workbookName);
762
811
  this.tableManager.removeWorkbook(workbookName);
763
812
  this.styleManager.removeWorkbookStyles(workbookName);
813
+ this.rangeMetadataManager.removeWorkbookRangeMetadata(workbookName);
764
814
  this.referenceManager.invalidateWorkbook(workbookName);
765
815
  this.emitMutation({
766
816
  touchedCells: [],
@@ -853,6 +903,14 @@ class FormulaEngine {
853
903
  });
854
904
  }
855
905
  }
906
+ for (const metadata of this.rangeMetadataManager.getAllRangeMetadata()) {
907
+ if (metadata.areas.some((area) => area.workbookName === fromWorkbookName)) {
908
+ this.rangeMetadataManager.addRangeMetadata({
909
+ metadata: metadata.metadata,
910
+ areas: metadata.areas.map((area) => area.workbookName === fromWorkbookName ? { ...area, workbookName: toWorkbookName } : area)
911
+ });
912
+ }
913
+ }
856
914
  this.workbookManager.updateFormulasForWorkbook(toWorkbookName, (formula) => import_workbook_renamer.renameWorkbookInFormula({
857
915
  formula,
858
916
  oldWorkbookName: fromWorkbookName,
@@ -869,6 +927,7 @@ class FormulaEngine {
869
927
  this.namedExpressionManager.renameWorkbook(opts);
870
928
  this.tableManager.updateTablesForWorkbookRename(opts);
871
929
  this.styleManager.updateWorkbookName(opts.workbookName, opts.newWorkbookName);
930
+ this.rangeMetadataManager.updateWorkbookName(opts.workbookName, opts.newWorkbookName);
872
931
  const changedCells = this.workbookManager.updateAllFormulas((formula) => import_workbook_renamer.renameWorkbookInFormula({
873
932
  formula,
874
933
  oldWorkbookName: opts.workbookName,
@@ -946,6 +1005,7 @@ class FormulaEngine {
946
1005
  tables: this.tableManager.tables,
947
1006
  conditionalStyles: this.styleManager.getAllConditionalStyles(),
948
1007
  cellStyles: this.styleManager.getAllCellStyles(),
1008
+ rangeMetadata: this.rangeMetadataManager.getAllRangeMetadata(),
949
1009
  references: this.referenceManager.getAllReferences()
950
1010
  };
951
1011
  }
@@ -954,19 +1014,41 @@ class FormulaEngine {
954
1014
  }
955
1015
  buildSerializedSnapshot() {
956
1016
  const evaluationSnapshots = this.dependencyManager.toSnapshot(this.evaluationManager);
1017
+ const workbookSnapshot = this.workbookManager.toSnapshot();
957
1018
  return {
958
1019
  version: import_engine_snapshot.ENGINE_SNAPSHOT_VERSION,
959
1020
  managers: {
960
- workbook: this.workbookManager.toSnapshot(),
961
- namedExpression: this.namedExpressionManager.toSnapshot(),
1021
+ workbook: workbookSnapshot,
1022
+ namedExpression: this.buildNamedExpressionSnapshot(workbookSnapshot),
962
1023
  table: this.tableManager.toSnapshot(),
963
1024
  style: this.styleManager.toSnapshot(),
1025
+ rangeMetadata: this.rangeMetadataManager.toSnapshot(),
964
1026
  reference: this.referenceManager.toSnapshot(),
965
1027
  dependency: evaluationSnapshots.dependency,
966
1028
  cache: evaluationSnapshots.cache
967
1029
  }
968
1030
  };
969
1031
  }
1032
+ buildNamedExpressionSnapshot(workbookSnapshot) {
1033
+ const namedExpressions = this.namedExpressionManager.toSnapshot();
1034
+ const workbookExpressions = new Map;
1035
+ const sheetExpressions = new Map;
1036
+ workbookSnapshot.forEach((workbook) => {
1037
+ const sourceWorkbookExpressions = namedExpressions.workbookExpressions.get(workbook.name);
1038
+ workbookExpressions.set(workbook.name, new Map(sourceWorkbookExpressions ?? []));
1039
+ const sourceSheets = namedExpressions.sheetExpressions.get(workbook.name);
1040
+ const workbookSheetExpressions = new Map;
1041
+ workbook.sheets.forEach((_, sheetName) => {
1042
+ workbookSheetExpressions.set(sheetName, new Map(sourceSheets?.get(sheetName) ?? []));
1043
+ });
1044
+ sheetExpressions.set(workbook.name, workbookSheetExpressions);
1045
+ });
1046
+ return {
1047
+ sheetExpressions,
1048
+ workbookExpressions,
1049
+ globalExpressions: new Map(namedExpressions.globalExpressions)
1050
+ };
1051
+ }
970
1052
  serializeEngine() {
971
1053
  return import_map_serializer.serialize(this.buildSerializedSnapshot());
972
1054
  }
@@ -975,6 +1057,7 @@ class FormulaEngine {
975
1057
  if (!deserialized || typeof deserialized !== "object" || !("version" in deserialized) || deserialized.version !== import_engine_snapshot.ENGINE_SNAPSHOT_VERSION || !deserialized.managers) {
976
1058
  throw new Error(`Unsupported serialized engine format. Expected EngineSnapshot version ${import_engine_snapshot.ENGINE_SNAPSHOT_VERSION}.`);
977
1059
  }
1060
+ this.namedExpressionManager.clear();
978
1061
  this.workbookManager.restoreFromSnapshot(deserialized.managers.workbook);
979
1062
  deserialized.managers.workbook.forEach((workbook) => {
980
1063
  this.namedExpressionManager.addWorkbook(workbook.name);
@@ -988,6 +1071,7 @@ class FormulaEngine {
988
1071
  this.namedExpressionManager.restoreFromSnapshot(deserialized.managers.namedExpression);
989
1072
  this.tableManager.restoreFromSnapshot(deserialized.managers.table);
990
1073
  this.styleManager.restoreFromSnapshot(deserialized.managers.style);
1074
+ this.rangeMetadataManager.restoreFromSnapshot(deserialized.managers.rangeMetadata);
991
1075
  this.referenceManager.restoreFromSnapshot(deserialized.managers.reference);
992
1076
  this.dependencyManager.restoreFromSnapshot({
993
1077
  dependency: deserialized.managers.dependency,
@@ -997,4 +1081,4 @@ class FormulaEngine {
997
1081
  }
998
1082
  }
999
1083
 
1000
- //# debugId=6B63B5DF523C393264756E2164756E21
1084
+ //# debugId=E6611E5B614618F964756E2164756E21