@ricsam/formula-engine 0.0.16 → 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 (122) 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 +75 -39
  12. package/dist/cjs/core/autofill-utils.cjs.map +3 -3
  13. package/dist/cjs/core/cell-mover.cjs +178 -0
  14. package/dist/cjs/core/cell-mover.cjs.map +10 -0
  15. package/dist/cjs/core/commands/command-executor.cjs +140 -0
  16. package/dist/cjs/core/commands/command-executor.cjs.map +10 -0
  17. package/dist/cjs/core/commands/content-commands.cjs +574 -0
  18. package/dist/cjs/core/commands/content-commands.cjs.map +10 -0
  19. package/dist/cjs/core/commands/index.cjs +95 -0
  20. package/dist/cjs/core/commands/index.cjs.map +10 -0
  21. package/dist/cjs/core/commands/metadata-commands.cjs +150 -0
  22. package/dist/cjs/core/commands/metadata-commands.cjs.map +10 -0
  23. package/dist/cjs/core/commands/named-expression-commands.cjs +238 -0
  24. package/dist/cjs/core/commands/named-expression-commands.cjs.map +10 -0
  25. package/dist/cjs/core/commands/structure-commands.cjs +495 -0
  26. package/dist/cjs/core/commands/structure-commands.cjs.map +10 -0
  27. package/dist/cjs/core/commands/style-commands.cjs +219 -0
  28. package/dist/cjs/core/commands/style-commands.cjs.map +10 -0
  29. package/dist/cjs/core/commands/table-commands.cjs +226 -0
  30. package/dist/cjs/core/commands/table-commands.cjs.map +10 -0
  31. package/dist/cjs/core/commands/types.cjs +72 -0
  32. package/dist/cjs/core/commands/types.cjs.map +10 -0
  33. package/dist/cjs/core/engine.cjs +218 -263
  34. package/dist/cjs/core/engine.cjs.map +3 -3
  35. package/dist/cjs/core/managers/api-schema-manager.cjs +304 -0
  36. package/dist/cjs/core/managers/api-schema-manager.cjs.map +10 -0
  37. package/dist/cjs/core/managers/copy-manager.cjs +336 -82
  38. package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
  39. package/dist/cjs/core/managers/reference-manager.cjs +124 -0
  40. package/dist/cjs/core/managers/reference-manager.cjs.map +10 -0
  41. package/dist/cjs/core/managers/style-manager.cjs +115 -147
  42. package/dist/cjs/core/managers/style-manager.cjs.map +3 -3
  43. package/dist/cjs/core/managers/workbook-manager.cjs +87 -3
  44. package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
  45. package/dist/cjs/core/types.cjs.map +1 -1
  46. package/dist/cjs/lib.cjs +13 -2
  47. package/dist/cjs/lib.cjs.map +3 -3
  48. package/dist/cjs/package.json +1 -1
  49. package/dist/mjs/core/api/api-builder.mjs +37 -0
  50. package/dist/mjs/core/api/api-builder.mjs.map +10 -0
  51. package/dist/mjs/core/api/api-helpers.mjs +161 -0
  52. package/dist/mjs/core/api/api-helpers.mjs.map +10 -0
  53. package/dist/mjs/core/api/api.mjs +35 -0
  54. package/dist/mjs/core/api/api.mjs.map +10 -0
  55. package/dist/mjs/core/api/cell-orm.mjs +49 -0
  56. package/dist/mjs/core/api/cell-orm.mjs.map +10 -0
  57. package/dist/mjs/core/api/table-orm.mjs +148 -0
  58. package/dist/mjs/core/api/table-orm.mjs.map +10 -0
  59. package/dist/mjs/core/autofill-utils.mjs +75 -39
  60. package/dist/mjs/core/autofill-utils.mjs.map +3 -3
  61. package/dist/mjs/core/cell-mover.mjs +148 -0
  62. package/dist/mjs/core/cell-mover.mjs.map +10 -0
  63. package/dist/mjs/core/commands/command-executor.mjs +109 -0
  64. package/dist/mjs/core/commands/command-executor.mjs.map +10 -0
  65. package/dist/mjs/core/commands/content-commands.mjs +544 -0
  66. package/dist/mjs/core/commands/content-commands.mjs.map +10 -0
  67. package/dist/mjs/core/commands/index.mjs +87 -0
  68. package/dist/mjs/core/commands/index.mjs.map +10 -0
  69. package/dist/mjs/core/commands/metadata-commands.mjs +120 -0
  70. package/dist/mjs/core/commands/metadata-commands.mjs.map +10 -0
  71. package/dist/mjs/core/commands/named-expression-commands.mjs +208 -0
  72. package/dist/mjs/core/commands/named-expression-commands.mjs.map +10 -0
  73. package/dist/mjs/core/commands/structure-commands.mjs +465 -0
  74. package/dist/mjs/core/commands/structure-commands.mjs.map +10 -0
  75. package/dist/mjs/core/commands/style-commands.mjs +189 -0
  76. package/dist/mjs/core/commands/style-commands.mjs.map +10 -0
  77. package/dist/mjs/core/commands/table-commands.mjs +196 -0
  78. package/dist/mjs/core/commands/table-commands.mjs.map +10 -0
  79. package/dist/mjs/core/commands/types.mjs +42 -0
  80. package/dist/mjs/core/commands/types.mjs.map +10 -0
  81. package/dist/mjs/core/engine.mjs +253 -263
  82. package/dist/mjs/core/engine.mjs.map +3 -3
  83. package/dist/mjs/core/managers/api-schema-manager.mjs +274 -0
  84. package/dist/mjs/core/managers/api-schema-manager.mjs.map +10 -0
  85. package/dist/mjs/core/managers/copy-manager.mjs +338 -82
  86. package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
  87. package/dist/mjs/core/managers/reference-manager.mjs +93 -0
  88. package/dist/mjs/core/managers/reference-manager.mjs.map +10 -0
  89. package/dist/mjs/core/managers/style-manager.mjs +115 -147
  90. package/dist/mjs/core/managers/style-manager.mjs.map +3 -3
  91. package/dist/mjs/core/managers/workbook-manager.mjs +87 -3
  92. package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
  93. package/dist/mjs/core/types.mjs.map +1 -1
  94. package/dist/mjs/lib.mjs +13 -2
  95. package/dist/mjs/lib.mjs.map +3 -3
  96. package/dist/mjs/package.json +1 -1
  97. package/dist/types/core/api/api-builder.d.ts +16 -0
  98. package/dist/types/core/api/api-helpers.d.ts +37 -0
  99. package/dist/types/core/api/api.d.ts +83 -0
  100. package/dist/types/core/api/api.type-test.d.ts +1 -0
  101. package/dist/types/core/api/cell-orm.d.ts +29 -0
  102. package/dist/types/core/api/table-orm.d.ts +46 -0
  103. package/dist/types/core/autofill-utils.d.ts +6 -9
  104. package/dist/types/core/cell-mover.d.ts +63 -0
  105. package/dist/types/core/commands/command-executor.d.ts +83 -0
  106. package/dist/types/core/commands/content-commands.d.ts +142 -0
  107. package/dist/types/core/commands/index.d.ts +16 -0
  108. package/dist/types/core/commands/metadata-commands.d.ts +55 -0
  109. package/dist/types/core/commands/named-expression-commands.d.ts +115 -0
  110. package/dist/types/core/commands/structure-commands.d.ts +132 -0
  111. package/dist/types/core/commands/style-commands.d.ts +76 -0
  112. package/dist/types/core/commands/table-commands.d.ts +104 -0
  113. package/dist/types/core/commands/types.d.ts +114 -0
  114. package/dist/types/core/engine.d.ts +241 -23
  115. package/dist/types/core/managers/api-schema-manager.d.ts +121 -0
  116. package/dist/types/core/managers/copy-manager.d.ts +47 -2
  117. package/dist/types/core/managers/reference-manager.d.ts +54 -0
  118. package/dist/types/core/managers/style-manager.d.ts +6 -6
  119. package/dist/types/core/managers/workbook-manager.d.ts +39 -1
  120. package/dist/types/core/types.d.ts +52 -11
  121. package/dist/types/lib.d.ts +8 -0
  122. package/package.json +1 -1
@@ -48,6 +48,10 @@ var import_evaluation_manager = require("./managers/evaluation-manager.cjs");
48
48
  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
+ 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");
51
55
 
52
56
  class FormulaEngine {
53
57
  workbookManager;
@@ -59,6 +63,11 @@ class FormulaEngine {
59
63
  dependencyManager;
60
64
  styleManager;
61
65
  copyManager;
66
+ referenceManager;
67
+ apiSchemaManager;
68
+ commandExecutor;
69
+ api;
70
+ apiDeclaration;
62
71
  _workbookManager;
63
72
  _namedExpressionManager;
64
73
  _tableManager;
@@ -67,7 +76,8 @@ class FormulaEngine {
67
76
  _autoFillManager;
68
77
  _dependencyManager;
69
78
  _styleManager;
70
- constructor() {
79
+ constructor(api) {
80
+ this.apiDeclaration = api?.declaration;
71
81
  this.eventManager = new import_event_manager.EventManager;
72
82
  this.workbookManager = new import_workbook_manager.WorkbookManager;
73
83
  this.namedExpressionManager = new import_named_expression_manager.NamedExpressionManager;
@@ -78,7 +88,15 @@ class FormulaEngine {
78
88
  this.evaluationManager = new import_evaluation_manager.EvaluationManager(this.workbookManager, this.tableManager, formulaEvaluator, this.dependencyManager);
79
89
  this.styleManager = new import_style_manager.StyleManager(this.evaluationManager);
80
90
  this.copyManager = new import_copy_manager.CopyManager(this.workbookManager, this.evaluationManager, this.styleManager);
81
- this.autoFillManager = new import_autofill_utils.AutoFill(this.workbookManager, this.styleManager, this);
91
+ this.autoFillManager = new import_autofill_utils.AutoFill(this.workbookManager, this.styleManager);
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
+ }
82
100
  this._workbookManager = this.workbookManager;
83
101
  this._namedExpressionManager = this.namedExpressionManager;
84
102
  this._tableManager = this.tableManager;
@@ -88,8 +106,8 @@ class FormulaEngine {
88
106
  this._dependencyManager = this.dependencyManager;
89
107
  this._styleManager = this.styleManager;
90
108
  }
91
- static buildEmpty() {
92
- return new FormulaEngine;
109
+ static buildEmpty(api) {
110
+ return new FormulaEngine(api);
93
111
  }
94
112
  getCellEvaluationResult(cellAddress) {
95
113
  return this.evaluationManager.getCellEvaluationResult(cellAddress);
@@ -101,6 +119,40 @@ class FormulaEngine {
101
119
  }
102
120
  return this.evaluationManager.evaluationResultToSerializedValue(result, cellAddress, debug);
103
121
  }
122
+ setCellMetadata(address, metadata) {
123
+ this.commandExecutor.execute(new import_commands.SetCellMetadataCommand(this.workbookManager, address, metadata));
124
+ }
125
+ getCellMetadata(address) {
126
+ const metadata = this.workbookManager.getCellMetadata(address);
127
+ return metadata;
128
+ }
129
+ getSheetMetadataSerialized(opts) {
130
+ return this.workbookManager.getSheetMetadataSerialized(opts);
131
+ }
132
+ setSheetMetadata(opts, metadata) {
133
+ this.commandExecutor.execute(new import_commands.SetSheetMetadataCommand(this.workbookManager, opts, metadata));
134
+ }
135
+ getSheetMetadata(opts) {
136
+ return this.workbookManager.getSheetMetadata(opts);
137
+ }
138
+ setWorkbookMetadata(workbookName, metadata) {
139
+ this.commandExecutor.execute(new import_commands.SetWorkbookMetadataCommand(this.workbookManager, workbookName, metadata));
140
+ }
141
+ getWorkbookMetadata(workbookName) {
142
+ return this.workbookManager.getWorkbookMetadata(workbookName);
143
+ }
144
+ createRef(address) {
145
+ return this.referenceManager.createRef(address);
146
+ }
147
+ getRefAddress(refId) {
148
+ return this.referenceManager.getRefAddress(refId);
149
+ }
150
+ deleteRef(refId) {
151
+ return this.referenceManager.deleteRef(refId);
152
+ }
153
+ getInvalidRefs() {
154
+ return this.referenceManager.getInvalidRefs();
155
+ }
104
156
  evaluateFormula(formula, cellAddress) {
105
157
  return this.evaluationManager.evaluateFormula(formula, cellAddress);
106
158
  }
@@ -110,111 +162,54 @@ class FormulaEngine {
110
162
  getCellPrecedents(address) {
111
163
  throw new Error("Not implemented");
112
164
  }
113
- addNamedExpression({
114
- expression,
115
- expressionName,
116
- sheetName,
117
- workbookName
118
- }) {
119
- this.namedExpressionManager.addNamedExpression({
120
- expression,
121
- expressionName,
122
- sheetName,
123
- workbookName
124
- });
125
- this.reevaluate();
126
- this.eventManager.emitUpdate();
165
+ addNamedExpression(opts) {
166
+ this.commandExecutor.execute(new import_commands.AddNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
127
167
  }
128
- removeNamedExpression({
129
- expressionName,
130
- sheetName,
131
- workbookName
132
- }) {
133
- const found = this.namedExpressionManager.removeNamedExpression({
134
- expressionName,
135
- sheetName,
136
- workbookName
137
- });
138
- if (found) {
139
- this.reevaluate();
140
- this.eventManager.emitUpdate();
141
- }
142
- return found;
168
+ removeNamedExpression(opts) {
169
+ this.commandExecutor.execute(new import_commands.RemoveNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
143
170
  }
144
- updateNamedExpression({
145
- expression,
146
- expressionName,
147
- sheetName,
148
- workbookName
149
- }) {
150
- this.namedExpressionManager.updateNamedExpression({
151
- expression,
152
- expressionName,
153
- sheetName,
154
- 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
155
176
  });
156
- this.reevaluate();
157
- this.eventManager.emitUpdate();
158
177
  }
159
- renameNamedExpression({
160
- expressionName,
161
- sheetName,
162
- workbookName,
163
- newName
164
- }) {
165
- const result = this.namedExpressionManager.renameNamedExpression({
166
- expressionName,
167
- sheetName,
168
- workbookName,
169
- newName
170
- });
171
- this.workbookManager.updateAllFormulas((formula) => import_named_expression_renamer.renameNamedExpressionInFormula(formula, expressionName, newName));
172
- this.namedExpressionManager.updateAllNamedExpressions((formula) => import_named_expression_renamer.renameNamedExpressionInFormula(formula, expressionName, newName));
173
- this.reevaluate();
174
- this.eventManager.emitUpdate();
175
- 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 });
176
183
  }
177
184
  setNamedExpressions(opts) {
178
- this.namedExpressionManager.setNamedExpressions(opts);
179
- this.reevaluate();
180
- this.eventManager.emitUpdate();
185
+ this.commandExecutor.execute(new import_commands.SetNamedExpressionsCommand(this.getNamedExpressionCommandDeps(), opts), { validate: !!this.apiDeclaration });
181
186
  }
182
187
  addTable(props) {
183
- const table = this.tableManager.addTable({
184
- ...props,
185
- getCellValue: (cellAddress) => this.getCellValue(cellAddress)
186
- });
187
- this.reevaluate();
188
- this.eventManager.emitUpdate();
189
- return table;
188
+ this.commandExecutor.execute(new import_commands.AddTableCommand(this.getTableCommandDeps(), props), { validate: !!this.apiDeclaration });
190
189
  }
191
190
  renameTable(workbookName, names) {
192
- this.tableManager.renameTable(workbookName, names);
193
- this.workbookManager.updateAllFormulas((formula) => import_table_renamer.renameTableInFormula(formula, names.oldName, names.newName));
194
- this.namedExpressionManager.updateAllNamedExpressions((formula) => import_table_renamer.renameTableInFormula(formula, names.oldName, names.newName));
195
- this.reevaluate();
196
- this.eventManager.emitUpdate();
191
+ this.commandExecutor.execute(new import_commands.RenameTableCommand(this.getTableCommandDeps(), workbookName, names.oldName, names.newName), { validate: !!this.apiDeclaration });
197
192
  }
198
193
  updateTable(opts) {
199
- this.tableManager.updateTable({
200
- ...opts,
201
- getCellValue: (cellAddress) => this.getCellValue(cellAddress)
202
- });
203
- this.reevaluate();
204
- this.eventManager.emitUpdate();
194
+ this.commandExecutor.execute(new import_commands.UpdateTableCommand(this.getTableCommandDeps(), opts), { validate: !!this.apiDeclaration });
205
195
  }
206
196
  removeTable(opts) {
207
- const found = this.tableManager.removeTable(opts);
208
- if (found) {
209
- this.reevaluate();
210
- this.eventManager.emitUpdate();
211
- }
212
- 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
+ });
213
210
  }
214
211
  resetTables(tables) {
215
- this.tableManager.resetTables(tables);
216
- this.reevaluate();
217
- this.eventManager.emitUpdate();
212
+ this.commandExecutor.execute(new import_commands.ResetTablesCommand(this.getTableCommandDeps(), tables), { validate: !!this.apiDeclaration });
218
213
  }
219
214
  getTables(workbookName) {
220
215
  return this.tableManager.getTables(workbookName);
@@ -222,16 +217,32 @@ class FormulaEngine {
222
217
  isCellInTable(cellAddress) {
223
218
  return this.tableManager.isCellInTable(cellAddress);
224
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
+ }
225
237
  addConditionalStyle(style) {
226
- this.styleManager.addConditionalStyle(style);
227
- this.eventManager.emitUpdate();
238
+ this.commandExecutor.execute(new import_commands.AddConditionalStyleCommand(this.styleManager, style));
228
239
  }
229
240
  removeConditionalStyle(workbookName, index) {
230
- const removed = this.styleManager.removeConditionalStyle(workbookName, index);
231
- if (removed) {
232
- this.eventManager.emitUpdate();
233
- }
234
- 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;
235
246
  }
236
247
  getConditionalStylesIntersectingWithRange(range) {
237
248
  return this.styleManager.getConditionalStylesIntersectingWithRange(range);
@@ -239,16 +250,21 @@ class FormulaEngine {
239
250
  getCellStyle(cellAddress) {
240
251
  return this.styleManager.getCellStyle(cellAddress);
241
252
  }
253
+ getAllCellStyles() {
254
+ return this.styleManager.getAllCellStyles();
255
+ }
256
+ getAllConditionalStyles() {
257
+ return this.styleManager.getAllConditionalStyles();
258
+ }
242
259
  addCellStyle(style) {
243
- this.styleManager.addCellStyle(style);
244
- this.eventManager.emitUpdate();
260
+ this.commandExecutor.execute(new import_commands.AddCellStyleCommand(this.styleManager, style));
245
261
  }
246
262
  removeCellStyle(workbookName, index) {
247
- const removed = this.styleManager.removeCellStyle(workbookName, index);
248
- if (removed) {
249
- this.eventManager.emitUpdate();
250
- }
251
- 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;
252
268
  }
253
269
  getStylesIntersectingWithRange(range) {
254
270
  return this.styleManager.getStylesIntersectingWithRange(range);
@@ -257,23 +273,30 @@ class FormulaEngine {
257
273
  return this.styleManager.getStyleForRange(range);
258
274
  }
259
275
  clearCellStyles(range) {
260
- this.styleManager.clearCellStyles(range);
261
- this.eventManager.emitUpdate();
276
+ this.commandExecutor.execute(new import_commands.ClearCellStylesCommand(this.styleManager, range));
262
277
  }
263
278
  pasteCells(source, target, options) {
264
- this.copyManager.copyCells(source, target, options);
265
- this.reevaluate();
266
- this.eventManager.emitUpdate();
279
+ this.commandExecutor.execute(new import_commands.PasteCellsCommand(this.workbookManager, this.copyManager, source, target, options), { validate: !!this.apiDeclaration });
267
280
  }
268
281
  fillAreas(seedRange, targetRanges, options) {
269
- this.copyManager.fillAreas(seedRange, targetRanges, options);
270
- this.reevaluate();
271
- this.eventManager.emitUpdate();
282
+ this.commandExecutor.execute(new import_commands.FillAreasCommand(this.workbookManager, this.copyManager, seedRange, targetRanges, options), { validate: !!this.apiDeclaration });
272
283
  }
273
284
  smartPaste(sourceCells, pasteSelection, options) {
274
285
  if (sourceCells.length === 0) {
275
286
  return;
276
287
  }
288
+ if (options.cut === true) {
289
+ for (const area of pasteSelection.areas) {
290
+ const target = {
291
+ workbookName: pasteSelection.workbookName,
292
+ sheetName: pasteSelection.sheetName,
293
+ colIndex: area.start.col,
294
+ rowIndex: area.start.row
295
+ };
296
+ this.pasteCells(sourceCells, target, options);
297
+ }
298
+ return;
299
+ }
277
300
  const sourceBounds = this.getBoundsFromCells(sourceCells);
278
301
  const sourceWidth = sourceBounds.maxCol - sourceBounds.minCol + 1;
279
302
  const sourceHeight = sourceBounds.maxRow - sourceBounds.minRow + 1;
@@ -336,35 +359,23 @@ class FormulaEngine {
336
359
  }
337
360
  return { minCol, minRow, maxCol, maxRow };
338
361
  }
362
+ moveCell(source, target) {
363
+ this.commandExecutor.execute(new import_commands.MoveCellCommand(this.workbookManager, this.copyManager, source, target), { validate: !!this.apiDeclaration });
364
+ }
365
+ moveRange(sourceRange, target) {
366
+ this.commandExecutor.execute(new import_commands.MoveRangeCommand(this.workbookManager, this.copyManager, sourceRange, target), { validate: !!this.apiDeclaration });
367
+ }
339
368
  addSheet(opts) {
340
- const newSheet = this.workbookManager.addSheet(opts);
341
- const wbLevel = this.namedExpressionManager.addSheet(opts);
342
- this.reevaluate();
343
- this.eventManager.emitUpdate();
344
- return newSheet;
369
+ this.commandExecutor.execute(new import_commands.AddSheetCommand(this.getStructureCommandDeps(), opts), { validate: !!this.apiDeclaration });
345
370
  }
346
371
  removeSheet(opts) {
347
- const sheet = this.workbookManager.removeSheet(opts);
348
- this.namedExpressionManager.removeSheet(opts);
349
- this.tableManager.removeSheet(opts);
350
- this.styleManager.removeSheetStyles(opts.workbookName, opts.sheetName);
351
- this.reevaluate();
352
- this.eventManager.emitUpdate();
353
- return sheet;
372
+ this.commandExecutor.execute(new import_commands.RemoveSheetCommand(this.getStructureCommandDeps(), opts), { validate: !!this.apiDeclaration });
354
373
  }
355
374
  renameSheet(opts) {
356
- const sheet = this.workbookManager.renameSheet(opts);
357
- this.namedExpressionManager.renameSheet(opts);
358
- this.tableManager.updateTablesForSheetRename(opts);
359
- this.styleManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
360
- this.workbookManager.updateAllFormulas((formula) => import_sheet_renamer.renameSheetInFormula({
361
- formula,
362
- oldSheetName: opts.sheetName,
363
- newSheetName: opts.newSheetName
364
- }));
365
- this.reevaluate();
366
- this.eventManager.emitUpdate();
367
- 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);
368
379
  }
369
380
  getSheets(workbookName) {
370
381
  return this.workbookManager.getSheets(workbookName);
@@ -379,144 +390,34 @@ class FormulaEngine {
379
390
  return this.workbookManager.getSheetSerialized(opts);
380
391
  }
381
392
  addWorkbook(workbookName) {
382
- this.workbookManager.addWorkbook(workbookName);
383
- this.namedExpressionManager.addWorkbook(workbookName);
384
- this.tableManager.addWorkbook(workbookName);
385
- this.reevaluate();
386
- this.eventManager.emitUpdate();
393
+ this.commandExecutor.execute(new import_commands.AddWorkbookCommand(this.getStructureCommandDeps(), workbookName), { validate: !!this.apiDeclaration });
387
394
  }
388
395
  removeWorkbook(workbookName) {
389
- this.workbookManager.removeWorkbook(workbookName);
390
- this.namedExpressionManager.removeWorkbook(workbookName);
391
- this.tableManager.removeWorkbook(workbookName);
392
- this.styleManager.removeWorkbookStyles(workbookName);
393
- this.reevaluate();
394
- 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);
395
400
  }
396
401
  cloneWorkbook(fromWorkbookName, toWorkbookName) {
397
- const sourceWorkbook = this.workbookManager.getWorkbooks().get(fromWorkbookName);
398
- if (!sourceWorkbook) {
399
- throw new Error(`Source workbook "${fromWorkbookName}" not found`);
400
- }
401
- if (this.workbookManager.getWorkbooks().has(toWorkbookName)) {
402
- throw new Error(`Target workbook "${toWorkbookName}" already exists`);
403
- }
404
- this.addWorkbook(toWorkbookName);
405
- for (const [sheetName, sheet] of sourceWorkbook.sheets) {
406
- this.addSheet({
407
- workbookName: toWorkbookName,
408
- sheetName
409
- });
410
- this.setSheetContent({
411
- workbookName: toWorkbookName,
412
- sheetName
413
- }, new Map(sheet.content));
414
- }
415
- const sourceWorkbookExpressions = this.namedExpressionManager.getNamedExpressions().workbookExpressions.get(fromWorkbookName);
416
- if (sourceWorkbookExpressions) {
417
- for (const [name, expression] of sourceWorkbookExpressions) {
418
- this.addNamedExpression({
419
- expressionName: name,
420
- expression: expression.expression,
421
- workbookName: toWorkbookName
422
- });
423
- }
424
- }
425
- const sourceSheetExpressions = this.namedExpressionManager.getNamedExpressions().sheetExpressions.get(fromWorkbookName);
426
- if (sourceSheetExpressions) {
427
- for (const [sheetName, sheetExpressions] of sourceSheetExpressions) {
428
- for (const [name, expression] of sheetExpressions) {
429
- this.addNamedExpression({
430
- expressionName: name,
431
- expression: expression.expression,
432
- workbookName: toWorkbookName,
433
- sheetName
434
- });
435
- }
436
- }
437
- }
438
- const sourceTables = this.tableManager.tables.get(fromWorkbookName);
439
- if (sourceTables) {
440
- for (const [tableName, table] of sourceTables) {
441
- this.tableManager.copyTable({
442
- workbookName: fromWorkbookName,
443
- tableName
444
- }, {
445
- workbookName: toWorkbookName,
446
- tableName
447
- });
448
- }
449
- }
450
- const allConditionalStyles = this.styleManager.getAllConditionalStyles();
451
- for (const style of allConditionalStyles) {
452
- if (style.area.workbookName === fromWorkbookName) {
453
- const newStyle = {
454
- ...style,
455
- area: {
456
- ...style.area,
457
- workbookName: toWorkbookName
458
- }
459
- };
460
- this.styleManager.addConditionalStyle(newStyle);
461
- }
462
- }
463
- const allCellStyles = this.styleManager.getAllCellStyles();
464
- for (const style of allCellStyles) {
465
- if (style.area.workbookName === fromWorkbookName) {
466
- const newStyle = {
467
- ...style,
468
- area: {
469
- ...style.area,
470
- workbookName: toWorkbookName
471
- }
472
- };
473
- this.styleManager.addCellStyle(newStyle);
474
- }
475
- }
476
- this.workbookManager.updateFormulasForWorkbook(toWorkbookName, (formula) => import_workbook_renamer.renameWorkbookInFormula({
477
- formula,
478
- oldWorkbookName: fromWorkbookName,
479
- newWorkbookName: toWorkbookName
480
- }));
481
- this.reevaluate();
482
- this.eventManager.emitUpdate();
402
+ this.commandExecutor.execute(new import_commands.CloneWorkbookCommand(this.getStructureCommandDeps(), fromWorkbookName, toWorkbookName), { validate: !!this.apiDeclaration });
483
403
  }
484
404
  renameWorkbook(opts) {
485
- this.workbookManager.renameWorkbook(opts);
486
- this.namedExpressionManager.renameWorkbook(opts);
487
- this.tableManager.updateTablesForWorkbookRename(opts);
488
- this.styleManager.updateWorkbookName(opts.workbookName, opts.newWorkbookName);
489
- this.workbookManager.updateAllFormulas((formula) => import_workbook_renamer.renameWorkbookInFormula({
490
- formula,
491
- oldWorkbookName: opts.workbookName,
492
- newWorkbookName: opts.newWorkbookName
493
- }));
494
- this.reevaluate();
495
- this.eventManager.emitUpdate();
405
+ this.commandExecutor.execute(new import_commands.RenameWorkbookCommand(this.getStructureCommandDeps(), opts.workbookName, opts.newWorkbookName), { validate: !!this.apiDeclaration });
496
406
  }
497
407
  getWorkbooks() {
498
408
  return this.workbookManager.getWorkbooks();
499
409
  }
500
410
  setSheetContent(opts, content) {
501
- this.workbookManager.setSheetContent(opts, content);
502
- this.reevaluate();
503
- this.eventManager.emitUpdate();
411
+ this.commandExecutor.execute(new import_commands.SetSheetContentCommand(this.workbookManager, opts, content), { validate: !!this.apiDeclaration });
504
412
  }
505
413
  setCellContent(address, content) {
506
- this.workbookManager.setCellContent(address, content);
507
- this.reevaluate();
508
- this.eventManager.emitUpdate();
509
- }
510
- reevaluate() {
511
- this.evaluationManager.clearEvaluationCache();
414
+ this.commandExecutor.execute(new import_commands.SetCellContentCommand(this.workbookManager, address, content), { validate: !!this.apiDeclaration });
512
415
  }
513
416
  autoFill(opts, seedRange, fillRanges, direction) {
514
- 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 });
515
418
  }
516
419
  clearSpreadsheetRange(address) {
517
- this.workbookManager.clearSpreadsheetRange(address);
518
- this.reevaluate();
519
- this.eventManager.emitUpdate();
420
+ this.commandExecutor.execute(new import_commands.ClearRangeCommand(this.workbookManager, address), { validate: !!this.apiDeclaration });
520
421
  }
521
422
  getState() {
522
423
  return {
@@ -524,7 +425,8 @@ class FormulaEngine {
524
425
  namedExpressions: this.namedExpressionManager.getNamedExpressions(),
525
426
  tables: this.tableManager.tables,
526
427
  conditionalStyles: this.styleManager.getAllConditionalStyles(),
527
- cellStyles: this.styleManager.getAllCellStyles()
428
+ cellStyles: this.styleManager.getAllCellStyles(),
429
+ references: this.referenceManager.getAllReferences()
528
430
  };
529
431
  }
530
432
  onUpdate(listener) {
@@ -563,9 +465,62 @@ class FormulaEngine {
563
465
  }
564
466
  }
565
467
  this.styleManager.resetStyles(conditionalStylesArray, cellStylesArray);
566
- this.reevaluate();
468
+ if (deserialized.references) {
469
+ this.referenceManager.resetReferences(deserialized.references);
470
+ }
471
+ this.evaluationManager.clearEvaluationCache();
567
472
  this.eventManager.emitUpdate();
568
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
+ }
569
524
  }
570
525
 
571
- //# debugId=28A747585109280764756E2164756E21
526
+ //# debugId=3DF704CC89CB006E64756E2164756E21