@ricsam/formula-engine 0.2.3 → 0.2.5
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/dist/cjs/core/commands/structure-commands.cjs +3 -3
- package/dist/cjs/core/commands/structure-commands.cjs.map +3 -3
- package/dist/cjs/core/commands/table-commands.cjs +158 -10
- package/dist/cjs/core/commands/table-commands.cjs.map +3 -3
- package/dist/cjs/core/commands/types.cjs.map +2 -2
- package/dist/cjs/core/engine.cjs +22 -1
- package/dist/cjs/core/engine.cjs.map +3 -3
- package/dist/cjs/core/managers/dependency-manager.cjs +157 -2
- package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
- package/dist/cjs/core/managers/evaluation-manager.cjs +32 -1
- package/dist/cjs/core/managers/evaluation-manager.cjs.map +3 -3
- package/dist/cjs/core/managers/frontier-dependency-manager.cjs +4 -4
- package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +3 -3
- package/dist/cjs/core/managers/table-manager.cjs +3 -3
- package/dist/cjs/core/managers/table-manager.cjs.map +3 -3
- package/dist/cjs/core/managers/workbook-manager.cjs +48 -4
- package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
- package/dist/cjs/evaluator/evaluation-context.cjs.map +2 -2
- package/dist/cjs/evaluator/formula-evaluator.cjs.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/core/commands/structure-commands.mjs +3 -3
- package/dist/mjs/core/commands/structure-commands.mjs.map +3 -3
- package/dist/mjs/core/commands/table-commands.mjs +163 -11
- package/dist/mjs/core/commands/table-commands.mjs.map +3 -3
- package/dist/mjs/core/commands/types.mjs.map +2 -2
- package/dist/mjs/core/engine.mjs +22 -1
- package/dist/mjs/core/engine.mjs.map +3 -3
- package/dist/mjs/core/managers/dependency-manager.mjs +157 -2
- package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
- package/dist/mjs/core/managers/evaluation-manager.mjs +32 -1
- package/dist/mjs/core/managers/evaluation-manager.mjs.map +3 -3
- package/dist/mjs/core/managers/frontier-dependency-manager.mjs +4 -4
- package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +3 -3
- package/dist/mjs/core/managers/table-manager.mjs +8 -4
- package/dist/mjs/core/managers/table-manager.mjs.map +3 -3
- package/dist/mjs/core/managers/workbook-manager.mjs +48 -4
- package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
- package/dist/mjs/evaluator/evaluation-context.mjs.map +2 -2
- package/dist/mjs/evaluator/formula-evaluator.mjs.map +1 -1
- package/dist/mjs/package.json +1 -1
- package/dist/types/core/commands/types.d.ts +5 -0
- package/dist/types/core/engine.d.ts +12 -4
- package/dist/types/core/managers/dependency-manager.d.ts +7 -0
- package/dist/types/core/managers/evaluation-manager.d.ts +1 -0
- package/dist/types/core/managers/workbook-manager.d.ts +3 -0
- package/package.json +3 -2
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/core/commands/types.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Command Pattern Types for FormulaEngine\n *\n * Commands encapsulate all mutating operations on the engine,\n * enabling undo/redo, schema validation with rollback, and action serialization.\n */\n\nimport type { CellAddress, RangeAddress, SerializedCellValue } from \"../types.cjs\";\n\nexport type CellContentKind = \"empty\" | \"scalar\" | \"formula\";\n\nexport type RemovedScope =\n | { type: \"workbook\"; workbookName: string }\n | { type: \"sheet\"; workbookName: string; sheetName: string };\n\nexport type MutationInvalidation = {\n touchedCells: Array<{\n address: CellAddress;\n beforeKind: CellContentKind;\n afterKind: CellContentKind;\n }>;\n resourceKeys: string[];\n removedScopes?: RemovedScope[];\n};\n\nexport function getSerializedCellValueKind(\n value: SerializedCellValue | undefined\n): CellContentKind {\n if (\n value === undefined ||\n (typeof value === \"string\" && value.length === 0)\n ) {\n return \"empty\";\n }\n if (typeof value === \"string\" && value.startsWith(\"=\")) {\n return \"formula\";\n }\n return \"scalar\";\n}\n\nexport function emptyMutationInvalidation(): MutationInvalidation {\n return {\n touchedCells: [],\n resourceKeys: [],\n };\n}\n\n/**\n * Serializable action representation of a command.\n * Used for persistence, collaboration, and changelog functionality.\n */\nexport interface EngineAction {\n type: string;\n payload: unknown;\n timestamp?: number;\n}\n\n/**\n * Base interface for all engine commands.\n */\nexport interface EngineCommand {\n /**\n * Whether this command affects cell values/formulas and requires re-evaluation.\n * Commands that only affect metadata or styles don't need re-evaluation.\n */\n readonly requiresReevaluation: boolean;\n\n /**\n * Returns the exact mutation footprint for the last execute/undo pass.\n */\n getInvalidationFootprint?(\n phase: \"execute\" | \"undo\"\n ): MutationInvalidation;\n\n /**\n * Execute the command (forward operation).\n */\n execute(): void;\n\n /**\n * Undo the command (reverse operation).\n */\n undo(): void;\n\n /**\n * Convert the command to a serializable action for persistence/collaboration.\n */\n toAction(): EngineAction;\n}\n\n/**\n * Options for command execution.\n */\nexport interface ExecuteOptions {\n /**\n * Whether to validate schema constraints after execution.\n * Only applies to commands that require re-evaluation.\n */\n validate?: boolean;\n\n /**\n * Whether to skip adding to undo stack (for internal use).\n */\n skipUndoStack?: boolean;\n\n /**\n * Whether to skip emitting update events.\n */\n skipEmitUpdate?: boolean;\n}\n\n/**\n * Result of schema validation.\n */\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: SchemaValidationErrorInfo[];\n}\n\n/**\n * Information about a schema validation error.\n */\nexport interface SchemaValidationErrorInfo {\n message: string;\n cellAddress?: CellAddress;\n schemaNamespace?: string;\n columnName?: string;\n originalError?: Error;\n}\n\n/**\n * Action types for all commands.\n * Used for serialization and deserialization.\n */\nexport const ActionTypes = {\n // Content commands\n SET_CELL_CONTENT: \"SET_CELL_CONTENT\",\n SET_SHEET_CONTENT: \"SET_SHEET_CONTENT\",\n CLEAR_RANGE: \"CLEAR_RANGE\",\n PASTE_CELLS: \"PASTE_CELLS\",\n FILL_AREAS: \"FILL_AREAS\",\n MOVE_CELL: \"MOVE_CELL\",\n MOVE_RANGE: \"MOVE_RANGE\",\n AUTO_FILL: \"AUTO_FILL\",\n\n // Structure commands - Workbook\n ADD_WORKBOOK: \"ADD_WORKBOOK\",\n REMOVE_WORKBOOK: \"REMOVE_WORKBOOK\",\n RENAME_WORKBOOK: \"RENAME_WORKBOOK\",\n CLONE_WORKBOOK: \"CLONE_WORKBOOK\",\n\n // Structure commands - Sheet\n ADD_SHEET: \"ADD_SHEET\",\n REMOVE_SHEET: \"REMOVE_SHEET\",\n RENAME_SHEET: \"RENAME_SHEET\",\n\n // Table commands\n ADD_TABLE: \"ADD_TABLE\",\n REMOVE_TABLE: \"REMOVE_TABLE\",\n RENAME_TABLE: \"RENAME_TABLE\",\n UPDATE_TABLE: \"UPDATE_TABLE\",\n RESET_TABLES: \"RESET_TABLES\",\n\n // Named expression commands\n ADD_NAMED_EXPRESSION: \"ADD_NAMED_EXPRESSION\",\n REMOVE_NAMED_EXPRESSION: \"REMOVE_NAMED_EXPRESSION\",\n UPDATE_NAMED_EXPRESSION: \"UPDATE_NAMED_EXPRESSION\",\n RENAME_NAMED_EXPRESSION: \"RENAME_NAMED_EXPRESSION\",\n SET_NAMED_EXPRESSIONS: \"SET_NAMED_EXPRESSIONS\",\n\n // Metadata commands\n SET_CELL_METADATA: \"SET_CELL_METADATA\",\n SET_SHEET_METADATA: \"SET_SHEET_METADATA\",\n SET_WORKBOOK_METADATA: \"SET_WORKBOOK_METADATA\",\n\n // Style commands\n ADD_CONDITIONAL_STYLE: \"ADD_CONDITIONAL_STYLE\",\n REMOVE_CONDITIONAL_STYLE: \"REMOVE_CONDITIONAL_STYLE\",\n ADD_CELL_STYLE: \"ADD_CELL_STYLE\",\n REMOVE_CELL_STYLE: \"REMOVE_CELL_STYLE\",\n CLEAR_CELL_STYLES: \"CLEAR_CELL_STYLES\",\n\n // State commands\n RESET_TO_SERIALIZED: \"RESET_TO_SERIALIZED\",\n} as const;\n\nexport type ActionType = (typeof ActionTypes)[keyof typeof ActionTypes];\n"
|
|
5
|
+
"/**\n * Command Pattern Types for FormulaEngine\n *\n * Commands encapsulate all mutating operations on the engine,\n * enabling undo/redo, schema validation with rollback, and action serialization.\n */\n\nimport type { CellAddress, RangeAddress, SerializedCellValue } from \"../types.cjs\";\n\nexport type CellContentKind = \"empty\" | \"scalar\" | \"formula\";\n\nexport type RemovedScope =\n | { type: \"workbook\"; workbookName: string }\n | { type: \"sheet\"; workbookName: string; sheetName: string };\n\nexport type MutationInvalidation = {\n touchedCells: Array<{\n address: CellAddress;\n beforeKind: CellContentKind;\n afterKind: CellContentKind;\n }>;\n /**\n * Cells whose table membership or implicit current-row table context changed\n * without necessarily changing their formula text.\n */\n tableContextChangedCells?: CellAddress[];\n resourceKeys: string[];\n removedScopes?: RemovedScope[];\n};\n\nexport function getSerializedCellValueKind(\n value: SerializedCellValue | undefined\n): CellContentKind {\n if (\n value === undefined ||\n (typeof value === \"string\" && value.length === 0)\n ) {\n return \"empty\";\n }\n if (typeof value === \"string\" && value.startsWith(\"=\")) {\n return \"formula\";\n }\n return \"scalar\";\n}\n\nexport function emptyMutationInvalidation(): MutationInvalidation {\n return {\n touchedCells: [],\n resourceKeys: [],\n };\n}\n\n/**\n * Serializable action representation of a command.\n * Used for persistence, collaboration, and changelog functionality.\n */\nexport interface EngineAction {\n type: string;\n payload: unknown;\n timestamp?: number;\n}\n\n/**\n * Base interface for all engine commands.\n */\nexport interface EngineCommand {\n /**\n * Whether this command affects cell values/formulas and requires re-evaluation.\n * Commands that only affect metadata or styles don't need re-evaluation.\n */\n readonly requiresReevaluation: boolean;\n\n /**\n * Returns the exact mutation footprint for the last execute/undo pass.\n */\n getInvalidationFootprint?(\n phase: \"execute\" | \"undo\"\n ): MutationInvalidation;\n\n /**\n * Execute the command (forward operation).\n */\n execute(): void;\n\n /**\n * Undo the command (reverse operation).\n */\n undo(): void;\n\n /**\n * Convert the command to a serializable action for persistence/collaboration.\n */\n toAction(): EngineAction;\n}\n\n/**\n * Options for command execution.\n */\nexport interface ExecuteOptions {\n /**\n * Whether to validate schema constraints after execution.\n * Only applies to commands that require re-evaluation.\n */\n validate?: boolean;\n\n /**\n * Whether to skip adding to undo stack (for internal use).\n */\n skipUndoStack?: boolean;\n\n /**\n * Whether to skip emitting update events.\n */\n skipEmitUpdate?: boolean;\n}\n\n/**\n * Result of schema validation.\n */\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: SchemaValidationErrorInfo[];\n}\n\n/**\n * Information about a schema validation error.\n */\nexport interface SchemaValidationErrorInfo {\n message: string;\n cellAddress?: CellAddress;\n schemaNamespace?: string;\n columnName?: string;\n originalError?: Error;\n}\n\n/**\n * Action types for all commands.\n * Used for serialization and deserialization.\n */\nexport const ActionTypes = {\n // Content commands\n SET_CELL_CONTENT: \"SET_CELL_CONTENT\",\n SET_SHEET_CONTENT: \"SET_SHEET_CONTENT\",\n CLEAR_RANGE: \"CLEAR_RANGE\",\n PASTE_CELLS: \"PASTE_CELLS\",\n FILL_AREAS: \"FILL_AREAS\",\n MOVE_CELL: \"MOVE_CELL\",\n MOVE_RANGE: \"MOVE_RANGE\",\n AUTO_FILL: \"AUTO_FILL\",\n\n // Structure commands - Workbook\n ADD_WORKBOOK: \"ADD_WORKBOOK\",\n REMOVE_WORKBOOK: \"REMOVE_WORKBOOK\",\n RENAME_WORKBOOK: \"RENAME_WORKBOOK\",\n CLONE_WORKBOOK: \"CLONE_WORKBOOK\",\n\n // Structure commands - Sheet\n ADD_SHEET: \"ADD_SHEET\",\n REMOVE_SHEET: \"REMOVE_SHEET\",\n RENAME_SHEET: \"RENAME_SHEET\",\n\n // Table commands\n ADD_TABLE: \"ADD_TABLE\",\n REMOVE_TABLE: \"REMOVE_TABLE\",\n RENAME_TABLE: \"RENAME_TABLE\",\n UPDATE_TABLE: \"UPDATE_TABLE\",\n RESET_TABLES: \"RESET_TABLES\",\n\n // Named expression commands\n ADD_NAMED_EXPRESSION: \"ADD_NAMED_EXPRESSION\",\n REMOVE_NAMED_EXPRESSION: \"REMOVE_NAMED_EXPRESSION\",\n UPDATE_NAMED_EXPRESSION: \"UPDATE_NAMED_EXPRESSION\",\n RENAME_NAMED_EXPRESSION: \"RENAME_NAMED_EXPRESSION\",\n SET_NAMED_EXPRESSIONS: \"SET_NAMED_EXPRESSIONS\",\n\n // Metadata commands\n SET_CELL_METADATA: \"SET_CELL_METADATA\",\n SET_SHEET_METADATA: \"SET_SHEET_METADATA\",\n SET_WORKBOOK_METADATA: \"SET_WORKBOOK_METADATA\",\n\n // Style commands\n ADD_CONDITIONAL_STYLE: \"ADD_CONDITIONAL_STYLE\",\n REMOVE_CONDITIONAL_STYLE: \"REMOVE_CONDITIONAL_STYLE\",\n ADD_CELL_STYLE: \"ADD_CELL_STYLE\",\n REMOVE_CELL_STYLE: \"REMOVE_CELL_STYLE\",\n CLEAR_CELL_STYLES: \"CLEAR_CELL_STYLES\",\n\n // State commands\n RESET_TO_SERIALIZED: \"RESET_TO_SERIALIZED\",\n} as const;\n\nexport type ActionType = (typeof ActionTypes)[keyof typeof ActionTypes];\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BO,SAAS,0BAA0B,CACxC,OACiB;AAAA,EACjB,IACE,UAAU,aACT,OAAO,UAAU,YAAY,MAAM,WAAW,GAC/C;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG,GAAG;AAAA,IACtD,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,yBAAyB,GAAyB;AAAA,EAChE,OAAO;AAAA,IACL,cAAc,CAAC;AAAA,IACf,cAAc,CAAC;AAAA,EACjB;AAAA;AA0FK,IAAM,cAAc;AAAA,EAEzB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EAGX,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAGhB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EAGd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EAGd,sBAAsB;AAAA,EACtB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EAGvB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EAGvB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EAGnB,qBAAqB;AACvB;",
|
|
8
8
|
"debugId": "65098011DD3A30FD64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/core/engine.cjs
CHANGED
|
@@ -409,6 +409,18 @@ class FormulaEngine {
|
|
|
409
409
|
}
|
|
410
410
|
addSheet(opts) {
|
|
411
411
|
this.commandExecutor.execute(new import_structure_commands.AddSheetCommand(this.getStructureCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
412
|
+
const sheet = this.workbookManager.getSheet(opts);
|
|
413
|
+
if (!sheet) {
|
|
414
|
+
throw new Error(`Failed to create sheet '${opts.sheetName}'`);
|
|
415
|
+
}
|
|
416
|
+
return sheet;
|
|
417
|
+
}
|
|
418
|
+
createSheet(opts) {
|
|
419
|
+
const sheetName = opts.sheetName ?? this.workbookManager.getNextAvailableSheetName(opts.workbookName, opts.baseName);
|
|
420
|
+
return this.addSheet({
|
|
421
|
+
workbookName: opts.workbookName,
|
|
422
|
+
sheetName
|
|
423
|
+
});
|
|
412
424
|
}
|
|
413
425
|
removeSheet(opts) {
|
|
414
426
|
this.commandExecutor.execute(new import_structure_commands.RemoveSheetCommand(this.getStructureCommandDeps(), opts), { validate: this.schemaManager.hasSchemas() });
|
|
@@ -422,6 +434,15 @@ class FormulaEngine {
|
|
|
422
434
|
getSheets(workbookName) {
|
|
423
435
|
return this.workbookManager.getSheets(workbookName);
|
|
424
436
|
}
|
|
437
|
+
getOrderedSheets(workbookName) {
|
|
438
|
+
return this.workbookManager.getOrderedSheets(workbookName);
|
|
439
|
+
}
|
|
440
|
+
getOrderedSheetNames(workbookName) {
|
|
441
|
+
return this.workbookManager.getOrderedSheetNames(workbookName);
|
|
442
|
+
}
|
|
443
|
+
getNextAvailableSheetName(workbookName, baseName) {
|
|
444
|
+
return this.workbookManager.getNextAvailableSheetName(workbookName, baseName);
|
|
445
|
+
}
|
|
425
446
|
getSheet({
|
|
426
447
|
workbookName,
|
|
427
448
|
sheetName
|
|
@@ -571,4 +592,4 @@ class FormulaEngine {
|
|
|
571
592
|
}
|
|
572
593
|
}
|
|
573
594
|
|
|
574
|
-
//# debugId=
|
|
595
|
+
//# debugId=979808DBD1ADBF8164756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/core/engine.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Main FormulaEngine class\n * Core API implementation for spreadsheet calculations\n */\n\nimport {\n type CellAddress,\n type CellStyle,\n type ConditionalStyle,\n type CopyCellsOptions,\n type DirectCellStyle,\n type FiniteSpreadsheetRange,\n type NamedExpression,\n type RangeAddress,\n type SerializedCellValue,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"./types.cjs\";\n\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { FormulaEvaluator } from \"../evaluator/formula-evaluator.cjs\";\nimport { AutoFill } from \"./autofill-utils.cjs\";\nimport { WorkbookManager } from \"./managers/workbook-manager.cjs\";\nimport { deserialize, serialize } from \"./map-serializer.cjs\";\nimport { renameNamedExpressionInFormula } from \"./named-expression-renamer.cjs\";\nimport { renameSheetInFormula } from \"./sheet-renamer.cjs\";\nimport { renameTableInFormula } from \"./table-renamer.cjs\";\nimport { renameWorkbookInFormula } from \"./workbook-renamer.cjs\";\nimport {\n cellAddressToKey,\n getCellReference,\n keyToCellAddress,\n parseCellReference,\n} from \"./utils.cjs\";\nimport { CacheManager } from \"./managers/cache-manager.cjs\";\nimport { NamedExpressionManager } from \"./managers/named-expression-manager.cjs\";\nimport { TableManager } from \"./managers/table-manager.cjs\";\nimport { EventManager } from \"./managers/event-manager.cjs\";\nimport { EvaluationManager } from \"./managers/evaluation-manager.cjs\";\nimport { DependencyManager } from \"./managers/dependency-manager.cjs\";\nimport { StyleManager } from \"./managers/style-manager.cjs\";\nimport { CopyManager } from \"./managers/copy-manager.cjs\";\nimport { ReferenceManager } from \"./managers/reference-manager.cjs\";\nimport {\n SchemaManager,\n SchemaValidationError,\n} from \"./managers/schema-manager.cjs\";\nimport type { Schema, CreateSchema, SchemaDeclaration, TableSchemaDefinition, CellSchemaDefinition } from \"./schema/schema.cjs\";\nimport { buildSchemaFromDeclaration } from \"./schema/schema-builder.cjs\";\nimport { TableOrm } from \"./schema/table-orm.cjs\";\nimport { CellOrm } from \"./schema/cell-orm.cjs\";\nimport { GridOrm } from \"./schema/grid-orm.cjs\";\nimport type { TableSchemaHeaders } from \"./managers/schema-manager.cjs\";\nimport {\n ENGINE_SNAPSHOT_VERSION,\n type EngineSnapshotV3,\n} from \"./engine-snapshot.cjs\";\nimport {\n CommandExecutor,\n SchemaIntegrityError,\n} from \"./commands/command-executor.cjs\";\nimport { type EngineAction } from \"./commands/types.cjs\";\nimport {\n SetCellContentCommand,\n SetSheetContentCommand,\n ClearRangeCommand,\n PasteCellsCommand,\n FillAreasCommand,\n MoveCellCommand,\n MoveRangeCommand,\n AutoFillCommand,\n} from \"./commands/content-commands.cjs\";\nimport {\n AddWorkbookCommand,\n RemoveWorkbookCommand,\n RenameWorkbookCommand,\n CloneWorkbookCommand,\n AddSheetCommand,\n RemoveSheetCommand,\n RenameSheetCommand,\n type StructureCommandDeps,\n} from \"./commands/structure-commands.cjs\";\nimport {\n AddTableCommand,\n RemoveTableCommand,\n RenameTableCommand,\n UpdateTableCommand,\n ResetTablesCommand,\n type TableCommandDeps,\n} from \"./commands/table-commands.cjs\";\nimport {\n AddNamedExpressionCommand,\n RemoveNamedExpressionCommand,\n UpdateNamedExpressionCommand,\n RenameNamedExpressionCommand,\n SetNamedExpressionsCommand,\n type NamedExpressionCommandDeps,\n} from \"./commands/named-expression-commands.cjs\";\nimport {\n SetCellMetadataCommand,\n SetSheetMetadataCommand,\n SetWorkbookMetadataCommand,\n} from \"./commands/metadata-commands.cjs\";\nimport {\n AddConditionalStyleCommand,\n RemoveConditionalStyleCommand,\n AddCellStyleCommand,\n RemoveCellStyleCommand,\n ClearCellStylesCommand,\n} from \"./commands/style-commands.cjs\";\n\ntype Metadata = {\n cell?: unknown;\n sheet?: unknown;\n workbook?: unknown;\n};\n\ntype MetadataType<\n TMetadata extends Metadata,\n TKey extends keyof Metadata\n> = TMetadata[TKey];\n\n/**\n * Main FormulaEngine class\n * @template TCellMetadata - Consumer-defined type for cell metadata (rich text, links, custom data, etc.)\n * @template TSheetMetadata - Consumer-defined type for sheet metadata (text boxes, frozen panes, etc.)\n * @template TWorkbookMetadata - Consumer-defined type for workbook metadata (themes, document properties, etc.)\n */\nexport class FormulaEngine<\n TMetadata extends Metadata = Metadata,\n TCreateSchema extends\n | CreateSchema<MetadataType<TMetadata, \"cell\">, Schema, SchemaDeclaration>\n | undefined = undefined\n> {\n private workbookManager: WorkbookManager;\n private namedExpressionManager: NamedExpressionManager;\n private tableManager: TableManager;\n private eventManager: EventManager;\n private evaluationManager: EvaluationManager;\n private autoFillManager: AutoFill;\n private dependencyManager: DependencyManager;\n private styleManager: StyleManager;\n private copyManager: CopyManager;\n private referenceManager: ReferenceManager;\n private schemaManager: SchemaManager;\n private commandExecutor: CommandExecutor;\n\n public schema: TCreateSchema extends CreateSchema<\n MetadataType<TMetadata, \"cell\">,\n Schema,\n SchemaDeclaration\n >\n ? TCreateSchema[\"schema\"]\n : undefined;\n\n private schemaDeclaration: SchemaDeclaration | undefined;\n\n /**\n * Public access to the store manager for testing\n */\n public _workbookManager: WorkbookManager;\n public _namedExpressionManager: NamedExpressionManager;\n public _tableManager: TableManager;\n public _eventManager: EventManager;\n public _evaluationManager: EvaluationManager;\n public _autoFillManager: AutoFill;\n public _dependencyManager: DependencyManager;\n public _styleManager: StyleManager;\n\n constructor(schema?: TCreateSchema) {\n this.schemaDeclaration = (schema as any)?.declaration;\n this.eventManager = new EventManager();\n this.workbookManager = new WorkbookManager();\n this.namedExpressionManager = new NamedExpressionManager();\n this.tableManager = new TableManager(this.workbookManager);\n const cacheManager = new CacheManager();\n this.dependencyManager = new DependencyManager(\n cacheManager,\n this.workbookManager\n );\n\n const formulaEvaluator = new FormulaEvaluator(\n this.tableManager,\n this.dependencyManager,\n this.namedExpressionManager\n );\n\n this.evaluationManager = new EvaluationManager(\n this.workbookManager,\n this.tableManager,\n formulaEvaluator,\n this.dependencyManager\n );\n\n this.styleManager = new StyleManager(this.evaluationManager);\n this.copyManager = new CopyManager(\n this.workbookManager,\n this.evaluationManager,\n this.styleManager\n );\n\n this.autoFillManager = new AutoFill(\n this.workbookManager,\n this.styleManager\n );\n\n this.referenceManager = new ReferenceManager();\n this.schemaManager = new SchemaManager(this.tableManager);\n\n // Initialize command executor\n this.commandExecutor = new CommandExecutor(\n this.evaluationManager,\n this.eventManager,\n () =>\n this.schemaManager.validateAllSchemaConstraints(\n (cell) => this.getCellValue(cell),\n (cell) => this.getCellMetadata(cell),\n (table) => this.getTableDataCells(table)\n )\n );\n\n // Build the working schema from declaration if provided\n if (this.schemaDeclaration) {\n this.schema = buildSchemaFromDeclaration(\n this,\n this.schemaDeclaration,\n this.schemaManager\n ) as any;\n } else {\n this.schema = {} as any;\n }\n\n this._workbookManager = this.workbookManager;\n this._namedExpressionManager = this.namedExpressionManager;\n this._tableManager = this.tableManager;\n this._eventManager = this.eventManager;\n this._evaluationManager = this.evaluationManager;\n this._autoFillManager = this.autoFillManager;\n this._dependencyManager = this.dependencyManager;\n this._styleManager = this.styleManager;\n }\n\n /**\n * Static factory method to build an empty engine\n * @template TC - Consumer-defined cell metadata type\n * @template TS - Consumer-defined sheet metadata type\n * @template TW - Consumer-defined workbook metadata type\n */\n static buildEmpty<\n TMetadata extends Metadata = Metadata,\n TSchemaDeclaration extends\n | CreateSchema<MetadataType<TMetadata, \"cell\">, any, any>\n | undefined = undefined\n >(schema?: TSchemaDeclaration) {\n return new FormulaEngine<TMetadata, TSchemaDeclaration>(schema);\n }\n\n /**\n * Add a table schema at runtime\n * @param namespace - Unique namespace for the schema\n * @param address - Table address (workbookName and tableName)\n * @param headers - Table headers with parse functions\n * @returns The TableOrm instance for immediate use\n */\n addTableSchema<THeaders extends TableSchemaHeaders<MetadataType<TMetadata, \"cell\">>>(\n namespace: string,\n address: { workbookName: string; tableName: string },\n headers: THeaders\n ): TableOrm<{\n [K in keyof THeaders]: ReturnType<THeaders[K][\"parse\"]>;\n }> {\n // Register the schema with the schema manager\n this.schemaManager.registerTableSchema(\n namespace,\n address.workbookName,\n address.tableName,\n headers\n );\n\n // Create the ORM instance\n const orm = new TableOrm<{\n [K in keyof THeaders]: ReturnType<THeaders[K][\"parse\"]>;\n }>(\n this,\n address.workbookName,\n address.tableName,\n headers,\n namespace\n );\n\n // Add to schema object for runtime access\n (this.schema as Record<string, object>)[namespace] = orm;\n\n return orm;\n }\n \n\n /**\n * Add a cell schema at runtime\n * @param namespace - Unique namespace for the schema\n * @param cellAddress - Address of the cell\n * @param parse - Parse function for the cell value\n * @returns The CellOrm instance for immediate use\n */\n addCellSchema<TValue>(\n namespace: string,\n cellAddress: CellAddress,\n parse: (value: unknown, metadata: MetadataType<TMetadata, \"cell\">) => TValue,\n write: (value: TValue) => { value: SerializedCellValue; metadata?: MetadataType<TMetadata, \"cell\"> } = (value) => ({ value: value as unknown as SerializedCellValue })\n ): CellOrm<TValue> {\n // Register the schema with the schema manager\n this.schemaManager.registerCellSchema(namespace, cellAddress, parse);\n\n // Create the ORM instance\n const orm = new CellOrm(this, cellAddress, parse, write, namespace);\n\n // Add to schema object for runtime access\n (this.schema as Record<string, object>)[namespace] = orm;\n\n return orm;\n }\n\n /**\n * Add a grid schema at runtime\n * @param namespace - Unique namespace for the schema\n * @param address - Grid address (workbookName and sheetName)\n * @param range - Finite range of cells for the grid\n * @param parse - Parse function for the cell values\n * @param write - Write function for serializing values (optional for primitive types)\n * @returns The GridOrm instance for immediate use\n */\n addGridSchema<TValue>(\n namespace: string,\n address: { workbookName: string; sheetName: string },\n range: FiniteSpreadsheetRange,\n parse: (value: unknown, metadata: MetadataType<TMetadata, \"cell\">) => TValue,\n write: (value: TValue) => { value: SerializedCellValue; metadata?: MetadataType<TMetadata, \"cell\"> } = (value) => ({ value: value as unknown as SerializedCellValue })\n ): GridOrm<TValue, MetadataType<TMetadata, \"cell\">> {\n // Register the schema with the schema manager\n this.schemaManager.registerGridSchema(\n namespace,\n address.workbookName,\n address.sheetName,\n range,\n parse\n );\n\n // Create the ORM instance\n const orm = new GridOrm<TValue, MetadataType<TMetadata, \"cell\">>(\n this,\n address.workbookName,\n address.sheetName,\n range,\n parse,\n write,\n namespace\n );\n\n // Add to schema object for runtime access\n (this.schema as Record<string, object>)[namespace] = orm;\n\n return orm;\n }\n\n //#region Cell\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n return this.evaluationManager.getCellEvaluationResult(cellAddress);\n }\n\n getCellValue(cellAddress: CellAddress, debug?: boolean): SerializedCellValue {\n const result = this.getCellEvaluationResult(cellAddress);\n if (!result) {\n return \"\";\n }\n\n return this.evaluationManager.evaluationResultToSerializedValue(\n result,\n cellAddress,\n debug\n );\n }\n\n /**\n * Set metadata for a cell\n * Metadata can contain rich text, links, comments, or any consumer-defined data\n */\n setCellMetadata(\n address: CellAddress,\n metadata: MetadataType<TMetadata, \"cell\"> | undefined\n ): void {\n this.commandExecutor.execute(\n new SetCellMetadataCommand(this.workbookManager, address, metadata)\n );\n }\n\n /**\n * Get metadata for a cell\n */\n getCellMetadata(\n address: CellAddress\n ): MetadataType<TMetadata, \"cell\"> | undefined {\n const metadata = this.workbookManager.getCellMetadata(address);\n return metadata as MetadataType<TMetadata, \"cell\"> | undefined;\n }\n\n /**\n * Get all cell metadata for a sheet (serialized as Map)\n */\n getSheetMetadataSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, MetadataType<TMetadata, \"sheet\">> {\n return this.workbookManager.getSheetMetadataSerialized(opts) as Map<\n string,\n MetadataType<TMetadata, \"sheet\">\n >;\n }\n\n /**\n * Set metadata for a sheet\n * Sheet metadata can contain text boxes, frozen panes, print settings, or any consumer-defined data\n */\n setSheetMetadata(\n opts: { workbookName: string; sheetName: string },\n metadata: MetadataType<TMetadata, \"sheet\">\n ): void {\n this.commandExecutor.execute(\n new SetSheetMetadataCommand(this.workbookManager, opts, metadata)\n );\n }\n\n /**\n * Get metadata for a sheet\n */\n getSheetMetadata(opts: {\n workbookName: string;\n sheetName: string;\n }): MetadataType<TMetadata, \"sheet\"> | undefined {\n return this.workbookManager.getSheetMetadata(opts) as\n | MetadataType<TMetadata, \"sheet\">\n | undefined;\n }\n\n /**\n * Set metadata for a workbook\n * Workbook metadata can contain themes, document properties, settings, or any consumer-defined data\n */\n setWorkbookMetadata(\n workbookName: string,\n metadata: MetadataType<TMetadata, \"workbook\">\n ): void {\n this.commandExecutor.execute(\n new SetWorkbookMetadataCommand(\n this.workbookManager,\n workbookName,\n metadata\n )\n );\n }\n\n /**\n * Get metadata for a workbook\n */\n getWorkbookMetadata(\n workbookName: string\n ): MetadataType<TMetadata, \"workbook\"> | undefined {\n return this.workbookManager.getWorkbookMetadata(workbookName) as\n | MetadataType<TMetadata, \"workbook\">\n | undefined;\n }\n\n //#endregion\n\n //#region Reference Tracking\n /**\n * Create a tracked reference to a range\n * Returns a stable UUID that can be used to retrieve the address later\n * The reference automatically updates when sheets/workbooks are renamed\n */\n createRef(address: RangeAddress): string {\n return this.referenceManager.createRef(address);\n }\n\n /**\n * Get the current address for a tracked reference\n * Returns undefined if reference doesn't exist or has been invalidated\n */\n getRefAddress(refId: string): RangeAddress | undefined {\n return this.referenceManager.getRefAddress(refId);\n }\n\n /**\n * Delete a tracked reference\n * Returns true if the reference was deleted, false if it didn't exist\n */\n deleteRef(refId: string): boolean {\n return this.referenceManager.deleteRef(refId);\n }\n\n /**\n * Get all invalid reference IDs\n * Useful for cleanup after sheet/workbook deletions\n */\n getInvalidRefs(): string[] {\n return this.referenceManager.getInvalidRefs();\n }\n //#endregion\n\n evaluateFormula(\n /**\n * formula without the leading = sign\n */\n formula: string,\n cellAddress: CellAddress\n ): SerializedCellValue {\n return this.evaluationManager.evaluateFormula(formula, cellAddress);\n }\n\n getCellDependents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n getCellPrecedents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n //#endregion\n\n //#region Named Expressions\n addNamedExpression(opts: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n this.commandExecutor.execute(\n new AddNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n removeNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n this.commandExecutor.execute(\n new RemoveNamedExpressionCommand(\n this.getNamedExpressionCommandDeps(),\n opts\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Check if a named expression exists\n */\n hasNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): boolean {\n const scope =\n opts.sheetName && opts.workbookName\n ? {\n type: \"sheet\" as const,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n }\n : opts.workbookName\n ? { type: \"workbook\" as const, workbookName: opts.workbookName }\n : { type: \"global\" as const };\n\n return !!this.namedExpressionManager.getNamedExpression({\n name: opts.expressionName,\n scope,\n });\n }\n\n updateNamedExpression(opts: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n this.commandExecutor.execute(\n new UpdateNamedExpressionCommand(\n this.getNamedExpressionCommandDeps(),\n opts\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n renameNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n newName: string;\n }): void {\n this.commandExecutor.execute(\n new RenameNamedExpressionCommand(\n this.getNamedExpressionCommandDeps(),\n opts\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n setNamedExpressions(\n opts: (\n | { type: \"global\" }\n | { type: \"sheet\"; sheetName: string; workbookName: string }\n | { type: \"workbook\"; workbookName: string }\n ) & {\n expressions: Map<string, NamedExpression>;\n }\n ) {\n this.commandExecutor.execute(\n new SetNamedExpressionsCommand(\n this.getNamedExpressionCommandDeps(),\n opts\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n //#endregion\n\n //#region Tables\n addTable(props: {\n tableName: string;\n sheetName: string;\n workbookName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n }): void {\n this.commandExecutor.execute(\n new AddTableCommand(this.getTableCommandDeps(), props),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n renameTable(\n workbookName: string,\n names: { oldName: string; newName: string }\n ): void {\n this.commandExecutor.execute(\n new RenameTableCommand(\n this.getTableCommandDeps(),\n workbookName,\n names.oldName,\n names.newName\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n updateTable(opts: {\n tableName: string;\n sheetName?: string;\n start?: string;\n numRows?: SpreadsheetRangeEnd;\n numCols?: number;\n workbookName: string;\n }): void {\n this.commandExecutor.execute(\n new UpdateTableCommand(this.getTableCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n removeTable(opts: { tableName: string; workbookName: string }): void {\n this.commandExecutor.execute(\n new RemoveTableCommand(this.getTableCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Check if a table exists\n */\n hasTable(opts: { tableName: string; workbookName: string }): boolean {\n return !!this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n }\n\n /**\n * Get a table definition by name\n */\n getTable(opts: {\n tableName: string;\n workbookName: string;\n }): TableDefinition | undefined {\n return this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n }\n\n resetTables(tables: Map<string, Map<string, TableDefinition>>): void {\n this.commandExecutor.execute(\n new ResetTablesCommand(this.getTableCommandDeps(), tables),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n getTables(workbookName: string) {\n return this.tableManager.getTables(workbookName);\n }\n\n isCellInTable(cellAddress: CellAddress): TableDefinition | undefined {\n return this.tableManager.isCellInTable(cellAddress);\n }\n\n /**\n * Get all data cells in a table (excluding header row).\n * Since spills cannot enter tables (they get #SPILL! error), this only\n * needs to return cells with direct content.\n */\n private getTableDataCells(table: TableDefinition): CellAddress[] {\n const { start, endRow, headers } = table;\n const dataStartRow = start.rowIndex + 1;\n const endColIndex = start.colIndex + headers.size - 1;\n\n // Build a RangeAddress for the data area\n const rangeAddress: RangeAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n range: {\n start: { col: start.colIndex, row: dataStartRow },\n end: {\n col: { type: \"number\", value: endColIndex },\n row: endRow,\n },\n },\n };\n\n // Return cells with direct content - spills cannot enter tables\n return this.workbookManager.getCellsInRange(rangeAddress);\n }\n\n //#endregion\n\n //#region Conditional Styling\n /**\n * Add a conditional style rule\n */\n addConditionalStyle(style: ConditionalStyle): void {\n this.commandExecutor.execute(\n new AddConditionalStyleCommand(this.styleManager, style)\n );\n }\n\n /**\n * Remove a conditional style rule by index\n */\n removeConditionalStyle(workbookName: string, index: number): void {\n this.commandExecutor.execute(\n new RemoveConditionalStyleCommand(this.styleManager, workbookName, index)\n );\n }\n\n /**\n * Get the count of conditional styles for a workbook\n */\n getConditionalStyleCount(workbookName: string): number {\n const allStyles = this.styleManager.getAllConditionalStyles();\n return allStyles.filter((s) =>\n s.areas.some((a) => a.workbookName === workbookName)\n ).length;\n }\n\n /**\n * Get all conditional styles intersecting with a range\n */\n getConditionalStylesIntersectingWithRange(\n range: RangeAddress\n ): ConditionalStyle[] {\n return this.styleManager.getConditionalStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the computed style for a specific cell\n */\n getCellStyle(cellAddress: CellAddress): CellStyle | undefined {\n return this.styleManager.getCellStyle(cellAddress);\n }\n\n /**\n * Get all cell styles (for testing and serialization)\n */\n getAllCellStyles(): DirectCellStyle[] {\n return this.styleManager.getAllCellStyles();\n }\n\n /**\n * Get all conditional styles (for testing and serialization)\n */\n getAllConditionalStyles(): ConditionalStyle[] {\n return this.styleManager.getAllConditionalStyles();\n }\n\n /**\n * Add a direct cell style rule\n */\n addCellStyle(style: DirectCellStyle): void {\n this.commandExecutor.execute(\n new AddCellStyleCommand(this.styleManager, style)\n );\n }\n\n /**\n * Remove a direct cell style rule by index\n */\n removeCellStyle(workbookName: string, index: number): void {\n this.commandExecutor.execute(\n new RemoveCellStyleCommand(this.styleManager, workbookName, index)\n );\n }\n\n /**\n * Get the count of direct cell styles for a workbook\n */\n getCellStyleCount(workbookName: string): number {\n const allStyles = this.styleManager.getAllCellStyles();\n return allStyles.filter((s) =>\n s.areas.some((a) => a.workbookName === workbookName)\n ).length;\n }\n\n /**\n * Get all direct cell styles intersecting with a range\n */\n getStylesIntersectingWithRange(range: RangeAddress): DirectCellStyle[] {\n return this.styleManager.getStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the style for a range if all cells in the range have the same style\n * Returns the DirectCellStyle if the range is completely contained within a single style's area\n * Returns undefined if multiple styles, partial coverage, or no styles apply\n */\n getStyleForRange(range: RangeAddress): DirectCellStyle | undefined {\n return this.styleManager.getStyleForRange(range);\n }\n\n /**\n * Clear all cell styles and conditional styles for a given range\n * Adjusts existing style ranges rather than deleting them entirely\n */\n clearCellStyles(range: RangeAddress): void {\n this.commandExecutor.execute(\n new ClearCellStylesCommand(this.styleManager, range)\n );\n }\n\n //#endregion\n\n //#region Copy/Paste\n /**\n * Paste cells from source to target\n */\n pasteCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n this.commandExecutor.execute(\n new PasteCellsCommand(\n this.workbookManager,\n this.copyManager,\n source,\n target,\n options\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Fill one or more areas with a seed range's content/style\n * Uses column-first strategy: fills down, then replicates right\n * Formulas are adjusted based on each target cell's offset from the seed\n *\n * @param seedRange - The range to use as a template/pattern\n * @param targetRanges - One or more range addresses to fill\n * @param options - Copy options (target: 'all'|'content'|'style', type: 'value'|'formula', cut: boolean)\n *\n * @example\n * // Fill F6:J10 with A1:B2 seed (2x2 pattern fills 5x5 area)\n * engine.fillAreas(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 1 }, row: { type: \"number\", value: 1 } }\n * }\n * },\n * [{\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 5, row: 5 },\n * end: { col: { type: \"number\", value: 9 }, row: { type: \"number\", value: 9 } }\n * }\n * }],\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n fillAreas(\n seedRange: RangeAddress,\n targetRanges: RangeAddress[],\n options: CopyCellsOptions\n ): void {\n this.commandExecutor.execute(\n new FillAreasCommand(\n this.workbookManager,\n this.copyManager,\n seedRange,\n targetRanges,\n options\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Smart paste that automatically determines whether to paste or fill\n * Handles multiple selection areas - each area is independently pasted or filled\n * - If area is larger than source, uses fillAreas() to fill the area\n * - If area is same size or smaller, uses pasteCells() for normal paste\n *\n * @param sourceCells - The copied cells\n * @param pasteSelection - One or more selection areas where user is pasting\n * @param options - Copy options\n *\n * @example\n * // Copy A1, paste into two areas B1:C2 and E5:F6 - both get filled\n * engine.smartPaste(\n * [{ workbookName, sheetName, colIndex: 0, rowIndex: 0 }],\n * {\n * workbookName,\n * sheetName,\n * areas: [\n * { start: { col: 1, row: 0 }, end: { col: { type: \"number\", value: 2 }, row: { type: \"number\", value: 1 } } },\n * { start: { col: 4, row: 4 }, end: { col: { type: \"number\", value: 5 }, row: { type: \"number\", value: 5 } } }\n * ]\n * },\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n smartPaste(\n sourceCells: CellAddress[],\n pasteSelection: {\n workbookName: string;\n sheetName: string;\n areas: SpreadsheetRange[];\n },\n options: CopyCellsOptions\n ): void {\n if (sourceCells.length === 0) {\n return;\n }\n\n // If cut operation, always use pasteCells (never fillAreas)\n // Cut should be a simple move operation, not a fill\n if (options.cut === true) {\n for (const area of pasteSelection.areas) {\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: area.start.col,\n rowIndex: area.start.row,\n };\n this.pasteCells(sourceCells, target, options);\n }\n return;\n }\n\n // For copy operations (not cut), use smart paste/fill logic\n // Calculate source bounds once\n const sourceBounds = this.getBoundsFromCells(sourceCells);\n const sourceWidth = sourceBounds.maxCol - sourceBounds.minCol + 1;\n const sourceHeight = sourceBounds.maxRow - sourceBounds.minRow + 1;\n\n // Create seed range for fill operations\n const seedRange: RangeAddress = {\n workbookName: sourceCells[0]!.workbookName,\n sheetName: sourceCells[0]!.sheetName,\n range: {\n start: { col: sourceBounds.minCol, row: sourceBounds.minRow },\n end: {\n col: { type: \"number\", value: sourceBounds.maxCol },\n row: { type: \"number\", value: sourceBounds.maxRow },\n },\n },\n };\n\n // Process each selected area independently\n for (const area of pasteSelection.areas) {\n const pasteStartCol = area.start.col;\n const pasteStartRow = area.start.row;\n const pasteEndCol =\n area.end.col.type === \"number\" ? area.end.col.value : pasteStartCol;\n const pasteEndRow =\n area.end.row.type === \"number\" ? area.end.row.value : pasteStartRow;\n\n const pasteWidth = pasteEndCol - pasteStartCol + 1;\n const pasteHeight = pasteEndRow - pasteStartRow + 1;\n\n // Decide per area: paste or fill?\n const shouldFill = pasteWidth > sourceWidth || pasteHeight > sourceHeight;\n\n if (shouldFill) {\n // Use fillAreas for this area\n const targetRange: RangeAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n range: {\n start: { col: pasteStartCol, row: pasteStartRow },\n end: {\n col: { type: \"number\", value: pasteEndCol },\n row: { type: \"number\", value: pasteEndRow },\n },\n },\n };\n\n this.fillAreas(seedRange, [targetRange], options);\n } else {\n // Use pasteCells for this area\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: pasteStartCol,\n rowIndex: pasteStartRow,\n };\n\n this.pasteCells(sourceCells, target, options);\n }\n }\n }\n\n /**\n * Get bounds (min/max row/col) from an array of cell addresses\n */\n private getBoundsFromCells(cells: CellAddress[]): {\n minCol: number;\n minRow: number;\n maxCol: number;\n maxRow: number;\n } {\n if (cells.length === 0) {\n throw new Error(\"Cannot get bounds from empty cell array\");\n }\n\n let minCol = Infinity;\n let minRow = Infinity;\n let maxCol = -Infinity;\n let maxRow = -Infinity;\n\n for (const cell of cells) {\n minCol = Math.min(minCol, cell.colIndex);\n minRow = Math.min(minRow, cell.rowIndex);\n maxCol = Math.max(maxCol, cell.colIndex);\n maxRow = Math.max(maxRow, cell.rowIndex);\n }\n\n return { minCol, minRow, maxCol, maxRow };\n }\n\n /**\n * Move a single cell to a new location\n * Updates all formula references that point to the moved cell\n *\n * @param source - The cell to move\n * @param target - The destination cell address\n *\n * @example\n * // Move A1 to D5. If B1 contains =A1, it will be updated to =D5\n * engine.moveCell(\n * { workbookName, sheetName, colIndex: 0, rowIndex: 0 },\n * { workbookName, sheetName, colIndex: 3, rowIndex: 4 }\n * );\n */\n moveCell(source: CellAddress, target: CellAddress): void {\n this.commandExecutor.execute(\n new MoveCellCommand(\n this.workbookManager,\n this.copyManager,\n source,\n target\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Move a range of cells to a new location\n * Updates all formula references that point to the moved cells\n *\n * @param sourceRange - The range to move\n * @param target - The top-left destination cell address\n *\n * @example\n * // Move A1:D5 to F10. If E1 contains =SUM(A1:D5), it will be updated to =SUM(F10:I14)\n * engine.moveRange(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 3 }, row: { type: \"number\", value: 4 } }\n * }\n * },\n * { workbookName, sheetName, colIndex: 5, rowIndex: 9 }\n * );\n */\n moveRange(sourceRange: RangeAddress, target: CellAddress): void {\n this.commandExecutor.execute(\n new MoveRangeCommand(\n this.workbookManager,\n this.copyManager,\n sourceRange,\n target\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n //#endregion\n\n //#region Sheets\n addSheet(opts: { workbookName: string; sheetName: string }): void {\n this.commandExecutor.execute(\n new AddSheetCommand(this.getStructureCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n removeSheet(opts: { workbookName: string; sheetName: string }): void {\n this.commandExecutor.execute(\n new RemoveSheetCommand(this.getStructureCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n renameSheet(opts: {\n sheetName: string;\n newSheetName: string;\n workbookName: string;\n }): void {\n this.commandExecutor.execute(\n new RenameSheetCommand(this.getStructureCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Check if a sheet exists\n */\n hasSheet(opts: { workbookName: string; sheetName: string }): boolean {\n return !!this.workbookManager.getSheet(opts);\n }\n\n getSheets(workbookName: string) {\n return this.workbookManager.getSheets(workbookName);\n }\n\n getSheet({\n workbookName,\n sheetName,\n }: {\n workbookName: string;\n sheetName: string;\n }) {\n return this.workbookManager.getSheet({ workbookName, sheetName });\n }\n\n getSheetSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, SerializedCellValue> {\n return this.workbookManager.getSheetSerialized(opts);\n }\n\n //#endregion\n\n //#region Workbook\n addWorkbook(workbookName: string): void {\n this.commandExecutor.execute(\n new AddWorkbookCommand(this.getStructureCommandDeps(), workbookName),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n removeWorkbook(workbookName: string): void {\n this.commandExecutor.execute(\n new RemoveWorkbookCommand(this.getStructureCommandDeps(), workbookName),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Check if a workbook exists\n */\n hasWorkbook(workbookName: string): boolean {\n return this.workbookManager.getWorkbooks().has(workbookName);\n }\n\n cloneWorkbook(fromWorkbookName: string, toWorkbookName: string): void {\n this.commandExecutor.execute(\n new CloneWorkbookCommand(\n this.getStructureCommandDeps(),\n fromWorkbookName,\n toWorkbookName\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n renameWorkbook(opts: { workbookName: string; newWorkbookName: string }) {\n this.commandExecutor.execute(\n new RenameWorkbookCommand(\n this.getStructureCommandDeps(),\n opts.workbookName,\n opts.newWorkbookName\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n getWorkbooks() {\n return this.workbookManager.getWorkbooks();\n }\n //#endregion\n\n //#region CRUD Operations\n /**\n * Overrides the content of a sheet.\n * @param sheetName - The name of the sheet to set the content of\n * @param content - A map of cell addresses to their serialized values\n * @remarks This method is used to set the content of a sheet. It will re-evaluate all sheets to ensure all dependencies are resolved correctly.\n * @throws SchemaIntegrityError if any evaluated cell value violates a schema constraint\n */\n setSheetContent(\n opts: { sheetName: string; workbookName: string },\n content: Map<string, SerializedCellValue>\n ) {\n this.commandExecutor.execute(\n new SetSheetContentCommand(this.workbookManager, opts, content),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Set the content of a single cell.\n * @throws SchemaIntegrityError if the evaluated value violates a schema constraint\n */\n setCellContent(address: CellAddress, content: SerializedCellValue) {\n this.commandExecutor.execute(\n new SetCellContentCommand(this.workbookManager, address, content),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n //#endregion\n\n //#region Auto-fill\n /**\n * Auto-fills one or more ranges based on the seedRange and the direction.\n * Supports pattern detection and style copying.\n */\n autoFill(\n opts: { sheetName: string; workbookName: string },\n /**\n * The user's original selection that defines the pattern/series.\n */\n seedRange: SpreadsheetRange,\n /**\n * One or more ranges to fill (the new cells populated by the drag, excluding the seed)\n */\n fillRanges: SpreadsheetRange[],\n /**\n * The direction of the fill.\n */\n direction: FillDirection\n ): void {\n this.commandExecutor.execute(\n new AutoFillCommand(\n this.workbookManager,\n this.styleManager,\n this.autoFillManager,\n opts,\n seedRange,\n fillRanges,\n direction\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Removes the content in the spreadsheet that is inside the range.\n */\n clearSpreadsheetRange(address: RangeAddress) {\n this.commandExecutor.execute(\n new ClearRangeCommand(this.workbookManager, address),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n //#endregion\n\n //#region State - UI library integration\n getState() {\n return {\n workbooks: this.workbookManager.getWorkbooks(),\n namedExpressions: this.namedExpressionManager.getNamedExpressions(),\n tables: this.tableManager.tables,\n conditionalStyles: this.styleManager.getAllConditionalStyles(),\n cellStyles: this.styleManager.getAllCellStyles(),\n references: this.referenceManager.getAllReferences(),\n };\n }\n\n onUpdate(listener: () => void) {\n return this.eventManager.onUpdate(listener);\n }\n\n private buildSerializedSnapshot(): EngineSnapshotV3 {\n const evaluationSnapshots = this.dependencyManager.toSnapshot(\n this.evaluationManager\n );\n\n return {\n version: ENGINE_SNAPSHOT_VERSION,\n managers: {\n workbook: this.workbookManager.toSnapshot(),\n namedExpression: this.namedExpressionManager.toSnapshot(),\n table: this.tableManager.toSnapshot(),\n style: this.styleManager.toSnapshot(),\n reference: this.referenceManager.toSnapshot(),\n dependency: evaluationSnapshots.dependency,\n cache: evaluationSnapshots.cache,\n },\n };\n }\n\n serializeEngine(): string {\n return serialize(this.buildSerializedSnapshot());\n }\n\n resetToSerializedEngine(data: string) {\n const deserialized = deserialize(data) as Partial<EngineSnapshotV3>;\n if (\n !deserialized ||\n typeof deserialized !== \"object\" ||\n deserialized.version !== ENGINE_SNAPSHOT_VERSION ||\n !deserialized.managers\n ) {\n throw new Error(\n \"Unsupported serialized engine format. Expected EngineSnapshot version 3.\"\n );\n }\n\n this.workbookManager.restoreFromSnapshot(deserialized.managers.workbook);\n\n deserialized.managers.workbook.forEach((workbook) => {\n this.namedExpressionManager.addWorkbook(workbook.name);\n workbook.sheets.forEach((sheet) => {\n this.namedExpressionManager.addSheet({\n workbookName: workbook.name,\n sheetName: sheet.name,\n });\n });\n });\n\n this.namedExpressionManager.restoreFromSnapshot(\n deserialized.managers.namedExpression\n );\n this.tableManager.restoreFromSnapshot(deserialized.managers.table);\n this.styleManager.restoreFromSnapshot(deserialized.managers.style);\n this.referenceManager.restoreFromSnapshot(deserialized.managers.reference);\n this.dependencyManager.restoreFromSnapshot(\n {\n dependency: deserialized.managers.dependency,\n cache: deserialized.managers.cache,\n },\n this.evaluationManager\n );\n this.commandExecutor.clearHistory();\n this.commandExecutor.clearActionLog();\n\n this.eventManager.emitUpdate();\n }\n //#endregion\n\n //#region Undo/Redo\n /**\n * Undo the last command.\n * @returns true if undo was performed, false if nothing to undo\n */\n undo(): boolean {\n return this.commandExecutor.undo();\n }\n\n /**\n * Redo the last undone command.\n * @returns true if redo was performed, false if nothing to redo\n */\n redo(): boolean {\n return this.commandExecutor.redo();\n }\n\n /**\n * Check if undo is available.\n */\n canUndo(): boolean {\n return this.commandExecutor.canUndo();\n }\n\n /**\n * Check if redo is available.\n */\n canRedo(): boolean {\n return this.commandExecutor.canRedo();\n }\n\n /**\n * Get the action log for persistence/collaboration.\n * Actions can be serialized and replayed to reconstruct state.\n */\n getActionLog(): EngineAction[] {\n return this.commandExecutor.getActionLog();\n }\n\n /**\n * Clear the action log.\n */\n clearActionLog(): void {\n this.commandExecutor.clearActionLog();\n }\n\n /**\n * Clear undo/redo history.\n */\n clearHistory(): void {\n this.commandExecutor.clearHistory();\n }\n //#endregion\n\n //#region Command Dependencies (internal)\n /**\n * Get dependencies for structure commands.\n * @internal\n */\n private getStructureCommandDeps(): StructureCommandDeps {\n return {\n workbookManager: this.workbookManager,\n namedExpressionManager: this.namedExpressionManager,\n tableManager: this.tableManager,\n styleManager: this.styleManager,\n referenceManager: this.referenceManager,\n apiSchemaManager: this.schemaManager,\n renameSheetInFormula,\n renameWorkbookInFormula,\n };\n }\n\n /**\n * Get dependencies for table commands.\n * @internal\n */\n private getTableCommandDeps(): TableCommandDeps {\n return {\n tableManager: this.tableManager,\n namedExpressionManager: this.namedExpressionManager,\n workbookManager: this.workbookManager,\n apiSchemaManager: this.schemaManager,\n getCellValue: (cell) => this.getCellValue(cell),\n renameTableInFormula,\n };\n }\n\n /**\n * Get dependencies for named expression commands.\n * @internal\n */\n private getNamedExpressionCommandDeps(): NamedExpressionCommandDeps {\n return {\n namedExpressionManager: this.namedExpressionManager,\n workbookManager: this.workbookManager,\n renameNamedExpressionInFormula,\n };\n }\n //#endregion\n}\n"
|
|
5
|
+
"/**\n * Main FormulaEngine class\n * Core API implementation for spreadsheet calculations\n */\n\nimport {\n type CellAddress,\n type CellStyle,\n type ConditionalStyle,\n type CopyCellsOptions,\n type DirectCellStyle,\n type FiniteSpreadsheetRange,\n type NamedExpression,\n type RangeAddress,\n type SerializedCellValue,\n type Sheet,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"./types.cjs\";\n\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { FormulaEvaluator } from \"../evaluator/formula-evaluator.cjs\";\nimport { AutoFill } from \"./autofill-utils.cjs\";\nimport { WorkbookManager } from \"./managers/workbook-manager.cjs\";\nimport { deserialize, serialize } from \"./map-serializer.cjs\";\nimport { renameNamedExpressionInFormula } from \"./named-expression-renamer.cjs\";\nimport { renameSheetInFormula } from \"./sheet-renamer.cjs\";\nimport { renameTableInFormula } from \"./table-renamer.cjs\";\nimport { renameWorkbookInFormula } from \"./workbook-renamer.cjs\";\nimport {\n cellAddressToKey,\n getCellReference,\n keyToCellAddress,\n parseCellReference,\n} from \"./utils.cjs\";\nimport { CacheManager } from \"./managers/cache-manager.cjs\";\nimport { NamedExpressionManager } from \"./managers/named-expression-manager.cjs\";\nimport { TableManager } from \"./managers/table-manager.cjs\";\nimport { EventManager } from \"./managers/event-manager.cjs\";\nimport { EvaluationManager } from \"./managers/evaluation-manager.cjs\";\nimport { DependencyManager } from \"./managers/dependency-manager.cjs\";\nimport { StyleManager } from \"./managers/style-manager.cjs\";\nimport { CopyManager } from \"./managers/copy-manager.cjs\";\nimport { ReferenceManager } from \"./managers/reference-manager.cjs\";\nimport {\n SchemaManager,\n SchemaValidationError,\n} from \"./managers/schema-manager.cjs\";\nimport type { Schema, CreateSchema, SchemaDeclaration, TableSchemaDefinition, CellSchemaDefinition } from \"./schema/schema.cjs\";\nimport { buildSchemaFromDeclaration } from \"./schema/schema-builder.cjs\";\nimport { TableOrm } from \"./schema/table-orm.cjs\";\nimport { CellOrm } from \"./schema/cell-orm.cjs\";\nimport { GridOrm } from \"./schema/grid-orm.cjs\";\nimport type { TableSchemaHeaders } from \"./managers/schema-manager.cjs\";\nimport {\n ENGINE_SNAPSHOT_VERSION,\n type EngineSnapshotV3,\n} from \"./engine-snapshot.cjs\";\nimport {\n CommandExecutor,\n SchemaIntegrityError,\n} from \"./commands/command-executor.cjs\";\nimport { type EngineAction } from \"./commands/types.cjs\";\nimport {\n SetCellContentCommand,\n SetSheetContentCommand,\n ClearRangeCommand,\n PasteCellsCommand,\n FillAreasCommand,\n MoveCellCommand,\n MoveRangeCommand,\n AutoFillCommand,\n} from \"./commands/content-commands.cjs\";\nimport {\n AddWorkbookCommand,\n RemoveWorkbookCommand,\n RenameWorkbookCommand,\n CloneWorkbookCommand,\n AddSheetCommand,\n RemoveSheetCommand,\n RenameSheetCommand,\n type StructureCommandDeps,\n} from \"./commands/structure-commands.cjs\";\nimport {\n AddTableCommand,\n RemoveTableCommand,\n RenameTableCommand,\n UpdateTableCommand,\n ResetTablesCommand,\n type TableCommandDeps,\n} from \"./commands/table-commands.cjs\";\nimport {\n AddNamedExpressionCommand,\n RemoveNamedExpressionCommand,\n UpdateNamedExpressionCommand,\n RenameNamedExpressionCommand,\n SetNamedExpressionsCommand,\n type NamedExpressionCommandDeps,\n} from \"./commands/named-expression-commands.cjs\";\nimport {\n SetCellMetadataCommand,\n SetSheetMetadataCommand,\n SetWorkbookMetadataCommand,\n} from \"./commands/metadata-commands.cjs\";\nimport {\n AddConditionalStyleCommand,\n RemoveConditionalStyleCommand,\n AddCellStyleCommand,\n RemoveCellStyleCommand,\n ClearCellStylesCommand,\n} from \"./commands/style-commands.cjs\";\n\ntype Metadata = {\n cell?: unknown;\n sheet?: unknown;\n workbook?: unknown;\n};\n\ntype MetadataType<\n TMetadata extends Metadata,\n TKey extends keyof Metadata\n> = TMetadata[TKey];\n\n/**\n * Main FormulaEngine class\n * @template TCellMetadata - Consumer-defined type for cell metadata (rich text, links, custom data, etc.)\n * @template TSheetMetadata - Consumer-defined type for sheet metadata (text boxes, frozen panes, etc.)\n * @template TWorkbookMetadata - Consumer-defined type for workbook metadata (themes, document properties, etc.)\n */\nexport class FormulaEngine<\n TMetadata extends Metadata = Metadata,\n TCreateSchema extends\n | CreateSchema<MetadataType<TMetadata, \"cell\">, Schema, SchemaDeclaration>\n | undefined = undefined\n> {\n private workbookManager: WorkbookManager;\n private namedExpressionManager: NamedExpressionManager;\n private tableManager: TableManager;\n private eventManager: EventManager;\n private evaluationManager: EvaluationManager;\n private autoFillManager: AutoFill;\n private dependencyManager: DependencyManager;\n private styleManager: StyleManager;\n private copyManager: CopyManager;\n private referenceManager: ReferenceManager;\n private schemaManager: SchemaManager;\n private commandExecutor: CommandExecutor;\n\n public schema: TCreateSchema extends CreateSchema<\n MetadataType<TMetadata, \"cell\">,\n Schema,\n SchemaDeclaration\n >\n ? TCreateSchema[\"schema\"]\n : undefined;\n\n private schemaDeclaration: SchemaDeclaration | undefined;\n\n /**\n * Public access to the store manager for testing\n */\n public _workbookManager: WorkbookManager;\n public _namedExpressionManager: NamedExpressionManager;\n public _tableManager: TableManager;\n public _eventManager: EventManager;\n public _evaluationManager: EvaluationManager;\n public _autoFillManager: AutoFill;\n public _dependencyManager: DependencyManager;\n public _styleManager: StyleManager;\n\n constructor(schema?: TCreateSchema) {\n this.schemaDeclaration = (schema as any)?.declaration;\n this.eventManager = new EventManager();\n this.workbookManager = new WorkbookManager();\n this.namedExpressionManager = new NamedExpressionManager();\n this.tableManager = new TableManager(this.workbookManager);\n const cacheManager = new CacheManager();\n this.dependencyManager = new DependencyManager(\n cacheManager,\n this.workbookManager\n );\n\n const formulaEvaluator = new FormulaEvaluator(\n this.tableManager,\n this.dependencyManager,\n this.namedExpressionManager\n );\n\n this.evaluationManager = new EvaluationManager(\n this.workbookManager,\n this.tableManager,\n formulaEvaluator,\n this.dependencyManager\n );\n\n this.styleManager = new StyleManager(this.evaluationManager);\n this.copyManager = new CopyManager(\n this.workbookManager,\n this.evaluationManager,\n this.styleManager\n );\n\n this.autoFillManager = new AutoFill(\n this.workbookManager,\n this.styleManager\n );\n\n this.referenceManager = new ReferenceManager();\n this.schemaManager = new SchemaManager(this.tableManager);\n\n // Initialize command executor\n this.commandExecutor = new CommandExecutor(\n this.evaluationManager,\n this.eventManager,\n () =>\n this.schemaManager.validateAllSchemaConstraints(\n (cell) => this.getCellValue(cell),\n (cell) => this.getCellMetadata(cell),\n (table) => this.getTableDataCells(table)\n )\n );\n\n // Build the working schema from declaration if provided\n if (this.schemaDeclaration) {\n this.schema = buildSchemaFromDeclaration(\n this,\n this.schemaDeclaration,\n this.schemaManager\n ) as any;\n } else {\n this.schema = {} as any;\n }\n\n this._workbookManager = this.workbookManager;\n this._namedExpressionManager = this.namedExpressionManager;\n this._tableManager = this.tableManager;\n this._eventManager = this.eventManager;\n this._evaluationManager = this.evaluationManager;\n this._autoFillManager = this.autoFillManager;\n this._dependencyManager = this.dependencyManager;\n this._styleManager = this.styleManager;\n }\n\n /**\n * Static factory method to build an empty engine\n * @template TC - Consumer-defined cell metadata type\n * @template TS - Consumer-defined sheet metadata type\n * @template TW - Consumer-defined workbook metadata type\n */\n static buildEmpty<\n TMetadata extends Metadata = Metadata,\n TSchemaDeclaration extends\n | CreateSchema<MetadataType<TMetadata, \"cell\">, any, any>\n | undefined = undefined\n >(schema?: TSchemaDeclaration) {\n return new FormulaEngine<TMetadata, TSchemaDeclaration>(schema);\n }\n\n /**\n * Add a table schema at runtime\n * @param namespace - Unique namespace for the schema\n * @param address - Table address (workbookName and tableName)\n * @param headers - Table headers with parse functions\n * @returns The TableOrm instance for immediate use\n */\n addTableSchema<THeaders extends TableSchemaHeaders<MetadataType<TMetadata, \"cell\">>>(\n namespace: string,\n address: { workbookName: string; tableName: string },\n headers: THeaders\n ): TableOrm<{\n [K in keyof THeaders]: ReturnType<THeaders[K][\"parse\"]>;\n }> {\n // Register the schema with the schema manager\n this.schemaManager.registerTableSchema(\n namespace,\n address.workbookName,\n address.tableName,\n headers\n );\n\n // Create the ORM instance\n const orm = new TableOrm<{\n [K in keyof THeaders]: ReturnType<THeaders[K][\"parse\"]>;\n }>(\n this,\n address.workbookName,\n address.tableName,\n headers,\n namespace\n );\n\n // Add to schema object for runtime access\n (this.schema as Record<string, object>)[namespace] = orm;\n\n return orm;\n }\n \n\n /**\n * Add a cell schema at runtime\n * @param namespace - Unique namespace for the schema\n * @param cellAddress - Address of the cell\n * @param parse - Parse function for the cell value\n * @returns The CellOrm instance for immediate use\n */\n addCellSchema<TValue>(\n namespace: string,\n cellAddress: CellAddress,\n parse: (value: unknown, metadata: MetadataType<TMetadata, \"cell\">) => TValue,\n write: (value: TValue) => { value: SerializedCellValue; metadata?: MetadataType<TMetadata, \"cell\"> } = (value) => ({ value: value as unknown as SerializedCellValue })\n ): CellOrm<TValue> {\n // Register the schema with the schema manager\n this.schemaManager.registerCellSchema(namespace, cellAddress, parse);\n\n // Create the ORM instance\n const orm = new CellOrm(this, cellAddress, parse, write, namespace);\n\n // Add to schema object for runtime access\n (this.schema as Record<string, object>)[namespace] = orm;\n\n return orm;\n }\n\n /**\n * Add a grid schema at runtime\n * @param namespace - Unique namespace for the schema\n * @param address - Grid address (workbookName and sheetName)\n * @param range - Finite range of cells for the grid\n * @param parse - Parse function for the cell values\n * @param write - Write function for serializing values (optional for primitive types)\n * @returns The GridOrm instance for immediate use\n */\n addGridSchema<TValue>(\n namespace: string,\n address: { workbookName: string; sheetName: string },\n range: FiniteSpreadsheetRange,\n parse: (value: unknown, metadata: MetadataType<TMetadata, \"cell\">) => TValue,\n write: (value: TValue) => { value: SerializedCellValue; metadata?: MetadataType<TMetadata, \"cell\"> } = (value) => ({ value: value as unknown as SerializedCellValue })\n ): GridOrm<TValue, MetadataType<TMetadata, \"cell\">> {\n // Register the schema with the schema manager\n this.schemaManager.registerGridSchema(\n namespace,\n address.workbookName,\n address.sheetName,\n range,\n parse\n );\n\n // Create the ORM instance\n const orm = new GridOrm<TValue, MetadataType<TMetadata, \"cell\">>(\n this,\n address.workbookName,\n address.sheetName,\n range,\n parse,\n write,\n namespace\n );\n\n // Add to schema object for runtime access\n (this.schema as Record<string, object>)[namespace] = orm;\n\n return orm;\n }\n\n //#region Cell\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n return this.evaluationManager.getCellEvaluationResult(cellAddress);\n }\n\n getCellValue(cellAddress: CellAddress, debug?: boolean): SerializedCellValue {\n const result = this.getCellEvaluationResult(cellAddress);\n if (!result) {\n return \"\";\n }\n\n return this.evaluationManager.evaluationResultToSerializedValue(\n result,\n cellAddress,\n debug\n );\n }\n\n /**\n * Set metadata for a cell\n * Metadata can contain rich text, links, comments, or any consumer-defined data\n */\n setCellMetadata(\n address: CellAddress,\n metadata: MetadataType<TMetadata, \"cell\"> | undefined\n ): void {\n this.commandExecutor.execute(\n new SetCellMetadataCommand(this.workbookManager, address, metadata)\n );\n }\n\n /**\n * Get metadata for a cell\n */\n getCellMetadata(\n address: CellAddress\n ): MetadataType<TMetadata, \"cell\"> | undefined {\n const metadata = this.workbookManager.getCellMetadata(address);\n return metadata as MetadataType<TMetadata, \"cell\"> | undefined;\n }\n\n /**\n * Get all cell metadata for a sheet (serialized as Map)\n */\n getSheetMetadataSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, MetadataType<TMetadata, \"sheet\">> {\n return this.workbookManager.getSheetMetadataSerialized(opts) as Map<\n string,\n MetadataType<TMetadata, \"sheet\">\n >;\n }\n\n /**\n * Set metadata for a sheet\n * Sheet metadata can contain text boxes, frozen panes, print settings, or any consumer-defined data\n */\n setSheetMetadata(\n opts: { workbookName: string; sheetName: string },\n metadata: MetadataType<TMetadata, \"sheet\">\n ): void {\n this.commandExecutor.execute(\n new SetSheetMetadataCommand(this.workbookManager, opts, metadata)\n );\n }\n\n /**\n * Get metadata for a sheet\n */\n getSheetMetadata(opts: {\n workbookName: string;\n sheetName: string;\n }): MetadataType<TMetadata, \"sheet\"> | undefined {\n return this.workbookManager.getSheetMetadata(opts) as\n | MetadataType<TMetadata, \"sheet\">\n | undefined;\n }\n\n /**\n * Set metadata for a workbook\n * Workbook metadata can contain themes, document properties, settings, or any consumer-defined data\n */\n setWorkbookMetadata(\n workbookName: string,\n metadata: MetadataType<TMetadata, \"workbook\">\n ): void {\n this.commandExecutor.execute(\n new SetWorkbookMetadataCommand(\n this.workbookManager,\n workbookName,\n metadata\n )\n );\n }\n\n /**\n * Get metadata for a workbook\n */\n getWorkbookMetadata(\n workbookName: string\n ): MetadataType<TMetadata, \"workbook\"> | undefined {\n return this.workbookManager.getWorkbookMetadata(workbookName) as\n | MetadataType<TMetadata, \"workbook\">\n | undefined;\n }\n\n //#endregion\n\n //#region Reference Tracking\n /**\n * Create a tracked reference to a range\n * Returns a stable UUID that can be used to retrieve the address later\n * The reference automatically updates when sheets/workbooks are renamed\n */\n createRef(address: RangeAddress): string {\n return this.referenceManager.createRef(address);\n }\n\n /**\n * Get the current address for a tracked reference\n * Returns undefined if reference doesn't exist or has been invalidated\n */\n getRefAddress(refId: string): RangeAddress | undefined {\n return this.referenceManager.getRefAddress(refId);\n }\n\n /**\n * Delete a tracked reference\n * Returns true if the reference was deleted, false if it didn't exist\n */\n deleteRef(refId: string): boolean {\n return this.referenceManager.deleteRef(refId);\n }\n\n /**\n * Get all invalid reference IDs\n * Useful for cleanup after sheet/workbook deletions\n */\n getInvalidRefs(): string[] {\n return this.referenceManager.getInvalidRefs();\n }\n //#endregion\n\n evaluateFormula(\n /**\n * formula without the leading = sign\n */\n formula: string,\n cellAddress: CellAddress\n ): SerializedCellValue {\n return this.evaluationManager.evaluateFormula(formula, cellAddress);\n }\n\n getCellDependents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n getCellPrecedents(\n address: CellAddress | SpreadsheetRange\n ): (SpreadsheetRange | CellAddress)[] {\n throw new Error(\"Not implemented\");\n }\n\n //#endregion\n\n //#region Named Expressions\n addNamedExpression(opts: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }) {\n this.commandExecutor.execute(\n new AddNamedExpressionCommand(this.getNamedExpressionCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n removeNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n this.commandExecutor.execute(\n new RemoveNamedExpressionCommand(\n this.getNamedExpressionCommandDeps(),\n opts\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Check if a named expression exists\n */\n hasNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): boolean {\n const scope =\n opts.sheetName && opts.workbookName\n ? {\n type: \"sheet\" as const,\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n }\n : opts.workbookName\n ? { type: \"workbook\" as const, workbookName: opts.workbookName }\n : { type: \"global\" as const };\n\n return !!this.namedExpressionManager.getNamedExpression({\n name: opts.expressionName,\n scope,\n });\n }\n\n updateNamedExpression(opts: {\n expression: string;\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n }): void {\n this.commandExecutor.execute(\n new UpdateNamedExpressionCommand(\n this.getNamedExpressionCommandDeps(),\n opts\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n renameNamedExpression(opts: {\n expressionName: string;\n sheetName?: string;\n workbookName?: string;\n newName: string;\n }): void {\n this.commandExecutor.execute(\n new RenameNamedExpressionCommand(\n this.getNamedExpressionCommandDeps(),\n opts\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n setNamedExpressions(\n opts: (\n | { type: \"global\" }\n | { type: \"sheet\"; sheetName: string; workbookName: string }\n | { type: \"workbook\"; workbookName: string }\n ) & {\n expressions: Map<string, NamedExpression>;\n }\n ) {\n this.commandExecutor.execute(\n new SetNamedExpressionsCommand(\n this.getNamedExpressionCommandDeps(),\n opts\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n //#endregion\n\n //#region Tables\n addTable(props: {\n tableName: string;\n sheetName: string;\n workbookName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n }): void {\n this.commandExecutor.execute(\n new AddTableCommand(this.getTableCommandDeps(), props),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n renameTable(\n workbookName: string,\n names: { oldName: string; newName: string }\n ): void {\n this.commandExecutor.execute(\n new RenameTableCommand(\n this.getTableCommandDeps(),\n workbookName,\n names.oldName,\n names.newName\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n updateTable(opts: {\n tableName: string;\n sheetName?: string;\n start?: string;\n numRows?: SpreadsheetRangeEnd;\n numCols?: number;\n workbookName: string;\n }): void {\n this.commandExecutor.execute(\n new UpdateTableCommand(this.getTableCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n removeTable(opts: { tableName: string; workbookName: string }): void {\n this.commandExecutor.execute(\n new RemoveTableCommand(this.getTableCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Check if a table exists\n */\n hasTable(opts: { tableName: string; workbookName: string }): boolean {\n return !!this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n }\n\n /**\n * Get a table definition by name\n */\n getTable(opts: {\n tableName: string;\n workbookName: string;\n }): TableDefinition | undefined {\n return this.tableManager.getTable({\n workbookName: opts.workbookName,\n name: opts.tableName,\n });\n }\n\n resetTables(tables: Map<string, Map<string, TableDefinition>>): void {\n this.commandExecutor.execute(\n new ResetTablesCommand(this.getTableCommandDeps(), tables),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n getTables(workbookName: string) {\n return this.tableManager.getTables(workbookName);\n }\n\n isCellInTable(cellAddress: CellAddress): TableDefinition | undefined {\n return this.tableManager.isCellInTable(cellAddress);\n }\n\n /**\n * Get all data cells in a table (excluding header row).\n * Since spills cannot enter tables (they get #SPILL! error), this only\n * needs to return cells with direct content.\n */\n private getTableDataCells(table: TableDefinition): CellAddress[] {\n const { start, endRow, headers } = table;\n const dataStartRow = start.rowIndex + 1;\n const endColIndex = start.colIndex + headers.size - 1;\n\n // Build a RangeAddress for the data area\n const rangeAddress: RangeAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n range: {\n start: { col: start.colIndex, row: dataStartRow },\n end: {\n col: { type: \"number\", value: endColIndex },\n row: endRow,\n },\n },\n };\n\n // Return cells with direct content - spills cannot enter tables\n return this.workbookManager.getCellsInRange(rangeAddress);\n }\n\n //#endregion\n\n //#region Conditional Styling\n /**\n * Add a conditional style rule\n */\n addConditionalStyle(style: ConditionalStyle): void {\n this.commandExecutor.execute(\n new AddConditionalStyleCommand(this.styleManager, style)\n );\n }\n\n /**\n * Remove a conditional style rule by index\n */\n removeConditionalStyle(workbookName: string, index: number): void {\n this.commandExecutor.execute(\n new RemoveConditionalStyleCommand(this.styleManager, workbookName, index)\n );\n }\n\n /**\n * Get the count of conditional styles for a workbook\n */\n getConditionalStyleCount(workbookName: string): number {\n const allStyles = this.styleManager.getAllConditionalStyles();\n return allStyles.filter((s) =>\n s.areas.some((a) => a.workbookName === workbookName)\n ).length;\n }\n\n /**\n * Get all conditional styles intersecting with a range\n */\n getConditionalStylesIntersectingWithRange(\n range: RangeAddress\n ): ConditionalStyle[] {\n return this.styleManager.getConditionalStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the computed style for a specific cell\n */\n getCellStyle(cellAddress: CellAddress): CellStyle | undefined {\n return this.styleManager.getCellStyle(cellAddress);\n }\n\n /**\n * Get all cell styles (for testing and serialization)\n */\n getAllCellStyles(): DirectCellStyle[] {\n return this.styleManager.getAllCellStyles();\n }\n\n /**\n * Get all conditional styles (for testing and serialization)\n */\n getAllConditionalStyles(): ConditionalStyle[] {\n return this.styleManager.getAllConditionalStyles();\n }\n\n /**\n * Add a direct cell style rule\n */\n addCellStyle(style: DirectCellStyle): void {\n this.commandExecutor.execute(\n new AddCellStyleCommand(this.styleManager, style)\n );\n }\n\n /**\n * Remove a direct cell style rule by index\n */\n removeCellStyle(workbookName: string, index: number): void {\n this.commandExecutor.execute(\n new RemoveCellStyleCommand(this.styleManager, workbookName, index)\n );\n }\n\n /**\n * Get the count of direct cell styles for a workbook\n */\n getCellStyleCount(workbookName: string): number {\n const allStyles = this.styleManager.getAllCellStyles();\n return allStyles.filter((s) =>\n s.areas.some((a) => a.workbookName === workbookName)\n ).length;\n }\n\n /**\n * Get all direct cell styles intersecting with a range\n */\n getStylesIntersectingWithRange(range: RangeAddress): DirectCellStyle[] {\n return this.styleManager.getStylesIntersectingWithRange(range);\n }\n\n /**\n * Get the style for a range if all cells in the range have the same style\n * Returns the DirectCellStyle if the range is completely contained within a single style's area\n * Returns undefined if multiple styles, partial coverage, or no styles apply\n */\n getStyleForRange(range: RangeAddress): DirectCellStyle | undefined {\n return this.styleManager.getStyleForRange(range);\n }\n\n /**\n * Clear all cell styles and conditional styles for a given range\n * Adjusts existing style ranges rather than deleting them entirely\n */\n clearCellStyles(range: RangeAddress): void {\n this.commandExecutor.execute(\n new ClearCellStylesCommand(this.styleManager, range)\n );\n }\n\n //#endregion\n\n //#region Copy/Paste\n /**\n * Paste cells from source to target\n */\n pasteCells(\n source: CellAddress[],\n target: CellAddress,\n options: CopyCellsOptions\n ): void {\n this.commandExecutor.execute(\n new PasteCellsCommand(\n this.workbookManager,\n this.copyManager,\n source,\n target,\n options\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Fill one or more areas with a seed range's content/style\n * Uses column-first strategy: fills down, then replicates right\n * Formulas are adjusted based on each target cell's offset from the seed\n *\n * @param seedRange - The range to use as a template/pattern\n * @param targetRanges - One or more range addresses to fill\n * @param options - Copy options (target: 'all'|'content'|'style', type: 'value'|'formula', cut: boolean)\n *\n * @example\n * // Fill F6:J10 with A1:B2 seed (2x2 pattern fills 5x5 area)\n * engine.fillAreas(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 1 }, row: { type: \"number\", value: 1 } }\n * }\n * },\n * [{\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 5, row: 5 },\n * end: { col: { type: \"number\", value: 9 }, row: { type: \"number\", value: 9 } }\n * }\n * }],\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n fillAreas(\n seedRange: RangeAddress,\n targetRanges: RangeAddress[],\n options: CopyCellsOptions\n ): void {\n this.commandExecutor.execute(\n new FillAreasCommand(\n this.workbookManager,\n this.copyManager,\n seedRange,\n targetRanges,\n options\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Smart paste that automatically determines whether to paste or fill\n * Handles multiple selection areas - each area is independently pasted or filled\n * - If area is larger than source, uses fillAreas() to fill the area\n * - If area is same size or smaller, uses pasteCells() for normal paste\n *\n * @param sourceCells - The copied cells\n * @param pasteSelection - One or more selection areas where user is pasting\n * @param options - Copy options\n *\n * @example\n * // Copy A1, paste into two areas B1:C2 and E5:F6 - both get filled\n * engine.smartPaste(\n * [{ workbookName, sheetName, colIndex: 0, rowIndex: 0 }],\n * {\n * workbookName,\n * sheetName,\n * areas: [\n * { start: { col: 1, row: 0 }, end: { col: { type: \"number\", value: 2 }, row: { type: \"number\", value: 1 } } },\n * { start: { col: 4, row: 4 }, end: { col: { type: \"number\", value: 5 }, row: { type: \"number\", value: 5 } } }\n * ]\n * },\n * { cut: false, type: \"formula\", target: \"all\" }\n * );\n */\n smartPaste(\n sourceCells: CellAddress[],\n pasteSelection: {\n workbookName: string;\n sheetName: string;\n areas: SpreadsheetRange[];\n },\n options: CopyCellsOptions\n ): void {\n if (sourceCells.length === 0) {\n return;\n }\n\n // If cut operation, always use pasteCells (never fillAreas)\n // Cut should be a simple move operation, not a fill\n if (options.cut === true) {\n for (const area of pasteSelection.areas) {\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: area.start.col,\n rowIndex: area.start.row,\n };\n this.pasteCells(sourceCells, target, options);\n }\n return;\n }\n\n // For copy operations (not cut), use smart paste/fill logic\n // Calculate source bounds once\n const sourceBounds = this.getBoundsFromCells(sourceCells);\n const sourceWidth = sourceBounds.maxCol - sourceBounds.minCol + 1;\n const sourceHeight = sourceBounds.maxRow - sourceBounds.minRow + 1;\n\n // Create seed range for fill operations\n const seedRange: RangeAddress = {\n workbookName: sourceCells[0]!.workbookName,\n sheetName: sourceCells[0]!.sheetName,\n range: {\n start: { col: sourceBounds.minCol, row: sourceBounds.minRow },\n end: {\n col: { type: \"number\", value: sourceBounds.maxCol },\n row: { type: \"number\", value: sourceBounds.maxRow },\n },\n },\n };\n\n // Process each selected area independently\n for (const area of pasteSelection.areas) {\n const pasteStartCol = area.start.col;\n const pasteStartRow = area.start.row;\n const pasteEndCol =\n area.end.col.type === \"number\" ? area.end.col.value : pasteStartCol;\n const pasteEndRow =\n area.end.row.type === \"number\" ? area.end.row.value : pasteStartRow;\n\n const pasteWidth = pasteEndCol - pasteStartCol + 1;\n const pasteHeight = pasteEndRow - pasteStartRow + 1;\n\n // Decide per area: paste or fill?\n const shouldFill = pasteWidth > sourceWidth || pasteHeight > sourceHeight;\n\n if (shouldFill) {\n // Use fillAreas for this area\n const targetRange: RangeAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n range: {\n start: { col: pasteStartCol, row: pasteStartRow },\n end: {\n col: { type: \"number\", value: pasteEndCol },\n row: { type: \"number\", value: pasteEndRow },\n },\n },\n };\n\n this.fillAreas(seedRange, [targetRange], options);\n } else {\n // Use pasteCells for this area\n const target: CellAddress = {\n workbookName: pasteSelection.workbookName,\n sheetName: pasteSelection.sheetName,\n colIndex: pasteStartCol,\n rowIndex: pasteStartRow,\n };\n\n this.pasteCells(sourceCells, target, options);\n }\n }\n }\n\n /**\n * Get bounds (min/max row/col) from an array of cell addresses\n */\n private getBoundsFromCells(cells: CellAddress[]): {\n minCol: number;\n minRow: number;\n maxCol: number;\n maxRow: number;\n } {\n if (cells.length === 0) {\n throw new Error(\"Cannot get bounds from empty cell array\");\n }\n\n let minCol = Infinity;\n let minRow = Infinity;\n let maxCol = -Infinity;\n let maxRow = -Infinity;\n\n for (const cell of cells) {\n minCol = Math.min(minCol, cell.colIndex);\n minRow = Math.min(minRow, cell.rowIndex);\n maxCol = Math.max(maxCol, cell.colIndex);\n maxRow = Math.max(maxRow, cell.rowIndex);\n }\n\n return { minCol, minRow, maxCol, maxRow };\n }\n\n /**\n * Move a single cell to a new location\n * Updates all formula references that point to the moved cell\n *\n * @param source - The cell to move\n * @param target - The destination cell address\n *\n * @example\n * // Move A1 to D5. If B1 contains =A1, it will be updated to =D5\n * engine.moveCell(\n * { workbookName, sheetName, colIndex: 0, rowIndex: 0 },\n * { workbookName, sheetName, colIndex: 3, rowIndex: 4 }\n * );\n */\n moveCell(source: CellAddress, target: CellAddress): void {\n this.commandExecutor.execute(\n new MoveCellCommand(\n this.workbookManager,\n this.copyManager,\n source,\n target\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Move a range of cells to a new location\n * Updates all formula references that point to the moved cells\n *\n * @param sourceRange - The range to move\n * @param target - The top-left destination cell address\n *\n * @example\n * // Move A1:D5 to F10. If E1 contains =SUM(A1:D5), it will be updated to =SUM(F10:I14)\n * engine.moveRange(\n * {\n * workbookName,\n * sheetName,\n * range: {\n * start: { col: 0, row: 0 },\n * end: { col: { type: \"number\", value: 3 }, row: { type: \"number\", value: 4 } }\n * }\n * },\n * { workbookName, sheetName, colIndex: 5, rowIndex: 9 }\n * );\n */\n moveRange(sourceRange: RangeAddress, target: CellAddress): void {\n this.commandExecutor.execute(\n new MoveRangeCommand(\n this.workbookManager,\n this.copyManager,\n sourceRange,\n target\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n //#endregion\n\n //#region Sheets\n addSheet(opts: { workbookName: string; sheetName: string }): Sheet {\n this.commandExecutor.execute(\n new AddSheetCommand(this.getStructureCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n\n const sheet = this.workbookManager.getSheet(opts);\n if (!sheet) {\n throw new Error(`Failed to create sheet '${opts.sheetName}'`);\n }\n\n return sheet;\n }\n\n createSheet(opts: {\n workbookName: string;\n sheetName?: string;\n baseName?: string;\n }): Sheet {\n const sheetName =\n opts.sheetName ??\n this.workbookManager.getNextAvailableSheetName(\n opts.workbookName,\n opts.baseName\n );\n\n return this.addSheet({\n workbookName: opts.workbookName,\n sheetName,\n });\n }\n\n removeSheet(opts: { workbookName: string; sheetName: string }): void {\n this.commandExecutor.execute(\n new RemoveSheetCommand(this.getStructureCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n renameSheet(opts: {\n sheetName: string;\n newSheetName: string;\n workbookName: string;\n }): void {\n this.commandExecutor.execute(\n new RenameSheetCommand(this.getStructureCommandDeps(), opts),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Check if a sheet exists\n */\n hasSheet(opts: { workbookName: string; sheetName: string }): boolean {\n return !!this.workbookManager.getSheet(opts);\n }\n\n getSheets(workbookName: string) {\n return this.workbookManager.getSheets(workbookName);\n }\n\n getOrderedSheets(workbookName: string) {\n return this.workbookManager.getOrderedSheets(workbookName);\n }\n\n getOrderedSheetNames(workbookName: string) {\n return this.workbookManager.getOrderedSheetNames(workbookName);\n }\n\n getNextAvailableSheetName(workbookName: string, baseName?: string) {\n return this.workbookManager.getNextAvailableSheetName(\n workbookName,\n baseName\n );\n }\n\n getSheet({\n workbookName,\n sheetName,\n }: {\n workbookName: string;\n sheetName: string;\n }) {\n return this.workbookManager.getSheet({ workbookName, sheetName });\n }\n\n getSheetSerialized(opts: {\n sheetName: string;\n workbookName: string;\n }): Map<string, SerializedCellValue> {\n return this.workbookManager.getSheetSerialized(opts);\n }\n\n //#endregion\n\n //#region Workbook\n addWorkbook(workbookName: string): void {\n this.commandExecutor.execute(\n new AddWorkbookCommand(this.getStructureCommandDeps(), workbookName),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n removeWorkbook(workbookName: string): void {\n this.commandExecutor.execute(\n new RemoveWorkbookCommand(this.getStructureCommandDeps(), workbookName),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Check if a workbook exists\n */\n hasWorkbook(workbookName: string): boolean {\n return this.workbookManager.getWorkbooks().has(workbookName);\n }\n\n cloneWorkbook(fromWorkbookName: string, toWorkbookName: string): void {\n this.commandExecutor.execute(\n new CloneWorkbookCommand(\n this.getStructureCommandDeps(),\n fromWorkbookName,\n toWorkbookName\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n renameWorkbook(opts: { workbookName: string; newWorkbookName: string }) {\n this.commandExecutor.execute(\n new RenameWorkbookCommand(\n this.getStructureCommandDeps(),\n opts.workbookName,\n opts.newWorkbookName\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n getWorkbooks() {\n return this.workbookManager.getWorkbooks();\n }\n //#endregion\n\n //#region CRUD Operations\n /**\n * Overrides the content of a sheet.\n * @param sheetName - The name of the sheet to set the content of\n * @param content - A map of cell addresses to their serialized values\n * @remarks This method is used to set the content of a sheet. It will re-evaluate all sheets to ensure all dependencies are resolved correctly.\n * @throws SchemaIntegrityError if any evaluated cell value violates a schema constraint\n */\n setSheetContent(\n opts: { sheetName: string; workbookName: string },\n content: Map<string, SerializedCellValue>\n ) {\n this.commandExecutor.execute(\n new SetSheetContentCommand(this.workbookManager, opts, content),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Set the content of a single cell.\n * @throws SchemaIntegrityError if the evaluated value violates a schema constraint\n */\n setCellContent(address: CellAddress, content: SerializedCellValue) {\n this.commandExecutor.execute(\n new SetCellContentCommand(this.workbookManager, address, content),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n //#endregion\n\n //#region Auto-fill\n /**\n * Auto-fills one or more ranges based on the seedRange and the direction.\n * Supports pattern detection and style copying.\n */\n autoFill(\n opts: { sheetName: string; workbookName: string },\n /**\n * The user's original selection that defines the pattern/series.\n */\n seedRange: SpreadsheetRange,\n /**\n * One or more ranges to fill (the new cells populated by the drag, excluding the seed)\n */\n fillRanges: SpreadsheetRange[],\n /**\n * The direction of the fill.\n */\n direction: FillDirection\n ): void {\n this.commandExecutor.execute(\n new AutoFillCommand(\n this.workbookManager,\n this.styleManager,\n this.autoFillManager,\n opts,\n seedRange,\n fillRanges,\n direction\n ),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n\n /**\n * Removes the content in the spreadsheet that is inside the range.\n */\n clearSpreadsheetRange(address: RangeAddress) {\n this.commandExecutor.execute(\n new ClearRangeCommand(this.workbookManager, address),\n { validate: this.schemaManager.hasSchemas() }\n );\n }\n //#endregion\n\n //#region State - UI library integration\n getState() {\n return {\n workbooks: this.workbookManager.getWorkbooks(),\n namedExpressions: this.namedExpressionManager.getNamedExpressions(),\n tables: this.tableManager.tables,\n conditionalStyles: this.styleManager.getAllConditionalStyles(),\n cellStyles: this.styleManager.getAllCellStyles(),\n references: this.referenceManager.getAllReferences(),\n };\n }\n\n onUpdate(listener: () => void) {\n return this.eventManager.onUpdate(listener);\n }\n\n private buildSerializedSnapshot(): EngineSnapshotV3 {\n const evaluationSnapshots = this.dependencyManager.toSnapshot(\n this.evaluationManager\n );\n\n return {\n version: ENGINE_SNAPSHOT_VERSION,\n managers: {\n workbook: this.workbookManager.toSnapshot(),\n namedExpression: this.namedExpressionManager.toSnapshot(),\n table: this.tableManager.toSnapshot(),\n style: this.styleManager.toSnapshot(),\n reference: this.referenceManager.toSnapshot(),\n dependency: evaluationSnapshots.dependency,\n cache: evaluationSnapshots.cache,\n },\n };\n }\n\n serializeEngine(): string {\n return serialize(this.buildSerializedSnapshot());\n }\n\n resetToSerializedEngine(data: string) {\n const deserialized = deserialize(data) as Partial<EngineSnapshotV3>;\n if (\n !deserialized ||\n typeof deserialized !== \"object\" ||\n deserialized.version !== ENGINE_SNAPSHOT_VERSION ||\n !deserialized.managers\n ) {\n throw new Error(\n \"Unsupported serialized engine format. Expected EngineSnapshot version 3.\"\n );\n }\n\n this.workbookManager.restoreFromSnapshot(deserialized.managers.workbook);\n\n deserialized.managers.workbook.forEach((workbook) => {\n this.namedExpressionManager.addWorkbook(workbook.name);\n workbook.sheets.forEach((sheet) => {\n this.namedExpressionManager.addSheet({\n workbookName: workbook.name,\n sheetName: sheet.name,\n });\n });\n });\n\n this.namedExpressionManager.restoreFromSnapshot(\n deserialized.managers.namedExpression\n );\n this.tableManager.restoreFromSnapshot(deserialized.managers.table);\n this.styleManager.restoreFromSnapshot(deserialized.managers.style);\n this.referenceManager.restoreFromSnapshot(deserialized.managers.reference);\n this.dependencyManager.restoreFromSnapshot(\n {\n dependency: deserialized.managers.dependency,\n cache: deserialized.managers.cache,\n },\n this.evaluationManager\n );\n this.commandExecutor.clearHistory();\n this.commandExecutor.clearActionLog();\n\n this.eventManager.emitUpdate();\n }\n //#endregion\n\n //#region Undo/Redo\n /**\n * Undo the last command.\n * @returns true if undo was performed, false if nothing to undo\n */\n undo(): boolean {\n return this.commandExecutor.undo();\n }\n\n /**\n * Redo the last undone command.\n * @returns true if redo was performed, false if nothing to redo\n */\n redo(): boolean {\n return this.commandExecutor.redo();\n }\n\n /**\n * Check if undo is available.\n */\n canUndo(): boolean {\n return this.commandExecutor.canUndo();\n }\n\n /**\n * Check if redo is available.\n */\n canRedo(): boolean {\n return this.commandExecutor.canRedo();\n }\n\n /**\n * Get the action log for persistence/collaboration.\n * Actions can be serialized and replayed to reconstruct state.\n */\n getActionLog(): EngineAction[] {\n return this.commandExecutor.getActionLog();\n }\n\n /**\n * Clear the action log.\n */\n clearActionLog(): void {\n this.commandExecutor.clearActionLog();\n }\n\n /**\n * Clear undo/redo history.\n */\n clearHistory(): void {\n this.commandExecutor.clearHistory();\n }\n //#endregion\n\n //#region Command Dependencies (internal)\n /**\n * Get dependencies for structure commands.\n * @internal\n */\n private getStructureCommandDeps(): StructureCommandDeps {\n return {\n workbookManager: this.workbookManager,\n namedExpressionManager: this.namedExpressionManager,\n tableManager: this.tableManager,\n styleManager: this.styleManager,\n referenceManager: this.referenceManager,\n apiSchemaManager: this.schemaManager,\n renameSheetInFormula,\n renameWorkbookInFormula,\n };\n }\n\n /**\n * Get dependencies for table commands.\n * @internal\n */\n private getTableCommandDeps(): TableCommandDeps {\n return {\n tableManager: this.tableManager,\n namedExpressionManager: this.namedExpressionManager,\n workbookManager: this.workbookManager,\n apiSchemaManager: this.schemaManager,\n getCellValue: (cell) => this.getCellValue(cell),\n renameTableInFormula,\n };\n }\n\n /**\n * Get dependencies for named expression commands.\n * @internal\n */\n private getNamedExpressionCommandDeps(): NamedExpressionCommandDeps {\n return {\n namedExpressionManager: this.namedExpressionManager,\n workbookManager: this.workbookManager,\n renameNamedExpressionInFormula,\n };\n }\n //#endregion\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "979808DBD1ADBF8164756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -45,6 +45,7 @@ module.exports = __toCommonJS(exports_dependency_manager);
|
|
|
45
45
|
var import_engine_snapshot = require("../engine-snapshot.cjs");
|
|
46
46
|
var import_evaluation_context = require("../../evaluator/evaluation-context.cjs");
|
|
47
47
|
var import_utils = require("../utils.cjs");
|
|
48
|
+
var import_ast_traverser = require("../ast-traverser.cjs");
|
|
48
49
|
var import_ast_evaluation_node = require("../../evaluator/dependency-nodes/ast-evaluation-node.cjs");
|
|
49
50
|
var import_cell_value_node = require("../../evaluator/dependency-nodes/cell-value-node.cjs");
|
|
50
51
|
var import_empty_cell_evaluation_node = require("../../evaluator/dependency-nodes/empty-cell-evaluation-node.cjs");
|
|
@@ -157,6 +158,91 @@ class DependencyManager {
|
|
|
157
158
|
];
|
|
158
159
|
return nodes.filter((node) => node !== undefined);
|
|
159
160
|
}
|
|
161
|
+
collectExistingAstNodesForCell(address) {
|
|
162
|
+
const cellNode = this.getExistingCellValueNode(import_utils.cellAddressToKey(address));
|
|
163
|
+
if (!cellNode) {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
const collected = new Set;
|
|
167
|
+
const stack = Array.from(cellNode.getDependencies()).filter((dependency) => dependency instanceof import_ast_evaluation_node.AstEvaluationNode);
|
|
168
|
+
while (stack.length > 0) {
|
|
169
|
+
const dependency = stack.pop();
|
|
170
|
+
if (!dependency) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (collected.has(dependency)) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
collected.add(dependency);
|
|
177
|
+
for (const nestedDependency of dependency.getDependencies()) {
|
|
178
|
+
if (nestedDependency instanceof import_ast_evaluation_node.AstEvaluationNode) {
|
|
179
|
+
stack.push(nestedDependency);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return Array.from(collected);
|
|
184
|
+
}
|
|
185
|
+
collectExistingAstNodesForCells(addresses) {
|
|
186
|
+
const collected = new Set;
|
|
187
|
+
for (const address of addresses) {
|
|
188
|
+
for (const astNode of this.collectExistingAstNodesForCell(address)) {
|
|
189
|
+
collected.add(astNode);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return Array.from(collected);
|
|
193
|
+
}
|
|
194
|
+
astNodeHasExternalDependents(node, formulaAstNodes, removedDependents) {
|
|
195
|
+
for (const dependent of this.getNodeDependents(node)) {
|
|
196
|
+
if (removedDependents.has(dependent)) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (dependent instanceof import_ast_evaluation_node.AstEvaluationNode && formulaAstNodes.has(dependent)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
collectOrphanedOldFormulaAstNodesForCell(address) {
|
|
207
|
+
return this.collectOrphanedOldFormulaAstNodesForCells([address]);
|
|
208
|
+
}
|
|
209
|
+
collectOrphanedOldFormulaAstNodesForCells(addresses) {
|
|
210
|
+
const astNodes = this.collectExistingAstNodesForCells(addresses);
|
|
211
|
+
if (astNodes.length === 0) {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
const formulaAstNodes = new Set(astNodes);
|
|
215
|
+
const removedDependents = new Set(addresses.flatMap((address) => this.collectExistingNodesForCell(address)));
|
|
216
|
+
const keptAstNodes = new Set;
|
|
217
|
+
const stack = astNodes.filter((node) => this.astNodeHasExternalDependents(node, formulaAstNodes, removedDependents));
|
|
218
|
+
while (stack.length > 0) {
|
|
219
|
+
const node = stack.pop();
|
|
220
|
+
if (!node || keptAstNodes.has(node)) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
keptAstNodes.add(node);
|
|
224
|
+
for (const dependency of node.getDependencies()) {
|
|
225
|
+
if (dependency instanceof import_ast_evaluation_node.AstEvaluationNode && formulaAstNodes.has(dependency)) {
|
|
226
|
+
stack.push(dependency);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return astNodes.filter((node) => !keptAstNodes.has(node));
|
|
231
|
+
}
|
|
232
|
+
removeAstNodeFromCache(node) {
|
|
233
|
+
const astEntries = this.asts.get(node.key);
|
|
234
|
+
if (!astEntries) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
for (const [contextKey, astEntry] of Array.from(astEntries.entries.entries())) {
|
|
238
|
+
if (astEntry.evalNode === node) {
|
|
239
|
+
astEntries.entries.delete(contextKey);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (astEntries.entries.size === 0) {
|
|
243
|
+
this.asts.delete(node.key);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
160
246
|
collectSpillOriginsAffectingCell(address) {
|
|
161
247
|
const affected = new Set;
|
|
162
248
|
for (const [spillOriginKey, spilledValue] of this._spilledValues.entries()) {
|
|
@@ -312,7 +398,7 @@ class DependencyManager {
|
|
|
312
398
|
}
|
|
313
399
|
}
|
|
314
400
|
}
|
|
315
|
-
const
|
|
401
|
+
const snapshotSeedNodes = [
|
|
316
402
|
...Array.from(this.cellNodes.values()).filter(isNodeSnapshotEligible),
|
|
317
403
|
...Array.from(this.spillMetaNodes.values()).filter(isNodeSnapshotEligible),
|
|
318
404
|
...Array.from(this.emptyCells.values()).filter(isNodeSnapshotEligible),
|
|
@@ -320,6 +406,25 @@ class DependencyManager {
|
|
|
320
406
|
...Array.from(this.resourceNodes.values()).filter(isNodeSnapshotEligible),
|
|
321
407
|
...Array.from(astNodes.values())
|
|
322
408
|
];
|
|
409
|
+
const resolvedNodesSet = new Set;
|
|
410
|
+
const stack = [...snapshotSeedNodes];
|
|
411
|
+
while (stack.length > 0) {
|
|
412
|
+
const node = stack.pop();
|
|
413
|
+
if (!node || resolvedNodesSet.has(node)) {
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
resolvedNodesSet.add(node);
|
|
417
|
+
if (node instanceof import_cell_value_node.CellValueNode && node.spillMeta && isNodeSnapshotEligible(node.spillMeta)) {
|
|
418
|
+
stack.push(node.spillMeta);
|
|
419
|
+
}
|
|
420
|
+
for (const dependency2 of node.getDependencies()) {
|
|
421
|
+
if (!isNodeSnapshotEligible(dependency2)) {
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
stack.push(dependency2);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
const resolvedNodes = Array.from(resolvedNodesSet);
|
|
323
428
|
const allNodeSnapshotIds = new Map;
|
|
324
429
|
for (const node of resolvedNodes) {
|
|
325
430
|
if (node instanceof import_ast_evaluation_node.AstEvaluationNode) {
|
|
@@ -661,9 +766,16 @@ class DependencyManager {
|
|
|
661
766
|
getAstNode(ast, currentContext) {
|
|
662
767
|
const astKey = `ast:${import_formatter.astToString(ast)}`;
|
|
663
768
|
const astEntries = this.asts.get(astKey);
|
|
769
|
+
const requiresExplicitTableContext = currentContext.tableName !== undefined && this.astUsesImplicitCurrentTableReference(ast);
|
|
664
770
|
const keys = import_evaluation_context.eligibleKeysForContext(currentContext);
|
|
665
771
|
for (const key of keys) {
|
|
666
772
|
const astEntry = astEntries?.entries.get(key);
|
|
773
|
+
if (!astEntry) {
|
|
774
|
+
continue;
|
|
775
|
+
}
|
|
776
|
+
if (requiresExplicitTableContext && astEntry.contextDependency.tableName === undefined) {
|
|
777
|
+
continue;
|
|
778
|
+
}
|
|
667
779
|
if (astEntry) {
|
|
668
780
|
return astEntry.evalNode;
|
|
669
781
|
}
|
|
@@ -672,6 +784,15 @@ class DependencyManager {
|
|
|
672
784
|
this.saveAstNode(node, currentContext);
|
|
673
785
|
return node;
|
|
674
786
|
}
|
|
787
|
+
astUsesImplicitCurrentTableReference(ast) {
|
|
788
|
+
let usesImplicitCurrentTableReference = false;
|
|
789
|
+
import_ast_traverser.traverseAST(ast, (node) => {
|
|
790
|
+
if (node.type === "structured-reference" && node.tableName === undefined) {
|
|
791
|
+
usesImplicitCurrentTableReference = true;
|
|
792
|
+
}
|
|
793
|
+
});
|
|
794
|
+
return usesImplicitCurrentTableReference;
|
|
795
|
+
}
|
|
675
796
|
saveAstNode(ast, contextDependency) {
|
|
676
797
|
const astKey = ast.key;
|
|
677
798
|
const contextDependencyKey = import_evaluation_context.getContextDependencyKey(contextDependency);
|
|
@@ -879,7 +1000,41 @@ class DependencyManager {
|
|
|
879
1000
|
const queue = [];
|
|
880
1001
|
const visited = new Set;
|
|
881
1002
|
const invalidatedNodeKeys = new Set;
|
|
1003
|
+
const invalidatedAstNodes = new Set;
|
|
1004
|
+
const evictedAstNodes = new Set;
|
|
1005
|
+
const evictAstNodeFromCache = (astNode) => {
|
|
1006
|
+
if (evictedAstNodes.has(astNode)) {
|
|
1007
|
+
return;
|
|
1008
|
+
}
|
|
1009
|
+
evictedAstNodes.add(astNode);
|
|
1010
|
+
this.removeAstNodeFromCache(astNode);
|
|
1011
|
+
invalidatedNodeKeys.add(astNode.key);
|
|
1012
|
+
};
|
|
1013
|
+
const invalidateAstNode = (astNode) => {
|
|
1014
|
+
if (invalidatedAstNodes.has(astNode)) {
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
invalidatedAstNodes.add(astNode);
|
|
1018
|
+
evictAstNodeFromCache(astNode);
|
|
1019
|
+
this.unregisterNode(astNode);
|
|
1020
|
+
astNode.invalidate();
|
|
1021
|
+
};
|
|
1022
|
+
const tableContextChangedCells = Array.from(new Map((footprint.tableContextChangedCells ?? []).map((address) => [
|
|
1023
|
+
import_utils.cellAddressToKey(address),
|
|
1024
|
+
address
|
|
1025
|
+
])).values());
|
|
1026
|
+
for (const astNode of this.collectExistingAstNodesForCells(tableContextChangedCells)) {
|
|
1027
|
+
evictAstNodeFromCache(astNode);
|
|
1028
|
+
}
|
|
1029
|
+
for (const astNode of this.collectOrphanedOldFormulaAstNodesForCells(tableContextChangedCells)) {
|
|
1030
|
+
invalidateAstNode(astNode);
|
|
1031
|
+
}
|
|
882
1032
|
for (const touchedCell of footprint.touchedCells) {
|
|
1033
|
+
if (touchedCell.beforeKind === "formula") {
|
|
1034
|
+
for (const astNode of this.collectOrphanedOldFormulaAstNodesForCell(touchedCell.address)) {
|
|
1035
|
+
invalidateAstNode(astNode);
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
883
1038
|
for (const node of this.collectExistingNodesForCell(touchedCell.address)) {
|
|
884
1039
|
queue.push(node);
|
|
885
1040
|
}
|
|
@@ -1298,4 +1453,4 @@ class DependencyManager {
|
|
|
1298
1453
|
}
|
|
1299
1454
|
}
|
|
1300
1455
|
|
|
1301
|
-
//# debugId=
|
|
1456
|
+
//# debugId=1BB351ECAE7D407964756E2164756E21
|