@ricsam/formula-engine 0.0.17 → 0.0.19

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 (96) hide show
  1. package/dist/cjs/core/api/api-builder.cjs +67 -0
  2. package/dist/cjs/core/api/api-builder.cjs.map +10 -0
  3. package/dist/cjs/core/api/api-helpers.cjs +191 -0
  4. package/dist/cjs/core/api/api-helpers.cjs.map +10 -0
  5. package/dist/cjs/core/api/api.cjs +65 -0
  6. package/dist/cjs/core/api/api.cjs.map +10 -0
  7. package/dist/cjs/core/api/cell-orm.cjs +80 -0
  8. package/dist/cjs/core/api/cell-orm.cjs.map +10 -0
  9. package/dist/cjs/core/api/table-orm.cjs +171 -0
  10. package/dist/cjs/core/api/table-orm.cjs.map +10 -0
  11. package/dist/cjs/core/autofill-utils.cjs +3 -5
  12. package/dist/cjs/core/autofill-utils.cjs.map +3 -3
  13. package/dist/cjs/core/commands/command-executor.cjs +140 -0
  14. package/dist/cjs/core/commands/command-executor.cjs.map +10 -0
  15. package/dist/cjs/core/commands/content-commands.cjs +574 -0
  16. package/dist/cjs/core/commands/content-commands.cjs.map +10 -0
  17. package/dist/cjs/core/commands/metadata-commands.cjs +150 -0
  18. package/dist/cjs/core/commands/metadata-commands.cjs.map +10 -0
  19. package/dist/cjs/core/commands/named-expression-commands.cjs +238 -0
  20. package/dist/cjs/core/commands/named-expression-commands.cjs.map +10 -0
  21. package/dist/cjs/core/commands/structure-commands.cjs +495 -0
  22. package/dist/cjs/core/commands/structure-commands.cjs.map +10 -0
  23. package/dist/cjs/core/commands/style-commands.cjs +219 -0
  24. package/dist/cjs/core/commands/style-commands.cjs.map +10 -0
  25. package/dist/cjs/core/commands/table-commands.cjs +226 -0
  26. package/dist/cjs/core/commands/table-commands.cjs.map +10 -0
  27. package/dist/cjs/core/commands/types.cjs +72 -0
  28. package/dist/cjs/core/commands/types.cjs.map +10 -0
  29. package/dist/cjs/core/engine.cjs +170 -297
  30. package/dist/cjs/core/engine.cjs.map +3 -3
  31. package/dist/cjs/core/managers/api-schema-manager.cjs +304 -0
  32. package/dist/cjs/core/managers/api-schema-manager.cjs.map +10 -0
  33. package/dist/cjs/core/managers/copy-manager.cjs +1 -2
  34. package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
  35. package/dist/cjs/core/types.cjs.map +2 -2
  36. package/dist/cjs/lib.cjs +13 -2
  37. package/dist/cjs/lib.cjs.map +3 -3
  38. package/dist/cjs/package.json +1 -1
  39. package/dist/mjs/core/api/api-builder.mjs +37 -0
  40. package/dist/mjs/core/api/api-builder.mjs.map +10 -0
  41. package/dist/mjs/core/api/api-helpers.mjs +161 -0
  42. package/dist/mjs/core/api/api-helpers.mjs.map +10 -0
  43. package/dist/mjs/core/api/api.mjs +35 -0
  44. package/dist/mjs/core/api/api.mjs.map +10 -0
  45. package/dist/mjs/core/api/cell-orm.mjs +49 -0
  46. package/dist/mjs/core/api/cell-orm.mjs.map +10 -0
  47. package/dist/mjs/core/api/table-orm.mjs +148 -0
  48. package/dist/mjs/core/api/table-orm.mjs.map +10 -0
  49. package/dist/mjs/core/autofill-utils.mjs +3 -5
  50. package/dist/mjs/core/autofill-utils.mjs.map +3 -3
  51. package/dist/mjs/core/commands/command-executor.mjs +109 -0
  52. package/dist/mjs/core/commands/command-executor.mjs.map +10 -0
  53. package/dist/mjs/core/commands/content-commands.mjs +544 -0
  54. package/dist/mjs/core/commands/content-commands.mjs.map +10 -0
  55. package/dist/mjs/core/commands/metadata-commands.mjs +120 -0
  56. package/dist/mjs/core/commands/metadata-commands.mjs.map +10 -0
  57. package/dist/mjs/core/commands/named-expression-commands.mjs +208 -0
  58. package/dist/mjs/core/commands/named-expression-commands.mjs.map +10 -0
  59. package/dist/mjs/core/commands/structure-commands.mjs +465 -0
  60. package/dist/mjs/core/commands/structure-commands.mjs.map +10 -0
  61. package/dist/mjs/core/commands/style-commands.mjs +189 -0
  62. package/dist/mjs/core/commands/style-commands.mjs.map +10 -0
  63. package/dist/mjs/core/commands/table-commands.mjs +196 -0
  64. package/dist/mjs/core/commands/table-commands.mjs.map +10 -0
  65. package/dist/mjs/core/commands/types.mjs +42 -0
  66. package/dist/mjs/core/commands/types.mjs.map +10 -0
  67. package/dist/mjs/core/engine.mjs +213 -297
  68. package/dist/mjs/core/engine.mjs.map +3 -3
  69. package/dist/mjs/core/managers/api-schema-manager.mjs +274 -0
  70. package/dist/mjs/core/managers/api-schema-manager.mjs.map +10 -0
  71. package/dist/mjs/core/managers/copy-manager.mjs +1 -2
  72. package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
  73. package/dist/mjs/core/types.mjs.map +2 -2
  74. package/dist/mjs/lib.mjs +13 -2
  75. package/dist/mjs/lib.mjs.map +3 -3
  76. package/dist/mjs/package.json +1 -1
  77. package/dist/types/core/api/api-builder.d.ts +16 -0
  78. package/dist/types/core/api/api-helpers.d.ts +37 -0
  79. package/dist/types/core/api/api.d.ts +83 -0
  80. package/dist/types/core/api/api.type-test.d.ts +1 -0
  81. package/dist/types/core/api/cell-orm.d.ts +29 -0
  82. package/dist/types/core/api/table-orm.d.ts +46 -0
  83. package/dist/types/core/autofill-utils.d.ts +2 -9
  84. package/dist/types/core/commands/command-executor.d.ts +83 -0
  85. package/dist/types/core/commands/content-commands.d.ts +142 -0
  86. package/dist/types/core/commands/metadata-commands.d.ts +55 -0
  87. package/dist/types/core/commands/named-expression-commands.d.ts +115 -0
  88. package/dist/types/core/commands/structure-commands.d.ts +132 -0
  89. package/dist/types/core/commands/style-commands.d.ts +76 -0
  90. package/dist/types/core/commands/table-commands.d.ts +104 -0
  91. package/dist/types/core/commands/types.d.ts +114 -0
  92. package/dist/types/core/engine.d.ts +130 -26
  93. package/dist/types/core/managers/api-schema-manager.d.ts +121 -0
  94. package/dist/types/core/types.d.ts +1 -1
  95. package/dist/types/lib.d.ts +8 -0
  96. package/package.json +1 -1
@@ -49,6 +49,15 @@ var import_dependency_manager = require("./managers/dependency-manager.cjs");
49
49
  var import_style_manager = require("./managers/style-manager.cjs");
50
50
  var import_copy_manager = require("./managers/copy-manager.cjs");
51
51
  var import_reference_manager = require("./managers/reference-manager.cjs");
52
+ var import_api_schema_manager = require("./managers/api-schema-manager.cjs");
53
+ var import_api_builder = require("./api/api-builder.cjs");
54
+ var import_command_executor = require("./commands/command-executor.cjs");
55
+ var import_content_commands = require("./commands/content-commands.cjs");
56
+ var import_structure_commands = require("./commands/structure-commands.cjs");
57
+ var import_table_commands = require("./commands/table-commands.cjs");
58
+ var import_named_expression_commands = require("./commands/named-expression-commands.cjs");
59
+ var import_metadata_commands = require("./commands/metadata-commands.cjs");
60
+ var import_style_commands = require("./commands/style-commands.cjs");
52
61
 
53
62
  class FormulaEngine {
54
63
  workbookManager;
@@ -61,6 +70,10 @@ class FormulaEngine {
61
70
  styleManager;
62
71
  copyManager;
63
72
  referenceManager;
73
+ apiSchemaManager;
74
+ commandExecutor;
75
+ api;
76
+ apiDeclaration;
64
77
  _workbookManager;
65
78
  _namedExpressionManager;
66
79
  _tableManager;
@@ -69,7 +82,8 @@ class FormulaEngine {
69
82
  _autoFillManager;
70
83
  _dependencyManager;
71
84
  _styleManager;
72
- constructor() {
85
+ constructor(api) {
86
+ this.apiDeclaration = api?.declaration;
73
87
  this.eventManager = new import_event_manager.EventManager;
74
88
  this.workbookManager = new import_workbook_manager.WorkbookManager;
75
89
  this.namedExpressionManager = new import_named_expression_manager.NamedExpressionManager;
@@ -80,8 +94,15 @@ class FormulaEngine {
80
94
  this.evaluationManager = new import_evaluation_manager.EvaluationManager(this.workbookManager, this.tableManager, formulaEvaluator, this.dependencyManager);
81
95
  this.styleManager = new import_style_manager.StyleManager(this.evaluationManager);
82
96
  this.copyManager = new import_copy_manager.CopyManager(this.workbookManager, this.evaluationManager, this.styleManager);
83
- this.autoFillManager = new import_autofill_utils.AutoFill(this.workbookManager, this.styleManager, this);
97
+ this.autoFillManager = new import_autofill_utils.AutoFill(this.workbookManager, this.styleManager);
84
98
  this.referenceManager = new import_reference_manager.ReferenceManager;
99
+ this.apiSchemaManager = new import_api_schema_manager.ApiSchemaManager(this.tableManager);
100
+ this.commandExecutor = new import_command_executor.CommandExecutor(this.apiDeclaration, this.evaluationManager, this.eventManager, () => this.apiSchemaManager.validateAllSchemaConstraints((cell) => this.getCellValue(cell), (cell) => this.getCellMetadata(cell), (table) => this.getTableDataCells(table)));
101
+ if (this.apiDeclaration) {
102
+ this.api = import_api_builder.buildApiFromDeclaration(this, this.apiDeclaration, this.apiSchemaManager);
103
+ } else {
104
+ this.api = undefined;
105
+ }
85
106
  this._workbookManager = this.workbookManager;
86
107
  this._namedExpressionManager = this.namedExpressionManager;
87
108
  this._tableManager = this.tableManager;
@@ -91,8 +112,8 @@ class FormulaEngine {
91
112
  this._dependencyManager = this.dependencyManager;
92
113
  this._styleManager = this.styleManager;
93
114
  }
94
- static buildEmpty() {
95
- return new FormulaEngine;
115
+ static buildEmpty(api) {
116
+ return new FormulaEngine(api);
96
117
  }
97
118
  getCellEvaluationResult(cellAddress) {
98
119
  return this.evaluationManager.getCellEvaluationResult(cellAddress);
@@ -105,25 +126,23 @@ class FormulaEngine {
105
126
  return this.evaluationManager.evaluationResultToSerializedValue(result, cellAddress, debug);
106
127
  }
107
128
  setCellMetadata(address, metadata) {
108
- this.workbookManager.setCellMetadata(address, metadata);
109
- this.eventManager.emitUpdate();
129
+ this.commandExecutor.execute(new import_metadata_commands.SetCellMetadataCommand(this.workbookManager, address, metadata));
110
130
  }
111
131
  getCellMetadata(address) {
112
- return this.workbookManager.getCellMetadata(address);
132
+ const metadata = this.workbookManager.getCellMetadata(address);
133
+ return metadata;
113
134
  }
114
135
  getSheetMetadataSerialized(opts) {
115
136
  return this.workbookManager.getSheetMetadataSerialized(opts);
116
137
  }
117
138
  setSheetMetadata(opts, metadata) {
118
- this.workbookManager.setSheetMetadata(opts, metadata);
119
- this.eventManager.emitUpdate();
139
+ this.commandExecutor.execute(new import_metadata_commands.SetSheetMetadataCommand(this.workbookManager, opts, metadata));
120
140
  }
121
141
  getSheetMetadata(opts) {
122
142
  return this.workbookManager.getSheetMetadata(opts);
123
143
  }
124
144
  setWorkbookMetadata(workbookName, metadata) {
125
- this.workbookManager.setWorkbookMetadata(workbookName, metadata);
126
- this.eventManager.emitUpdate();
145
+ this.commandExecutor.execute(new import_metadata_commands.SetWorkbookMetadataCommand(this.workbookManager, workbookName, metadata));
127
146
  }
128
147
  getWorkbookMetadata(workbookName) {
129
148
  return this.workbookManager.getWorkbookMetadata(workbookName);
@@ -149,111 +168,58 @@ class FormulaEngine {
149
168
  getCellPrecedents(address) {
150
169
  throw new Error("Not implemented");
151
170
  }
152
- addNamedExpression({
153
- expression,
154
- expressionName,
155
- sheetName,
156
- workbookName
157
- }) {
158
- this.namedExpressionManager.addNamedExpression({
159
- expression,
160
- expressionName,
161
- sheetName,
162
- workbookName
171
+ addNamedExpression(opts) {
172
+ this.commandExecutor.execute(new import_named_expression_commands.AddNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
173
+ }
174
+ removeNamedExpression(opts) {
175
+ this.commandExecutor.execute(new import_named_expression_commands.RemoveNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
176
+ }
177
+ hasNamedExpression(opts) {
178
+ const scope = opts.sheetName && opts.workbookName ? {
179
+ type: "sheet",
180
+ workbookName: opts.workbookName,
181
+ sheetName: opts.sheetName
182
+ } : opts.workbookName ? { type: "workbook", workbookName: opts.workbookName } : { type: "global" };
183
+ return !!this.namedExpressionManager.getNamedExpression({
184
+ name: opts.expressionName,
185
+ scope
163
186
  });
164
- this.reevaluate();
165
- this.eventManager.emitUpdate();
166
187
  }
167
- removeNamedExpression({
168
- expressionName,
169
- sheetName,
170
- workbookName
171
- }) {
172
- const found = this.namedExpressionManager.removeNamedExpression({
173
- expressionName,
174
- sheetName,
175
- workbookName
176
- });
177
- if (found) {
178
- this.reevaluate();
179
- this.eventManager.emitUpdate();
180
- }
181
- return found;
188
+ updateNamedExpression(opts) {
189
+ this.commandExecutor.execute(new import_named_expression_commands.UpdateNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
182
190
  }
183
- updateNamedExpression({
184
- expression,
185
- expressionName,
186
- sheetName,
187
- workbookName
188
- }) {
189
- this.namedExpressionManager.updateNamedExpression({
190
- expression,
191
- expressionName,
192
- sheetName,
193
- workbookName
194
- });
195
- this.reevaluate();
196
- this.eventManager.emitUpdate();
197
- }
198
- renameNamedExpression({
199
- expressionName,
200
- sheetName,
201
- workbookName,
202
- newName
203
- }) {
204
- const result = this.namedExpressionManager.renameNamedExpression({
205
- expressionName,
206
- sheetName,
207
- workbookName,
208
- newName
209
- });
210
- this.workbookManager.updateAllFormulas((formula) => import_named_expression_renamer.renameNamedExpressionInFormula(formula, expressionName, newName));
211
- this.namedExpressionManager.updateAllNamedExpressions((formula) => import_named_expression_renamer.renameNamedExpressionInFormula(formula, expressionName, newName));
212
- this.reevaluate();
213
- this.eventManager.emitUpdate();
214
- return result;
191
+ renameNamedExpression(opts) {
192
+ this.commandExecutor.execute(new import_named_expression_commands.RenameNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
215
193
  }
216
194
  setNamedExpressions(opts) {
217
- this.namedExpressionManager.setNamedExpressions(opts);
218
- this.reevaluate();
219
- this.eventManager.emitUpdate();
195
+ this.commandExecutor.execute(new import_named_expression_commands.SetNamedExpressionsCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
220
196
  }
221
197
  addTable(props) {
222
- const table = this.tableManager.addTable({
223
- ...props,
224
- getCellValue: (cellAddress) => this.getCellValue(cellAddress)
225
- });
226
- this.reevaluate();
227
- this.eventManager.emitUpdate();
228
- return table;
198
+ this.commandExecutor.execute(new import_table_commands.AddTableCommand(this.getTableCommandDeps(), props), { validate: !!this.apiDeclaration });
229
199
  }
230
200
  renameTable(workbookName, names) {
231
- this.tableManager.renameTable(workbookName, names);
232
- this.workbookManager.updateAllFormulas((formula) => import_table_renamer.renameTableInFormula(formula, names.oldName, names.newName));
233
- this.namedExpressionManager.updateAllNamedExpressions((formula) => import_table_renamer.renameTableInFormula(formula, names.oldName, names.newName));
234
- this.reevaluate();
235
- this.eventManager.emitUpdate();
201
+ this.commandExecutor.execute(new import_table_commands.RenameTableCommand(this.getTableCommandDeps(), workbookName, names.oldName, names.newName), { validate: !!this.apiDeclaration });
236
202
  }
237
203
  updateTable(opts) {
238
- this.tableManager.updateTable({
239
- ...opts,
240
- getCellValue: (cellAddress) => this.getCellValue(cellAddress)
241
- });
242
- this.reevaluate();
243
- this.eventManager.emitUpdate();
204
+ this.commandExecutor.execute(new import_table_commands.UpdateTableCommand(this.getTableCommandDeps(), opts), { validate: !!this.apiDeclaration });
244
205
  }
245
206
  removeTable(opts) {
246
- const found = this.tableManager.removeTable(opts);
247
- if (found) {
248
- this.reevaluate();
249
- this.eventManager.emitUpdate();
250
- }
251
- return found;
207
+ this.commandExecutor.execute(new import_table_commands.RemoveTableCommand(this.getTableCommandDeps(), opts), { validate: !!this.apiDeclaration });
208
+ }
209
+ hasTable(opts) {
210
+ return !!this.tableManager.getTable({
211
+ workbookName: opts.workbookName,
212
+ name: opts.tableName
213
+ });
214
+ }
215
+ getTable(opts) {
216
+ return this.tableManager.getTable({
217
+ workbookName: opts.workbookName,
218
+ name: opts.tableName
219
+ });
252
220
  }
253
221
  resetTables(tables) {
254
- this.tableManager.resetTables(tables);
255
- this.reevaluate();
256
- this.eventManager.emitUpdate();
222
+ this.commandExecutor.execute(new import_table_commands.ResetTablesCommand(this.getTableCommandDeps(), tables), { validate: !!this.apiDeclaration });
257
223
  }
258
224
  getTables(workbookName) {
259
225
  return this.tableManager.getTables(workbookName);
@@ -261,16 +227,32 @@ class FormulaEngine {
261
227
  isCellInTable(cellAddress) {
262
228
  return this.tableManager.isCellInTable(cellAddress);
263
229
  }
230
+ getTableDataCells(table) {
231
+ const { start, endRow, headers } = table;
232
+ const dataStartRow = start.rowIndex + 1;
233
+ const endColIndex = start.colIndex + headers.size - 1;
234
+ const rangeAddress = {
235
+ workbookName: table.workbookName,
236
+ sheetName: table.sheetName,
237
+ range: {
238
+ start: { col: start.colIndex, row: dataStartRow },
239
+ end: {
240
+ col: { type: "number", value: endColIndex },
241
+ row: endRow
242
+ }
243
+ }
244
+ };
245
+ return this.workbookManager.getCellsInRange(rangeAddress);
246
+ }
264
247
  addConditionalStyle(style) {
265
- this.styleManager.addConditionalStyle(style);
266
- this.eventManager.emitUpdate();
248
+ this.commandExecutor.execute(new import_style_commands.AddConditionalStyleCommand(this.styleManager, style));
267
249
  }
268
250
  removeConditionalStyle(workbookName, index) {
269
- const removed = this.styleManager.removeConditionalStyle(workbookName, index);
270
- if (removed) {
271
- this.eventManager.emitUpdate();
272
- }
273
- return removed;
251
+ this.commandExecutor.execute(new import_style_commands.RemoveConditionalStyleCommand(this.styleManager, workbookName, index));
252
+ }
253
+ getConditionalStyleCount(workbookName) {
254
+ const allStyles = this.styleManager.getAllConditionalStyles();
255
+ return allStyles.filter((s) => s.areas.some((a) => a.workbookName === workbookName)).length;
274
256
  }
275
257
  getConditionalStylesIntersectingWithRange(range) {
276
258
  return this.styleManager.getConditionalStylesIntersectingWithRange(range);
@@ -285,15 +267,14 @@ class FormulaEngine {
285
267
  return this.styleManager.getAllConditionalStyles();
286
268
  }
287
269
  addCellStyle(style) {
288
- this.styleManager.addCellStyle(style);
289
- this.eventManager.emitUpdate();
270
+ this.commandExecutor.execute(new import_style_commands.AddCellStyleCommand(this.styleManager, style));
290
271
  }
291
272
  removeCellStyle(workbookName, index) {
292
- const removed = this.styleManager.removeCellStyle(workbookName, index);
293
- if (removed) {
294
- this.eventManager.emitUpdate();
295
- }
296
- return removed;
273
+ this.commandExecutor.execute(new import_style_commands.RemoveCellStyleCommand(this.styleManager, workbookName, index));
274
+ }
275
+ getCellStyleCount(workbookName) {
276
+ const allStyles = this.styleManager.getAllCellStyles();
277
+ return allStyles.filter((s) => s.areas.some((a) => a.workbookName === workbookName)).length;
297
278
  }
298
279
  getStylesIntersectingWithRange(range) {
299
280
  return this.styleManager.getStylesIntersectingWithRange(range);
@@ -302,18 +283,13 @@ class FormulaEngine {
302
283
  return this.styleManager.getStyleForRange(range);
303
284
  }
304
285
  clearCellStyles(range) {
305
- this.styleManager.clearCellStyles(range);
306
- this.eventManager.emitUpdate();
286
+ this.commandExecutor.execute(new import_style_commands.ClearCellStylesCommand(this.styleManager, range));
307
287
  }
308
288
  pasteCells(source, target, options) {
309
- this.copyManager.pasteCells(source, target, options);
310
- this.reevaluate();
311
- this.eventManager.emitUpdate();
289
+ this.commandExecutor.execute(new import_content_commands.PasteCellsCommand(this.workbookManager, this.copyManager, source, target, options), { validate: !!this.apiDeclaration });
312
290
  }
313
291
  fillAreas(seedRange, targetRanges, options) {
314
- this.copyManager.fillAreas(seedRange, targetRanges, options);
315
- this.reevaluate();
316
- this.eventManager.emitUpdate();
292
+ this.commandExecutor.execute(new import_content_commands.FillAreasCommand(this.workbookManager, this.copyManager, seedRange, targetRanges, options), { validate: !!this.apiDeclaration });
317
293
  }
318
294
  smartPaste(sourceCells, pasteSelection, options) {
319
295
  if (sourceCells.length === 0) {
@@ -394,55 +370,22 @@ class FormulaEngine {
394
370
  return { minCol, minRow, maxCol, maxRow };
395
371
  }
396
372
  moveCell(source, target) {
397
- this.pasteCells([source], target, {
398
- cut: true,
399
- type: "formula",
400
- include: "all"
401
- });
402
- this.reevaluate();
403
- this.eventManager.emitUpdate();
373
+ this.commandExecutor.execute(new import_content_commands.MoveCellCommand(this.workbookManager, this.copyManager, source, target), { validate: !!this.apiDeclaration });
404
374
  }
405
375
  moveRange(sourceRange, target) {
406
- const cells = this.copyManager.expandRangeToCells(sourceRange);
407
- this.pasteCells(cells, target, {
408
- cut: true,
409
- type: "formula",
410
- include: "all"
411
- });
412
- this.reevaluate();
413
- this.eventManager.emitUpdate();
376
+ this.commandExecutor.execute(new import_content_commands.MoveRangeCommand(this.workbookManager, this.copyManager, sourceRange, target), { validate: !!this.apiDeclaration });
414
377
  }
415
378
  addSheet(opts) {
416
- const newSheet = this.workbookManager.addSheet(opts);
417
- const wbLevel = this.namedExpressionManager.addSheet(opts);
418
- this.reevaluate();
419
- this.eventManager.emitUpdate();
420
- return newSheet;
379
+ this.commandExecutor.execute(new import_structure_commands.AddSheetCommand(this.getStructureCommandDeps(), opts), { validate: !!this.apiDeclaration });
421
380
  }
422
381
  removeSheet(opts) {
423
- const sheet = this.workbookManager.removeSheet(opts);
424
- this.namedExpressionManager.removeSheet(opts);
425
- this.tableManager.removeSheet(opts);
426
- this.styleManager.removeSheetStyles(opts.workbookName, opts.sheetName);
427
- this.referenceManager.invalidateSheet(opts.workbookName, opts.sheetName);
428
- this.reevaluate();
429
- this.eventManager.emitUpdate();
430
- return sheet;
382
+ this.commandExecutor.execute(new import_structure_commands.RemoveSheetCommand(this.getStructureCommandDeps(), opts), { validate: !!this.apiDeclaration });
431
383
  }
432
384
  renameSheet(opts) {
433
- const sheet = this.workbookManager.renameSheet(opts);
434
- this.namedExpressionManager.renameSheet(opts);
435
- this.tableManager.updateTablesForSheetRename(opts);
436
- this.styleManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
437
- this.workbookManager.updateAllFormulas((formula) => import_sheet_renamer.renameSheetInFormula({
438
- formula,
439
- oldSheetName: opts.sheetName,
440
- newSheetName: opts.newSheetName
441
- }));
442
- this.referenceManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
443
- this.reevaluate();
444
- this.eventManager.emitUpdate();
445
- return sheet;
385
+ this.commandExecutor.execute(new import_structure_commands.RenameSheetCommand(this.getStructureCommandDeps(), opts), { validate: !!this.apiDeclaration });
386
+ }
387
+ hasSheet(opts) {
388
+ return !!this.workbookManager.getSheet(opts);
446
389
  }
447
390
  getSheets(workbookName) {
448
391
  return this.workbookManager.getSheets(workbookName);
@@ -457,154 +400,34 @@ class FormulaEngine {
457
400
  return this.workbookManager.getSheetSerialized(opts);
458
401
  }
459
402
  addWorkbook(workbookName) {
460
- this.workbookManager.addWorkbook(workbookName);
461
- this.namedExpressionManager.addWorkbook(workbookName);
462
- this.tableManager.addWorkbook(workbookName);
463
- this.reevaluate();
464
- this.eventManager.emitUpdate();
403
+ this.commandExecutor.execute(new import_structure_commands.AddWorkbookCommand(this.getStructureCommandDeps(), workbookName), { validate: !!this.apiDeclaration });
465
404
  }
466
405
  removeWorkbook(workbookName) {
467
- this.workbookManager.removeWorkbook(workbookName);
468
- this.namedExpressionManager.removeWorkbook(workbookName);
469
- this.tableManager.removeWorkbook(workbookName);
470
- this.styleManager.removeWorkbookStyles(workbookName);
471
- this.referenceManager.invalidateWorkbook(workbookName);
472
- this.reevaluate();
473
- this.eventManager.emitUpdate();
406
+ this.commandExecutor.execute(new import_structure_commands.RemoveWorkbookCommand(this.getStructureCommandDeps(), workbookName), { validate: !!this.apiDeclaration });
407
+ }
408
+ hasWorkbook(workbookName) {
409
+ return this.workbookManager.getWorkbooks().has(workbookName);
474
410
  }
475
411
  cloneWorkbook(fromWorkbookName, toWorkbookName) {
476
- const sourceWorkbook = this.workbookManager.getWorkbooks().get(fromWorkbookName);
477
- if (!sourceWorkbook) {
478
- throw new Error(`Source workbook "${fromWorkbookName}" not found`);
479
- }
480
- if (this.workbookManager.getWorkbooks().has(toWorkbookName)) {
481
- throw new Error(`Target workbook "${toWorkbookName}" already exists`);
482
- }
483
- this.addWorkbook(toWorkbookName);
484
- for (const [sheetName, sheet] of sourceWorkbook.sheets) {
485
- this.addSheet({
486
- workbookName: toWorkbookName,
487
- sheetName
488
- });
489
- this.setSheetContent({
490
- workbookName: toWorkbookName,
491
- sheetName
492
- }, new Map(sheet.content));
493
- const targetSheet = this.workbookManager.getSheet({
494
- workbookName: toWorkbookName,
495
- sheetName
496
- });
497
- if (targetSheet) {
498
- targetSheet.metadata = new Map(sheet.metadata);
499
- if (sheet.sheetMetadata !== undefined) {
500
- targetSheet.sheetMetadata = structuredClone(sheet.sheetMetadata);
501
- }
502
- }
503
- }
504
- const targetWorkbook = this.workbookManager.getWorkbooks().get(toWorkbookName);
505
- if (targetWorkbook && sourceWorkbook.workbookMetadata !== undefined) {
506
- targetWorkbook.workbookMetadata = structuredClone(sourceWorkbook.workbookMetadata);
507
- }
508
- const sourceWorkbookExpressions = this.namedExpressionManager.getNamedExpressions().workbookExpressions.get(fromWorkbookName);
509
- if (sourceWorkbookExpressions) {
510
- for (const [name, expression] of sourceWorkbookExpressions) {
511
- this.addNamedExpression({
512
- expressionName: name,
513
- expression: expression.expression,
514
- workbookName: toWorkbookName
515
- });
516
- }
517
- }
518
- const sourceSheetExpressions = this.namedExpressionManager.getNamedExpressions().sheetExpressions.get(fromWorkbookName);
519
- if (sourceSheetExpressions) {
520
- for (const [sheetName, sheetExpressions] of sourceSheetExpressions) {
521
- for (const [name, expression] of sheetExpressions) {
522
- this.addNamedExpression({
523
- expressionName: name,
524
- expression: expression.expression,
525
- workbookName: toWorkbookName,
526
- sheetName
527
- });
528
- }
529
- }
530
- }
531
- const sourceTables = this.tableManager.tables.get(fromWorkbookName);
532
- if (sourceTables) {
533
- for (const [tableName, table] of sourceTables) {
534
- this.tableManager.copyTable({
535
- workbookName: fromWorkbookName,
536
- tableName
537
- }, {
538
- workbookName: toWorkbookName,
539
- tableName
540
- });
541
- }
542
- }
543
- const allConditionalStyles = this.styleManager.getAllConditionalStyles();
544
- for (const style of allConditionalStyles) {
545
- if (style.areas.some((area) => area.workbookName === fromWorkbookName)) {
546
- const newStyle = {
547
- ...style,
548
- areas: style.areas.map((area) => area.workbookName === fromWorkbookName ? { ...area, workbookName: toWorkbookName } : area)
549
- };
550
- this.styleManager.addConditionalStyle(newStyle);
551
- }
552
- }
553
- const allCellStyles = this.styleManager.getAllCellStyles();
554
- for (const style of allCellStyles) {
555
- if (style.areas.some((area) => area.workbookName === fromWorkbookName)) {
556
- const newStyle = {
557
- ...style,
558
- areas: style.areas.map((area) => area.workbookName === fromWorkbookName ? { ...area, workbookName: toWorkbookName } : area)
559
- };
560
- this.styleManager.addCellStyle(newStyle);
561
- }
562
- }
563
- this.workbookManager.updateFormulasForWorkbook(toWorkbookName, (formula) => import_workbook_renamer.renameWorkbookInFormula({
564
- formula,
565
- oldWorkbookName: fromWorkbookName,
566
- newWorkbookName: toWorkbookName
567
- }));
568
- this.reevaluate();
569
- this.eventManager.emitUpdate();
412
+ this.commandExecutor.execute(new import_structure_commands.CloneWorkbookCommand(this.getStructureCommandDeps(), fromWorkbookName, toWorkbookName), { validate: !!this.apiDeclaration });
570
413
  }
571
414
  renameWorkbook(opts) {
572
- this.workbookManager.renameWorkbook(opts);
573
- this.namedExpressionManager.renameWorkbook(opts);
574
- this.tableManager.updateTablesForWorkbookRename(opts);
575
- this.styleManager.updateWorkbookName(opts.workbookName, opts.newWorkbookName);
576
- this.workbookManager.updateAllFormulas((formula) => import_workbook_renamer.renameWorkbookInFormula({
577
- formula,
578
- oldWorkbookName: opts.workbookName,
579
- newWorkbookName: opts.newWorkbookName
580
- }));
581
- this.referenceManager.updateWorkbookName(opts.workbookName, opts.newWorkbookName);
582
- this.reevaluate();
583
- this.eventManager.emitUpdate();
415
+ this.commandExecutor.execute(new import_structure_commands.RenameWorkbookCommand(this.getStructureCommandDeps(), opts.workbookName, opts.newWorkbookName), { validate: !!this.apiDeclaration });
584
416
  }
585
417
  getWorkbooks() {
586
418
  return this.workbookManager.getWorkbooks();
587
419
  }
588
420
  setSheetContent(opts, content) {
589
- this.workbookManager.setSheetContent(opts, content);
590
- this.reevaluate();
591
- this.eventManager.emitUpdate();
421
+ this.commandExecutor.execute(new import_content_commands.SetSheetContentCommand(this.workbookManager, opts, content), { validate: !!this.apiDeclaration });
592
422
  }
593
423
  setCellContent(address, content) {
594
- this.workbookManager.setCellContent(address, content);
595
- this.reevaluate();
596
- this.eventManager.emitUpdate();
597
- }
598
- reevaluate() {
599
- this.evaluationManager.clearEvaluationCache();
424
+ this.commandExecutor.execute(new import_content_commands.SetCellContentCommand(this.workbookManager, address, content), { validate: !!this.apiDeclaration });
600
425
  }
601
426
  autoFill(opts, seedRange, fillRanges, direction) {
602
- this.autoFillManager.fill(opts, seedRange, fillRanges, direction);
427
+ this.commandExecutor.execute(new import_content_commands.AutoFillCommand(this.workbookManager, this.styleManager, this.autoFillManager, opts, seedRange, fillRanges, direction), { validate: !!this.apiDeclaration });
603
428
  }
604
429
  clearSpreadsheetRange(address) {
605
- this.workbookManager.clearSpreadsheetRange(address);
606
- this.reevaluate();
607
- this.eventManager.emitUpdate();
430
+ this.commandExecutor.execute(new import_content_commands.ClearRangeCommand(this.workbookManager, address), { validate: !!this.apiDeclaration });
608
431
  }
609
432
  getState() {
610
433
  return {
@@ -655,9 +478,59 @@ class FormulaEngine {
655
478
  if (deserialized.references) {
656
479
  this.referenceManager.resetReferences(deserialized.references);
657
480
  }
658
- this.reevaluate();
481
+ this.evaluationManager.clearEvaluationCache();
659
482
  this.eventManager.emitUpdate();
660
483
  }
484
+ undo() {
485
+ return this.commandExecutor.undo();
486
+ }
487
+ redo() {
488
+ return this.commandExecutor.redo();
489
+ }
490
+ canUndo() {
491
+ return this.commandExecutor.canUndo();
492
+ }
493
+ canRedo() {
494
+ return this.commandExecutor.canRedo();
495
+ }
496
+ getActionLog() {
497
+ return this.commandExecutor.getActionLog();
498
+ }
499
+ clearActionLog() {
500
+ this.commandExecutor.clearActionLog();
501
+ }
502
+ clearHistory() {
503
+ this.commandExecutor.clearHistory();
504
+ }
505
+ getStructureCommandDeps() {
506
+ return {
507
+ workbookManager: this.workbookManager,
508
+ namedExpressionManager: this.namedExpressionManager,
509
+ tableManager: this.tableManager,
510
+ styleManager: this.styleManager,
511
+ referenceManager: this.referenceManager,
512
+ apiSchemaManager: this.apiSchemaManager,
513
+ renameSheetInFormula: import_sheet_renamer.renameSheetInFormula,
514
+ renameWorkbookInFormula: import_workbook_renamer.renameWorkbookInFormula
515
+ };
516
+ }
517
+ getTableCommandDeps() {
518
+ return {
519
+ tableManager: this.tableManager,
520
+ namedExpressionManager: this.namedExpressionManager,
521
+ workbookManager: this.workbookManager,
522
+ apiSchemaManager: this.apiSchemaManager,
523
+ getCellValue: (cell) => this.getCellValue(cell),
524
+ renameTableInFormula: import_table_renamer.renameTableInFormula
525
+ };
526
+ }
527
+ getNamedExpressionCommandDeps() {
528
+ return {
529
+ namedExpressionManager: this.namedExpressionManager,
530
+ workbookManager: this.workbookManager,
531
+ renameNamedExpressionInFormula: import_named_expression_renamer.renameNamedExpressionInFormula
532
+ };
533
+ }
661
534
  }
662
535
 
663
- //# debugId=B077CB19589FE5D864756E2164756E21
536
+ //# debugId=66643F9F298C18FE64756E2164756E21