@ricsam/formula-engine 0.0.14 → 0.0.16

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.
@@ -309,6 +309,18 @@ class AutoFill {
309
309
  }
310
310
  }
311
311
  fillStyles(opts, seedRange, fillRange, direction) {
312
+ const fillRangeAddress = {
313
+ workbookName: opts.workbookName,
314
+ sheetName: opts.sheetName,
315
+ range: {
316
+ start: { col: fillRange.start.col, row: fillRange.start.row },
317
+ end: {
318
+ col: { type: "number", value: fillRange.end.col },
319
+ row: { type: "number", value: fillRange.end.row }
320
+ }
321
+ }
322
+ };
323
+ this.styleManager.clearCellStylesInRange(fillRangeAddress);
312
324
  const seedWidth = seedRange.end.col - seedRange.start.col + 1;
313
325
  const seedHeight = seedRange.end.row - seedRange.start.row + 1;
314
326
  const seedSpreadsheetRange = {
@@ -393,4 +405,4 @@ class AutoFill {
393
405
  }
394
406
  }
395
407
 
396
- //# debugId=B94B6C6C96B8F90B64756E2164756E21
408
+ //# debugId=9773118646A3BA2864756E2164756E21
@@ -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} 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 private engine: {\n setCellContent: (\n address: CellAddress,\n content: SerializedCellValue\n ) => void;\n setSheetContent: (\n opts: { sheetName: string; workbookName: string },\n content: Map<string, SerializedCellValue>\n ) => void;\n }\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\n this.engine.setSheetContent(opts, newContent);\n\n // Copy styles from seed to fill range\n this.fillStyles(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 */\n private fillStyles(\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 // 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 // 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 if (\n style.area.workbookName === opts.workbookName &&\n style.area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(style.area.range, sourceCellRange);\n if (intersection) {\n const newStyle: ConditionalStyle = {\n area: {\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 // Copy cell styles\n for (const style of allCellStyles) {\n if (\n style.area.workbookName === opts.workbookName &&\n style.area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(style.area.range, sourceCellRange);\n if (intersection) {\n const newStyle: DirectCellStyle = {\n area: {\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"
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 private engine: {\n setCellContent: (\n address: CellAddress,\n content: SerializedCellValue\n ) => void;\n setSheetContent: (\n opts: { sheetName: string; workbookName: string },\n content: Map<string, SerializedCellValue>\n ) => void;\n }\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\n this.engine.setSheetContent(opts, newContent);\n\n // Copy styles from seed to fill range\n this.fillStyles(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 if (\n style.area.workbookName === opts.workbookName &&\n style.area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(style.area.range, sourceCellRange);\n if (intersection) {\n const newStyle: ConditionalStyle = {\n area: {\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 // Copy cell styles\n for (const style of allCellStyles) {\n if (\n style.area.workbookName === opts.workbookName &&\n style.area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(style.area.range, sourceCellRange);\n if (intersection) {\n const newStyle: DirectCellStyle = {\n area: {\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"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "B94B6C6C96B8F90B64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "9773118646A3BA2864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -447,6 +447,37 @@ class FormulaEngine {
447
447
  });
448
448
  }
449
449
  }
450
+ const allConditionalStyles = this.styleManager.getAllConditionalStyles();
451
+ for (const style of allConditionalStyles) {
452
+ if (style.area.workbookName === fromWorkbookName) {
453
+ const newStyle = {
454
+ ...style,
455
+ area: {
456
+ ...style.area,
457
+ workbookName: toWorkbookName
458
+ }
459
+ };
460
+ this.styleManager.addConditionalStyle(newStyle);
461
+ }
462
+ }
463
+ const allCellStyles = this.styleManager.getAllCellStyles();
464
+ for (const style of allCellStyles) {
465
+ if (style.area.workbookName === fromWorkbookName) {
466
+ const newStyle = {
467
+ ...style,
468
+ area: {
469
+ ...style.area,
470
+ workbookName: toWorkbookName
471
+ }
472
+ };
473
+ this.styleManager.addCellStyle(newStyle);
474
+ }
475
+ }
476
+ this.workbookManager.updateFormulasForWorkbook(toWorkbookName, (formula) => import_workbook_renamer.renameWorkbookInFormula({
477
+ formula,
478
+ oldWorkbookName: fromWorkbookName,
479
+ newWorkbookName: toWorkbookName
480
+ }));
450
481
  this.reevaluate();
451
482
  this.eventManager.emitUpdate();
452
483
  }
@@ -537,4 +568,4 @@ class FormulaEngine {
537
568
  }
538
569
  }
539
570
 
540
- //# debugId=39FB6414BEC4DA0664756E2164756E21
571
+ //# debugId=28A747585109280764756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/engine.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Main FormulaEngine class\n * Core API implementation for spreadsheet calculations\n */\n\nimport {\n type CellAddress,\n type CellStyle,\n type ConditionalStyle,\n type CopyCellsOptions,\n type DirectCellStyle,\n type NamedExpression,\n type RangeAddress,\n type SerializedCellValue,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"./types.cjs\";\n\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { FormulaEvaluator } from \"../evaluator/formula-evaluator.cjs\";\nimport { AutoFill } from \"./autofill-utils.cjs\";\nimport { WorkbookManager } from \"./managers/workbook-manager.cjs\";\nimport { deserialize, serialize } from \"./map-serializer.cjs\";\nimport { renameNamedExpressionInFormula } from \"./named-expression-renamer.cjs\";\nimport { renameSheetInFormula } from \"./sheet-renamer.cjs\";\nimport { renameTableInFormula } from \"./table-renamer.cjs\";\nimport { renameWorkbookInFormula } from \"./workbook-renamer.cjs\";\nimport { cellAddressToKey, keyToCellAddress } from \"./utils.cjs\";\nimport { CacheManager } from \"./managers/cache-manager.cjs\";\nimport { NamedExpressionManager } from \"./managers/named-expression-manager.cjs\";\nimport { TableManager } from \"./managers/table-manager.cjs\";\nimport { EventManager } from \"./managers/event-manager.cjs\";\nimport { EvaluationManager } from \"./managers/evaluation-manager.cjs\";\nimport { DependencyManager } from \"./managers/dependency-manager.cjs\";\nimport { StyleManager } from \"./managers/style-manager.cjs\";\nimport { CopyManager } from \"./managers/copy-manager.cjs\";\n\n/**\n * Main FormulaEngine class\n */\nexport class FormulaEngine {\n private workbookManager: WorkbookManager;\n private namedExpressionManager: NamedExpressionManager;\n private tableManager: TableManager;\n private eventManager: EventManager;\n private evaluationManager: EvaluationManager;\n private autoFillManager: AutoFill;\n private dependencyManager: DependencyManager;\n private styleManager: StyleManager;\n private copyManager: CopyManager;\n\n /**\n * Public access to the store manager for testing\n */\n public _workbookManager: WorkbookManager;\n public _namedExpressionManager: NamedExpressionManager;\n public _tableManager: TableManager;\n public _eventManager: EventManager;\n public _evaluationManager: EvaluationManager;\n public _autoFillManager: AutoFill;\n public _dependencyManager: DependencyManager;\n public _styleManager: StyleManager;\n\n constructor() {\n this.eventManager = new EventManager();\n this.workbookManager = new WorkbookManager();\n this.namedExpressionManager = new NamedExpressionManager();\n this.tableManager = new TableManager(this.workbookManager);\n const cacheManager = new CacheManager();\n this.dependencyManager = new DependencyManager(\n cacheManager,\n this.workbookManager\n );\n\n const formulaEvaluator = new FormulaEvaluator(\n this.tableManager,\n this.dependencyManager,\n this.namedExpressionManager,\n );\n\n this.evaluationManager = new EvaluationManager(\n this.workbookManager,\n this.tableManager,\n formulaEvaluator,\n this.dependencyManager\n );\n\n this.styleManager = new StyleManager(\n this.evaluationManager\n );\n this.copyManager = new CopyManager(\n this.workbookManager,\n this.evaluationManager,\n this.styleManager\n );\n\n this.autoFillManager = new AutoFill(\n this.workbookManager,\n this.styleManager,\n this\n );\n\n this._workbookManager = this.workbookManager;\n this._namedExpressionManager = this.namedExpressionManager;\n this._tableManager = this.tableManager;\n this._eventManager = this.eventManager;\n this._evaluationManager = this.evaluationManager;\n this._autoFillManager = this.autoFillManager;\n this._dependencyManager = this.dependencyManager;\n this._styleManager = this.styleManager;\n }\n\n /**\n * Static factory method to build an empty engine\n */\n static buildEmpty(): FormulaEngine {\n return new FormulaEngine();\n }\n\n //#region Cell\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n return this.evaluationManager.getCellEvaluationResult(cellAddress);\n }\n\n getCellValue(cellAddress: CellAddress, debug?: boolean): SerializedCellValue {\n const result = this.getCellEvaluationResult(cellAddress);\n if (!result) {\n return \"\";\n }\n\n return this.evaluationManager.evaluationResultToSerializedValue(\n result,\n cellAddress,\n debug\n );\n }\n\n evaluateFormula(\n /**\n * formula without the leading = sign\n */\n formula: string, cellAddress: CellAddress): SerializedCellValue {\n return this.evaluationManager.evaluateFormula(formula, cellAddress);\n }\n\n getCellDependents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n getCellPrecedents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n //#endregion\n\n //#region Named Expressions\n addNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n }: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n this.namedExpressionManager.addNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n });\n\n // Re-evaluate all sheets since named expressions can be referenced from anywhere\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n removeNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n }: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n const found = this.namedExpressionManager.removeNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n });\n\n if (found) {\n // Re-evaluate all sheets since named expressions can be referenced from anywhere\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n return found;\n }\n\n updateNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n }: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n this.namedExpressionManager.updateNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n });\n\n // Re-evaluate all sheets since named expressions can be referenced from anywhere\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n renameNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n newName,\n }: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n newName: string;\n }) {\n const result = this.namedExpressionManager.renameNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n newName,\n });\n\n // Update all formulas that reference this named expression in sheet cells\n this.workbookManager.updateAllFormulas((formula) =>\n renameNamedExpressionInFormula(formula, expressionName, newName)\n );\n\n // Update named expressions that reference this named expression\n this.namedExpressionManager.updateAllNamedExpressions((formula) =>\n renameNamedExpressionInFormula(formula, expressionName, newName)\n );\n\n // Re-evaluate all sheets since named expressions can be referenced from anywhere\n this.reevaluate();\n this.eventManager.emitUpdate();\n\n return result;\n }\n\n setNamedExpressions(\n opts: (\n | {\n type: \"global\";\n }\n | {\n type: \"sheet\";\n sheetName: string;\n workbookName: string;\n }\n | {\n type: \"workbook\";\n workbookName: string;\n }\n ) & {\n expressions: Map<string, NamedExpression>;\n }\n ) {\n this.namedExpressionManager.setNamedExpressions(opts);\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n //#endregion\n\n //#region Tables\n addTable(props: {\n tableName: string;\n sheetName: string;\n workbookName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n }) {\n const table = this.tableManager.addTable({\n ...props,\n getCellValue: (cellAddress: CellAddress) =>\n this.getCellValue(cellAddress),\n });\n\n // Re-evaluate all sheets since structured references might depend on this table\n this.reevaluate();\n this.eventManager.emitUpdate();\n\n return table;\n }\n\n renameTable(\n workbookName: string,\n names: { oldName: string; newName: string }\n ) {\n this.tableManager.renameTable(workbookName, names);\n\n // Update all formulas that reference this table in sheet cells\n this.workbookManager.updateAllFormulas((formula) =>\n renameTableInFormula(formula, names.oldName, names.newName)\n );\n\n // Update named expressions that reference this table\n this.namedExpressionManager.updateAllNamedExpressions((formula) =>\n renameTableInFormula(formula, names.oldName, names.newName)\n );\n\n // Re-evaluate all sheets since structured references might depend on this table\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n updateTable(opts: {\n tableName: string;\n sheetName?: string;\n start?: string;\n numRows?: SpreadsheetRangeEnd;\n numCols?: number;\n workbookName: string;\n }) {\n this.tableManager.updateTable({\n ...opts,\n getCellValue: (cellAddress: CellAddress) =>\n this.getCellValue(cellAddress),\n });\n\n // Re-evaluate all sheets since structured references might depend on this table\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n removeTable(opts: { tableName: string; workbookName: string }) {\n const found = this.tableManager.removeTable(opts);\n\n if (found) {\n // Re-evaluate all sheets since structured references might depend on this table\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n return found;\n }\n\n resetTables(tables: Map<string, Map<string, TableDefinition>>) {\n this.tableManager.resetTables(tables);\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n getTables(workbookName: string) {\n return this.tableManager.getTables(workbookName);\n }\n\n isCellInTable(cellAddress: CellAddress): TableDefinition | undefined {\n return this.tableManager.isCellInTable(cellAddress);\n }\n\n //#endregion\n\n //#region Conditional Styling\n /**\n * Add a conditional style rule\n */\n addConditionalStyle(style: ConditionalStyle): void {\n this.styleManager.addConditionalStyle(style);\n this.eventManager.emitUpdate();\n }\n\n /**\n * Remove a conditional style rule by index\n */\n removeConditionalStyle(workbookName: string, index: number): boolean {\n const removed = this.styleManager.removeConditionalStyle(workbookName, index);\n if (removed) {\n this.eventManager.emitUpdate();\n }\n return removed;\n }\n\n /**\n * Get all conditional styles intersecting with a range\n */\n getConditionalStylesIntersectingWithRange(range: RangeAddress): ConditionalStyle[] {\n return this.styleManager.getConditionalStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the computed style for a specific cell\n */\n getCellStyle(cellAddress: CellAddress): CellStyle | undefined {\n return this.styleManager.getCellStyle(cellAddress);\n }\n\n /**\n * Add a direct cell style rule\n */\n addCellStyle(style: DirectCellStyle): void {\n this.styleManager.addCellStyle(style);\n this.eventManager.emitUpdate();\n }\n\n /**\n * Remove a direct cell style rule by index\n */\n removeCellStyle(workbookName: string, index: number): boolean {\n const removed = this.styleManager.removeCellStyle(workbookName, index);\n if (removed) {\n this.eventManager.emitUpdate();\n }\n return removed;\n }\n\n /**\n * Get all direct cell styles intersecting with a range\n */\n getStylesIntersectingWithRange(range: RangeAddress): DirectCellStyle[] {\n return this.styleManager.getStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the style for a range if all cells in the range have the same style\n * Returns the DirectCellStyle if the range is completely contained within a single style's area\n * Returns undefined if multiple styles, partial coverage, or no styles apply\n */\n getStyleForRange(range: RangeAddress): DirectCellStyle | undefined {\n return this.styleManager.getStyleForRange(range);\n }\n\n /**\n * Clear all cell styles and conditional styles for a given range\n * Adjusts existing style ranges rather than deleting them entirely\n */\n clearCellStyles(range: RangeAddress): void {\n this.styleManager.clearCellStyles(range);\n this.eventManager.emitUpdate();\n }\n\n //#endregion\n\n //#region Copy/Paste\n /**\n * Paste cells from source to target\n */\n pasteCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n this.copyManager.copyCells(source, target, options);\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n /**\n * Fill one or more areas with a seed range's content/style\n * Uses column-first strategy: fills down, then replicates right\n * Formulas are adjusted based on each target cell's offset from the seed\n * \n * @param seedRange - The range to use as a template/pattern\n * @param targetRanges - One or more range addresses to fill\n * @param options - Copy options (target: 'all'|'content'|'style', type: 'value'|'formula', cut: boolean)\n * \n * @example\n * // Fill F6:J10 with A1:B2 seed (2x2 pattern fills 5x5 area)\n * engine.fillAreas(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 1 }, row: { type: \"number\", value: 1 } }\n * }\n * },\n * [{\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 5, row: 5 },\n * end: { col: { type: \"number\", value: 9 }, row: { type: \"number\", value: 9 } }\n * }\n * }],\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n fillAreas(\n seedRange: RangeAddress,\n targetRanges: RangeAddress[],\n options: CopyCellsOptions\n ): void {\n this.copyManager.fillAreas(seedRange, targetRanges, options);\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n /**\n * Smart paste that automatically determines whether to paste or fill\n * Handles multiple selection areas - each area is independently pasted or filled\n * - If area is larger than source, uses fillAreas() to fill the area\n * - If area is same size or smaller, uses pasteCells() for normal paste\n * \n * @param sourceCells - The copied cells\n * @param pasteSelection - One or more selection areas where user is pasting\n * @param options - Copy options\n * \n * @example\n * // Copy A1, paste into two areas B1:C2 and E5:F6 - both get filled\n * engine.smartPaste(\n * [{ workbookName, sheetName, colIndex: 0, rowIndex: 0 }],\n * {\n * workbookName,\n * sheetName,\n * areas: [\n * { start: { col: 1, row: 0 }, end: { col: { type: \"number\", value: 2 }, row: { type: \"number\", value: 1 } } },\n * { start: { col: 4, row: 4 }, end: { col: { type: \"number\", value: 5 }, row: { type: \"number\", value: 5 } } }\n * ]\n * },\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n smartPaste(\n sourceCells: CellAddress[],\n pasteSelection: {\n workbookName: string;\n sheetName: string;\n areas: SpreadsheetRange[];\n },\n options: CopyCellsOptions\n ): void {\n if (sourceCells.length === 0) {\n return;\n }\n\n // Calculate source bounds once\n const sourceBounds = this.getBoundsFromCells(sourceCells);\n const sourceWidth = sourceBounds.maxCol - sourceBounds.minCol + 1;\n const sourceHeight = sourceBounds.maxRow - sourceBounds.minRow + 1;\n\n // Create seed range for fill operations\n const seedRange: RangeAddress = {\n workbookName: sourceCells[0]!.workbookName,\n sheetName: sourceCells[0]!.sheetName,\n range: {\n start: { col: sourceBounds.minCol, row: sourceBounds.minRow },\n end: {\n col: { type: \"number\", value: sourceBounds.maxCol },\n row: { type: \"number\", value: sourceBounds.maxRow },\n },\n },\n };\n\n // Process each selected area independently\n for (const area of pasteSelection.areas) {\n const pasteStartCol = area.start.col;\n const pasteStartRow = area.start.row;\n const pasteEndCol = area.end.col.type === \"number\"\n ? area.end.col.value\n : pasteStartCol;\n const pasteEndRow = area.end.row.type === \"number\"\n ? area.end.row.value\n : pasteStartRow;\n\n const pasteWidth = pasteEndCol - pasteStartCol + 1;\n const pasteHeight = pasteEndRow - pasteStartRow + 1;\n\n // Decide per area: paste or fill?\n const shouldFill = pasteWidth > sourceWidth || pasteHeight > sourceHeight;\n\n if (shouldFill) {\n // Use fillAreas for this area\n const targetRange: RangeAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n range: {\n start: { col: pasteStartCol, row: pasteStartRow },\n end: {\n col: { type: \"number\", value: pasteEndCol },\n row: { type: \"number\", value: pasteEndRow },\n },\n },\n };\n\n this.fillAreas(seedRange, [targetRange], options);\n } else {\n // Use pasteCells for this area\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: pasteStartCol,\n rowIndex: pasteStartRow,\n };\n\n this.pasteCells(sourceCells, target, options);\n }\n }\n }\n\n /**\n * Get bounds (min/max row/col) from an array of cell addresses\n */\n private getBoundsFromCells(cells: CellAddress[]): {\n minCol: number;\n minRow: number;\n maxCol: number;\n maxRow: number;\n } {\n if (cells.length === 0) {\n throw new Error(\"Cannot get bounds from empty cell array\");\n }\n\n let minCol = Infinity;\n let minRow = Infinity;\n let maxCol = -Infinity;\n let maxRow = -Infinity;\n\n for (const cell of cells) {\n minCol = Math.min(minCol, cell.colIndex);\n minRow = Math.min(minRow, cell.rowIndex);\n maxCol = Math.max(maxCol, cell.colIndex);\n maxRow = Math.max(maxRow, cell.rowIndex);\n }\n\n return { minCol, minRow, maxCol, maxRow };\n }\n //#endregion\n\n //#region Sheets\n addSheet(opts: { workbookName: string; sheetName: string }) {\n const newSheet = this.workbookManager.addSheet(opts);\n const wbLevel = this.namedExpressionManager.addSheet(opts);\n this.reevaluate();\n this.eventManager.emitUpdate();\n return newSheet;\n }\n\n removeSheet(opts: { workbookName: string; sheetName: string }) {\n const sheet = this.workbookManager.removeSheet(opts);\n\n // Clean up related data\n this.namedExpressionManager.removeSheet(opts);\n this.tableManager.removeSheet(opts);\n this.styleManager.removeSheetStyles(opts.workbookName, opts.sheetName);\n\n // Add engine-specific logic: re-evaluate since references might be affected\n this.reevaluate();\n this.eventManager.emitUpdate();\n\n return sheet;\n }\n\n renameSheet(opts: {\n sheetName: string;\n newSheetName: string;\n workbookName: string;\n }) {\n const sheet = this.workbookManager.renameSheet(opts);\n\n // Update scoped named expressions\n this.namedExpressionManager.renameSheet(opts);\n\n // Update tables that belong to the renamed sheet\n this.tableManager.updateTablesForSheetRename(opts);\n\n // Update conditional styles that reference this sheet\n this.styleManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n\n // Update all formulas that reference this sheet\n this.workbookManager.updateAllFormulas((formula) =>\n renameSheetInFormula({\n formula,\n oldSheetName: opts.sheetName,\n newSheetName: opts.newSheetName,\n })\n );\n\n // Add engine-specific logic: re-evaluate since references might be affected\n this.reevaluate();\n this.eventManager.emitUpdate();\n\n return sheet;\n }\n\n getSheets(workbookName: string) {\n return this.workbookManager.getSheets(workbookName);\n }\n\n getSheet({\n workbookName,\n sheetName,\n }: {\n workbookName: string;\n sheetName: string;\n }) {\n return this.workbookManager.getSheet({ workbookName, sheetName });\n }\n\n getSheetSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, SerializedCellValue> {\n return this.workbookManager.getSheetSerialized(opts);\n }\n\n //#endregion\n\n //#region Workbook\n addWorkbook(workbookName: string) {\n this.workbookManager.addWorkbook(workbookName);\n this.namedExpressionManager.addWorkbook(workbookName);\n this.tableManager.addWorkbook(workbookName);\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n removeWorkbook(workbookName: string) {\n this.workbookManager.removeWorkbook(workbookName);\n this.namedExpressionManager.removeWorkbook(workbookName);\n this.tableManager.removeWorkbook(workbookName);\n this.styleManager.removeWorkbookStyles(workbookName);\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n cloneWorkbook(fromWorkbookName: string, toWorkbookName: string) {\n // Check if source workbook exists\n const sourceWorkbook = this.workbookManager\n .getWorkbooks()\n .get(fromWorkbookName);\n if (!sourceWorkbook) {\n throw new Error(`Source workbook \"${fromWorkbookName}\" not found`);\n }\n\n // Check if target workbook name already exists\n if (this.workbookManager.getWorkbooks().has(toWorkbookName)) {\n throw new Error(`Target workbook \"${toWorkbookName}\" already exists`);\n }\n\n // Create new workbook\n this.addWorkbook(toWorkbookName);\n\n // Clone all sheets from source workbook\n for (const [sheetName, sheet] of sourceWorkbook.sheets) {\n // Add sheet to target workbook\n this.addSheet({\n workbookName: toWorkbookName,\n sheetName: sheetName,\n });\n\n // Copy all cell content using setSheetContent for efficiency\n this.setSheetContent(\n {\n workbookName: toWorkbookName,\n sheetName: sheetName,\n },\n new Map(sheet.content)\n );\n }\n\n // Clone workbook-scoped named expressions\n const sourceWorkbookExpressions = this.namedExpressionManager\n .getNamedExpressions()\n .workbookExpressions.get(fromWorkbookName);\n if (sourceWorkbookExpressions) {\n for (const [name, expression] of sourceWorkbookExpressions) {\n this.addNamedExpression({\n expressionName: name,\n expression: expression.expression,\n workbookName: toWorkbookName,\n });\n }\n }\n\n // Clone sheet-scoped named expressions\n const sourceSheetExpressions = this.namedExpressionManager\n .getNamedExpressions()\n .sheetExpressions.get(fromWorkbookName);\n if (sourceSheetExpressions) {\n for (const [sheetName, sheetExpressions] of sourceSheetExpressions) {\n for (const [name, expression] of sheetExpressions) {\n this.addNamedExpression({\n expressionName: name,\n expression: expression.expression,\n workbookName: toWorkbookName,\n sheetName: sheetName,\n });\n }\n }\n }\n\n // Clone tables\n const sourceTables = this.tableManager.tables.get(fromWorkbookName);\n if (sourceTables) {\n for (const [tableName, table] of sourceTables) {\n this.tableManager.copyTable(\n {\n workbookName: fromWorkbookName,\n tableName: tableName,\n },\n {\n workbookName: toWorkbookName,\n tableName: tableName,\n }\n );\n }\n }\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n renameWorkbook(opts: { workbookName: string; newWorkbookName: string }) {\n this.workbookManager.renameWorkbook(opts);\n\n // Update scoped named expressions\n this.namedExpressionManager.renameWorkbook(opts);\n\n // Update tables that belong to the renamed sheet\n this.tableManager.updateTablesForWorkbookRename(opts);\n\n // Update conditional styles that reference this workbook\n this.styleManager.updateWorkbookName(\n opts.workbookName,\n opts.newWorkbookName\n );\n\n // Update all formulas that reference this workbook\n this.workbookManager.updateAllFormulas((formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: opts.workbookName,\n newWorkbookName: opts.newWorkbookName,\n })\n );\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n getWorkbooks() {\n return this.workbookManager.getWorkbooks();\n }\n //#endregion\n\n //#region CRUD Operations\n /**\n * Overrides the content of a sheet.\n * @param sheetName - The name of the sheet to set the content of\n * @param content - A map of cell addresses to their serialized values\n * @remarks This method is used to set the content of a sheet. It will re-evaluate all sheets to ensure all dependencies are resolved correctly.\n */\n setSheetContent(\n opts: { sheetName: string; workbookName: string },\n content: Map<string, SerializedCellValue>\n ) {\n this.workbookManager.setSheetContent(opts, content);\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n setCellContent(address: CellAddress, content: SerializedCellValue) {\n this.workbookManager.setCellContent(address, content);\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n //#endregion\n\n //#region Evaluation\n\n /**\n * Re-evaluates all sheets to ensure all dependencies are resolved correctly\n *\n * but just clears the evaluation cache\n */\n reevaluate() {\n this.evaluationManager.clearEvaluationCache();\n }\n //#endregion\n\n //#region Auto-fill\n /**\n * Auto-fills one or more ranges based on the seedRange and the direction.\n * Supports pattern detection and style copying.\n */\n autoFill(\n opts: { sheetName: string; workbookName: string },\n /**\n * The user's original selection that defines the pattern/series.\n */\n seedRange: SpreadsheetRange,\n /**\n * One or more ranges to fill (the new cells populated by the drag, excluding the seed)\n */\n fillRanges: SpreadsheetRange[],\n /**\n * The direction of the fill.\n */\n direction: FillDirection\n ) {\n this.autoFillManager.fill(opts, seedRange, fillRanges, direction);\n }\n\n /**\n * Removes the content in the spreadsheet that is inside the range.\n */\n clearSpreadsheetRange(address: RangeAddress) {\n this.workbookManager.clearSpreadsheetRange(address);\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n //#endregion\n\n //#region State - UI library integration\n getState() {\n return {\n workbooks: this.workbookManager.getWorkbooks(),\n namedExpressions: this.namedExpressionManager.getNamedExpressions(),\n tables: this.tableManager.tables,\n conditionalStyles: this.styleManager.getAllConditionalStyles(),\n cellStyles: this.styleManager.getAllCellStyles(),\n };\n }\n\n onUpdate(listener: () => void) {\n return this.eventManager.onUpdate(listener);\n }\n\n serializeEngine(): string {\n return serialize(this.getState());\n }\n\n resetToSerializedEngine(data: string) {\n const deserialized = deserialize(data) as ReturnType<typeof this.getState>;\n\n this.workbookManager.resetWorkbooks(deserialized.workbooks);\n\n deserialized.workbooks.forEach((workbook) => {\n this.namedExpressionManager.addWorkbook(workbook.name);\n this.tableManager.addWorkbook(workbook.name);\n workbook.sheets.forEach((sheet) => {\n this.namedExpressionManager.addSheet({\n workbookName: workbook.name,\n sheetName: sheet.name,\n });\n });\n });\n\n this.namedExpressionManager.resetNamedExpressions(\n deserialized.namedExpressions\n );\n this.tableManager.resetTables(deserialized.tables);\n \n // Reset styles if present\n // Handle backward compatibility: if conditionalStyles is a Map, convert it\n let conditionalStylesArray: ConditionalStyle[] | undefined;\n let cellStylesArray: DirectCellStyle[] | undefined;\n \n if (deserialized.conditionalStyles) {\n if (deserialized.conditionalStyles instanceof Map) {\n // Old format: Map<string, ConditionalStyle[]>\n conditionalStylesArray = Array.from(deserialized.conditionalStyles.values()).flat();\n } else if (Array.isArray(deserialized.conditionalStyles)) {\n // New format: ConditionalStyle[]\n conditionalStylesArray = deserialized.conditionalStyles;\n }\n }\n \n if (deserialized.cellStyles) {\n if (Array.isArray(deserialized.cellStyles)) {\n cellStylesArray = deserialized.cellStyles;\n }\n }\n \n this.styleManager.resetStyles(conditionalStylesArray, cellStylesArray);\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n //#endregion\n}\n"
5
+ "/**\n * Main FormulaEngine class\n * Core API implementation for spreadsheet calculations\n */\n\nimport {\n type CellAddress,\n type CellStyle,\n type ConditionalStyle,\n type CopyCellsOptions,\n type DirectCellStyle,\n type NamedExpression,\n type RangeAddress,\n type SerializedCellValue,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"./types.cjs\";\n\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { FormulaEvaluator } from \"../evaluator/formula-evaluator.cjs\";\nimport { AutoFill } from \"./autofill-utils.cjs\";\nimport { WorkbookManager } from \"./managers/workbook-manager.cjs\";\nimport { deserialize, serialize } from \"./map-serializer.cjs\";\nimport { renameNamedExpressionInFormula } from \"./named-expression-renamer.cjs\";\nimport { renameSheetInFormula } from \"./sheet-renamer.cjs\";\nimport { renameTableInFormula } from \"./table-renamer.cjs\";\nimport { renameWorkbookInFormula } from \"./workbook-renamer.cjs\";\nimport { cellAddressToKey, keyToCellAddress } from \"./utils.cjs\";\nimport { CacheManager } from \"./managers/cache-manager.cjs\";\nimport { NamedExpressionManager } from \"./managers/named-expression-manager.cjs\";\nimport { TableManager } from \"./managers/table-manager.cjs\";\nimport { EventManager } from \"./managers/event-manager.cjs\";\nimport { EvaluationManager } from \"./managers/evaluation-manager.cjs\";\nimport { DependencyManager } from \"./managers/dependency-manager.cjs\";\nimport { StyleManager } from \"./managers/style-manager.cjs\";\nimport { CopyManager } from \"./managers/copy-manager.cjs\";\n\n/**\n * Main FormulaEngine class\n */\nexport class FormulaEngine {\n private workbookManager: WorkbookManager;\n private namedExpressionManager: NamedExpressionManager;\n private tableManager: TableManager;\n private eventManager: EventManager;\n private evaluationManager: EvaluationManager;\n private autoFillManager: AutoFill;\n private dependencyManager: DependencyManager;\n private styleManager: StyleManager;\n private copyManager: CopyManager;\n\n /**\n * Public access to the store manager for testing\n */\n public _workbookManager: WorkbookManager;\n public _namedExpressionManager: NamedExpressionManager;\n public _tableManager: TableManager;\n public _eventManager: EventManager;\n public _evaluationManager: EvaluationManager;\n public _autoFillManager: AutoFill;\n public _dependencyManager: DependencyManager;\n public _styleManager: StyleManager;\n\n constructor() {\n this.eventManager = new EventManager();\n this.workbookManager = new WorkbookManager();\n this.namedExpressionManager = new NamedExpressionManager();\n this.tableManager = new TableManager(this.workbookManager);\n const cacheManager = new CacheManager();\n this.dependencyManager = new DependencyManager(\n cacheManager,\n this.workbookManager\n );\n\n const formulaEvaluator = new FormulaEvaluator(\n this.tableManager,\n this.dependencyManager,\n this.namedExpressionManager,\n );\n\n this.evaluationManager = new EvaluationManager(\n this.workbookManager,\n this.tableManager,\n formulaEvaluator,\n this.dependencyManager\n );\n\n this.styleManager = new StyleManager(\n this.evaluationManager\n );\n this.copyManager = new CopyManager(\n this.workbookManager,\n this.evaluationManager,\n this.styleManager\n );\n\n this.autoFillManager = new AutoFill(\n this.workbookManager,\n this.styleManager,\n this\n );\n\n this._workbookManager = this.workbookManager;\n this._namedExpressionManager = this.namedExpressionManager;\n this._tableManager = this.tableManager;\n this._eventManager = this.eventManager;\n this._evaluationManager = this.evaluationManager;\n this._autoFillManager = this.autoFillManager;\n this._dependencyManager = this.dependencyManager;\n this._styleManager = this.styleManager;\n }\n\n /**\n * Static factory method to build an empty engine\n */\n static buildEmpty(): FormulaEngine {\n return new FormulaEngine();\n }\n\n //#region Cell\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n return this.evaluationManager.getCellEvaluationResult(cellAddress);\n }\n\n getCellValue(cellAddress: CellAddress, debug?: boolean): SerializedCellValue {\n const result = this.getCellEvaluationResult(cellAddress);\n if (!result) {\n return \"\";\n }\n\n return this.evaluationManager.evaluationResultToSerializedValue(\n result,\n cellAddress,\n debug\n );\n }\n\n evaluateFormula(\n /**\n * formula without the leading = sign\n */\n formula: string, cellAddress: CellAddress): SerializedCellValue {\n return this.evaluationManager.evaluateFormula(formula, cellAddress);\n }\n\n getCellDependents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n getCellPrecedents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n //#endregion\n\n //#region Named Expressions\n addNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n }: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n this.namedExpressionManager.addNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n });\n\n // Re-evaluate all sheets since named expressions can be referenced from anywhere\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n removeNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n }: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n const found = this.namedExpressionManager.removeNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n });\n\n if (found) {\n // Re-evaluate all sheets since named expressions can be referenced from anywhere\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n return found;\n }\n\n updateNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n }: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n this.namedExpressionManager.updateNamedExpression({\n expression,\n expressionName,\n sheetName,\n workbookName,\n });\n\n // Re-evaluate all sheets since named expressions can be referenced from anywhere\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n renameNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n newName,\n }: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n newName: string;\n }) {\n const result = this.namedExpressionManager.renameNamedExpression({\n expressionName,\n sheetName,\n workbookName,\n newName,\n });\n\n // Update all formulas that reference this named expression in sheet cells\n this.workbookManager.updateAllFormulas((formula) =>\n renameNamedExpressionInFormula(formula, expressionName, newName)\n );\n\n // Update named expressions that reference this named expression\n this.namedExpressionManager.updateAllNamedExpressions((formula) =>\n renameNamedExpressionInFormula(formula, expressionName, newName)\n );\n\n // Re-evaluate all sheets since named expressions can be referenced from anywhere\n this.reevaluate();\n this.eventManager.emitUpdate();\n\n return result;\n }\n\n setNamedExpressions(\n opts: (\n | {\n type: \"global\";\n }\n | {\n type: \"sheet\";\n sheetName: string;\n workbookName: string;\n }\n | {\n type: \"workbook\";\n workbookName: string;\n }\n ) & {\n expressions: Map<string, NamedExpression>;\n }\n ) {\n this.namedExpressionManager.setNamedExpressions(opts);\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n //#endregion\n\n //#region Tables\n addTable(props: {\n tableName: string;\n sheetName: string;\n workbookName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n }) {\n const table = this.tableManager.addTable({\n ...props,\n getCellValue: (cellAddress: CellAddress) =>\n this.getCellValue(cellAddress),\n });\n\n // Re-evaluate all sheets since structured references might depend on this table\n this.reevaluate();\n this.eventManager.emitUpdate();\n\n return table;\n }\n\n renameTable(\n workbookName: string,\n names: { oldName: string; newName: string }\n ) {\n this.tableManager.renameTable(workbookName, names);\n\n // Update all formulas that reference this table in sheet cells\n this.workbookManager.updateAllFormulas((formula) =>\n renameTableInFormula(formula, names.oldName, names.newName)\n );\n\n // Update named expressions that reference this table\n this.namedExpressionManager.updateAllNamedExpressions((formula) =>\n renameTableInFormula(formula, names.oldName, names.newName)\n );\n\n // Re-evaluate all sheets since structured references might depend on this table\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n updateTable(opts: {\n tableName: string;\n sheetName?: string;\n start?: string;\n numRows?: SpreadsheetRangeEnd;\n numCols?: number;\n workbookName: string;\n }) {\n this.tableManager.updateTable({\n ...opts,\n getCellValue: (cellAddress: CellAddress) =>\n this.getCellValue(cellAddress),\n });\n\n // Re-evaluate all sheets since structured references might depend on this table\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n removeTable(opts: { tableName: string; workbookName: string }) {\n const found = this.tableManager.removeTable(opts);\n\n if (found) {\n // Re-evaluate all sheets since structured references might depend on this table\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n return found;\n }\n\n resetTables(tables: Map<string, Map<string, TableDefinition>>) {\n this.tableManager.resetTables(tables);\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n getTables(workbookName: string) {\n return this.tableManager.getTables(workbookName);\n }\n\n isCellInTable(cellAddress: CellAddress): TableDefinition | undefined {\n return this.tableManager.isCellInTable(cellAddress);\n }\n\n //#endregion\n\n //#region Conditional Styling\n /**\n * Add a conditional style rule\n */\n addConditionalStyle(style: ConditionalStyle): void {\n this.styleManager.addConditionalStyle(style);\n this.eventManager.emitUpdate();\n }\n\n /**\n * Remove a conditional style rule by index\n */\n removeConditionalStyle(workbookName: string, index: number): boolean {\n const removed = this.styleManager.removeConditionalStyle(workbookName, index);\n if (removed) {\n this.eventManager.emitUpdate();\n }\n return removed;\n }\n\n /**\n * Get all conditional styles intersecting with a range\n */\n getConditionalStylesIntersectingWithRange(range: RangeAddress): ConditionalStyle[] {\n return this.styleManager.getConditionalStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the computed style for a specific cell\n */\n getCellStyle(cellAddress: CellAddress): CellStyle | undefined {\n return this.styleManager.getCellStyle(cellAddress);\n }\n\n /**\n * Add a direct cell style rule\n */\n addCellStyle(style: DirectCellStyle): void {\n this.styleManager.addCellStyle(style);\n this.eventManager.emitUpdate();\n }\n\n /**\n * Remove a direct cell style rule by index\n */\n removeCellStyle(workbookName: string, index: number): boolean {\n const removed = this.styleManager.removeCellStyle(workbookName, index);\n if (removed) {\n this.eventManager.emitUpdate();\n }\n return removed;\n }\n\n /**\n * Get all direct cell styles intersecting with a range\n */\n getStylesIntersectingWithRange(range: RangeAddress): DirectCellStyle[] {\n return this.styleManager.getStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the style for a range if all cells in the range have the same style\n * Returns the DirectCellStyle if the range is completely contained within a single style's area\n * Returns undefined if multiple styles, partial coverage, or no styles apply\n */\n getStyleForRange(range: RangeAddress): DirectCellStyle | undefined {\n return this.styleManager.getStyleForRange(range);\n }\n\n /**\n * Clear all cell styles and conditional styles for a given range\n * Adjusts existing style ranges rather than deleting them entirely\n */\n clearCellStyles(range: RangeAddress): void {\n this.styleManager.clearCellStyles(range);\n this.eventManager.emitUpdate();\n }\n\n //#endregion\n\n //#region Copy/Paste\n /**\n * Paste cells from source to target\n */\n pasteCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n this.copyManager.copyCells(source, target, options);\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n /**\n * Fill one or more areas with a seed range's content/style\n * Uses column-first strategy: fills down, then replicates right\n * Formulas are adjusted based on each target cell's offset from the seed\n * \n * @param seedRange - The range to use as a template/pattern\n * @param targetRanges - One or more range addresses to fill\n * @param options - Copy options (target: 'all'|'content'|'style', type: 'value'|'formula', cut: boolean)\n * \n * @example\n * // Fill F6:J10 with A1:B2 seed (2x2 pattern fills 5x5 area)\n * engine.fillAreas(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 1 }, row: { type: \"number\", value: 1 } }\n * }\n * },\n * [{\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 5, row: 5 },\n * end: { col: { type: \"number\", value: 9 }, row: { type: \"number\", value: 9 } }\n * }\n * }],\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n fillAreas(\n seedRange: RangeAddress,\n targetRanges: RangeAddress[],\n options: CopyCellsOptions\n ): void {\n this.copyManager.fillAreas(seedRange, targetRanges, options);\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n /**\n * Smart paste that automatically determines whether to paste or fill\n * Handles multiple selection areas - each area is independently pasted or filled\n * - If area is larger than source, uses fillAreas() to fill the area\n * - If area is same size or smaller, uses pasteCells() for normal paste\n * \n * @param sourceCells - The copied cells\n * @param pasteSelection - One or more selection areas where user is pasting\n * @param options - Copy options\n * \n * @example\n * // Copy A1, paste into two areas B1:C2 and E5:F6 - both get filled\n * engine.smartPaste(\n * [{ workbookName, sheetName, colIndex: 0, rowIndex: 0 }],\n * {\n * workbookName,\n * sheetName,\n * areas: [\n * { start: { col: 1, row: 0 }, end: { col: { type: \"number\", value: 2 }, row: { type: \"number\", value: 1 } } },\n * { start: { col: 4, row: 4 }, end: { col: { type: \"number\", value: 5 }, row: { type: \"number\", value: 5 } } }\n * ]\n * },\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n smartPaste(\n sourceCells: CellAddress[],\n pasteSelection: {\n workbookName: string;\n sheetName: string;\n areas: SpreadsheetRange[];\n },\n options: CopyCellsOptions\n ): void {\n if (sourceCells.length === 0) {\n return;\n }\n\n // Calculate source bounds once\n const sourceBounds = this.getBoundsFromCells(sourceCells);\n const sourceWidth = sourceBounds.maxCol - sourceBounds.minCol + 1;\n const sourceHeight = sourceBounds.maxRow - sourceBounds.minRow + 1;\n\n // Create seed range for fill operations\n const seedRange: RangeAddress = {\n workbookName: sourceCells[0]!.workbookName,\n sheetName: sourceCells[0]!.sheetName,\n range: {\n start: { col: sourceBounds.minCol, row: sourceBounds.minRow },\n end: {\n col: { type: \"number\", value: sourceBounds.maxCol },\n row: { type: \"number\", value: sourceBounds.maxRow },\n },\n },\n };\n\n // Process each selected area independently\n for (const area of pasteSelection.areas) {\n const pasteStartCol = area.start.col;\n const pasteStartRow = area.start.row;\n const pasteEndCol = area.end.col.type === \"number\"\n ? area.end.col.value\n : pasteStartCol;\n const pasteEndRow = area.end.row.type === \"number\"\n ? area.end.row.value\n : pasteStartRow;\n\n const pasteWidth = pasteEndCol - pasteStartCol + 1;\n const pasteHeight = pasteEndRow - pasteStartRow + 1;\n\n // Decide per area: paste or fill?\n const shouldFill = pasteWidth > sourceWidth || pasteHeight > sourceHeight;\n\n if (shouldFill) {\n // Use fillAreas for this area\n const targetRange: RangeAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n range: {\n start: { col: pasteStartCol, row: pasteStartRow },\n end: {\n col: { type: \"number\", value: pasteEndCol },\n row: { type: \"number\", value: pasteEndRow },\n },\n },\n };\n\n this.fillAreas(seedRange, [targetRange], options);\n } else {\n // Use pasteCells for this area\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: pasteStartCol,\n rowIndex: pasteStartRow,\n };\n\n this.pasteCells(sourceCells, target, options);\n }\n }\n }\n\n /**\n * Get bounds (min/max row/col) from an array of cell addresses\n */\n private getBoundsFromCells(cells: CellAddress[]): {\n minCol: number;\n minRow: number;\n maxCol: number;\n maxRow: number;\n } {\n if (cells.length === 0) {\n throw new Error(\"Cannot get bounds from empty cell array\");\n }\n\n let minCol = Infinity;\n let minRow = Infinity;\n let maxCol = -Infinity;\n let maxRow = -Infinity;\n\n for (const cell of cells) {\n minCol = Math.min(minCol, cell.colIndex);\n minRow = Math.min(minRow, cell.rowIndex);\n maxCol = Math.max(maxCol, cell.colIndex);\n maxRow = Math.max(maxRow, cell.rowIndex);\n }\n\n return { minCol, minRow, maxCol, maxRow };\n }\n //#endregion\n\n //#region Sheets\n addSheet(opts: { workbookName: string; sheetName: string }) {\n const newSheet = this.workbookManager.addSheet(opts);\n const wbLevel = this.namedExpressionManager.addSheet(opts);\n this.reevaluate();\n this.eventManager.emitUpdate();\n return newSheet;\n }\n\n removeSheet(opts: { workbookName: string; sheetName: string }) {\n const sheet = this.workbookManager.removeSheet(opts);\n\n // Clean up related data\n this.namedExpressionManager.removeSheet(opts);\n this.tableManager.removeSheet(opts);\n this.styleManager.removeSheetStyles(opts.workbookName, opts.sheetName);\n\n // Add engine-specific logic: re-evaluate since references might be affected\n this.reevaluate();\n this.eventManager.emitUpdate();\n\n return sheet;\n }\n\n renameSheet(opts: {\n sheetName: string;\n newSheetName: string;\n workbookName: string;\n }) {\n const sheet = this.workbookManager.renameSheet(opts);\n\n // Update scoped named expressions\n this.namedExpressionManager.renameSheet(opts);\n\n // Update tables that belong to the renamed sheet\n this.tableManager.updateTablesForSheetRename(opts);\n\n // Update conditional styles that reference this sheet\n this.styleManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n\n // Update all formulas that reference this sheet\n this.workbookManager.updateAllFormulas((formula) =>\n renameSheetInFormula({\n formula,\n oldSheetName: opts.sheetName,\n newSheetName: opts.newSheetName,\n })\n );\n\n // Add engine-specific logic: re-evaluate since references might be affected\n this.reevaluate();\n this.eventManager.emitUpdate();\n\n return sheet;\n }\n\n getSheets(workbookName: string) {\n return this.workbookManager.getSheets(workbookName);\n }\n\n getSheet({\n workbookName,\n sheetName,\n }: {\n workbookName: string;\n sheetName: string;\n }) {\n return this.workbookManager.getSheet({ workbookName, sheetName });\n }\n\n getSheetSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, SerializedCellValue> {\n return this.workbookManager.getSheetSerialized(opts);\n }\n\n //#endregion\n\n //#region Workbook\n addWorkbook(workbookName: string) {\n this.workbookManager.addWorkbook(workbookName);\n this.namedExpressionManager.addWorkbook(workbookName);\n this.tableManager.addWorkbook(workbookName);\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n removeWorkbook(workbookName: string) {\n this.workbookManager.removeWorkbook(workbookName);\n this.namedExpressionManager.removeWorkbook(workbookName);\n this.tableManager.removeWorkbook(workbookName);\n this.styleManager.removeWorkbookStyles(workbookName);\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n cloneWorkbook(fromWorkbookName: string, toWorkbookName: string) {\n // Check if source workbook exists\n const sourceWorkbook = this.workbookManager\n .getWorkbooks()\n .get(fromWorkbookName);\n if (!sourceWorkbook) {\n throw new Error(`Source workbook \"${fromWorkbookName}\" not found`);\n }\n\n // Check if target workbook name already exists\n if (this.workbookManager.getWorkbooks().has(toWorkbookName)) {\n throw new Error(`Target workbook \"${toWorkbookName}\" already exists`);\n }\n\n // Create new workbook\n this.addWorkbook(toWorkbookName);\n\n // Clone all sheets from source workbook\n for (const [sheetName, sheet] of sourceWorkbook.sheets) {\n // Add sheet to target workbook\n this.addSheet({\n workbookName: toWorkbookName,\n sheetName: sheetName,\n });\n\n // Copy all cell content using setSheetContent for efficiency\n this.setSheetContent(\n {\n workbookName: toWorkbookName,\n sheetName: sheetName,\n },\n new Map(sheet.content)\n );\n }\n\n // Clone workbook-scoped named expressions\n const sourceWorkbookExpressions = this.namedExpressionManager\n .getNamedExpressions()\n .workbookExpressions.get(fromWorkbookName);\n if (sourceWorkbookExpressions) {\n for (const [name, expression] of sourceWorkbookExpressions) {\n this.addNamedExpression({\n expressionName: name,\n expression: expression.expression,\n workbookName: toWorkbookName,\n });\n }\n }\n\n // Clone sheet-scoped named expressions\n const sourceSheetExpressions = this.namedExpressionManager\n .getNamedExpressions()\n .sheetExpressions.get(fromWorkbookName);\n if (sourceSheetExpressions) {\n for (const [sheetName, sheetExpressions] of sourceSheetExpressions) {\n for (const [name, expression] of sheetExpressions) {\n this.addNamedExpression({\n expressionName: name,\n expression: expression.expression,\n workbookName: toWorkbookName,\n sheetName: sheetName,\n });\n }\n }\n }\n\n // Clone tables\n const sourceTables = this.tableManager.tables.get(fromWorkbookName);\n if (sourceTables) {\n for (const [tableName, table] of sourceTables) {\n this.tableManager.copyTable(\n {\n workbookName: fromWorkbookName,\n tableName: tableName,\n },\n {\n workbookName: toWorkbookName,\n tableName: tableName,\n }\n );\n }\n }\n\n // Clone conditional styles\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n for (const style of allConditionalStyles) {\n if (style.area.workbookName === fromWorkbookName) {\n const newStyle: ConditionalStyle = {\n ...style,\n area: {\n ...style.area,\n workbookName: toWorkbookName,\n },\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n\n // Clone cell styles\n const allCellStyles = this.styleManager.getAllCellStyles();\n for (const style of allCellStyles) {\n if (style.area.workbookName === fromWorkbookName) {\n const newStyle: DirectCellStyle = {\n ...style,\n area: {\n ...style.area,\n workbookName: toWorkbookName,\n },\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n\n // Update formulas in cloned workbook that reference the source workbook\n this.workbookManager.updateFormulasForWorkbook(toWorkbookName, (formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: fromWorkbookName,\n newWorkbookName: toWorkbookName,\n })\n );\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n renameWorkbook(opts: { workbookName: string; newWorkbookName: string }) {\n this.workbookManager.renameWorkbook(opts);\n\n // Update scoped named expressions\n this.namedExpressionManager.renameWorkbook(opts);\n\n // Update tables that belong to the renamed sheet\n this.tableManager.updateTablesForWorkbookRename(opts);\n\n // Update conditional styles that reference this workbook\n this.styleManager.updateWorkbookName(\n opts.workbookName,\n opts.newWorkbookName\n );\n\n // Update all formulas that reference this workbook\n this.workbookManager.updateAllFormulas((formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: opts.workbookName,\n newWorkbookName: opts.newWorkbookName,\n })\n );\n\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n getWorkbooks() {\n return this.workbookManager.getWorkbooks();\n }\n //#endregion\n\n //#region CRUD Operations\n /**\n * Overrides the content of a sheet.\n * @param sheetName - The name of the sheet to set the content of\n * @param content - A map of cell addresses to their serialized values\n * @remarks This method is used to set the content of a sheet. It will re-evaluate all sheets to ensure all dependencies are resolved correctly.\n */\n setSheetContent(\n opts: { sheetName: string; workbookName: string },\n content: Map<string, SerializedCellValue>\n ) {\n this.workbookManager.setSheetContent(opts, content);\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n\n setCellContent(address: CellAddress, content: SerializedCellValue) {\n this.workbookManager.setCellContent(address, content);\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n //#endregion\n\n //#region Evaluation\n\n /**\n * Re-evaluates all sheets to ensure all dependencies are resolved correctly\n *\n * but just clears the evaluation cache\n */\n reevaluate() {\n this.evaluationManager.clearEvaluationCache();\n }\n //#endregion\n\n //#region Auto-fill\n /**\n * Auto-fills one or more ranges based on the seedRange and the direction.\n * Supports pattern detection and style copying.\n */\n autoFill(\n opts: { sheetName: string; workbookName: string },\n /**\n * The user's original selection that defines the pattern/series.\n */\n seedRange: SpreadsheetRange,\n /**\n * One or more ranges to fill (the new cells populated by the drag, excluding the seed)\n */\n fillRanges: SpreadsheetRange[],\n /**\n * The direction of the fill.\n */\n direction: FillDirection\n ) {\n this.autoFillManager.fill(opts, seedRange, fillRanges, direction);\n }\n\n /**\n * Removes the content in the spreadsheet that is inside the range.\n */\n clearSpreadsheetRange(address: RangeAddress) {\n this.workbookManager.clearSpreadsheetRange(address);\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n //#endregion\n\n //#region State - UI library integration\n getState() {\n return {\n workbooks: this.workbookManager.getWorkbooks(),\n namedExpressions: this.namedExpressionManager.getNamedExpressions(),\n tables: this.tableManager.tables,\n conditionalStyles: this.styleManager.getAllConditionalStyles(),\n cellStyles: this.styleManager.getAllCellStyles(),\n };\n }\n\n onUpdate(listener: () => void) {\n return this.eventManager.onUpdate(listener);\n }\n\n serializeEngine(): string {\n return serialize(this.getState());\n }\n\n resetToSerializedEngine(data: string) {\n const deserialized = deserialize(data) as ReturnType<typeof this.getState>;\n\n this.workbookManager.resetWorkbooks(deserialized.workbooks);\n\n deserialized.workbooks.forEach((workbook) => {\n this.namedExpressionManager.addWorkbook(workbook.name);\n this.tableManager.addWorkbook(workbook.name);\n workbook.sheets.forEach((sheet) => {\n this.namedExpressionManager.addSheet({\n workbookName: workbook.name,\n sheetName: sheet.name,\n });\n });\n });\n\n this.namedExpressionManager.resetNamedExpressions(\n deserialized.namedExpressions\n );\n this.tableManager.resetTables(deserialized.tables);\n \n // Reset styles if present\n // Handle backward compatibility: if conditionalStyles is a Map, convert it\n let conditionalStylesArray: ConditionalStyle[] | undefined;\n let cellStylesArray: DirectCellStyle[] | undefined;\n \n if (deserialized.conditionalStyles) {\n if (deserialized.conditionalStyles instanceof Map) {\n // Old format: Map<string, ConditionalStyle[]>\n conditionalStylesArray = Array.from(deserialized.conditionalStyles.values()).flat();\n } else if (Array.isArray(deserialized.conditionalStyles)) {\n // New format: ConditionalStyle[]\n conditionalStylesArray = deserialized.conditionalStyles;\n }\n }\n \n if (deserialized.cellStyles) {\n if (Array.isArray(deserialized.cellStyles)) {\n cellStylesArray = deserialized.cellStyles;\n }\n }\n \n this.styleManager.resetStyles(conditionalStylesArray, cellStylesArray);\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.reevaluate();\n this.eventManager.emitUpdate();\n }\n //#endregion\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "39FB6414BEC4DA0664756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "28A747585109280764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -182,9 +182,15 @@ class CopyManager {
182
182
  }
183
183
  }
184
184
  copyFormatting(sourceCells, sourceTopLeft, target, rowOffset, colOffset) {
185
+ const sourceRange = this.getBoundingBox(sourceCells);
186
+ const targetRange = {
187
+ workbookName: target.workbookName,
188
+ sheetName: target.sheetName,
189
+ range: this.adjustRange(sourceRange, rowOffset, colOffset)
190
+ };
191
+ this.styleManager.clearCellStylesInRange(targetRange);
185
192
  const allConditionalStyles = this.styleManager.getAllConditionalStyles();
186
193
  const allCellStyles = this.styleManager.getAllCellStyles();
187
- const sourceRange = this.getBoundingBox(sourceCells);
188
194
  for (const style of allConditionalStyles) {
189
195
  if (style.area.workbookName === sourceTopLeft.workbookName && style.area.sheetName === sourceTopLeft.sheetName) {
190
196
  const intersection = import_range_utils.intersectRanges(style.area.range, sourceRange);
@@ -276,6 +282,9 @@ class CopyManager {
276
282
  }
277
283
  }
278
284
  fillRangeWithSeed(seedRange, targetRange, options) {
285
+ if (options.copyStyles) {
286
+ this.styleManager.clearCellStylesInRange(targetRange);
287
+ }
279
288
  const seedCells = this.expandRangeToCells(seedRange);
280
289
  const seedWidth = this.getRangeWidth(seedRange);
281
290
  const seedHeight = this.getRangeHeight(seedRange);
@@ -486,6 +495,18 @@ class CopyManager {
486
495
  }
487
496
  }
488
497
  copyCellFormatting(sourceCell, targetCell) {
498
+ const targetCellRange = {
499
+ workbookName: targetCell.workbookName,
500
+ sheetName: targetCell.sheetName,
501
+ range: {
502
+ start: { col: targetCell.colIndex, row: targetCell.rowIndex },
503
+ end: {
504
+ col: { type: "number", value: targetCell.colIndex },
505
+ row: { type: "number", value: targetCell.rowIndex }
506
+ }
507
+ }
508
+ };
509
+ this.styleManager.clearCellStylesInRange(targetCellRange);
489
510
  const allConditionalStyles = this.styleManager.getAllConditionalStyles();
490
511
  const allCellStyles = this.styleManager.getAllCellStyles();
491
512
  const sourceCellRange = {
@@ -542,4 +563,4 @@ class CopyManager {
542
563
  }
543
564
  }
544
565
 
545
- //# debugId=DAB7BAA575141E6064756E2164756E21
566
+ //# debugId=9442C2DD8C5DC2E064756E2164756E21