@ricsam/formula-engine 0.0.21 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/core/commands/command-executor.cjs +3 -5
- package/dist/cjs/core/commands/command-executor.cjs.map +3 -3
- package/dist/cjs/core/commands/structure-commands.cjs.map +1 -1
- package/dist/cjs/core/commands/table-commands.cjs.map +1 -1
- package/dist/cjs/core/engine.cjs +56 -42
- package/dist/cjs/core/engine.cjs.map +3 -3
- package/dist/cjs/core/managers/{api-schema-manager.cjs → schema-manager.cjs} +67 -7
- package/dist/cjs/core/managers/schema-manager.cjs.map +10 -0
- package/dist/cjs/core/{api → schema}/cell-orm.cjs +9 -23
- package/dist/cjs/core/schema/cell-orm.cjs.map +10 -0
- package/dist/cjs/core/schema/grid-orm.cjs +115 -0
- package/dist/cjs/core/schema/grid-orm.cjs.map +10 -0
- package/dist/cjs/core/{api/api-builder.cjs → schema/schema-builder.cjs} +21 -14
- package/dist/cjs/core/schema/schema-builder.cjs.map +10 -0
- package/dist/cjs/core/{api/api-helpers.cjs → schema/schema-helpers.cjs} +12 -13
- package/dist/cjs/core/schema/schema-helpers.cjs.map +10 -0
- package/dist/cjs/core/{api/api.cjs → schema/schema.cjs} +31 -13
- package/dist/cjs/core/schema/schema.cjs.map +10 -0
- package/dist/cjs/core/{api → schema}/table-orm.cjs +27 -19
- package/dist/cjs/core/schema/table-orm.cjs.map +10 -0
- package/dist/cjs/lib.cjs +7 -8
- package/dist/cjs/lib.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/core/commands/command-executor.mjs +3 -5
- package/dist/mjs/core/commands/command-executor.mjs.map +3 -3
- package/dist/mjs/core/commands/structure-commands.mjs.map +1 -1
- package/dist/mjs/core/commands/table-commands.mjs.map +1 -1
- package/dist/mjs/core/engine.mjs +57 -43
- package/dist/mjs/core/engine.mjs.map +3 -3
- package/dist/mjs/core/managers/{api-schema-manager.mjs → schema-manager.mjs} +64 -4
- package/dist/mjs/core/managers/schema-manager.mjs.map +10 -0
- package/dist/mjs/core/schema/cell-orm.mjs +35 -0
- package/dist/mjs/core/schema/cell-orm.mjs.map +10 -0
- package/dist/mjs/core/schema/grid-orm.mjs +84 -0
- package/dist/mjs/core/schema/grid-orm.mjs.map +10 -0
- package/dist/mjs/core/schema/schema-builder.mjs +34 -0
- package/dist/mjs/core/schema/schema-builder.mjs.map +10 -0
- package/dist/mjs/core/{api/api-helpers.mjs → schema/schema-helpers.mjs} +9 -10
- package/dist/mjs/core/schema/schema-helpers.mjs.map +10 -0
- package/dist/mjs/core/schema/schema.mjs +51 -0
- package/dist/mjs/core/schema/schema.mjs.map +10 -0
- package/dist/mjs/core/{api → schema}/table-orm.mjs +13 -5
- package/dist/mjs/core/schema/table-orm.mjs.map +10 -0
- package/dist/mjs/lib.mjs +6 -7
- package/dist/mjs/lib.mjs.map +2 -2
- package/dist/mjs/package.json +1 -1
- package/dist/types/core/commands/command-executor.d.ts +1 -3
- package/dist/types/core/commands/structure-commands.d.ts +2 -2
- package/dist/types/core/commands/table-commands.d.ts +2 -2
- package/dist/types/core/engine.d.ts +34 -7
- package/dist/types/core/managers/{api-schema-manager.d.ts → schema-manager.d.ts} +26 -5
- package/dist/types/core/{api → schema}/cell-orm.d.ts +8 -4
- package/dist/types/core/schema/grid-orm.d.ts +63 -0
- package/dist/types/core/schema/schema-builder.d.ts +16 -0
- package/dist/types/core/{api/api-helpers.d.ts → schema/schema-helpers.d.ts} +16 -4
- package/dist/types/core/schema/schema.d.ts +167 -0
- package/dist/types/core/{api → schema}/table-orm.d.ts +1 -1
- package/dist/types/lib.d.ts +6 -6
- package/package.json +1 -1
- package/dist/cjs/core/api/api-builder.cjs.map +0 -10
- package/dist/cjs/core/api/api-helpers.cjs.map +0 -10
- package/dist/cjs/core/api/api.cjs.map +0 -10
- package/dist/cjs/core/api/cell-orm.cjs.map +0 -10
- package/dist/cjs/core/api/table-orm.cjs.map +0 -10
- package/dist/cjs/core/managers/api-schema-manager.cjs.map +0 -10
- package/dist/mjs/core/api/api-builder.mjs +0 -27
- package/dist/mjs/core/api/api-builder.mjs.map +0 -10
- package/dist/mjs/core/api/api-helpers.mjs.map +0 -10
- package/dist/mjs/core/api/api.mjs +0 -33
- package/dist/mjs/core/api/api.mjs.map +0 -10
- package/dist/mjs/core/api/cell-orm.mjs +0 -49
- package/dist/mjs/core/api/cell-orm.mjs.map +0 -10
- package/dist/mjs/core/api/table-orm.mjs.map +0 -10
- package/dist/mjs/core/managers/api-schema-manager.mjs.map +0 -10
- package/dist/types/core/api/api-builder.d.ts +0 -16
- package/dist/types/core/api/api.d.ts +0 -91
- /package/dist/types/core/{api/api.type-test.d.ts → schema/schema.type-test.d.ts} +0 -0
|
@@ -10,15 +10,13 @@ class SchemaIntegrityError extends Error {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
class CommandExecutor {
|
|
13
|
-
apiDeclaration;
|
|
14
13
|
evaluationManager;
|
|
15
14
|
eventManager;
|
|
16
15
|
validateAllSchemas;
|
|
17
16
|
undoStack = [];
|
|
18
17
|
redoStack = [];
|
|
19
18
|
actionLog = [];
|
|
20
|
-
constructor(
|
|
21
|
-
this.apiDeclaration = apiDeclaration;
|
|
19
|
+
constructor(evaluationManager, eventManager, validateAllSchemas) {
|
|
22
20
|
this.evaluationManager = evaluationManager;
|
|
23
21
|
this.eventManager = eventManager;
|
|
24
22
|
this.validateAllSchemas = validateAllSchemas;
|
|
@@ -32,7 +30,7 @@ class CommandExecutor {
|
|
|
32
30
|
command.execute();
|
|
33
31
|
if (command.requiresReevaluation) {
|
|
34
32
|
this.evaluationManager.clearEvaluationCache();
|
|
35
|
-
if (validate
|
|
33
|
+
if (validate) {
|
|
36
34
|
const validation = this.validateAllSchemas();
|
|
37
35
|
if (!validation.valid) {
|
|
38
36
|
command.undo();
|
|
@@ -106,4 +104,4 @@ export {
|
|
|
106
104
|
CommandExecutor
|
|
107
105
|
};
|
|
108
106
|
|
|
109
|
-
//# debugId=
|
|
107
|
+
//# debugId=383A6EB14F8F793264756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/core/commands/command-executor.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * CommandExecutor - Executes commands with undo/redo support and schema validation\n *\n * Handles:\n * - Command execution with optional re-evaluation\n * - Schema validation after re-evaluation\n * - Automatic rollback on validation failure\n * - Undo/redo stacks\n * - Action serialization for persistence\n */\n\nimport type {
|
|
5
|
+
"/**\n * CommandExecutor - Executes commands with undo/redo support and schema validation\n *\n * Handles:\n * - Command execution with optional re-evaluation\n * - Schema validation after re-evaluation\n * - Automatic rollback on validation failure\n * - Undo/redo stacks\n * - Action serialization for persistence\n */\n\nimport type { SchemaDeclaration } from \"../schema/schema.mjs\";\nimport type { FormulaEngine } from \"../engine.mjs\";\nimport type { EvaluationManager } from \"../managers/evaluation-manager.mjs\";\nimport type { EventManager } from \"../managers/event-manager.mjs\";\nimport type { CellAddress, SerializedCellValue } from \"../types.mjs\";\nimport type {\n EngineCommand,\n EngineAction,\n ExecuteOptions,\n SchemaValidationResult,\n SchemaValidationErrorInfo,\n} from \"./types.mjs\";\n\n/**\n * Error thrown when schema integrity validation fails.\n * Contains all validation errors that occurred.\n */\nexport class SchemaIntegrityError extends Error {\n constructor(public errors: SchemaValidationErrorInfo[]) {\n const messages = errors.map((e) => e.message).join(\"; \");\n super(`Schema integrity violation: ${messages}`);\n this.name = \"SchemaIntegrityError\";\n }\n}\n\n/**\n * CommandExecutor manages command execution with validation and undo/redo support.\n */\nexport class CommandExecutor {\n private undoStack: EngineCommand[] = [];\n private redoStack: EngineCommand[] = [];\n private actionLog: EngineAction[] = [];\n\n constructor(\n private evaluationManager: EvaluationManager,\n private eventManager: EventManager,\n private validateAllSchemas: () => SchemaValidationResult\n ) {}\n\n /**\n * Execute a command with optional schema validation.\n *\n * @param command - The command to execute\n * @param options - Execution options\n * @throws SchemaIntegrityError if validation fails\n */\n execute(command: EngineCommand, options: ExecuteOptions = {}): void {\n const {\n validate = false,\n skipUndoStack = false,\n skipEmitUpdate = false,\n } = options;\n\n // Execute the command\n command.execute();\n\n // Re-evaluate if needed\n if (command.requiresReevaluation) {\n this.evaluationManager.clearEvaluationCache();\n\n // Validate schemas if requested\n if (validate) {\n const validation = this.validateAllSchemas();\n\n if (!validation.valid) {\n // Rollback: undo the command and re-evaluate\n command.undo();\n this.evaluationManager.clearEvaluationCache();\n throw new SchemaIntegrityError(validation.errors);\n }\n }\n }\n\n // Add to undo stack\n if (!skipUndoStack) {\n this.undoStack.push(command);\n // Clear redo stack on new action\n this.redoStack = [];\n }\n\n // Log the action\n const action = command.toAction();\n action.timestamp = Date.now();\n this.actionLog.push(action);\n\n // Emit update event\n if (!skipEmitUpdate) {\n this.eventManager.emitUpdate();\n }\n }\n\n /**\n * Undo the last command.\n *\n * @returns true if undo was performed, false if nothing to undo\n */\n undo(): boolean {\n const command = this.undoStack.pop();\n if (!command) {\n return false;\n }\n\n command.undo();\n\n if (command.requiresReevaluation) {\n this.evaluationManager.clearEvaluationCache();\n }\n\n this.redoStack.push(command);\n this.eventManager.emitUpdate();\n\n return true;\n }\n\n /**\n * Redo the last undone command.\n *\n * @returns true if redo was performed, false if nothing to redo\n */\n redo(): boolean {\n const command = this.redoStack.pop();\n if (!command) {\n return false;\n }\n\n command.execute();\n\n if (command.requiresReevaluation) {\n this.evaluationManager.clearEvaluationCache();\n }\n\n this.undoStack.push(command);\n this.eventManager.emitUpdate();\n\n return true;\n }\n\n /**\n * Check if undo is available.\n */\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n /**\n * Check if redo is available.\n */\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n /**\n * Get the action log for persistence/collaboration.\n */\n getActionLog(): EngineAction[] {\n return [...this.actionLog];\n }\n\n /**\n * Clear the action log.\n */\n clearActionLog(): void {\n this.actionLog = [];\n }\n\n /**\n * Clear undo/redo stacks.\n */\n clearHistory(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n\n /**\n * Get the number of commands in the undo stack.\n */\n getUndoStackSize(): number {\n return this.undoStack.length;\n }\n\n /**\n * Get the number of commands in the redo stack.\n */\n getRedoStackSize(): number {\n return this.redoStack.length;\n }\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";AA4BO,MAAM,6BAA6B,MAAM;AAAA,EAC3B;AAAA,EAAnB,WAAW,CAAQ,QAAqC;AAAA,IACtD,MAAM,WAAW,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAAA,IACvD,MAAM,+BAA+B,UAAU;AAAA,IAF9B;AAAA,IAGjB,KAAK,OAAO;AAAA;AAEhB;AAAA;AAKO,MAAM,gBAAgB;AAAA,EAMjB;AAAA,EACA;AAAA,EACA;AAAA,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "383A6EB14F8F793264756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
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 { ApiSchemaManager } from \"../managers/api-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 ConditionalStyle,\n DirectCellStyle,\n NamedExpression,\n Sheet,\n TableDefinition,\n Workbook,\n} from \"../types.mjs\";\nimport type { EngineAction, EngineCommand } from \"./types.mjs\";\nimport { ActionTypes } from \"./types.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: ApiSchemaManager;\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\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 }\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 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): void {\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 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}\n\n/**\n * Rename a sheet across all managers.\n */\nfunction renameSheetAcrossManagers(\n deps: StructureCommandDeps,\n opts: { workbookName: string; sheetName: string; newSheetName: string }\n): void {\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 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}\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\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 }\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 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\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string,\n private newWorkbookName: string\n ) {}\n\n execute(): void {\n renameWorkbookAcrossManagers(this.deps, this.workbookName, this.newWorkbookName);\n }\n\n undo(): void {\n renameWorkbookAcrossManagers(this.deps, this.newWorkbookName, this.workbookName);\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\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 }\n\n undo(): void {\n // Undo clone = remove the cloned workbook\n removeWorkbook(this.deps, this.toWorkbookName);\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\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 }\n\n undo(): void {\n this.deps.workbookManager.removeSheet(this.opts);\n this.deps.namedExpressionManager.removeSheet(this.opts);\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\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 }\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 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\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 renameSheetAcrossManagers(this.deps, this.opts);\n }\n\n undo(): void {\n renameSheetAcrossManagers(this.deps, {\n workbookName: this.opts.workbookName,\n sheetName: this.opts.newSheetName,\n newSheetName: this.opts.sheetName,\n });\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 ConditionalStyle,\n DirectCellStyle,\n NamedExpression,\n Sheet,\n TableDefinition,\n Workbook,\n} from \"../types.mjs\";\nimport type { EngineAction, EngineCommand } from \"./types.mjs\";\nimport { ActionTypes } from \"./types.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\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 }\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 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): void {\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 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}\n\n/**\n * Rename a sheet across all managers.\n */\nfunction renameSheetAcrossManagers(\n deps: StructureCommandDeps,\n opts: { workbookName: string; sheetName: string; newSheetName: string }\n): void {\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 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}\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\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 }\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 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\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string,\n private newWorkbookName: string\n ) {}\n\n execute(): void {\n renameWorkbookAcrossManagers(this.deps, this.workbookName, this.newWorkbookName);\n }\n\n undo(): void {\n renameWorkbookAcrossManagers(this.deps, this.newWorkbookName, this.workbookName);\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\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 }\n\n undo(): void {\n // Undo clone = remove the cloned workbook\n removeWorkbook(this.deps, this.toWorkbookName);\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\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 }\n\n undo(): void {\n this.deps.workbookManager.removeSheet(this.opts);\n this.deps.namedExpressionManager.removeSheet(this.opts);\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\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 }\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 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\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 renameSheetAcrossManagers(this.deps, this.opts);\n }\n\n undo(): void {\n renameSheetAcrossManagers(this.deps, {\n workbookName: this.opts.workbookName,\n sheetName: this.opts.newSheetName,\n newSheetName: this.opts.sheetName,\n });\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RENAME_SHEET,\n payload: this.opts,\n };\n }\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
8
|
"debugId": "39C98D842B86633B64756E2164756E21",
|
|
@@ -2,7 +2,7 @@
|
|
|
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 {
|
|
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 { EngineCommand, EngineAction } from \"./types.mjs\";\nimport { ActionTypes } from \"./types.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\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 }\n\n undo(): void {\n this.deps.tableManager.removeTable({\n workbookName: this.props.workbookName,\n tableName: this.props.tableName,\n });\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\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 }\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 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\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 this.deps.workbookManager.updateAllFormulas((formula) =>\n this.deps.renameTableInFormula(formula, this.oldName, this.newName)\n );\n\n // Update named expressions\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\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 this.deps.workbookManager.updateAllFormulas((formula) =>\n this.deps.renameTableInFormula(formula, this.newName, this.oldName)\n );\n\n // Update named expressions back\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\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\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 }\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 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\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 }\n\n undo(): void {\n if (!this.previousTables) return;\n this.deps.tableManager.resetTables(this.previousTables);\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\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
8
|
"debugId": "CE53AF90A8D2D02A64756E2164756E21",
|
package/dist/mjs/core/engine.mjs
CHANGED
|
@@ -17,9 +17,11 @@ import { StyleManager } from "./managers/style-manager.mjs";
|
|
|
17
17
|
import { CopyManager } from "./managers/copy-manager.mjs";
|
|
18
18
|
import { ReferenceManager } from "./managers/reference-manager.mjs";
|
|
19
19
|
import {
|
|
20
|
-
|
|
21
|
-
} from "./managers/
|
|
22
|
-
import {
|
|
20
|
+
SchemaManager
|
|
21
|
+
} from "./managers/schema-manager.mjs";
|
|
22
|
+
import { buildSchemaFromDeclaration } from "./schema/schema-builder.mjs";
|
|
23
|
+
import { TableOrm } from "./schema/table-orm.mjs";
|
|
24
|
+
import { CellOrm } from "./schema/cell-orm.mjs";
|
|
23
25
|
import {
|
|
24
26
|
CommandExecutor
|
|
25
27
|
} from "./commands/command-executor.mjs";
|
|
@@ -80,10 +82,10 @@ class FormulaEngine {
|
|
|
80
82
|
styleManager;
|
|
81
83
|
copyManager;
|
|
82
84
|
referenceManager;
|
|
83
|
-
|
|
85
|
+
schemaManager;
|
|
84
86
|
commandExecutor;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
schema;
|
|
88
|
+
schemaDeclaration;
|
|
87
89
|
_workbookManager;
|
|
88
90
|
_namedExpressionManager;
|
|
89
91
|
_tableManager;
|
|
@@ -92,8 +94,8 @@ class FormulaEngine {
|
|
|
92
94
|
_autoFillManager;
|
|
93
95
|
_dependencyManager;
|
|
94
96
|
_styleManager;
|
|
95
|
-
constructor(
|
|
96
|
-
this.
|
|
97
|
+
constructor(schema) {
|
|
98
|
+
this.schemaDeclaration = schema?.declaration;
|
|
97
99
|
this.eventManager = new EventManager;
|
|
98
100
|
this.workbookManager = new WorkbookManager;
|
|
99
101
|
this.namedExpressionManager = new NamedExpressionManager;
|
|
@@ -106,12 +108,12 @@ class FormulaEngine {
|
|
|
106
108
|
this.copyManager = new CopyManager(this.workbookManager, this.evaluationManager, this.styleManager);
|
|
107
109
|
this.autoFillManager = new AutoFill(this.workbookManager, this.styleManager);
|
|
108
110
|
this.referenceManager = new ReferenceManager;
|
|
109
|
-
this.
|
|
110
|
-
this.commandExecutor = new CommandExecutor(this.
|
|
111
|
-
if (this.
|
|
112
|
-
this.
|
|
111
|
+
this.schemaManager = new SchemaManager(this.tableManager);
|
|
112
|
+
this.commandExecutor = new CommandExecutor(this.evaluationManager, this.eventManager, () => this.schemaManager.validateAllSchemaConstraints((cell) => this.getCellValue(cell), (cell) => this.getCellMetadata(cell), (table) => this.getTableDataCells(table)));
|
|
113
|
+
if (this.schemaDeclaration) {
|
|
114
|
+
this.schema = buildSchemaFromDeclaration(this, this.schemaDeclaration, this.schemaManager);
|
|
113
115
|
} else {
|
|
114
|
-
this.
|
|
116
|
+
this.schema = {};
|
|
115
117
|
}
|
|
116
118
|
this._workbookManager = this.workbookManager;
|
|
117
119
|
this._namedExpressionManager = this.namedExpressionManager;
|
|
@@ -122,8 +124,20 @@ class FormulaEngine {
|
|
|
122
124
|
this._dependencyManager = this.dependencyManager;
|
|
123
125
|
this._styleManager = this.styleManager;
|
|
124
126
|
}
|
|
125
|
-
static buildEmpty(
|
|
126
|
-
return new FormulaEngine(
|
|
127
|
+
static buildEmpty(schema) {
|
|
128
|
+
return new FormulaEngine(schema);
|
|
129
|
+
}
|
|
130
|
+
addTableSchema(namespace, address, headers) {
|
|
131
|
+
this.schemaManager.registerTableSchema(namespace, address.workbookName, address.tableName, headers);
|
|
132
|
+
const orm = new TableOrm(this, address.workbookName, address.tableName, headers, namespace);
|
|
133
|
+
this.schema[namespace] = orm;
|
|
134
|
+
return orm;
|
|
135
|
+
}
|
|
136
|
+
addCellSchema(namespace, cellAddress, parse, write = (value) => ({ value })) {
|
|
137
|
+
this.schemaManager.registerCellSchema(namespace, cellAddress, parse);
|
|
138
|
+
const orm = new CellOrm(this, cellAddress, parse, write, namespace);
|
|
139
|
+
this.schema[namespace] = orm;
|
|
140
|
+
return orm;
|
|
127
141
|
}
|
|
128
142
|
getCellEvaluationResult(cellAddress) {
|
|
129
143
|
return this.evaluationManager.getCellEvaluationResult(cellAddress);
|
|
@@ -179,10 +193,10 @@ class FormulaEngine {
|
|
|
179
193
|
throw new Error("Not implemented");
|
|
180
194
|
}
|
|
181
195
|
addNamedExpression(opts) {
|
|
182
|
-
this.commandExecutor.execute(new AddNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate:
|
|
196
|
+
this.commandExecutor.execute(new AddNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
183
197
|
}
|
|
184
198
|
removeNamedExpression(opts) {
|
|
185
|
-
this.commandExecutor.execute(new RemoveNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate:
|
|
199
|
+
this.commandExecutor.execute(new RemoveNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
186
200
|
}
|
|
187
201
|
hasNamedExpression(opts) {
|
|
188
202
|
const scope = opts.sheetName && opts.workbookName ? {
|
|
@@ -196,25 +210,25 @@ class FormulaEngine {
|
|
|
196
210
|
});
|
|
197
211
|
}
|
|
198
212
|
updateNamedExpression(opts) {
|
|
199
|
-
this.commandExecutor.execute(new UpdateNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate:
|
|
213
|
+
this.commandExecutor.execute(new UpdateNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
200
214
|
}
|
|
201
215
|
renameNamedExpression(opts) {
|
|
202
|
-
this.commandExecutor.execute(new RenameNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate:
|
|
216
|
+
this.commandExecutor.execute(new RenameNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
203
217
|
}
|
|
204
218
|
setNamedExpressions(opts) {
|
|
205
|
-
this.commandExecutor.execute(new SetNamedExpressionsCommand(this.getNamedExpressionCommandDeps(), opts), { validate:
|
|
219
|
+
this.commandExecutor.execute(new SetNamedExpressionsCommand(this.getNamedExpressionCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
206
220
|
}
|
|
207
221
|
addTable(props) {
|
|
208
|
-
this.commandExecutor.execute(new AddTableCommand(this.getTableCommandDeps(), props), { validate:
|
|
222
|
+
this.commandExecutor.execute(new AddTableCommand(this.getTableCommandDeps(), props), { validate: this.schemaManager.hasSchemas() });
|
|
209
223
|
}
|
|
210
224
|
renameTable(workbookName, names) {
|
|
211
|
-
this.commandExecutor.execute(new RenameTableCommand(this.getTableCommandDeps(), workbookName, names.oldName, names.newName), { validate:
|
|
225
|
+
this.commandExecutor.execute(new RenameTableCommand(this.getTableCommandDeps(), workbookName, names.oldName, names.newName), { validate: this.schemaManager.hasSchemas() });
|
|
212
226
|
}
|
|
213
227
|
updateTable(opts) {
|
|
214
|
-
this.commandExecutor.execute(new UpdateTableCommand(this.getTableCommandDeps(), opts), { validate:
|
|
228
|
+
this.commandExecutor.execute(new UpdateTableCommand(this.getTableCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
215
229
|
}
|
|
216
230
|
removeTable(opts) {
|
|
217
|
-
this.commandExecutor.execute(new RemoveTableCommand(this.getTableCommandDeps(), opts), { validate:
|
|
231
|
+
this.commandExecutor.execute(new RemoveTableCommand(this.getTableCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
218
232
|
}
|
|
219
233
|
hasTable(opts) {
|
|
220
234
|
return !!this.tableManager.getTable({
|
|
@@ -229,7 +243,7 @@ class FormulaEngine {
|
|
|
229
243
|
});
|
|
230
244
|
}
|
|
231
245
|
resetTables(tables) {
|
|
232
|
-
this.commandExecutor.execute(new ResetTablesCommand(this.getTableCommandDeps(), tables), { validate:
|
|
246
|
+
this.commandExecutor.execute(new ResetTablesCommand(this.getTableCommandDeps(), tables), { validate: this.schemaManager.hasSchemas() });
|
|
233
247
|
}
|
|
234
248
|
getTables(workbookName) {
|
|
235
249
|
return this.tableManager.getTables(workbookName);
|
|
@@ -296,10 +310,10 @@ class FormulaEngine {
|
|
|
296
310
|
this.commandExecutor.execute(new ClearCellStylesCommand(this.styleManager, range));
|
|
297
311
|
}
|
|
298
312
|
pasteCells(source, target, options) {
|
|
299
|
-
this.commandExecutor.execute(new PasteCellsCommand(this.workbookManager, this.copyManager, source, target, options), { validate:
|
|
313
|
+
this.commandExecutor.execute(new PasteCellsCommand(this.workbookManager, this.copyManager, source, target, options), { validate: this.schemaManager.hasSchemas() });
|
|
300
314
|
}
|
|
301
315
|
fillAreas(seedRange, targetRanges, options) {
|
|
302
|
-
this.commandExecutor.execute(new FillAreasCommand(this.workbookManager, this.copyManager, seedRange, targetRanges, options), { validate:
|
|
316
|
+
this.commandExecutor.execute(new FillAreasCommand(this.workbookManager, this.copyManager, seedRange, targetRanges, options), { validate: this.schemaManager.hasSchemas() });
|
|
303
317
|
}
|
|
304
318
|
smartPaste(sourceCells, pasteSelection, options) {
|
|
305
319
|
if (sourceCells.length === 0) {
|
|
@@ -380,19 +394,19 @@ class FormulaEngine {
|
|
|
380
394
|
return { minCol, minRow, maxCol, maxRow };
|
|
381
395
|
}
|
|
382
396
|
moveCell(source, target) {
|
|
383
|
-
this.commandExecutor.execute(new MoveCellCommand(this.workbookManager, this.copyManager, source, target), { validate:
|
|
397
|
+
this.commandExecutor.execute(new MoveCellCommand(this.workbookManager, this.copyManager, source, target), { validate: this.schemaManager.hasSchemas() });
|
|
384
398
|
}
|
|
385
399
|
moveRange(sourceRange, target) {
|
|
386
|
-
this.commandExecutor.execute(new MoveRangeCommand(this.workbookManager, this.copyManager, sourceRange, target), { validate:
|
|
400
|
+
this.commandExecutor.execute(new MoveRangeCommand(this.workbookManager, this.copyManager, sourceRange, target), { validate: this.schemaManager.hasSchemas() });
|
|
387
401
|
}
|
|
388
402
|
addSheet(opts) {
|
|
389
|
-
this.commandExecutor.execute(new AddSheetCommand(this.getStructureCommandDeps(), opts), { validate:
|
|
403
|
+
this.commandExecutor.execute(new AddSheetCommand(this.getStructureCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
390
404
|
}
|
|
391
405
|
removeSheet(opts) {
|
|
392
|
-
this.commandExecutor.execute(new RemoveSheetCommand(this.getStructureCommandDeps(), opts), { validate:
|
|
406
|
+
this.commandExecutor.execute(new RemoveSheetCommand(this.getStructureCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
393
407
|
}
|
|
394
408
|
renameSheet(opts) {
|
|
395
|
-
this.commandExecutor.execute(new RenameSheetCommand(this.getStructureCommandDeps(), opts), { validate:
|
|
409
|
+
this.commandExecutor.execute(new RenameSheetCommand(this.getStructureCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
396
410
|
}
|
|
397
411
|
hasSheet(opts) {
|
|
398
412
|
return !!this.workbookManager.getSheet(opts);
|
|
@@ -410,34 +424,34 @@ class FormulaEngine {
|
|
|
410
424
|
return this.workbookManager.getSheetSerialized(opts);
|
|
411
425
|
}
|
|
412
426
|
addWorkbook(workbookName) {
|
|
413
|
-
this.commandExecutor.execute(new AddWorkbookCommand(this.getStructureCommandDeps(), workbookName), { validate:
|
|
427
|
+
this.commandExecutor.execute(new AddWorkbookCommand(this.getStructureCommandDeps(), workbookName), { validate: this.schemaManager.hasSchemas() });
|
|
414
428
|
}
|
|
415
429
|
removeWorkbook(workbookName) {
|
|
416
|
-
this.commandExecutor.execute(new RemoveWorkbookCommand(this.getStructureCommandDeps(), workbookName), { validate:
|
|
430
|
+
this.commandExecutor.execute(new RemoveWorkbookCommand(this.getStructureCommandDeps(), workbookName), { validate: this.schemaManager.hasSchemas() });
|
|
417
431
|
}
|
|
418
432
|
hasWorkbook(workbookName) {
|
|
419
433
|
return this.workbookManager.getWorkbooks().has(workbookName);
|
|
420
434
|
}
|
|
421
435
|
cloneWorkbook(fromWorkbookName, toWorkbookName) {
|
|
422
|
-
this.commandExecutor.execute(new CloneWorkbookCommand(this.getStructureCommandDeps(), fromWorkbookName, toWorkbookName), { validate:
|
|
436
|
+
this.commandExecutor.execute(new CloneWorkbookCommand(this.getStructureCommandDeps(), fromWorkbookName, toWorkbookName), { validate: this.schemaManager.hasSchemas() });
|
|
423
437
|
}
|
|
424
438
|
renameWorkbook(opts) {
|
|
425
|
-
this.commandExecutor.execute(new RenameWorkbookCommand(this.getStructureCommandDeps(), opts.workbookName, opts.newWorkbookName), { validate:
|
|
439
|
+
this.commandExecutor.execute(new RenameWorkbookCommand(this.getStructureCommandDeps(), opts.workbookName, opts.newWorkbookName), { validate: this.schemaManager.hasSchemas() });
|
|
426
440
|
}
|
|
427
441
|
getWorkbooks() {
|
|
428
442
|
return this.workbookManager.getWorkbooks();
|
|
429
443
|
}
|
|
430
444
|
setSheetContent(opts, content) {
|
|
431
|
-
this.commandExecutor.execute(new SetSheetContentCommand(this.workbookManager, opts, content), { validate:
|
|
445
|
+
this.commandExecutor.execute(new SetSheetContentCommand(this.workbookManager, opts, content), { validate: this.schemaManager.hasSchemas() });
|
|
432
446
|
}
|
|
433
447
|
setCellContent(address, content) {
|
|
434
|
-
this.commandExecutor.execute(new SetCellContentCommand(this.workbookManager, address, content), { validate:
|
|
448
|
+
this.commandExecutor.execute(new SetCellContentCommand(this.workbookManager, address, content), { validate: this.schemaManager.hasSchemas() });
|
|
435
449
|
}
|
|
436
450
|
autoFill(opts, seedRange, fillRanges, direction) {
|
|
437
|
-
this.commandExecutor.execute(new AutoFillCommand(this.workbookManager, this.styleManager, this.autoFillManager, opts, seedRange, fillRanges, direction), { validate:
|
|
451
|
+
this.commandExecutor.execute(new AutoFillCommand(this.workbookManager, this.styleManager, this.autoFillManager, opts, seedRange, fillRanges, direction), { validate: this.schemaManager.hasSchemas() });
|
|
438
452
|
}
|
|
439
453
|
clearSpreadsheetRange(address) {
|
|
440
|
-
this.commandExecutor.execute(new ClearRangeCommand(this.workbookManager, address), { validate:
|
|
454
|
+
this.commandExecutor.execute(new ClearRangeCommand(this.workbookManager, address), { validate: this.schemaManager.hasSchemas() });
|
|
441
455
|
}
|
|
442
456
|
getState() {
|
|
443
457
|
return {
|
|
@@ -519,7 +533,7 @@ class FormulaEngine {
|
|
|
519
533
|
tableManager: this.tableManager,
|
|
520
534
|
styleManager: this.styleManager,
|
|
521
535
|
referenceManager: this.referenceManager,
|
|
522
|
-
apiSchemaManager: this.
|
|
536
|
+
apiSchemaManager: this.schemaManager,
|
|
523
537
|
renameSheetInFormula,
|
|
524
538
|
renameWorkbookInFormula
|
|
525
539
|
};
|
|
@@ -529,7 +543,7 @@ class FormulaEngine {
|
|
|
529
543
|
tableManager: this.tableManager,
|
|
530
544
|
namedExpressionManager: this.namedExpressionManager,
|
|
531
545
|
workbookManager: this.workbookManager,
|
|
532
|
-
apiSchemaManager: this.
|
|
546
|
+
apiSchemaManager: this.schemaManager,
|
|
533
547
|
getCellValue: (cell) => this.getCellValue(cell),
|
|
534
548
|
renameTableInFormula
|
|
535
549
|
};
|
|
@@ -546,4 +560,4 @@ export {
|
|
|
546
560
|
FormulaEngine
|
|
547
561
|
};
|
|
548
562
|
|
|
549
|
-
//# debugId=
|
|
563
|
+
//# debugId=857551C3C526D34464756E2164756E21
|