@ricsam/formula-engine 0.0.17 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/cjs/core/api/api-builder.cjs +67 -0
  2. package/dist/cjs/core/api/api-builder.cjs.map +10 -0
  3. package/dist/cjs/core/api/api-helpers.cjs +191 -0
  4. package/dist/cjs/core/api/api-helpers.cjs.map +10 -0
  5. package/dist/cjs/core/api/api.cjs +65 -0
  6. package/dist/cjs/core/api/api.cjs.map +10 -0
  7. package/dist/cjs/core/api/cell-orm.cjs +80 -0
  8. package/dist/cjs/core/api/cell-orm.cjs.map +10 -0
  9. package/dist/cjs/core/api/table-orm.cjs +171 -0
  10. package/dist/cjs/core/api/table-orm.cjs.map +10 -0
  11. package/dist/cjs/core/autofill-utils.cjs +3 -5
  12. package/dist/cjs/core/autofill-utils.cjs.map +3 -3
  13. package/dist/cjs/core/commands/command-executor.cjs +140 -0
  14. package/dist/cjs/core/commands/command-executor.cjs.map +10 -0
  15. package/dist/cjs/core/commands/content-commands.cjs +574 -0
  16. package/dist/cjs/core/commands/content-commands.cjs.map +10 -0
  17. package/dist/cjs/core/commands/metadata-commands.cjs +150 -0
  18. package/dist/cjs/core/commands/metadata-commands.cjs.map +10 -0
  19. package/dist/cjs/core/commands/named-expression-commands.cjs +238 -0
  20. package/dist/cjs/core/commands/named-expression-commands.cjs.map +10 -0
  21. package/dist/cjs/core/commands/structure-commands.cjs +495 -0
  22. package/dist/cjs/core/commands/structure-commands.cjs.map +10 -0
  23. package/dist/cjs/core/commands/style-commands.cjs +219 -0
  24. package/dist/cjs/core/commands/style-commands.cjs.map +10 -0
  25. package/dist/cjs/core/commands/table-commands.cjs +226 -0
  26. package/dist/cjs/core/commands/table-commands.cjs.map +10 -0
  27. package/dist/cjs/core/commands/types.cjs +72 -0
  28. package/dist/cjs/core/commands/types.cjs.map +10 -0
  29. package/dist/cjs/core/engine.cjs +170 -297
  30. package/dist/cjs/core/engine.cjs.map +3 -3
  31. package/dist/cjs/core/managers/api-schema-manager.cjs +304 -0
  32. package/dist/cjs/core/managers/api-schema-manager.cjs.map +10 -0
  33. package/dist/cjs/core/managers/copy-manager.cjs +1 -2
  34. package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
  35. package/dist/cjs/core/types.cjs.map +2 -2
  36. package/dist/cjs/lib.cjs +13 -2
  37. package/dist/cjs/lib.cjs.map +3 -3
  38. package/dist/cjs/package.json +1 -1
  39. package/dist/mjs/core/api/api-builder.mjs +37 -0
  40. package/dist/mjs/core/api/api-builder.mjs.map +10 -0
  41. package/dist/mjs/core/api/api-helpers.mjs +161 -0
  42. package/dist/mjs/core/api/api-helpers.mjs.map +10 -0
  43. package/dist/mjs/core/api/api.mjs +35 -0
  44. package/dist/mjs/core/api/api.mjs.map +10 -0
  45. package/dist/mjs/core/api/cell-orm.mjs +49 -0
  46. package/dist/mjs/core/api/cell-orm.mjs.map +10 -0
  47. package/dist/mjs/core/api/table-orm.mjs +148 -0
  48. package/dist/mjs/core/api/table-orm.mjs.map +10 -0
  49. package/dist/mjs/core/autofill-utils.mjs +3 -5
  50. package/dist/mjs/core/autofill-utils.mjs.map +3 -3
  51. package/dist/mjs/core/commands/command-executor.mjs +109 -0
  52. package/dist/mjs/core/commands/command-executor.mjs.map +10 -0
  53. package/dist/mjs/core/commands/content-commands.mjs +544 -0
  54. package/dist/mjs/core/commands/content-commands.mjs.map +10 -0
  55. package/dist/mjs/core/commands/metadata-commands.mjs +120 -0
  56. package/dist/mjs/core/commands/metadata-commands.mjs.map +10 -0
  57. package/dist/mjs/core/commands/named-expression-commands.mjs +208 -0
  58. package/dist/mjs/core/commands/named-expression-commands.mjs.map +10 -0
  59. package/dist/mjs/core/commands/structure-commands.mjs +465 -0
  60. package/dist/mjs/core/commands/structure-commands.mjs.map +10 -0
  61. package/dist/mjs/core/commands/style-commands.mjs +189 -0
  62. package/dist/mjs/core/commands/style-commands.mjs.map +10 -0
  63. package/dist/mjs/core/commands/table-commands.mjs +196 -0
  64. package/dist/mjs/core/commands/table-commands.mjs.map +10 -0
  65. package/dist/mjs/core/commands/types.mjs +42 -0
  66. package/dist/mjs/core/commands/types.mjs.map +10 -0
  67. package/dist/mjs/core/engine.mjs +213 -297
  68. package/dist/mjs/core/engine.mjs.map +3 -3
  69. package/dist/mjs/core/managers/api-schema-manager.mjs +274 -0
  70. package/dist/mjs/core/managers/api-schema-manager.mjs.map +10 -0
  71. package/dist/mjs/core/managers/copy-manager.mjs +1 -2
  72. package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
  73. package/dist/mjs/core/types.mjs.map +2 -2
  74. package/dist/mjs/lib.mjs +13 -2
  75. package/dist/mjs/lib.mjs.map +3 -3
  76. package/dist/mjs/package.json +1 -1
  77. package/dist/types/core/api/api-builder.d.ts +16 -0
  78. package/dist/types/core/api/api-helpers.d.ts +37 -0
  79. package/dist/types/core/api/api.d.ts +83 -0
  80. package/dist/types/core/api/api.type-test.d.ts +1 -0
  81. package/dist/types/core/api/cell-orm.d.ts +29 -0
  82. package/dist/types/core/api/table-orm.d.ts +46 -0
  83. package/dist/types/core/autofill-utils.d.ts +2 -9
  84. package/dist/types/core/commands/command-executor.d.ts +83 -0
  85. package/dist/types/core/commands/content-commands.d.ts +142 -0
  86. package/dist/types/core/commands/metadata-commands.d.ts +55 -0
  87. package/dist/types/core/commands/named-expression-commands.d.ts +115 -0
  88. package/dist/types/core/commands/structure-commands.d.ts +132 -0
  89. package/dist/types/core/commands/style-commands.d.ts +76 -0
  90. package/dist/types/core/commands/table-commands.d.ts +104 -0
  91. package/dist/types/core/commands/types.d.ts +114 -0
  92. package/dist/types/core/engine.d.ts +130 -26
  93. package/dist/types/core/managers/api-schema-manager.d.ts +121 -0
  94. package/dist/types/core/types.d.ts +1 -1
  95. package/dist/types/lib.d.ts +8 -0
  96. package/package.json +1 -1
@@ -0,0 +1,465 @@
1
+ // src/core/commands/structure-commands.ts
2
+ import { ActionTypes } from "./types.mjs";
3
+
4
+ class AddWorkbookCommand {
5
+ deps;
6
+ workbookName;
7
+ requiresReevaluation = true;
8
+ constructor(deps, workbookName) {
9
+ this.deps = deps;
10
+ this.workbookName = workbookName;
11
+ }
12
+ execute() {
13
+ this.deps.workbookManager.addWorkbook(this.workbookName);
14
+ this.deps.namedExpressionManager.addWorkbook(this.workbookName);
15
+ this.deps.tableManager.addWorkbook(this.workbookName);
16
+ }
17
+ undo() {
18
+ this.deps.workbookManager.removeWorkbook(this.workbookName);
19
+ this.deps.namedExpressionManager.removeWorkbook(this.workbookName);
20
+ this.deps.tableManager.removeWorkbook(this.workbookName);
21
+ }
22
+ toAction() {
23
+ return {
24
+ type: ActionTypes.ADD_WORKBOOK,
25
+ payload: { workbookName: this.workbookName }
26
+ };
27
+ }
28
+ }
29
+ function captureWorkbookSnapshot(deps, workbookName) {
30
+ const workbook = deps.workbookManager.getWorkbooks().get(workbookName);
31
+ if (!workbook)
32
+ return;
33
+ const clonedSheets = new Map;
34
+ for (const [name, sheet] of workbook.sheets) {
35
+ clonedSheets.set(name, {
36
+ name: sheet.name,
37
+ index: sheet.index,
38
+ content: new Map(sheet.content),
39
+ metadata: new Map(sheet.metadata),
40
+ sheetMetadata: sheet.sheetMetadata
41
+ });
42
+ }
43
+ const namedExpressions = deps.namedExpressionManager.getNamedExpressions();
44
+ const snapshot = {
45
+ workbook: {
46
+ name: workbook.name,
47
+ sheets: clonedSheets,
48
+ workbookMetadata: workbook.workbookMetadata
49
+ },
50
+ namedExpressions: {
51
+ workbookLevel: new Map(namedExpressions.workbookExpressions.get(workbookName) || []),
52
+ sheetLevel: new Map
53
+ },
54
+ tables: new Map(deps.tableManager.getTables(workbookName)),
55
+ conditionalStyles: deps.styleManager.getAllConditionalStyles().filter((s) => s.areas.some((a) => a.workbookName === workbookName)),
56
+ cellStyles: deps.styleManager.getAllCellStyles().filter((s) => s.areas.some((a) => a.workbookName === workbookName))
57
+ };
58
+ const sheetExpressions = namedExpressions.sheetExpressions.get(workbookName);
59
+ if (sheetExpressions) {
60
+ for (const [sheetName, expressions] of sheetExpressions) {
61
+ snapshot.namedExpressions.sheetLevel.set(sheetName, new Map(expressions));
62
+ }
63
+ }
64
+ return snapshot;
65
+ }
66
+ function removeWorkbook(deps, workbookName) {
67
+ deps.workbookManager.removeWorkbook(workbookName);
68
+ deps.namedExpressionManager.removeWorkbook(workbookName);
69
+ deps.tableManager.removeWorkbook(workbookName);
70
+ deps.styleManager.removeWorkbookStyles(workbookName);
71
+ deps.referenceManager.invalidateWorkbook(workbookName);
72
+ }
73
+ function renameWorkbookAcrossManagers(deps, oldName, newName) {
74
+ deps.workbookManager.renameWorkbook({
75
+ workbookName: oldName,
76
+ newWorkbookName: newName
77
+ });
78
+ deps.namedExpressionManager.renameWorkbook({
79
+ workbookName: oldName,
80
+ newWorkbookName: newName
81
+ });
82
+ deps.tableManager.updateTablesForWorkbookRename({
83
+ workbookName: oldName,
84
+ newWorkbookName: newName
85
+ });
86
+ deps.styleManager.updateWorkbookName(oldName, newName);
87
+ deps.workbookManager.updateAllFormulas((formula) => deps.renameWorkbookInFormula({
88
+ formula,
89
+ oldWorkbookName: oldName,
90
+ newWorkbookName: newName
91
+ }));
92
+ deps.referenceManager.updateWorkbookName(oldName, newName);
93
+ deps.apiSchemaManager.updateForWorkbookRename(oldName, newName);
94
+ }
95
+ function renameSheetAcrossManagers(deps, opts) {
96
+ deps.workbookManager.renameSheet(opts);
97
+ deps.namedExpressionManager.renameSheet(opts);
98
+ deps.tableManager.updateTablesForSheetRename(opts);
99
+ deps.styleManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
100
+ deps.workbookManager.updateAllFormulas((formula) => deps.renameSheetInFormula({
101
+ formula,
102
+ oldSheetName: opts.sheetName,
103
+ newSheetName: opts.newSheetName
104
+ }));
105
+ deps.referenceManager.updateSheetName(opts.workbookName, opts.sheetName, opts.newSheetName);
106
+ deps.apiSchemaManager.updateForSheetRename(opts.workbookName, opts.sheetName, opts.newSheetName);
107
+ }
108
+ function restoreTables(tableManager, tables, workbookName) {
109
+ for (const [tableName, table] of tables) {
110
+ tableManager.addTable({
111
+ workbookName,
112
+ tableName,
113
+ sheetName: table.sheetName,
114
+ start: `${String.fromCharCode(65 + table.start.colIndex)}${table.start.rowIndex + 1}`,
115
+ numRows: table.endRow,
116
+ numCols: table.headers.size,
117
+ getCellValue: () => {
118
+ return;
119
+ }
120
+ });
121
+ }
122
+ }
123
+ function restoreStyles(styleManager, conditionalStyles, cellStyles) {
124
+ for (const style of conditionalStyles) {
125
+ styleManager.addConditionalStyle(style);
126
+ }
127
+ for (const style of cellStyles) {
128
+ styleManager.addCellStyle(style);
129
+ }
130
+ }
131
+
132
+ class RemoveWorkbookCommand {
133
+ deps;
134
+ workbookName;
135
+ requiresReevaluation = true;
136
+ snapshot;
137
+ constructor(deps, workbookName) {
138
+ this.deps = deps;
139
+ this.workbookName = workbookName;
140
+ }
141
+ execute() {
142
+ this.snapshot = captureWorkbookSnapshot(this.deps, this.workbookName);
143
+ removeWorkbook(this.deps, this.workbookName);
144
+ }
145
+ undo() {
146
+ if (!this.snapshot)
147
+ return;
148
+ this.deps.workbookManager.addWorkbook(this.workbookName);
149
+ this.deps.namedExpressionManager.addWorkbook(this.workbookName);
150
+ this.deps.tableManager.addWorkbook(this.workbookName);
151
+ for (const [sheetName, sheet] of this.snapshot.workbook.sheets) {
152
+ this.deps.workbookManager.addSheet({
153
+ workbookName: this.workbookName,
154
+ sheetName
155
+ });
156
+ this.deps.namedExpressionManager.addSheet({
157
+ workbookName: this.workbookName,
158
+ sheetName
159
+ });
160
+ this.deps.workbookManager.setSheetContent({ workbookName: this.workbookName, sheetName }, sheet.content);
161
+ }
162
+ for (const [name, expr] of this.snapshot.namedExpressions.workbookLevel) {
163
+ this.deps.namedExpressionManager.addNamedExpression({
164
+ expressionName: name,
165
+ expression: expr.expression,
166
+ workbookName: this.workbookName
167
+ });
168
+ }
169
+ for (const [sheetName, expressions] of this.snapshot.namedExpressions.sheetLevel) {
170
+ for (const [name, expr] of expressions) {
171
+ this.deps.namedExpressionManager.addNamedExpression({
172
+ expressionName: name,
173
+ expression: expr.expression,
174
+ workbookName: this.workbookName,
175
+ sheetName
176
+ });
177
+ }
178
+ }
179
+ restoreTables(this.deps.tableManager, this.snapshot.tables, this.workbookName);
180
+ restoreStyles(this.deps.styleManager, this.snapshot.conditionalStyles, this.snapshot.cellStyles);
181
+ }
182
+ toAction() {
183
+ return {
184
+ type: ActionTypes.REMOVE_WORKBOOK,
185
+ payload: { workbookName: this.workbookName }
186
+ };
187
+ }
188
+ }
189
+
190
+ class RenameWorkbookCommand {
191
+ deps;
192
+ workbookName;
193
+ newWorkbookName;
194
+ requiresReevaluation = true;
195
+ constructor(deps, workbookName, newWorkbookName) {
196
+ this.deps = deps;
197
+ this.workbookName = workbookName;
198
+ this.newWorkbookName = newWorkbookName;
199
+ }
200
+ execute() {
201
+ renameWorkbookAcrossManagers(this.deps, this.workbookName, this.newWorkbookName);
202
+ }
203
+ undo() {
204
+ renameWorkbookAcrossManagers(this.deps, this.newWorkbookName, this.workbookName);
205
+ }
206
+ toAction() {
207
+ return {
208
+ type: ActionTypes.RENAME_WORKBOOK,
209
+ payload: {
210
+ workbookName: this.workbookName,
211
+ newWorkbookName: this.newWorkbookName
212
+ }
213
+ };
214
+ }
215
+ }
216
+
217
+ class CloneWorkbookCommand {
218
+ deps;
219
+ fromWorkbookName;
220
+ toWorkbookName;
221
+ requiresReevaluation = true;
222
+ constructor(deps, fromWorkbookName, toWorkbookName) {
223
+ this.deps = deps;
224
+ this.fromWorkbookName = fromWorkbookName;
225
+ this.toWorkbookName = toWorkbookName;
226
+ }
227
+ execute() {
228
+ const {
229
+ workbookManager,
230
+ namedExpressionManager,
231
+ tableManager,
232
+ styleManager,
233
+ renameWorkbookInFormula
234
+ } = this.deps;
235
+ const sourceWorkbook = workbookManager.getWorkbooks().get(this.fromWorkbookName);
236
+ if (!sourceWorkbook) {
237
+ throw new Error(`Source workbook "${this.fromWorkbookName}" not found`);
238
+ }
239
+ if (workbookManager.getWorkbooks().has(this.toWorkbookName)) {
240
+ throw new Error(`Target workbook "${this.toWorkbookName}" already exists`);
241
+ }
242
+ workbookManager.addWorkbook(this.toWorkbookName);
243
+ namedExpressionManager.addWorkbook(this.toWorkbookName);
244
+ tableManager.addWorkbook(this.toWorkbookName);
245
+ for (const [sheetName, sheet] of sourceWorkbook.sheets) {
246
+ workbookManager.addSheet({
247
+ workbookName: this.toWorkbookName,
248
+ sheetName
249
+ });
250
+ namedExpressionManager.addSheet({
251
+ workbookName: this.toWorkbookName,
252
+ sheetName
253
+ });
254
+ workbookManager.setSheetContent({ workbookName: this.toWorkbookName, sheetName }, new Map(sheet.content));
255
+ const targetSheet = workbookManager.getSheet({
256
+ workbookName: this.toWorkbookName,
257
+ sheetName
258
+ });
259
+ if (targetSheet) {
260
+ targetSheet.metadata = new Map(sheet.metadata);
261
+ if (sheet.sheetMetadata !== undefined) {
262
+ targetSheet.sheetMetadata = structuredClone(sheet.sheetMetadata);
263
+ }
264
+ }
265
+ }
266
+ const targetWorkbook = workbookManager.getWorkbooks().get(this.toWorkbookName);
267
+ if (targetWorkbook && sourceWorkbook.workbookMetadata !== undefined) {
268
+ targetWorkbook.workbookMetadata = structuredClone(sourceWorkbook.workbookMetadata);
269
+ }
270
+ const allExpressions = namedExpressionManager.getNamedExpressions();
271
+ const sourceWorkbookExpressions = allExpressions.workbookExpressions.get(this.fromWorkbookName);
272
+ if (sourceWorkbookExpressions) {
273
+ for (const [expressionName, expression] of sourceWorkbookExpressions) {
274
+ namedExpressionManager.addNamedExpression({
275
+ expressionName,
276
+ expression: expression.expression,
277
+ workbookName: this.toWorkbookName
278
+ });
279
+ }
280
+ }
281
+ const sourceSheetExpressions = allExpressions.sheetExpressions.get(this.fromWorkbookName);
282
+ if (sourceSheetExpressions) {
283
+ for (const [sheetName, sheetExpressions] of sourceSheetExpressions) {
284
+ for (const [expressionName, expression] of sheetExpressions) {
285
+ namedExpressionManager.addNamedExpression({
286
+ expressionName,
287
+ expression: expression.expression,
288
+ workbookName: this.toWorkbookName,
289
+ sheetName
290
+ });
291
+ }
292
+ }
293
+ }
294
+ const sourceTables = tableManager.tables.get(this.fromWorkbookName);
295
+ if (sourceTables) {
296
+ for (const [tableName] of sourceTables) {
297
+ tableManager.copyTable({ workbookName: this.fromWorkbookName, tableName }, { workbookName: this.toWorkbookName, tableName });
298
+ }
299
+ }
300
+ const allConditionalStyles = styleManager.getAllConditionalStyles();
301
+ for (const style of allConditionalStyles) {
302
+ if (style.areas.some((area) => area.workbookName === this.fromWorkbookName)) {
303
+ const newStyle = {
304
+ ...style,
305
+ areas: style.areas.map((area) => area.workbookName === this.fromWorkbookName ? { ...area, workbookName: this.toWorkbookName } : area)
306
+ };
307
+ styleManager.addConditionalStyle(newStyle);
308
+ }
309
+ }
310
+ const allCellStyles = styleManager.getAllCellStyles();
311
+ for (const style of allCellStyles) {
312
+ if (style.areas.some((area) => area.workbookName === this.fromWorkbookName)) {
313
+ const newStyle = {
314
+ ...style,
315
+ areas: style.areas.map((area) => area.workbookName === this.fromWorkbookName ? { ...area, workbookName: this.toWorkbookName } : area)
316
+ };
317
+ styleManager.addCellStyle(newStyle);
318
+ }
319
+ }
320
+ workbookManager.updateFormulasForWorkbook(this.toWorkbookName, (formula) => renameWorkbookInFormula({
321
+ formula,
322
+ oldWorkbookName: this.fromWorkbookName,
323
+ newWorkbookName: this.toWorkbookName
324
+ }));
325
+ }
326
+ undo() {
327
+ removeWorkbook(this.deps, this.toWorkbookName);
328
+ }
329
+ toAction() {
330
+ return {
331
+ type: ActionTypes.CLONE_WORKBOOK,
332
+ payload: {
333
+ fromWorkbookName: this.fromWorkbookName,
334
+ toWorkbookName: this.toWorkbookName
335
+ }
336
+ };
337
+ }
338
+ }
339
+
340
+ class AddSheetCommand {
341
+ deps;
342
+ opts;
343
+ requiresReevaluation = true;
344
+ constructor(deps, opts) {
345
+ this.deps = deps;
346
+ this.opts = opts;
347
+ }
348
+ execute() {
349
+ this.deps.workbookManager.addSheet(this.opts);
350
+ this.deps.namedExpressionManager.addSheet(this.opts);
351
+ }
352
+ undo() {
353
+ this.deps.workbookManager.removeSheet(this.opts);
354
+ this.deps.namedExpressionManager.removeSheet(this.opts);
355
+ }
356
+ toAction() {
357
+ return {
358
+ type: ActionTypes.ADD_SHEET,
359
+ payload: this.opts
360
+ };
361
+ }
362
+ }
363
+
364
+ class RemoveSheetCommand {
365
+ deps;
366
+ opts;
367
+ requiresReevaluation = true;
368
+ snapshot;
369
+ constructor(deps, opts) {
370
+ this.deps = deps;
371
+ this.opts = opts;
372
+ }
373
+ execute() {
374
+ const sheet = this.deps.workbookManager.getSheet(this.opts);
375
+ if (sheet) {
376
+ const namedExpressions = this.deps.namedExpressionManager.getNamedExpressions();
377
+ const sheetExpressions = namedExpressions.sheetExpressions.get(this.opts.workbookName)?.get(this.opts.sheetName) || new Map;
378
+ const allTables = this.deps.tableManager.getTables(this.opts.workbookName);
379
+ const sheetTables = new Map;
380
+ for (const [name, table] of allTables) {
381
+ if (table.sheetName === this.opts.sheetName) {
382
+ sheetTables.set(name, table);
383
+ }
384
+ }
385
+ this.snapshot = {
386
+ sheet: {
387
+ name: sheet.name,
388
+ index: sheet.index,
389
+ content: new Map(sheet.content),
390
+ metadata: new Map(sheet.metadata),
391
+ sheetMetadata: sheet.sheetMetadata
392
+ },
393
+ namedExpressions: new Map(sheetExpressions),
394
+ tables: sheetTables,
395
+ conditionalStyles: this.deps.styleManager.getAllConditionalStyles().filter((s) => s.areas.some((a) => a.workbookName === this.opts.workbookName && a.sheetName === this.opts.sheetName)),
396
+ cellStyles: this.deps.styleManager.getAllCellStyles().filter((s) => s.areas.some((a) => a.workbookName === this.opts.workbookName && a.sheetName === this.opts.sheetName))
397
+ };
398
+ }
399
+ this.deps.workbookManager.removeSheet(this.opts);
400
+ this.deps.namedExpressionManager.removeSheet(this.opts);
401
+ this.deps.tableManager.removeSheet(this.opts);
402
+ this.deps.styleManager.removeSheetStyles(this.opts.workbookName, this.opts.sheetName);
403
+ this.deps.referenceManager.invalidateSheet(this.opts.workbookName, this.opts.sheetName);
404
+ }
405
+ undo() {
406
+ if (!this.snapshot)
407
+ return;
408
+ this.deps.workbookManager.addSheet(this.opts);
409
+ this.deps.namedExpressionManager.addSheet(this.opts);
410
+ this.deps.workbookManager.setSheetContent(this.opts, this.snapshot.sheet.content);
411
+ for (const [name, expr] of this.snapshot.namedExpressions) {
412
+ this.deps.namedExpressionManager.addNamedExpression({
413
+ expressionName: name,
414
+ expression: expr.expression,
415
+ workbookName: this.opts.workbookName,
416
+ sheetName: this.opts.sheetName
417
+ });
418
+ }
419
+ restoreTables(this.deps.tableManager, this.snapshot.tables, this.opts.workbookName);
420
+ restoreStyles(this.deps.styleManager, this.snapshot.conditionalStyles, this.snapshot.cellStyles);
421
+ }
422
+ toAction() {
423
+ return {
424
+ type: ActionTypes.REMOVE_SHEET,
425
+ payload: this.opts
426
+ };
427
+ }
428
+ }
429
+
430
+ class RenameSheetCommand {
431
+ deps;
432
+ opts;
433
+ requiresReevaluation = true;
434
+ constructor(deps, opts) {
435
+ this.deps = deps;
436
+ this.opts = opts;
437
+ }
438
+ execute() {
439
+ renameSheetAcrossManagers(this.deps, this.opts);
440
+ }
441
+ undo() {
442
+ renameSheetAcrossManagers(this.deps, {
443
+ workbookName: this.opts.workbookName,
444
+ sheetName: this.opts.newSheetName,
445
+ newSheetName: this.opts.sheetName
446
+ });
447
+ }
448
+ toAction() {
449
+ return {
450
+ type: ActionTypes.RENAME_SHEET,
451
+ payload: this.opts
452
+ };
453
+ }
454
+ }
455
+ export {
456
+ RenameWorkbookCommand,
457
+ RenameSheetCommand,
458
+ RemoveWorkbookCommand,
459
+ RemoveSheetCommand,
460
+ CloneWorkbookCommand,
461
+ AddWorkbookCommand,
462
+ AddSheetCommand
463
+ };
464
+
465
+ //# debugId=39C98D842B86633B64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/commands/structure-commands.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Structure Commands - Commands that modify workbook/sheet structure\n *\n * These commands all require re-evaluation after execution.\n */\n\nimport type { ApiSchemaManager } from \"../managers/api-schema-manager.mjs\";\nimport type { NamedExpressionManager } from \"../managers/named-expression-manager.mjs\";\nimport type { ReferenceManager } from \"../managers/reference-manager.mjs\";\nimport type { StyleManager } from \"../managers/style-manager.mjs\";\nimport type { TableManager } from \"../managers/table-manager.mjs\";\nimport type { WorkbookManager } from \"../managers/workbook-manager.mjs\";\nimport type {\n ConditionalStyle,\n DirectCellStyle,\n NamedExpression,\n Sheet,\n TableDefinition,\n Workbook,\n} from \"../types.mjs\";\nimport type { EngineAction, EngineCommand } from \"./types.mjs\";\nimport { ActionTypes } from \"./types.mjs\";\n\n/**\n * Dependencies needed for structure commands.\n */\nexport interface StructureCommandDeps {\n workbookManager: WorkbookManager;\n namedExpressionManager: NamedExpressionManager;\n tableManager: TableManager;\n styleManager: StyleManager;\n referenceManager: ReferenceManager;\n apiSchemaManager: ApiSchemaManager;\n renameSheetInFormula: (opts: {\n formula: string;\n oldSheetName: string;\n newSheetName: string;\n }) => string;\n renameWorkbookInFormula: (opts: {\n formula: string;\n oldWorkbookName: string;\n newWorkbookName: string;\n }) => string;\n}\n\n// ============================================================================\n// Workbook Commands\n// ============================================================================\n\n/**\n * Command to add a workbook.\n */\nexport class AddWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string\n ) {}\n\n execute(): void {\n this.deps.workbookManager.addWorkbook(this.workbookName);\n this.deps.namedExpressionManager.addWorkbook(this.workbookName);\n this.deps.tableManager.addWorkbook(this.workbookName);\n }\n\n undo(): void {\n this.deps.workbookManager.removeWorkbook(this.workbookName);\n this.deps.namedExpressionManager.removeWorkbook(this.workbookName);\n this.deps.tableManager.removeWorkbook(this.workbookName);\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.ADD_WORKBOOK,\n payload: { workbookName: this.workbookName },\n };\n }\n}\n\n/**\n * Captured state of a workbook for undo purposes.\n */\ninterface WorkbookSnapshot {\n workbook: Workbook;\n namedExpressions: {\n workbookLevel: Map<string, NamedExpression>;\n sheetLevel: Map<string, Map<string, NamedExpression>>;\n };\n tables: Map<string, TableDefinition>;\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n}\n\n/**\n * Capture the full state of a workbook for later restoration.\n */\nfunction captureWorkbookSnapshot(\n deps: StructureCommandDeps,\n workbookName: string\n): WorkbookSnapshot | undefined {\n const workbook = deps.workbookManager.getWorkbooks().get(workbookName);\n if (!workbook) return undefined;\n\n // Deep clone workbook sheets\n const clonedSheets = new Map<string, Sheet>();\n for (const [name, sheet] of workbook.sheets) {\n clonedSheets.set(name, {\n name: sheet.name,\n index: sheet.index,\n content: new Map(sheet.content),\n metadata: new Map(sheet.metadata),\n sheetMetadata: sheet.sheetMetadata,\n });\n }\n\n const namedExpressions = deps.namedExpressionManager.getNamedExpressions();\n\n const snapshot: WorkbookSnapshot = {\n workbook: {\n name: workbook.name,\n sheets: clonedSheets,\n workbookMetadata: workbook.workbookMetadata,\n },\n namedExpressions: {\n workbookLevel: new Map(\n namedExpressions.workbookExpressions.get(workbookName) || []\n ),\n sheetLevel: new Map(),\n },\n tables: new Map(deps.tableManager.getTables(workbookName)),\n conditionalStyles: deps.styleManager\n .getAllConditionalStyles()\n .filter((s) => s.areas.some((a) => a.workbookName === workbookName)),\n cellStyles: deps.styleManager\n .getAllCellStyles()\n .filter((s) => s.areas.some((a) => a.workbookName === workbookName)),\n };\n\n // Capture sheet-level named expressions\n const sheetExpressions = namedExpressions.sheetExpressions.get(workbookName);\n if (sheetExpressions) {\n for (const [sheetName, expressions] of sheetExpressions) {\n snapshot.namedExpressions.sheetLevel.set(sheetName, new Map(expressions));\n }\n }\n\n return snapshot;\n}\n\n/**\n * Remove a workbook and all its associated data.\n */\nfunction removeWorkbook(\n deps: StructureCommandDeps,\n workbookName: string\n): void {\n deps.workbookManager.removeWorkbook(workbookName);\n deps.namedExpressionManager.removeWorkbook(workbookName);\n deps.tableManager.removeWorkbook(workbookName);\n deps.styleManager.removeWorkbookStyles(workbookName);\n deps.referenceManager.invalidateWorkbook(workbookName);\n}\n\n/**\n * Rename a workbook across all managers.\n */\nfunction renameWorkbookAcrossManagers(\n deps: StructureCommandDeps,\n oldName: string,\n newName: string\n): void {\n deps.workbookManager.renameWorkbook({\n workbookName: oldName,\n newWorkbookName: newName,\n });\n deps.namedExpressionManager.renameWorkbook({\n workbookName: oldName,\n newWorkbookName: newName,\n });\n deps.tableManager.updateTablesForWorkbookRename({\n workbookName: oldName,\n newWorkbookName: newName,\n });\n deps.styleManager.updateWorkbookName(oldName, newName);\n deps.workbookManager.updateAllFormulas((formula) =>\n deps.renameWorkbookInFormula({\n formula,\n oldWorkbookName: oldName,\n newWorkbookName: newName,\n })\n );\n deps.referenceManager.updateWorkbookName(oldName, newName);\n deps.apiSchemaManager.updateForWorkbookRename(oldName, newName);\n}\n\n/**\n * Rename a sheet across all managers.\n */\nfunction renameSheetAcrossManagers(\n deps: StructureCommandDeps,\n opts: { workbookName: string; sheetName: string; newSheetName: string }\n): void {\n deps.workbookManager.renameSheet(opts);\n deps.namedExpressionManager.renameSheet(opts);\n deps.tableManager.updateTablesForSheetRename(opts);\n deps.styleManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n deps.workbookManager.updateAllFormulas((formula) =>\n deps.renameSheetInFormula({\n formula,\n oldSheetName: opts.sheetName,\n newSheetName: opts.newSheetName,\n })\n );\n deps.referenceManager.updateSheetName(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n deps.apiSchemaManager.updateForSheetRename(\n opts.workbookName,\n opts.sheetName,\n opts.newSheetName\n );\n}\n\n/**\n * Restore tables from a snapshot.\n */\nfunction restoreTables(\n tableManager: TableManager,\n tables: Map<string, TableDefinition>,\n workbookName: string\n): void {\n for (const [tableName, table] of tables) {\n tableManager.addTable({\n workbookName,\n tableName,\n sheetName: table.sheetName,\n start: `${String.fromCharCode(65 + table.start.colIndex)}${\n table.start.rowIndex + 1\n }`,\n numRows: table.endRow,\n numCols: table.headers.size,\n getCellValue: () => undefined,\n });\n }\n}\n\n/**\n * Restore styles from a snapshot.\n */\nfunction restoreStyles(\n styleManager: StyleManager,\n conditionalStyles: ConditionalStyle[],\n cellStyles: DirectCellStyle[]\n): void {\n for (const style of conditionalStyles) {\n styleManager.addConditionalStyle(style);\n }\n for (const style of cellStyles) {\n styleManager.addCellStyle(style);\n }\n}\n\n/**\n * Command to remove a workbook.\n */\nexport class RemoveWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: WorkbookSnapshot | undefined;\n\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string\n ) {}\n\n execute(): void {\n this.snapshot = captureWorkbookSnapshot(this.deps, this.workbookName);\n removeWorkbook(this.deps, this.workbookName);\n }\n\n undo(): void {\n if (!this.snapshot) return;\n\n // Restore workbook structure\n this.deps.workbookManager.addWorkbook(this.workbookName);\n this.deps.namedExpressionManager.addWorkbook(this.workbookName);\n this.deps.tableManager.addWorkbook(this.workbookName);\n\n // Restore sheets\n for (const [sheetName, sheet] of this.snapshot.workbook.sheets) {\n this.deps.workbookManager.addSheet({\n workbookName: this.workbookName,\n sheetName,\n });\n this.deps.namedExpressionManager.addSheet({\n workbookName: this.workbookName,\n sheetName,\n });\n this.deps.workbookManager.setSheetContent(\n { workbookName: this.workbookName, sheetName },\n sheet.content\n );\n }\n\n // Restore named expressions\n for (const [name, expr] of this.snapshot.namedExpressions.workbookLevel) {\n this.deps.namedExpressionManager.addNamedExpression({\n expressionName: name,\n expression: expr.expression,\n workbookName: this.workbookName,\n });\n }\n for (const [sheetName, expressions] of this.snapshot.namedExpressions.sheetLevel) {\n for (const [name, expr] of expressions) {\n this.deps.namedExpressionManager.addNamedExpression({\n expressionName: name,\n expression: expr.expression,\n workbookName: this.workbookName,\n sheetName,\n });\n }\n }\n\n // Restore tables and styles\n restoreTables(this.deps.tableManager, this.snapshot.tables, this.workbookName);\n restoreStyles(this.deps.styleManager, this.snapshot.conditionalStyles, this.snapshot.cellStyles);\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.REMOVE_WORKBOOK,\n payload: { workbookName: this.workbookName },\n };\n }\n}\n\n/**\n * Command to rename a workbook.\n */\nexport class RenameWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n\n constructor(\n private deps: StructureCommandDeps,\n private workbookName: string,\n private newWorkbookName: string\n ) {}\n\n execute(): void {\n renameWorkbookAcrossManagers(this.deps, this.workbookName, this.newWorkbookName);\n }\n\n undo(): void {\n renameWorkbookAcrossManagers(this.deps, this.newWorkbookName, this.workbookName);\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RENAME_WORKBOOK,\n payload: {\n workbookName: this.workbookName,\n newWorkbookName: this.newWorkbookName,\n },\n };\n }\n}\n\n/**\n * Command to clone a workbook.\n * Undo simply removes the cloned workbook.\n */\nexport class CloneWorkbookCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n\n constructor(\n private deps: StructureCommandDeps,\n private fromWorkbookName: string,\n private toWorkbookName: string\n ) {}\n\n execute(): void {\n const {\n workbookManager,\n namedExpressionManager,\n tableManager,\n styleManager,\n renameWorkbookInFormula,\n } = this.deps;\n\n // Check if source workbook exists\n const sourceWorkbook = workbookManager\n .getWorkbooks()\n .get(this.fromWorkbookName);\n if (!sourceWorkbook) {\n throw new Error(`Source workbook \"${this.fromWorkbookName}\" not found`);\n }\n\n // Check if target workbook name already exists\n if (workbookManager.getWorkbooks().has(this.toWorkbookName)) {\n throw new Error(\n `Target workbook \"${this.toWorkbookName}\" already exists`\n );\n }\n\n // Create new workbook\n workbookManager.addWorkbook(this.toWorkbookName);\n namedExpressionManager.addWorkbook(this.toWorkbookName);\n tableManager.addWorkbook(this.toWorkbookName);\n\n // Clone all sheets from source workbook\n for (const [sheetName, sheet] of sourceWorkbook.sheets) {\n // Add sheet to target workbook\n workbookManager.addSheet({\n workbookName: this.toWorkbookName,\n sheetName: sheetName,\n });\n namedExpressionManager.addSheet({\n workbookName: this.toWorkbookName,\n sheetName: sheetName,\n });\n\n // Copy all cell content\n workbookManager.setSheetContent(\n { workbookName: this.toWorkbookName, sheetName: sheetName },\n new Map(sheet.content)\n );\n\n // Copy all cell metadata\n const targetSheet = workbookManager.getSheet({\n workbookName: this.toWorkbookName,\n sheetName: sheetName,\n });\n if (targetSheet) {\n targetSheet.metadata = new Map(sheet.metadata);\n\n // Copy sheet metadata\n if (sheet.sheetMetadata !== undefined) {\n targetSheet.sheetMetadata = structuredClone(sheet.sheetMetadata);\n }\n }\n }\n\n // Copy workbook metadata\n const targetWorkbook = workbookManager\n .getWorkbooks()\n .get(this.toWorkbookName);\n if (targetWorkbook && sourceWorkbook.workbookMetadata !== undefined) {\n targetWorkbook.workbookMetadata = structuredClone(\n sourceWorkbook.workbookMetadata\n );\n }\n\n // Clone workbook-scoped named expressions\n const allExpressions = namedExpressionManager.getNamedExpressions();\n const sourceWorkbookExpressions = allExpressions.workbookExpressions.get(\n this.fromWorkbookName\n );\n if (sourceWorkbookExpressions) {\n for (const [expressionName, expression] of sourceWorkbookExpressions) {\n namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: this.toWorkbookName,\n });\n }\n }\n\n // Clone sheet-scoped named expressions\n const sourceSheetExpressions = allExpressions.sheetExpressions.get(\n this.fromWorkbookName\n );\n if (sourceSheetExpressions) {\n for (const [sheetName, sheetExpressions] of sourceSheetExpressions) {\n for (const [expressionName, expression] of sheetExpressions) {\n namedExpressionManager.addNamedExpression({\n expressionName,\n expression: expression.expression,\n workbookName: this.toWorkbookName,\n sheetName,\n });\n }\n }\n }\n\n // Clone tables\n const sourceTables = tableManager.tables.get(this.fromWorkbookName);\n if (sourceTables) {\n for (const [tableName] of sourceTables) {\n tableManager.copyTable(\n { workbookName: this.fromWorkbookName, tableName },\n { workbookName: this.toWorkbookName, tableName }\n );\n }\n }\n\n // Clone conditional styles\n const allConditionalStyles = styleManager.getAllConditionalStyles();\n for (const style of allConditionalStyles) {\n if (\n style.areas.some((area) => area.workbookName === this.fromWorkbookName)\n ) {\n const newStyle: ConditionalStyle = {\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === this.fromWorkbookName\n ? { ...area, workbookName: this.toWorkbookName }\n : area\n ),\n };\n styleManager.addConditionalStyle(newStyle);\n }\n }\n\n // Clone cell styles\n const allCellStyles = styleManager.getAllCellStyles();\n for (const style of allCellStyles) {\n if (\n style.areas.some((area) => area.workbookName === this.fromWorkbookName)\n ) {\n const newStyle: DirectCellStyle = {\n ...style,\n areas: style.areas.map((area) =>\n area.workbookName === this.fromWorkbookName\n ? { ...area, workbookName: this.toWorkbookName }\n : area\n ),\n };\n styleManager.addCellStyle(newStyle);\n }\n }\n\n // Update formulas in cloned workbook that reference the source workbook\n workbookManager.updateFormulasForWorkbook(this.toWorkbookName, (formula) =>\n renameWorkbookInFormula({\n formula,\n oldWorkbookName: this.fromWorkbookName,\n newWorkbookName: this.toWorkbookName,\n })\n );\n }\n\n undo(): void {\n // Undo clone = remove the cloned workbook\n removeWorkbook(this.deps, this.toWorkbookName);\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.CLONE_WORKBOOK,\n payload: {\n fromWorkbookName: this.fromWorkbookName,\n toWorkbookName: this.toWorkbookName,\n },\n };\n }\n}\n\n// ============================================================================\n// Sheet Commands\n// ============================================================================\n\n/**\n * Command to add a sheet.\n */\nexport class AddSheetCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n\n constructor(\n private deps: StructureCommandDeps,\n private opts: { workbookName: string; sheetName: string }\n ) {}\n\n execute(): void {\n this.deps.workbookManager.addSheet(this.opts);\n this.deps.namedExpressionManager.addSheet(this.opts);\n }\n\n undo(): void {\n this.deps.workbookManager.removeSheet(this.opts);\n this.deps.namedExpressionManager.removeSheet(this.opts);\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.ADD_SHEET,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Captured state of a sheet for undo purposes.\n */\ninterface SheetSnapshot {\n sheet: Sheet;\n namedExpressions: Map<string, NamedExpression>;\n tables: Map<string, TableDefinition>;\n conditionalStyles: ConditionalStyle[];\n cellStyles: DirectCellStyle[];\n}\n\n/**\n * Command to remove a sheet.\n */\nexport class RemoveSheetCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n private snapshot: SheetSnapshot | undefined;\n\n constructor(\n private deps: StructureCommandDeps,\n private opts: { workbookName: string; sheetName: string }\n ) {}\n\n execute(): void {\n // Capture sheet state before removal\n const sheet = this.deps.workbookManager.getSheet(this.opts);\n if (sheet) {\n const namedExpressions =\n this.deps.namedExpressionManager.getNamedExpressions();\n const sheetExpressions =\n namedExpressions.sheetExpressions\n .get(this.opts.workbookName)\n ?.get(this.opts.sheetName) || new Map();\n\n // Get tables on this sheet\n const allTables = this.deps.tableManager.getTables(\n this.opts.workbookName\n );\n const sheetTables = new Map<string, TableDefinition>();\n for (const [name, table] of allTables) {\n if (table.sheetName === this.opts.sheetName) {\n sheetTables.set(name, table);\n }\n }\n\n this.snapshot = {\n sheet: {\n name: sheet.name,\n index: sheet.index,\n content: new Map(sheet.content),\n metadata: new Map(sheet.metadata),\n sheetMetadata: sheet.sheetMetadata,\n },\n namedExpressions: new Map(sheetExpressions),\n tables: sheetTables,\n conditionalStyles: this.deps.styleManager\n .getAllConditionalStyles()\n .filter((s) =>\n s.areas.some(\n (a) =>\n a.workbookName === this.opts.workbookName &&\n a.sheetName === this.opts.sheetName\n )\n ),\n cellStyles: this.deps.styleManager\n .getAllCellStyles()\n .filter((s) =>\n s.areas.some(\n (a) =>\n a.workbookName === this.opts.workbookName &&\n a.sheetName === this.opts.sheetName\n )\n ),\n };\n }\n\n // Execute removal\n this.deps.workbookManager.removeSheet(this.opts);\n this.deps.namedExpressionManager.removeSheet(this.opts);\n this.deps.tableManager.removeSheet(this.opts);\n this.deps.styleManager.removeSheetStyles(\n this.opts.workbookName,\n this.opts.sheetName\n );\n this.deps.referenceManager.invalidateSheet(\n this.opts.workbookName,\n this.opts.sheetName\n );\n }\n\n undo(): void {\n if (!this.snapshot) return;\n\n // Restore sheet structure\n this.deps.workbookManager.addSheet(this.opts);\n this.deps.namedExpressionManager.addSheet(this.opts);\n this.deps.workbookManager.setSheetContent(this.opts, this.snapshot.sheet.content);\n\n // Restore named expressions\n for (const [name, expr] of this.snapshot.namedExpressions) {\n this.deps.namedExpressionManager.addNamedExpression({\n expressionName: name,\n expression: expr.expression,\n workbookName: this.opts.workbookName,\n sheetName: this.opts.sheetName,\n });\n }\n\n // Restore tables and styles\n restoreTables(this.deps.tableManager, this.snapshot.tables, this.opts.workbookName);\n restoreStyles(this.deps.styleManager, this.snapshot.conditionalStyles, this.snapshot.cellStyles);\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.REMOVE_SHEET,\n payload: this.opts,\n };\n }\n}\n\n/**\n * Command to rename a sheet.\n */\nexport class RenameSheetCommand implements EngineCommand {\n readonly requiresReevaluation = true;\n\n constructor(\n private deps: StructureCommandDeps,\n private opts: {\n workbookName: string;\n sheetName: string;\n newSheetName: string;\n }\n ) {}\n\n execute(): void {\n renameSheetAcrossManagers(this.deps, this.opts);\n }\n\n undo(): void {\n renameSheetAcrossManagers(this.deps, {\n workbookName: this.opts.workbookName,\n sheetName: this.opts.newSheetName,\n newSheetName: this.opts.sheetName,\n });\n }\n\n toAction(): EngineAction {\n return {\n type: ActionTypes.RENAME_SHEET,\n payload: this.opts,\n };\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "39C98D842B86633B64756E2164756E21",
9
+ "names": []
10
+ }