@ricsam/formula-engine 0.0.17 → 0.0.18

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 (101) 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/index.cjs +95 -0
  18. package/dist/cjs/core/commands/index.cjs.map +10 -0
  19. package/dist/cjs/core/commands/metadata-commands.cjs +150 -0
  20. package/dist/cjs/core/commands/metadata-commands.cjs.map +10 -0
  21. package/dist/cjs/core/commands/named-expression-commands.cjs +238 -0
  22. package/dist/cjs/core/commands/named-expression-commands.cjs.map +10 -0
  23. package/dist/cjs/core/commands/structure-commands.cjs +495 -0
  24. package/dist/cjs/core/commands/structure-commands.cjs.map +10 -0
  25. package/dist/cjs/core/commands/style-commands.cjs +219 -0
  26. package/dist/cjs/core/commands/style-commands.cjs.map +10 -0
  27. package/dist/cjs/core/commands/table-commands.cjs +226 -0
  28. package/dist/cjs/core/commands/table-commands.cjs.map +10 -0
  29. package/dist/cjs/core/commands/types.cjs +72 -0
  30. package/dist/cjs/core/commands/types.cjs.map +10 -0
  31. package/dist/cjs/core/engine.cjs +159 -296
  32. package/dist/cjs/core/engine.cjs.map +3 -3
  33. package/dist/cjs/core/managers/api-schema-manager.cjs +304 -0
  34. package/dist/cjs/core/managers/api-schema-manager.cjs.map +10 -0
  35. package/dist/cjs/core/managers/copy-manager.cjs +1 -2
  36. package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
  37. package/dist/cjs/core/types.cjs.map +2 -2
  38. package/dist/cjs/lib.cjs +13 -2
  39. package/dist/cjs/lib.cjs.map +3 -3
  40. package/dist/cjs/package.json +1 -1
  41. package/dist/mjs/core/api/api-builder.mjs +37 -0
  42. package/dist/mjs/core/api/api-builder.mjs.map +10 -0
  43. package/dist/mjs/core/api/api-helpers.mjs +161 -0
  44. package/dist/mjs/core/api/api-helpers.mjs.map +10 -0
  45. package/dist/mjs/core/api/api.mjs +35 -0
  46. package/dist/mjs/core/api/api.mjs.map +10 -0
  47. package/dist/mjs/core/api/cell-orm.mjs +49 -0
  48. package/dist/mjs/core/api/cell-orm.mjs.map +10 -0
  49. package/dist/mjs/core/api/table-orm.mjs +148 -0
  50. package/dist/mjs/core/api/table-orm.mjs.map +10 -0
  51. package/dist/mjs/core/autofill-utils.mjs +3 -5
  52. package/dist/mjs/core/autofill-utils.mjs.map +3 -3
  53. package/dist/mjs/core/commands/command-executor.mjs +109 -0
  54. package/dist/mjs/core/commands/command-executor.mjs.map +10 -0
  55. package/dist/mjs/core/commands/content-commands.mjs +544 -0
  56. package/dist/mjs/core/commands/content-commands.mjs.map +10 -0
  57. package/dist/mjs/core/commands/index.mjs +87 -0
  58. package/dist/mjs/core/commands/index.mjs.map +10 -0
  59. package/dist/mjs/core/commands/metadata-commands.mjs +120 -0
  60. package/dist/mjs/core/commands/metadata-commands.mjs.map +10 -0
  61. package/dist/mjs/core/commands/named-expression-commands.mjs +208 -0
  62. package/dist/mjs/core/commands/named-expression-commands.mjs.map +10 -0
  63. package/dist/mjs/core/commands/structure-commands.mjs +465 -0
  64. package/dist/mjs/core/commands/structure-commands.mjs.map +10 -0
  65. package/dist/mjs/core/commands/style-commands.mjs +189 -0
  66. package/dist/mjs/core/commands/style-commands.mjs.map +10 -0
  67. package/dist/mjs/core/commands/table-commands.mjs +196 -0
  68. package/dist/mjs/core/commands/table-commands.mjs.map +10 -0
  69. package/dist/mjs/core/commands/types.mjs +42 -0
  70. package/dist/mjs/core/commands/types.mjs.map +10 -0
  71. package/dist/mjs/core/engine.mjs +194 -296
  72. package/dist/mjs/core/engine.mjs.map +3 -3
  73. package/dist/mjs/core/managers/api-schema-manager.mjs +274 -0
  74. package/dist/mjs/core/managers/api-schema-manager.mjs.map +10 -0
  75. package/dist/mjs/core/managers/copy-manager.mjs +1 -2
  76. package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
  77. package/dist/mjs/core/types.mjs.map +2 -2
  78. package/dist/mjs/lib.mjs +13 -2
  79. package/dist/mjs/lib.mjs.map +3 -3
  80. package/dist/mjs/package.json +1 -1
  81. package/dist/types/core/api/api-builder.d.ts +16 -0
  82. package/dist/types/core/api/api-helpers.d.ts +37 -0
  83. package/dist/types/core/api/api.d.ts +83 -0
  84. package/dist/types/core/api/api.type-test.d.ts +1 -0
  85. package/dist/types/core/api/cell-orm.d.ts +29 -0
  86. package/dist/types/core/api/table-orm.d.ts +46 -0
  87. package/dist/types/core/autofill-utils.d.ts +2 -9
  88. package/dist/types/core/commands/command-executor.d.ts +83 -0
  89. package/dist/types/core/commands/content-commands.d.ts +142 -0
  90. package/dist/types/core/commands/index.d.ts +16 -0
  91. package/dist/types/core/commands/metadata-commands.d.ts +55 -0
  92. package/dist/types/core/commands/named-expression-commands.d.ts +115 -0
  93. package/dist/types/core/commands/structure-commands.d.ts +132 -0
  94. package/dist/types/core/commands/style-commands.d.ts +76 -0
  95. package/dist/types/core/commands/table-commands.d.ts +104 -0
  96. package/dist/types/core/commands/types.d.ts +114 -0
  97. package/dist/types/core/engine.d.ts +130 -26
  98. package/dist/types/core/managers/api-schema-manager.d.ts +121 -0
  99. package/dist/types/core/types.d.ts +1 -1
  100. package/dist/types/lib.d.ts +8 -0
  101. package/package.json +1 -1
@@ -49,6 +49,9 @@ 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_commands = require("./commands.cjs");
52
55
 
53
56
  class FormulaEngine {
54
57
  workbookManager;
@@ -61,6 +64,10 @@ class FormulaEngine {
61
64
  styleManager;
62
65
  copyManager;
63
66
  referenceManager;
67
+ apiSchemaManager;
68
+ commandExecutor;
69
+ api;
70
+ apiDeclaration;
64
71
  _workbookManager;
65
72
  _namedExpressionManager;
66
73
  _tableManager;
@@ -69,7 +76,8 @@ class FormulaEngine {
69
76
  _autoFillManager;
70
77
  _dependencyManager;
71
78
  _styleManager;
72
- constructor() {
79
+ constructor(api) {
80
+ this.apiDeclaration = api?.declaration;
73
81
  this.eventManager = new import_event_manager.EventManager;
74
82
  this.workbookManager = new import_workbook_manager.WorkbookManager;
75
83
  this.namedExpressionManager = new import_named_expression_manager.NamedExpressionManager;
@@ -80,8 +88,15 @@ class FormulaEngine {
80
88
  this.evaluationManager = new import_evaluation_manager.EvaluationManager(this.workbookManager, this.tableManager, formulaEvaluator, this.dependencyManager);
81
89
  this.styleManager = new import_style_manager.StyleManager(this.evaluationManager);
82
90
  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);
91
+ this.autoFillManager = new import_autofill_utils.AutoFill(this.workbookManager, this.styleManager);
84
92
  this.referenceManager = new import_reference_manager.ReferenceManager;
93
+ this.apiSchemaManager = new import_api_schema_manager.ApiSchemaManager(this.tableManager);
94
+ this.commandExecutor = new import_commands.CommandExecutor(this.apiDeclaration, this.evaluationManager, this.eventManager, () => this.apiSchemaManager.validateAllSchemaConstraints((cell) => this.getCellValue(cell), (cell) => this.getCellMetadata(cell), (table) => this.getTableDataCells(table)));
95
+ if (this.apiDeclaration) {
96
+ this.api = import_api_builder.buildApiFromDeclaration(this, this.apiDeclaration, this.apiSchemaManager);
97
+ } else {
98
+ this.api = undefined;
99
+ }
85
100
  this._workbookManager = this.workbookManager;
86
101
  this._namedExpressionManager = this.namedExpressionManager;
87
102
  this._tableManager = this.tableManager;
@@ -91,8 +106,8 @@ class FormulaEngine {
91
106
  this._dependencyManager = this.dependencyManager;
92
107
  this._styleManager = this.styleManager;
93
108
  }
94
- static buildEmpty() {
95
- return new FormulaEngine;
109
+ static buildEmpty(api) {
110
+ return new FormulaEngine(api);
96
111
  }
97
112
  getCellEvaluationResult(cellAddress) {
98
113
  return this.evaluationManager.getCellEvaluationResult(cellAddress);
@@ -105,25 +120,23 @@ class FormulaEngine {
105
120
  return this.evaluationManager.evaluationResultToSerializedValue(result, cellAddress, debug);
106
121
  }
107
122
  setCellMetadata(address, metadata) {
108
- this.workbookManager.setCellMetadata(address, metadata);
109
- this.eventManager.emitUpdate();
123
+ this.commandExecutor.execute(new import_commands.SetCellMetadataCommand(this.workbookManager, address, metadata));
110
124
  }
111
125
  getCellMetadata(address) {
112
- return this.workbookManager.getCellMetadata(address);
126
+ const metadata = this.workbookManager.getCellMetadata(address);
127
+ return metadata;
113
128
  }
114
129
  getSheetMetadataSerialized(opts) {
115
130
  return this.workbookManager.getSheetMetadataSerialized(opts);
116
131
  }
117
132
  setSheetMetadata(opts, metadata) {
118
- this.workbookManager.setSheetMetadata(opts, metadata);
119
- this.eventManager.emitUpdate();
133
+ this.commandExecutor.execute(new import_commands.SetSheetMetadataCommand(this.workbookManager, opts, metadata));
120
134
  }
121
135
  getSheetMetadata(opts) {
122
136
  return this.workbookManager.getSheetMetadata(opts);
123
137
  }
124
138
  setWorkbookMetadata(workbookName, metadata) {
125
- this.workbookManager.setWorkbookMetadata(workbookName, metadata);
126
- this.eventManager.emitUpdate();
139
+ this.commandExecutor.execute(new import_commands.SetWorkbookMetadataCommand(this.workbookManager, workbookName, metadata));
127
140
  }
128
141
  getWorkbookMetadata(workbookName) {
129
142
  return this.workbookManager.getWorkbookMetadata(workbookName);
@@ -149,111 +162,54 @@ class FormulaEngine {
149
162
  getCellPrecedents(address) {
150
163
  throw new Error("Not implemented");
151
164
  }
152
- addNamedExpression({
153
- expression,
154
- expressionName,
155
- sheetName,
156
- workbookName
157
- }) {
158
- this.namedExpressionManager.addNamedExpression({
159
- expression,
160
- expressionName,
161
- sheetName,
162
- workbookName
163
- });
164
- this.reevaluate();
165
- this.eventManager.emitUpdate();
165
+ addNamedExpression(opts) {
166
+ this.commandExecutor.execute(new import_commands.AddNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
166
167
  }
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;
168
+ removeNamedExpression(opts) {
169
+ this.commandExecutor.execute(new import_commands.RemoveNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
182
170
  }
183
- updateNamedExpression({
184
- expression,
185
- expressionName,
186
- sheetName,
187
- workbookName
188
- }) {
189
- this.namedExpressionManager.updateNamedExpression({
190
- expression,
191
- expressionName,
192
- sheetName,
193
- workbookName
171
+ hasNamedExpression(opts) {
172
+ const scope = opts.sheetName && opts.workbookName ? { type: "sheet", workbookName: opts.workbookName, sheetName: opts.sheetName } : opts.workbookName ? { type: "workbook", workbookName: opts.workbookName } : { type: "global" };
173
+ return !!this.namedExpressionManager.getNamedExpression({
174
+ name: opts.expressionName,
175
+ scope
194
176
  });
195
- this.reevaluate();
196
- this.eventManager.emitUpdate();
197
177
  }
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;
178
+ updateNamedExpression(opts) {
179
+ this.commandExecutor.execute(new import_commands.UpdateNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
180
+ }
181
+ renameNamedExpression(opts) {
182
+ this.commandExecutor.execute(new import_commands.RenameNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
215
183
  }
216
184
  setNamedExpressions(opts) {
217
- this.namedExpressionManager.setNamedExpressions(opts);
218
- this.reevaluate();
219
- this.eventManager.emitUpdate();
185
+ this.commandExecutor.execute(new import_commands.SetNamedExpressionsCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
220
186
  }
221
187
  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;
188
+ this.commandExecutor.execute(new import_commands.AddTableCommand(this.getTableCommandDeps(), props), { validate: !!this.apiDeclaration });
229
189
  }
230
190
  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();
191
+ this.commandExecutor.execute(new import_commands.RenameTableCommand(this.getTableCommandDeps(), workbookName, names.oldName, names.newName), { validate: !!this.apiDeclaration });
236
192
  }
237
193
  updateTable(opts) {
238
- this.tableManager.updateTable({
239
- ...opts,
240
- getCellValue: (cellAddress) => this.getCellValue(cellAddress)
241
- });
242
- this.reevaluate();
243
- this.eventManager.emitUpdate();
194
+ this.commandExecutor.execute(new import_commands.UpdateTableCommand(this.getTableCommandDeps(), opts), { validate: !!this.apiDeclaration });
244
195
  }
245
196
  removeTable(opts) {
246
- const found = this.tableManager.removeTable(opts);
247
- if (found) {
248
- this.reevaluate();
249
- this.eventManager.emitUpdate();
250
- }
251
- return found;
197
+ this.commandExecutor.execute(new import_commands.RemoveTableCommand(this.getTableCommandDeps(), opts), { validate: !!this.apiDeclaration });
198
+ }
199
+ hasTable(opts) {
200
+ return !!this.tableManager.getTable({
201
+ workbookName: opts.workbookName,
202
+ name: opts.tableName
203
+ });
204
+ }
205
+ getTable(opts) {
206
+ return this.tableManager.getTable({
207
+ workbookName: opts.workbookName,
208
+ name: opts.tableName
209
+ });
252
210
  }
253
211
  resetTables(tables) {
254
- this.tableManager.resetTables(tables);
255
- this.reevaluate();
256
- this.eventManager.emitUpdate();
212
+ this.commandExecutor.execute(new import_commands.ResetTablesCommand(this.getTableCommandDeps(), tables), { validate: !!this.apiDeclaration });
257
213
  }
258
214
  getTables(workbookName) {
259
215
  return this.tableManager.getTables(workbookName);
@@ -261,16 +217,32 @@ class FormulaEngine {
261
217
  isCellInTable(cellAddress) {
262
218
  return this.tableManager.isCellInTable(cellAddress);
263
219
  }
220
+ getTableDataCells(table) {
221
+ const { start, endRow, headers } = table;
222
+ const dataStartRow = start.rowIndex + 1;
223
+ const endColIndex = start.colIndex + headers.size - 1;
224
+ const rangeAddress = {
225
+ workbookName: table.workbookName,
226
+ sheetName: table.sheetName,
227
+ range: {
228
+ start: { col: start.colIndex, row: dataStartRow },
229
+ end: {
230
+ col: { type: "number", value: endColIndex },
231
+ row: endRow
232
+ }
233
+ }
234
+ };
235
+ return this.workbookManager.getCellsInRange(rangeAddress);
236
+ }
264
237
  addConditionalStyle(style) {
265
- this.styleManager.addConditionalStyle(style);
266
- this.eventManager.emitUpdate();
238
+ this.commandExecutor.execute(new import_commands.AddConditionalStyleCommand(this.styleManager, style));
267
239
  }
268
240
  removeConditionalStyle(workbookName, index) {
269
- const removed = this.styleManager.removeConditionalStyle(workbookName, index);
270
- if (removed) {
271
- this.eventManager.emitUpdate();
272
- }
273
- return removed;
241
+ this.commandExecutor.execute(new import_commands.RemoveConditionalStyleCommand(this.styleManager, workbookName, index));
242
+ }
243
+ getConditionalStyleCount(workbookName) {
244
+ const allStyles = this.styleManager.getAllConditionalStyles();
245
+ return allStyles.filter((s) => s.areas.some((a) => a.workbookName === workbookName)).length;
274
246
  }
275
247
  getConditionalStylesIntersectingWithRange(range) {
276
248
  return this.styleManager.getConditionalStylesIntersectingWithRange(range);
@@ -285,15 +257,14 @@ class FormulaEngine {
285
257
  return this.styleManager.getAllConditionalStyles();
286
258
  }
287
259
  addCellStyle(style) {
288
- this.styleManager.addCellStyle(style);
289
- this.eventManager.emitUpdate();
260
+ this.commandExecutor.execute(new import_commands.AddCellStyleCommand(this.styleManager, style));
290
261
  }
291
262
  removeCellStyle(workbookName, index) {
292
- const removed = this.styleManager.removeCellStyle(workbookName, index);
293
- if (removed) {
294
- this.eventManager.emitUpdate();
295
- }
296
- return removed;
263
+ this.commandExecutor.execute(new import_commands.RemoveCellStyleCommand(this.styleManager, workbookName, index));
264
+ }
265
+ getCellStyleCount(workbookName) {
266
+ const allStyles = this.styleManager.getAllCellStyles();
267
+ return allStyles.filter((s) => s.areas.some((a) => a.workbookName === workbookName)).length;
297
268
  }
298
269
  getStylesIntersectingWithRange(range) {
299
270
  return this.styleManager.getStylesIntersectingWithRange(range);
@@ -302,18 +273,13 @@ class FormulaEngine {
302
273
  return this.styleManager.getStyleForRange(range);
303
274
  }
304
275
  clearCellStyles(range) {
305
- this.styleManager.clearCellStyles(range);
306
- this.eventManager.emitUpdate();
276
+ this.commandExecutor.execute(new import_commands.ClearCellStylesCommand(this.styleManager, range));
307
277
  }
308
278
  pasteCells(source, target, options) {
309
- this.copyManager.pasteCells(source, target, options);
310
- this.reevaluate();
311
- this.eventManager.emitUpdate();
279
+ this.commandExecutor.execute(new import_commands.PasteCellsCommand(this.workbookManager, this.copyManager, source, target, options), { validate: !!this.apiDeclaration });
312
280
  }
313
281
  fillAreas(seedRange, targetRanges, options) {
314
- this.copyManager.fillAreas(seedRange, targetRanges, options);
315
- this.reevaluate();
316
- this.eventManager.emitUpdate();
282
+ this.commandExecutor.execute(new import_commands.FillAreasCommand(this.workbookManager, this.copyManager, seedRange, targetRanges, options), { validate: !!this.apiDeclaration });
317
283
  }
318
284
  smartPaste(sourceCells, pasteSelection, options) {
319
285
  if (sourceCells.length === 0) {
@@ -394,55 +360,22 @@ class FormulaEngine {
394
360
  return { minCol, minRow, maxCol, maxRow };
395
361
  }
396
362
  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();
363
+ this.commandExecutor.execute(new import_commands.MoveCellCommand(this.workbookManager, this.copyManager, source, target), { validate: !!this.apiDeclaration });
404
364
  }
405
365
  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();
366
+ this.commandExecutor.execute(new import_commands.MoveRangeCommand(this.workbookManager, this.copyManager, sourceRange, target), { validate: !!this.apiDeclaration });
414
367
  }
415
368
  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;
369
+ this.commandExecutor.execute(new import_commands.AddSheetCommand(this.getStructureCommandDeps(), opts), { validate: !!this.apiDeclaration });
421
370
  }
422
371
  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;
372
+ this.commandExecutor.execute(new import_commands.RemoveSheetCommand(this.getStructureCommandDeps(), opts), { validate: !!this.apiDeclaration });
431
373
  }
432
374
  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;
375
+ this.commandExecutor.execute(new import_commands.RenameSheetCommand(this.getStructureCommandDeps(), opts), { validate: !!this.apiDeclaration });
376
+ }
377
+ hasSheet(opts) {
378
+ return !!this.workbookManager.getSheet(opts);
446
379
  }
447
380
  getSheets(workbookName) {
448
381
  return this.workbookManager.getSheets(workbookName);
@@ -457,154 +390,34 @@ class FormulaEngine {
457
390
  return this.workbookManager.getSheetSerialized(opts);
458
391
  }
459
392
  addWorkbook(workbookName) {
460
- this.workbookManager.addWorkbook(workbookName);
461
- this.namedExpressionManager.addWorkbook(workbookName);
462
- this.tableManager.addWorkbook(workbookName);
463
- this.reevaluate();
464
- this.eventManager.emitUpdate();
393
+ this.commandExecutor.execute(new import_commands.AddWorkbookCommand(this.getStructureCommandDeps(), workbookName), { validate: !!this.apiDeclaration });
465
394
  }
466
395
  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();
396
+ this.commandExecutor.execute(new import_commands.RemoveWorkbookCommand(this.getStructureCommandDeps(), workbookName), { validate: !!this.apiDeclaration });
397
+ }
398
+ hasWorkbook(workbookName) {
399
+ return this.workbookManager.getWorkbooks().has(workbookName);
474
400
  }
475
401
  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();
402
+ this.commandExecutor.execute(new import_commands.CloneWorkbookCommand(this.getStructureCommandDeps(), fromWorkbookName, toWorkbookName), { validate: !!this.apiDeclaration });
570
403
  }
571
404
  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();
405
+ this.commandExecutor.execute(new import_commands.RenameWorkbookCommand(this.getStructureCommandDeps(), opts.workbookName, opts.newWorkbookName), { validate: !!this.apiDeclaration });
584
406
  }
585
407
  getWorkbooks() {
586
408
  return this.workbookManager.getWorkbooks();
587
409
  }
588
410
  setSheetContent(opts, content) {
589
- this.workbookManager.setSheetContent(opts, content);
590
- this.reevaluate();
591
- this.eventManager.emitUpdate();
411
+ this.commandExecutor.execute(new import_commands.SetSheetContentCommand(this.workbookManager, opts, content), { validate: !!this.apiDeclaration });
592
412
  }
593
413
  setCellContent(address, content) {
594
- this.workbookManager.setCellContent(address, content);
595
- this.reevaluate();
596
- this.eventManager.emitUpdate();
597
- }
598
- reevaluate() {
599
- this.evaluationManager.clearEvaluationCache();
414
+ this.commandExecutor.execute(new import_commands.SetCellContentCommand(this.workbookManager, address, content), { validate: !!this.apiDeclaration });
600
415
  }
601
416
  autoFill(opts, seedRange, fillRanges, direction) {
602
- this.autoFillManager.fill(opts, seedRange, fillRanges, direction);
417
+ this.commandExecutor.execute(new import_commands.AutoFillCommand(this.workbookManager, this.styleManager, this.autoFillManager, opts, seedRange, fillRanges, direction), { validate: !!this.apiDeclaration });
603
418
  }
604
419
  clearSpreadsheetRange(address) {
605
- this.workbookManager.clearSpreadsheetRange(address);
606
- this.reevaluate();
607
- this.eventManager.emitUpdate();
420
+ this.commandExecutor.execute(new import_commands.ClearRangeCommand(this.workbookManager, address), { validate: !!this.apiDeclaration });
608
421
  }
609
422
  getState() {
610
423
  return {
@@ -655,9 +468,59 @@ class FormulaEngine {
655
468
  if (deserialized.references) {
656
469
  this.referenceManager.resetReferences(deserialized.references);
657
470
  }
658
- this.reevaluate();
471
+ this.evaluationManager.clearEvaluationCache();
659
472
  this.eventManager.emitUpdate();
660
473
  }
474
+ undo() {
475
+ return this.commandExecutor.undo();
476
+ }
477
+ redo() {
478
+ return this.commandExecutor.redo();
479
+ }
480
+ canUndo() {
481
+ return this.commandExecutor.canUndo();
482
+ }
483
+ canRedo() {
484
+ return this.commandExecutor.canRedo();
485
+ }
486
+ getActionLog() {
487
+ return this.commandExecutor.getActionLog();
488
+ }
489
+ clearActionLog() {
490
+ this.commandExecutor.clearActionLog();
491
+ }
492
+ clearHistory() {
493
+ this.commandExecutor.clearHistory();
494
+ }
495
+ getStructureCommandDeps() {
496
+ return {
497
+ workbookManager: this.workbookManager,
498
+ namedExpressionManager: this.namedExpressionManager,
499
+ tableManager: this.tableManager,
500
+ styleManager: this.styleManager,
501
+ referenceManager: this.referenceManager,
502
+ apiSchemaManager: this.apiSchemaManager,
503
+ renameSheetInFormula: import_sheet_renamer.renameSheetInFormula,
504
+ renameWorkbookInFormula: import_workbook_renamer.renameWorkbookInFormula
505
+ };
506
+ }
507
+ getTableCommandDeps() {
508
+ return {
509
+ tableManager: this.tableManager,
510
+ namedExpressionManager: this.namedExpressionManager,
511
+ workbookManager: this.workbookManager,
512
+ apiSchemaManager: this.apiSchemaManager,
513
+ getCellValue: (cell) => this.getCellValue(cell),
514
+ renameTableInFormula: import_table_renamer.renameTableInFormula
515
+ };
516
+ }
517
+ getNamedExpressionCommandDeps() {
518
+ return {
519
+ namedExpressionManager: this.namedExpressionManager,
520
+ workbookManager: this.workbookManager,
521
+ renameNamedExpressionInFormula: import_named_expression_renamer.renameNamedExpressionInFormula
522
+ };
523
+ }
661
524
  }
662
525
 
663
- //# debugId=B077CB19589FE5D864756E2164756E21
526
+ //# debugId=3DF704CC89CB006E64756E2164756E21