@ricsam/formula-engine 0.0.20 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/cjs/core/commands/command-executor.cjs +3 -5
  2. package/dist/cjs/core/commands/command-executor.cjs.map +3 -3
  3. package/dist/cjs/core/commands/structure-commands.cjs.map +1 -1
  4. package/dist/cjs/core/commands/table-commands.cjs.map +1 -1
  5. package/dist/cjs/core/engine.cjs +56 -42
  6. package/dist/cjs/core/engine.cjs.map +3 -3
  7. package/dist/cjs/core/managers/{api-schema-manager.cjs → schema-manager.cjs} +10 -7
  8. package/dist/cjs/core/managers/schema-manager.cjs.map +10 -0
  9. package/dist/cjs/core/{api → schema}/cell-orm.cjs +2 -2
  10. package/dist/cjs/core/{api → schema}/cell-orm.cjs.map +2 -2
  11. package/dist/cjs/core/{api/api-builder.cjs → schema/schema-builder.cjs} +15 -25
  12. package/dist/cjs/core/schema/schema-builder.cjs.map +10 -0
  13. package/dist/cjs/core/{api/api-helpers.cjs → schema/schema-helpers.cjs} +5 -5
  14. package/dist/cjs/core/schema/schema-helpers.cjs.map +10 -0
  15. package/dist/cjs/core/{api/api.cjs → schema/schema.cjs} +12 -16
  16. package/dist/cjs/core/schema/schema.cjs.map +10 -0
  17. package/dist/cjs/core/{api → schema}/table-orm.cjs +19 -19
  18. package/dist/cjs/core/schema/table-orm.cjs.map +10 -0
  19. package/dist/cjs/lib.cjs +7 -8
  20. package/dist/cjs/lib.cjs.map +3 -3
  21. package/dist/cjs/package.json +1 -1
  22. package/dist/mjs/core/commands/command-executor.mjs +3 -5
  23. package/dist/mjs/core/commands/command-executor.mjs.map +3 -3
  24. package/dist/mjs/core/commands/structure-commands.mjs.map +1 -1
  25. package/dist/mjs/core/commands/table-commands.mjs.map +1 -1
  26. package/dist/mjs/core/engine.mjs +57 -43
  27. package/dist/mjs/core/engine.mjs.map +3 -3
  28. package/dist/mjs/core/managers/{api-schema-manager.mjs → schema-manager.mjs} +7 -4
  29. package/dist/mjs/core/managers/schema-manager.mjs.map +10 -0
  30. package/dist/mjs/core/{api → schema}/cell-orm.mjs +2 -2
  31. package/dist/mjs/core/{api → schema}/cell-orm.mjs.map +2 -2
  32. package/dist/mjs/core/schema/schema-builder.mjs +27 -0
  33. package/dist/mjs/core/schema/schema-builder.mjs.map +10 -0
  34. package/dist/mjs/core/{api/api-helpers.mjs → schema/schema-helpers.mjs} +2 -2
  35. package/dist/mjs/core/schema/schema-helpers.mjs.map +10 -0
  36. package/dist/mjs/core/{api/api.mjs → schema/schema.mjs} +9 -13
  37. package/dist/mjs/core/schema/schema.mjs.map +10 -0
  38. package/dist/mjs/core/{api → schema}/table-orm.mjs +3 -3
  39. package/dist/mjs/core/schema/table-orm.mjs.map +10 -0
  40. package/dist/mjs/lib.mjs +6 -7
  41. package/dist/mjs/lib.mjs.map +2 -2
  42. package/dist/mjs/package.json +1 -1
  43. package/dist/types/core/commands/command-executor.d.ts +1 -3
  44. package/dist/types/core/commands/structure-commands.d.ts +2 -2
  45. package/dist/types/core/commands/table-commands.d.ts +2 -2
  46. package/dist/types/core/engine.d.ts +31 -7
  47. package/dist/types/core/managers/{api-schema-manager.d.ts → schema-manager.d.ts} +6 -2
  48. package/dist/types/core/schema/schema-builder.d.ts +16 -0
  49. package/dist/types/core/{api/api-helpers.d.ts → schema/schema-helpers.d.ts} +1 -1
  50. package/dist/types/core/schema/schema.d.ts +90 -0
  51. package/dist/types/core/{api → schema}/table-orm.d.ts +1 -1
  52. package/dist/types/lib.d.ts +6 -6
  53. package/package.json +1 -1
  54. package/dist/cjs/core/api/api-builder.cjs.map +0 -10
  55. package/dist/cjs/core/api/api-helpers.cjs.map +0 -10
  56. package/dist/cjs/core/api/api.cjs.map +0 -10
  57. package/dist/cjs/core/api/table-orm.cjs.map +0 -10
  58. package/dist/cjs/core/managers/api-schema-manager.cjs.map +0 -10
  59. package/dist/mjs/core/api/api-builder.mjs +0 -37
  60. package/dist/mjs/core/api/api-builder.mjs.map +0 -10
  61. package/dist/mjs/core/api/api-helpers.mjs.map +0 -10
  62. package/dist/mjs/core/api/api.mjs.map +0 -10
  63. package/dist/mjs/core/api/table-orm.mjs.map +0 -10
  64. package/dist/mjs/core/managers/api-schema-manager.mjs.map +0 -10
  65. package/dist/types/core/api/api-builder.d.ts +0 -16
  66. package/dist/types/core/api/api.d.ts +0 -83
  67. /package/dist/types/core/{api → schema}/cell-orm.d.ts +0 -0
  68. /package/dist/types/core/{api/api.type-test.d.ts → schema/schema.type-test.d.ts} +0 -0
@@ -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 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 ApiSchemaManager,\n SchemaValidationError,\n} from \"./managers/api-schema-manager.cjs\";\nimport type { Api, CreateApi, Declaration } from \"./api/api.cjs\";\nimport { buildApiFromDeclaration } from \"./api/api-builder.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 TCreateApi extends\n | CreateApi<MetadataType<TMetadata, \"cell\">, Api, Declaration>\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 apiSchemaManager: ApiSchemaManager;\n private commandExecutor: CommandExecutor;\n\n public api: TCreateApi extends CreateApi<\n MetadataType<TMetadata, \"cell\">,\n Api,\n Declaration\n >\n ? TCreateApi[\"api\"]\n : undefined;\n\n private apiDeclaration: Declaration | 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(api?: TCreateApi) {\n this.apiDeclaration = (api 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.apiSchemaManager = new ApiSchemaManager(this.tableManager);\n\n // Initialize command executor\n this.commandExecutor = new CommandExecutor(\n this.apiDeclaration,\n this.evaluationManager,\n this.eventManager,\n () =>\n this.apiSchemaManager.validateAllSchemaConstraints(\n (cell) => this.getCellValue(cell),\n (cell) => this.getCellMetadata(cell),\n (table) => this.getTableDataCells(table)\n )\n );\n\n // Build the working API from declaration if provided\n if (this.apiDeclaration) {\n this.api = buildApiFromDeclaration(\n this,\n this.apiDeclaration,\n this.apiSchemaManager\n ) as any;\n } else {\n this.api = undefined 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 TApiDeclaration extends\n | CreateApi<MetadataType<TMetadata, \"cell\">, any, any>\n | undefined = undefined\n >(api?: TApiDeclaration) {\n return new FormulaEngine<TMetadata, TApiDeclaration>(api);\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\n );\n }\n\n removeTable(opts: { tableName: string; workbookName: string }): void {\n this.commandExecutor.execute(\n new RemoveTableCommand(this.getTableCommandDeps(), opts),\n { validate: !!this.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\n );\n }\n\n removeSheet(opts: { workbookName: string; sheetName: string }): void {\n this.commandExecutor.execute(\n new RemoveSheetCommand(this.getStructureCommandDeps(), opts),\n { validate: !!this.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\n );\n }\n\n removeWorkbook(workbookName: string): void {\n this.commandExecutor.execute(\n new RemoveWorkbookCommand(this.getStructureCommandDeps(), workbookName),\n { validate: !!this.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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.apiDeclaration }\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 serializeEngine(): string {\n return serialize(this.getState());\n }\n\n resetToSerializedEngine(data: string) {\n const deserialized = deserialize(data) as ReturnType<typeof this.getState>;\n\n this.workbookManager.resetWorkbooks(deserialized.workbooks);\n\n deserialized.workbooks.forEach((workbook) => {\n this.namedExpressionManager.addWorkbook(workbook.name);\n this.tableManager.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.resetNamedExpressions(\n deserialized.namedExpressions\n );\n this.tableManager.resetTables(deserialized.tables);\n\n // Reset styles if present\n // Handle backward compatibility: if conditionalStyles is a Map, convert it\n let conditionalStylesArray: ConditionalStyle[] | undefined;\n let cellStylesArray: DirectCellStyle[] | undefined;\n\n if (deserialized.conditionalStyles) {\n if (deserialized.conditionalStyles instanceof Map) {\n // Old format: Map<string, ConditionalStyle[]>\n conditionalStylesArray = Array.from(\n deserialized.conditionalStyles.values()\n ).flat();\n } else if (Array.isArray(deserialized.conditionalStyles)) {\n // New format: ConditionalStyle[]\n conditionalStylesArray = deserialized.conditionalStyles;\n }\n }\n\n if (deserialized.cellStyles) {\n if (Array.isArray(deserialized.cellStyles)) {\n cellStylesArray = deserialized.cellStyles;\n }\n }\n\n this.styleManager.resetStyles(conditionalStylesArray, cellStylesArray);\n\n // Reset references if present\n if (deserialized.references) {\n this.referenceManager.resetReferences(deserialized.references);\n }\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.evaluationManager.clearEvaluationCache();\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.apiSchemaManager,\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.apiSchemaManager,\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 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 type { TableSchemaHeaders } from \"./managers/schema-manager.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 * 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 ): 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, 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 //#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 serializeEngine(): string {\n return serialize(this.getState());\n }\n\n resetToSerializedEngine(data: string) {\n const deserialized = deserialize(data) as ReturnType<typeof this.getState>;\n\n this.workbookManager.resetWorkbooks(deserialized.workbooks);\n\n deserialized.workbooks.forEach((workbook) => {\n this.namedExpressionManager.addWorkbook(workbook.name);\n this.tableManager.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.resetNamedExpressions(\n deserialized.namedExpressions\n );\n this.tableManager.resetTables(deserialized.tables);\n\n // Reset styles if present\n // Handle backward compatibility: if conditionalStyles is a Map, convert it\n let conditionalStylesArray: ConditionalStyle[] | undefined;\n let cellStylesArray: DirectCellStyle[] | undefined;\n\n if (deserialized.conditionalStyles) {\n if (deserialized.conditionalStyles instanceof Map) {\n // Old format: Map<string, ConditionalStyle[]>\n conditionalStylesArray = Array.from(\n deserialized.conditionalStyles.values()\n ).flat();\n } else if (Array.isArray(deserialized.conditionalStyles)) {\n // New format: ConditionalStyle[]\n conditionalStylesArray = deserialized.conditionalStyles;\n }\n }\n\n if (deserialized.cellStyles) {\n if (Array.isArray(deserialized.cellStyles)) {\n cellStylesArray = deserialized.cellStyles;\n }\n }\n\n this.styleManager.resetStyles(conditionalStylesArray, cellStylesArray);\n\n // Reset references if present\n if (deserialized.references) {\n this.referenceManager.resetReferences(deserialized.references);\n }\n\n // Re-evaluate all sheets to ensure all dependencies are resolved correctly\n this.evaluationManager.clearEvaluationCache();\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": "66643F9F298C18FE64756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBiC,IAAjC;AACyB,IAAzB;AACgC,IAAhC;AACuC,IAAvC;AAC+C,IAA/C;AACqC,IAArC;AACqC,IAArC;AACwC,IAAxC;AAO6B,IAA7B;AACuC,IAAvC;AAC6B,IAA7B;AAC6B,IAA7B;AACkC,IAAlC;AACkC,IAAlC;AAC6B,IAA7B;AAC4B,IAA5B;AACiC,IAAjC;AAIO,IAHP;AAK2C,IAA3C;AACyB,IAAzB;AACwB,IAAxB;AAKO,IAHP;AAcO,IATP;AAmBO,IATP;AAiBO,IAPP;AAeO,IAPP;AAYO,IAJP;AAWO,IANP;AAAA;AAyBO,MAAM,cAKX;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAED;AAAA,EAQC;AAAA,EAKD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,WAAW,CAAC,QAAwB;AAAA,IAClC,KAAK,oBAAqB,QAAgB;AAAA,IAC1C,KAAK,eAAe,IAAI;AAAA,IACxB,KAAK,kBAAkB,IAAI;AAAA,IAC3B,KAAK,yBAAyB,IAAI;AAAA,IAClC,KAAK,eAAe,IAAI,kCAAa,KAAK,eAAe;AAAA,IACzD,MAAM,eAAe,IAAI;AAAA,IACzB,KAAK,oBAAoB,IAAI,4CAC3B,cACA,KAAK,eACP;AAAA,IAEA,MAAM,mBAAmB,IAAI,0CAC3B,KAAK,cACL,KAAK,mBACL,KAAK,sBACP;AAAA,IAEA,KAAK,oBAAoB,IAAI,4CAC3B,KAAK,iBACL,KAAK,cACL,kBACA,KAAK,iBACP;AAAA,IAEA,KAAK,eAAe,IAAI,kCAAa,KAAK,iBAAiB;AAAA,IAC3D,KAAK,cAAc,IAAI,gCACrB,KAAK,iBACL,KAAK,mBACL,KAAK,YACP;AAAA,IAEA,KAAK,kBAAkB,IAAI,+BACzB,KAAK,iBACL,KAAK,YACP;AAAA,IAEA,KAAK,mBAAmB,IAAI;AAAA,IAC5B,KAAK,gBAAgB,IAAI,oCAAc,KAAK,YAAY;AAAA,IAGxD,KAAK,kBAAkB,IAAI,wCACzB,KAAK,mBACL,KAAK,cACL,MACE,KAAK,cAAc,6BACjB,CAAC,SAAS,KAAK,aAAa,IAAI,GAChC,CAAC,SAAS,KAAK,gBAAgB,IAAI,GACnC,CAAC,UAAU,KAAK,kBAAkB,KAAK,CACzC,CACJ;AAAA,IAGA,IAAI,KAAK,mBAAmB;AAAA,MAC1B,KAAK,SAAS,iDACZ,MACA,KAAK,mBACL,KAAK,aACP;AAAA,IACF,EAAO;AAAA,MACL,KAAK,SAAS,CAAC;AAAA;AAAA,IAGjB,KAAK,mBAAmB,KAAK;AAAA,IAC7B,KAAK,0BAA0B,KAAK;AAAA,IACpC,KAAK,gBAAgB,KAAK;AAAA,IAC1B,KAAK,gBAAgB,KAAK;AAAA,IAC1B,KAAK,qBAAqB,KAAK;AAAA,IAC/B,KAAK,mBAAmB,KAAK;AAAA,IAC7B,KAAK,qBAAqB,KAAK;AAAA,IAC/B,KAAK,gBAAgB,KAAK;AAAA;AAAA,SASrB,UAKN,CAAC,QAA6B;AAAA,IAC7B,OAAO,IAAI,cAA6C,MAAM;AAAA;AAAA,EAUhE,cAAoF,CAClF,WACA,SACA,SAGC;AAAA,IAED,KAAK,cAAc,oBACjB,WACA,QAAQ,cACR,QAAQ,WACR,OACF;AAAA,IAGA,MAAM,MAAM,IAAI,0BAGd,MACA,QAAQ,cACR,QAAQ,WACR,SACA,SACF;AAAA,IAGC,KAAK,OAAkC,aAAa;AAAA,IAErD,OAAO;AAAA;AAAA,EAUT,aAAqB,CACnB,WACA,aACA,OACiB;AAAA,IAEjB,KAAK,cAAc,mBAAmB,WAAW,aAAa,KAAK;AAAA,IAGnE,MAAM,MAAM,IAAI,wBAAQ,MAAM,aAAa,OAAO,SAAS;AAAA,IAG1D,KAAK,OAAkC,aAAa;AAAA,IAErD,OAAO;AAAA;AAAA,EAIT,uBAAuB,CACrB,aACoC;AAAA,IACpC,OAAO,KAAK,kBAAkB,wBAAwB,WAAW;AAAA;AAAA,EAGnE,YAAY,CAAC,aAA0B,OAAsC;AAAA,IAC3E,MAAM,SAAS,KAAK,wBAAwB,WAAW;AAAA,IACvD,IAAI,CAAC,QAAQ;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,KAAK,kBAAkB,kCAC5B,QACA,aACA,KACF;AAAA;AAAA,EAOF,eAAe,CACb,SACA,UACM;AAAA,IACN,KAAK,gBAAgB,QACnB,IAAI,gDAAuB,KAAK,iBAAiB,SAAS,QAAQ,CACpE;AAAA;AAAA,EAMF,eAAe,CACb,SAC6C;AAAA,IAC7C,MAAM,WAAW,KAAK,gBAAgB,gBAAgB,OAAO;AAAA,IAC7D,OAAO;AAAA;AAAA,EAMT,0BAA0B,CAAC,MAGuB;AAAA,IAChD,OAAO,KAAK,gBAAgB,2BAA2B,IAAI;AAAA;AAAA,EAU7D,gBAAgB,CACd,MACA,UACM;AAAA,IACN,KAAK,gBAAgB,QACnB,IAAI,iDAAwB,KAAK,iBAAiB,MAAM,QAAQ,CAClE;AAAA;AAAA,EAMF,gBAAgB,CAAC,MAGgC;AAAA,IAC/C,OAAO,KAAK,gBAAgB,iBAAiB,IAAI;AAAA;AAAA,EASnD,mBAAmB,CACjB,cACA,UACM;AAAA,IACN,KAAK,gBAAgB,QACnB,IAAI,oDACF,KAAK,iBACL,cACA,QACF,CACF;AAAA;AAAA,EAMF,mBAAmB,CACjB,cACiD;AAAA,IACjD,OAAO,KAAK,gBAAgB,oBAAoB,YAAY;AAAA;AAAA,EAa9D,SAAS,CAAC,SAA+B;AAAA,IACvC,OAAO,KAAK,iBAAiB,UAAU,OAAO;AAAA;AAAA,EAOhD,aAAa,CAAC,OAAyC;AAAA,IACrD,OAAO,KAAK,iBAAiB,cAAc,KAAK;AAAA;AAAA,EAOlD,SAAS,CAAC,OAAwB;AAAA,IAChC,OAAO,KAAK,iBAAiB,UAAU,KAAK;AAAA;AAAA,EAO9C,cAAc,GAAa;AAAA,IACzB,OAAO,KAAK,iBAAiB,eAAe;AAAA;AAAA,EAI9C,eAAe,CAIb,SACA,aACqB;AAAA,IACrB,OAAO,KAAK,kBAAkB,gBAAgB,SAAS,WAAW;AAAA;AAAA,EAGpE,iBAAiB,CACf,SACoC;AAAA,IACpC,MAAM,IAAI,MAAM,iBAAiB;AAAA;AAAA,EAGnC,iBAAiB,CACf,SACoC;AAAA,IACpC,MAAM,IAAI,MAAM,iBAAiB;AAAA;AAAA,EAMnC,kBAAkB,CAAC,MAKhB;AAAA,IACD,KAAK,gBAAgB,QACnB,IAAI,2DAA0B,KAAK,8BAA8B,GAAG,IAAI,GACxE,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,qBAAqB,CAAC,MAIb;AAAA,IACP,KAAK,gBAAgB,QACnB,IAAI,8DACF,KAAK,8BAA8B,GACnC,IACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAMF,kBAAkB,CAAC,MAIP;AAAA,IACV,MAAM,QACJ,KAAK,aAAa,KAAK,eACnB;AAAA,MACE,MAAM;AAAA,MACN,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK;AAAA,IAClB,IACA,KAAK,eACL,EAAE,MAAM,YAAqB,cAAc,KAAK,aAAa,IAC7D,EAAE,MAAM,SAAkB;AAAA,IAEhC,OAAO,CAAC,CAAC,KAAK,uBAAuB,mBAAmB;AAAA,MACtD,MAAM,KAAK;AAAA,MACX;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,qBAAqB,CAAC,MAKb;AAAA,IACP,KAAK,gBAAgB,QACnB,IAAI,8DACF,KAAK,8BAA8B,GACnC,IACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,qBAAqB,CAAC,MAKb;AAAA,IACP,KAAK,gBAAgB,QACnB,IAAI,8DACF,KAAK,8BAA8B,GACnC,IACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,mBAAmB,CACjB,MAOA;AAAA,IACA,KAAK,gBAAgB,QACnB,IAAI,4DACF,KAAK,8BAA8B,GACnC,IACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAKF,QAAQ,CAAC,OAOA;AAAA,IACP,KAAK,gBAAgB,QACnB,IAAI,sCAAgB,KAAK,oBAAoB,GAAG,KAAK,GACrD,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,WAAW,CACT,cACA,OACM;AAAA,IACN,KAAK,gBAAgB,QACnB,IAAI,yCACF,KAAK,oBAAoB,GACzB,cACA,MAAM,SACN,MAAM,OACR,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,WAAW,CAAC,MAOH;AAAA,IACP,KAAK,gBAAgB,QACnB,IAAI,yCAAmB,KAAK,oBAAoB,GAAG,IAAI,GACvD,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,WAAW,CAAC,MAAyD;AAAA,IACnE,KAAK,gBAAgB,QACnB,IAAI,yCAAmB,KAAK,oBAAoB,GAAG,IAAI,GACvD,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAMF,QAAQ,CAAC,MAA4D;AAAA,IACnE,OAAO,CAAC,CAAC,KAAK,aAAa,SAAS;AAAA,MAClC,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA;AAAA,EAMH,QAAQ,CAAC,MAGuB;AAAA,IAC9B,OAAO,KAAK,aAAa,SAAS;AAAA,MAChC,cAAc,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,IACb,CAAC;AAAA;AAAA,EAGH,WAAW,CAAC,QAAyD;AAAA,IACnE,KAAK,gBAAgB,QACnB,IAAI,yCAAmB,KAAK,oBAAoB,GAAG,MAAM,GACzD,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,SAAS,CAAC,cAAsB;AAAA,IAC9B,OAAO,KAAK,aAAa,UAAU,YAAY;AAAA;AAAA,EAGjD,aAAa,CAAC,aAAuD;AAAA,IACnE,OAAO,KAAK,aAAa,cAAc,WAAW;AAAA;AAAA,EAQ5C,iBAAiB,CAAC,OAAuC;AAAA,IAC/D,QAAQ,OAAO,QAAQ,YAAY;AAAA,IACnC,MAAM,eAAe,MAAM,WAAW;AAAA,IACtC,MAAM,cAAc,MAAM,WAAW,QAAQ,OAAO;AAAA,IAGpD,MAAM,eAA6B;AAAA,MACjC,cAAc,MAAM;AAAA,MACpB,WAAW,MAAM;AAAA,MACjB,OAAO;AAAA,QACL,OAAO,EAAE,KAAK,MAAM,UAAU,KAAK,aAAa;AAAA,QAChD,KAAK;AAAA,UACH,KAAK,EAAE,MAAM,UAAU,OAAO,YAAY;AAAA,UAC1C,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,IAGA,OAAO,KAAK,gBAAgB,gBAAgB,YAAY;AAAA;AAAA,EAS1D,mBAAmB,CAAC,OAA+B;AAAA,IACjD,KAAK,gBAAgB,QACnB,IAAI,iDAA2B,KAAK,cAAc,KAAK,CACzD;AAAA;AAAA,EAMF,sBAAsB,CAAC,cAAsB,OAAqB;AAAA,IAChE,KAAK,gBAAgB,QACnB,IAAI,oDAA8B,KAAK,cAAc,cAAc,KAAK,CAC1E;AAAA;AAAA,EAMF,wBAAwB,CAAC,cAA8B;AAAA,IACrD,MAAM,YAAY,KAAK,aAAa,wBAAwB;AAAA,IAC5D,OAAO,UAAU,OAAO,CAAC,MACvB,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,iBAAiB,YAAY,CACrD,EAAE;AAAA;AAAA,EAMJ,yCAAyC,CACvC,OACoB;AAAA,IACpB,OAAO,KAAK,aAAa,0CAA0C,KAAK;AAAA;AAAA,EAM1E,YAAY,CAAC,aAAiD;AAAA,IAC5D,OAAO,KAAK,aAAa,aAAa,WAAW;AAAA;AAAA,EAMnD,gBAAgB,GAAsB;AAAA,IACpC,OAAO,KAAK,aAAa,iBAAiB;AAAA;AAAA,EAM5C,uBAAuB,GAAuB;AAAA,IAC5C,OAAO,KAAK,aAAa,wBAAwB;AAAA;AAAA,EAMnD,YAAY,CAAC,OAA8B;AAAA,IACzC,KAAK,gBAAgB,QACnB,IAAI,0CAAoB,KAAK,cAAc,KAAK,CAClD;AAAA;AAAA,EAMF,eAAe,CAAC,cAAsB,OAAqB;AAAA,IACzD,KAAK,gBAAgB,QACnB,IAAI,6CAAuB,KAAK,cAAc,cAAc,KAAK,CACnE;AAAA;AAAA,EAMF,iBAAiB,CAAC,cAA8B;AAAA,IAC9C,MAAM,YAAY,KAAK,aAAa,iBAAiB;AAAA,IACrD,OAAO,UAAU,OAAO,CAAC,MACvB,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,iBAAiB,YAAY,CACrD,EAAE;AAAA;AAAA,EAMJ,8BAA8B,CAAC,OAAwC;AAAA,IACrE,OAAO,KAAK,aAAa,+BAA+B,KAAK;AAAA;AAAA,EAQ/D,gBAAgB,CAAC,OAAkD;AAAA,IACjE,OAAO,KAAK,aAAa,iBAAiB,KAAK;AAAA;AAAA,EAOjD,eAAe,CAAC,OAA2B;AAAA,IACzC,KAAK,gBAAgB,QACnB,IAAI,6CAAuB,KAAK,cAAc,KAAK,CACrD;AAAA;AAAA,EASF,UAAU,CACR,QACA,QACA,SACM;AAAA,IACN,KAAK,gBAAgB,QACnB,IAAI,0CACF,KAAK,iBACL,KAAK,aACL,QACA,QACA,OACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAkCF,SAAS,CACP,WACA,cACA,SACM;AAAA,IACN,KAAK,gBAAgB,QACnB,IAAI,yCACF,KAAK,iBACL,KAAK,aACL,WACA,cACA,OACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EA4BF,UAAU,CACR,aACA,gBAKA,SACM;AAAA,IACN,IAAI,YAAY,WAAW,GAAG;AAAA,MAC5B;AAAA,IACF;AAAA,IAIA,IAAI,QAAQ,QAAQ,MAAM;AAAA,MACxB,WAAW,QAAQ,eAAe,OAAO;AAAA,QACvC,MAAM,SAAsB;AAAA,UAC1B,cAAc,eAAe;AAAA,UAC7B,WAAW,eAAe;AAAA,UAC1B,UAAU,KAAK,MAAM;AAAA,UACrB,UAAU,KAAK,MAAM;AAAA,QACvB;AAAA,QACA,KAAK,WAAW,aAAa,QAAQ,OAAO;AAAA,MAC9C;AAAA,MACA;AAAA,IACF;AAAA,IAIA,MAAM,eAAe,KAAK,mBAAmB,WAAW;AAAA,IACxD,MAAM,cAAc,aAAa,SAAS,aAAa,SAAS;AAAA,IAChE,MAAM,eAAe,aAAa,SAAS,aAAa,SAAS;AAAA,IAGjE,MAAM,YAA0B;AAAA,MAC9B,cAAc,YAAY,GAAI;AAAA,MAC9B,WAAW,YAAY,GAAI;AAAA,MAC3B,OAAO;AAAA,QACL,OAAO,EAAE,KAAK,aAAa,QAAQ,KAAK,aAAa,OAAO;AAAA,QAC5D,KAAK;AAAA,UACH,KAAK,EAAE,MAAM,UAAU,OAAO,aAAa,OAAO;AAAA,UAClD,KAAK,EAAE,MAAM,UAAU,OAAO,aAAa,OAAO;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,IAGA,WAAW,QAAQ,eAAe,OAAO;AAAA,MACvC,MAAM,gBAAgB,KAAK,MAAM;AAAA,MACjC,MAAM,gBAAgB,KAAK,MAAM;AAAA,MACjC,MAAM,cACJ,KAAK,IAAI,IAAI,SAAS,WAAW,KAAK,IAAI,IAAI,QAAQ;AAAA,MACxD,MAAM,cACJ,KAAK,IAAI,IAAI,SAAS,WAAW,KAAK,IAAI,IAAI,QAAQ;AAAA,MAExD,MAAM,aAAa,cAAc,gBAAgB;AAAA,MACjD,MAAM,cAAc,cAAc,gBAAgB;AAAA,MAGlD,MAAM,aAAa,aAAa,eAAe,cAAc;AAAA,MAE7D,IAAI,YAAY;AAAA,QAEd,MAAM,cAA4B;AAAA,UAChC,cAAc,eAAe;AAAA,UAC7B,WAAW,eAAe;AAAA,UAC1B,OAAO;AAAA,YACL,OAAO,EAAE,KAAK,eAAe,KAAK,cAAc;AAAA,YAChD,KAAK;AAAA,cACH,KAAK,EAAE,MAAM,UAAU,OAAO,YAAY;AAAA,cAC1C,KAAK,EAAE,MAAM,UAAU,OAAO,YAAY;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AAAA,QAEA,KAAK,UAAU,WAAW,CAAC,WAAW,GAAG,OAAO;AAAA,MAClD,EAAO;AAAA,QAEL,MAAM,SAAsB;AAAA,UAC1B,cAAc,eAAe;AAAA,UAC7B,WAAW,eAAe;AAAA,UAC1B,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QAEA,KAAK,WAAW,aAAa,QAAQ,OAAO;AAAA;AAAA,IAEhD;AAAA;AAAA,EAMM,kBAAkB,CAAC,OAKzB;AAAA,IACA,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,MAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAAA,IAEA,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IAEb,WAAW,QAAQ,OAAO;AAAA,MACxB,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACvC,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACvC,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACvC,SAAS,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,IACzC;AAAA,IAEA,OAAO,EAAE,QAAQ,QAAQ,QAAQ,OAAO;AAAA;AAAA,EAiB1C,QAAQ,CAAC,QAAqB,QAA2B;AAAA,IACvD,KAAK,gBAAgB,QACnB,IAAI,wCACF,KAAK,iBACL,KAAK,aACL,QACA,MACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAwBF,SAAS,CAAC,aAA2B,QAA2B;AAAA,IAC9D,KAAK,gBAAgB,QACnB,IAAI,yCACF,KAAK,iBACL,KAAK,aACL,aACA,MACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAKF,QAAQ,CAAC,MAAyD;AAAA,IAChE,KAAK,gBAAgB,QACnB,IAAI,0CAAgB,KAAK,wBAAwB,GAAG,IAAI,GACxD,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,WAAW,CAAC,MAAyD;AAAA,IACnE,KAAK,gBAAgB,QACnB,IAAI,6CAAmB,KAAK,wBAAwB,GAAG,IAAI,GAC3D,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,WAAW,CAAC,MAIH;AAAA,IACP,KAAK,gBAAgB,QACnB,IAAI,6CAAmB,KAAK,wBAAwB,GAAG,IAAI,GAC3D,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAMF,QAAQ,CAAC,MAA4D;AAAA,IACnE,OAAO,CAAC,CAAC,KAAK,gBAAgB,SAAS,IAAI;AAAA;AAAA,EAG7C,SAAS,CAAC,cAAsB;AAAA,IAC9B,OAAO,KAAK,gBAAgB,UAAU,YAAY;AAAA;AAAA,EAGpD,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,KAIC;AAAA,IACD,OAAO,KAAK,gBAAgB,SAAS,EAAE,cAAc,UAAU,CAAC;AAAA;AAAA,EAGlE,kBAAkB,CAAC,MAGkB;AAAA,IACnC,OAAO,KAAK,gBAAgB,mBAAmB,IAAI;AAAA;AAAA,EAMrD,WAAW,CAAC,cAA4B;AAAA,IACtC,KAAK,gBAAgB,QACnB,IAAI,6CAAmB,KAAK,wBAAwB,GAAG,YAAY,GACnE,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,cAAc,CAAC,cAA4B;AAAA,IACzC,KAAK,gBAAgB,QACnB,IAAI,gDAAsB,KAAK,wBAAwB,GAAG,YAAY,GACtE,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAMF,WAAW,CAAC,cAA+B;AAAA,IACzC,OAAO,KAAK,gBAAgB,aAAa,EAAE,IAAI,YAAY;AAAA;AAAA,EAG7D,aAAa,CAAC,kBAA0B,gBAA8B;AAAA,IACpE,KAAK,gBAAgB,QACnB,IAAI,+CACF,KAAK,wBAAwB,GAC7B,kBACA,cACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,cAAc,CAAC,MAAyD;AAAA,IACtE,KAAK,gBAAgB,QACnB,IAAI,gDACF,KAAK,wBAAwB,GAC7B,KAAK,cACL,KAAK,eACP,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAGF,YAAY,GAAG;AAAA,IACb,OAAO,KAAK,gBAAgB,aAAa;AAAA;AAAA,EAY3C,eAAe,CACb,MACA,SACA;AAAA,IACA,KAAK,gBAAgB,QACnB,IAAI,+CAAuB,KAAK,iBAAiB,MAAM,OAAO,GAC9D,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAOF,cAAc,CAAC,SAAsB,SAA8B;AAAA,IACjE,KAAK,gBAAgB,QACnB,IAAI,8CAAsB,KAAK,iBAAiB,SAAS,OAAO,GAChE,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EASF,QAAQ,CACN,MAIA,WAIA,YAIA,WACM;AAAA,IACN,KAAK,gBAAgB,QACnB,IAAI,wCACF,KAAK,iBACL,KAAK,cACL,KAAK,iBACL,MACA,WACA,YACA,SACF,GACA,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAMF,qBAAqB,CAAC,SAAuB;AAAA,IAC3C,KAAK,gBAAgB,QACnB,IAAI,0CAAkB,KAAK,iBAAiB,OAAO,GACnD,EAAE,UAAU,KAAK,cAAc,WAAW,EAAE,CAC9C;AAAA;AAAA,EAKF,QAAQ,GAAG;AAAA,IACT,OAAO;AAAA,MACL,WAAW,KAAK,gBAAgB,aAAa;AAAA,MAC7C,kBAAkB,KAAK,uBAAuB,oBAAoB;AAAA,MAClE,QAAQ,KAAK,aAAa;AAAA,MAC1B,mBAAmB,KAAK,aAAa,wBAAwB;AAAA,MAC7D,YAAY,KAAK,aAAa,iBAAiB;AAAA,MAC/C,YAAY,KAAK,iBAAiB,iBAAiB;AAAA,IACrD;AAAA;AAAA,EAGF,QAAQ,CAAC,UAAsB;AAAA,IAC7B,OAAO,KAAK,aAAa,SAAS,QAAQ;AAAA;AAAA,EAG5C,eAAe,GAAW;AAAA,IACxB,OAAO,gCAAU,KAAK,SAAS,CAAC;AAAA;AAAA,EAGlC,uBAAuB,CAAC,MAAc;AAAA,IACpC,MAAM,eAAe,kCAAY,IAAI;AAAA,IAErC,KAAK,gBAAgB,eAAe,aAAa,SAAS;AAAA,IAE1D,aAAa,UAAU,QAAQ,CAAC,aAAa;AAAA,MAC3C,KAAK,uBAAuB,YAAY,SAAS,IAAI;AAAA,MACrD,KAAK,aAAa,YAAY,SAAS,IAAI;AAAA,MAC3C,SAAS,OAAO,QAAQ,CAAC,UAAU;AAAA,QACjC,KAAK,uBAAuB,SAAS;AAAA,UACnC,cAAc,SAAS;AAAA,UACvB,WAAW,MAAM;AAAA,QACnB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,KAAK,uBAAuB,sBAC1B,aAAa,gBACf;AAAA,IACA,KAAK,aAAa,YAAY,aAAa,MAAM;AAAA,IAIjD,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,IAAI,aAAa,mBAAmB;AAAA,MAClC,IAAI,aAAa,6BAA6B,KAAK;AAAA,QAEjD,yBAAyB,MAAM,KAC7B,aAAa,kBAAkB,OAAO,CACxC,EAAE,KAAK;AAAA,MACT,EAAO,SAAI,MAAM,QAAQ,aAAa,iBAAiB,GAAG;AAAA,QAExD,yBAAyB,aAAa;AAAA,MACxC;AAAA,IACF;AAAA,IAEA,IAAI,aAAa,YAAY;AAAA,MAC3B,IAAI,MAAM,QAAQ,aAAa,UAAU,GAAG;AAAA,QAC1C,kBAAkB,aAAa;AAAA,MACjC;AAAA,IACF;AAAA,IAEA,KAAK,aAAa,YAAY,wBAAwB,eAAe;AAAA,IAGrE,IAAI,aAAa,YAAY;AAAA,MAC3B,KAAK,iBAAiB,gBAAgB,aAAa,UAAU;AAAA,IAC/D;AAAA,IAGA,KAAK,kBAAkB,qBAAqB;AAAA,IAC5C,KAAK,aAAa,WAAW;AAAA;AAAA,EAS/B,IAAI,GAAY;AAAA,IACd,OAAO,KAAK,gBAAgB,KAAK;AAAA;AAAA,EAOnC,IAAI,GAAY;AAAA,IACd,OAAO,KAAK,gBAAgB,KAAK;AAAA;AAAA,EAMnC,OAAO,GAAY;AAAA,IACjB,OAAO,KAAK,gBAAgB,QAAQ;AAAA;AAAA,EAMtC,OAAO,GAAY;AAAA,IACjB,OAAO,KAAK,gBAAgB,QAAQ;AAAA;AAAA,EAOtC,YAAY,GAAmB;AAAA,IAC7B,OAAO,KAAK,gBAAgB,aAAa;AAAA;AAAA,EAM3C,cAAc,GAAS;AAAA,IACrB,KAAK,gBAAgB,eAAe;AAAA;AAAA,EAMtC,YAAY,GAAS;AAAA,IACnB,KAAK,gBAAgB,aAAa;AAAA;AAAA,EAS5B,uBAAuB,GAAyB;AAAA,IACtD,OAAO;AAAA,MACL,iBAAiB,KAAK;AAAA,MACtB,wBAAwB,KAAK;AAAA,MAC7B,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,kBAAkB,KAAK;AAAA,MACvB,kBAAkB,KAAK;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA;AAAA,EAOM,mBAAmB,GAAqB;AAAA,IAC9C,OAAO;AAAA,MACL,cAAc,KAAK;AAAA,MACnB,wBAAwB,KAAK;AAAA,MAC7B,iBAAiB,KAAK;AAAA,MACtB,kBAAkB,KAAK;AAAA,MACvB,cAAc,CAAC,SAAS,KAAK,aAAa,IAAI;AAAA,MAC9C;AAAA,IACF;AAAA;AAAA,EAOM,6BAA6B,GAA+B;AAAA,IAClE,OAAO;AAAA,MACL,wBAAwB,KAAK;AAAA,MAC7B,iBAAiB,KAAK;AAAA,MACtB;AAAA,IACF;AAAA;AAGJ;",
8
+ "debugId": "7361CB4F55749F1164756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -26,13 +26,13 @@ var __export = (target, all) => {
26
26
  });
27
27
  };
28
28
 
29
- // src/core/managers/api-schema-manager.ts
30
- var exports_api_schema_manager = {};
31
- __export(exports_api_schema_manager, {
29
+ // src/core/managers/schema-manager.ts
30
+ var exports_schema_manager = {};
31
+ __export(exports_schema_manager, {
32
32
  SchemaValidationError: () => SchemaValidationError,
33
- ApiSchemaManager: () => ApiSchemaManager
33
+ SchemaManager: () => SchemaManager
34
34
  });
35
- module.exports = __toCommonJS(exports_api_schema_manager);
35
+ module.exports = __toCommonJS(exports_schema_manager);
36
36
  var import_utils = require("../utils.cjs");
37
37
 
38
38
  class SchemaValidationError extends Error {
@@ -46,7 +46,7 @@ class SchemaValidationError extends Error {
46
46
  }
47
47
  }
48
48
 
49
- class ApiSchemaManager {
49
+ class SchemaManager {
50
50
  tableManager;
51
51
  schemas = new Map;
52
52
  constructor(tableManager) {
@@ -75,6 +75,9 @@ class ApiSchemaManager {
75
75
  removeSchema(namespace) {
76
76
  return this.schemas.delete(namespace);
77
77
  }
78
+ hasSchemas() {
79
+ return this.schemas.size > 0;
80
+ }
78
81
  isCellProtected(cell) {
79
82
  for (const schema of this.schemas.values()) {
80
83
  if (schema.type === "cell") {
@@ -301,4 +304,4 @@ class ApiSchemaManager {
301
304
  }
302
305
  }
303
306
 
304
- //# debugId=0A401D0913B21D2A64756E2164756E21
307
+ //# debugId=23F311326D87754664756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/managers/schema-manager.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * SchemaManager - Manages schema definitions and validation\n *\n * Tracks registered schemas and provides validation for cell writes,\n * spill operations, and copy/paste operations.\n */\n\nimport type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRange,\n TableDefinition,\n} from \"../types.cjs\";\nimport { cellAddressToKey, isCellInRange } from \"../utils.cjs\";\nimport type { TableManager } from \"./table-manager.cjs\";\n\nexport type ParseFunction<TCellMetadata = unknown> = (\n value: unknown,\n metadata: TCellMetadata\n) => unknown;\n\nexport type TableSchemaHeaders<TCellMetadata = unknown> = Record<\n string,\n {\n parse: ParseFunction<TCellMetadata>;\n index: number;\n }\n>;\n\nexport interface RegisteredTableSchema {\n type: \"table\";\n namespace: string;\n workbookName: string;\n tableName: string;\n headers: TableSchemaHeaders;\n}\n\nexport interface RegisteredCellSchema {\n type: \"cell\";\n namespace: string;\n cellAddress: CellAddress;\n parse: ParseFunction;\n}\n\nexport type RegisteredSchema = RegisteredTableSchema | RegisteredCellSchema;\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n originalError?: Error;\n}\n\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public cellAddress?: CellAddress,\n public originalError?: Error\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n\nexport class SchemaManager {\n private schemas: Map<string, RegisteredSchema> = new Map();\n\n constructor(private tableManager: TableManager) {}\n\n /**\n * Register a table schema\n */\n registerTableSchema(\n namespace: string,\n workbookName: string,\n tableName: string,\n headers: TableSchemaHeaders\n ): void {\n this.schemas.set(namespace, {\n type: \"table\",\n namespace,\n workbookName,\n tableName,\n headers,\n });\n }\n\n /**\n * Register a cell schema\n */\n registerCellSchema(\n namespace: string,\n cellAddress: CellAddress,\n parse: ParseFunction\n ): void {\n this.schemas.set(namespace, {\n type: \"cell\",\n namespace,\n cellAddress,\n parse,\n });\n }\n\n /**\n * Get a schema by namespace\n */\n getSchema(namespace: string): RegisteredSchema | undefined {\n return this.schemas.get(namespace);\n }\n\n /**\n * Remove a schema\n */\n removeSchema(namespace: string): boolean {\n return this.schemas.delete(namespace);\n }\n\n /**\n * Check if any schemas are registered\n */\n hasSchemas(): boolean {\n return this.schemas.size > 0;\n }\n\n /**\n * Check if a cell is protected by a schema\n * Returns the schema info if protected, null otherwise\n */\n isCellProtected(\n cell: CellAddress\n ): { schema: RegisteredSchema; columnName?: string } | null {\n for (const schema of this.schemas.values()) {\n if (schema.type === \"cell\") {\n if (\n schema.cellAddress.workbookName === cell.workbookName &&\n schema.cellAddress.sheetName === cell.sheetName &&\n schema.cellAddress.colIndex === cell.colIndex &&\n schema.cellAddress.rowIndex === cell.rowIndex\n ) {\n return { schema };\n }\n } else if (schema.type === \"table\") {\n const table = this.tableManager.getTable({\n workbookName: schema.workbookName,\n name: schema.tableName,\n });\n\n if (!table) continue;\n\n // Check if cell is in table's data range (excluding header row)\n if (\n cell.workbookName === table.workbookName &&\n cell.sheetName === table.sheetName\n ) {\n const isInDataRange = this.isCellInTableDataRange(cell, table);\n if (isInDataRange) {\n // Find which column this cell is in\n const colOffset = cell.colIndex - table.start.colIndex;\n const columnName = this.getColumnNameByIndex(\n schema.headers,\n colOffset\n );\n return { schema, columnName };\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Check if a cell is within a table's data range (excluding header row)\n */\n private isCellInTableDataRange(\n cell: CellAddress,\n table: TableDefinition\n ): boolean {\n const { start, endRow, headers } = table;\n\n // Data starts one row below header\n const dataStartRow = start.rowIndex + 1;\n\n // Check row bounds (data rows only, not header)\n const isInRowRange =\n endRow.type === \"infinity\"\n ? cell.rowIndex >= dataStartRow\n : cell.rowIndex >= dataStartRow && cell.rowIndex <= endRow.value;\n\n // Check column bounds\n const endColIndex = start.colIndex + headers.size - 1;\n const isInColRange =\n cell.colIndex >= start.colIndex && cell.colIndex <= endColIndex;\n\n return isInRowRange && isInColRange;\n }\n\n /**\n * Get column name by index from headers\n */\n private getColumnNameByIndex(\n headers: TableSchemaHeaders,\n index: number\n ): string | undefined {\n for (const [name, header] of Object.entries(headers)) {\n if (header.index === index) {\n return name;\n }\n }\n return undefined;\n }\n\n /**\n * Validate a cell write against schemas\n */\n validateCellWrite(\n cell: CellAddress,\n value: SerializedCellValue,\n metadata?: unknown\n ): ValidationResult {\n // Allow clearing cells (undefined or empty string)\n if (value === undefined || value === \"\") {\n return { valid: true };\n }\n\n const protection = this.isCellProtected(cell);\n\n if (!protection) {\n return { valid: true };\n }\n\n const { schema, columnName } = protection;\n\n try {\n if (schema.type === \"cell\") {\n schema.parse(value, metadata);\n } else if (schema.type === \"table\" && columnName) {\n const header = schema.headers[columnName];\n if (header) {\n header.parse(value, metadata);\n }\n }\n return { valid: true };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n return {\n valid: false,\n error: `Schema validation failed for ${schema.namespace}${\n columnName ? `.${columnName}` : \"\"\n }: ${error.message}`,\n originalError: error,\n };\n }\n }\n\n /**\n * Validate a spill area against schemas\n * Returns validation result - if invalid, spill should produce #SPILL! error\n */\n validateSpillArea(\n origin: CellAddress,\n spillArea: SpreadsheetRange,\n getSpillValue: (row: number, col: number) => SerializedCellValue,\n getMetadata?: (cell: CellAddress) => unknown\n ): ValidationResult {\n // Get the bounds of the spill area\n const startRow = spillArea.start.row;\n const startCol = spillArea.start.col;\n const endRow =\n spillArea.end.row.type === \"number\"\n ? spillArea.end.row.value\n : startRow + 100; // Limit for infinite ranges\n const endCol =\n spillArea.end.col.type === \"number\"\n ? spillArea.end.col.value\n : startCol + 100; // Limit for infinite ranges\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const cell: CellAddress = {\n workbookName: origin.workbookName,\n sheetName: origin.sheetName,\n rowIndex: row,\n colIndex: col,\n };\n\n const protection = this.isCellProtected(cell);\n if (protection) {\n const value = getSpillValue(row - startRow, col - startCol);\n const metadata = getMetadata ? getMetadata(cell) : undefined;\n const validation = this.validateCellWrite(cell, value, metadata);\n\n if (!validation.valid) {\n return {\n valid: false,\n error: `Spill blocked by schema at ${cellAddressToKey(cell)}: ${\n validation.error\n }`,\n originalError: validation.originalError,\n };\n }\n }\n }\n }\n\n return { valid: true };\n }\n\n /**\n * Update schemas when a table is renamed\n */\n updateForTableRename(\n workbookName: string,\n oldTableName: string,\n newTableName: string\n ): void {\n for (const schema of this.schemas.values()) {\n if (\n schema.type === \"table\" &&\n schema.workbookName === workbookName &&\n schema.tableName === oldTableName\n ) {\n schema.tableName = newTableName;\n }\n }\n }\n\n /**\n * Update schemas when a sheet is renamed\n */\n updateForSheetRename(\n workbookName: string,\n oldSheetName: string,\n newSheetName: string\n ): void {\n for (const schema of this.schemas.values()) {\n if (schema.type === \"cell\") {\n if (\n schema.cellAddress.workbookName === workbookName &&\n schema.cellAddress.sheetName === oldSheetName\n ) {\n schema.cellAddress.sheetName = newSheetName;\n }\n }\n // Table schemas don't store sheetName directly - they get it from TableManager\n }\n }\n\n /**\n * Update schemas when a workbook is renamed\n */\n updateForWorkbookRename(\n oldWorkbookName: string,\n newWorkbookName: string\n ): void {\n for (const schema of this.schemas.values()) {\n if (schema.type === \"cell\") {\n if (schema.cellAddress.workbookName === oldWorkbookName) {\n schema.cellAddress.workbookName = newWorkbookName;\n }\n } else if (schema.type === \"table\") {\n if (schema.workbookName === oldWorkbookName) {\n schema.workbookName = newWorkbookName;\n }\n }\n }\n }\n\n /**\n * Get all schemas (for debugging/testing)\n */\n getAllSchemas(): Map<string, RegisteredSchema> {\n return new Map(this.schemas);\n }\n\n /**\n * Validate all schema constraints using evaluated cell values.\n *\n * This is the key method for schema validation with rollback:\n * - It validates EVALUATED values, not raw content\n * - A cell with \"=123+123\" validates as number (246), not string\n * - Called after re-evaluation to check all schema-constrained cells\n *\n * @param getCellValue - Function to get the evaluated value of a cell\n * @param getCellMetadata - Optional function to get cell metadata\n * @returns Validation result with all errors found\n */\n validateAllSchemaConstraints(\n getCellValue: (cell: CellAddress) => SerializedCellValue,\n getCellMetadata?: (cell: CellAddress) => unknown,\n getTableDataCells?: (table: TableDefinition) => CellAddress[]\n ): {\n valid: boolean;\n errors: Array<{\n message: string;\n cellAddress?: CellAddress;\n schemaNamespace?: string;\n columnName?: string;\n originalError?: Error;\n }>;\n } {\n const errors: Array<{\n message: string;\n cellAddress?: CellAddress;\n schemaNamespace?: string;\n columnName?: string;\n originalError?: Error;\n }> = [];\n\n for (const [namespace, schema] of this.schemas) {\n if (schema.type === \"cell\") {\n // Validate single cell using evaluated value\n let value: SerializedCellValue;\n try {\n value = getCellValue(schema.cellAddress);\n } catch {\n // Sheet/cell doesn't exist yet, skip validation\n continue;\n }\n\n const metadata = getCellMetadata\n ? getCellMetadata(schema.cellAddress)\n : undefined;\n\n // Skip empty cells\n if (value === undefined || value === \"\") {\n continue;\n }\n\n try {\n schema.parse(value, metadata);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n errors.push({\n message: `Schema validation failed for ${namespace}: ${error.message}`,\n cellAddress: schema.cellAddress,\n schemaNamespace: namespace,\n originalError: error,\n });\n }\n } else if (schema.type === \"table\") {\n // Get the table definition\n const table = this.tableManager.getTable({\n workbookName: schema.workbookName,\n name: schema.tableName,\n });\n\n if (!table) continue;\n\n const { start, headers } = table;\n\n // Get cells to validate - use callback if provided (handles infinite ranges efficiently)\n // Otherwise fall back to simple iteration for finite tables\n let cellsToValidate: CellAddress[];\n if (getTableDataCells) {\n cellsToValidate = getTableDataCells(table);\n } else {\n // Fallback for finite tables when no callback provided\n const { endRow } = table;\n if (endRow.type === \"infinity\") {\n // Skip validation for infinite tables without a cell iterator\n continue;\n }\n cellsToValidate = [];\n const dataStartRow = start.rowIndex + 1;\n const endColIndex = start.colIndex + headers.size - 1;\n for (let row = dataStartRow; row <= endRow.value; row++) {\n for (let col = start.colIndex; col <= endColIndex; col++) {\n cellsToValidate.push({\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n rowIndex: row,\n colIndex: col,\n });\n }\n }\n }\n\n for (const cell of cellsToValidate) {\n // Skip header row\n if (cell.rowIndex <= start.rowIndex) continue;\n\n let value: SerializedCellValue;\n try {\n value = getCellValue(cell);\n } catch {\n // Sheet/cell doesn't exist yet, skip validation\n continue;\n }\n\n // Skip empty cells\n if (value === undefined || value === \"\") {\n continue;\n }\n\n // Find the column name\n const colOffset = cell.colIndex - start.colIndex;\n const columnName = this.getColumnNameByIndex(\n schema.headers,\n colOffset\n );\n\n if (columnName && schema.headers[columnName]) {\n const header = schema.headers[columnName];\n const metadata = getCellMetadata\n ? getCellMetadata(cell)\n : undefined;\n\n try {\n header.parse(value, metadata);\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(String(err));\n errors.push({\n message: `Schema validation failed for ${namespace}.${columnName}: ${error.message}`,\n cellAddress: cell,\n schemaNamespace: namespace,\n columnName,\n originalError: error,\n });\n }\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "23F311326D87754664756E2164756E21",
9
+ "names": []
10
+ }
@@ -26,7 +26,7 @@ var __export = (target, all) => {
26
26
  });
27
27
  };
28
28
 
29
- // src/core/api/cell-orm.ts
29
+ // src/core/schema/cell-orm.ts
30
30
  var exports_cell_orm = {};
31
31
  __export(exports_cell_orm, {
32
32
  CellOrm: () => CellOrm
@@ -77,4 +77,4 @@ class CellOrm {
77
77
  }
78
78
  }
79
79
 
80
- //# debugId=65719C8FCB16AB7864756E2164756E21
80
+ //# debugId=D97691ED8FAC4EF364756E2164756E21
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/core/api/cell-orm.ts"],
3
+ "sources": ["../../../../src/core/schema/cell-orm.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * CellOrm - Object-Relational Mapping for single cell data\n *\n * Provides read/write operations for a single cell with type-safe access.\n * Used as the `this` context for custom cell API methods.\n */\n\nimport type { CellAddress, SerializedCellValue } from \"../types.cjs\";\nimport type { FormulaEngine } from \"../engine.cjs\";\n\nexport type CellParseFunction<TCellMetadata, TValue> = (\n value: unknown,\n metadata: TCellMetadata\n) => TValue;\n\nexport class CellOrm<TValue, TCellMetadata = unknown> {\n constructor(\n private engine: FormulaEngine<any, any>,\n private cellAddress: CellAddress,\n private parser: CellParseFunction<TCellMetadata, TValue>,\n private namespace: string\n ) {}\n\n /**\n * Read the cell value and parse it using the schema's parse function\n */\n read(): TValue {\n const value = this.engine.getCellValue(this.cellAddress);\n const metadata = this.engine.getCellMetadata(this.cellAddress) as TCellMetadata;\n return this.parser(value, metadata);\n }\n\n /**\n * Write a value to the cell\n * The value should be the parsed type - it will be converted to a serializable value\n */\n write(value: TValue): void {\n // Convert TValue to SerializedCellValue\n let serializedValue: SerializedCellValue;\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n serializedValue = value;\n } else if (value === null || value === undefined) {\n serializedValue = undefined;\n } else if (typeof value === \"object\") {\n // For objects, we need to extract the actual cell value\n // This assumes the parsed type might be an object with a 'value' property\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n const innerValue = obj.value;\n if (\n typeof innerValue === \"string\" ||\n typeof innerValue === \"number\" ||\n typeof innerValue === \"boolean\"\n ) {\n serializedValue = innerValue;\n } else {\n serializedValue = String(innerValue);\n }\n } else {\n // Fallback: convert to string\n serializedValue = JSON.stringify(value);\n }\n } else {\n serializedValue = String(value);\n }\n\n this.engine.setCellContent(this.cellAddress, serializedValue);\n }\n\n /**\n * Get the cell address\n */\n getAddress(): CellAddress {\n return { ...this.cellAddress };\n }\n}\n"
6
6
  ],
7
7
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,QAAyC;AAAA,EAE1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAJV,WAAW,CACD,QACA,aACA,QACA,WACR;AAAA,IAJQ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAMV,IAAI,GAAW;AAAA,IACb,MAAM,QAAQ,KAAK,OAAO,aAAa,KAAK,WAAW;AAAA,IACvD,MAAM,WAAW,KAAK,OAAO,gBAAgB,KAAK,WAAW;AAAA,IAC7D,OAAO,KAAK,OAAO,OAAO,QAAQ;AAAA;AAAA,EAOpC,KAAK,CAAC,OAAqB;AAAA,IAEzB,IAAI;AAAA,IAEJ,IACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AAAA,MACA,kBAAkB;AAAA,IACpB,EAAO,SAAI,UAAU,QAAQ,UAAU,WAAW;AAAA,MAChD,kBAAkB;AAAA,IACpB,EAAO,SAAI,OAAO,UAAU,UAAU;AAAA,MAGpC,MAAM,MAAM;AAAA,MACZ,IAAI,WAAW,KAAK;AAAA,QAClB,MAAM,aAAa,IAAI;AAAA,QACvB,IACE,OAAO,eAAe,YACtB,OAAO,eAAe,YACtB,OAAO,eAAe,WACtB;AAAA,UACA,kBAAkB;AAAA,QACpB,EAAO;AAAA,UACL,kBAAkB,OAAO,UAAU;AAAA;AAAA,MAEvC,EAAO;AAAA,QAEL,kBAAkB,KAAK,UAAU,KAAK;AAAA;AAAA,IAE1C,EAAO;AAAA,MACL,kBAAkB,OAAO,KAAK;AAAA;AAAA,IAGhC,KAAK,OAAO,eAAe,KAAK,aAAa,eAAe;AAAA;AAAA,EAM9D,UAAU,GAAgB;AAAA,IACxB,OAAO,KAAK,KAAK,YAAY;AAAA;AAEjC;",
8
- "debugId": "65719C8FCB16AB7864756E2164756E21",
8
+ "debugId": "D97691ED8FAC4EF364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -26,42 +26,32 @@ var __export = (target, all) => {
26
26
  });
27
27
  };
28
28
 
29
- // src/core/api/api-builder.ts
30
- var exports_api_builder = {};
31
- __export(exports_api_builder, {
32
- buildApiFromDeclaration: () => buildApiFromDeclaration
29
+ // src/core/schema/schema-builder.ts
30
+ var exports_schema_builder = {};
31
+ __export(exports_schema_builder, {
32
+ buildSchemaFromDeclaration: () => buildSchemaFromDeclaration
33
33
  });
34
- module.exports = __toCommonJS(exports_api_builder);
34
+ module.exports = __toCommonJS(exports_schema_builder);
35
35
  var import_table_orm = require("./table-orm.cjs");
36
36
  var import_cell_orm = require("./cell-orm.cjs");
37
- function buildApiFromDeclaration(engine, declaration, schemaManager) {
38
- const api = {};
37
+ function buildSchemaFromDeclaration(engine, declaration, schemaManager) {
38
+ const schema = {};
39
39
  for (const [namespace, def] of Object.entries(declaration)) {
40
40
  if (def.type === "table") {
41
- api[namespace] = buildTableApi(engine, namespace, def, schemaManager);
41
+ schema[namespace] = buildTableSchema(engine, namespace, def, schemaManager);
42
42
  } else if (def.type === "cell") {
43
- api[namespace] = buildCellApi(engine, namespace, def, schemaManager);
43
+ schema[namespace] = buildCellSchema(engine, namespace, def, schemaManager);
44
44
  }
45
45
  }
46
- return api;
46
+ return schema;
47
47
  }
48
- function buildTableApi(engine, namespace, def, schemaManager) {
48
+ function buildTableSchema(engine, namespace, def, schemaManager) {
49
49
  schemaManager.registerTableSchema(namespace, def.workbookName, def.tableName, def.headers);
50
- const orm = new import_table_orm.TableOrm(engine, def.workbookName, def.tableName, def.headers, namespace);
51
- const boundMethods = {};
52
- for (const [methodName, methodFn] of Object.entries(def.methods)) {
53
- boundMethods[methodName] = methodFn.bind(orm);
54
- }
55
- return boundMethods;
50
+ return new import_table_orm.TableOrm(engine, def.workbookName, def.tableName, def.headers, namespace);
56
51
  }
57
- function buildCellApi(engine, namespace, def, schemaManager) {
52
+ function buildCellSchema(engine, namespace, def, schemaManager) {
58
53
  schemaManager.registerCellSchema(namespace, def.cellAddress, def.parse);
59
- const orm = new import_cell_orm.CellOrm(engine, def.cellAddress, def.parse, namespace);
60
- const boundMethods = {};
61
- for (const [methodName, methodFn] of Object.entries(def.methods)) {
62
- boundMethods[methodName] = methodFn.bind(orm);
63
- }
64
- return boundMethods;
54
+ return new import_cell_orm.CellOrm(engine, def.cellAddress, def.parse, namespace);
65
55
  }
66
56
 
67
- //# debugId=1A339C89282699D664756E2164756E21
57
+ //# debugId=25D57A0A5478F95664756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/schema/schema-builder.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Schema Builder - Constructs the working schema from declarations\n *\n * This module is responsible for creating the actual working schema\n * from the schema declarations when attached to a FormulaEngine.\n */\n\nimport type { FormulaEngine } from \"../engine.cjs\";\nimport type { SchemaDeclaration, TableSchemaDefinition, CellSchemaDefinition, Schema } from \"./schema.cjs\";\nimport { TableOrm } from \"./table-orm.cjs\";\nimport { CellOrm } from \"./cell-orm.cjs\";\nimport type { SchemaManager } from \"../managers/schema-manager.cjs\";\n\n/**\n * Build the working schema surface from declarations\n *\n * This creates TableOrm and CellOrm instances for each declared schema\n * and returns them directly.\n */\nexport function buildSchemaFromDeclaration(\n engine: FormulaEngine<any, any>,\n declaration: SchemaDeclaration,\n schemaManager: SchemaManager\n): Schema {\n const schema: Schema = {};\n\n for (const [namespace, def] of Object.entries(declaration)) {\n if (def.type === \"table\") {\n schema[namespace] = buildTableSchema(engine, namespace, def, schemaManager);\n } else if (def.type === \"cell\") {\n schema[namespace] = buildCellSchema(engine, namespace, def, schemaManager);\n }\n }\n\n return schema;\n}\n\n/**\n * Build schema for a table schema - returns TableOrm instance directly\n */\nfunction buildTableSchema(\n engine: FormulaEngine<any, any>,\n namespace: string,\n def: TableSchemaDefinition,\n schemaManager: SchemaManager\n): TableOrm<any> {\n // Register the schema with the schema manager\n schemaManager.registerTableSchema(\n namespace,\n def.workbookName,\n def.tableName,\n def.headers\n );\n\n // Create and return the ORM instance directly\n return new TableOrm(\n engine,\n def.workbookName,\n def.tableName,\n def.headers,\n namespace\n );\n}\n\n/**\n * Build schema for a cell schema - returns CellOrm instance directly\n */\nfunction buildCellSchema(\n engine: FormulaEngine<any, any>,\n namespace: string,\n def: CellSchemaDefinition,\n schemaManager: SchemaManager\n): CellOrm<any> {\n // Register the schema with the schema manager\n schemaManager.registerCellSchema(namespace, def.cellAddress, def.parse);\n\n // Create and return the ORM instance directly\n return new CellOrm(engine, def.cellAddress, def.parse, namespace);\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASyB,IAAzB;AACwB,IAAxB;AASO,SAAS,0BAA0B,CACxC,QACA,aACA,eACQ;AAAA,EACR,MAAM,SAAiB,CAAC;AAAA,EAExB,YAAY,WAAW,QAAQ,OAAO,QAAQ,WAAW,GAAG;AAAA,IAC1D,IAAI,IAAI,SAAS,SAAS;AAAA,MACxB,OAAO,aAAa,iBAAiB,QAAQ,WAAW,KAAK,aAAa;AAAA,IAC5E,EAAO,SAAI,IAAI,SAAS,QAAQ;AAAA,MAC9B,OAAO,aAAa,gBAAgB,QAAQ,WAAW,KAAK,aAAa;AAAA,IAC3E;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,gBAAgB,CACvB,QACA,WACA,KACA,eACe;AAAA,EAEf,cAAc,oBACZ,WACA,IAAI,cACJ,IAAI,WACJ,IAAI,OACN;AAAA,EAGA,OAAO,IAAI,0BACT,QACA,IAAI,cACJ,IAAI,WACJ,IAAI,SACJ,SACF;AAAA;AAMF,SAAS,eAAe,CACtB,QACA,WACA,KACA,eACc;AAAA,EAEd,cAAc,mBAAmB,WAAW,IAAI,aAAa,IAAI,KAAK;AAAA,EAGtE,OAAO,IAAI,wBAAQ,QAAQ,IAAI,aAAa,IAAI,OAAO,SAAS;AAAA;",
8
+ "debugId": "25D57A0A5478F95664756E2164756E21",
9
+ "names": []
10
+ }
@@ -26,9 +26,9 @@ var __export = (target, all) => {
26
26
  });
27
27
  };
28
28
 
29
- // src/core/api/api-helpers.ts
30
- var exports_api_helpers = {};
31
- __export(exports_api_helpers, {
29
+ // src/core/schema/schema-helpers.ts
30
+ var exports_schema_helpers = {};
31
+ __export(exports_schema_helpers, {
32
32
  rowToObject: () => rowToObject,
33
33
  objectToRowValues: () => objectToRowValues,
34
34
  matchesFilter: () => matchesFilter,
@@ -36,7 +36,7 @@ __export(exports_api_helpers, {
36
36
  getTableRowCount: () => getTableRowCount,
37
37
  getNextEmptyRow: () => getNextEmptyRow
38
38
  });
39
- module.exports = __toCommonJS(exports_api_helpers);
39
+ module.exports = __toCommonJS(exports_schema_helpers);
40
40
  function rowToObject(engine, table, rowIndex, headers, getCellMetadata) {
41
41
  const result = {};
42
42
  for (const [columnName, header] of Object.entries(headers)) {
@@ -188,4 +188,4 @@ function* iterateTableRows(engine, table) {
188
188
  }
189
189
  }
190
190
 
191
- //# debugId=3AEF0EFABA7782E064756E2164756E21
191
+ //# debugId=B2DCAD898285C57D64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/schema/schema-helpers.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Schema Helper utilities for row/object conversion and filtering\n */\n\nimport type { CellAddress, SerializedCellValue, TableDefinition } from \"../types.cjs\";\nimport type { FormulaEngine } from \"../engine.cjs\";\n\nexport type ParseFunction<TCellMetadata = unknown> = (\n value: unknown,\n metadata: TCellMetadata\n) => unknown;\n\nexport type TableSchemaHeaders<TCellMetadata = unknown> = Record<\n string,\n {\n parse: ParseFunction<TCellMetadata>;\n index: number;\n }\n>;\n\n/**\n * Convert a spreadsheet row to a typed object using header parsers\n */\nexport function rowToObject<TItem extends Record<string, unknown>>(\n engine: FormulaEngine<any, any>,\n table: TableDefinition,\n rowIndex: number,\n headers: TableSchemaHeaders,\n getCellMetadata?: (cell: CellAddress) => unknown\n): TItem {\n const result: Record<string, unknown> = {};\n\n for (const [columnName, header] of Object.entries(headers)) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + header.index,\n rowIndex,\n };\n\n const value = engine.getCellValue(cellAddress);\n const metadata = getCellMetadata ? getCellMetadata(cellAddress) : undefined;\n\n // Parse the value using the column's parse function\n result[columnName] = header.parse(value, metadata);\n }\n\n return result as TItem;\n}\n\n/**\n * Convert a typed object to cell values based on headers\n */\nexport function objectToRowValues<TItem extends Record<string, unknown>>(\n obj: TItem,\n headers: TableSchemaHeaders\n): Map<number, SerializedCellValue> {\n const values = new Map<number, SerializedCellValue>();\n\n for (const [columnName, header] of Object.entries(headers)) {\n if (columnName in obj) {\n const value = obj[columnName];\n // Convert to serializable value\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n values.set(header.index, value);\n } else if (value === null || value === undefined) {\n values.set(header.index, undefined);\n } else {\n // For complex types, convert to string\n values.set(header.index, String(value));\n }\n }\n }\n\n return values;\n}\n\n/**\n * Check if an object matches a filter predicate\n */\nexport function matchesFilter<TItem extends Record<string, unknown>>(\n item: TItem,\n filter: Partial<TItem>\n): boolean {\n for (const [key, value] of Object.entries(filter)) {\n if (item[key] !== value) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Get the number of data rows in a table (excluding header)\n */\nexport function getTableRowCount(\n engine: FormulaEngine<any, any>,\n table: TableDefinition\n): number {\n if (table.endRow.type === \"infinity\") {\n // For infinite tables, count non-empty rows\n // Start from data row (after header)\n let count = 0;\n let emptyRowStreak = 0;\n const maxEmptyRows = 10; // Stop after 10 consecutive empty rows\n\n for (let row = table.start.rowIndex + 1; emptyRowStreak < maxEmptyRows; row++) {\n let hasContent = false;\n\n for (let col = 0; col < table.headers.size; col++) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + col,\n rowIndex: row,\n };\n\n const value = engine.getCellValue(cellAddress);\n if (value !== \"\" && value !== undefined) {\n hasContent = true;\n break;\n }\n }\n\n if (hasContent) {\n count++;\n emptyRowStreak = 0;\n } else {\n emptyRowStreak++;\n }\n }\n\n return count;\n } else {\n // For finite tables, calculate from endRow\n return table.endRow.value - table.start.rowIndex;\n }\n}\n\n/**\n * Get the next empty row index for appending data\n */\nexport function getNextEmptyRow(\n engine: FormulaEngine<any, any>,\n table: TableDefinition\n): number {\n const dataStartRow = table.start.rowIndex + 1;\n\n if (table.endRow.type === \"infinity\") {\n // Find first empty row\n let emptyRowStreak = 0;\n const maxEmptyRows = 10;\n\n for (let row = dataStartRow; ; row++) {\n let hasContent = false;\n\n for (let col = 0; col < table.headers.size; col++) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + col,\n rowIndex: row,\n };\n\n const value = engine.getCellValue(cellAddress);\n if (value !== \"\" && value !== undefined) {\n hasContent = true;\n break;\n }\n }\n\n if (!hasContent) {\n return row;\n }\n\n emptyRowStreak = hasContent ? 0 : emptyRowStreak + 1;\n if (emptyRowStreak >= maxEmptyRows) {\n return row - maxEmptyRows + 1;\n }\n }\n } else {\n // For finite tables, return the row after the last data row\n return table.endRow.value + 1;\n }\n}\n\n/**\n * Iterate over all data rows in a table\n */\nexport function* iterateTableRows(\n engine: FormulaEngine<any, any>,\n table: TableDefinition\n): Generator<{ rowIndex: number; isEmpty: boolean }> {\n const dataStartRow = table.start.rowIndex + 1;\n\n if (table.endRow.type === \"infinity\") {\n let emptyRowStreak = 0;\n const maxEmptyRows = 10;\n\n for (let row = dataStartRow; emptyRowStreak < maxEmptyRows; row++) {\n let hasContent = false;\n\n for (let col = 0; col < table.headers.size; col++) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + col,\n rowIndex: row,\n };\n\n const value = engine.getCellValue(cellAddress);\n if (value !== \"\" && value !== undefined) {\n hasContent = true;\n break;\n }\n }\n\n if (hasContent) {\n emptyRowStreak = 0;\n yield { rowIndex: row, isEmpty: false };\n } else {\n emptyRowStreak++;\n // Don't yield empty rows at the end\n }\n }\n } else {\n for (let row = dataStartRow; row <= table.endRow.value; row++) {\n let hasContent = false;\n\n for (let col = 0; col < table.headers.size; col++) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + col,\n rowIndex: row,\n };\n\n const value = engine.getCellValue(cellAddress);\n if (value !== \"\" && value !== undefined) {\n hasContent = true;\n break;\n }\n }\n\n yield { rowIndex: row, isEmpty: !hasContent };\n }\n }\n}\n\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "B2DCAD898285C57D64756E2164756E21",
9
+ "names": []
10
+ }
@@ -26,40 +26,36 @@ var __export = (target, all) => {
26
26
  });
27
27
  };
28
28
 
29
- // src/core/api/api.ts
30
- var exports_api = {};
31
- __export(exports_api, {
32
- defineApi: () => defineApi,
33
- createApi: () => createApi
29
+ // src/core/schema/schema.ts
30
+ var exports_schema = {};
31
+ __export(exports_schema, {
32
+ defineSchema: () => defineSchema
34
33
  });
35
- module.exports = __toCommonJS(exports_api);
36
- function defineApi() {
34
+ module.exports = __toCommonJS(exports_schema);
35
+ function defineSchema() {
37
36
  const declaration = {};
38
37
  const builder = {
39
- addTableApi(namespace, address, headers, methods) {
38
+ addTableSchema(namespace, address, headers) {
40
39
  declaration[namespace] = {
41
40
  type: "table",
42
41
  tableName: address.tableName,
43
42
  workbookName: address.workbookName,
44
- headers,
45
- methods
43
+ headers
46
44
  };
47
45
  return builder;
48
46
  },
49
- addCellApi(namespace, cellAddress, parse, methods) {
47
+ addCellSchema(namespace, cellAddress, parse) {
50
48
  declaration[namespace] = {
51
49
  type: "cell",
52
50
  cellAddress,
53
- parse,
54
- methods
51
+ parse
55
52
  };
56
53
  return builder;
57
54
  },
58
- api: undefined,
55
+ schema: undefined,
59
56
  declaration
60
57
  };
61
58
  return builder;
62
59
  }
63
- var createApi = defineApi;
64
60
 
65
- //# debugId=00202A4557ACD94664756E2164756E21
61
+ //# debugId=4B8F4F60ED902A2D64756E2164756E21