@ricsam/formula-engine 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/cjs/core/commands/structure-commands.cjs +3 -3
  2. package/dist/cjs/core/commands/structure-commands.cjs.map +3 -3
  3. package/dist/cjs/core/commands/table-commands.cjs +158 -10
  4. package/dist/cjs/core/commands/table-commands.cjs.map +3 -3
  5. package/dist/cjs/core/commands/types.cjs.map +2 -2
  6. package/dist/cjs/core/engine.cjs +22 -1
  7. package/dist/cjs/core/engine.cjs.map +3 -3
  8. package/dist/cjs/core/managers/dependency-manager.cjs +157 -2
  9. package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
  10. package/dist/cjs/core/managers/evaluation-manager.cjs +32 -1
  11. package/dist/cjs/core/managers/evaluation-manager.cjs.map +3 -3
  12. package/dist/cjs/core/managers/frontier-dependency-manager.cjs +4 -4
  13. package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +3 -3
  14. package/dist/cjs/core/managers/table-manager.cjs +3 -3
  15. package/dist/cjs/core/managers/table-manager.cjs.map +3 -3
  16. package/dist/cjs/core/managers/workbook-manager.cjs +48 -4
  17. package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
  18. package/dist/cjs/evaluator/evaluation-context.cjs.map +2 -2
  19. package/dist/cjs/evaluator/formula-evaluator.cjs.map +1 -1
  20. package/dist/cjs/package.json +1 -1
  21. package/dist/mjs/core/commands/structure-commands.mjs +3 -3
  22. package/dist/mjs/core/commands/structure-commands.mjs.map +3 -3
  23. package/dist/mjs/core/commands/table-commands.mjs +163 -11
  24. package/dist/mjs/core/commands/table-commands.mjs.map +3 -3
  25. package/dist/mjs/core/commands/types.mjs.map +2 -2
  26. package/dist/mjs/core/engine.mjs +22 -1
  27. package/dist/mjs/core/engine.mjs.map +3 -3
  28. package/dist/mjs/core/managers/dependency-manager.mjs +157 -2
  29. package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
  30. package/dist/mjs/core/managers/evaluation-manager.mjs +32 -1
  31. package/dist/mjs/core/managers/evaluation-manager.mjs.map +3 -3
  32. package/dist/mjs/core/managers/frontier-dependency-manager.mjs +4 -4
  33. package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +3 -3
  34. package/dist/mjs/core/managers/table-manager.mjs +8 -4
  35. package/dist/mjs/core/managers/table-manager.mjs.map +3 -3
  36. package/dist/mjs/core/managers/workbook-manager.mjs +48 -4
  37. package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
  38. package/dist/mjs/evaluator/evaluation-context.mjs.map +2 -2
  39. package/dist/mjs/evaluator/formula-evaluator.mjs.map +1 -1
  40. package/dist/mjs/package.json +1 -1
  41. package/dist/types/core/commands/types.d.ts +5 -0
  42. package/dist/types/core/engine.d.ts +12 -4
  43. package/dist/types/core/managers/dependency-manager.d.ts +7 -0
  44. package/dist/types/core/managers/evaluation-manager.d.ts +1 -0
  45. package/dist/types/core/managers/workbook-manager.d.ts +3 -0
  46. package/package.json +3 -2
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/core/commands/structure-commands.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Structure Commands - Commands that modify workbook/sheet structure\n *\n * These commands all require re-evaluation after execution.\n */\n\nimport type { SchemaManager } from \"../managers/schema-manager.mjs\";\nimport type { NamedExpressionManager } from \"../managers/named-expression-manager.mjs\";\nimport type { ReferenceManager } from \"../managers/reference-manager.mjs\";\nimport type { StyleManager } from \"../managers/style-manager.mjs\";\nimport type { TableManager } from \"../managers/table-manager.mjs\";\nimport type { WorkbookManager } from \"../managers/workbook-manager.mjs\";\nimport type {\n CellAddress,\n ConditionalStyle,\n DirectCellStyle,\n NamedExpression,\n Sheet,\n TableDefinition,\n Workbook,\n} from \"../types.mjs\";\nimport type {\n EngineAction,\n EngineCommand,\n MutationInvalidation,\n} from \"./types.mjs\";\nimport { ActionTypes, emptyMutationInvalidation } from \"./types.mjs\";\nimport {\n getNamedExpressionResourceKey,\n getSheetResourceKey,\n getTableResourceKey,\n getWorkbookResourceKey,\n} from \"../resource-keys.mjs\";\n\n/**\n * Dependencies needed for structure commands.\n */\nexport interface StructureCommandDeps {\n workbookManager: WorkbookManager;\n namedExpressionManager: NamedExpressionManager;\n tableManager: TableManager;\n styleManager: StyleManager;\n referenceManager: ReferenceManager;\n apiSchemaManager: SchemaManager;\n renameSheetInFormula: (opts: {\n formula: string;\n oldSheetName: string;\n newSheetName: string;\n }) => string;\n renameWorkbookInFormula: (opts: {\n formula: string;\n oldWorkbookName: string;\n newWorkbookName: string;\n }) => string;\n}\n\n// ============================================================================\n// Workbook Commands\n// ============================================================================\n\n/**\n * Command to add a workbook.\n */\nexport class AddWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string\n ) {}\n\n execute(): void {\n this.deps.workbookManager.addWorkbook(this.workbookName);\n this.deps.namedExpressionManager.addWorkbook(this.workbookName);\n this.deps.tableManager.addWorkbook(this.workbookName);\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(this.workbookName)],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(this.workbookName)],\n removedScopes: [{ type: \"workbook\", workbookName: this.workbookName }],\n };\n }\n\n undo(): void {\n this.deps.workbookManager.removeWorkbook(this.workbookName);\n this.deps.namedExpressionManager.removeWorkbook(this.workbookName);\n this.deps.tableManager.removeWorkbook(this.workbookName);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.ADD_WORKBOOK,\n payload: { workbookName: this.workbookName },\n };\n }\n}\n\n/**\n * Captured state of a workbook for undo purposes.\n */\ninterface WorkbookSnapshot {\n workbook: Workbook;\n namedExpressions: {\n workbookLevel: Map<string, NamedExpression>;\n sheetLevel: Map<string, Map<string, NamedExpression>>;\n };\n tables: Map<string, TableDefinition>;\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n}\n\n/**\n * Capture the full state of a workbook for later restoration.\n */\nfunction captureWorkbookSnapshot(\n deps: StructureCommandDeps,\n workbookName: string\n): WorkbookSnapshot | undefined {\n const workbook = deps.workbookManager.getWorkbooks().get(workbookName);\n if (!workbook) return undefined;\n\n // Deep clone workbook sheets\n const clonedSheets = new Map<string, Sheet>();\n for (const [name, sheet] of workbook.sheets) {\n clonedSheets.set(name, {\n name: sheet.name,\n index: sheet.index,\n content: new Map(sheet.content),\n metadata: new Map(sheet.metadata),\n sheetMetadata: sheet.sheetMetadata,\n });\n }\n\n const namedExpressions = deps.namedExpressionManager.getNamedExpressions();\n\n const snapshot: WorkbookSnapshot = {\n workbook: {\n name: workbook.name,\n sheets: clonedSheets,\n workbookMetadata: workbook.workbookMetadata,\n },\n namedExpressions: {\n workbookLevel: new Map(\n namedExpressions.workbookExpressions.get(workbookName) || []\n ),\n sheetLevel: new Map(),\n },\n tables: new Map(deps.tableManager.getTables(workbookName)),\n conditionalStyles: deps.styleManager\n .getAllConditionalStyles()\n .filter((s) => s.areas.some((a) => a.workbookName === workbookName)),\n cellStyles: deps.styleManager\n .getAllCellStyles()\n .filter((s) => s.areas.some((a) => a.workbookName === workbookName)),\n };\n\n // Capture sheet-level named expressions\n const sheetExpressions = namedExpressions.sheetExpressions.get(workbookName);\n if (sheetExpressions) {\n for (const [sheetName, expressions] of sheetExpressions) {\n snapshot.namedExpressions.sheetLevel.set(sheetName, new Map(expressions));\n }\n }\n\n return snapshot;\n}\n\n/**\n * Remove a workbook and all its associated data.\n */\nfunction removeWorkbook(\n deps: StructureCommandDeps,\n workbookName: string\n): void {\n deps.workbookManager.removeWorkbook(workbookName);\n deps.namedExpressionManager.removeWorkbook(workbookName);\n deps.tableManager.removeWorkbook(workbookName);\n deps.styleManager.removeWorkbookStyles(workbookName);\n deps.referenceManager.invalidateWorkbook(workbookName);\n}\n\n/**\n * Rename a workbook across all managers.\n */\nfunction renameWorkbookAcrossManagers(\n deps: StructureCommandDeps,\n oldName: string,\n newName: string\n): CellAddress[] {\n deps.workbookManager.renameWorkbook({\n workbookName: oldName,\n newWorkbookName: newName,\n });\n deps.namedExpressionManager.renameWorkbook({\n workbookName: oldName,\n newWorkbookName: newName,\n });\n deps.tableManager.updateTablesForWorkbookRename({\n workbookName: oldName,\n newWorkbookName: newName,\n });\n deps.styleManager.updateWorkbookName(oldName, newName);\n const changedCells = deps.workbookManager.updateAllFormulas((formula) =>\n deps.renameWorkbookInFormula({\n formula,\n oldWorkbookName: oldName,\n newWorkbookName: newName,\n })\n );\n deps.referenceManager.updateWorkbookName(oldName, newName);\n deps.apiSchemaManager.updateForWorkbookRename(oldName, newName);\n return changedCells;\n}\n\n/**\n * Rename a sheet across all managers.\n */\nfunction renameSheetAcrossManagers(\n deps: StructureCommandDeps,\n opts: { workbookName: string; sheetName: string; newSheetName: string }\n): CellAddress[] {\n deps.workbookManager.renameSheet(opts);\n deps.namedExpressionManager.renameSheet(opts);\n deps.tableManager.updateTablesForSheetRename(opts);\n deps.styleManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n const changedCells = deps.workbookManager.updateAllFormulas((formula) =>\n deps.renameSheetInFormula({\n formula,\n oldSheetName: opts.sheetName,\n newSheetName: opts.newSheetName,\n })\n );\n deps.referenceManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n deps.apiSchemaManager.updateForSheetRename(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n return changedCells;\n}\n\nfunction getWorkbookSnapshotResourceKeys(\n workbookName: string,\n snapshot: WorkbookSnapshot | undefined\n): string[] {\n const resourceKeys = new Set<string>([getWorkbookResourceKey(workbookName)]);\n if (!snapshot) {\n return Array.from(resourceKeys);\n }\n\n for (const tableName of snapshot.tables.keys()) {\n resourceKeys.add(getTableResourceKey({ workbookName, tableName }));\n }\n for (const name of snapshot.namedExpressions.workbookLevel.keys()) {\n resourceKeys.add(\n getNamedExpressionResourceKey({ expressionName: name, workbookName })\n );\n }\n for (const [sheetName, expressions] of snapshot.namedExpressions.sheetLevel) {\n resourceKeys.add(getSheetResourceKey({ workbookName, sheetName }));\n for (const name of expressions.keys()) {\n resourceKeys.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName,\n sheetName,\n })\n );\n }\n }\n\n return Array.from(resourceKeys);\n}\n\nfunction getSheetSnapshotResourceKeys(\n workbookName: string,\n sheetName: string,\n snapshot: SheetSnapshot | undefined\n): string[] {\n const resourceKeys = new Set<string>([\n getWorkbookResourceKey(workbookName),\n getSheetResourceKey({ workbookName, sheetName }),\n ]);\n if (!snapshot) {\n return Array.from(resourceKeys);\n }\n\n for (const tableName of snapshot.tables.keys()) {\n resourceKeys.add(getTableResourceKey({ workbookName, tableName }));\n }\n for (const name of snapshot.namedExpressions.keys()) {\n resourceKeys.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName,\n sheetName,\n })\n );\n }\n\n return Array.from(resourceKeys);\n}\n\n/**\n * Restore tables from a snapshot.\n */\nfunction restoreTables(\n tableManager: TableManager,\n tables: Map<string, TableDefinition>,\n workbookName: string\n): void {\n for (const [tableName, table] of tables) {\n tableManager.addTable({\n workbookName,\n tableName,\n sheetName: table.sheetName,\n start: `${String.fromCharCode(65 + table.start.colIndex)}${\n table.start.rowIndex + 1\n }`,\n numRows: table.endRow,\n numCols: table.headers.size,\n getCellValue: () => undefined,\n });\n }\n}\n\n/**\n * Restore styles from a snapshot.\n */\nfunction restoreStyles(\n styleManager: StyleManager,\n conditionalStyles: ConditionalStyle[],\n cellStyles: DirectCellStyle[]\n): void {\n for (const style of conditionalStyles) {\n styleManager.addConditionalStyle(style);\n }\n for (const style of cellStyles) {\n styleManager.addCellStyle(style);\n }\n}\n\n/**\n * Command to remove a workbook.\n */\nexport class RemoveWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: WorkbookSnapshot | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string\n ) {}\n\n execute(): void {\n this.snapshot = captureWorkbookSnapshot(this.deps, this.workbookName);\n removeWorkbook(this.deps, this.workbookName);\n const resourceKeys = getWorkbookSnapshotResourceKeys(\n this.workbookName,\n this.snapshot\n );\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys,\n removedScopes: [{ type: \"workbook\", workbookName: this.workbookName }],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys,\n };\n }\n\n undo(): void {\n if (!this.snapshot) return;\n\n // Restore workbook structure\n this.deps.workbookManager.addWorkbook(this.workbookName);\n this.deps.namedExpressionManager.addWorkbook(this.workbookName);\n this.deps.tableManager.addWorkbook(this.workbookName);\n\n // Restore sheets\n for (const [sheetName, sheet] of this.snapshot.workbook.sheets) {\n this.deps.workbookManager.addSheet({\n workbookName: this.workbookName,\n sheetName,\n });\n this.deps.namedExpressionManager.addSheet({\n workbookName: this.workbookName,\n sheetName,\n });\n this.deps.workbookManager.setSheetContent(\n { workbookName: this.workbookName, sheetName },\n sheet.content\n );\n }\n\n // Restore named expressions\n for (const [name, expr] of this.snapshot.namedExpressions.workbookLevel) {\n this.deps.namedExpressionManager.addNamedExpression({\n expressionName: name,\n expression: expr.expression,\n workbookName: this.workbookName,\n });\n }\n for (const [sheetName, expressions] of this.snapshot.namedExpressions.sheetLevel) {\n for (const [name, expr] of expressions) {\n this.deps.namedExpressionManager.addNamedExpression({\n expressionName: name,\n expression: expr.expression,\n workbookName: this.workbookName,\n sheetName,\n });\n }\n }\n\n // Restore tables and styles\n restoreTables(this.deps.tableManager, this.snapshot.tables, this.workbookName);\n restoreStyles(this.deps.styleManager, this.snapshot.conditionalStyles, this.snapshot.cellStyles);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.REMOVE_WORKBOOK,\n payload: { workbookName: this.workbookName },\n };\n }\n}\n\n/**\n * Command to rename a workbook.\n */\nexport class RenameWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: WorkbookSnapshot | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string,\n private newWorkbookName: string\n ) {}\n\n execute(): void {\n this.snapshot = captureWorkbookSnapshot(this.deps, this.workbookName);\n const changedCells = renameWorkbookAcrossManagers(\n this.deps,\n this.workbookName,\n this.newWorkbookName\n );\n this.executeFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: Array.from(\n new Set([\n ...getWorkbookSnapshotResourceKeys(this.workbookName, this.snapshot),\n ...getWorkbookSnapshotResourceKeys(this.newWorkbookName, this.snapshot),\n ])\n ),\n };\n }\n\n undo(): void {\n const changedCells = renameWorkbookAcrossManagers(\n this.deps,\n this.newWorkbookName,\n this.workbookName\n );\n this.undoFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: Array.from(\n new Set([\n ...getWorkbookSnapshotResourceKeys(this.workbookName, this.snapshot),\n ...getWorkbookSnapshotResourceKeys(this.newWorkbookName, this.snapshot),\n ])\n ),\n };\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RENAME_WORKBOOK,\n payload: {\n workbookName: this.workbookName,\n newWorkbookName: this.newWorkbookName,\n },\n };\n }\n}\n\n/**\n * Command to clone a workbook.\n * Undo simply removes the cloned workbook.\n */\nexport class CloneWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private fromWorkbookName: string,\n private toWorkbookName: string\n ) {}\n\n execute(): void {\n const {\n workbookManager,\n namedExpressionManager,\n tableManager,\n styleManager,\n renameWorkbookInFormula,\n } = this.deps;\n\n // Check if source workbook exists\n const sourceWorkbook = workbookManager\n .getWorkbooks()\n .get(this.fromWorkbookName);\n if (!sourceWorkbook) {\n throw new Error(`Source workbook \"${this.fromWorkbookName}\" not found`);\n }\n\n // Check if target workbook name already exists\n if (workbookManager.getWorkbooks().has(this.toWorkbookName)) {\n throw new Error(\n `Target workbook \"${this.toWorkbookName}\" already exists`\n );\n }\n\n // Create new workbook\n workbookManager.addWorkbook(this.toWorkbookName);\n namedExpressionManager.addWorkbook(this.toWorkbookName);\n tableManager.addWorkbook(this.toWorkbookName);\n\n // Clone all sheets from source workbook\n for (const [sheetName, sheet] of sourceWorkbook.sheets) {\n // Add sheet to target workbook\n workbookManager.addSheet({\n workbookName: this.toWorkbookName,\n sheetName: sheetName,\n });\n namedExpressionManager.addSheet({\n workbookName: this.toWorkbookName,\n sheetName: sheetName,\n });\n\n // Copy all cell content\n workbookManager.setSheetContent(\n { workbookName: this.toWorkbookName, sheetName: sheetName },\n new Map(sheet.content)\n );\n\n // Copy all cell metadata\n const targetSheet = workbookManager.getSheet({\n workbookName: this.toWorkbookName,\n sheetName: sheetName,\n });\n if (targetSheet) {\n targetSheet.metadata = new Map(sheet.metadata);\n\n // Copy sheet metadata\n if (sheet.sheetMetadata !== undefined) {\n targetSheet.sheetMetadata = structuredClone(sheet.sheetMetadata);\n }\n }\n }\n\n // Copy workbook metadata\n const targetWorkbook = workbookManager\n .getWorkbooks()\n .get(this.toWorkbookName);\n if (targetWorkbook && sourceWorkbook.workbookMetadata !== undefined) {\n targetWorkbook.workbookMetadata = structuredClone(\n sourceWorkbook.workbookMetadata\n );\n }\n\n // Clone workbook-scoped named expressions\n const allExpressions = namedExpressionManager.getNamedExpressions();\n const sourceWorkbookExpressions = allExpressions.workbookExpressions.get(\n this.fromWorkbookName\n );\n if (sourceWorkbookExpressions) {\n for (const [expressionName, expression] of sourceWorkbookExpressions) {\n namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: this.toWorkbookName,\n });\n }\n }\n\n // Clone sheet-scoped named expressions\n const sourceSheetExpressions = allExpressions.sheetExpressions.get(\n this.fromWorkbookName\n );\n if (sourceSheetExpressions) {\n for (const [sheetName, sheetExpressions] of sourceSheetExpressions) {\n for (const [expressionName, expression] of sheetExpressions) {\n namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: this.toWorkbookName,\n sheetName,\n });\n }\n }\n }\n\n // Clone tables\n const sourceTables = tableManager.tables.get(this.fromWorkbookName);\n if (sourceTables) {\n for (const [tableName] of sourceTables) {\n tableManager.copyTable(\n { workbookName: this.fromWorkbookName, tableName },\n { workbookName: this.toWorkbookName, tableName }\n );\n }\n }\n\n // Clone conditional styles\n const allConditionalStyles = styleManager.getAllConditionalStyles();\n for (const style of allConditionalStyles) {\n if (\n style.areas.some((area) => area.workbookName === this.fromWorkbookName)\n ) {\n const newStyle: ConditionalStyle = {\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === this.fromWorkbookName\n ? { ...area, workbookName: this.toWorkbookName }\n : area\n ),\n };\n styleManager.addConditionalStyle(newStyle);\n }\n }\n\n // Clone cell styles\n const allCellStyles = styleManager.getAllCellStyles();\n for (const style of allCellStyles) {\n if (\n style.areas.some((area) => area.workbookName === this.fromWorkbookName)\n ) {\n const newStyle: DirectCellStyle = {\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === this.fromWorkbookName\n ? { ...area, workbookName: this.toWorkbookName }\n : area\n ),\n };\n styleManager.addCellStyle(newStyle);\n }\n }\n\n // Update formulas in cloned workbook that reference the source workbook\n workbookManager.updateFormulasForWorkbook(this.toWorkbookName, (formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: this.fromWorkbookName,\n newWorkbookName: this.toWorkbookName,\n })\n );\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(this.toWorkbookName)],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(this.toWorkbookName)],\n removedScopes: [{ type: \"workbook\", workbookName: this.toWorkbookName }],\n };\n }\n\n undo(): void {\n // Undo clone = remove the cloned workbook\n removeWorkbook(this.deps, this.toWorkbookName);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.CLONE_WORKBOOK,\n payload: {\n fromWorkbookName: this.fromWorkbookName,\n toWorkbookName: this.toWorkbookName,\n },\n };\n }\n}\n\n// ============================================================================\n// Sheet Commands\n// ============================================================================\n\n/**\n * Command to add a sheet.\n */\nexport class AddSheetCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private opts: { workbookName: string; sheetName: string }\n ) {}\n\n execute(): void {\n this.deps.workbookManager.addSheet(this.opts);\n this.deps.namedExpressionManager.addSheet(this.opts);\n const resourceKey = getSheetResourceKey(this.opts);\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: [resourceKey, getWorkbookResourceKey(this.opts.workbookName)],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys: [resourceKey, getWorkbookResourceKey(this.opts.workbookName)],\n removedScopes: [{ type: \"sheet\", ...this.opts }],\n };\n }\n\n undo(): void {\n this.deps.workbookManager.removeSheet(this.opts);\n this.deps.namedExpressionManager.removeSheet(this.opts);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.ADD_SHEET,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Captured state of a sheet for undo purposes.\n */\ninterface SheetSnapshot {\n sheet: Sheet;\n namedExpressions: Map<string, NamedExpression>;\n tables: Map<string, TableDefinition>;\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n}\n\n/**\n * Command to remove a sheet.\n */\nexport class RemoveSheetCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: SheetSnapshot | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private opts: { workbookName: string; sheetName: string }\n ) {}\n\n execute(): void {\n // Capture sheet state before removal\n const sheet = this.deps.workbookManager.getSheet(this.opts);\n if (sheet) {\n const namedExpressions =\n this.deps.namedExpressionManager.getNamedExpressions();\n const sheetExpressions =\n namedExpressions.sheetExpressions\n .get(this.opts.workbookName)\n ?.get(this.opts.sheetName) || new Map();\n\n // Get tables on this sheet\n const allTables = this.deps.tableManager.getTables(\n this.opts.workbookName\n );\n const sheetTables = new Map<string, TableDefinition>();\n for (const [name, table] of allTables) {\n if (table.sheetName === this.opts.sheetName) {\n sheetTables.set(name, table);\n }\n }\n\n this.snapshot = {\n sheet: {\n name: sheet.name,\n index: sheet.index,\n content: new Map(sheet.content),\n metadata: new Map(sheet.metadata),\n sheetMetadata: sheet.sheetMetadata,\n },\n namedExpressions: new Map(sheetExpressions),\n tables: sheetTables,\n conditionalStyles: this.deps.styleManager\n .getAllConditionalStyles()\n .filter((s) =>\n s.areas.some(\n (a) =>\n a.workbookName === this.opts.workbookName &&\n a.sheetName === this.opts.sheetName\n )\n ),\n cellStyles: this.deps.styleManager\n .getAllCellStyles()\n .filter((s) =>\n s.areas.some(\n (a) =>\n a.workbookName === this.opts.workbookName &&\n a.sheetName === this.opts.sheetName\n )\n ),\n };\n }\n\n // Execute removal\n this.deps.workbookManager.removeSheet(this.opts);\n this.deps.namedExpressionManager.removeSheet(this.opts);\n this.deps.tableManager.removeSheet(this.opts);\n this.deps.styleManager.removeSheetStyles(\n this.opts.workbookName,\n this.opts.sheetName\n );\n this.deps.referenceManager.invalidateSheet(\n this.opts.workbookName,\n this.opts.sheetName\n );\n const resourceKeys = getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.sheetName,\n this.snapshot\n );\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys,\n removedScopes: [{ type: \"sheet\", ...this.opts }],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys,\n };\n }\n\n undo(): void {\n if (!this.snapshot) return;\n\n // Restore sheet structure\n this.deps.workbookManager.addSheet(this.opts);\n this.deps.namedExpressionManager.addSheet(this.opts);\n this.deps.workbookManager.setSheetContent(this.opts, this.snapshot.sheet.content);\n\n // Restore named expressions\n for (const [name, expr] of this.snapshot.namedExpressions) {\n this.deps.namedExpressionManager.addNamedExpression({\n expressionName: name,\n expression: expr.expression,\n workbookName: this.opts.workbookName,\n sheetName: this.opts.sheetName,\n });\n }\n\n // Restore tables and styles\n restoreTables(this.deps.tableManager, this.snapshot.tables, this.opts.workbookName);\n restoreStyles(this.deps.styleManager, this.snapshot.conditionalStyles, this.snapshot.cellStyles);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.REMOVE_SHEET,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Command to rename a sheet.\n */\nexport class RenameSheetCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: SheetSnapshot | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private opts: {\n workbookName: string;\n sheetName: string;\n newSheetName: string;\n }\n ) {}\n\n execute(): void {\n const namedExpressions =\n this.deps.namedExpressionManager.getNamedExpressions().sheetExpressions\n .get(this.opts.workbookName)\n ?.get(this.opts.sheetName) || new Map();\n const tables = new Map<string, TableDefinition>();\n for (const [name, table] of this.deps.tableManager.getTables(\n this.opts.workbookName\n )) {\n if (table.sheetName === this.opts.sheetName) {\n tables.set(name, table);\n }\n }\n const sheet = this.deps.workbookManager.getSheet(this.opts);\n this.snapshot = {\n sheet: sheet!,\n namedExpressions: new Map(namedExpressions),\n tables,\n conditionalStyles: [],\n cellStyles: [],\n };\n const changedCells = renameSheetAcrossManagers(this.deps, this.opts);\n this.executeFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: Array.from(\n new Set([\n ...getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.sheetName,\n this.snapshot\n ),\n ...getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.newSheetName,\n this.snapshot\n ),\n ])\n ),\n };\n }\n\n undo(): void {\n const changedCells = renameSheetAcrossManagers(this.deps, {\n workbookName: this.opts.workbookName,\n sheetName: this.opts.newSheetName,\n newSheetName: this.opts.sheetName,\n });\n this.undoFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: Array.from(\n new Set([\n ...getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.sheetName,\n this.snapshot\n ),\n ...getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.newSheetName,\n this.snapshot\n ),\n ])\n ),\n };\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RENAME_SHEET,\n payload: this.opts,\n };\n }\n}\n"
5
+ "/**\n * Structure Commands - Commands that modify workbook/sheet structure\n *\n * These commands all require re-evaluation after execution.\n */\n\nimport type { SchemaManager } from \"../managers/schema-manager.mjs\";\nimport type { NamedExpressionManager } from \"../managers/named-expression-manager.mjs\";\nimport type { ReferenceManager } from \"../managers/reference-manager.mjs\";\nimport type { StyleManager } from \"../managers/style-manager.mjs\";\nimport type { TableManager } from \"../managers/table-manager.mjs\";\nimport type { WorkbookManager } from \"../managers/workbook-manager.mjs\";\nimport type {\n CellAddress,\n ConditionalStyle,\n DirectCellStyle,\n NamedExpression,\n Sheet,\n TableDefinition,\n Workbook,\n} from \"../types.mjs\";\nimport type {\n EngineAction,\n EngineCommand,\n MutationInvalidation,\n} from \"./types.mjs\";\nimport { ActionTypes, emptyMutationInvalidation } from \"./types.mjs\";\nimport {\n getNamedExpressionResourceKey,\n getSheetResourceKey,\n getTableResourceKey,\n getWorkbookResourceKey,\n} from \"../resource-keys.mjs\";\n\n/**\n * Dependencies needed for structure commands.\n */\nexport interface StructureCommandDeps {\n workbookManager: WorkbookManager;\n namedExpressionManager: NamedExpressionManager;\n tableManager: TableManager;\n styleManager: StyleManager;\n referenceManager: ReferenceManager;\n apiSchemaManager: SchemaManager;\n renameSheetInFormula: (opts: {\n formula: string;\n oldSheetName: string;\n newSheetName: string;\n }) => string;\n renameWorkbookInFormula: (opts: {\n formula: string;\n oldWorkbookName: string;\n newWorkbookName: string;\n }) => string;\n}\n\n// ============================================================================\n// Workbook Commands\n// ============================================================================\n\n/**\n * Command to add a workbook.\n */\nexport class AddWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string\n ) {}\n\n execute(): void {\n this.deps.workbookManager.addWorkbook(this.workbookName);\n this.deps.namedExpressionManager.addWorkbook(this.workbookName);\n this.deps.tableManager.addWorkbook(this.workbookName);\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(this.workbookName)],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(this.workbookName)],\n removedScopes: [{ type: \"workbook\", workbookName: this.workbookName }],\n };\n }\n\n undo(): void {\n this.deps.workbookManager.removeWorkbook(this.workbookName);\n this.deps.namedExpressionManager.removeWorkbook(this.workbookName);\n this.deps.tableManager.removeWorkbook(this.workbookName);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.ADD_WORKBOOK,\n payload: { workbookName: this.workbookName },\n };\n }\n}\n\n/**\n * Captured state of a workbook for undo purposes.\n */\ninterface WorkbookSnapshot {\n workbook: Workbook;\n namedExpressions: {\n workbookLevel: Map<string, NamedExpression>;\n sheetLevel: Map<string, Map<string, NamedExpression>>;\n };\n tables: Map<string, TableDefinition>;\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n}\n\n/**\n * Capture the full state of a workbook for later restoration.\n */\nfunction captureWorkbookSnapshot(\n deps: StructureCommandDeps,\n workbookName: string\n): WorkbookSnapshot | undefined {\n const workbook = deps.workbookManager.getWorkbooks().get(workbookName);\n if (!workbook) return undefined;\n\n // Deep clone workbook sheets\n const clonedSheets = new Map<string, Sheet>();\n for (const [name, sheet] of workbook.sheets) {\n clonedSheets.set(name, {\n name: sheet.name,\n index: sheet.index,\n content: new Map(sheet.content),\n metadata: new Map(sheet.metadata),\n sheetMetadata: sheet.sheetMetadata,\n });\n }\n\n const namedExpressions = deps.namedExpressionManager.getNamedExpressions();\n\n const snapshot: WorkbookSnapshot = {\n workbook: {\n name: workbook.name,\n sheets: clonedSheets,\n workbookMetadata: workbook.workbookMetadata,\n },\n namedExpressions: {\n workbookLevel: new Map(\n namedExpressions.workbookExpressions.get(workbookName) || []\n ),\n sheetLevel: new Map(),\n },\n tables: new Map(deps.tableManager.getTables(workbookName)),\n conditionalStyles: deps.styleManager\n .getAllConditionalStyles()\n .filter((s) => s.areas.some((a) => a.workbookName === workbookName)),\n cellStyles: deps.styleManager\n .getAllCellStyles()\n .filter((s) => s.areas.some((a) => a.workbookName === workbookName)),\n };\n\n // Capture sheet-level named expressions\n const sheetExpressions = namedExpressions.sheetExpressions.get(workbookName);\n if (sheetExpressions) {\n for (const [sheetName, expressions] of sheetExpressions) {\n snapshot.namedExpressions.sheetLevel.set(sheetName, new Map(expressions));\n }\n }\n\n return snapshot;\n}\n\n/**\n * Remove a workbook and all its associated data.\n */\nfunction removeWorkbook(\n deps: StructureCommandDeps,\n workbookName: string\n): void {\n deps.workbookManager.removeWorkbook(workbookName);\n deps.namedExpressionManager.removeWorkbook(workbookName);\n deps.tableManager.removeWorkbook(workbookName);\n deps.styleManager.removeWorkbookStyles(workbookName);\n deps.referenceManager.invalidateWorkbook(workbookName);\n}\n\n/**\n * Rename a workbook across all managers.\n */\nfunction renameWorkbookAcrossManagers(\n deps: StructureCommandDeps,\n oldName: string,\n newName: string\n): CellAddress[] {\n deps.workbookManager.renameWorkbook({\n workbookName: oldName,\n newWorkbookName: newName,\n });\n deps.namedExpressionManager.renameWorkbook({\n workbookName: oldName,\n newWorkbookName: newName,\n });\n deps.tableManager.updateTablesForWorkbookRename({\n workbookName: oldName,\n newWorkbookName: newName,\n });\n deps.styleManager.updateWorkbookName(oldName, newName);\n const changedCells = deps.workbookManager.updateAllFormulas((formula) =>\n deps.renameWorkbookInFormula({\n formula,\n oldWorkbookName: oldName,\n newWorkbookName: newName,\n })\n );\n deps.referenceManager.updateWorkbookName(oldName, newName);\n deps.apiSchemaManager.updateForWorkbookRename(oldName, newName);\n return changedCells;\n}\n\n/**\n * Rename a sheet across all managers.\n */\nfunction renameSheetAcrossManagers(\n deps: StructureCommandDeps,\n opts: { workbookName: string; sheetName: string; newSheetName: string }\n): CellAddress[] {\n deps.workbookManager.renameSheet(opts);\n deps.namedExpressionManager.renameSheet(opts);\n deps.tableManager.updateTablesForSheetRename(opts);\n deps.styleManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n const changedCells = deps.workbookManager.updateAllFormulas((formula) =>\n deps.renameSheetInFormula({\n formula,\n oldSheetName: opts.sheetName,\n newSheetName: opts.newSheetName,\n })\n );\n deps.referenceManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n deps.apiSchemaManager.updateForSheetRename(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n return changedCells;\n}\n\nfunction getWorkbookSnapshotResourceKeys(\n workbookName: string,\n snapshot: WorkbookSnapshot | undefined\n): string[] {\n const resourceKeys = new Set<string>([getWorkbookResourceKey(workbookName)]);\n if (!snapshot) {\n return Array.from(resourceKeys);\n }\n\n for (const tableName of snapshot.tables.keys()) {\n resourceKeys.add(getTableResourceKey({ workbookName, tableName }));\n }\n for (const name of snapshot.namedExpressions.workbookLevel.keys()) {\n resourceKeys.add(\n getNamedExpressionResourceKey({ expressionName: name, workbookName })\n );\n }\n for (const [sheetName, expressions] of snapshot.namedExpressions.sheetLevel) {\n resourceKeys.add(getSheetResourceKey({ workbookName, sheetName }));\n for (const name of expressions.keys()) {\n resourceKeys.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName,\n sheetName,\n })\n );\n }\n }\n\n return Array.from(resourceKeys);\n}\n\nfunction getSheetSnapshotResourceKeys(\n workbookName: string,\n sheetName: string,\n snapshot: SheetSnapshot | undefined\n): string[] {\n const resourceKeys = new Set<string>([\n getWorkbookResourceKey(workbookName),\n getSheetResourceKey({ workbookName, sheetName }),\n ]);\n if (!snapshot) {\n return Array.from(resourceKeys);\n }\n\n for (const tableName of snapshot.tables.keys()) {\n resourceKeys.add(getTableResourceKey({ workbookName, tableName }));\n }\n for (const name of snapshot.namedExpressions.keys()) {\n resourceKeys.add(\n getNamedExpressionResourceKey({\n expressionName: name,\n workbookName,\n sheetName,\n })\n );\n }\n\n return Array.from(resourceKeys);\n}\n\n/**\n * Restore tables from a snapshot.\n */\nfunction restoreTables(\n tableManager: TableManager,\n tables: Map<string, TableDefinition>,\n workbookName: string\n): void {\n for (const [tableName, table] of tables) {\n tableManager.addTable({\n workbookName,\n tableName,\n sheetName: table.sheetName,\n start: `${String.fromCharCode(65 + table.start.colIndex)}${\n table.start.rowIndex + 1\n }`,\n numRows: table.endRow,\n numCols: table.headers.size,\n getCellValue: () => undefined,\n });\n }\n}\n\n/**\n * Restore styles from a snapshot.\n */\nfunction restoreStyles(\n styleManager: StyleManager,\n conditionalStyles: ConditionalStyle[],\n cellStyles: DirectCellStyle[]\n): void {\n for (const style of conditionalStyles) {\n styleManager.addConditionalStyle(style);\n }\n for (const style of cellStyles) {\n styleManager.addCellStyle(style);\n }\n}\n\n/**\n * Command to remove a workbook.\n */\nexport class RemoveWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: WorkbookSnapshot | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string\n ) {}\n\n execute(): void {\n this.snapshot = captureWorkbookSnapshot(this.deps, this.workbookName);\n removeWorkbook(this.deps, this.workbookName);\n const resourceKeys = getWorkbookSnapshotResourceKeys(\n this.workbookName,\n this.snapshot\n );\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys,\n removedScopes: [{ type: \"workbook\", workbookName: this.workbookName }],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys,\n };\n }\n\n undo(): void {\n if (!this.snapshot) return;\n\n // Restore workbook structure\n this.deps.workbookManager.addWorkbook(this.workbookName);\n this.deps.namedExpressionManager.addWorkbook(this.workbookName);\n this.deps.tableManager.addWorkbook(this.workbookName);\n\n // Restore sheets\n for (const [sheetName, sheet] of this.snapshot.workbook.sheets) {\n this.deps.workbookManager.addSheet({\n workbookName: this.workbookName,\n sheetName,\n });\n this.deps.namedExpressionManager.addSheet({\n workbookName: this.workbookName,\n sheetName,\n });\n this.deps.workbookManager.setSheetContent(\n { workbookName: this.workbookName, sheetName },\n sheet.content\n );\n }\n\n // Restore named expressions\n for (const [name, expr] of this.snapshot.namedExpressions.workbookLevel) {\n this.deps.namedExpressionManager.addNamedExpression({\n expressionName: name,\n expression: expr.expression,\n workbookName: this.workbookName,\n });\n }\n for (const [sheetName, expressions] of this.snapshot.namedExpressions.sheetLevel) {\n for (const [name, expr] of expressions) {\n this.deps.namedExpressionManager.addNamedExpression({\n expressionName: name,\n expression: expr.expression,\n workbookName: this.workbookName,\n sheetName,\n });\n }\n }\n\n // Restore tables and styles\n restoreTables(this.deps.tableManager, this.snapshot.tables, this.workbookName);\n restoreStyles(this.deps.styleManager, this.snapshot.conditionalStyles, this.snapshot.cellStyles);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.REMOVE_WORKBOOK,\n payload: { workbookName: this.workbookName },\n };\n }\n}\n\n/**\n * Command to rename a workbook.\n */\nexport class RenameWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: WorkbookSnapshot | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string,\n private newWorkbookName: string\n ) {}\n\n execute(): void {\n this.snapshot = captureWorkbookSnapshot(this.deps, this.workbookName);\n const changedCells = renameWorkbookAcrossManagers(\n this.deps,\n this.workbookName,\n this.newWorkbookName\n );\n this.executeFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: Array.from(\n new Set([\n ...getWorkbookSnapshotResourceKeys(this.workbookName, this.snapshot),\n ...getWorkbookSnapshotResourceKeys(this.newWorkbookName, this.snapshot),\n ])\n ),\n };\n }\n\n undo(): void {\n const changedCells = renameWorkbookAcrossManagers(\n this.deps,\n this.newWorkbookName,\n this.workbookName\n );\n this.undoFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: Array.from(\n new Set([\n ...getWorkbookSnapshotResourceKeys(this.workbookName, this.snapshot),\n ...getWorkbookSnapshotResourceKeys(this.newWorkbookName, this.snapshot),\n ])\n ),\n };\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RENAME_WORKBOOK,\n payload: {\n workbookName: this.workbookName,\n newWorkbookName: this.newWorkbookName,\n },\n };\n }\n}\n\n/**\n * Command to clone a workbook.\n * Undo simply removes the cloned workbook.\n */\nexport class CloneWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private fromWorkbookName: string,\n private toWorkbookName: string\n ) {}\n\n execute(): void {\n const {\n workbookManager,\n namedExpressionManager,\n tableManager,\n styleManager,\n renameWorkbookInFormula,\n } = this.deps;\n\n // Check if source workbook exists\n const sourceWorkbook = workbookManager\n .getWorkbooks()\n .get(this.fromWorkbookName);\n if (!sourceWorkbook) {\n throw new Error(`Source workbook \"${this.fromWorkbookName}\" not found`);\n }\n\n // Check if target workbook name already exists\n if (workbookManager.getWorkbooks().has(this.toWorkbookName)) {\n throw new Error(\n `Target workbook \"${this.toWorkbookName}\" already exists`\n );\n }\n\n // Create new workbook\n workbookManager.addWorkbook(this.toWorkbookName);\n namedExpressionManager.addWorkbook(this.toWorkbookName);\n tableManager.addWorkbook(this.toWorkbookName);\n\n // Clone all sheets from source workbook\n for (const [sheetName, sheet] of sourceWorkbook.sheets) {\n // Add sheet to target workbook\n workbookManager.addSheet({\n workbookName: this.toWorkbookName,\n sheetName: sheetName,\n });\n namedExpressionManager.addSheet({\n workbookName: this.toWorkbookName,\n sheetName: sheetName,\n });\n\n // Copy all cell content\n workbookManager.setSheetContent(\n { workbookName: this.toWorkbookName, sheetName: sheetName },\n new Map(sheet.content)\n );\n\n // Copy all cell metadata\n const targetSheet = workbookManager.getSheet({\n workbookName: this.toWorkbookName,\n sheetName: sheetName,\n });\n if (targetSheet) {\n targetSheet.metadata = new Map(sheet.metadata);\n\n // Copy sheet metadata\n if (sheet.sheetMetadata !== undefined) {\n targetSheet.sheetMetadata = structuredClone(sheet.sheetMetadata);\n }\n }\n }\n\n // Copy workbook metadata\n const targetWorkbook = workbookManager\n .getWorkbooks()\n .get(this.toWorkbookName);\n if (targetWorkbook && sourceWorkbook.workbookMetadata !== undefined) {\n targetWorkbook.workbookMetadata = structuredClone(\n sourceWorkbook.workbookMetadata\n );\n }\n\n // Clone workbook-scoped named expressions\n const allExpressions = namedExpressionManager.getNamedExpressions();\n const sourceWorkbookExpressions = allExpressions.workbookExpressions.get(\n this.fromWorkbookName\n );\n if (sourceWorkbookExpressions) {\n for (const [expressionName, expression] of sourceWorkbookExpressions) {\n namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: this.toWorkbookName,\n });\n }\n }\n\n // Clone sheet-scoped named expressions\n const sourceSheetExpressions = allExpressions.sheetExpressions.get(\n this.fromWorkbookName\n );\n if (sourceSheetExpressions) {\n for (const [sheetName, sheetExpressions] of sourceSheetExpressions) {\n for (const [expressionName, expression] of sheetExpressions) {\n namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: this.toWorkbookName,\n sheetName,\n });\n }\n }\n }\n\n // Clone tables\n const sourceTables = tableManager.tables.get(this.fromWorkbookName);\n if (sourceTables) {\n for (const [tableName] of sourceTables) {\n tableManager.copyTable(\n { workbookName: this.fromWorkbookName, tableName },\n { workbookName: this.toWorkbookName, tableName }\n );\n }\n }\n\n // Clone conditional styles\n const allConditionalStyles = styleManager.getAllConditionalStyles();\n for (const style of allConditionalStyles) {\n if (\n style.areas.some((area) => area.workbookName === this.fromWorkbookName)\n ) {\n const newStyle: ConditionalStyle = {\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === this.fromWorkbookName\n ? { ...area, workbookName: this.toWorkbookName }\n : area\n ),\n };\n styleManager.addConditionalStyle(newStyle);\n }\n }\n\n // Clone cell styles\n const allCellStyles = styleManager.getAllCellStyles();\n for (const style of allCellStyles) {\n if (\n style.areas.some((area) => area.workbookName === this.fromWorkbookName)\n ) {\n const newStyle: DirectCellStyle = {\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === this.fromWorkbookName\n ? { ...area, workbookName: this.toWorkbookName }\n : area\n ),\n };\n styleManager.addCellStyle(newStyle);\n }\n }\n\n // Update formulas in cloned workbook that reference the source workbook\n workbookManager.updateFormulasForWorkbook(this.toWorkbookName, (formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: this.fromWorkbookName,\n newWorkbookName: this.toWorkbookName,\n })\n );\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(this.toWorkbookName)],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys: [getWorkbookResourceKey(this.toWorkbookName)],\n removedScopes: [{ type: \"workbook\", workbookName: this.toWorkbookName }],\n };\n }\n\n undo(): void {\n // Undo clone = remove the cloned workbook\n removeWorkbook(this.deps, this.toWorkbookName);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.CLONE_WORKBOOK,\n payload: {\n fromWorkbookName: this.fromWorkbookName,\n toWorkbookName: this.toWorkbookName,\n },\n };\n }\n}\n\n// ============================================================================\n// Sheet Commands\n// ============================================================================\n\n/**\n * Command to add a sheet.\n */\nexport class AddSheetCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private opts: { workbookName: string; sheetName: string }\n ) {}\n\n execute(): void {\n this.deps.workbookManager.addSheet(this.opts);\n this.deps.namedExpressionManager.addSheet(this.opts);\n const resourceKey = getSheetResourceKey(this.opts);\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: [resourceKey],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys: [resourceKey],\n removedScopes: [{ type: \"sheet\", ...this.opts }],\n };\n }\n\n undo(): void {\n this.deps.workbookManager.removeSheet(this.opts);\n this.deps.namedExpressionManager.removeSheet(this.opts);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.ADD_SHEET,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Captured state of a sheet for undo purposes.\n */\ninterface SheetSnapshot {\n sheet: Sheet;\n namedExpressions: Map<string, NamedExpression>;\n tables: Map<string, TableDefinition>;\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n}\n\n/**\n * Command to remove a sheet.\n */\nexport class RemoveSheetCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: SheetSnapshot | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private opts: { workbookName: string; sheetName: string }\n ) {}\n\n execute(): void {\n // Capture sheet state before removal\n const sheet = this.deps.workbookManager.getSheet(this.opts);\n if (sheet) {\n const namedExpressions =\n this.deps.namedExpressionManager.getNamedExpressions();\n const sheetExpressions =\n namedExpressions.sheetExpressions\n .get(this.opts.workbookName)\n ?.get(this.opts.sheetName) || new Map();\n\n // Get tables on this sheet\n const allTables = this.deps.tableManager.getTables(\n this.opts.workbookName\n );\n const sheetTables = new Map<string, TableDefinition>();\n for (const [name, table] of allTables) {\n if (table.sheetName === this.opts.sheetName) {\n sheetTables.set(name, table);\n }\n }\n\n this.snapshot = {\n sheet: {\n name: sheet.name,\n index: sheet.index,\n content: new Map(sheet.content),\n metadata: new Map(sheet.metadata),\n sheetMetadata: sheet.sheetMetadata,\n },\n namedExpressions: new Map(sheetExpressions),\n tables: sheetTables,\n conditionalStyles: this.deps.styleManager\n .getAllConditionalStyles()\n .filter((s) =>\n s.areas.some(\n (a) =>\n a.workbookName === this.opts.workbookName &&\n a.sheetName === this.opts.sheetName\n )\n ),\n cellStyles: this.deps.styleManager\n .getAllCellStyles()\n .filter((s) =>\n s.areas.some(\n (a) =>\n a.workbookName === this.opts.workbookName &&\n a.sheetName === this.opts.sheetName\n )\n ),\n };\n }\n\n // Execute removal\n this.deps.workbookManager.removeSheet(this.opts);\n this.deps.namedExpressionManager.removeSheet(this.opts);\n this.deps.tableManager.removeSheet(this.opts);\n this.deps.styleManager.removeSheetStyles(\n this.opts.workbookName,\n this.opts.sheetName\n );\n this.deps.referenceManager.invalidateSheet(\n this.opts.workbookName,\n this.opts.sheetName\n );\n const resourceKeys = getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.sheetName,\n this.snapshot\n );\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys,\n removedScopes: [{ type: \"sheet\", ...this.opts }],\n };\n this.undoFootprint = {\n touchedCells: [],\n resourceKeys,\n };\n }\n\n undo(): void {\n if (!this.snapshot) return;\n\n // Restore sheet structure\n this.deps.workbookManager.addSheet(this.opts);\n this.deps.namedExpressionManager.addSheet(this.opts);\n this.deps.workbookManager.setSheetContent(this.opts, this.snapshot.sheet.content);\n\n // Restore named expressions\n for (const [name, expr] of this.snapshot.namedExpressions) {\n this.deps.namedExpressionManager.addNamedExpression({\n expressionName: name,\n expression: expr.expression,\n workbookName: this.opts.workbookName,\n sheetName: this.opts.sheetName,\n });\n }\n\n // Restore tables and styles\n restoreTables(this.deps.tableManager, this.snapshot.tables, this.opts.workbookName);\n restoreStyles(this.deps.styleManager, this.snapshot.conditionalStyles, this.snapshot.cellStyles);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.REMOVE_SHEET,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Command to rename a sheet.\n */\nexport class RenameSheetCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: SheetSnapshot | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: StructureCommandDeps,\n private opts: {\n workbookName: string;\n sheetName: string;\n newSheetName: string;\n }\n ) {}\n\n execute(): void {\n const namedExpressions =\n this.deps.namedExpressionManager.getNamedExpressions().sheetExpressions\n .get(this.opts.workbookName)\n ?.get(this.opts.sheetName) || new Map();\n const tables = new Map<string, TableDefinition>();\n for (const [name, table] of this.deps.tableManager.getTables(\n this.opts.workbookName\n )) {\n if (table.sheetName === this.opts.sheetName) {\n tables.set(name, table);\n }\n }\n const sheet = this.deps.workbookManager.getSheet(this.opts);\n this.snapshot = {\n sheet: sheet!,\n namedExpressions: new Map(namedExpressions),\n tables,\n conditionalStyles: [],\n cellStyles: [],\n };\n const changedCells = renameSheetAcrossManagers(this.deps, this.opts);\n this.executeFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: Array.from(\n new Set([\n ...getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.sheetName,\n this.snapshot\n ),\n ...getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.newSheetName,\n this.snapshot\n ),\n ])\n ),\n };\n }\n\n undo(): void {\n const changedCells = renameSheetAcrossManagers(this.deps, {\n workbookName: this.opts.workbookName,\n sheetName: this.opts.newSheetName,\n newSheetName: this.opts.sheetName,\n });\n this.undoFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: Array.from(\n new Set([\n ...getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.sheetName,\n this.snapshot\n ),\n ...getSheetSnapshotResourceKeys(\n this.opts.workbookName,\n this.opts.newSheetName,\n this.snapshot\n ),\n ])\n ),\n };\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RENAME_SHEET,\n payload: this.opts,\n };\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "B7795BD40C5FF1B064756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "981C2E76E1D1CC3964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,6 +1,115 @@
1
1
  // src/core/commands/table-commands.ts
2
- import { ActionTypes, emptyMutationInvalidation } from "./types.mjs";
2
+ import {
3
+ ActionTypes,
4
+ emptyMutationInvalidation,
5
+ getSerializedCellValueKind
6
+ } from "./types.mjs";
3
7
  import { getTableResourceKey } from "../resource-keys.mjs";
8
+ import { parseCellReference } from "../utils.mjs";
9
+ function getAddressKey(address) {
10
+ return `${address.workbookName}:${address.sheetName}:${address.rowIndex}:${address.colIndex}`;
11
+ }
12
+ function collectTableFootprintCells(workbookManager, table) {
13
+ const cells = new Map;
14
+ const sheet = workbookManager.getSheet({
15
+ workbookName: table.workbookName,
16
+ sheetName: table.sheetName
17
+ });
18
+ if (!sheet) {
19
+ return [];
20
+ }
21
+ const startColIndex = table.start.colIndex;
22
+ const endColIndex = startColIndex + table.headers.size - 1;
23
+ if (table.endRow.type === "number") {
24
+ for (let rowIndex = table.start.rowIndex;rowIndex <= table.endRow.value; rowIndex++) {
25
+ for (let colIndex = startColIndex;colIndex <= endColIndex; colIndex++) {
26
+ const address = {
27
+ workbookName: table.workbookName,
28
+ sheetName: table.sheetName,
29
+ rowIndex,
30
+ colIndex
31
+ };
32
+ cells.set(getAddressKey(address), {
33
+ address,
34
+ content: workbookManager.getCellContent(address)
35
+ });
36
+ }
37
+ }
38
+ return Array.from(cells.values());
39
+ }
40
+ for (const [ref, content] of sheet.content.entries()) {
41
+ const { rowIndex, colIndex } = parseCellReference(ref);
42
+ if (rowIndex < table.start.rowIndex) {
43
+ continue;
44
+ }
45
+ if (colIndex < startColIndex || colIndex > endColIndex) {
46
+ continue;
47
+ }
48
+ const address = {
49
+ workbookName: table.workbookName,
50
+ sheetName: table.sheetName,
51
+ rowIndex,
52
+ colIndex
53
+ };
54
+ cells.set(getAddressKey(address), {
55
+ address,
56
+ content
57
+ });
58
+ }
59
+ return Array.from(cells.values());
60
+ }
61
+ function buildTableTouchedCells(workbookManager, tables) {
62
+ const touchedCells = new Map;
63
+ for (const table of tables) {
64
+ if (!table) {
65
+ continue;
66
+ }
67
+ for (const cell of collectTableFootprintCells(workbookManager, table)) {
68
+ touchedCells.set(getAddressKey(cell.address), {
69
+ address: cell.address,
70
+ beforeKind: getSerializedCellValueKind(cell.content),
71
+ afterKind: getSerializedCellValueKind(cell.content)
72
+ });
73
+ }
74
+ }
75
+ return Array.from(touchedCells.values());
76
+ }
77
+ function buildTableContextChangedCells(workbookManager, tables) {
78
+ const changedCells = new Map;
79
+ for (const table of tables) {
80
+ if (!table) {
81
+ continue;
82
+ }
83
+ for (const cell of collectTableFootprintCells(workbookManager, table)) {
84
+ changedCells.set(getAddressKey(cell.address), cell.address);
85
+ }
86
+ }
87
+ return Array.from(changedCells.values());
88
+ }
89
+ function mergeTouchedCells(...groups) {
90
+ const precedence = {
91
+ empty: 0,
92
+ scalar: 1,
93
+ formula: 2
94
+ };
95
+ const merged = new Map;
96
+ for (const group of groups) {
97
+ for (const touchedCell of group) {
98
+ const key = getAddressKey(touchedCell.address);
99
+ const existing = merged.get(key);
100
+ if (!existing) {
101
+ merged.set(key, touchedCell);
102
+ continue;
103
+ }
104
+ merged.set(key, {
105
+ address: touchedCell.address,
106
+ beforeKind: precedence[touchedCell.beforeKind] >= precedence[existing.beforeKind] ? touchedCell.beforeKind : existing.beforeKind,
107
+ afterKind: precedence[touchedCell.afterKind] >= precedence[existing.afterKind] ? touchedCell.afterKind : existing.afterKind
108
+ });
109
+ }
110
+ }
111
+ return Array.from(merged.values());
112
+ }
4
113
 
5
114
  class AddTableCommand {
6
115
  deps;
@@ -13,7 +122,7 @@ class AddTableCommand {
13
122
  this.props = props;
14
123
  }
15
124
  execute() {
16
- this.deps.tableManager.addTable({
125
+ const table = this.deps.tableManager.addTable({
17
126
  ...this.props,
18
127
  getCellValue: this.deps.getCellValue
19
128
  });
@@ -22,7 +131,8 @@ class AddTableCommand {
22
131
  tableName: this.props.tableName
23
132
  });
24
133
  this.executeFootprint = {
25
- touchedCells: [],
134
+ touchedCells: buildTableTouchedCells(this.deps.workbookManager, [table]),
135
+ tableContextChangedCells: buildTableContextChangedCells(this.deps.workbookManager, [table]),
26
136
  resourceKeys: [resourceKey]
27
137
  };
28
138
  this.undoFootprint = this.executeFootprint;
@@ -66,7 +176,10 @@ class RemoveTableCommand {
66
176
  tableName: this.opts.tableName
67
177
  });
68
178
  this.executeFootprint = {
69
- touchedCells: [],
179
+ touchedCells: buildTableTouchedCells(this.deps.workbookManager, [
180
+ this.removedTable
181
+ ]),
182
+ tableContextChangedCells: buildTableContextChangedCells(this.deps.workbookManager, [this.removedTable]),
70
183
  resourceKeys: [resourceKey]
71
184
  };
72
185
  this.undoFootprint = this.executeFootprint;
@@ -112,6 +225,10 @@ class RenameTableCommand {
112
225
  this.newName = newName;
113
226
  }
114
227
  execute() {
228
+ const previousTable = this.deps.tableManager.getTable({
229
+ workbookName: this.workbookName,
230
+ name: this.oldName
231
+ });
115
232
  this.deps.tableManager.renameTable(this.workbookName, {
116
233
  oldName: this.oldName,
117
234
  newName: this.newName
@@ -119,12 +236,20 @@ class RenameTableCommand {
119
236
  const changedCells = this.deps.workbookManager.updateAllFormulas((formula) => this.deps.renameTableInFormula(formula, this.oldName, this.newName));
120
237
  const changedNamedExpressions = this.deps.namedExpressionManager.updateAllNamedExpressions((formula) => this.deps.renameTableInFormula(formula, this.oldName, this.newName));
121
238
  this.deps.apiSchemaManager.updateForTableRename(this.workbookName, this.oldName, this.newName);
239
+ const renamedTable = this.deps.tableManager.getTable({
240
+ workbookName: this.workbookName,
241
+ name: this.newName
242
+ });
122
243
  this.executeFootprint = {
123
- touchedCells: changedCells.map((address) => ({
244
+ touchedCells: mergeTouchedCells(buildTableTouchedCells(this.deps.workbookManager, [
245
+ previousTable,
246
+ renamedTable
247
+ ]), changedCells.map((address) => ({
124
248
  address,
125
249
  beforeKind: "formula",
126
250
  afterKind: "formula"
127
- })),
251
+ }))),
252
+ tableContextChangedCells: buildTableContextChangedCells(this.deps.workbookManager, [previousTable, renamedTable]),
128
253
  resourceKeys: [
129
254
  getTableResourceKey({
130
255
  workbookName: this.workbookName,
@@ -139,6 +264,10 @@ class RenameTableCommand {
139
264
  };
140
265
  }
141
266
  undo() {
267
+ const currentTable = this.deps.tableManager.getTable({
268
+ workbookName: this.workbookName,
269
+ name: this.newName
270
+ });
142
271
  this.deps.tableManager.renameTable(this.workbookName, {
143
272
  oldName: this.newName,
144
273
  newName: this.oldName
@@ -146,12 +275,20 @@ class RenameTableCommand {
146
275
  const changedCells = this.deps.workbookManager.updateAllFormulas((formula) => this.deps.renameTableInFormula(formula, this.newName, this.oldName));
147
276
  const changedNamedExpressions = this.deps.namedExpressionManager.updateAllNamedExpressions((formula) => this.deps.renameTableInFormula(formula, this.newName, this.oldName));
148
277
  this.deps.apiSchemaManager.updateForTableRename(this.workbookName, this.newName, this.oldName);
278
+ const restoredTable = this.deps.tableManager.getTable({
279
+ workbookName: this.workbookName,
280
+ name: this.oldName
281
+ });
149
282
  this.undoFootprint = {
150
- touchedCells: changedCells.map((address) => ({
283
+ touchedCells: mergeTouchedCells(buildTableTouchedCells(this.deps.workbookManager, [
284
+ currentTable,
285
+ restoredTable
286
+ ]), changedCells.map((address) => ({
151
287
  address,
152
288
  beforeKind: "formula",
153
289
  afterKind: "formula"
154
- })),
290
+ }))),
291
+ tableContextChangedCells: buildTableContextChangedCells(this.deps.workbookManager, [currentTable, restoredTable]),
155
292
  resourceKeys: [
156
293
  getTableResourceKey({
157
294
  workbookName: this.workbookName,
@@ -204,8 +341,16 @@ class UpdateTableCommand {
204
341
  workbookName: this.opts.workbookName,
205
342
  tableName: this.opts.tableName
206
343
  });
344
+ const nextTable = this.deps.tableManager.getTable({
345
+ workbookName: this.opts.workbookName,
346
+ name: this.opts.tableName
347
+ });
207
348
  this.executeFootprint = {
208
- touchedCells: [],
349
+ touchedCells: buildTableTouchedCells(this.deps.workbookManager, [
350
+ this.previousTable,
351
+ nextTable
352
+ ]),
353
+ tableContextChangedCells: buildTableContextChangedCells(this.deps.workbookManager, [this.previousTable, nextTable]),
209
354
  resourceKeys: [resourceKey]
210
355
  };
211
356
  this.undoFootprint = this.executeFootprint;
@@ -271,7 +416,14 @@ class ResetTablesCommand {
271
416
  }
272
417
  }
273
418
  this.executeFootprint = {
274
- touchedCells: [],
419
+ touchedCells: buildTableTouchedCells(this.deps.workbookManager, [
420
+ ...Array.from(this.previousTables?.values() ?? []).flatMap((tables) => Array.from(tables.values())),
421
+ ...Array.from(this.newTables.values()).flatMap((tables) => Array.from(tables.values()))
422
+ ]),
423
+ tableContextChangedCells: buildTableContextChangedCells(this.deps.workbookManager, [
424
+ ...Array.from(this.previousTables?.values() ?? []).flatMap((tables) => Array.from(tables.values())),
425
+ ...Array.from(this.newTables.values()).flatMap((tables) => Array.from(tables.values()))
426
+ ]),
275
427
  resourceKeys: Array.from(resourceKeys)
276
428
  };
277
429
  this.undoFootprint = this.executeFootprint;
@@ -304,4 +456,4 @@ export {
304
456
  AddTableCommand
305
457
  };
306
458
 
307
- //# debugId=CC464FB94217B86D64756E2164756E21
459
+ //# debugId=C2645E9937E12DCB64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/core/commands/table-commands.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Table Commands - Commands that modify table definitions\n *\n * These commands all require re-evaluation after execution.\n */\n\nimport type { TableManager } from \"../managers/table-manager.mjs\";\nimport type { NamedExpressionManager } from \"../managers/named-expression-manager.mjs\";\nimport type { WorkbookManager } from \"../managers/workbook-manager.mjs\";\nimport type { SchemaManager } from \"../managers/schema-manager.mjs\";\nimport type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRangeEnd,\n TableDefinition,\n} from \"../types.mjs\";\nimport type {\n EngineCommand,\n EngineAction,\n MutationInvalidation,\n} from \"./types.mjs\";\nimport { ActionTypes, emptyMutationInvalidation } from \"./types.mjs\";\nimport { getTableResourceKey } from \"../resource-keys.mjs\";\n\n/**\n * Dependencies needed for table commands.\n */\nexport interface TableCommandDeps {\n tableManager: TableManager;\n namedExpressionManager: NamedExpressionManager;\n workbookManager: WorkbookManager;\n apiSchemaManager: SchemaManager;\n getCellValue: (cellAddress: CellAddress) => SerializedCellValue;\n renameTableInFormula: (\n formula: string,\n oldName: string,\n newName: string\n ) => string;\n}\n\n/**\n * Command to add a table.\n */\nexport class AddTableCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private props: {\n tableName: string;\n sheetName: string;\n workbookName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n }\n ) {}\n\n execute(): void {\n this.deps.tableManager.addTable({\n ...this.props,\n getCellValue: this.deps.getCellValue,\n });\n const resourceKey = getTableResourceKey({\n workbookName: this.props.workbookName,\n tableName: this.props.tableName,\n });\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: [resourceKey],\n };\n this.undoFootprint = this.executeFootprint;\n }\n\n undo(): void {\n this.deps.tableManager.removeTable({\n workbookName: this.props.workbookName,\n tableName: this.props.tableName,\n });\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.ADD_TABLE,\n payload: this.props,\n };\n }\n}\n\n/**\n * Command to remove a table.\n */\nexport class RemoveTableCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private removedTable: TableDefinition | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private opts: { tableName: string; workbookName: string }\n ) {}\n\n execute(): void {\n // Capture table before removal\n this.removedTable = this.deps.tableManager.getTable({\n workbookName: this.opts.workbookName,\n name: this.opts.tableName,\n });\n\n this.deps.tableManager.removeTable(this.opts);\n const resourceKey = getTableResourceKey({\n workbookName: this.opts.workbookName,\n tableName: this.opts.tableName,\n });\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: [resourceKey],\n };\n this.undoFootprint = this.executeFootprint;\n }\n\n undo(): void {\n if (!this.removedTable) return;\n\n // Recreate the table\n const { start, endRow, headers, sheetName } = this.removedTable;\n const startRef = `${String.fromCharCode(65 + start.colIndex)}${start.rowIndex + 1}`;\n\n this.deps.tableManager.addTable({\n workbookName: this.opts.workbookName,\n tableName: this.opts.tableName,\n sheetName,\n start: startRef,\n numRows: endRow,\n numCols: headers.size,\n getCellValue: this.deps.getCellValue,\n });\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.REMOVE_TABLE,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Command to rename a table.\n */\nexport class RenameTableCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private workbookName: string,\n private oldName: string,\n private newName: string\n ) {}\n\n execute(): void {\n this.deps.tableManager.renameTable(this.workbookName, {\n oldName: this.oldName,\n newName: this.newName,\n });\n\n // Update formulas in sheet cells\n const changedCells = this.deps.workbookManager.updateAllFormulas((formula) =>\n this.deps.renameTableInFormula(formula, this.oldName, this.newName)\n );\n\n // Update named expressions\n const changedNamedExpressions =\n this.deps.namedExpressionManager.updateAllNamedExpressions((formula) =>\n this.deps.renameTableInFormula(formula, this.oldName, this.newName)\n );\n\n // Update API schemas\n this.deps.apiSchemaManager.updateForTableRename(\n this.workbookName,\n this.oldName,\n this.newName\n );\n\n this.executeFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: [\n getTableResourceKey({\n workbookName: this.workbookName,\n tableName: this.oldName,\n }),\n getTableResourceKey({\n workbookName: this.workbookName,\n tableName: this.newName,\n }),\n ...changedNamedExpressions,\n ],\n };\n }\n\n undo(): void {\n // Rename back\n this.deps.tableManager.renameTable(this.workbookName, {\n oldName: this.newName,\n newName: this.oldName,\n });\n\n // Update formulas back\n const changedCells = this.deps.workbookManager.updateAllFormulas((formula) =>\n this.deps.renameTableInFormula(formula, this.newName, this.oldName)\n );\n\n // Update named expressions back\n const changedNamedExpressions =\n this.deps.namedExpressionManager.updateAllNamedExpressions((formula) =>\n this.deps.renameTableInFormula(formula, this.newName, this.oldName)\n );\n\n // Update API schemas back\n this.deps.apiSchemaManager.updateForTableRename(\n this.workbookName,\n this.newName,\n this.oldName\n );\n\n this.undoFootprint = {\n touchedCells: changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n })),\n resourceKeys: [\n getTableResourceKey({\n workbookName: this.workbookName,\n tableName: this.oldName,\n }),\n getTableResourceKey({\n workbookName: this.workbookName,\n tableName: this.newName,\n }),\n ...changedNamedExpressions,\n ],\n };\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RENAME_TABLE,\n payload: {\n workbookName: this.workbookName,\n oldName: this.oldName,\n newName: this.newName,\n },\n };\n }\n}\n\n/**\n * Command to update a table.\n */\nexport class UpdateTableCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private previousTable: TableDefinition | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private opts: {\n tableName: string;\n sheetName?: string;\n start?: string;\n numRows?: SpreadsheetRangeEnd;\n numCols?: number;\n workbookName: string;\n }\n ) {}\n\n execute(): void {\n // Capture previous table state\n this.previousTable = this.deps.tableManager.getTable({\n workbookName: this.opts.workbookName,\n name: this.opts.tableName,\n });\n\n this.deps.tableManager.updateTable({\n ...this.opts,\n getCellValue: this.deps.getCellValue,\n });\n const resourceKey = getTableResourceKey({\n workbookName: this.opts.workbookName,\n tableName: this.opts.tableName,\n });\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: [resourceKey],\n };\n this.undoFootprint = this.executeFootprint;\n }\n\n undo(): void {\n if (!this.previousTable) return;\n\n // Restore previous table state\n const { start, endRow, headers, sheetName } = this.previousTable;\n const startRef = `${String.fromCharCode(65 + start.colIndex)}${start.rowIndex + 1}`;\n\n this.deps.tableManager.updateTable({\n workbookName: this.opts.workbookName,\n tableName: this.opts.tableName,\n sheetName,\n start: startRef,\n numRows: endRow,\n numCols: headers.size,\n getCellValue: this.deps.getCellValue,\n });\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.UPDATE_TABLE,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Command to reset all tables.\n */\nexport class ResetTablesCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private previousTables: Map<string, Map<string, TableDefinition>> | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private newTables: Map<string, Map<string, TableDefinition>>\n ) {}\n\n execute(): void {\n // Capture previous tables\n this.previousTables = new Map();\n for (const [workbookName, tables] of this.deps.tableManager.tables) {\n this.previousTables.set(workbookName, new Map(tables));\n }\n\n this.deps.tableManager.resetTables(this.newTables);\n const resourceKeys = new Set<string>();\n for (const [workbookName, tables] of this.previousTables ?? []) {\n for (const tableName of tables.keys()) {\n resourceKeys.add(\n getTableResourceKey({\n workbookName,\n tableName,\n })\n );\n }\n }\n for (const [workbookName, tables] of this.newTables) {\n for (const tableName of tables.keys()) {\n resourceKeys.add(\n getTableResourceKey({\n workbookName,\n tableName,\n })\n );\n }\n }\n this.executeFootprint = {\n touchedCells: [],\n resourceKeys: Array.from(resourceKeys),\n };\n this.undoFootprint = this.executeFootprint;\n }\n\n undo(): void {\n if (!this.previousTables) return;\n this.deps.tableManager.resetTables(this.previousTables);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RESET_TABLES,\n payload: {\n tables: Array.from(this.newTables.entries()).map(([wb, tables]) => [\n wb,\n Array.from(tables.entries()),\n ]),\n },\n };\n }\n}\n"
5
+ "/**\n * Table Commands - Commands that modify table definitions\n *\n * These commands all require re-evaluation after execution.\n */\n\nimport type { TableManager } from \"../managers/table-manager.mjs\";\nimport type { NamedExpressionManager } from \"../managers/named-expression-manager.mjs\";\nimport type { WorkbookManager } from \"../managers/workbook-manager.mjs\";\nimport type { SchemaManager } from \"../managers/schema-manager.mjs\";\nimport type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRangeEnd,\n TableDefinition,\n} from \"../types.mjs\";\nimport type {\n EngineCommand,\n EngineAction,\n MutationInvalidation,\n} from \"./types.mjs\";\nimport {\n ActionTypes,\n emptyMutationInvalidation,\n getSerializedCellValueKind,\n} from \"./types.mjs\";\nimport { getTableResourceKey } from \"../resource-keys.mjs\";\nimport { parseCellReference } from \"../utils.mjs\";\n\nfunction getAddressKey(address: CellAddress): string {\n return `${address.workbookName}:${address.sheetName}:${address.rowIndex}:${address.colIndex}`;\n}\n\nfunction collectTableFootprintCells(\n workbookManager: WorkbookManager,\n table: TableDefinition\n): Array<{\n address: CellAddress;\n content: SerializedCellValue | undefined;\n}> {\n const cells = new Map<\n string,\n {\n address: CellAddress;\n content: SerializedCellValue | undefined;\n }\n >();\n const sheet = workbookManager.getSheet({\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n });\n if (!sheet) {\n return [];\n }\n\n const startColIndex = table.start.colIndex;\n const endColIndex = startColIndex + table.headers.size - 1;\n\n if (table.endRow.type === \"number\") {\n for (let rowIndex = table.start.rowIndex; rowIndex <= table.endRow.value; rowIndex++) {\n for (let colIndex = startColIndex; colIndex <= endColIndex; colIndex++) {\n const address = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n rowIndex,\n colIndex,\n };\n cells.set(getAddressKey(address), {\n address,\n content: workbookManager.getCellContent(address),\n });\n }\n }\n return Array.from(cells.values());\n }\n\n for (const [ref, content] of sheet.content.entries()) {\n const { rowIndex, colIndex } = parseCellReference(ref);\n if (rowIndex < table.start.rowIndex) {\n continue;\n }\n if (colIndex < startColIndex || colIndex > endColIndex) {\n continue;\n }\n\n const address = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n rowIndex,\n colIndex,\n };\n cells.set(getAddressKey(address), {\n address,\n content,\n });\n }\n\n return Array.from(cells.values());\n}\n\nfunction buildTableTouchedCells(\n workbookManager: WorkbookManager,\n tables: Array<TableDefinition | undefined>\n): MutationInvalidation[\"touchedCells\"] {\n const touchedCells = new Map<\n string,\n {\n address: CellAddress;\n beforeKind: ReturnType<typeof getSerializedCellValueKind>;\n afterKind: ReturnType<typeof getSerializedCellValueKind>;\n }\n >();\n\n for (const table of tables) {\n if (!table) {\n continue;\n }\n for (const cell of collectTableFootprintCells(workbookManager, table)) {\n touchedCells.set(getAddressKey(cell.address), {\n address: cell.address,\n beforeKind: getSerializedCellValueKind(cell.content),\n afterKind: getSerializedCellValueKind(cell.content),\n });\n }\n }\n\n return Array.from(touchedCells.values());\n}\n\nfunction buildTableContextChangedCells(\n workbookManager: WorkbookManager,\n tables: Array<TableDefinition | undefined>\n): CellAddress[] {\n const changedCells = new Map<string, CellAddress>();\n\n for (const table of tables) {\n if (!table) {\n continue;\n }\n for (const cell of collectTableFootprintCells(workbookManager, table)) {\n changedCells.set(getAddressKey(cell.address), cell.address);\n }\n }\n\n return Array.from(changedCells.values());\n}\n\nfunction mergeTouchedCells(\n ...groups: MutationInvalidation[\"touchedCells\"][]\n): MutationInvalidation[\"touchedCells\"] {\n const precedence = {\n empty: 0,\n scalar: 1,\n formula: 2,\n } as const;\n const merged = new Map<\n string,\n MutationInvalidation[\"touchedCells\"][number]\n >();\n\n for (const group of groups) {\n for (const touchedCell of group) {\n const key = getAddressKey(touchedCell.address);\n const existing = merged.get(key);\n if (!existing) {\n merged.set(key, touchedCell);\n continue;\n }\n\n merged.set(key, {\n address: touchedCell.address,\n beforeKind:\n precedence[touchedCell.beforeKind] >= precedence[existing.beforeKind]\n ? touchedCell.beforeKind\n : existing.beforeKind,\n afterKind:\n precedence[touchedCell.afterKind] >= precedence[existing.afterKind]\n ? touchedCell.afterKind\n : existing.afterKind,\n });\n }\n }\n\n return Array.from(merged.values());\n}\n\n/**\n * Dependencies needed for table commands.\n */\nexport interface TableCommandDeps {\n tableManager: TableManager;\n namedExpressionManager: NamedExpressionManager;\n workbookManager: WorkbookManager;\n apiSchemaManager: SchemaManager;\n getCellValue: (cellAddress: CellAddress) => SerializedCellValue;\n renameTableInFormula: (\n formula: string,\n oldName: string,\n newName: string\n ) => string;\n}\n\n/**\n * Command to add a table.\n */\nexport class AddTableCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private props: {\n tableName: string;\n sheetName: string;\n workbookName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n }\n ) {}\n\n execute(): void {\n const table = this.deps.tableManager.addTable({\n ...this.props,\n getCellValue: this.deps.getCellValue,\n });\n const resourceKey = getTableResourceKey({\n workbookName: this.props.workbookName,\n tableName: this.props.tableName,\n });\n this.executeFootprint = {\n touchedCells: buildTableTouchedCells(this.deps.workbookManager, [table]),\n tableContextChangedCells: buildTableContextChangedCells(\n this.deps.workbookManager,\n [table]\n ),\n resourceKeys: [resourceKey],\n };\n this.undoFootprint = this.executeFootprint;\n }\n\n undo(): void {\n this.deps.tableManager.removeTable({\n workbookName: this.props.workbookName,\n tableName: this.props.tableName,\n });\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.ADD_TABLE,\n payload: this.props,\n };\n }\n}\n\n/**\n * Command to remove a table.\n */\nexport class RemoveTableCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private removedTable: TableDefinition | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private opts: { tableName: string; workbookName: string }\n ) {}\n\n execute(): void {\n // Capture table before removal\n this.removedTable = this.deps.tableManager.getTable({\n workbookName: this.opts.workbookName,\n name: this.opts.tableName,\n });\n\n this.deps.tableManager.removeTable(this.opts);\n const resourceKey = getTableResourceKey({\n workbookName: this.opts.workbookName,\n tableName: this.opts.tableName,\n });\n this.executeFootprint = {\n touchedCells: buildTableTouchedCells(this.deps.workbookManager, [\n this.removedTable,\n ]),\n tableContextChangedCells: buildTableContextChangedCells(\n this.deps.workbookManager,\n [this.removedTable]\n ),\n resourceKeys: [resourceKey],\n };\n this.undoFootprint = this.executeFootprint;\n }\n\n undo(): void {\n if (!this.removedTable) return;\n\n // Recreate the table\n const { start, endRow, headers, sheetName } = this.removedTable;\n const startRef = `${String.fromCharCode(65 + start.colIndex)}${start.rowIndex + 1}`;\n\n this.deps.tableManager.addTable({\n workbookName: this.opts.workbookName,\n tableName: this.opts.tableName,\n sheetName,\n start: startRef,\n numRows: endRow,\n numCols: headers.size,\n getCellValue: this.deps.getCellValue,\n });\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.REMOVE_TABLE,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Command to rename a table.\n */\nexport class RenameTableCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private workbookName: string,\n private oldName: string,\n private newName: string\n ) {}\n\n execute(): void {\n const previousTable = this.deps.tableManager.getTable({\n workbookName: this.workbookName,\n name: this.oldName,\n });\n this.deps.tableManager.renameTable(this.workbookName, {\n oldName: this.oldName,\n newName: this.newName,\n });\n\n // Update formulas in sheet cells\n const changedCells = this.deps.workbookManager.updateAllFormulas((formula) =>\n this.deps.renameTableInFormula(formula, this.oldName, this.newName)\n );\n\n // Update named expressions\n const changedNamedExpressions =\n this.deps.namedExpressionManager.updateAllNamedExpressions((formula) =>\n this.deps.renameTableInFormula(formula, this.oldName, this.newName)\n );\n\n // Update API schemas\n this.deps.apiSchemaManager.updateForTableRename(\n this.workbookName,\n this.oldName,\n this.newName\n );\n const renamedTable = this.deps.tableManager.getTable({\n workbookName: this.workbookName,\n name: this.newName,\n });\n\n this.executeFootprint = {\n touchedCells: mergeTouchedCells(\n buildTableTouchedCells(this.deps.workbookManager, [\n previousTable,\n renamedTable,\n ]),\n changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n }))\n ),\n tableContextChangedCells: buildTableContextChangedCells(\n this.deps.workbookManager,\n [previousTable, renamedTable]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName: this.workbookName,\n tableName: this.oldName,\n }),\n getTableResourceKey({\n workbookName: this.workbookName,\n tableName: this.newName,\n }),\n ...changedNamedExpressions,\n ],\n };\n }\n\n undo(): void {\n const currentTable = this.deps.tableManager.getTable({\n workbookName: this.workbookName,\n name: this.newName,\n });\n // Rename back\n this.deps.tableManager.renameTable(this.workbookName, {\n oldName: this.newName,\n newName: this.oldName,\n });\n\n // Update formulas back\n const changedCells = this.deps.workbookManager.updateAllFormulas((formula) =>\n this.deps.renameTableInFormula(formula, this.newName, this.oldName)\n );\n\n // Update named expressions back\n const changedNamedExpressions =\n this.deps.namedExpressionManager.updateAllNamedExpressions((formula) =>\n this.deps.renameTableInFormula(formula, this.newName, this.oldName)\n );\n\n // Update API schemas back\n this.deps.apiSchemaManager.updateForTableRename(\n this.workbookName,\n this.newName,\n this.oldName\n );\n const restoredTable = this.deps.tableManager.getTable({\n workbookName: this.workbookName,\n name: this.oldName,\n });\n\n this.undoFootprint = {\n touchedCells: mergeTouchedCells(\n buildTableTouchedCells(this.deps.workbookManager, [\n currentTable,\n restoredTable,\n ]),\n changedCells.map((address) => ({\n address,\n beforeKind: \"formula\" as const,\n afterKind: \"formula\" as const,\n }))\n ),\n tableContextChangedCells: buildTableContextChangedCells(\n this.deps.workbookManager,\n [currentTable, restoredTable]\n ),\n resourceKeys: [\n getTableResourceKey({\n workbookName: this.workbookName,\n tableName: this.oldName,\n }),\n getTableResourceKey({\n workbookName: this.workbookName,\n tableName: this.newName,\n }),\n ...changedNamedExpressions,\n ],\n };\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RENAME_TABLE,\n payload: {\n workbookName: this.workbookName,\n oldName: this.oldName,\n newName: this.newName,\n },\n };\n }\n}\n\n/**\n * Command to update a table.\n */\nexport class UpdateTableCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private previousTable: TableDefinition | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private opts: {\n tableName: string;\n sheetName?: string;\n start?: string;\n numRows?: SpreadsheetRangeEnd;\n numCols?: number;\n workbookName: string;\n }\n ) {}\n\n execute(): void {\n // Capture previous table state\n this.previousTable = this.deps.tableManager.getTable({\n workbookName: this.opts.workbookName,\n name: this.opts.tableName,\n });\n\n this.deps.tableManager.updateTable({\n ...this.opts,\n getCellValue: this.deps.getCellValue,\n });\n const resourceKey = getTableResourceKey({\n workbookName: this.opts.workbookName,\n tableName: this.opts.tableName,\n });\n const nextTable = this.deps.tableManager.getTable({\n workbookName: this.opts.workbookName,\n name: this.opts.tableName,\n });\n this.executeFootprint = {\n touchedCells: buildTableTouchedCells(this.deps.workbookManager, [\n this.previousTable,\n nextTable,\n ]),\n tableContextChangedCells: buildTableContextChangedCells(\n this.deps.workbookManager,\n [this.previousTable, nextTable]\n ),\n resourceKeys: [resourceKey],\n };\n this.undoFootprint = this.executeFootprint;\n }\n\n undo(): void {\n if (!this.previousTable) return;\n\n // Restore previous table state\n const { start, endRow, headers, sheetName } = this.previousTable;\n const startRef = `${String.fromCharCode(65 + start.colIndex)}${start.rowIndex + 1}`;\n\n this.deps.tableManager.updateTable({\n workbookName: this.opts.workbookName,\n tableName: this.opts.tableName,\n sheetName,\n start: startRef,\n numRows: endRow,\n numCols: headers.size,\n getCellValue: this.deps.getCellValue,\n });\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.UPDATE_TABLE,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Command to reset all tables.\n */\nexport class ResetTablesCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private previousTables: Map<string, Map<string, TableDefinition>> | undefined;\n private executeFootprint = emptyMutationInvalidation();\n private undoFootprint = emptyMutationInvalidation();\n\n constructor(\n private deps: TableCommandDeps,\n private newTables: Map<string, Map<string, TableDefinition>>\n ) {}\n\n execute(): void {\n // Capture previous tables\n this.previousTables = new Map();\n for (const [workbookName, tables] of this.deps.tableManager.tables) {\n this.previousTables.set(workbookName, new Map(tables));\n }\n\n this.deps.tableManager.resetTables(this.newTables);\n const resourceKeys = new Set<string>();\n for (const [workbookName, tables] of this.previousTables ?? []) {\n for (const tableName of tables.keys()) {\n resourceKeys.add(\n getTableResourceKey({\n workbookName,\n tableName,\n })\n );\n }\n }\n for (const [workbookName, tables] of this.newTables) {\n for (const tableName of tables.keys()) {\n resourceKeys.add(\n getTableResourceKey({\n workbookName,\n tableName,\n })\n );\n }\n }\n this.executeFootprint = {\n touchedCells: buildTableTouchedCells(this.deps.workbookManager, [\n ...Array.from(this.previousTables?.values() ?? []).flatMap((tables) =>\n Array.from(tables.values())\n ),\n ...Array.from(this.newTables.values()).flatMap((tables) =>\n Array.from(tables.values())\n ),\n ]),\n tableContextChangedCells: buildTableContextChangedCells(\n this.deps.workbookManager,\n [\n ...Array.from(this.previousTables?.values() ?? []).flatMap((tables) =>\n Array.from(tables.values())\n ),\n ...Array.from(this.newTables.values()).flatMap((tables) =>\n Array.from(tables.values())\n ),\n ]\n ),\n resourceKeys: Array.from(resourceKeys),\n };\n this.undoFootprint = this.executeFootprint;\n }\n\n undo(): void {\n if (!this.previousTables) return;\n this.deps.tableManager.resetTables(this.previousTables);\n }\n\n getInvalidationFootprint(phase: \"execute\" | \"undo\"): MutationInvalidation {\n return phase === \"execute\" ? this.executeFootprint : this.undoFootprint;\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RESET_TABLES,\n payload: {\n tables: Array.from(this.newTables.entries()).map(([wb, tables]) => [\n wb,\n Array.from(tables.entries()),\n ]),\n },\n };\n }\n}\n"
6
6
  ],
7
- "mappings": ";AAqBA;AACA;AAAA;AAqBO,MAAM,gBAAyC;AAAA,EAM1C;AAAA,EACA;AAAA,EAND,uBAAuB;AAAA,EACxB,mBAAmB,0BAA0B;AAAA,EAC7C,gBAAgB,0BAA0B;AAAA,EAElD,WAAW,CACD,MACA,OAQR;AAAA,IATQ;AAAA,IACA;AAAA;AAAA,EAUV,OAAO,GAAS;AAAA,IACd,KAAK,KAAK,aAAa,SAAS;AAAA,SAC3B,KAAK;AAAA,MACR,cAAc,KAAK,KAAK;AAAA,IAC1B,CAAC;AAAA,IACD,MAAM,cAAc,oBAAoB;AAAA,MACtC,cAAc,KAAK,MAAM;AAAA,MACzB,WAAW,KAAK,MAAM;AAAA,IACxB,CAAC;AAAA,IACD,KAAK,mBAAmB;AAAA,MACtB,cAAc,CAAC;AAAA,MACf,cAAc,CAAC,WAAW;AAAA,IAC5B;AAAA,IACA,KAAK,gBAAgB,KAAK;AAAA;AAAA,EAG5B,IAAI,GAAS;AAAA,IACX,KAAK,KAAK,aAAa,YAAY;AAAA,MACjC,cAAc,KAAK,MAAM;AAAA,MACzB,WAAW,KAAK,MAAM;AAAA,IACxB,CAAC;AAAA;AAAA,EAGH,wBAAwB,CAAC,OAAiD;AAAA,IACxE,OAAO,UAAU,YAAY,KAAK,mBAAmB,KAAK;AAAA;AAAA,EAG5D,QAAQ,GAAiB;AAAA,IACvB,OAAO;AAAA,MACL,MAAM,YAAY;AAAA,MAClB,SAAS,KAAK;AAAA,IAChB;AAAA;AAEJ;AAAA;AAKO,MAAM,mBAA4C;AAAA,EAO7C;AAAA,EACA;AAAA,EAPD,uBAAuB;AAAA,EACxB;AAAA,EACA,mBAAmB,0BAA0B;AAAA,EAC7C,gBAAgB,0BAA0B;AAAA,EAElD,WAAW,CACD,MACA,MACR;AAAA,IAFQ;AAAA,IACA;AAAA;AAAA,EAGV,OAAO,GAAS;AAAA,IAEd,KAAK,eAAe,KAAK,KAAK,aAAa,SAAS;AAAA,MAClD,cAAc,KAAK,KAAK;AAAA,MACxB,MAAM,KAAK,KAAK;AAAA,IAClB,CAAC;AAAA,IAED,KAAK,KAAK,aAAa,YAAY,KAAK,IAAI;AAAA,IAC5C,MAAM,cAAc,oBAAoB;AAAA,MACtC,cAAc,KAAK,KAAK;AAAA,MACxB,WAAW,KAAK,KAAK;AAAA,IACvB,CAAC;AAAA,IACD,KAAK,mBAAmB;AAAA,MACtB,cAAc,CAAC;AAAA,MACf,cAAc,CAAC,WAAW;AAAA,IAC5B;AAAA,IACA,KAAK,gBAAgB,KAAK;AAAA;AAAA,EAG5B,IAAI,GAAS;AAAA,IACX,IAAI,CAAC,KAAK;AAAA,MAAc;AAAA,IAGxB,QAAQ,OAAO,QAAQ,SAAS,cAAc,KAAK;AAAA,IACnD,MAAM,WAAW,GAAG,OAAO,aAAa,KAAK,MAAM,QAAQ,IAAI,MAAM,WAAW;AAAA,IAEhF,KAAK,KAAK,aAAa,SAAS;AAAA,MAC9B,cAAc,KAAK,KAAK;AAAA,MACxB,WAAW,KAAK,KAAK;AAAA,MACrB;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS,QAAQ;AAAA,MACjB,cAAc,KAAK,KAAK;AAAA,IAC1B,CAAC;AAAA;AAAA,EAGH,wBAAwB,CAAC,OAAiD;AAAA,IACxE,OAAO,UAAU,YAAY,KAAK,mBAAmB,KAAK;AAAA;AAAA,EAG5D,QAAQ,GAAiB;AAAA,IACvB,OAAO;AAAA,MACL,MAAM,YAAY;AAAA,MAClB,SAAS,KAAK;AAAA,IAChB;AAAA;AAEJ;AAAA;AAKO,MAAM,mBAA4C;AAAA,EAM7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EARD,uBAAuB;AAAA,EACxB,mBAAmB,0BAA0B;AAAA,EAC7C,gBAAgB,0BAA0B;AAAA,EAElD,WAAW,CACD,MACA,cACA,SACA,SACR;AAAA,IAJQ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAGV,OAAO,GAAS;AAAA,IACd,KAAK,KAAK,aAAa,YAAY,KAAK,cAAc;AAAA,MACpD,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IAChB,CAAC;AAAA,IAGD,MAAM,eAAe,KAAK,KAAK,gBAAgB,kBAAkB,CAAC,YAChE,KAAK,KAAK,qBAAqB,SAAS,KAAK,SAAS,KAAK,OAAO,CACpE;AAAA,IAGA,MAAM,0BACJ,KAAK,KAAK,uBAAuB,0BAA0B,CAAC,YAC5D,KAAK,KAAK,qBAAqB,SAAS,KAAK,SAAS,KAAK,OAAO,CACpE;AAAA,IAGA,KAAK,KAAK,iBAAiB,qBACzB,KAAK,cACL,KAAK,SACL,KAAK,OACP;AAAA,IAEA,KAAK,mBAAmB;AAAA,MACtB,cAAc,aAAa,IAAI,CAAC,aAAa;AAAA,QAC3C;AAAA,QACA,YAAY;AAAA,QACZ,WAAW;AAAA,MACb,EAAE;AAAA,MACF,cAAc;AAAA,QACZ,oBAAoB;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,QACD,oBAAoB;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,QACD,GAAG;AAAA,MACL;AAAA,IACF;AAAA;AAAA,EAGF,IAAI,GAAS;AAAA,IAEX,KAAK,KAAK,aAAa,YAAY,KAAK,cAAc;AAAA,MACpD,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IAChB,CAAC;AAAA,IAGD,MAAM,eAAe,KAAK,KAAK,gBAAgB,kBAAkB,CAAC,YAChE,KAAK,KAAK,qBAAqB,SAAS,KAAK,SAAS,KAAK,OAAO,CACpE;AAAA,IAGA,MAAM,0BACJ,KAAK,KAAK,uBAAuB,0BAA0B,CAAC,YAC5D,KAAK,KAAK,qBAAqB,SAAS,KAAK,SAAS,KAAK,OAAO,CACpE;AAAA,IAGA,KAAK,KAAK,iBAAiB,qBACzB,KAAK,cACL,KAAK,SACL,KAAK,OACP;AAAA,IAEA,KAAK,gBAAgB;AAAA,MACnB,cAAc,aAAa,IAAI,CAAC,aAAa;AAAA,QAC3C;AAAA,QACA,YAAY;AAAA,QACZ,WAAW;AAAA,MACb,EAAE;AAAA,MACF,cAAc;AAAA,QACZ,oBAAoB;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,QACD,oBAAoB;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,QACD,GAAG;AAAA,MACL;AAAA,IACF;AAAA;AAAA,EAGF,wBAAwB,CAAC,OAAiD;AAAA,IACxE,OAAO,UAAU,YAAY,KAAK,mBAAmB,KAAK;AAAA;AAAA,EAG5D,QAAQ,GAAiB;AAAA,IACvB,OAAO;AAAA,MACL,MAAM,YAAY;AAAA,MAClB,SAAS;AAAA,QACP,cAAc,KAAK;AAAA,QACnB,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAAA;AAEJ;AAAA;AAKO,MAAM,mBAA4C;AAAA,EAO7C;AAAA,EACA;AAAA,EAPD,uBAAuB;AAAA,EACxB;AAAA,EACA,mBAAmB,0BAA0B;AAAA,EAC7C,gBAAgB,0BAA0B;AAAA,EAElD,WAAW,CACD,MACA,MAQR;AAAA,IATQ;AAAA,IACA;AAAA;AAAA,EAUV,OAAO,GAAS;AAAA,IAEd,KAAK,gBAAgB,KAAK,KAAK,aAAa,SAAS;AAAA,MACnD,cAAc,KAAK,KAAK;AAAA,MACxB,MAAM,KAAK,KAAK;AAAA,IAClB,CAAC;AAAA,IAED,KAAK,KAAK,aAAa,YAAY;AAAA,SAC9B,KAAK;AAAA,MACR,cAAc,KAAK,KAAK;AAAA,IAC1B,CAAC;AAAA,IACD,MAAM,cAAc,oBAAoB;AAAA,MACtC,cAAc,KAAK,KAAK;AAAA,MACxB,WAAW,KAAK,KAAK;AAAA,IACvB,CAAC;AAAA,IACD,KAAK,mBAAmB;AAAA,MACtB,cAAc,CAAC;AAAA,MACf,cAAc,CAAC,WAAW;AAAA,IAC5B;AAAA,IACA,KAAK,gBAAgB,KAAK;AAAA;AAAA,EAG5B,IAAI,GAAS;AAAA,IACX,IAAI,CAAC,KAAK;AAAA,MAAe;AAAA,IAGzB,QAAQ,OAAO,QAAQ,SAAS,cAAc,KAAK;AAAA,IACnD,MAAM,WAAW,GAAG,OAAO,aAAa,KAAK,MAAM,QAAQ,IAAI,MAAM,WAAW;AAAA,IAEhF,KAAK,KAAK,aAAa,YAAY;AAAA,MACjC,cAAc,KAAK,KAAK;AAAA,MACxB,WAAW,KAAK,KAAK;AAAA,MACrB;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS,QAAQ;AAAA,MACjB,cAAc,KAAK,KAAK;AAAA,IAC1B,CAAC;AAAA;AAAA,EAGH,wBAAwB,CAAC,OAAiD;AAAA,IACxE,OAAO,UAAU,YAAY,KAAK,mBAAmB,KAAK;AAAA;AAAA,EAG5D,QAAQ,GAAiB;AAAA,IACvB,OAAO;AAAA,MACL,MAAM,YAAY;AAAA,MAClB,SAAS,KAAK;AAAA,IAChB;AAAA;AAEJ;AAAA;AAKO,MAAM,mBAA4C;AAAA,EAO7C;AAAA,EACA;AAAA,EAPD,uBAAuB;AAAA,EACxB;AAAA,EACA,mBAAmB,0BAA0B;AAAA,EAC7C,gBAAgB,0BAA0B;AAAA,EAElD,WAAW,CACD,MACA,WACR;AAAA,IAFQ;AAAA,IACA;AAAA;AAAA,EAGV,OAAO,GAAS;AAAA,IAEd,KAAK,iBAAiB,IAAI;AAAA,IAC1B,YAAY,cAAc,WAAW,KAAK,KAAK,aAAa,QAAQ;AAAA,MAClE,KAAK,eAAe,IAAI,cAAc,IAAI,IAAI,MAAM,CAAC;AAAA,IACvD;AAAA,IAEA,KAAK,KAAK,aAAa,YAAY,KAAK,SAAS;AAAA,IACjD,MAAM,eAAe,IAAI;AAAA,IACzB,YAAY,cAAc,WAAW,KAAK,kBAAkB,CAAC,GAAG;AAAA,MAC9D,WAAW,aAAa,OAAO,KAAK,GAAG;AAAA,QACrC,aAAa,IACX,oBAAoB;AAAA,UAClB;AAAA,UACA;AAAA,QACF,CAAC,CACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAY,cAAc,WAAW,KAAK,WAAW;AAAA,MACnD,WAAW,aAAa,OAAO,KAAK,GAAG;AAAA,QACrC,aAAa,IACX,oBAAoB;AAAA,UAClB;AAAA,UACA;AAAA,QACF,CAAC,CACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,mBAAmB;AAAA,MACtB,cAAc,CAAC;AAAA,MACf,cAAc,MAAM,KAAK,YAAY;AAAA,IACvC;AAAA,IACA,KAAK,gBAAgB,KAAK;AAAA;AAAA,EAG5B,IAAI,GAAS;AAAA,IACX,IAAI,CAAC,KAAK;AAAA,MAAgB;AAAA,IAC1B,KAAK,KAAK,aAAa,YAAY,KAAK,cAAc;AAAA;AAAA,EAGxD,wBAAwB,CAAC,OAAiD;AAAA,IACxE,OAAO,UAAU,YAAY,KAAK,mBAAmB,KAAK;AAAA;AAAA,EAG5D,QAAQ,GAAiB;AAAA,IACvB,OAAO;AAAA,MACL,MAAM,YAAY;AAAA,MAClB,SAAS;AAAA,QACP,QAAQ,MAAM,KAAK,KAAK,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,YAAY;AAAA,UACjE;AAAA,UACA,MAAM,KAAK,OAAO,QAAQ,CAAC;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAEJ;",
8
- "debugId": "CC464FB94217B86D64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "C2645E9937E12DCB64756E2164756E21",
9
9
  "names": []
10
10
  }