@ricsam/formula-engine 0.2.10 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/core/autofill-utils.cjs +68 -2
- package/dist/cjs/core/autofill-utils.cjs.map +3 -3
- package/dist/cjs/core/engine-snapshot.cjs +2 -2
- package/dist/cjs/core/engine-snapshot.cjs.map +3 -3
- package/dist/cjs/core/engine.cjs +89 -5
- package/dist/cjs/core/engine.cjs.map +3 -3
- package/dist/cjs/core/managers/copy-manager.cjs +163 -14
- package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
- package/dist/cjs/core/managers/named-expression-manager.cjs +18 -16
- package/dist/cjs/core/managers/named-expression-manager.cjs.map +3 -3
- package/dist/cjs/core/managers/range-metadata-manager.cjs +135 -0
- package/dist/cjs/core/managers/range-metadata-manager.cjs.map +10 -0
- package/dist/cjs/core/types.cjs.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/core/autofill-utils.mjs +68 -2
- package/dist/mjs/core/autofill-utils.mjs.map +3 -3
- package/dist/mjs/core/engine-snapshot.mjs +2 -2
- package/dist/mjs/core/engine-snapshot.mjs.map +3 -3
- package/dist/mjs/core/engine.mjs +89 -5
- package/dist/mjs/core/engine.mjs.map +3 -3
- package/dist/mjs/core/managers/copy-manager.mjs +163 -14
- package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
- package/dist/mjs/core/managers/named-expression-manager.mjs +18 -16
- package/dist/mjs/core/managers/named-expression-manager.mjs.map +3 -3
- package/dist/mjs/core/managers/range-metadata-manager.mjs +95 -0
- package/dist/mjs/core/managers/range-metadata-manager.mjs.map +10 -0
- package/dist/mjs/core/types.mjs.map +1 -1
- package/dist/mjs/package.json +1 -1
- package/dist/types/core/autofill-utils.d.ts +7 -1
- package/dist/types/core/engine-snapshot.d.ts +4 -2
- package/dist/types/core/engine.d.ts +34 -1
- package/dist/types/core/managers/copy-manager.d.ts +11 -1
- package/dist/types/core/managers/named-expression-manager.d.ts +1 -0
- package/dist/types/core/managers/range-metadata-manager.d.ts +22 -0
- package/dist/types/core/types.d.ts +19 -6
- package/package.json +1 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/core/autofill-utils.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * AutoFill class for handling spreadsheet autofill functionality\n */\n\nimport type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRange,\n FiniteSpreadsheetRange,\n LocalCellAddress,\n ConditionalStyle,\n DirectCellStyle,\n RangeAddress,\n} from \"./types.mjs\";\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { parseFormula } from \"../parser/parser.mjs\";\nimport { astToString } from \"../parser/formatter.mjs\";\nimport { transformAST } from \"./ast-traverser.mjs\";\nimport type { ReferenceNode, RangeNode } from \"../parser/ast.mjs\";\nimport { getCellReference } from \"./utils.mjs\";\nimport type { WorkbookManager } from \"./managers/workbook-manager.mjs\";\nimport type { StyleManager } from \"./managers/style-manager.mjs\";\nimport { intersectRanges } from \"./utils/range-utils.mjs\";\n\nexport class AutoFill {\n constructor(\n private workbookManager: WorkbookManager,\n private styleManager: StyleManager\n ) {}\n\n /**\n * Converts a SpreadsheetRange to FiniteSpreadsheetRange, throwing an error if infinite\n */\n private toFiniteRange(range: SpreadsheetRange): FiniteSpreadsheetRange {\n if (\n range.end.col.type === \"infinity\" ||\n range.end.row.type === \"infinity\"\n ) {\n throw new Error(\"AutoFill with infinite ranges is not supported\");\n }\n\n return {\n start: range.start,\n end: {\n col: range.end.col.value,\n row: range.end.row.value,\n },\n };\n }\n\n private getCellContent(address: CellAddress): SerializedCellValue {\n const sheet = this.workbookManager.getSheet(address);\n if (!sheet) {\n throw new Error(\"Sheet not found\");\n }\n return sheet.content.get(getCellReference(address));\n }\n\n fill(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRanges: SpreadsheetRange[],\n direction: FillDirection\n ) {\n // Process each fill range\n for (const fillRange of fillRanges) {\n this.fillSingleRange(opts, seedRange, fillRange, direction);\n }\n }\n\n /**\n * Fill a single range with seed data and styles\n */\n private fillSingleRange(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRange: SpreadsheetRange,\n direction: FillDirection\n ) {\n // Convert to finite ranges (throws error if infinite)\n const finiteSeedRange = this.toFiniteRange(seedRange);\n const finiteFillRange = this.toFiniteRange(fillRange);\n\n // Get seed cells data\n const seedCells = this.getSeedCells(opts, finiteSeedRange);\n\n // Collect all changes to apply in a single batch\n const changes = new Map<string, SerializedCellValue>();\n\n // Determine if we have a single cell or multi-cell seed\n const isSingleCell = seedCells.length === 1;\n\n if (isSingleCell) {\n const seedCell = seedCells[0];\n if (seedCell) {\n this.collectSingleCellPattern(\n seedCell,\n finiteFillRange,\n direction,\n changes\n );\n }\n } else {\n this.collectMultiCellPattern(\n seedCells,\n finiteSeedRange,\n finiteFillRange,\n direction,\n changes\n );\n }\n\n // Get current sheet content and merge with changes\n const currentContent = this.workbookManager.getSheetSerialized(opts);\n const newContent = new Map(currentContent);\n\n // Apply all changes\n changes.forEach((value, key) => {\n if (value === undefined) {\n newContent.delete(key);\n } else {\n newContent.set(key, value);\n }\n });\n\n // Update sheet content in a single operation (direct manager call, not through engine)\n this.workbookManager.setSheetContent(opts, newContent);\n\n // Copy styles from seed to fill range\n this.fillStyles(opts, finiteSeedRange, finiteFillRange, direction);\n\n // Copy metadata from seed to fill range\n this.fillMetadata(opts, finiteSeedRange, finiteFillRange, direction);\n }\n\n private getSeedCells(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange\n ) {\n const cells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }> = [];\n\n const startCol = seedRange.start.col;\n const startRow = seedRange.start.row;\n const endCol = seedRange.end.col;\n const endRow = seedRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const address: CellAddress = {\n sheetName: opts.sheetName,\n workbookName: opts.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n const content = this.getCellContent(address);\n cells.push({\n address,\n content,\n rowOffset: row - startRow,\n colOffset: col - startCol,\n });\n }\n }\n\n return cells;\n }\n\n private collectSingleCellPattern(\n seedCell: { address: CellAddress; content: SerializedCellValue },\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n const { content } = seedCell;\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: CellAddress = {\n sheetName: seedCell.address.sheetName,\n workbookName: seedCell.address.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (content === undefined || content === \"\") {\n // Blank cell - fills blanks (effectively clears targets)\n newContent = undefined;\n } else if (typeof content === \"string\" && content.startsWith(\"=\")) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n content,\n seedCell.address,\n targetAddress\n );\n } else {\n // Number or text - copy by default\n newContent = content;\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private collectMultiCellPattern(\n seedCells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n // Try to infer linear step from numbers\n const step = this.inferLinearStep(seedCells, direction);\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: LocalCellAddress = {\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (step !== null) {\n // Use linear progression\n newContent = this.applyLinearStep(\n seedCells,\n targetAddress,\n seedRange,\n step,\n direction\n );\n } else {\n // Repeat pattern (cycle through seed block)\n const seedColOffset = (col - startCol) % seedWidth;\n const seedRowOffset = (row - startRow) % seedHeight;\n\n const seedCell = seedCells.find(\n (cell) =>\n cell.colOffset === seedColOffset &&\n cell.rowOffset === seedRowOffset\n );\n\n if (seedCell) {\n if (\n typeof seedCell.content === \"string\" &&\n seedCell.content.startsWith(\"=\")\n ) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n seedCell.content,\n seedCell.address,\n targetAddress\n );\n } else {\n newContent = seedCell.content;\n }\n } else {\n newContent = undefined;\n }\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private inferLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n direction: FillDirection\n ): number | null {\n // Extract numeric values in the direction of fill\n const values: number[] = [];\n\n if (direction === \"down\" || direction === \"up\") {\n // Look at first column, different rows\n const firstColCells = seedCells\n .filter((cell) => cell.colOffset === 0)\n .sort((a, b) => a.rowOffset - b.rowOffset);\n\n for (const cell of firstColCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n } else {\n // Look at first row, different columns\n const firstRowCells = seedCells\n .filter((cell) => cell.rowOffset === 0)\n .sort((a, b) => a.colOffset - b.colOffset);\n\n for (const cell of firstRowCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n }\n\n if (values.length < 2) {\n return null;\n }\n\n // Check if there's a consistent step\n const step = values[1]! - values[0]!;\n for (let i = 2; i < values.length; i++) {\n if (Math.abs(values[i]! - values[i - 1]! - step) > 1e-10) {\n return null; // Inconsistent step\n }\n }\n\n return step;\n }\n\n private applyLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n targetAddress: LocalCellAddress,\n seedRange: FiniteSpreadsheetRange,\n step: number,\n direction: FillDirection\n ): SerializedCellValue {\n // Calculate the position in the overall sequence\n let positionInSequence: number;\n let baseValue: number;\n\n if (direction === \"down\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"up\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed (same as down direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"right\") {\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else {\n // left\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed (same as right direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n }\n\n if (isNaN(baseValue)) {\n return undefined;\n }\n\n const result = baseValue + step * positionInSequence;\n return typeof seedCells[0]?.content === \"string\"\n ? result.toString()\n : result;\n }\n\n private adjustFormulaReferences(\n formula: string,\n sourceAddress: LocalCellAddress,\n targetAddress: LocalCellAddress\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const rowDelta = targetAddress.rowIndex - sourceAddress.rowIndex;\n const colDelta = targetAddress.colIndex - sourceAddress.colIndex;\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula references:\", error);\n return formula;\n }\n }\n\n /**\n * Fill styles from seed range to fill range based on direction\n * Clears existing cell styles in fill range first (Excel behavior)\n */\n private fillStyles(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n // STEP 1: Clear existing cell styles in fill range (Excel-like replacement)\n const fillRangeAddress: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: fillRange.start.col, row: fillRange.start.row },\n end: {\n col: { type: \"number\", value: fillRange.end.col },\n row: { type: \"number\", value: fillRange.end.row },\n },\n },\n };\n \n this.styleManager.clearCellStylesInRange(fillRangeAddress);\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // STEP 2: Get all styles intersecting with seed range\n const seedSpreadsheetRange: SpreadsheetRange = {\n start: { col: seedRange.start.col, row: seedRange.start.row },\n end: {\n col: { type: \"number\", value: seedRange.end.col },\n row: { type: \"number\", value: seedRange.end.row },\n },\n };\n\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n // STEP 3: For each cell in fill range, determine corresponding seed cell and copy styles\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: seedCol, row: seedRow },\n end: {\n col: { type: \"number\", value: seedCol },\n row: { type: \"number\", value: seedRow },\n },\n };\n\n const targetCell: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy conditional styles\n for (const style of allConditionalStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: ConditionalStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n }\n\n // Copy cell styles\n for (const style of allCellStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: DirectCellStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Copy metadata from seed range to fill range with pattern repetition\n */\n private fillMetadata(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // For each cell in fill range, copy metadata from corresponding seed cell\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: seedCol,\n rowIndex: seedRow,\n };\n\n const targetCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy metadata from source to target\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCellAddress);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCellAddress, { ...sourceMetadata });\n }\n }\n }\n }\n}\n"
|
|
5
|
+
"/**\n * AutoFill class for handling spreadsheet autofill functionality\n */\n\nimport type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRange,\n FiniteSpreadsheetRange,\n LocalCellAddress,\n ConditionalStyle,\n DirectCellStyle,\n RangeAddress,\n} from \"./types.mjs\";\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { parseFormula } from \"../parser/parser.mjs\";\nimport { astToString } from \"../parser/formatter.mjs\";\nimport { transformAST } from \"./ast-traverser.mjs\";\nimport type { ReferenceNode, RangeNode } from \"../parser/ast.mjs\";\nimport { getCellReference } from \"./utils.mjs\";\nimport type { WorkbookManager } from \"./managers/workbook-manager.mjs\";\nimport type { StyleManager } from \"./managers/style-manager.mjs\";\nimport type { RangeMetadataManager } from \"./managers/range-metadata-manager.mjs\";\nimport { intersectRanges } from \"./utils/range-utils.mjs\";\n\nexport class AutoFill {\n constructor(\n private workbookManager: WorkbookManager,\n private styleManager: StyleManager,\n private rangeMetadataManager: RangeMetadataManager\n ) {}\n\n /**\n * Converts a SpreadsheetRange to FiniteSpreadsheetRange, throwing an error if infinite\n */\n private toFiniteRange(range: SpreadsheetRange): FiniteSpreadsheetRange {\n if (\n range.end.col.type === \"infinity\" ||\n range.end.row.type === \"infinity\"\n ) {\n throw new Error(\"AutoFill with infinite ranges is not supported\");\n }\n\n return {\n start: range.start,\n end: {\n col: range.end.col.value,\n row: range.end.row.value,\n },\n };\n }\n\n private getCellContent(address: CellAddress): SerializedCellValue {\n const sheet = this.workbookManager.getSheet(address);\n if (!sheet) {\n throw new Error(\"Sheet not found\");\n }\n return sheet.content.get(getCellReference(address));\n }\n\n fill(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRanges: SpreadsheetRange[],\n direction: FillDirection\n ) {\n // Process each fill range\n for (const fillRange of fillRanges) {\n this.fillSingleRange(opts, seedRange, fillRange, direction);\n }\n }\n\n /**\n * Fill a single range with seed data and styles\n */\n private fillSingleRange(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRange: SpreadsheetRange,\n direction: FillDirection\n ) {\n // Convert to finite ranges (throws error if infinite)\n const finiteSeedRange = this.toFiniteRange(seedRange);\n const finiteFillRange = this.toFiniteRange(fillRange);\n\n // Get seed cells data\n const seedCells = this.getSeedCells(opts, finiteSeedRange);\n\n // Collect all changes to apply in a single batch\n const changes = new Map<string, SerializedCellValue>();\n\n // Determine if we have a single cell or multi-cell seed\n const isSingleCell = seedCells.length === 1;\n\n if (isSingleCell) {\n const seedCell = seedCells[0];\n if (seedCell) {\n this.collectSingleCellPattern(\n seedCell,\n finiteFillRange,\n direction,\n changes\n );\n }\n } else {\n this.collectMultiCellPattern(\n seedCells,\n finiteSeedRange,\n finiteFillRange,\n direction,\n changes\n );\n }\n\n // Get current sheet content and merge with changes\n const currentContent = this.workbookManager.getSheetSerialized(opts);\n const newContent = new Map(currentContent);\n\n // Apply all changes\n changes.forEach((value, key) => {\n if (value === undefined) {\n newContent.delete(key);\n } else {\n newContent.set(key, value);\n }\n });\n\n // Update sheet content in a single operation (direct manager call, not through engine)\n this.workbookManager.setSheetContent(opts, newContent);\n\n // Copy styles from seed to fill range\n this.fillStyles(opts, finiteSeedRange, finiteFillRange, direction);\n\n // Copy metadata from seed to fill range\n this.fillMetadata(opts, finiteSeedRange, finiteFillRange, direction);\n\n // Copy range metadata from seed to fill range\n this.fillRangeMetadata(opts, finiteSeedRange, finiteFillRange, direction);\n }\n\n private getSeedCells(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange\n ) {\n const cells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }> = [];\n\n const startCol = seedRange.start.col;\n const startRow = seedRange.start.row;\n const endCol = seedRange.end.col;\n const endRow = seedRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const address: CellAddress = {\n sheetName: opts.sheetName,\n workbookName: opts.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n const content = this.getCellContent(address);\n cells.push({\n address,\n content,\n rowOffset: row - startRow,\n colOffset: col - startCol,\n });\n }\n }\n\n return cells;\n }\n\n private collectSingleCellPattern(\n seedCell: { address: CellAddress; content: SerializedCellValue },\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n const { content } = seedCell;\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: CellAddress = {\n sheetName: seedCell.address.sheetName,\n workbookName: seedCell.address.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (content === undefined || content === \"\") {\n // Blank cell - fills blanks (effectively clears targets)\n newContent = undefined;\n } else if (typeof content === \"string\" && content.startsWith(\"=\")) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n content,\n seedCell.address,\n targetAddress\n );\n } else {\n // Number or text - copy by default\n newContent = content;\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private collectMultiCellPattern(\n seedCells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n // Try to infer linear step from numbers\n const step = this.inferLinearStep(seedCells, direction);\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: LocalCellAddress = {\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (step !== null) {\n // Use linear progression\n newContent = this.applyLinearStep(\n seedCells,\n targetAddress,\n seedRange,\n step,\n direction\n );\n } else {\n // Repeat pattern (cycle through seed block)\n const seedColOffset = (col - startCol) % seedWidth;\n const seedRowOffset = (row - startRow) % seedHeight;\n\n const seedCell = seedCells.find(\n (cell) =>\n cell.colOffset === seedColOffset &&\n cell.rowOffset === seedRowOffset\n );\n\n if (seedCell) {\n if (\n typeof seedCell.content === \"string\" &&\n seedCell.content.startsWith(\"=\")\n ) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n seedCell.content,\n seedCell.address,\n targetAddress\n );\n } else {\n newContent = seedCell.content;\n }\n } else {\n newContent = undefined;\n }\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private inferLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n direction: FillDirection\n ): number | null {\n // Extract numeric values in the direction of fill\n const values: number[] = [];\n\n if (direction === \"down\" || direction === \"up\") {\n // Look at first column, different rows\n const firstColCells = seedCells\n .filter((cell) => cell.colOffset === 0)\n .sort((a, b) => a.rowOffset - b.rowOffset);\n\n for (const cell of firstColCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n } else {\n // Look at first row, different columns\n const firstRowCells = seedCells\n .filter((cell) => cell.rowOffset === 0)\n .sort((a, b) => a.colOffset - b.colOffset);\n\n for (const cell of firstRowCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n }\n\n if (values.length < 2) {\n return null;\n }\n\n // Check if there's a consistent step\n const step = values[1]! - values[0]!;\n for (let i = 2; i < values.length; i++) {\n if (Math.abs(values[i]! - values[i - 1]! - step) > 1e-10) {\n return null; // Inconsistent step\n }\n }\n\n return step;\n }\n\n private applyLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n targetAddress: LocalCellAddress,\n seedRange: FiniteSpreadsheetRange,\n step: number,\n direction: FillDirection\n ): SerializedCellValue {\n // Calculate the position in the overall sequence\n let positionInSequence: number;\n let baseValue: number;\n\n if (direction === \"down\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"up\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed (same as down direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"right\") {\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else {\n // left\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed (same as right direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n }\n\n if (isNaN(baseValue)) {\n return undefined;\n }\n\n const result = baseValue + step * positionInSequence;\n return typeof seedCells[0]?.content === \"string\"\n ? result.toString()\n : result;\n }\n\n private adjustFormulaReferences(\n formula: string,\n sourceAddress: LocalCellAddress,\n targetAddress: LocalCellAddress\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const rowDelta = targetAddress.rowIndex - sourceAddress.rowIndex;\n const colDelta = targetAddress.colIndex - sourceAddress.colIndex;\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula references:\", error);\n return formula;\n }\n }\n\n /**\n * Fill styles from seed range to fill range based on direction\n * Clears existing cell styles in fill range first (Excel behavior)\n */\n private fillStyles(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n // STEP 1: Clear existing cell styles in fill range (Excel-like replacement)\n const fillRangeAddress: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: fillRange.start.col, row: fillRange.start.row },\n end: {\n col: { type: \"number\", value: fillRange.end.col },\n row: { type: \"number\", value: fillRange.end.row },\n },\n },\n };\n \n this.styleManager.clearCellStylesInRange(fillRangeAddress);\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // STEP 2: Get all styles intersecting with seed range\n const seedSpreadsheetRange: SpreadsheetRange = {\n start: { col: seedRange.start.col, row: seedRange.start.row },\n end: {\n col: { type: \"number\", value: seedRange.end.col },\n row: { type: \"number\", value: seedRange.end.row },\n },\n };\n\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n // STEP 3: For each cell in fill range, determine corresponding seed cell and copy styles\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: seedCol, row: seedRow },\n end: {\n col: { type: \"number\", value: seedCol },\n row: { type: \"number\", value: seedRow },\n },\n };\n\n const targetCell: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy conditional styles\n for (const style of allConditionalStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: ConditionalStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n }\n\n // Copy cell styles\n for (const style of allCellStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: DirectCellStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Copy metadata from seed range to fill range with pattern repetition\n */\n private fillMetadata(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // For each cell in fill range, copy metadata from corresponding seed cell\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: seedCol,\n rowIndex: seedRow,\n };\n\n const targetCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy metadata from source to target\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCellAddress);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCellAddress, { ...sourceMetadata });\n }\n }\n }\n }\n\n /**\n * Copy range metadata from seed range to fill range with pattern repetition.\n */\n private fillRangeMetadata(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n const fillRangeAddress: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: fillRange.start.col, row: fillRange.start.row },\n end: {\n col: { type: \"number\", value: fillRange.end.col },\n row: { type: \"number\", value: fillRange.end.row },\n },\n },\n };\n\n this.rangeMetadataManager.clearRangeMetadataInRange(fillRangeAddress);\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n const allRangeMetadata = this.rangeMetadataManager.getAllRangeMetadata();\n\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: seedCol, row: seedRow },\n end: {\n col: { type: \"number\", value: seedCol },\n row: { type: \"number\", value: seedRow },\n },\n };\n\n const targetCellRange: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col, row },\n end: {\n col: { type: \"number\", value: col },\n row: { type: \"number\", value: row },\n },\n },\n };\n\n for (const entry of allRangeMetadata) {\n for (const area of entry.areas) {\n if (\n area.workbookName !== opts.workbookName ||\n area.sheetName !== opts.sheetName\n ) {\n continue;\n }\n\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (!intersection) {\n continue;\n }\n\n this.rangeMetadataManager.addRangeMetadata({\n areas: [targetCellRange],\n metadata: entry.metadata,\n });\n }\n }\n }\n }\n }\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "8E208D0BC4A4FCCD64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/core/engine-snapshot.ts
|
|
2
|
-
var ENGINE_SNAPSHOT_VERSION =
|
|
2
|
+
var ENGINE_SNAPSHOT_VERSION = 5;
|
|
3
3
|
function getAstNodeSnapshotId(node) {
|
|
4
4
|
return `${node.key}::${JSON.stringify(node.getContextDependency())}`;
|
|
5
5
|
}
|
|
@@ -8,4 +8,4 @@ export {
|
|
|
8
8
|
ENGINE_SNAPSHOT_VERSION
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
//# debugId=
|
|
11
|
+
//# debugId=024E0D4A5B98A79764756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/core/engine-snapshot.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { ContextDependency } from \"../evaluator/evaluation-context.mjs\";\nimport type { DependencyNode } from \"./managers/dependency-node.mjs\";\nimport type {\n CellAddress,\n CellInRangeResult,\n CellValue,\n ConditionalStyle,\n DirectCellStyle,\n FormulaError,\n NamedExpression,\n RangeAddress,\n RelativeRange,\n SpreadsheetRange,\n TableDefinition,\n TrackedReference,\n Workbook,\n} from \"./types.mjs\";\n\nexport const ENGINE_SNAPSHOT_VERSION =
|
|
5
|
+
"import type { ContextDependency } from \"../evaluator/evaluation-context.mjs\";\nimport type { DependencyNode } from \"./managers/dependency-node.mjs\";\nimport type {\n CellAddress,\n CellInRangeResult,\n CellValue,\n ConditionalStyle,\n DirectCellStyle,\n FormulaError,\n NamedExpression,\n RangeAddress,\n RangeMetadata,\n RelativeRange,\n SpreadsheetRange,\n TableDefinition,\n TrackedReference,\n Workbook,\n} from \"./types.mjs\";\n\nexport const ENGINE_SNAPSHOT_VERSION = 5 as const;\n\nexport type NodeSnapshotId = string;\n\nexport type NamedExpressionManagerSnapshot = {\n sheetExpressions: Map<string, Map<string, Map<string, NamedExpression>>>;\n workbookExpressions: Map<string, Map<string, NamedExpression>>;\n globalExpressions: Map<string, NamedExpression>;\n};\n\nexport type WorkbookManagerSnapshot = Map<string, Workbook>;\n\nexport type TableManagerSnapshot = Map<string, Map<string, TableDefinition>>;\n\nexport type StyleManagerSnapshot = {\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n};\n\nexport type RangeMetadataManagerSnapshot = RangeMetadata[];\n\nexport type ReferenceManagerSnapshot = Map<string, TrackedReference>;\n\nexport type SerializedValueEvaluationResultSnapshot = {\n type: \"value\";\n result: CellValue;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedErrorEvaluationResultSnapshot = {\n type: \"error\";\n err: FormulaError;\n message: string;\n errAddressId: NodeSnapshotId;\n sourceCell?: CellAddress;\n};\n\nexport type SerializedSingleEvaluationResultSnapshot =\n | SerializedValueEvaluationResultSnapshot\n | SerializedErrorEvaluationResultSnapshot;\n\nexport type SerializedCellInRangeResultSnapshot = {\n relativePos: CellInRangeResult[\"relativePos\"];\n result: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedEvaluateAllCellsResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | {\n type: \"values\";\n values: SerializedCellInRangeResultSnapshot[];\n };\n\nexport type SerializedMaterializedSpillSnapshot = {\n kind: \"materialized\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange?: RangeAddress;\n values: SerializedCellInRangeResultSnapshot[];\n};\n\nexport type SerializedSourceRangeSpillSnapshot = {\n kind: \"source-range\";\n relativeSpillArea: RelativeRange;\n source: string;\n sourceCell?: CellAddress;\n sourceRange: RangeAddress;\n};\n\nexport type SerializedSpillResultSnapshot =\n | SerializedMaterializedSpillSnapshot\n | SerializedSourceRangeSpillSnapshot;\n\nexport type SerializedSpilledValuesEvaluationResultSnapshot = {\n type: \"spilled-values\";\n spill: SerializedSpillResultSnapshot;\n};\n\nexport type SerializedFunctionEvaluationResultSnapshot =\n | SerializedSingleEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot;\n\nexport type SerializedSpillMetaEvaluationResultSnapshot =\n | SerializedErrorEvaluationResultSnapshot\n | SerializedSpilledValuesEvaluationResultSnapshot\n | {\n type: \"does-not-spill\";\n };\n\ntype SerializedBaseNodeSnapshot = {\n snapshotId: NodeSnapshotId;\n key: string;\n dependencies: NodeSnapshotId[];\n};\n\nexport type SerializedCellValueNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"cell-value\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n spillMetaSnapshotId?: NodeSnapshotId;\n};\n\nexport type SerializedSpillMetaNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"spill-meta\";\n evaluationResult: SerializedSpillMetaEvaluationResultSnapshot;\n};\n\nexport type SerializedEmptyCellNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"empty\";\n evaluationResult: SerializedSingleEvaluationResultSnapshot;\n};\n\nexport type SerializedRangeNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"range\";\n result: SerializedEvaluateAllCellsResultSnapshot;\n};\n\nexport type SerializedAstNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"ast\";\n contextDependency: ContextDependency;\n evaluationResult: SerializedFunctionEvaluationResultSnapshot;\n};\n\nexport type SerializedResourceNodeSnapshot = SerializedBaseNodeSnapshot & {\n kind: \"resource\";\n};\n\nexport type SerializedDependencyNodeSnapshot =\n | SerializedCellValueNodeSnapshot\n | SerializedSpillMetaNodeSnapshot\n | SerializedEmptyCellNodeSnapshot\n | SerializedRangeNodeSnapshot\n | SerializedAstNodeSnapshot\n | SerializedResourceNodeSnapshot;\n\nexport type DependencyManagerSnapshot = {\n nodes: SerializedDependencyNodeSnapshot[];\n spilledValues: Array<[string, { origin: CellAddress; spillOnto: SpreadsheetRange }]>;\n};\n\nexport type SerializedSCCSnapshot = {\n id: number;\n nodes: NodeSnapshotId[];\n evaluationOrder: NodeSnapshotId[];\n resolved: boolean;\n hardEdgeSCCs: NodeSnapshotId[][];\n};\n\nexport type SerializedEvaluationOrderSnapshot = {\n nodeKey: string;\n evaluationOrder: NodeSnapshotId[];\n hasCycle: boolean;\n cycleNodes?: NodeSnapshotId[];\n hash: string;\n};\n\nexport type CacheManagerSnapshot = {\n evaluationOrders: SerializedEvaluationOrderSnapshot[];\n sccs: Array<{\n hash: string;\n scc: SerializedSCCSnapshot;\n }>;\n};\n\ntype EngineSnapshotManagers = {\n workbook: WorkbookManagerSnapshot;\n namedExpression: NamedExpressionManagerSnapshot;\n table: TableManagerSnapshot;\n style: StyleManagerSnapshot;\n rangeMetadata: RangeMetadataManagerSnapshot;\n reference: ReferenceManagerSnapshot;\n dependency: DependencyManagerSnapshot;\n cache: CacheManagerSnapshot;\n};\n\nexport type EngineSnapshot = {\n version: typeof ENGINE_SNAPSHOT_VERSION;\n managers: EngineSnapshotManagers;\n};\n\nexport function getAstNodeSnapshotId(\n node: DependencyNode & { getContextDependency(): ContextDependency }\n): NodeSnapshotId {\n return `${node.key}::${JSON.stringify(node.getContextDependency())}`;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AAmBO,IAAM,0BAA0B;AAoLhC,SAAS,oBAAoB,CAClC,MACgB;AAAA,EAChB,OAAO,GAAG,KAAK,QAAQ,KAAK,UAAU,KAAK,qBAAqB,CAAC;AAAA;",
|
|
8
|
+
"debugId": "024E0D4A5B98A79764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/core/engine.mjs
CHANGED
|
@@ -16,6 +16,7 @@ import { DependencyManager } from "./managers/dependency-manager.mjs";
|
|
|
16
16
|
import { StyleManager } from "./managers/style-manager.mjs";
|
|
17
17
|
import { CopyManager } from "./managers/copy-manager.mjs";
|
|
18
18
|
import { ReferenceManager } from "./managers/reference-manager.mjs";
|
|
19
|
+
import { RangeMetadataManager } from "./managers/range-metadata-manager.mjs";
|
|
19
20
|
import {
|
|
20
21
|
ENGINE_SNAPSHOT_VERSION
|
|
21
22
|
} from "./engine-snapshot.mjs";
|
|
@@ -47,6 +48,7 @@ class FormulaEngine {
|
|
|
47
48
|
autoFillManager;
|
|
48
49
|
dependencyManager;
|
|
49
50
|
styleManager;
|
|
51
|
+
rangeMetadataManager;
|
|
50
52
|
copyManager;
|
|
51
53
|
referenceManager;
|
|
52
54
|
_workbookManager;
|
|
@@ -57,6 +59,7 @@ class FormulaEngine {
|
|
|
57
59
|
_autoFillManager;
|
|
58
60
|
_dependencyManager;
|
|
59
61
|
_styleManager;
|
|
62
|
+
_rangeMetadataManager;
|
|
60
63
|
constructor() {
|
|
61
64
|
this.eventManager = new EventManager;
|
|
62
65
|
this.workbookManager = new WorkbookManager;
|
|
@@ -67,8 +70,9 @@ class FormulaEngine {
|
|
|
67
70
|
const formulaEvaluator = new FormulaEvaluator(this.tableManager, this.dependencyManager, this.namedExpressionManager);
|
|
68
71
|
this.evaluationManager = new EvaluationManager(this.workbookManager, this.tableManager, formulaEvaluator, this.dependencyManager);
|
|
69
72
|
this.styleManager = new StyleManager(this.evaluationManager);
|
|
70
|
-
this.
|
|
71
|
-
this.
|
|
73
|
+
this.rangeMetadataManager = new RangeMetadataManager;
|
|
74
|
+
this.copyManager = new CopyManager(this.workbookManager, this.evaluationManager, this.styleManager, this.rangeMetadataManager);
|
|
75
|
+
this.autoFillManager = new AutoFill(this.workbookManager, this.styleManager, this.rangeMetadataManager);
|
|
72
76
|
this.referenceManager = new ReferenceManager;
|
|
73
77
|
this._workbookManager = this.workbookManager;
|
|
74
78
|
this._namedExpressionManager = this.namedExpressionManager;
|
|
@@ -78,6 +82,7 @@ class FormulaEngine {
|
|
|
78
82
|
this._autoFillManager = this.autoFillManager;
|
|
79
83
|
this._dependencyManager = this.dependencyManager;
|
|
80
84
|
this._styleManager = this.styleManager;
|
|
85
|
+
this._rangeMetadataManager = this.rangeMetadataManager;
|
|
81
86
|
}
|
|
82
87
|
static buildEmpty() {
|
|
83
88
|
return new FormulaEngine;
|
|
@@ -137,6 +142,23 @@ class FormulaEngine {
|
|
|
137
142
|
}
|
|
138
143
|
return Array.from(resourceKeys);
|
|
139
144
|
}
|
|
145
|
+
assertNamedExpressionScopeExists(opts) {
|
|
146
|
+
if (opts.sheetName && !opts.workbookName) {
|
|
147
|
+
throw new Error("Missing workbookName");
|
|
148
|
+
}
|
|
149
|
+
if (!opts.workbookName) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (!this.workbookManager.getWorkbooks().has(opts.workbookName)) {
|
|
153
|
+
throw new Error(`Workbook not found: ${opts.workbookName}`);
|
|
154
|
+
}
|
|
155
|
+
if (opts.sheetName && !this.workbookManager.getSheet({
|
|
156
|
+
workbookName: opts.workbookName,
|
|
157
|
+
sheetName: opts.sheetName
|
|
158
|
+
})) {
|
|
159
|
+
throw new Error(`Sheet not found: ${opts.sheetName}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
140
162
|
getCellEvaluationResult(cellAddress) {
|
|
141
163
|
return this.evaluationManager.getCellEvaluationResult(cellAddress);
|
|
142
164
|
}
|
|
@@ -172,6 +194,30 @@ class FormulaEngine {
|
|
|
172
194
|
getWorkbookMetadata(workbookName) {
|
|
173
195
|
return this.workbookManager.getWorkbookMetadata(workbookName);
|
|
174
196
|
}
|
|
197
|
+
addRangeMetadata(metadata) {
|
|
198
|
+
const id = this.rangeMetadataManager.addRangeMetadata(metadata);
|
|
199
|
+
this.emitUpdate();
|
|
200
|
+
return id;
|
|
201
|
+
}
|
|
202
|
+
removeRangeMetadata(id) {
|
|
203
|
+
const removed = this.rangeMetadataManager.removeRangeMetadata(id);
|
|
204
|
+
if (removed) {
|
|
205
|
+
this.emitUpdate();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
getAllRangeMetadata() {
|
|
209
|
+
return this.rangeMetadataManager.getAllRangeMetadata();
|
|
210
|
+
}
|
|
211
|
+
getRangeMetadataForCell(address) {
|
|
212
|
+
return this.rangeMetadataManager.getRangeMetadataForCell(address);
|
|
213
|
+
}
|
|
214
|
+
getRangeMetadataIntersectingWithRange(range) {
|
|
215
|
+
return this.rangeMetadataManager.getRangeMetadataIntersectingWithRange(range);
|
|
216
|
+
}
|
|
217
|
+
clearRangeMetadata(range) {
|
|
218
|
+
this.rangeMetadataManager.clearRangeMetadataInRange(range);
|
|
219
|
+
this.emitUpdate();
|
|
220
|
+
}
|
|
175
221
|
createRef(address) {
|
|
176
222
|
return this.referenceManager.createRef(address);
|
|
177
223
|
}
|
|
@@ -194,6 +240,7 @@ class FormulaEngine {
|
|
|
194
240
|
throw new Error("Not implemented");
|
|
195
241
|
}
|
|
196
242
|
addNamedExpression(opts) {
|
|
243
|
+
this.assertNamedExpressionScopeExists(opts);
|
|
197
244
|
this.namedExpressionManager.addNamedExpression(opts);
|
|
198
245
|
this.emitMutation({
|
|
199
246
|
touchedCells: [],
|
|
@@ -631,6 +678,7 @@ class FormulaEngine {
|
|
|
631
678
|
this.namedExpressionManager.removeSheet(opts);
|
|
632
679
|
this.tableManager.removeSheet(opts);
|
|
633
680
|
this.styleManager.removeSheetStyles(opts.workbookName, opts.sheetName);
|
|
681
|
+
this.rangeMetadataManager.removeSheetRangeMetadata(opts.workbookName, opts.sheetName);
|
|
634
682
|
this.referenceManager.invalidateSheet(opts.workbookName, opts.sheetName);
|
|
635
683
|
this.emitMutation({
|
|
636
684
|
touchedCells: [],
|
|
@@ -644,6 +692,7 @@ class FormulaEngine {
|
|
|
644
692
|
this.namedExpressionManager.renameSheet(opts);
|
|
645
693
|
this.tableManager.updateTablesForSheetRename(opts);
|
|
646
694
|
this.styleManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
|
|
695
|
+
this.rangeMetadataManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
|
|
647
696
|
const changedCells = this.workbookManager.updateAllFormulas((formula) => renameSheetInFormula({
|
|
648
697
|
formula,
|
|
649
698
|
oldSheetName: opts.sheetName,
|
|
@@ -736,6 +785,7 @@ class FormulaEngine {
|
|
|
736
785
|
this.namedExpressionManager.removeWorkbook(workbookName);
|
|
737
786
|
this.tableManager.removeWorkbook(workbookName);
|
|
738
787
|
this.styleManager.removeWorkbookStyles(workbookName);
|
|
788
|
+
this.rangeMetadataManager.removeWorkbookRangeMetadata(workbookName);
|
|
739
789
|
this.referenceManager.invalidateWorkbook(workbookName);
|
|
740
790
|
this.emitMutation({
|
|
741
791
|
touchedCells: [],
|
|
@@ -828,6 +878,14 @@ class FormulaEngine {
|
|
|
828
878
|
});
|
|
829
879
|
}
|
|
830
880
|
}
|
|
881
|
+
for (const metadata of this.rangeMetadataManager.getAllRangeMetadata()) {
|
|
882
|
+
if (metadata.areas.some((area) => area.workbookName === fromWorkbookName)) {
|
|
883
|
+
this.rangeMetadataManager.addRangeMetadata({
|
|
884
|
+
metadata: metadata.metadata,
|
|
885
|
+
areas: metadata.areas.map((area) => area.workbookName === fromWorkbookName ? { ...area, workbookName: toWorkbookName } : area)
|
|
886
|
+
});
|
|
887
|
+
}
|
|
888
|
+
}
|
|
831
889
|
this.workbookManager.updateFormulasForWorkbook(toWorkbookName, (formula) => renameWorkbookInFormula({
|
|
832
890
|
formula,
|
|
833
891
|
oldWorkbookName: fromWorkbookName,
|
|
@@ -844,6 +902,7 @@ class FormulaEngine {
|
|
|
844
902
|
this.namedExpressionManager.renameWorkbook(opts);
|
|
845
903
|
this.tableManager.updateTablesForWorkbookRename(opts);
|
|
846
904
|
this.styleManager.updateWorkbookName(opts.workbookName, opts.newWorkbookName);
|
|
905
|
+
this.rangeMetadataManager.updateWorkbookName(opts.workbookName, opts.newWorkbookName);
|
|
847
906
|
const changedCells = this.workbookManager.updateAllFormulas((formula) => renameWorkbookInFormula({
|
|
848
907
|
formula,
|
|
849
908
|
oldWorkbookName: opts.workbookName,
|
|
@@ -921,6 +980,7 @@ class FormulaEngine {
|
|
|
921
980
|
tables: this.tableManager.tables,
|
|
922
981
|
conditionalStyles: this.styleManager.getAllConditionalStyles(),
|
|
923
982
|
cellStyles: this.styleManager.getAllCellStyles(),
|
|
983
|
+
rangeMetadata: this.rangeMetadataManager.getAllRangeMetadata(),
|
|
924
984
|
references: this.referenceManager.getAllReferences()
|
|
925
985
|
};
|
|
926
986
|
}
|
|
@@ -929,19 +989,41 @@ class FormulaEngine {
|
|
|
929
989
|
}
|
|
930
990
|
buildSerializedSnapshot() {
|
|
931
991
|
const evaluationSnapshots = this.dependencyManager.toSnapshot(this.evaluationManager);
|
|
992
|
+
const workbookSnapshot = this.workbookManager.toSnapshot();
|
|
932
993
|
return {
|
|
933
994
|
version: ENGINE_SNAPSHOT_VERSION,
|
|
934
995
|
managers: {
|
|
935
|
-
workbook:
|
|
936
|
-
namedExpression: this.
|
|
996
|
+
workbook: workbookSnapshot,
|
|
997
|
+
namedExpression: this.buildNamedExpressionSnapshot(workbookSnapshot),
|
|
937
998
|
table: this.tableManager.toSnapshot(),
|
|
938
999
|
style: this.styleManager.toSnapshot(),
|
|
1000
|
+
rangeMetadata: this.rangeMetadataManager.toSnapshot(),
|
|
939
1001
|
reference: this.referenceManager.toSnapshot(),
|
|
940
1002
|
dependency: evaluationSnapshots.dependency,
|
|
941
1003
|
cache: evaluationSnapshots.cache
|
|
942
1004
|
}
|
|
943
1005
|
};
|
|
944
1006
|
}
|
|
1007
|
+
buildNamedExpressionSnapshot(workbookSnapshot) {
|
|
1008
|
+
const namedExpressions = this.namedExpressionManager.toSnapshot();
|
|
1009
|
+
const workbookExpressions = new Map;
|
|
1010
|
+
const sheetExpressions = new Map;
|
|
1011
|
+
workbookSnapshot.forEach((workbook) => {
|
|
1012
|
+
const sourceWorkbookExpressions = namedExpressions.workbookExpressions.get(workbook.name);
|
|
1013
|
+
workbookExpressions.set(workbook.name, new Map(sourceWorkbookExpressions ?? []));
|
|
1014
|
+
const sourceSheets = namedExpressions.sheetExpressions.get(workbook.name);
|
|
1015
|
+
const workbookSheetExpressions = new Map;
|
|
1016
|
+
workbook.sheets.forEach((_, sheetName) => {
|
|
1017
|
+
workbookSheetExpressions.set(sheetName, new Map(sourceSheets?.get(sheetName) ?? []));
|
|
1018
|
+
});
|
|
1019
|
+
sheetExpressions.set(workbook.name, workbookSheetExpressions);
|
|
1020
|
+
});
|
|
1021
|
+
return {
|
|
1022
|
+
sheetExpressions,
|
|
1023
|
+
workbookExpressions,
|
|
1024
|
+
globalExpressions: new Map(namedExpressions.globalExpressions)
|
|
1025
|
+
};
|
|
1026
|
+
}
|
|
945
1027
|
serializeEngine() {
|
|
946
1028
|
return serialize(this.buildSerializedSnapshot());
|
|
947
1029
|
}
|
|
@@ -950,6 +1032,7 @@ class FormulaEngine {
|
|
|
950
1032
|
if (!deserialized || typeof deserialized !== "object" || !("version" in deserialized) || deserialized.version !== ENGINE_SNAPSHOT_VERSION || !deserialized.managers) {
|
|
951
1033
|
throw new Error(`Unsupported serialized engine format. Expected EngineSnapshot version ${ENGINE_SNAPSHOT_VERSION}.`);
|
|
952
1034
|
}
|
|
1035
|
+
this.namedExpressionManager.clear();
|
|
953
1036
|
this.workbookManager.restoreFromSnapshot(deserialized.managers.workbook);
|
|
954
1037
|
deserialized.managers.workbook.forEach((workbook) => {
|
|
955
1038
|
this.namedExpressionManager.addWorkbook(workbook.name);
|
|
@@ -963,6 +1046,7 @@ class FormulaEngine {
|
|
|
963
1046
|
this.namedExpressionManager.restoreFromSnapshot(deserialized.managers.namedExpression);
|
|
964
1047
|
this.tableManager.restoreFromSnapshot(deserialized.managers.table);
|
|
965
1048
|
this.styleManager.restoreFromSnapshot(deserialized.managers.style);
|
|
1049
|
+
this.rangeMetadataManager.restoreFromSnapshot(deserialized.managers.rangeMetadata);
|
|
966
1050
|
this.referenceManager.restoreFromSnapshot(deserialized.managers.reference);
|
|
967
1051
|
this.dependencyManager.restoreFromSnapshot({
|
|
968
1052
|
dependency: deserialized.managers.dependency,
|
|
@@ -975,4 +1059,4 @@ export {
|
|
|
975
1059
|
FormulaEngine
|
|
976
1060
|
};
|
|
977
1061
|
|
|
978
|
-
//# debugId=
|
|
1062
|
+
//# debugId=C4AB97ECFD760E2E64756E2164756E21
|