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