@ricsam/formula-engine 0.2.8 → 0.2.10
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 +41 -3
- package/dist/cjs/core/engine.cjs +551 -166
- package/dist/cjs/core/engine.cjs.map +3 -3
- package/dist/cjs/core/managers/dependency-manager.cjs +151 -67
- package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
- package/dist/cjs/core/managers/evaluation-manager.cjs.map +1 -1
- package/dist/cjs/core/managers/workbook-manager.cjs +197 -1
- package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
- package/dist/cjs/core/mutation-invalidation.cjs +241 -0
- package/dist/cjs/core/mutation-invalidation.cjs.map +10 -0
- package/dist/cjs/core/types.cjs.map +2 -2
- package/dist/cjs/core/workbook-renamer.cjs.map +1 -1
- package/dist/cjs/evaluator/formula-evaluator.cjs +22 -48
- package/dist/cjs/evaluator/formula-evaluator.cjs.map +3 -3
- package/dist/cjs/functions/math/sum/summation-utils.cjs +2 -2
- package/dist/cjs/functions/math/sum/summation-utils.cjs.map +2 -2
- package/dist/cjs/lib.cjs +2 -13
- package/dist/cjs/lib.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/parser/formatter.cjs +3 -4
- package/dist/cjs/parser/formatter.cjs.map +3 -3
- package/dist/cjs/parser/parser.cjs +24 -216
- package/dist/cjs/parser/parser.cjs.map +3 -3
- package/dist/mjs/core/engine.mjs +565 -207
- package/dist/mjs/core/engine.mjs.map +3 -3
- package/dist/mjs/core/managers/dependency-manager.mjs +151 -67
- package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
- package/dist/mjs/core/managers/evaluation-manager.mjs.map +1 -1
- package/dist/mjs/core/managers/workbook-manager.mjs +197 -1
- package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
- package/dist/mjs/core/mutation-invalidation.mjs +201 -0
- package/dist/mjs/core/mutation-invalidation.mjs.map +10 -0
- package/dist/mjs/core/types.mjs.map +2 -2
- package/dist/mjs/core/workbook-renamer.mjs.map +1 -1
- package/dist/mjs/evaluator/formula-evaluator.mjs +22 -48
- package/dist/mjs/evaluator/formula-evaluator.mjs.map +3 -3
- package/dist/mjs/functions/math/sum/summation-utils.mjs +2 -2
- package/dist/mjs/functions/math/sum/summation-utils.mjs.map +2 -2
- package/dist/mjs/lib.mjs +2 -13
- package/dist/mjs/lib.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/parser/formatter.mjs +3 -4
- package/dist/mjs/parser/formatter.mjs.map +3 -3
- package/dist/mjs/parser/parser.mjs +24 -216
- package/dist/mjs/parser/parser.mjs.map +3 -3
- package/dist/types/core/engine.d.ts +31 -135
- package/dist/types/core/managers/dependency-manager.d.ts +5 -1
- package/dist/types/core/managers/evaluation-manager.d.ts +1 -1
- package/dist/types/core/managers/workbook-manager.d.ts +23 -1
- package/dist/types/core/mutation-invalidation.d.ts +46 -0
- package/dist/types/core/types.d.ts +35 -0
- package/dist/types/lib.d.ts +0 -8
- package/dist/types/parser/parser.d.ts +4 -6
- 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,334 +0,0 @@
|
|
|
1
|
-
// src/core/managers/schema-manager.ts
|
|
2
|
-
import { cellAddressToKey } from "../utils.mjs";
|
|
3
|
-
|
|
4
|
-
class SchemaValidationError extends Error {
|
|
5
|
-
cellAddress;
|
|
6
|
-
originalError;
|
|
7
|
-
constructor(message, cellAddress, originalError) {
|
|
8
|
-
super(message);
|
|
9
|
-
this.cellAddress = cellAddress;
|
|
10
|
-
this.originalError = originalError;
|
|
11
|
-
this.name = "SchemaValidationError";
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
class SchemaManager {
|
|
16
|
-
tableManager;
|
|
17
|
-
schemas = new Map;
|
|
18
|
-
constructor(tableManager) {
|
|
19
|
-
this.tableManager = tableManager;
|
|
20
|
-
}
|
|
21
|
-
registerTableSchema(namespace, workbookName, tableName, headers) {
|
|
22
|
-
this.schemas.set(namespace, {
|
|
23
|
-
type: "table",
|
|
24
|
-
namespace,
|
|
25
|
-
workbookName,
|
|
26
|
-
tableName,
|
|
27
|
-
headers
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
registerCellSchema(namespace, cellAddress, parse) {
|
|
31
|
-
this.schemas.set(namespace, {
|
|
32
|
-
type: "cell",
|
|
33
|
-
namespace,
|
|
34
|
-
cellAddress,
|
|
35
|
-
parse
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
registerGridSchema(namespace, workbookName, sheetName, range, parse) {
|
|
39
|
-
this.schemas.set(namespace, {
|
|
40
|
-
type: "grid",
|
|
41
|
-
namespace,
|
|
42
|
-
workbookName,
|
|
43
|
-
sheetName,
|
|
44
|
-
range,
|
|
45
|
-
parse
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
getSchema(namespace) {
|
|
49
|
-
return this.schemas.get(namespace);
|
|
50
|
-
}
|
|
51
|
-
removeSchema(namespace) {
|
|
52
|
-
return this.schemas.delete(namespace);
|
|
53
|
-
}
|
|
54
|
-
hasSchemas() {
|
|
55
|
-
return this.schemas.size > 0;
|
|
56
|
-
}
|
|
57
|
-
isCellProtected(cell) {
|
|
58
|
-
for (const schema of this.schemas.values()) {
|
|
59
|
-
if (schema.type === "cell") {
|
|
60
|
-
if (schema.cellAddress.workbookName === cell.workbookName && schema.cellAddress.sheetName === cell.sheetName && schema.cellAddress.colIndex === cell.colIndex && schema.cellAddress.rowIndex === cell.rowIndex) {
|
|
61
|
-
return { schema };
|
|
62
|
-
}
|
|
63
|
-
} else if (schema.type === "table") {
|
|
64
|
-
const table = this.tableManager.getTable({
|
|
65
|
-
workbookName: schema.workbookName,
|
|
66
|
-
name: schema.tableName
|
|
67
|
-
});
|
|
68
|
-
if (!table)
|
|
69
|
-
continue;
|
|
70
|
-
if (cell.workbookName === table.workbookName && cell.sheetName === table.sheetName) {
|
|
71
|
-
const isInDataRange = this.isCellInTableDataRange(cell, table);
|
|
72
|
-
if (isInDataRange) {
|
|
73
|
-
const colOffset = cell.colIndex - table.start.colIndex;
|
|
74
|
-
const columnName = this.getColumnNameByIndex(schema.headers, colOffset);
|
|
75
|
-
return { schema, columnName };
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
} else if (schema.type === "grid") {
|
|
79
|
-
if (cell.workbookName === schema.workbookName && cell.sheetName === schema.sheetName && cell.colIndex >= schema.range.start.col && cell.colIndex <= schema.range.end.col && cell.rowIndex >= schema.range.start.row && cell.rowIndex <= schema.range.end.row) {
|
|
80
|
-
return { schema };
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
isCellInTableDataRange(cell, table) {
|
|
87
|
-
const { start, endRow, headers } = table;
|
|
88
|
-
const dataStartRow = start.rowIndex + 1;
|
|
89
|
-
const isInRowRange = endRow.type === "infinity" ? cell.rowIndex >= dataStartRow : cell.rowIndex >= dataStartRow && cell.rowIndex <= endRow.value;
|
|
90
|
-
const endColIndex = start.colIndex + headers.size - 1;
|
|
91
|
-
const isInColRange = cell.colIndex >= start.colIndex && cell.colIndex <= endColIndex;
|
|
92
|
-
return isInRowRange && isInColRange;
|
|
93
|
-
}
|
|
94
|
-
getColumnNameByIndex(headers, index) {
|
|
95
|
-
for (const [name, header] of Object.entries(headers)) {
|
|
96
|
-
if (header.index === index) {
|
|
97
|
-
return name;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
validateCellWrite(cell, value, metadata) {
|
|
103
|
-
if (value === undefined || value === "") {
|
|
104
|
-
return { valid: true };
|
|
105
|
-
}
|
|
106
|
-
const protection = this.isCellProtected(cell);
|
|
107
|
-
if (!protection) {
|
|
108
|
-
return { valid: true };
|
|
109
|
-
}
|
|
110
|
-
const { schema, columnName } = protection;
|
|
111
|
-
try {
|
|
112
|
-
if (schema.type === "cell") {
|
|
113
|
-
schema.parse(value, metadata);
|
|
114
|
-
} else if (schema.type === "table" && columnName) {
|
|
115
|
-
const header = schema.headers[columnName];
|
|
116
|
-
if (header) {
|
|
117
|
-
header.parse(value, metadata);
|
|
118
|
-
}
|
|
119
|
-
} else if (schema.type === "grid") {
|
|
120
|
-
schema.parse(value, metadata);
|
|
121
|
-
}
|
|
122
|
-
return { valid: true };
|
|
123
|
-
} catch (err) {
|
|
124
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
125
|
-
return {
|
|
126
|
-
valid: false,
|
|
127
|
-
error: `Schema validation failed for ${schema.namespace}${columnName ? `.${columnName}` : ""}: ${error.message}`,
|
|
128
|
-
originalError: error
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
validateSpillArea(origin, spillArea, getSpillValue, getMetadata) {
|
|
133
|
-
const startRow = spillArea.start.row;
|
|
134
|
-
const startCol = spillArea.start.col;
|
|
135
|
-
const endRow = spillArea.end.row.type === "number" ? spillArea.end.row.value : startRow + 100;
|
|
136
|
-
const endCol = spillArea.end.col.type === "number" ? spillArea.end.col.value : startCol + 100;
|
|
137
|
-
for (let row = startRow;row <= endRow; row++) {
|
|
138
|
-
for (let col = startCol;col <= endCol; col++) {
|
|
139
|
-
const cell = {
|
|
140
|
-
workbookName: origin.workbookName,
|
|
141
|
-
sheetName: origin.sheetName,
|
|
142
|
-
rowIndex: row,
|
|
143
|
-
colIndex: col
|
|
144
|
-
};
|
|
145
|
-
const protection = this.isCellProtected(cell);
|
|
146
|
-
if (protection) {
|
|
147
|
-
const value = getSpillValue(row - startRow, col - startCol);
|
|
148
|
-
const metadata = getMetadata ? getMetadata(cell) : undefined;
|
|
149
|
-
const validation = this.validateCellWrite(cell, value, metadata);
|
|
150
|
-
if (!validation.valid) {
|
|
151
|
-
return {
|
|
152
|
-
valid: false,
|
|
153
|
-
error: `Spill blocked by schema at ${cellAddressToKey(cell)}: ${validation.error}`,
|
|
154
|
-
originalError: validation.originalError
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return { valid: true };
|
|
161
|
-
}
|
|
162
|
-
updateForTableRename(workbookName, oldTableName, newTableName) {
|
|
163
|
-
for (const schema of this.schemas.values()) {
|
|
164
|
-
if (schema.type === "table" && schema.workbookName === workbookName && schema.tableName === oldTableName) {
|
|
165
|
-
schema.tableName = newTableName;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
updateForSheetRename(workbookName, oldSheetName, newSheetName) {
|
|
170
|
-
for (const schema of this.schemas.values()) {
|
|
171
|
-
if (schema.type === "cell") {
|
|
172
|
-
if (schema.cellAddress.workbookName === workbookName && schema.cellAddress.sheetName === oldSheetName) {
|
|
173
|
-
schema.cellAddress.sheetName = newSheetName;
|
|
174
|
-
}
|
|
175
|
-
} else if (schema.type === "grid") {
|
|
176
|
-
if (schema.workbookName === workbookName && schema.sheetName === oldSheetName) {
|
|
177
|
-
schema.sheetName = newSheetName;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
updateForWorkbookRename(oldWorkbookName, newWorkbookName) {
|
|
183
|
-
for (const schema of this.schemas.values()) {
|
|
184
|
-
if (schema.type === "cell") {
|
|
185
|
-
if (schema.cellAddress.workbookName === oldWorkbookName) {
|
|
186
|
-
schema.cellAddress.workbookName = newWorkbookName;
|
|
187
|
-
}
|
|
188
|
-
} else if (schema.type === "table") {
|
|
189
|
-
if (schema.workbookName === oldWorkbookName) {
|
|
190
|
-
schema.workbookName = newWorkbookName;
|
|
191
|
-
}
|
|
192
|
-
} else if (schema.type === "grid") {
|
|
193
|
-
if (schema.workbookName === oldWorkbookName) {
|
|
194
|
-
schema.workbookName = newWorkbookName;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
getAllSchemas() {
|
|
200
|
-
return new Map(this.schemas);
|
|
201
|
-
}
|
|
202
|
-
validateAllSchemaConstraints(getCellValue, getCellMetadata, getTableDataCells) {
|
|
203
|
-
const errors = [];
|
|
204
|
-
for (const [namespace, schema] of this.schemas) {
|
|
205
|
-
if (schema.type === "cell") {
|
|
206
|
-
let value;
|
|
207
|
-
try {
|
|
208
|
-
value = getCellValue(schema.cellAddress);
|
|
209
|
-
} catch {
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
const metadata = getCellMetadata ? getCellMetadata(schema.cellAddress) : undefined;
|
|
213
|
-
if (value === undefined || value === "") {
|
|
214
|
-
continue;
|
|
215
|
-
}
|
|
216
|
-
try {
|
|
217
|
-
schema.parse(value, metadata);
|
|
218
|
-
} catch (err) {
|
|
219
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
220
|
-
errors.push({
|
|
221
|
-
message: `Schema validation failed for ${namespace}: ${error.message}`,
|
|
222
|
-
cellAddress: schema.cellAddress,
|
|
223
|
-
schemaNamespace: namespace,
|
|
224
|
-
originalError: error
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
} else if (schema.type === "table") {
|
|
228
|
-
const table = this.tableManager.getTable({
|
|
229
|
-
workbookName: schema.workbookName,
|
|
230
|
-
name: schema.tableName
|
|
231
|
-
});
|
|
232
|
-
if (!table)
|
|
233
|
-
continue;
|
|
234
|
-
const { start, headers } = table;
|
|
235
|
-
let cellsToValidate;
|
|
236
|
-
if (getTableDataCells) {
|
|
237
|
-
cellsToValidate = getTableDataCells(table);
|
|
238
|
-
} else {
|
|
239
|
-
const { endRow } = table;
|
|
240
|
-
if (endRow.type === "infinity") {
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
cellsToValidate = [];
|
|
244
|
-
const dataStartRow = start.rowIndex + 1;
|
|
245
|
-
const endColIndex = start.colIndex + headers.size - 1;
|
|
246
|
-
for (let row = dataStartRow;row <= endRow.value; row++) {
|
|
247
|
-
for (let col = start.colIndex;col <= endColIndex; col++) {
|
|
248
|
-
cellsToValidate.push({
|
|
249
|
-
workbookName: table.workbookName,
|
|
250
|
-
sheetName: table.sheetName,
|
|
251
|
-
rowIndex: row,
|
|
252
|
-
colIndex: col
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
for (const cell of cellsToValidate) {
|
|
258
|
-
if (cell.rowIndex <= start.rowIndex)
|
|
259
|
-
continue;
|
|
260
|
-
let value;
|
|
261
|
-
try {
|
|
262
|
-
value = getCellValue(cell);
|
|
263
|
-
} catch {
|
|
264
|
-
continue;
|
|
265
|
-
}
|
|
266
|
-
if (value === undefined || value === "") {
|
|
267
|
-
continue;
|
|
268
|
-
}
|
|
269
|
-
const colOffset = cell.colIndex - start.colIndex;
|
|
270
|
-
const columnName = this.getColumnNameByIndex(schema.headers, colOffset);
|
|
271
|
-
if (columnName && schema.headers[columnName]) {
|
|
272
|
-
const header = schema.headers[columnName];
|
|
273
|
-
const metadata = getCellMetadata ? getCellMetadata(cell) : undefined;
|
|
274
|
-
try {
|
|
275
|
-
header.parse(value, metadata);
|
|
276
|
-
} catch (err) {
|
|
277
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
278
|
-
errors.push({
|
|
279
|
-
message: `Schema validation failed for ${namespace}.${columnName}: ${error.message}`,
|
|
280
|
-
cellAddress: cell,
|
|
281
|
-
schemaNamespace: namespace,
|
|
282
|
-
columnName,
|
|
283
|
-
originalError: error
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
} else if (schema.type === "grid") {
|
|
289
|
-
const { range } = schema;
|
|
290
|
-
for (let row = range.start.row;row <= range.end.row; row++) {
|
|
291
|
-
for (let col = range.start.col;col <= range.end.col; col++) {
|
|
292
|
-
const cell = {
|
|
293
|
-
workbookName: schema.workbookName,
|
|
294
|
-
sheetName: schema.sheetName,
|
|
295
|
-
rowIndex: row,
|
|
296
|
-
colIndex: col
|
|
297
|
-
};
|
|
298
|
-
let value;
|
|
299
|
-
try {
|
|
300
|
-
value = getCellValue(cell);
|
|
301
|
-
} catch {
|
|
302
|
-
continue;
|
|
303
|
-
}
|
|
304
|
-
if (value === undefined || value === "") {
|
|
305
|
-
continue;
|
|
306
|
-
}
|
|
307
|
-
const metadata = getCellMetadata ? getCellMetadata(cell) : undefined;
|
|
308
|
-
try {
|
|
309
|
-
schema.parse(value, metadata);
|
|
310
|
-
} catch (err) {
|
|
311
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
312
|
-
errors.push({
|
|
313
|
-
message: `Schema validation failed for ${namespace}: ${error.message}`,
|
|
314
|
-
cellAddress: cell,
|
|
315
|
-
schemaNamespace: namespace,
|
|
316
|
-
originalError: error
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
return {
|
|
324
|
-
valid: errors.length === 0,
|
|
325
|
-
errors
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
export {
|
|
330
|
-
SchemaValidationError,
|
|
331
|
-
SchemaManager
|
|
332
|
-
};
|
|
333
|
-
|
|
334
|
-
//# debugId=C6B324CE0B5006EE64756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/managers/schema-manager.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * SchemaManager - Manages schema definitions and validation\n *\n * Tracks registered schemas and provides validation for cell writes,\n * spill operations, and copy/paste operations.\n */\n\nimport type {\n CellAddress,\n FiniteSpreadsheetRange,\n SerializedCellValue,\n SpreadsheetRange,\n TableDefinition,\n} from \"../types.mjs\";\nimport { cellAddressToKey, isCellInRange } from \"../utils.mjs\";\nimport type { TableManager } from \"./table-manager.mjs\";\n\nexport type ParseFunction<TCellMetadata = unknown> = (\n value: SerializedCellValue,\n metadata: TCellMetadata\n) => unknown;\n\nexport type WriteFunction<TCellMetadata = unknown> = (value: any) => {\n value: SerializedCellValue;\n metadata?: TCellMetadata;\n};\n\nexport type TableSchemaHeaders<TCellMetadata = unknown> = Record<\n string,\n {\n parse: ParseFunction<TCellMetadata>;\n write: WriteFunction<TCellMetadata>;\n index: number;\n }\n>;\n\nexport interface RegisteredTableSchema {\n type: \"table\";\n namespace: string;\n workbookName: string;\n tableName: string;\n headers: TableSchemaHeaders;\n}\n\nexport interface RegisteredCellSchema {\n type: \"cell\";\n namespace: string;\n cellAddress: CellAddress;\n parse: ParseFunction;\n}\n\nexport interface RegisteredGridSchema {\n type: \"grid\";\n namespace: string;\n workbookName: string;\n sheetName: string;\n range: FiniteSpreadsheetRange;\n parse: ParseFunction;\n}\n\nexport type RegisteredSchema =\n | RegisteredTableSchema\n | RegisteredCellSchema\n | RegisteredGridSchema;\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n originalError?: Error;\n}\n\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public cellAddress?: CellAddress,\n public originalError?: Error\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n\nexport class SchemaManager {\n private schemas: Map<string, RegisteredSchema> = new Map();\n\n constructor(private tableManager: TableManager) {}\n\n /**\n * Register a table schema\n */\n registerTableSchema(\n namespace: string,\n workbookName: string,\n tableName: string,\n headers: TableSchemaHeaders\n ): void {\n this.schemas.set(namespace, {\n type: \"table\",\n namespace,\n workbookName,\n tableName,\n headers,\n });\n }\n\n /**\n * Register a cell schema\n */\n registerCellSchema(\n namespace: string,\n cellAddress: CellAddress,\n parse: ParseFunction\n ): void {\n this.schemas.set(namespace, {\n type: \"cell\",\n namespace,\n cellAddress,\n parse,\n });\n }\n\n /**\n * Register a grid schema\n */\n registerGridSchema(\n namespace: string,\n workbookName: string,\n sheetName: string,\n range: FiniteSpreadsheetRange,\n parse: ParseFunction\n ): void {\n this.schemas.set(namespace, {\n type: \"grid\",\n namespace,\n workbookName,\n sheetName,\n range,\n parse,\n });\n }\n\n /**\n * Get a schema by namespace\n */\n getSchema(namespace: string): RegisteredSchema | undefined {\n return this.schemas.get(namespace);\n }\n\n /**\n * Remove a schema\n */\n removeSchema(namespace: string): boolean {\n return this.schemas.delete(namespace);\n }\n\n /**\n * Check if any schemas are registered\n */\n hasSchemas(): boolean {\n return this.schemas.size > 0;\n }\n\n /**\n * Check if a cell is protected by a schema\n * Returns the schema info if protected, null otherwise\n */\n isCellProtected(\n cell: CellAddress\n ): { schema: RegisteredSchema; columnName?: string } | null {\n for (const schema of this.schemas.values()) {\n if (schema.type === \"cell\") {\n if (\n schema.cellAddress.workbookName === cell.workbookName &&\n schema.cellAddress.sheetName === cell.sheetName &&\n schema.cellAddress.colIndex === cell.colIndex &&\n schema.cellAddress.rowIndex === cell.rowIndex\n ) {\n return { schema };\n }\n } else if (schema.type === \"table\") {\n const table = this.tableManager.getTable({\n workbookName: schema.workbookName,\n name: schema.tableName,\n });\n\n if (!table) continue;\n\n // Check if cell is in table's data range (excluding header row)\n if (\n cell.workbookName === table.workbookName &&\n cell.sheetName === table.sheetName\n ) {\n const isInDataRange = this.isCellInTableDataRange(cell, table);\n if (isInDataRange) {\n // Find which column this cell is in\n const colOffset = cell.colIndex - table.start.colIndex;\n const columnName = this.getColumnNameByIndex(\n schema.headers,\n colOffset\n );\n return { schema, columnName };\n }\n }\n } else if (schema.type === \"grid\") {\n // Check if cell is within the grid range\n if (\n cell.workbookName === schema.workbookName &&\n cell.sheetName === schema.sheetName &&\n cell.colIndex >= schema.range.start.col &&\n cell.colIndex <= schema.range.end.col &&\n cell.rowIndex >= schema.range.start.row &&\n cell.rowIndex <= schema.range.end.row\n ) {\n return { schema };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Check if a cell is within a table's data range (excluding header row)\n */\n private isCellInTableDataRange(\n cell: CellAddress,\n table: TableDefinition\n ): boolean {\n const { start, endRow, headers } = table;\n\n // Data starts one row below header\n const dataStartRow = start.rowIndex + 1;\n\n // Check row bounds (data rows only, not header)\n const isInRowRange =\n endRow.type === \"infinity\"\n ? cell.rowIndex >= dataStartRow\n : cell.rowIndex >= dataStartRow && cell.rowIndex <= endRow.value;\n\n // Check column bounds\n const endColIndex = start.colIndex + headers.size - 1;\n const isInColRange =\n cell.colIndex >= start.colIndex && cell.colIndex <= endColIndex;\n\n return isInRowRange && isInColRange;\n }\n\n /**\n * Get column name by index from headers\n */\n private getColumnNameByIndex(\n headers: TableSchemaHeaders,\n index: number\n ): string | undefined {\n for (const [name, header] of Object.entries(headers)) {\n if (header.index === index) {\n return name;\n }\n }\n return undefined;\n }\n\n /**\n * Validate a cell write against schemas\n */\n validateCellWrite(\n cell: CellAddress,\n value: SerializedCellValue,\n metadata?: unknown\n ): ValidationResult {\n // Allow clearing cells (undefined or empty string)\n if (value === undefined || value === \"\") {\n return { valid: true };\n }\n\n const protection = this.isCellProtected(cell);\n\n if (!protection) {\n return { valid: true };\n }\n\n const { schema, columnName } = protection;\n\n try {\n if (schema.type === \"cell\") {\n schema.parse(value, metadata);\n } else if (schema.type === \"table\" && columnName) {\n const header = schema.headers[columnName];\n if (header) {\n header.parse(value, metadata);\n }\n } else if (schema.type === \"grid\") {\n schema.parse(value, metadata);\n }\n return { valid: true };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n return {\n valid: false,\n error: `Schema validation failed for ${schema.namespace}${\n columnName ? `.${columnName}` : \"\"\n }: ${error.message}`,\n originalError: error,\n };\n }\n }\n\n /**\n * Validate a spill area against schemas\n * Returns validation result - if invalid, spill should produce #SPILL! error\n */\n validateSpillArea(\n origin: CellAddress,\n spillArea: SpreadsheetRange,\n getSpillValue: (row: number, col: number) => SerializedCellValue,\n getMetadata?: (cell: CellAddress) => unknown\n ): ValidationResult {\n // Get the bounds of the spill area\n const startRow = spillArea.start.row;\n const startCol = spillArea.start.col;\n const endRow =\n spillArea.end.row.type === \"number\"\n ? spillArea.end.row.value\n : startRow + 100; // Limit for infinite ranges\n const endCol =\n spillArea.end.col.type === \"number\"\n ? spillArea.end.col.value\n : startCol + 100; // Limit for infinite ranges\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const cell: CellAddress = {\n workbookName: origin.workbookName,\n sheetName: origin.sheetName,\n rowIndex: row,\n colIndex: col,\n };\n\n const protection = this.isCellProtected(cell);\n if (protection) {\n const value = getSpillValue(row - startRow, col - startCol);\n const metadata = getMetadata ? getMetadata(cell) : undefined;\n const validation = this.validateCellWrite(cell, value, metadata);\n\n if (!validation.valid) {\n return {\n valid: false,\n error: `Spill blocked by schema at ${cellAddressToKey(cell)}: ${\n validation.error\n }`,\n originalError: validation.originalError,\n };\n }\n }\n }\n }\n\n return { valid: true };\n }\n\n /**\n * Update schemas when a table is renamed\n */\n updateForTableRename(\n workbookName: string,\n oldTableName: string,\n newTableName: string\n ): void {\n for (const schema of this.schemas.values()) {\n if (\n schema.type === \"table\" &&\n schema.workbookName === workbookName &&\n schema.tableName === oldTableName\n ) {\n schema.tableName = newTableName;\n }\n }\n }\n\n /**\n * Update schemas when a sheet is renamed\n */\n updateForSheetRename(\n workbookName: string,\n oldSheetName: string,\n newSheetName: string\n ): void {\n for (const schema of this.schemas.values()) {\n if (schema.type === \"cell\") {\n if (\n schema.cellAddress.workbookName === workbookName &&\n schema.cellAddress.sheetName === oldSheetName\n ) {\n schema.cellAddress.sheetName = newSheetName;\n }\n } else if (schema.type === \"grid\") {\n if (\n schema.workbookName === workbookName &&\n schema.sheetName === oldSheetName\n ) {\n schema.sheetName = newSheetName;\n }\n }\n // Table schemas don't store sheetName directly - they get it from TableManager\n }\n }\n\n /**\n * Update schemas when a workbook is renamed\n */\n updateForWorkbookRename(\n oldWorkbookName: string,\n newWorkbookName: string\n ): void {\n for (const schema of this.schemas.values()) {\n if (schema.type === \"cell\") {\n if (schema.cellAddress.workbookName === oldWorkbookName) {\n schema.cellAddress.workbookName = newWorkbookName;\n }\n } else if (schema.type === \"table\") {\n if (schema.workbookName === oldWorkbookName) {\n schema.workbookName = newWorkbookName;\n }\n } else if (schema.type === \"grid\") {\n if (schema.workbookName === oldWorkbookName) {\n schema.workbookName = newWorkbookName;\n }\n }\n }\n }\n\n /**\n * Get all schemas (for debugging/testing)\n */\n getAllSchemas(): Map<string, RegisteredSchema> {\n return new Map(this.schemas);\n }\n\n /**\n * Validate all schema constraints using evaluated cell values.\n *\n * This is the key method for schema validation with rollback:\n * - It validates EVALUATED values, not raw content\n * - A cell with \"=123+123\" validates as number (246), not string\n * - Called after re-evaluation to check all schema-constrained cells\n *\n * @param getCellValue - Function to get the evaluated value of a cell\n * @param getCellMetadata - Optional function to get cell metadata\n * @returns Validation result with all errors found\n */\n validateAllSchemaConstraints(\n getCellValue: (cell: CellAddress) => SerializedCellValue,\n getCellMetadata?: (cell: CellAddress) => unknown,\n getTableDataCells?: (table: TableDefinition) => CellAddress[]\n ): {\n valid: boolean;\n errors: Array<{\n message: string;\n cellAddress?: CellAddress;\n schemaNamespace?: string;\n columnName?: string;\n originalError?: Error;\n }>;\n } {\n const errors: Array<{\n message: string;\n cellAddress?: CellAddress;\n schemaNamespace?: string;\n columnName?: string;\n originalError?: Error;\n }> = [];\n\n for (const [namespace, schema] of this.schemas) {\n if (schema.type === \"cell\") {\n // Validate single cell using evaluated value\n let value: SerializedCellValue;\n try {\n value = getCellValue(schema.cellAddress);\n } catch {\n // Sheet/cell doesn't exist yet, skip validation\n continue;\n }\n\n const metadata = getCellMetadata\n ? getCellMetadata(schema.cellAddress)\n : undefined;\n\n // Skip empty cells\n if (value === undefined || value === \"\") {\n continue;\n }\n\n try {\n schema.parse(value, metadata);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n errors.push({\n message: `Schema validation failed for ${namespace}: ${error.message}`,\n cellAddress: schema.cellAddress,\n schemaNamespace: namespace,\n originalError: error,\n });\n }\n } else if (schema.type === \"table\") {\n // Get the table definition\n const table = this.tableManager.getTable({\n workbookName: schema.workbookName,\n name: schema.tableName,\n });\n\n if (!table) continue;\n\n const { start, headers } = table;\n\n // Get cells to validate - use callback if provided (handles infinite ranges efficiently)\n // Otherwise fall back to simple iteration for finite tables\n let cellsToValidate: CellAddress[];\n if (getTableDataCells) {\n cellsToValidate = getTableDataCells(table);\n } else {\n // Fallback for finite tables when no callback provided\n const { endRow } = table;\n if (endRow.type === \"infinity\") {\n // Skip validation for infinite tables without a cell iterator\n continue;\n }\n cellsToValidate = [];\n const dataStartRow = start.rowIndex + 1;\n const endColIndex = start.colIndex + headers.size - 1;\n for (let row = dataStartRow; row <= endRow.value; row++) {\n for (let col = start.colIndex; col <= endColIndex; col++) {\n cellsToValidate.push({\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n rowIndex: row,\n colIndex: col,\n });\n }\n }\n }\n\n for (const cell of cellsToValidate) {\n // Skip header row\n if (cell.rowIndex <= start.rowIndex) continue;\n\n let value: SerializedCellValue;\n try {\n value = getCellValue(cell);\n } catch {\n // Sheet/cell doesn't exist yet, skip validation\n continue;\n }\n\n // Skip empty cells\n if (value === undefined || value === \"\") {\n continue;\n }\n\n // Find the column name\n const colOffset = cell.colIndex - start.colIndex;\n const columnName = this.getColumnNameByIndex(\n schema.headers,\n colOffset\n );\n\n if (columnName && schema.headers[columnName]) {\n const header = schema.headers[columnName];\n const metadata = getCellMetadata\n ? getCellMetadata(cell)\n : undefined;\n\n try {\n header.parse(value, metadata);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n errors.push({\n message: `Schema validation failed for ${namespace}.${columnName}: ${error.message}`,\n cellAddress: cell,\n schemaNamespace: namespace,\n columnName,\n originalError: error,\n });\n }\n }\n }\n } else if (schema.type === \"grid\") {\n // Validate all cells in the grid range\n const { range } = schema;\n\n for (let row = range.start.row; row <= range.end.row; row++) {\n for (let col = range.start.col; col <= range.end.col; col++) {\n const cell: CellAddress = {\n workbookName: schema.workbookName,\n sheetName: schema.sheetName,\n rowIndex: row,\n colIndex: col,\n };\n\n let value: SerializedCellValue;\n try {\n value = getCellValue(cell);\n } catch {\n // Sheet/cell doesn't exist yet, skip validation\n continue;\n }\n\n // Skip empty cells\n if (value === undefined || value === \"\") {\n continue;\n }\n\n const metadata = getCellMetadata\n ? getCellMetadata(cell)\n : undefined;\n\n try {\n schema.parse(value, metadata);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n errors.push({\n message: `Schema validation failed for ${namespace}: ${error.message}`,\n cellAddress: cell,\n schemaNamespace: namespace,\n originalError: error,\n });\n }\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "C6B324CE0B5006EE64756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
// src/core/schema/cell-orm.ts
|
|
2
|
-
class CellOrm {
|
|
3
|
-
engine;
|
|
4
|
-
cellAddress;
|
|
5
|
-
parser;
|
|
6
|
-
writer;
|
|
7
|
-
namespace;
|
|
8
|
-
constructor(engine, cellAddress, parser, writer, namespace) {
|
|
9
|
-
this.engine = engine;
|
|
10
|
-
this.cellAddress = cellAddress;
|
|
11
|
-
this.parser = parser;
|
|
12
|
-
this.writer = writer;
|
|
13
|
-
this.namespace = namespace;
|
|
14
|
-
}
|
|
15
|
-
read() {
|
|
16
|
-
const value = this.engine.getCellValue(this.cellAddress);
|
|
17
|
-
const metadata = this.engine.getCellMetadata(this.cellAddress);
|
|
18
|
-
return this.parser(value, metadata);
|
|
19
|
-
}
|
|
20
|
-
write(value) {
|
|
21
|
-
const { value: serializedValue, metadata } = this.writer(value);
|
|
22
|
-
this.engine.setCellContent(this.cellAddress, serializedValue);
|
|
23
|
-
if (metadata !== undefined) {
|
|
24
|
-
this.engine.setCellMetadata(this.cellAddress, metadata);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
getAddress() {
|
|
28
|
-
return { ...this.cellAddress };
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
export {
|
|
32
|
-
CellOrm
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
//# debugId=7573B9F94267F42F64756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/schema/cell-orm.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * CellOrm - Object-Relational Mapping for single cell data\n *\n * Provides read/write operations for a single cell with type-safe access.\n * Used as the `this` context for custom cell API methods.\n */\n\nimport type { CellAddress, SerializedCellValue } from \"../types.mjs\";\nimport type { FormulaEngine } from \"../engine.mjs\";\n\nexport type CellParseFunction<TCellMetadata, TValue> = (\n value: unknown,\n metadata: TCellMetadata\n) => TValue;\n\nexport type CellWriteFunction<TCellMetadata, TValue> = (value: TValue) => {\n value: SerializedCellValue;\n metadata?: TCellMetadata;\n};\n\nexport class CellOrm<TValue, TCellMetadata = unknown> {\n constructor(\n private engine: FormulaEngine<any, any>,\n private cellAddress: CellAddress,\n private parser: CellParseFunction<TCellMetadata, TValue>,\n private writer: CellWriteFunction<TCellMetadata, TValue>,\n private namespace: string\n ) {}\n\n /**\n * Read the cell value and parse it using the schema's parse function\n */\n read(): TValue {\n const value = this.engine.getCellValue(this.cellAddress);\n const metadata = this.engine.getCellMetadata(\n this.cellAddress\n ) as TCellMetadata;\n return this.parser(value, metadata);\n }\n\n /**\n * Write a value to the cell using the schema's write function\n */\n write(value: TValue): void {\n const { value: serializedValue, metadata } = this.writer(value);\n this.engine.setCellContent(this.cellAddress, serializedValue);\n if (metadata !== undefined) {\n this.engine.setCellMetadata(this.cellAddress, metadata);\n }\n }\n\n /**\n * Get the cell address\n */\n getAddress(): CellAddress {\n return { ...this.cellAddress };\n }\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": ";AAoBO,MAAM,QAAyC;AAAA,EAE1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EALV,WAAW,CACD,QACA,aACA,QACA,QACA,WACR;AAAA,IALQ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAMV,IAAI,GAAW;AAAA,IACb,MAAM,QAAQ,KAAK,OAAO,aAAa,KAAK,WAAW;AAAA,IACvD,MAAM,WAAW,KAAK,OAAO,gBAC3B,KAAK,WACP;AAAA,IACA,OAAO,KAAK,OAAO,OAAO,QAAQ;AAAA;AAAA,EAMpC,KAAK,CAAC,OAAqB;AAAA,IACzB,QAAQ,OAAO,iBAAiB,aAAa,KAAK,OAAO,KAAK;AAAA,IAC9D,KAAK,OAAO,eAAe,KAAK,aAAa,eAAe;AAAA,IAC5D,IAAI,aAAa,WAAW;AAAA,MAC1B,KAAK,OAAO,gBAAgB,KAAK,aAAa,QAAQ;AAAA,IACxD;AAAA;AAAA,EAMF,UAAU,GAAgB;AAAA,IACxB,OAAO,KAAK,KAAK,YAAY;AAAA;AAEjC;",
|
|
8
|
-
"debugId": "7573B9F94267F42F64756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
// src/core/schema/grid-orm.ts
|
|
2
|
-
class GridOrm {
|
|
3
|
-
engine;
|
|
4
|
-
workbookName;
|
|
5
|
-
sheetName;
|
|
6
|
-
range;
|
|
7
|
-
parser;
|
|
8
|
-
writer;
|
|
9
|
-
namespace;
|
|
10
|
-
numCols;
|
|
11
|
-
numRows;
|
|
12
|
-
constructor(engine, workbookName, sheetName, range, parser, writer, namespace) {
|
|
13
|
-
this.engine = engine;
|
|
14
|
-
this.workbookName = workbookName;
|
|
15
|
-
this.sheetName = sheetName;
|
|
16
|
-
this.range = range;
|
|
17
|
-
this.parser = parser;
|
|
18
|
-
this.writer = writer;
|
|
19
|
-
this.namespace = namespace;
|
|
20
|
-
this.numCols = range.end.col - range.start.col + 1;
|
|
21
|
-
this.numRows = range.end.row - range.start.row + 1;
|
|
22
|
-
}
|
|
23
|
-
getCellAddress(colIndex, rowIndex) {
|
|
24
|
-
return {
|
|
25
|
-
workbookName: this.workbookName,
|
|
26
|
-
sheetName: this.sheetName,
|
|
27
|
-
colIndex: this.range.start.col + colIndex,
|
|
28
|
-
rowIndex: this.range.start.row + rowIndex
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
readCell(colIndex, rowIndex) {
|
|
32
|
-
const cellAddress = this.getCellAddress(colIndex, rowIndex);
|
|
33
|
-
const value = this.engine.getCellValue(cellAddress);
|
|
34
|
-
const metadata = this.engine.getCellMetadata(cellAddress);
|
|
35
|
-
return this.parser(value, metadata);
|
|
36
|
-
}
|
|
37
|
-
writeCell(colIndex, rowIndex, value) {
|
|
38
|
-
const cellAddress = this.getCellAddress(colIndex, rowIndex);
|
|
39
|
-
const { value: serializedValue, metadata } = this.writer(value);
|
|
40
|
-
this.engine.setCellContent(cellAddress, serializedValue);
|
|
41
|
-
if (metadata !== undefined) {
|
|
42
|
-
this.engine.setCellMetadata(cellAddress, metadata);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
get columns() {
|
|
46
|
-
const result = [];
|
|
47
|
-
for (let col = 0;col < this.numCols; col++) {
|
|
48
|
-
const column = [];
|
|
49
|
-
for (let row = 0;row < this.numRows; row++) {
|
|
50
|
-
column.push(this.readCell(col, row));
|
|
51
|
-
}
|
|
52
|
-
result.push(column);
|
|
53
|
-
}
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
get rows() {
|
|
57
|
-
const result = [];
|
|
58
|
-
for (let row = 0;row < this.numRows; row++) {
|
|
59
|
-
const rowData = [];
|
|
60
|
-
for (let col = 0;col < this.numCols; col++) {
|
|
61
|
-
rowData.push(this.readCell(col, row));
|
|
62
|
-
}
|
|
63
|
-
result.push(rowData);
|
|
64
|
-
}
|
|
65
|
-
return result;
|
|
66
|
-
}
|
|
67
|
-
setValue(value, position) {
|
|
68
|
-
if (position.col < 0 || position.col >= this.numCols || position.row < 0 || position.row >= this.numRows) {
|
|
69
|
-
throw new Error(`Grid schema "${this.namespace}": Position (${position.col}, ${position.row}) is out of bounds. Grid is ${this.numCols}x${this.numRows}.`);
|
|
70
|
-
}
|
|
71
|
-
this.writeCell(position.col, position.row, value);
|
|
72
|
-
}
|
|
73
|
-
getValue(position) {
|
|
74
|
-
if (position.col < 0 || position.col >= this.numCols || position.row < 0 || position.row >= this.numRows) {
|
|
75
|
-
throw new Error(`Grid schema "${this.namespace}": Position (${position.col}, ${position.row}) is out of bounds. Grid is ${this.numCols}x${this.numRows}.`);
|
|
76
|
-
}
|
|
77
|
-
return this.readCell(position.col, position.row);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
export {
|
|
81
|
-
GridOrm
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
//# debugId=0BFB6767DD0F42BE64756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/schema/grid-orm.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * GridOrm - Object-Relational Mapping for grid/range data\n *\n * Provides read/write operations for a 2D range of cells with type-safe access.\n * Supports both column-major and row-major array access patterns.\n */\n\nimport type {\n CellAddress,\n FiniteSpreadsheetRange,\n SerializedCellValue,\n} from \"../types.mjs\";\nimport type { FormulaEngine } from \"../engine.mjs\";\n\nexport type GridParseFunction<TCellMetadata, TValue> = (\n value: unknown,\n metadata: TCellMetadata\n) => TValue;\n\nexport type GridWriteFunction<TCellMetadata, TValue> = (value: TValue) => {\n value: SerializedCellValue;\n metadata?: TCellMetadata;\n};\n\nexport class GridOrm<TValue, TCellMetadata = unknown> {\n private numCols: number;\n private numRows: number;\n\n constructor(\n private engine: FormulaEngine<any, any>,\n private workbookName: string,\n private sheetName: string,\n private range: FiniteSpreadsheetRange,\n private parser: GridParseFunction<TCellMetadata, TValue>,\n private writer: GridWriteFunction<TCellMetadata, TValue>,\n private namespace: string\n ) {\n this.numCols = range.end.col - range.start.col + 1;\n this.numRows = range.end.row - range.start.row + 1;\n }\n\n /**\n * Get the cell address for a given column and row index within the grid\n */\n private getCellAddress(colIndex: number, rowIndex: number): CellAddress {\n return {\n workbookName: this.workbookName,\n sheetName: this.sheetName,\n colIndex: this.range.start.col + colIndex,\n rowIndex: this.range.start.row + rowIndex,\n };\n }\n\n /**\n * Read a single cell and parse it\n */\n private readCell(colIndex: number, rowIndex: number): TValue {\n const cellAddress = this.getCellAddress(colIndex, rowIndex);\n const value = this.engine.getCellValue(cellAddress);\n const metadata = this.engine.getCellMetadata(cellAddress) as TCellMetadata;\n return this.parser(value, metadata);\n }\n\n /**\n * Write a single cell using the write function\n */\n private writeCell(colIndex: number, rowIndex: number, value: TValue): void {\n const cellAddress = this.getCellAddress(colIndex, rowIndex);\n const { value: serializedValue, metadata } = this.writer(value);\n this.engine.setCellContent(cellAddress, serializedValue);\n if (metadata !== undefined) {\n this.engine.setCellMetadata(cellAddress, metadata);\n }\n }\n\n /**\n * Get all cells as a column-major 2D array (readonly)\n * columns[colIndex][rowIndex]\n */\n get columns(): readonly (readonly TValue[])[] {\n const result: TValue[][] = [];\n for (let col = 0; col < this.numCols; col++) {\n const column: TValue[] = [];\n for (let row = 0; row < this.numRows; row++) {\n column.push(this.readCell(col, row));\n }\n result.push(column);\n }\n return result;\n }\n\n /**\n * Get all cells as a row-major 2D array (readonly)\n * rows[rowIndex][colIndex]\n */\n get rows(): readonly (readonly TValue[])[] {\n const result: TValue[][] = [];\n for (let row = 0; row < this.numRows; row++) {\n const rowData: TValue[] = [];\n for (let col = 0; col < this.numCols; col++) {\n rowData.push(this.readCell(col, row));\n }\n result.push(rowData);\n }\n return result;\n }\n\n /**\n * Set a single value at the specified position\n * Position is relative to the grid (0-indexed)\n */\n setValue(value: TValue, position: { col: number; row: number }): void {\n if (\n position.col < 0 ||\n position.col >= this.numCols ||\n position.row < 0 ||\n position.row >= this.numRows\n ) {\n throw new Error(\n `Grid schema \"${this.namespace}\": Position (${position.col}, ${position.row}) is out of bounds. Grid is ${this.numCols}x${this.numRows}.`\n );\n }\n this.writeCell(position.col, position.row, value);\n }\n\n /**\n * Get a single value at the specified position\n * Position is relative to the grid (0-indexed)\n */\n getValue(position: { col: number; row: number }): TValue {\n if (\n position.col < 0 ||\n position.col >= this.numCols ||\n position.row < 0 ||\n position.row >= this.numRows\n ) {\n throw new Error(\n `Grid schema \"${this.namespace}\": Position (${position.col}, ${position.row}) is out of bounds. Grid is ${this.numCols}x${this.numRows}.`\n );\n }\n return this.readCell(position.col, position.row);\n }\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "0BFB6767DD0F42BE64756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
// src/core/schema/schema-builder.ts
|
|
2
|
-
import { TableOrm } from "./table-orm.mjs";
|
|
3
|
-
import { CellOrm } from "./cell-orm.mjs";
|
|
4
|
-
import { GridOrm } from "./grid-orm.mjs";
|
|
5
|
-
function buildSchemaFromDeclaration(engine, declaration, schemaManager) {
|
|
6
|
-
const schema = {};
|
|
7
|
-
for (const [namespace, def] of Object.entries(declaration)) {
|
|
8
|
-
if (def.type === "table") {
|
|
9
|
-
schema[namespace] = buildTableSchema(engine, namespace, def, schemaManager);
|
|
10
|
-
} else if (def.type === "cell") {
|
|
11
|
-
schema[namespace] = buildCellSchema(engine, namespace, def, schemaManager);
|
|
12
|
-
} else if (def.type === "grid") {
|
|
13
|
-
schema[namespace] = buildGridSchema(engine, namespace, def, schemaManager);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
return schema;
|
|
17
|
-
}
|
|
18
|
-
function buildTableSchema(engine, namespace, def, schemaManager) {
|
|
19
|
-
schemaManager.registerTableSchema(namespace, def.workbookName, def.tableName, def.headers);
|
|
20
|
-
return new TableOrm(engine, def.workbookName, def.tableName, def.headers, namespace);
|
|
21
|
-
}
|
|
22
|
-
function buildCellSchema(engine, namespace, def, schemaManager) {
|
|
23
|
-
schemaManager.registerCellSchema(namespace, def.cellAddress, def.parse);
|
|
24
|
-
return new CellOrm(engine, def.cellAddress, def.parse, def.write, namespace);
|
|
25
|
-
}
|
|
26
|
-
function buildGridSchema(engine, namespace, def, schemaManager) {
|
|
27
|
-
schemaManager.registerGridSchema(namespace, def.workbookName, def.sheetName, def.range, def.parse);
|
|
28
|
-
return new GridOrm(engine, def.workbookName, def.sheetName, def.range, def.parse, def.write, namespace);
|
|
29
|
-
}
|
|
30
|
-
export {
|
|
31
|
-
buildSchemaFromDeclaration
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
//# debugId=7C0CB7C4BF6779FC64756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/core/schema/schema-builder.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Schema Builder - Constructs the working schema from declarations\n *\n * This module is responsible for creating the actual working schema\n * from the schema declarations when attached to a FormulaEngine.\n */\n\nimport type { FormulaEngine } from \"../engine.mjs\";\nimport type { SchemaDeclaration, TableSchemaDefinition, CellSchemaDefinition, GridSchemaDefinition, Schema } from \"./schema.mjs\";\nimport { TableOrm } from \"./table-orm.mjs\";\nimport { CellOrm } from \"./cell-orm.mjs\";\nimport { GridOrm } from \"./grid-orm.mjs\";\nimport type { SchemaManager } from \"../managers/schema-manager.mjs\";\n\n/**\n * Build the working schema surface from declarations\n *\n * This creates TableOrm, CellOrm, and GridOrm instances for each declared schema\n * and returns them directly.\n */\nexport function buildSchemaFromDeclaration(\n engine: FormulaEngine<any, any>,\n declaration: SchemaDeclaration,\n schemaManager: SchemaManager\n): Schema {\n const schema: Schema = {};\n\n for (const [namespace, def] of Object.entries(declaration)) {\n if (def.type === \"table\") {\n schema[namespace] = buildTableSchema(engine, namespace, def, schemaManager);\n } else if (def.type === \"cell\") {\n schema[namespace] = buildCellSchema(engine, namespace, def, schemaManager);\n } else if (def.type === \"grid\") {\n schema[namespace] = buildGridSchema(engine, namespace, def, schemaManager);\n }\n }\n\n return schema;\n}\n\n/**\n * Build schema for a table schema - returns TableOrm instance directly\n */\nfunction buildTableSchema(\n engine: FormulaEngine<any, any>,\n namespace: string,\n def: TableSchemaDefinition,\n schemaManager: SchemaManager\n): TableOrm<any> {\n // Register the schema with the schema manager\n schemaManager.registerTableSchema(\n namespace,\n def.workbookName,\n def.tableName,\n def.headers\n );\n\n // Create and return the ORM instance directly\n return new TableOrm(\n engine,\n def.workbookName,\n def.tableName,\n def.headers,\n namespace\n );\n}\n\n/**\n * Build schema for a cell schema - returns CellOrm instance directly\n */\nfunction buildCellSchema(\n engine: FormulaEngine<any, any>,\n namespace: string,\n def: CellSchemaDefinition,\n schemaManager: SchemaManager\n): CellOrm<any> {\n // Register the schema with the schema manager\n schemaManager.registerCellSchema(namespace, def.cellAddress, def.parse);\n\n // Create and return the ORM instance directly\n return new CellOrm(engine, def.cellAddress, def.parse, def.write, namespace);\n}\n\n/**\n * Build schema for a grid schema - returns GridOrm instance directly\n */\nfunction buildGridSchema(\n engine: FormulaEngine<any, any>,\n namespace: string,\n def: GridSchemaDefinition,\n schemaManager: SchemaManager\n): GridOrm<any> {\n // Register the schema with the schema manager\n schemaManager.registerGridSchema(\n namespace,\n def.workbookName,\n def.sheetName,\n def.range,\n def.parse\n );\n\n // Create and return the ORM instance directly\n return new GridOrm(\n engine,\n def.workbookName,\n def.sheetName,\n def.range,\n def.parse,\n def.write,\n namespace\n );\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": ";AASA;AACA;AACA;AASO,SAAS,0BAA0B,CACxC,QACA,aACA,eACQ;AAAA,EACR,MAAM,SAAiB,CAAC;AAAA,EAExB,YAAY,WAAW,QAAQ,OAAO,QAAQ,WAAW,GAAG;AAAA,IAC1D,IAAI,IAAI,SAAS,SAAS;AAAA,MACxB,OAAO,aAAa,iBAAiB,QAAQ,WAAW,KAAK,aAAa;AAAA,IAC5E,EAAO,SAAI,IAAI,SAAS,QAAQ;AAAA,MAC9B,OAAO,aAAa,gBAAgB,QAAQ,WAAW,KAAK,aAAa;AAAA,IAC3E,EAAO,SAAI,IAAI,SAAS,QAAQ;AAAA,MAC9B,OAAO,aAAa,gBAAgB,QAAQ,WAAW,KAAK,aAAa;AAAA,IAC3E;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,gBAAgB,CACvB,QACA,WACA,KACA,eACe;AAAA,EAEf,cAAc,oBACZ,WACA,IAAI,cACJ,IAAI,WACJ,IAAI,OACN;AAAA,EAGA,OAAO,IAAI,SACT,QACA,IAAI,cACJ,IAAI,WACJ,IAAI,SACJ,SACF;AAAA;AAMF,SAAS,eAAe,CACtB,QACA,WACA,KACA,eACc;AAAA,EAEd,cAAc,mBAAmB,WAAW,IAAI,aAAa,IAAI,KAAK;AAAA,EAGtE,OAAO,IAAI,QAAQ,QAAQ,IAAI,aAAa,IAAI,OAAO,IAAI,OAAO,SAAS;AAAA;AAM7E,SAAS,eAAe,CACtB,QACA,WACA,KACA,eACc;AAAA,EAEd,cAAc,mBACZ,WACA,IAAI,cACJ,IAAI,WACJ,IAAI,OACJ,IAAI,KACN;AAAA,EAGA,OAAO,IAAI,QACT,QACA,IAAI,cACJ,IAAI,WACJ,IAAI,OACJ,IAAI,OACJ,IAAI,OACJ,SACF;AAAA;",
|
|
8
|
-
"debugId": "7C0CB7C4BF6779FC64756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|