@ricsam/formula-engine 0.2.8 → 0.2.9
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.
- package/README.md +1 -3
- package/dist/cjs/core/engine.cjs +515 -166
- package/dist/cjs/core/engine.cjs.map +3 -3
- package/dist/cjs/core/managers/dependency-manager.cjs.map +2 -2
- package/dist/cjs/core/managers/evaluation-manager.cjs.map +1 -1
- package/dist/cjs/core/mutation-invalidation.cjs +241 -0
- package/dist/cjs/core/mutation-invalidation.cjs.map +10 -0
- package/dist/cjs/lib.cjs +2 -13
- package/dist/cjs/lib.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/core/engine.mjs +529 -207
- package/dist/mjs/core/engine.mjs.map +3 -3
- package/dist/mjs/core/managers/dependency-manager.mjs.map +2 -2
- package/dist/mjs/core/managers/evaluation-manager.mjs.map +1 -1
- package/dist/mjs/core/mutation-invalidation.mjs +201 -0
- package/dist/mjs/core/mutation-invalidation.mjs.map +10 -0
- package/dist/mjs/lib.mjs +2 -13
- package/dist/mjs/lib.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/types/core/engine.d.ts +17 -135
- package/dist/types/core/managers/dependency-manager.d.ts +1 -1
- package/dist/types/core/managers/evaluation-manager.d.ts +1 -1
- package/dist/types/core/mutation-invalidation.d.ts +46 -0
- package/dist/types/lib.d.ts +0 -8
- package/package.json +1 -1
- package/dist/cjs/core/commands/command-executor.cjs +0 -149
- package/dist/cjs/core/commands/command-executor.cjs.map +0 -10
- package/dist/cjs/core/commands/content-commands.cjs +0 -857
- package/dist/cjs/core/commands/content-commands.cjs.map +0 -10
- package/dist/cjs/core/commands/metadata-commands.cjs +0 -160
- package/dist/cjs/core/commands/metadata-commands.cjs.map +0 -10
- package/dist/cjs/core/commands/named-expression-commands.cjs +0 -363
- package/dist/cjs/core/commands/named-expression-commands.cjs.map +0 -10
- package/dist/cjs/core/commands/structure-commands.cjs +0 -696
- package/dist/cjs/core/commands/structure-commands.cjs.map +0 -10
- package/dist/cjs/core/commands/style-commands.cjs +0 -229
- package/dist/cjs/core/commands/style-commands.cjs.map +0 -10
- package/dist/cjs/core/commands/table-commands.cjs +0 -495
- package/dist/cjs/core/commands/table-commands.cjs.map +0 -10
- package/dist/cjs/core/commands/types.cjs +0 -99
- package/dist/cjs/core/commands/types.cjs.map +0 -10
- package/dist/cjs/core/managers/schema-manager.cjs +0 -374
- package/dist/cjs/core/managers/schema-manager.cjs.map +0 -10
- package/dist/cjs/core/schema/cell-orm.cjs +0 -76
- package/dist/cjs/core/schema/cell-orm.cjs.map +0 -10
- package/dist/cjs/core/schema/grid-orm.cjs +0 -125
- package/dist/cjs/core/schema/grid-orm.cjs.map +0 -10
- package/dist/cjs/core/schema/schema-builder.cjs +0 -74
- package/dist/cjs/core/schema/schema-builder.cjs.map +0 -10
- package/dist/cjs/core/schema/schema-helpers.cjs +0 -200
- package/dist/cjs/core/schema/schema-helpers.cjs.map +0 -10
- package/dist/cjs/core/schema/schema.cjs +0 -91
- package/dist/cjs/core/schema/schema.cjs.map +0 -10
- package/dist/cjs/core/schema/table-orm.cjs +0 -189
- package/dist/cjs/core/schema/table-orm.cjs.map +0 -10
- package/dist/mjs/core/commands/command-executor.mjs +0 -109
- package/dist/mjs/core/commands/command-executor.mjs.map +0 -10
- package/dist/mjs/core/commands/content-commands.mjs +0 -821
- package/dist/mjs/core/commands/content-commands.mjs.map +0 -10
- package/dist/mjs/core/commands/metadata-commands.mjs +0 -120
- package/dist/mjs/core/commands/metadata-commands.mjs.map +0 -10
- package/dist/mjs/core/commands/named-expression-commands.mjs +0 -323
- package/dist/mjs/core/commands/named-expression-commands.mjs.map +0 -10
- package/dist/mjs/core/commands/structure-commands.mjs +0 -661
- package/dist/mjs/core/commands/structure-commands.mjs.map +0 -10
- package/dist/mjs/core/commands/style-commands.mjs +0 -189
- package/dist/mjs/core/commands/style-commands.mjs.map +0 -10
- package/dist/mjs/core/commands/table-commands.mjs +0 -459
- package/dist/mjs/core/commands/table-commands.mjs.map +0 -10
- package/dist/mjs/core/commands/types.mjs +0 -59
- package/dist/mjs/core/commands/types.mjs.map +0 -10
- package/dist/mjs/core/managers/schema-manager.mjs +0 -334
- package/dist/mjs/core/managers/schema-manager.mjs.map +0 -10
- package/dist/mjs/core/schema/cell-orm.mjs +0 -35
- package/dist/mjs/core/schema/cell-orm.mjs.map +0 -10
- package/dist/mjs/core/schema/grid-orm.mjs +0 -84
- package/dist/mjs/core/schema/grid-orm.mjs.map +0 -10
- package/dist/mjs/core/schema/schema-builder.mjs +0 -34
- package/dist/mjs/core/schema/schema-builder.mjs.map +0 -10
- package/dist/mjs/core/schema/schema-helpers.mjs +0 -160
- package/dist/mjs/core/schema/schema-helpers.mjs.map +0 -10
- package/dist/mjs/core/schema/schema.mjs +0 -51
- package/dist/mjs/core/schema/schema.mjs.map +0 -10
- package/dist/mjs/core/schema/table-orm.mjs +0 -156
- package/dist/mjs/core/schema/table-orm.mjs.map +0 -10
- package/dist/types/core/commands/command-executor.d.ts +0 -81
- package/dist/types/core/commands/content-commands.d.ts +0 -172
- package/dist/types/core/commands/metadata-commands.d.ts +0 -55
- package/dist/types/core/commands/named-expression-commands.d.ts +0 -130
- package/dist/types/core/commands/structure-commands.d.ts +0 -155
- package/dist/types/core/commands/style-commands.d.ts +0 -76
- package/dist/types/core/commands/table-commands.d.ts +0 -119
- package/dist/types/core/commands/types.d.ts +0 -143
- package/dist/types/core/managers/schema-manager.d.ts +0 -142
- package/dist/types/core/schema/cell-orm.d.ts +0 -33
- package/dist/types/core/schema/grid-orm.d.ts +0 -63
- package/dist/types/core/schema/schema-builder.d.ts +0 -16
- package/dist/types/core/schema/schema-helpers.d.ts +0 -49
- package/dist/types/core/schema/schema.d.ts +0 -167
- package/dist/types/core/schema/schema.type-test.d.ts +0 -1
- package/dist/types/core/schema/table-orm.d.ts +0 -46
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
function __accessProp(key) {
|
|
6
|
-
return this[key];
|
|
7
|
-
}
|
|
8
|
-
var __toCommonJS = (from) => {
|
|
9
|
-
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
10
|
-
if (entry)
|
|
11
|
-
return entry;
|
|
12
|
-
entry = __defProp({}, "__esModule", { value: true });
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (var key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(entry, key))
|
|
16
|
-
__defProp(entry, key, {
|
|
17
|
-
get: __accessProp.bind(from, key),
|
|
18
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
__moduleCache.set(from, entry);
|
|
22
|
-
return entry;
|
|
23
|
-
};
|
|
24
|
-
var __moduleCache;
|
|
25
|
-
var __returnValue = (v) => v;
|
|
26
|
-
function __exportSetter(name, newValue) {
|
|
27
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
28
|
-
}
|
|
29
|
-
var __export = (target, all) => {
|
|
30
|
-
for (var name in all)
|
|
31
|
-
__defProp(target, name, {
|
|
32
|
-
get: all[name],
|
|
33
|
-
enumerable: true,
|
|
34
|
-
configurable: true,
|
|
35
|
-
set: __exportSetter.bind(all, name)
|
|
36
|
-
});
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
// src/core/schema/table-orm.ts
|
|
40
|
-
var exports_table_orm = {};
|
|
41
|
-
__export(exports_table_orm, {
|
|
42
|
-
TableOrm: () => TableOrm
|
|
43
|
-
});
|
|
44
|
-
module.exports = __toCommonJS(exports_table_orm);
|
|
45
|
-
var import_schema_helpers = require("./schema-helpers.cjs");
|
|
46
|
-
|
|
47
|
-
class TableOrm {
|
|
48
|
-
engine;
|
|
49
|
-
workbookName;
|
|
50
|
-
tableName;
|
|
51
|
-
headers;
|
|
52
|
-
namespace;
|
|
53
|
-
constructor(engine, workbookName, tableName, headers, namespace) {
|
|
54
|
-
this.engine = engine;
|
|
55
|
-
this.workbookName = workbookName;
|
|
56
|
-
this.tableName = tableName;
|
|
57
|
-
this.headers = headers;
|
|
58
|
-
this.namespace = namespace;
|
|
59
|
-
}
|
|
60
|
-
getTable() {
|
|
61
|
-
const table = this.engine._tableManager.getTable({
|
|
62
|
-
workbookName: this.workbookName,
|
|
63
|
-
name: this.tableName
|
|
64
|
-
});
|
|
65
|
-
if (!table) {
|
|
66
|
-
throw new Error(`Table "${this.tableName}" not found in workbook "${this.workbookName}"`);
|
|
67
|
-
}
|
|
68
|
-
return table;
|
|
69
|
-
}
|
|
70
|
-
findWhere(filter) {
|
|
71
|
-
const table = this.getTable();
|
|
72
|
-
for (const { rowIndex, isEmpty } of import_schema_helpers.iterateTableRows(this.engine, table)) {
|
|
73
|
-
if (isEmpty)
|
|
74
|
-
continue;
|
|
75
|
-
try {
|
|
76
|
-
const item = import_schema_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
|
|
77
|
-
if (import_schema_helpers.matchesFilter(item, filter)) {
|
|
78
|
-
return item;
|
|
79
|
-
}
|
|
80
|
-
} catch {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
findAllWhere(filter) {
|
|
87
|
-
const table = this.getTable();
|
|
88
|
-
const results = [];
|
|
89
|
-
for (const { rowIndex, isEmpty } of import_schema_helpers.iterateTableRows(this.engine, table)) {
|
|
90
|
-
if (isEmpty)
|
|
91
|
-
continue;
|
|
92
|
-
try {
|
|
93
|
-
const item = import_schema_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
|
|
94
|
-
if (import_schema_helpers.matchesFilter(item, filter)) {
|
|
95
|
-
results.push(item);
|
|
96
|
-
}
|
|
97
|
-
} catch {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return results;
|
|
102
|
-
}
|
|
103
|
-
append(item) {
|
|
104
|
-
const table = this.getTable();
|
|
105
|
-
const nextRow = import_schema_helpers.getNextEmptyRow(this.engine, table);
|
|
106
|
-
const { values, metadata } = import_schema_helpers.objectToRowValues(item, this.headers);
|
|
107
|
-
for (const [colOffset, value] of values) {
|
|
108
|
-
const cellAddress = {
|
|
109
|
-
workbookName: table.workbookName,
|
|
110
|
-
sheetName: table.sheetName,
|
|
111
|
-
colIndex: table.start.colIndex + colOffset,
|
|
112
|
-
rowIndex: nextRow
|
|
113
|
-
};
|
|
114
|
-
this.engine.setCellContent(cellAddress, value);
|
|
115
|
-
const cellMetadata = metadata.get(colOffset);
|
|
116
|
-
if (cellMetadata !== undefined) {
|
|
117
|
-
this.engine.setCellMetadata(cellAddress, cellMetadata);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return item;
|
|
121
|
-
}
|
|
122
|
-
updateWhere(filter, update) {
|
|
123
|
-
const table = this.getTable();
|
|
124
|
-
let updatedCount = 0;
|
|
125
|
-
for (const { rowIndex, isEmpty } of import_schema_helpers.iterateTableRows(this.engine, table)) {
|
|
126
|
-
if (isEmpty)
|
|
127
|
-
continue;
|
|
128
|
-
try {
|
|
129
|
-
const item = import_schema_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
|
|
130
|
-
if (import_schema_helpers.matchesFilter(item, filter)) {
|
|
131
|
-
const { values, metadata } = import_schema_helpers.objectToRowValues(update, this.headers);
|
|
132
|
-
for (const [colOffset, value] of values) {
|
|
133
|
-
const cellAddress = {
|
|
134
|
-
workbookName: table.workbookName,
|
|
135
|
-
sheetName: table.sheetName,
|
|
136
|
-
colIndex: table.start.colIndex + colOffset,
|
|
137
|
-
rowIndex
|
|
138
|
-
};
|
|
139
|
-
this.engine.setCellContent(cellAddress, value);
|
|
140
|
-
const cellMetadata = metadata.get(colOffset);
|
|
141
|
-
if (cellMetadata !== undefined) {
|
|
142
|
-
this.engine.setCellMetadata(cellAddress, cellMetadata);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
updatedCount++;
|
|
146
|
-
}
|
|
147
|
-
} catch {
|
|
148
|
-
continue;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return updatedCount;
|
|
152
|
-
}
|
|
153
|
-
removeWhere(filter) {
|
|
154
|
-
const table = this.getTable();
|
|
155
|
-
let removedCount = 0;
|
|
156
|
-
const rowsToRemove = [];
|
|
157
|
-
for (const { rowIndex, isEmpty } of import_schema_helpers.iterateTableRows(this.engine, table)) {
|
|
158
|
-
if (isEmpty)
|
|
159
|
-
continue;
|
|
160
|
-
try {
|
|
161
|
-
const item = import_schema_helpers.rowToObject(this.engine, table, rowIndex, this.headers, (cell) => this.engine.getCellMetadata(cell));
|
|
162
|
-
if (import_schema_helpers.matchesFilter(item, filter)) {
|
|
163
|
-
rowsToRemove.push(rowIndex);
|
|
164
|
-
}
|
|
165
|
-
} catch {
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
for (const rowIndex of rowsToRemove.reverse()) {
|
|
170
|
-
for (const header of Object.values(this.headers)) {
|
|
171
|
-
const cellAddress = {
|
|
172
|
-
workbookName: table.workbookName,
|
|
173
|
-
sheetName: table.sheetName,
|
|
174
|
-
colIndex: table.start.colIndex + header.index,
|
|
175
|
-
rowIndex
|
|
176
|
-
};
|
|
177
|
-
this.engine.setCellContent(cellAddress, undefined);
|
|
178
|
-
}
|
|
179
|
-
removedCount++;
|
|
180
|
-
}
|
|
181
|
-
return removedCount;
|
|
182
|
-
}
|
|
183
|
-
count() {
|
|
184
|
-
const table = this.getTable();
|
|
185
|
-
return import_schema_helpers.getTableRowCount(this.engine, table);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
//# debugId=03DA24A03255D08564756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/schema/table-orm.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * TableOrm - Object-Relational Mapping for table data\n *\n * Provides CRUD operations for table data with type-safe access.\n * Used as the `this` context for custom table API methods.\n */\n\nimport type { CellAddress, SerializedCellValue, TableDefinition } from \"../types.cjs\";\nimport type { FormulaEngine } from \"../engine.cjs\";\nimport {\n rowToObject,\n objectToRowValues,\n matchesFilter,\n getTableRowCount,\n getNextEmptyRow,\n iterateTableRows,\n type TableSchemaHeaders,\n} from \"./schema-helpers.cjs\";\n\nexport class TableOrm<TItem extends Record<string, unknown>> {\n constructor(\n private engine: FormulaEngine<any, any>,\n private workbookName: string,\n private tableName: string,\n private headers: TableSchemaHeaders,\n private namespace: string\n ) {}\n\n /**\n * Get the table definition from the engine\n */\n private getTable(): TableDefinition {\n const table = this.engine._tableManager.getTable({\n workbookName: this.workbookName,\n name: this.tableName,\n });\n\n if (!table) {\n throw new Error(\n `Table \"${this.tableName}\" not found in workbook \"${this.workbookName}\"`\n );\n }\n\n return table;\n }\n\n /**\n * Find the first row matching the filter\n */\n findWhere(filter: Partial<TItem>): TItem | undefined {\n const table = this.getTable();\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n return item;\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n return undefined;\n }\n\n /**\n * Find all rows matching the filter\n */\n findAllWhere(filter: Partial<TItem>): TItem[] {\n const table = this.getTable();\n const results: TItem[] = [];\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n results.push(item);\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n return results;\n }\n\n /**\n * Append a new row to the table\n */\n append(item: TItem): TItem {\n const table = this.getTable();\n const nextRow = getNextEmptyRow(this.engine, table);\n const { values, metadata } = objectToRowValues(item, this.headers);\n\n // Write each cell value and metadata\n for (const [colOffset, value] of values) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + colOffset,\n rowIndex: nextRow,\n };\n\n this.engine.setCellContent(cellAddress, value);\n const cellMetadata = metadata.get(colOffset);\n if (cellMetadata !== undefined) {\n this.engine.setCellMetadata(cellAddress, cellMetadata);\n }\n }\n\n return item;\n }\n\n /**\n * Update all rows matching the filter\n * Returns the number of rows updated\n */\n updateWhere(filter: Partial<TItem>, update: Partial<TItem>): number {\n const table = this.getTable();\n let updatedCount = 0;\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n // Apply updates\n const { values, metadata } = objectToRowValues(update as TItem, this.headers);\n\n for (const [colOffset, value] of values) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + colOffset,\n rowIndex,\n };\n\n this.engine.setCellContent(cellAddress, value);\n const cellMetadata = metadata.get(colOffset);\n if (cellMetadata !== undefined) {\n this.engine.setCellMetadata(cellAddress, cellMetadata);\n }\n }\n\n updatedCount++;\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n return updatedCount;\n }\n\n /**\n * Remove all rows matching the filter\n * Returns the number of rows removed\n */\n removeWhere(filter: Partial<TItem>): number {\n const table = this.getTable();\n let removedCount = 0;\n\n // Collect rows to remove (in reverse order to avoid index shifting issues)\n const rowsToRemove: number[] = [];\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n rowsToRemove.push(rowIndex);\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n // Remove rows in reverse order\n for (const rowIndex of rowsToRemove.reverse()) {\n // Clear all cells in the row\n for (const header of Object.values(this.headers)) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + header.index,\n rowIndex,\n };\n\n this.engine.setCellContent(cellAddress, undefined);\n }\n\n removedCount++;\n }\n\n return removedCount;\n }\n\n /**\n * Get the count of data rows in the table\n */\n count(): number {\n const table = this.getTable();\n return getTableRowCount(this.engine, table);\n }\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,IARP;AAAA;AAUO,MAAM,SAAgD;AAAA,EAEjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EALV,WAAW,CACD,QACA,cACA,WACA,SACA,WACR;AAAA,IALQ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAMF,QAAQ,GAAoB;AAAA,IAClC,MAAM,QAAQ,KAAK,OAAO,cAAc,SAAS;AAAA,MAC/C,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,IAED,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,MACR,UAAU,KAAK,qCAAqC,KAAK,eAC3D;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAMT,SAAS,CAAC,QAA2C;AAAA,IACnD,MAAM,QAAQ,KAAK,SAAS;AAAA,IAE5B,aAAa,UAAU,aAAa,uCAAiB,KAAK,QAAQ,KAAK,GAAG;AAAA,MACxE,IAAI;AAAA,QAAS;AAAA,MAEb,IAAI;AAAA,QACF,MAAM,OAAO,kCACX,KAAK,QACL,OACA,UACA,KAAK,SACL,CAAC,SAAS,KAAK,OAAO,gBAAgB,IAAI,CAC5C;AAAA,QAEA,IAAI,oCAAc,MAAM,MAAM,GAAG;AAAA,UAC/B,OAAO;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QAEN;AAAA;AAAA,IAEJ;AAAA,IAEA;AAAA;AAAA,EAMF,YAAY,CAAC,QAAiC;AAAA,IAC5C,MAAM,QAAQ,KAAK,SAAS;AAAA,IAC5B,MAAM,UAAmB,CAAC;AAAA,IAE1B,aAAa,UAAU,aAAa,uCAAiB,KAAK,QAAQ,KAAK,GAAG;AAAA,MACxE,IAAI;AAAA,QAAS;AAAA,MAEb,IAAI;AAAA,QACF,MAAM,OAAO,kCACX,KAAK,QACL,OACA,UACA,KAAK,SACL,CAAC,SAAS,KAAK,OAAO,gBAAgB,IAAI,CAC5C;AAAA,QAEA,IAAI,oCAAc,MAAM,MAAM,GAAG;AAAA,UAC/B,QAAQ,KAAK,IAAI;AAAA,QACnB;AAAA,QACA,MAAM;AAAA,QAEN;AAAA;AAAA,IAEJ;AAAA,IAEA,OAAO;AAAA;AAAA,EAMT,MAAM,CAAC,MAAoB;AAAA,IACzB,MAAM,QAAQ,KAAK,SAAS;AAAA,IAC5B,MAAM,UAAU,sCAAgB,KAAK,QAAQ,KAAK;AAAA,IAClD,QAAQ,QAAQ,aAAa,wCAAkB,MAAM,KAAK,OAAO;AAAA,IAGjE,YAAY,WAAW,UAAU,QAAQ;AAAA,MACvC,MAAM,cAA2B;AAAA,QAC/B,cAAc,MAAM;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM,MAAM,WAAW;AAAA,QACjC,UAAU;AAAA,MACZ;AAAA,MAEA,KAAK,OAAO,eAAe,aAAa,KAAK;AAAA,MAC7C,MAAM,eAAe,SAAS,IAAI,SAAS;AAAA,MAC3C,IAAI,iBAAiB,WAAW;AAAA,QAC9B,KAAK,OAAO,gBAAgB,aAAa,YAAY;AAAA,MACvD;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAOT,WAAW,CAAC,QAAwB,QAAgC;AAAA,IAClE,MAAM,QAAQ,KAAK,SAAS;AAAA,IAC5B,IAAI,eAAe;AAAA,IAEnB,aAAa,UAAU,aAAa,uCAAiB,KAAK,QAAQ,KAAK,GAAG;AAAA,MACxE,IAAI;AAAA,QAAS;AAAA,MAEb,IAAI;AAAA,QACF,MAAM,OAAO,kCACX,KAAK,QACL,OACA,UACA,KAAK,SACL,CAAC,SAAS,KAAK,OAAO,gBAAgB,IAAI,CAC5C;AAAA,QAEA,IAAI,oCAAc,MAAM,MAAM,GAAG;AAAA,UAE/B,QAAQ,QAAQ,aAAa,wCAAkB,QAAiB,KAAK,OAAO;AAAA,UAE5E,YAAY,WAAW,UAAU,QAAQ;AAAA,YACvC,MAAM,cAA2B;AAAA,cAC/B,cAAc,MAAM;AAAA,cACpB,WAAW,MAAM;AAAA,cACjB,UAAU,MAAM,MAAM,WAAW;AAAA,cACjC;AAAA,YACF;AAAA,YAEA,KAAK,OAAO,eAAe,aAAa,KAAK;AAAA,YAC7C,MAAM,eAAe,SAAS,IAAI,SAAS;AAAA,YAC3C,IAAI,iBAAiB,WAAW;AAAA,cAC9B,KAAK,OAAO,gBAAgB,aAAa,YAAY;AAAA,YACvD;AAAA,UACF;AAAA,UAEA;AAAA,QACF;AAAA,QACA,MAAM;AAAA,QAEN;AAAA;AAAA,IAEJ;AAAA,IAEA,OAAO;AAAA;AAAA,EAOT,WAAW,CAAC,QAAgC;AAAA,IAC1C,MAAM,QAAQ,KAAK,SAAS;AAAA,IAC5B,IAAI,eAAe;AAAA,IAGnB,MAAM,eAAyB,CAAC;AAAA,IAEhC,aAAa,UAAU,aAAa,uCAAiB,KAAK,QAAQ,KAAK,GAAG;AAAA,MACxE,IAAI;AAAA,QAAS;AAAA,MAEb,IAAI;AAAA,QACF,MAAM,OAAO,kCACX,KAAK,QACL,OACA,UACA,KAAK,SACL,CAAC,SAAS,KAAK,OAAO,gBAAgB,IAAI,CAC5C;AAAA,QAEA,IAAI,oCAAc,MAAM,MAAM,GAAG;AAAA,UAC/B,aAAa,KAAK,QAAQ;AAAA,QAC5B;AAAA,QACA,MAAM;AAAA,QAEN;AAAA;AAAA,IAEJ;AAAA,IAGA,WAAW,YAAY,aAAa,QAAQ,GAAG;AAAA,MAE7C,WAAW,UAAU,OAAO,OAAO,KAAK,OAAO,GAAG;AAAA,QAChD,MAAM,cAA2B;AAAA,UAC/B,cAAc,MAAM;AAAA,UACpB,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM,MAAM,WAAW,OAAO;AAAA,UACxC;AAAA,QACF;AAAA,QAEA,KAAK,OAAO,eAAe,aAAa,SAAS;AAAA,MACnD;AAAA,MAEA;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAMT,KAAK,GAAW;AAAA,IACd,MAAM,QAAQ,KAAK,SAAS;AAAA,IAC5B,OAAO,uCAAiB,KAAK,QAAQ,KAAK;AAAA;AAE9C;",
|
|
8
|
-
"debugId": "03DA24A03255D08564756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
// src/core/commands/command-executor.ts
|
|
2
|
-
import { emptyMutationInvalidation } from "./types.mjs";
|
|
3
|
-
|
|
4
|
-
class SchemaIntegrityError extends Error {
|
|
5
|
-
errors;
|
|
6
|
-
constructor(errors) {
|
|
7
|
-
const messages = errors.map((e) => e.message).join("; ");
|
|
8
|
-
super(`Schema integrity violation: ${messages}`);
|
|
9
|
-
this.errors = errors;
|
|
10
|
-
this.name = "SchemaIntegrityError";
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
class CommandExecutor {
|
|
15
|
-
evaluationManager;
|
|
16
|
-
eventManager;
|
|
17
|
-
validateAllSchemas;
|
|
18
|
-
undoStack = [];
|
|
19
|
-
redoStack = [];
|
|
20
|
-
actionLog = [];
|
|
21
|
-
constructor(evaluationManager, eventManager, validateAllSchemas) {
|
|
22
|
-
this.evaluationManager = evaluationManager;
|
|
23
|
-
this.eventManager = eventManager;
|
|
24
|
-
this.validateAllSchemas = validateAllSchemas;
|
|
25
|
-
}
|
|
26
|
-
execute(command, options = {}) {
|
|
27
|
-
const {
|
|
28
|
-
validate = false,
|
|
29
|
-
skipUndoStack = false,
|
|
30
|
-
skipEmitUpdate = false
|
|
31
|
-
} = options;
|
|
32
|
-
command.execute();
|
|
33
|
-
if (command.requiresReevaluation) {
|
|
34
|
-
this.evaluationManager.invalidateFromMutation(command.getInvalidationFootprint?.("execute") ?? emptyMutationInvalidation());
|
|
35
|
-
if (validate) {
|
|
36
|
-
const validation = this.validateAllSchemas();
|
|
37
|
-
if (!validation.valid) {
|
|
38
|
-
command.undo();
|
|
39
|
-
this.evaluationManager.invalidateFromMutation(command.getInvalidationFootprint?.("undo") ?? emptyMutationInvalidation());
|
|
40
|
-
throw new SchemaIntegrityError(validation.errors);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
if (!skipUndoStack) {
|
|
45
|
-
this.undoStack.push(command);
|
|
46
|
-
this.redoStack = [];
|
|
47
|
-
}
|
|
48
|
-
const action = command.toAction();
|
|
49
|
-
action.timestamp = Date.now();
|
|
50
|
-
this.actionLog.push(action);
|
|
51
|
-
if (!skipEmitUpdate) {
|
|
52
|
-
this.eventManager.emitUpdate();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
undo() {
|
|
56
|
-
const command = this.undoStack.pop();
|
|
57
|
-
if (!command) {
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
command.undo();
|
|
61
|
-
if (command.requiresReevaluation) {
|
|
62
|
-
this.evaluationManager.invalidateFromMutation(command.getInvalidationFootprint?.("undo") ?? emptyMutationInvalidation());
|
|
63
|
-
}
|
|
64
|
-
this.redoStack.push(command);
|
|
65
|
-
this.eventManager.emitUpdate();
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
redo() {
|
|
69
|
-
const command = this.redoStack.pop();
|
|
70
|
-
if (!command) {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
command.execute();
|
|
74
|
-
if (command.requiresReevaluation) {
|
|
75
|
-
this.evaluationManager.invalidateFromMutation(command.getInvalidationFootprint?.("execute") ?? emptyMutationInvalidation());
|
|
76
|
-
}
|
|
77
|
-
this.undoStack.push(command);
|
|
78
|
-
this.eventManager.emitUpdate();
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
canUndo() {
|
|
82
|
-
return this.undoStack.length > 0;
|
|
83
|
-
}
|
|
84
|
-
canRedo() {
|
|
85
|
-
return this.redoStack.length > 0;
|
|
86
|
-
}
|
|
87
|
-
getActionLog() {
|
|
88
|
-
return [...this.actionLog];
|
|
89
|
-
}
|
|
90
|
-
clearActionLog() {
|
|
91
|
-
this.actionLog = [];
|
|
92
|
-
}
|
|
93
|
-
clearHistory() {
|
|
94
|
-
this.undoStack = [];
|
|
95
|
-
this.redoStack = [];
|
|
96
|
-
}
|
|
97
|
-
getUndoStackSize() {
|
|
98
|
-
return this.undoStack.length;
|
|
99
|
-
}
|
|
100
|
-
getRedoStackSize() {
|
|
101
|
-
return this.redoStack.length;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
export {
|
|
105
|
-
SchemaIntegrityError,
|
|
106
|
-
CommandExecutor
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
//# debugId=B70925EB1761ED8F64756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/commands/command-executor.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * CommandExecutor - Executes commands with undo/redo support and schema validation\n *\n * Handles:\n * - Command execution with optional re-evaluation\n * - Schema validation after re-evaluation\n * - Automatic rollback on validation failure\n * - Undo/redo stacks\n * - Action serialization for persistence\n */\n\nimport type { SchemaDeclaration } from \"../schema/schema.mjs\";\nimport type { FormulaEngine } from \"../engine.mjs\";\nimport type { EvaluationManager } from \"../managers/evaluation-manager.mjs\";\nimport type { EventManager } from \"../managers/event-manager.mjs\";\nimport type { CellAddress, SerializedCellValue } from \"../types.mjs\";\nimport type {\n EngineCommand,\n EngineAction,\n ExecuteOptions,\n SchemaValidationResult,\n SchemaValidationErrorInfo,\n} from \"./types.mjs\";\nimport { emptyMutationInvalidation } from \"./types.mjs\";\n\n/**\n * Error thrown when schema integrity validation fails.\n * Contains all validation errors that occurred.\n */\nexport class SchemaIntegrityError extends Error {\n constructor(public errors: SchemaValidationErrorInfo[]) {\n const messages = errors.map((e) => e.message).join(\"; \");\n super(`Schema integrity violation: ${messages}`);\n this.name = \"SchemaIntegrityError\";\n }\n}\n\n/**\n * CommandExecutor manages command execution with validation and undo/redo support.\n */\nexport class CommandExecutor {\n private undoStack: EngineCommand[] = [];\n private redoStack: EngineCommand[] = [];\n private actionLog: EngineAction[] = [];\n\n constructor(\n private evaluationManager: EvaluationManager,\n private eventManager: EventManager,\n private validateAllSchemas: () => SchemaValidationResult\n ) {}\n\n /**\n * Execute a command with optional schema validation.\n *\n * @param command - The command to execute\n * @param options - Execution options\n * @throws SchemaIntegrityError if validation fails\n */\n execute(command: EngineCommand, options: ExecuteOptions = {}): void {\n const {\n validate = false,\n skipUndoStack = false,\n skipEmitUpdate = false,\n } = options;\n\n // Execute the command\n command.execute();\n\n // Re-evaluate if needed\n if (command.requiresReevaluation) {\n this.evaluationManager.invalidateFromMutation(\n command.getInvalidationFootprint?.(\"execute\") ??\n emptyMutationInvalidation()\n );\n\n // Validate schemas if requested\n if (validate) {\n const validation = this.validateAllSchemas();\n\n if (!validation.valid) {\n // Rollback: undo the command and re-evaluate\n command.undo();\n this.evaluationManager.invalidateFromMutation(\n command.getInvalidationFootprint?.(\"undo\") ??\n emptyMutationInvalidation()\n );\n throw new SchemaIntegrityError(validation.errors);\n }\n }\n }\n\n // Add to undo stack\n if (!skipUndoStack) {\n this.undoStack.push(command);\n // Clear redo stack on new action\n this.redoStack = [];\n }\n\n // Log the action\n const action = command.toAction();\n action.timestamp = Date.now();\n this.actionLog.push(action);\n\n // Emit update event\n if (!skipEmitUpdate) {\n this.eventManager.emitUpdate();\n }\n }\n\n /**\n * Undo the last command.\n *\n * @returns true if undo was performed, false if nothing to undo\n */\n undo(): boolean {\n const command = this.undoStack.pop();\n if (!command) {\n return false;\n }\n\n command.undo();\n\n if (command.requiresReevaluation) {\n this.evaluationManager.invalidateFromMutation(\n command.getInvalidationFootprint?.(\"undo\") ??\n emptyMutationInvalidation()\n );\n }\n\n this.redoStack.push(command);\n this.eventManager.emitUpdate();\n\n return true;\n }\n\n /**\n * Redo the last undone command.\n *\n * @returns true if redo was performed, false if nothing to redo\n */\n redo(): boolean {\n const command = this.redoStack.pop();\n if (!command) {\n return false;\n }\n\n command.execute();\n\n if (command.requiresReevaluation) {\n this.evaluationManager.invalidateFromMutation(\n command.getInvalidationFootprint?.(\"execute\") ??\n emptyMutationInvalidation()\n );\n }\n\n this.undoStack.push(command);\n this.eventManager.emitUpdate();\n\n return true;\n }\n\n /**\n * Check if undo is available.\n */\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n /**\n * Check if redo is available.\n */\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n /**\n * Get the action log for persistence/collaboration.\n */\n getActionLog(): EngineAction[] {\n return [...this.actionLog];\n }\n\n /**\n * Clear the action log.\n */\n clearActionLog(): void {\n this.actionLog = [];\n }\n\n /**\n * Clear undo/redo stacks.\n */\n clearHistory(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n\n /**\n * Get the number of commands in the undo stack.\n */\n getUndoStackSize(): number {\n return this.undoStack.length;\n }\n\n /**\n * Get the number of commands in the redo stack.\n */\n getRedoStackSize(): number {\n return this.redoStack.length;\n }\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "B70925EB1761ED8F64756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|