@ricsam/formula-engine 0.0.16 → 0.0.18

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 (122) hide show
  1. package/dist/cjs/core/api/api-builder.cjs +67 -0
  2. package/dist/cjs/core/api/api-builder.cjs.map +10 -0
  3. package/dist/cjs/core/api/api-helpers.cjs +191 -0
  4. package/dist/cjs/core/api/api-helpers.cjs.map +10 -0
  5. package/dist/cjs/core/api/api.cjs +65 -0
  6. package/dist/cjs/core/api/api.cjs.map +10 -0
  7. package/dist/cjs/core/api/cell-orm.cjs +80 -0
  8. package/dist/cjs/core/api/cell-orm.cjs.map +10 -0
  9. package/dist/cjs/core/api/table-orm.cjs +171 -0
  10. package/dist/cjs/core/api/table-orm.cjs.map +10 -0
  11. package/dist/cjs/core/autofill-utils.cjs +75 -39
  12. package/dist/cjs/core/autofill-utils.cjs.map +3 -3
  13. package/dist/cjs/core/cell-mover.cjs +178 -0
  14. package/dist/cjs/core/cell-mover.cjs.map +10 -0
  15. package/dist/cjs/core/commands/command-executor.cjs +140 -0
  16. package/dist/cjs/core/commands/command-executor.cjs.map +10 -0
  17. package/dist/cjs/core/commands/content-commands.cjs +574 -0
  18. package/dist/cjs/core/commands/content-commands.cjs.map +10 -0
  19. package/dist/cjs/core/commands/index.cjs +95 -0
  20. package/dist/cjs/core/commands/index.cjs.map +10 -0
  21. package/dist/cjs/core/commands/metadata-commands.cjs +150 -0
  22. package/dist/cjs/core/commands/metadata-commands.cjs.map +10 -0
  23. package/dist/cjs/core/commands/named-expression-commands.cjs +238 -0
  24. package/dist/cjs/core/commands/named-expression-commands.cjs.map +10 -0
  25. package/dist/cjs/core/commands/structure-commands.cjs +495 -0
  26. package/dist/cjs/core/commands/structure-commands.cjs.map +10 -0
  27. package/dist/cjs/core/commands/style-commands.cjs +219 -0
  28. package/dist/cjs/core/commands/style-commands.cjs.map +10 -0
  29. package/dist/cjs/core/commands/table-commands.cjs +226 -0
  30. package/dist/cjs/core/commands/table-commands.cjs.map +10 -0
  31. package/dist/cjs/core/commands/types.cjs +72 -0
  32. package/dist/cjs/core/commands/types.cjs.map +10 -0
  33. package/dist/cjs/core/engine.cjs +218 -263
  34. package/dist/cjs/core/engine.cjs.map +3 -3
  35. package/dist/cjs/core/managers/api-schema-manager.cjs +304 -0
  36. package/dist/cjs/core/managers/api-schema-manager.cjs.map +10 -0
  37. package/dist/cjs/core/managers/copy-manager.cjs +336 -82
  38. package/dist/cjs/core/managers/copy-manager.cjs.map +3 -3
  39. package/dist/cjs/core/managers/reference-manager.cjs +124 -0
  40. package/dist/cjs/core/managers/reference-manager.cjs.map +10 -0
  41. package/dist/cjs/core/managers/style-manager.cjs +115 -147
  42. package/dist/cjs/core/managers/style-manager.cjs.map +3 -3
  43. package/dist/cjs/core/managers/workbook-manager.cjs +87 -3
  44. package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
  45. package/dist/cjs/core/types.cjs.map +1 -1
  46. package/dist/cjs/lib.cjs +13 -2
  47. package/dist/cjs/lib.cjs.map +3 -3
  48. package/dist/cjs/package.json +1 -1
  49. package/dist/mjs/core/api/api-builder.mjs +37 -0
  50. package/dist/mjs/core/api/api-builder.mjs.map +10 -0
  51. package/dist/mjs/core/api/api-helpers.mjs +161 -0
  52. package/dist/mjs/core/api/api-helpers.mjs.map +10 -0
  53. package/dist/mjs/core/api/api.mjs +35 -0
  54. package/dist/mjs/core/api/api.mjs.map +10 -0
  55. package/dist/mjs/core/api/cell-orm.mjs +49 -0
  56. package/dist/mjs/core/api/cell-orm.mjs.map +10 -0
  57. package/dist/mjs/core/api/table-orm.mjs +148 -0
  58. package/dist/mjs/core/api/table-orm.mjs.map +10 -0
  59. package/dist/mjs/core/autofill-utils.mjs +75 -39
  60. package/dist/mjs/core/autofill-utils.mjs.map +3 -3
  61. package/dist/mjs/core/cell-mover.mjs +148 -0
  62. package/dist/mjs/core/cell-mover.mjs.map +10 -0
  63. package/dist/mjs/core/commands/command-executor.mjs +109 -0
  64. package/dist/mjs/core/commands/command-executor.mjs.map +10 -0
  65. package/dist/mjs/core/commands/content-commands.mjs +544 -0
  66. package/dist/mjs/core/commands/content-commands.mjs.map +10 -0
  67. package/dist/mjs/core/commands/index.mjs +87 -0
  68. package/dist/mjs/core/commands/index.mjs.map +10 -0
  69. package/dist/mjs/core/commands/metadata-commands.mjs +120 -0
  70. package/dist/mjs/core/commands/metadata-commands.mjs.map +10 -0
  71. package/dist/mjs/core/commands/named-expression-commands.mjs +208 -0
  72. package/dist/mjs/core/commands/named-expression-commands.mjs.map +10 -0
  73. package/dist/mjs/core/commands/structure-commands.mjs +465 -0
  74. package/dist/mjs/core/commands/structure-commands.mjs.map +10 -0
  75. package/dist/mjs/core/commands/style-commands.mjs +189 -0
  76. package/dist/mjs/core/commands/style-commands.mjs.map +10 -0
  77. package/dist/mjs/core/commands/table-commands.mjs +196 -0
  78. package/dist/mjs/core/commands/table-commands.mjs.map +10 -0
  79. package/dist/mjs/core/commands/types.mjs +42 -0
  80. package/dist/mjs/core/commands/types.mjs.map +10 -0
  81. package/dist/mjs/core/engine.mjs +253 -263
  82. package/dist/mjs/core/engine.mjs.map +3 -3
  83. package/dist/mjs/core/managers/api-schema-manager.mjs +274 -0
  84. package/dist/mjs/core/managers/api-schema-manager.mjs.map +10 -0
  85. package/dist/mjs/core/managers/copy-manager.mjs +338 -82
  86. package/dist/mjs/core/managers/copy-manager.mjs.map +3 -3
  87. package/dist/mjs/core/managers/reference-manager.mjs +93 -0
  88. package/dist/mjs/core/managers/reference-manager.mjs.map +10 -0
  89. package/dist/mjs/core/managers/style-manager.mjs +115 -147
  90. package/dist/mjs/core/managers/style-manager.mjs.map +3 -3
  91. package/dist/mjs/core/managers/workbook-manager.mjs +87 -3
  92. package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
  93. package/dist/mjs/core/types.mjs.map +1 -1
  94. package/dist/mjs/lib.mjs +13 -2
  95. package/dist/mjs/lib.mjs.map +3 -3
  96. package/dist/mjs/package.json +1 -1
  97. package/dist/types/core/api/api-builder.d.ts +16 -0
  98. package/dist/types/core/api/api-helpers.d.ts +37 -0
  99. package/dist/types/core/api/api.d.ts +83 -0
  100. package/dist/types/core/api/api.type-test.d.ts +1 -0
  101. package/dist/types/core/api/cell-orm.d.ts +29 -0
  102. package/dist/types/core/api/table-orm.d.ts +46 -0
  103. package/dist/types/core/autofill-utils.d.ts +6 -9
  104. package/dist/types/core/cell-mover.d.ts +63 -0
  105. package/dist/types/core/commands/command-executor.d.ts +83 -0
  106. package/dist/types/core/commands/content-commands.d.ts +142 -0
  107. package/dist/types/core/commands/index.d.ts +16 -0
  108. package/dist/types/core/commands/metadata-commands.d.ts +55 -0
  109. package/dist/types/core/commands/named-expression-commands.d.ts +115 -0
  110. package/dist/types/core/commands/structure-commands.d.ts +132 -0
  111. package/dist/types/core/commands/style-commands.d.ts +76 -0
  112. package/dist/types/core/commands/table-commands.d.ts +104 -0
  113. package/dist/types/core/commands/types.d.ts +114 -0
  114. package/dist/types/core/engine.d.ts +241 -23
  115. package/dist/types/core/managers/api-schema-manager.d.ts +121 -0
  116. package/dist/types/core/managers/copy-manager.d.ts +47 -2
  117. package/dist/types/core/managers/reference-manager.d.ts +54 -0
  118. package/dist/types/core/managers/style-manager.d.ts +6 -6
  119. package/dist/types/core/managers/workbook-manager.d.ts +39 -1
  120. package/dist/types/core/types.d.ts +52 -11
  121. package/dist/types/lib.d.ts +8 -0
  122. package/package.json +1 -1
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/api/table-orm.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * TableOrm - Object-Relational Mapping for table data\n *\n * Provides CRUD operations for table data with type-safe access.\n * Used as the `this` context for custom table API methods.\n */\n\nimport type { CellAddress, SerializedCellValue, TableDefinition } from \"../types.cjs\";\nimport type { FormulaEngine } from \"../engine.cjs\";\nimport {\n rowToObject,\n objectToRowValues,\n matchesFilter,\n getTableRowCount,\n getNextEmptyRow,\n iterateTableRows,\n type TableSchemaHeaders,\n} from \"./api-helpers.cjs\";\n\nexport class TableOrm<TItem extends Record<string, unknown>> {\n constructor(\n private engine: FormulaEngine<any, any>,\n private workbookName: string,\n private tableName: string,\n private headers: TableSchemaHeaders,\n private namespace: string\n ) {}\n\n /**\n * Get the table definition from the engine\n */\n private getTable(): TableDefinition {\n const table = this.engine._tableManager.getTable({\n workbookName: this.workbookName,\n name: this.tableName,\n });\n\n if (!table) {\n throw new Error(\n `Table \"${this.tableName}\" not found in workbook \"${this.workbookName}\"`\n );\n }\n\n return table;\n }\n\n /**\n * Find the first row matching the filter\n */\n findWhere(filter: Partial<TItem>): TItem | undefined {\n const table = this.getTable();\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n return item;\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n return undefined;\n }\n\n /**\n * Find all rows matching the filter\n */\n findAllWhere(filter: Partial<TItem>): TItem[] {\n const table = this.getTable();\n const results: TItem[] = [];\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n results.push(item);\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n return results;\n }\n\n /**\n * Append a new row to the table\n */\n append(item: TItem): TItem {\n const table = this.getTable();\n const nextRow = getNextEmptyRow(this.engine, table);\n const values = objectToRowValues(item, this.headers);\n\n // Write each cell value\n for (const [colOffset, value] of values) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + colOffset,\n rowIndex: nextRow,\n };\n\n this.engine.setCellContent(cellAddress, value);\n }\n\n return item;\n }\n\n /**\n * Update all rows matching the filter\n * Returns the number of rows updated\n */\n updateWhere(filter: Partial<TItem>, update: Partial<TItem>): number {\n const table = this.getTable();\n let updatedCount = 0;\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n // Apply updates\n const values = objectToRowValues(update as TItem, this.headers);\n\n for (const [colOffset, value] of values) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + colOffset,\n rowIndex,\n };\n\n this.engine.setCellContent(cellAddress, value);\n }\n\n updatedCount++;\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n return updatedCount;\n }\n\n /**\n * Remove all rows matching the filter\n * Returns the number of rows removed\n */\n removeWhere(filter: Partial<TItem>): number {\n const table = this.getTable();\n let removedCount = 0;\n\n // Collect rows to remove (in reverse order to avoid index shifting issues)\n const rowsToRemove: number[] = [];\n\n for (const { rowIndex, isEmpty } of iterateTableRows(this.engine, table)) {\n if (isEmpty) continue;\n\n try {\n const item = rowToObject<TItem>(\n this.engine,\n table,\n rowIndex,\n this.headers,\n (cell) => this.engine.getCellMetadata(cell)\n );\n\n if (matchesFilter(item, filter)) {\n rowsToRemove.push(rowIndex);\n }\n } catch {\n // Skip rows that fail parsing\n continue;\n }\n }\n\n // Remove rows in reverse order\n for (const rowIndex of rowsToRemove.reverse()) {\n // Clear all cells in the row\n for (const header of Object.values(this.headers)) {\n const cellAddress: CellAddress = {\n workbookName: table.workbookName,\n sheetName: table.sheetName,\n colIndex: table.start.colIndex + header.index,\n rowIndex,\n };\n\n this.engine.setCellContent(cellAddress, undefined);\n }\n\n removedCount++;\n }\n\n return removedCount;\n }\n\n /**\n * Get the count of data rows in the table\n */\n count(): number {\n const table = this.getTable();\n return getTableRowCount(this.engine, table);\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "EAD2C30DE3B432C664756E2164756E21",
9
+ "names": []
10
+ }
@@ -41,11 +41,9 @@ var import_range_utils = require("./utils/range-utils.cjs");
41
41
  class AutoFill {
42
42
  workbookManager;
43
43
  styleManager;
44
- engine;
45
- constructor(workbookManager, styleManager, engine) {
44
+ constructor(workbookManager, styleManager) {
46
45
  this.workbookManager = workbookManager;
47
46
  this.styleManager = styleManager;
48
- this.engine = engine;
49
47
  }
50
48
  toFiniteRange(range) {
51
49
  if (range.end.col.type === "infinity" || range.end.row.type === "infinity") {
@@ -94,8 +92,9 @@ class AutoFill {
94
92
  newContent.set(key, value);
95
93
  }
96
94
  });
97
- this.engine.setSheetContent(opts, newContent);
95
+ this.workbookManager.setSheetContent(opts, newContent);
98
96
  this.fillStyles(opts, finiteSeedRange, finiteFillRange, direction);
97
+ this.fillMetadata(opts, finiteSeedRange, finiteFillRange, direction);
99
98
  }
100
99
  getSeedCells(opts, seedRange) {
101
100
  const cells = [];
@@ -357,52 +356,89 @@ class AutoFill {
357
356
  rowIndex: row
358
357
  };
359
358
  for (const style of allConditionalStyles) {
360
- if (style.area.workbookName === opts.workbookName && style.area.sheetName === opts.sheetName) {
361
- const intersection = import_range_utils.intersectRanges(style.area.range, sourceCellRange);
362
- if (intersection) {
363
- const newStyle = {
364
- area: {
365
- workbookName: opts.workbookName,
366
- sheetName: opts.sheetName,
367
- range: {
368
- start: { col: targetCell.colIndex, row: targetCell.rowIndex },
369
- end: {
370
- col: { type: "number", value: targetCell.colIndex },
371
- row: { type: "number", value: targetCell.rowIndex }
359
+ for (const area of style.areas) {
360
+ if (area.workbookName === opts.workbookName && area.sheetName === opts.sheetName) {
361
+ const intersection = import_range_utils.intersectRanges(area.range, sourceCellRange);
362
+ if (intersection) {
363
+ const newStyle = {
364
+ areas: [{
365
+ workbookName: opts.workbookName,
366
+ sheetName: opts.sheetName,
367
+ range: {
368
+ start: { col: targetCell.colIndex, row: targetCell.rowIndex },
369
+ end: {
370
+ col: { type: "number", value: targetCell.colIndex },
371
+ row: { type: "number", value: targetCell.rowIndex }
372
+ }
372
373
  }
373
- }
374
- },
375
- condition: style.condition
376
- };
377
- this.styleManager.addConditionalStyle(newStyle);
374
+ }],
375
+ condition: style.condition
376
+ };
377
+ this.styleManager.addConditionalStyle(newStyle);
378
+ }
378
379
  }
379
380
  }
380
381
  }
381
382
  for (const style of allCellStyles) {
382
- if (style.area.workbookName === opts.workbookName && style.area.sheetName === opts.sheetName) {
383
- const intersection = import_range_utils.intersectRanges(style.area.range, sourceCellRange);
384
- if (intersection) {
385
- const newStyle = {
386
- area: {
387
- workbookName: opts.workbookName,
388
- sheetName: opts.sheetName,
389
- range: {
390
- start: { col: targetCell.colIndex, row: targetCell.rowIndex },
391
- end: {
392
- col: { type: "number", value: targetCell.colIndex },
393
- row: { type: "number", value: targetCell.rowIndex }
383
+ for (const area of style.areas) {
384
+ if (area.workbookName === opts.workbookName && area.sheetName === opts.sheetName) {
385
+ const intersection = import_range_utils.intersectRanges(area.range, sourceCellRange);
386
+ if (intersection) {
387
+ const newStyle = {
388
+ areas: [{
389
+ workbookName: opts.workbookName,
390
+ sheetName: opts.sheetName,
391
+ range: {
392
+ start: { col: targetCell.colIndex, row: targetCell.rowIndex },
393
+ end: {
394
+ col: { type: "number", value: targetCell.colIndex },
395
+ row: { type: "number", value: targetCell.rowIndex }
396
+ }
394
397
  }
395
- }
396
- },
397
- style: style.style
398
- };
399
- this.styleManager.addCellStyle(newStyle);
398
+ }],
399
+ style: style.style
400
+ };
401
+ this.styleManager.addCellStyle(newStyle);
402
+ }
400
403
  }
401
404
  }
402
405
  }
403
406
  }
404
407
  }
405
408
  }
409
+ fillMetadata(opts, seedRange, fillRange, direction) {
410
+ const seedWidth = seedRange.end.col - seedRange.start.col + 1;
411
+ const seedHeight = seedRange.end.row - seedRange.start.row + 1;
412
+ for (let row = fillRange.start.row;row <= fillRange.end.row; row++) {
413
+ for (let col = fillRange.start.col;col <= fillRange.end.col; col++) {
414
+ let seedCol;
415
+ let seedRow;
416
+ if (direction === "down" || direction === "up") {
417
+ seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;
418
+ seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;
419
+ } else {
420
+ seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;
421
+ seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;
422
+ }
423
+ const sourceCellAddress = {
424
+ workbookName: opts.workbookName,
425
+ sheetName: opts.sheetName,
426
+ colIndex: seedCol,
427
+ rowIndex: seedRow
428
+ };
429
+ const targetCellAddress = {
430
+ workbookName: opts.workbookName,
431
+ sheetName: opts.sheetName,
432
+ colIndex: col,
433
+ rowIndex: row
434
+ };
435
+ const sourceMetadata = this.workbookManager.getCellMetadata(sourceCellAddress);
436
+ if (sourceMetadata) {
437
+ this.workbookManager.setCellMetadata(targetCellAddress, { ...sourceMetadata });
438
+ }
439
+ }
440
+ }
441
+ }
406
442
  }
407
443
 
408
- //# debugId=9773118646A3BA2864756E2164756E21
444
+ //# debugId=8B76BB94945F34CB64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/autofill-utils.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * AutoFill class for handling spreadsheet autofill functionality\n */\n\nimport type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRange,\n FiniteSpreadsheetRange,\n LocalCellAddress,\n ConditionalStyle,\n DirectCellStyle,\n RangeAddress,\n} from \"./types.cjs\";\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { parseFormula } from \"../parser/parser.cjs\";\nimport { astToString } from \"../parser/formatter.cjs\";\nimport { transformAST } from \"./ast-traverser.cjs\";\nimport type { ReferenceNode, RangeNode } from \"../parser/ast.cjs\";\nimport { getCellReference } from \"./utils.cjs\";\nimport type { WorkbookManager } from \"./managers/workbook-manager.cjs\";\nimport type { StyleManager } from \"./managers/style-manager.cjs\";\nimport { intersectRanges } from \"./utils/range-utils.cjs\";\n\nexport class AutoFill {\n constructor(\n private workbookManager: WorkbookManager,\n private styleManager: StyleManager,\n private engine: {\n setCellContent: (\n address: CellAddress,\n content: SerializedCellValue\n ) => void;\n setSheetContent: (\n opts: { sheetName: string; workbookName: string },\n content: Map<string, SerializedCellValue>\n ) => void;\n }\n ) {}\n\n /**\n * Converts a SpreadsheetRange to FiniteSpreadsheetRange, throwing an error if infinite\n */\n private toFiniteRange(range: SpreadsheetRange): FiniteSpreadsheetRange {\n if (\n range.end.col.type === \"infinity\" ||\n range.end.row.type === \"infinity\"\n ) {\n throw new Error(\"AutoFill with infinite ranges is not supported\");\n }\n\n return {\n start: range.start,\n end: {\n col: range.end.col.value,\n row: range.end.row.value,\n },\n };\n }\n\n private getCellContent(address: CellAddress): SerializedCellValue {\n const sheet = this.workbookManager.getSheet(address);\n if (!sheet) {\n throw new Error(\"Sheet not found\");\n }\n return sheet.content.get(getCellReference(address));\n }\n\n fill(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRanges: SpreadsheetRange[],\n direction: FillDirection\n ) {\n // Process each fill range\n for (const fillRange of fillRanges) {\n this.fillSingleRange(opts, seedRange, fillRange, direction);\n }\n }\n\n /**\n * Fill a single range with seed data and styles\n */\n private fillSingleRange(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRange: SpreadsheetRange,\n direction: FillDirection\n ) {\n // Convert to finite ranges (throws error if infinite)\n const finiteSeedRange = this.toFiniteRange(seedRange);\n const finiteFillRange = this.toFiniteRange(fillRange);\n\n // Get seed cells data\n const seedCells = this.getSeedCells(opts, finiteSeedRange);\n\n // Collect all changes to apply in a single batch\n const changes = new Map<string, SerializedCellValue>();\n\n // Determine if we have a single cell or multi-cell seed\n const isSingleCell = seedCells.length === 1;\n\n if (isSingleCell) {\n const seedCell = seedCells[0];\n if (seedCell) {\n this.collectSingleCellPattern(\n seedCell,\n finiteFillRange,\n direction,\n changes\n );\n }\n } else {\n this.collectMultiCellPattern(\n seedCells,\n finiteSeedRange,\n finiteFillRange,\n direction,\n changes\n );\n }\n\n // Get current sheet content and merge with changes\n const currentContent = this.workbookManager.getSheetSerialized(opts);\n const newContent = new Map(currentContent);\n\n // Apply all changes\n changes.forEach((value, key) => {\n if (value === undefined) {\n newContent.delete(key);\n } else {\n newContent.set(key, value);\n }\n });\n\n // Update sheet content in a single operation\n this.engine.setSheetContent(opts, newContent);\n\n // Copy styles from seed to fill range\n this.fillStyles(opts, finiteSeedRange, finiteFillRange, direction);\n }\n\n private getSeedCells(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange\n ) {\n const cells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }> = [];\n\n const startCol = seedRange.start.col;\n const startRow = seedRange.start.row;\n const endCol = seedRange.end.col;\n const endRow = seedRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const address: CellAddress = {\n sheetName: opts.sheetName,\n workbookName: opts.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n const content = this.getCellContent(address);\n cells.push({\n address,\n content,\n rowOffset: row - startRow,\n colOffset: col - startCol,\n });\n }\n }\n\n return cells;\n }\n\n private collectSingleCellPattern(\n seedCell: { address: CellAddress; content: SerializedCellValue },\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n const { content } = seedCell;\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: CellAddress = {\n sheetName: seedCell.address.sheetName,\n workbookName: seedCell.address.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (content === undefined || content === \"\") {\n // Blank cell - fills blanks (effectively clears targets)\n newContent = undefined;\n } else if (typeof content === \"string\" && content.startsWith(\"=\")) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n content,\n seedCell.address,\n targetAddress\n );\n } else {\n // Number or text - copy by default\n newContent = content;\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private collectMultiCellPattern(\n seedCells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n // Try to infer linear step from numbers\n const step = this.inferLinearStep(seedCells, direction);\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: LocalCellAddress = {\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (step !== null) {\n // Use linear progression\n newContent = this.applyLinearStep(\n seedCells,\n targetAddress,\n seedRange,\n step,\n direction\n );\n } else {\n // Repeat pattern (cycle through seed block)\n const seedColOffset = (col - startCol) % seedWidth;\n const seedRowOffset = (row - startRow) % seedHeight;\n\n const seedCell = seedCells.find(\n (cell) =>\n cell.colOffset === seedColOffset &&\n cell.rowOffset === seedRowOffset\n );\n\n if (seedCell) {\n if (\n typeof seedCell.content === \"string\" &&\n seedCell.content.startsWith(\"=\")\n ) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n seedCell.content,\n seedCell.address,\n targetAddress\n );\n } else {\n newContent = seedCell.content;\n }\n } else {\n newContent = undefined;\n }\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private inferLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n direction: FillDirection\n ): number | null {\n // Extract numeric values in the direction of fill\n const values: number[] = [];\n\n if (direction === \"down\" || direction === \"up\") {\n // Look at first column, different rows\n const firstColCells = seedCells\n .filter((cell) => cell.colOffset === 0)\n .sort((a, b) => a.rowOffset - b.rowOffset);\n\n for (const cell of firstColCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n } else {\n // Look at first row, different columns\n const firstRowCells = seedCells\n .filter((cell) => cell.rowOffset === 0)\n .sort((a, b) => a.colOffset - b.colOffset);\n\n for (const cell of firstRowCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n }\n\n if (values.length < 2) {\n return null;\n }\n\n // Check if there's a consistent step\n const step = values[1]! - values[0]!;\n for (let i = 2; i < values.length; i++) {\n if (Math.abs(values[i]! - values[i - 1]! - step) > 1e-10) {\n return null; // Inconsistent step\n }\n }\n\n return step;\n }\n\n private applyLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n targetAddress: LocalCellAddress,\n seedRange: FiniteSpreadsheetRange,\n step: number,\n direction: FillDirection\n ): SerializedCellValue {\n // Calculate the position in the overall sequence\n let positionInSequence: number;\n let baseValue: number;\n\n if (direction === \"down\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"up\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed (same as down direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"right\") {\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else {\n // left\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed (same as right direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n }\n\n if (isNaN(baseValue)) {\n return undefined;\n }\n\n const result = baseValue + step * positionInSequence;\n return typeof seedCells[0]?.content === \"string\"\n ? result.toString()\n : result;\n }\n\n private adjustFormulaReferences(\n formula: string,\n sourceAddress: LocalCellAddress,\n targetAddress: LocalCellAddress\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const rowDelta = targetAddress.rowIndex - sourceAddress.rowIndex;\n const colDelta = targetAddress.colIndex - sourceAddress.colIndex;\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula references:\", error);\n return formula;\n }\n }\n\n /**\n * Fill styles from seed range to fill range based on direction\n * Clears existing cell styles in fill range first (Excel behavior)\n */\n private fillStyles(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n // STEP 1: Clear existing cell styles in fill range (Excel-like replacement)\n const fillRangeAddress: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: fillRange.start.col, row: fillRange.start.row },\n end: {\n col: { type: \"number\", value: fillRange.end.col },\n row: { type: \"number\", value: fillRange.end.row },\n },\n },\n };\n \n this.styleManager.clearCellStylesInRange(fillRangeAddress);\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // STEP 2: Get all styles intersecting with seed range\n const seedSpreadsheetRange: SpreadsheetRange = {\n start: { col: seedRange.start.col, row: seedRange.start.row },\n end: {\n col: { type: \"number\", value: seedRange.end.col },\n row: { type: \"number\", value: seedRange.end.row },\n },\n };\n\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n // STEP 3: For each cell in fill range, determine corresponding seed cell and copy styles\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: seedCol, row: seedRow },\n end: {\n col: { type: \"number\", value: seedCol },\n row: { type: \"number\", value: seedRow },\n },\n };\n\n const targetCell: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy conditional styles\n for (const style of allConditionalStyles) {\n if (\n style.area.workbookName === opts.workbookName &&\n style.area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(style.area.range, sourceCellRange);\n if (intersection) {\n const newStyle: ConditionalStyle = {\n area: {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n\n // Copy cell styles\n for (const style of allCellStyles) {\n if (\n style.area.workbookName === opts.workbookName &&\n style.area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(style.area.range, sourceCellRange);\n if (intersection) {\n const newStyle: DirectCellStyle = {\n area: {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n },\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n }\n}\n"
5
+ "/**\n * AutoFill class for handling spreadsheet autofill functionality\n */\n\nimport type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRange,\n FiniteSpreadsheetRange,\n LocalCellAddress,\n ConditionalStyle,\n DirectCellStyle,\n RangeAddress,\n} from \"./types.cjs\";\nimport type { FillDirection } from \"@ricsam/selection-manager\";\nimport { parseFormula } from \"../parser/parser.cjs\";\nimport { astToString } from \"../parser/formatter.cjs\";\nimport { transformAST } from \"./ast-traverser.cjs\";\nimport type { ReferenceNode, RangeNode } from \"../parser/ast.cjs\";\nimport { getCellReference } from \"./utils.cjs\";\nimport type { WorkbookManager } from \"./managers/workbook-manager.cjs\";\nimport type { StyleManager } from \"./managers/style-manager.cjs\";\nimport { intersectRanges } from \"./utils/range-utils.cjs\";\n\nexport class AutoFill {\n constructor(\n private workbookManager: WorkbookManager,\n private styleManager: StyleManager\n ) {}\n\n /**\n * Converts a SpreadsheetRange to FiniteSpreadsheetRange, throwing an error if infinite\n */\n private toFiniteRange(range: SpreadsheetRange): FiniteSpreadsheetRange {\n if (\n range.end.col.type === \"infinity\" ||\n range.end.row.type === \"infinity\"\n ) {\n throw new Error(\"AutoFill with infinite ranges is not supported\");\n }\n\n return {\n start: range.start,\n end: {\n col: range.end.col.value,\n row: range.end.row.value,\n },\n };\n }\n\n private getCellContent(address: CellAddress): SerializedCellValue {\n const sheet = this.workbookManager.getSheet(address);\n if (!sheet) {\n throw new Error(\"Sheet not found\");\n }\n return sheet.content.get(getCellReference(address));\n }\n\n fill(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRanges: SpreadsheetRange[],\n direction: FillDirection\n ) {\n // Process each fill range\n for (const fillRange of fillRanges) {\n this.fillSingleRange(opts, seedRange, fillRange, direction);\n }\n }\n\n /**\n * Fill a single range with seed data and styles\n */\n private fillSingleRange(\n opts: { sheetName: string; workbookName: string },\n seedRange: SpreadsheetRange,\n fillRange: SpreadsheetRange,\n direction: FillDirection\n ) {\n // Convert to finite ranges (throws error if infinite)\n const finiteSeedRange = this.toFiniteRange(seedRange);\n const finiteFillRange = this.toFiniteRange(fillRange);\n\n // Get seed cells data\n const seedCells = this.getSeedCells(opts, finiteSeedRange);\n\n // Collect all changes to apply in a single batch\n const changes = new Map<string, SerializedCellValue>();\n\n // Determine if we have a single cell or multi-cell seed\n const isSingleCell = seedCells.length === 1;\n\n if (isSingleCell) {\n const seedCell = seedCells[0];\n if (seedCell) {\n this.collectSingleCellPattern(\n seedCell,\n finiteFillRange,\n direction,\n changes\n );\n }\n } else {\n this.collectMultiCellPattern(\n seedCells,\n finiteSeedRange,\n finiteFillRange,\n direction,\n changes\n );\n }\n\n // Get current sheet content and merge with changes\n const currentContent = this.workbookManager.getSheetSerialized(opts);\n const newContent = new Map(currentContent);\n\n // Apply all changes\n changes.forEach((value, key) => {\n if (value === undefined) {\n newContent.delete(key);\n } else {\n newContent.set(key, value);\n }\n });\n\n // Update sheet content in a single operation (direct manager call, not through engine)\n this.workbookManager.setSheetContent(opts, newContent);\n\n // Copy styles from seed to fill range\n this.fillStyles(opts, finiteSeedRange, finiteFillRange, direction);\n\n // Copy metadata from seed to fill range\n this.fillMetadata(opts, finiteSeedRange, finiteFillRange, direction);\n }\n\n private getSeedCells(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange\n ) {\n const cells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }> = [];\n\n const startCol = seedRange.start.col;\n const startRow = seedRange.start.row;\n const endCol = seedRange.end.col;\n const endRow = seedRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const address: CellAddress = {\n sheetName: opts.sheetName,\n workbookName: opts.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n const content = this.getCellContent(address);\n cells.push({\n address,\n content,\n rowOffset: row - startRow,\n colOffset: col - startCol,\n });\n }\n }\n\n return cells;\n }\n\n private collectSingleCellPattern(\n seedCell: { address: CellAddress; content: SerializedCellValue },\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n const { content } = seedCell;\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: CellAddress = {\n sheetName: seedCell.address.sheetName,\n workbookName: seedCell.address.workbookName,\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (content === undefined || content === \"\") {\n // Blank cell - fills blanks (effectively clears targets)\n newContent = undefined;\n } else if (typeof content === \"string\" && content.startsWith(\"=\")) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n content,\n seedCell.address,\n targetAddress\n );\n } else {\n // Number or text - copy by default\n newContent = content;\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private collectMultiCellPattern(\n seedCells: Array<{\n address: CellAddress;\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection,\n changes: Map<string, SerializedCellValue>\n ) {\n // Try to infer linear step from numbers\n const step = this.inferLinearStep(seedCells, direction);\n\n const startCol = fillRange.start.col;\n const startRow = fillRange.start.row;\n const endCol = fillRange.end.col;\n const endRow = fillRange.end.row;\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const targetAddress: LocalCellAddress = {\n colIndex: col,\n rowIndex: row,\n };\n\n let newContent: SerializedCellValue;\n\n if (step !== null) {\n // Use linear progression\n newContent = this.applyLinearStep(\n seedCells,\n targetAddress,\n seedRange,\n step,\n direction\n );\n } else {\n // Repeat pattern (cycle through seed block)\n const seedColOffset = (col - startCol) % seedWidth;\n const seedRowOffset = (row - startRow) % seedHeight;\n\n const seedCell = seedCells.find(\n (cell) =>\n cell.colOffset === seedColOffset &&\n cell.rowOffset === seedRowOffset\n );\n\n if (seedCell) {\n if (\n typeof seedCell.content === \"string\" &&\n seedCell.content.startsWith(\"=\")\n ) {\n // Formula - adjust relative references\n newContent = this.adjustFormulaReferences(\n seedCell.content,\n seedCell.address,\n targetAddress\n );\n } else {\n newContent = seedCell.content;\n }\n } else {\n newContent = undefined;\n }\n }\n\n changes.set(getCellReference(targetAddress), newContent);\n }\n }\n }\n\n private inferLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n direction: FillDirection\n ): number | null {\n // Extract numeric values in the direction of fill\n const values: number[] = [];\n\n if (direction === \"down\" || direction === \"up\") {\n // Look at first column, different rows\n const firstColCells = seedCells\n .filter((cell) => cell.colOffset === 0)\n .sort((a, b) => a.rowOffset - b.rowOffset);\n\n for (const cell of firstColCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n } else {\n // Look at first row, different columns\n const firstRowCells = seedCells\n .filter((cell) => cell.rowOffset === 0)\n .sort((a, b) => a.colOffset - b.colOffset);\n\n for (const cell of firstRowCells) {\n if (typeof cell.content === \"number\") {\n values.push(cell.content);\n } else if (typeof cell.content === \"string\") {\n const num = parseFloat(cell.content);\n if (!isNaN(num)) {\n values.push(num);\n } else {\n return null; // Non-numeric content, can't infer step\n }\n } else {\n return null;\n }\n }\n }\n\n if (values.length < 2) {\n return null;\n }\n\n // Check if there's a consistent step\n const step = values[1]! - values[0]!;\n for (let i = 2; i < values.length; i++) {\n if (Math.abs(values[i]! - values[i - 1]! - step) > 1e-10) {\n return null; // Inconsistent step\n }\n }\n\n return step;\n }\n\n private applyLinearStep(\n seedCells: Array<{\n content: SerializedCellValue;\n rowOffset: number;\n colOffset: number;\n }>,\n targetAddress: LocalCellAddress,\n seedRange: FiniteSpreadsheetRange,\n step: number,\n direction: FillDirection\n ): SerializedCellValue {\n // Calculate the position in the overall sequence\n let positionInSequence: number;\n let baseValue: number;\n\n if (direction === \"down\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"up\") {\n positionInSequence = targetAddress.rowIndex - seedRange.start.row;\n\n // Find the base value from the first row of the seed (same as down direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.colOffset === targetAddress.colIndex - seedRange.start.col &&\n cell.rowOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else if (direction === \"right\") {\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n } else {\n // left\n positionInSequence = targetAddress.colIndex - seedRange.start.col;\n\n // Find the base value from the first column of the seed (same as right direction)\n const baseCell = seedCells.find(\n (cell) =>\n cell.rowOffset === targetAddress.rowIndex - seedRange.start.row &&\n cell.colOffset === 0\n );\n\n if (!baseCell) return undefined;\n baseValue =\n typeof baseCell.content === \"number\"\n ? baseCell.content\n : parseFloat(String(baseCell.content || \"0\"));\n }\n\n if (isNaN(baseValue)) {\n return undefined;\n }\n\n const result = baseValue + step * positionInSequence;\n return typeof seedCells[0]?.content === \"string\"\n ? result.toString()\n : result;\n }\n\n private adjustFormulaReferences(\n formula: string,\n sourceAddress: LocalCellAddress,\n targetAddress: LocalCellAddress\n ): string {\n try {\n const ast = parseFormula(formula.slice(1)); // Remove the \"=\" sign\n\n const rowDelta = targetAddress.rowIndex - sourceAddress.rowIndex;\n const colDelta = targetAddress.colIndex - sourceAddress.colIndex;\n\n const adjustedAst = transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n return {\n ...refNode,\n address: {\n colIndex: refNode.isAbsolute.col\n ? refNode.address.colIndex\n : refNode.address.colIndex + colDelta,\n rowIndex: refNode.isAbsolute.row\n ? refNode.address.rowIndex\n : refNode.address.rowIndex + rowDelta,\n },\n };\n } else if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n return {\n ...rangeNode,\n range: {\n start: {\n col: rangeNode.isAbsolute.start.col\n ? rangeNode.range.start.col\n : rangeNode.range.start.col + colDelta,\n row: rangeNode.isAbsolute.start.row\n ? rangeNode.range.start.row\n : rangeNode.range.start.row + rowDelta,\n },\n end: {\n col:\n rangeNode.range.end.col.type === \"number\"\n ? rangeNode.isAbsolute.end.col\n ? rangeNode.range.end.col\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.col.value + colDelta,\n }\n : rangeNode.range.end.col,\n row:\n rangeNode.range.end.row.type === \"number\"\n ? rangeNode.isAbsolute.end.row\n ? rangeNode.range.end.row\n : {\n type: \"number\" as const,\n value: rangeNode.range.end.row.value + rowDelta,\n }\n : rangeNode.range.end.row,\n },\n },\n };\n }\n return node;\n });\n\n return `=${astToString(adjustedAst)}`;\n } catch (error) {\n // If parsing fails, return the original formula\n console.warn(\"Failed to adjust formula references:\", error);\n return formula;\n }\n }\n\n /**\n * Fill styles from seed range to fill range based on direction\n * Clears existing cell styles in fill range first (Excel behavior)\n */\n private fillStyles(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n // STEP 1: Clear existing cell styles in fill range (Excel-like replacement)\n const fillRangeAddress: RangeAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: fillRange.start.col, row: fillRange.start.row },\n end: {\n col: { type: \"number\", value: fillRange.end.col },\n row: { type: \"number\", value: fillRange.end.row },\n },\n },\n };\n \n this.styleManager.clearCellStylesInRange(fillRangeAddress);\n\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // STEP 2: Get all styles intersecting with seed range\n const seedSpreadsheetRange: SpreadsheetRange = {\n start: { col: seedRange.start.col, row: seedRange.start.row },\n end: {\n col: { type: \"number\", value: seedRange.end.col },\n row: { type: \"number\", value: seedRange.end.row },\n },\n };\n\n const allConditionalStyles = this.styleManager.getAllConditionalStyles();\n const allCellStyles = this.styleManager.getAllCellStyles();\n\n // STEP 3: For each cell in fill range, determine corresponding seed cell and copy styles\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellRange: SpreadsheetRange = {\n start: { col: seedCol, row: seedRow },\n end: {\n col: { type: \"number\", value: seedCol },\n row: { type: \"number\", value: seedRow },\n },\n };\n\n const targetCell: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy conditional styles\n for (const style of allConditionalStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: ConditionalStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n condition: style.condition,\n };\n this.styleManager.addConditionalStyle(newStyle);\n }\n }\n }\n }\n\n // Copy cell styles\n for (const style of allCellStyles) {\n for (const area of style.areas) {\n if (\n area.workbookName === opts.workbookName &&\n area.sheetName === opts.sheetName\n ) {\n const intersection = intersectRanges(area.range, sourceCellRange);\n if (intersection) {\n const newStyle: DirectCellStyle = {\n areas: [{\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n range: {\n start: { col: targetCell.colIndex, row: targetCell.rowIndex },\n end: {\n col: { type: \"number\", value: targetCell.colIndex },\n row: { type: \"number\", value: targetCell.rowIndex },\n },\n },\n }],\n style: style.style,\n };\n this.styleManager.addCellStyle(newStyle);\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Copy metadata from seed range to fill range with pattern repetition\n */\n private fillMetadata(\n opts: { sheetName: string; workbookName: string },\n seedRange: FiniteSpreadsheetRange,\n fillRange: FiniteSpreadsheetRange,\n direction: FillDirection\n ): void {\n const seedWidth = seedRange.end.col - seedRange.start.col + 1;\n const seedHeight = seedRange.end.row - seedRange.start.row + 1;\n\n // For each cell in fill range, copy metadata from corresponding seed cell\n for (let row = fillRange.start.row; row <= fillRange.end.row; row++) {\n for (let col = fillRange.start.col; col <= fillRange.end.col; col++) {\n // Determine which seed cell corresponds to this fill cell\n let seedCol: number;\n let seedRow: number;\n\n if (direction === \"down\" || direction === \"up\") {\n // Vertical fill: keep column aligned, pattern repeat on rows\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n } else {\n // Horizontal fill: keep row aligned, pattern repeat on columns\n seedRow = seedRange.start.row + (row - fillRange.start.row) % seedHeight;\n seedCol = seedRange.start.col + (col - fillRange.start.col) % seedWidth;\n }\n\n const sourceCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: seedCol,\n rowIndex: seedRow,\n };\n\n const targetCellAddress: CellAddress = {\n workbookName: opts.workbookName,\n sheetName: opts.sheetName,\n colIndex: col,\n rowIndex: row,\n };\n\n // Copy metadata from source to target\n const sourceMetadata = this.workbookManager.getCellMetadata(sourceCellAddress);\n if (sourceMetadata) {\n this.workbookManager.setCellMetadata(targetCellAddress, { ...sourceMetadata });\n }\n }\n }\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "9773118646A3BA2864756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "8B76BB94945F34CB64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,178 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
6
+ var __toCommonJS = (from) => {
7
+ var entry = __moduleCache.get(from), desc;
8
+ if (entry)
9
+ return entry;
10
+ entry = __defProp({}, "__esModule", { value: true });
11
+ if (from && typeof from === "object" || typeof from === "function")
12
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ }));
16
+ __moduleCache.set(from, entry);
17
+ return entry;
18
+ };
19
+ var __export = (target, all) => {
20
+ for (var name in all)
21
+ __defProp(target, name, {
22
+ get: all[name],
23
+ enumerable: true,
24
+ configurable: true,
25
+ set: (newValue) => all[name] = () => newValue
26
+ });
27
+ };
28
+
29
+ // src/core/cell-mover.ts
30
+ var exports_cell_mover = {};
31
+ __export(exports_cell_mover, {
32
+ updateReferencesForMovedCells: () => updateReferencesForMovedCells,
33
+ formulaReferencesRange: () => formulaReferencesRange,
34
+ formulaReferencesCell: () => formulaReferencesCell
35
+ });
36
+ module.exports = __toCommonJS(exports_cell_mover);
37
+ var import_parser = require("../parser/parser.cjs");
38
+ var import_formatter = require("../parser/formatter.cjs");
39
+ var import_ast_traverser = require("./ast-traverser.cjs");
40
+ function createCellKey(workbookName, sheetName, colIndex, rowIndex) {
41
+ return `${workbookName}:${sheetName}:${colIndex}:${rowIndex}`;
42
+ }
43
+ function isCellMoved(movedCells, workbookName, sheetName, colIndex, rowIndex) {
44
+ const refWorkbook = workbookName ?? movedCells.workbookName;
45
+ const refSheet = sheetName ?? movedCells.sheetName;
46
+ if (refWorkbook !== movedCells.workbookName || refSheet !== movedCells.sheetName) {
47
+ return false;
48
+ }
49
+ const key = createCellKey(refWorkbook, refSheet, colIndex, rowIndex);
50
+ return movedCells.cellsSet.has(key);
51
+ }
52
+ function updateReferencesForMovedCells(formula, movedCells) {
53
+ try {
54
+ const ast = import_parser.parseFormula(formula);
55
+ const transformedAST = import_ast_traverser.transformAST(ast, (node) => {
56
+ if (node.type === "reference") {
57
+ const refNode = node;
58
+ if (isCellMoved(movedCells, refNode.workbookName, refNode.sheetName, refNode.address.colIndex, refNode.address.rowIndex)) {
59
+ return {
60
+ ...refNode,
61
+ address: {
62
+ colIndex: refNode.address.colIndex + movedCells.colOffset,
63
+ rowIndex: refNode.address.rowIndex + movedCells.rowOffset
64
+ }
65
+ };
66
+ }
67
+ }
68
+ if (node.type === "range") {
69
+ const rangeNode = node;
70
+ if (rangeNode.range.end.col.type === "number" && rangeNode.range.end.row.type === "number") {
71
+ const startCol = rangeNode.range.start.col;
72
+ const startRow = rangeNode.range.start.row;
73
+ const endCol = rangeNode.range.end.col.value;
74
+ const endRow = rangeNode.range.end.row.value;
75
+ const startMoved = isCellMoved(movedCells, rangeNode.workbookName, rangeNode.sheetName, startCol, startRow);
76
+ const endMoved = isCellMoved(movedCells, rangeNode.workbookName, rangeNode.sheetName, endCol, endRow);
77
+ if (startMoved && endMoved) {
78
+ const rangeWidth = endCol - startCol;
79
+ const rangeHeight = endRow - startRow;
80
+ let allCellsMoved = true;
81
+ const cellsToCheck = [
82
+ [startCol, startRow],
83
+ [endCol, endRow]
84
+ ];
85
+ if (rangeWidth > 1 || rangeHeight > 1) {
86
+ const midCol = Math.floor((startCol + endCol) / 2);
87
+ const midRow = Math.floor((startRow + endRow) / 2);
88
+ cellsToCheck.push([midCol, midRow]);
89
+ if (rangeWidth > 1) {
90
+ cellsToCheck.push([midCol, startRow]);
91
+ cellsToCheck.push([midCol, endRow]);
92
+ }
93
+ if (rangeHeight > 1) {
94
+ cellsToCheck.push([startCol, midRow]);
95
+ cellsToCheck.push([endCol, midRow]);
96
+ }
97
+ }
98
+ for (const [col, row] of cellsToCheck) {
99
+ if (!isCellMoved(movedCells, rangeNode.workbookName, rangeNode.sheetName, col, row)) {
100
+ allCellsMoved = false;
101
+ break;
102
+ }
103
+ }
104
+ if (allCellsMoved) {
105
+ return {
106
+ ...rangeNode,
107
+ range: {
108
+ start: {
109
+ col: startCol + movedCells.colOffset,
110
+ row: startRow + movedCells.rowOffset
111
+ },
112
+ end: {
113
+ col: { type: "number", value: endCol + movedCells.colOffset },
114
+ row: { type: "number", value: endRow + movedCells.rowOffset }
115
+ }
116
+ }
117
+ };
118
+ }
119
+ }
120
+ }
121
+ }
122
+ return node;
123
+ });
124
+ return import_formatter.astToString(transformedAST);
125
+ } catch (error) {
126
+ return formula;
127
+ }
128
+ }
129
+ function formulaReferencesCell(formula, workbookName, sheetName, colIndex, rowIndex) {
130
+ try {
131
+ const ast = import_parser.parseFormula(formula);
132
+ let hasReference = false;
133
+ import_ast_traverser.transformAST(ast, (node) => {
134
+ if (node.type === "reference") {
135
+ const refNode = node;
136
+ if (refNode.address.colIndex === colIndex && refNode.address.rowIndex === rowIndex) {
137
+ if (refNode.workbookName && refNode.workbookName !== workbookName) {
138
+ return node;
139
+ }
140
+ if (refNode.sheetName && refNode.sheetName !== sheetName) {
141
+ return node;
142
+ }
143
+ hasReference = true;
144
+ }
145
+ }
146
+ return node;
147
+ });
148
+ return hasReference;
149
+ } catch (error) {
150
+ return false;
151
+ }
152
+ }
153
+ function formulaReferencesRange(formula, workbookName, sheetName, startCol, startRow, endCol, endRow) {
154
+ try {
155
+ const ast = import_parser.parseFormula(formula);
156
+ let hasReference = false;
157
+ import_ast_traverser.transformAST(ast, (node) => {
158
+ if (node.type === "range") {
159
+ const rangeNode = node;
160
+ if (rangeNode.range.end.col.type === "number" && rangeNode.range.end.row.type === "number" && rangeNode.range.start.col === startCol && rangeNode.range.start.row === startRow && rangeNode.range.end.col.value === endCol && rangeNode.range.end.row.value === endRow) {
161
+ if (rangeNode.workbookName && rangeNode.workbookName !== workbookName) {
162
+ return node;
163
+ }
164
+ if (rangeNode.sheetName && rangeNode.sheetName !== sheetName) {
165
+ return node;
166
+ }
167
+ hasReference = true;
168
+ }
169
+ }
170
+ return node;
171
+ });
172
+ return hasReference;
173
+ } catch (error) {
174
+ return false;
175
+ }
176
+ }
177
+
178
+ //# debugId=1FE84CE47168974864756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/cell-mover.ts"],
4
+ "sourcesContent": [
5
+ "import { parseFormula } from \"../parser/parser.cjs\";\nimport { astToString } from \"../parser/formatter.cjs\";\nimport { transformAST } from \"./ast-traverser.cjs\";\nimport type { ReferenceNode, RangeNode } from \"../parser/ast.cjs\";\n\n/**\n * Information about cells being moved\n */\nexport interface MovedCellsInfo {\n /**\n * Set of cell keys in format \"workbookName:sheetName:colIndex:rowIndex\"\n * for fast O(1) lookup\n */\n cellsSet: Set<string>;\n \n /**\n * Workbook name of the source cells (all moved cells must be in same workbook/sheet)\n */\n workbookName: string;\n \n /**\n * Sheet name of the source cells\n */\n sheetName: string;\n \n /**\n * Row offset for the move (targetRow - sourceRow)\n */\n rowOffset: number;\n \n /**\n * Column offset for the move (targetCol - sourceCol)\n */\n colOffset: number;\n}\n\n/**\n * Creates a cell key for fast lookup\n */\nfunction createCellKey(workbookName: string, sheetName: string, colIndex: number, rowIndex: number): string {\n return `${workbookName}:${sheetName}:${colIndex}:${rowIndex}`;\n}\n\n/**\n * Checks if a cell is in the moved cells set\n */\nfunction isCellMoved(\n movedCells: MovedCellsInfo,\n workbookName: string | undefined,\n sheetName: string | undefined,\n colIndex: number,\n rowIndex: number\n): boolean {\n // If no workbook/sheet specified in reference, it refers to current context\n // We only update if it matches the moved cells' workbook/sheet\n const refWorkbook = workbookName ?? movedCells.workbookName;\n const refSheet = sheetName ?? movedCells.sheetName;\n \n // Only update references in the same workbook/sheet as the moved cells\n if (refWorkbook !== movedCells.workbookName || refSheet !== movedCells.sheetName) {\n return false;\n }\n \n const key = createCellKey(refWorkbook, refSheet, colIndex, rowIndex);\n return movedCells.cellsSet.has(key);\n}\n\n/**\n * Updates cell and range references in a formula when cells are moved\n * \n * @param formula - The formula string (without the leading =)\n * @param movedCells - Information about which cells were moved\n * @returns The updated formula string, or the original if no changes were made\n * \n * @example\n * // Moving A1 to D5 (offset: col+3, row+4)\n * updateReferencesForMovedCells(\"A1+B1\", {...}) // \"D5+B1\" (only A1 updated)\n * updateReferencesForMovedCells(\"SUM(A1:D5)\", {...}) // \"SUM(E4:H9)\" (if entire range moved)\n */\nexport function updateReferencesForMovedCells(\n formula: string,\n movedCells: MovedCellsInfo\n): string {\n try {\n const ast = parseFormula(formula);\n \n const transformedAST = transformAST(ast, (node) => {\n // Handle cell references\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n \n // Check if this cell reference points to a moved cell\n if (isCellMoved(\n movedCells,\n refNode.workbookName,\n refNode.sheetName,\n refNode.address.colIndex,\n refNode.address.rowIndex\n )) {\n // Update the reference to the new location\n return {\n ...refNode,\n address: {\n colIndex: refNode.address.colIndex + movedCells.colOffset,\n rowIndex: refNode.address.rowIndex + movedCells.rowOffset,\n },\n };\n }\n }\n \n // Handle range references\n if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n \n // Only update if the range has finite bounds\n if (\n rangeNode.range.end.col.type === \"number\" &&\n rangeNode.range.end.row.type === \"number\"\n ) {\n const startCol = rangeNode.range.start.col;\n const startRow = rangeNode.range.start.row;\n const endCol = rangeNode.range.end.col.value;\n const endRow = rangeNode.range.end.row.value;\n \n // Check if BOTH start and end of the range are in the moved cells\n const startMoved = isCellMoved(\n movedCells,\n rangeNode.workbookName,\n rangeNode.sheetName,\n startCol,\n startRow\n );\n \n const endMoved = isCellMoved(\n movedCells,\n rangeNode.workbookName,\n rangeNode.sheetName,\n endCol,\n endRow\n );\n \n // Only update if ENTIRE range is being moved\n if (startMoved && endMoved) {\n // Verify that all cells in the range are being moved together\n // by checking if the range dimensions are preserved\n const rangeWidth = endCol - startCol;\n const rangeHeight = endRow - startRow;\n \n // Check a few cells in the middle to ensure contiguous movement\n // For small ranges, check all cells\n let allCellsMoved = true;\n \n // Sample checking strategy: check corners and center\n const cellsToCheck: Array<[number, number]> = [\n [startCol, startRow], // Top-left (already checked)\n [endCol, endRow], // Bottom-right (already checked)\n ];\n \n // Add middle cells for larger ranges\n if (rangeWidth > 1 || rangeHeight > 1) {\n const midCol = Math.floor((startCol + endCol) / 2);\n const midRow = Math.floor((startRow + endRow) / 2);\n cellsToCheck.push([midCol, midRow]);\n \n if (rangeWidth > 1) {\n cellsToCheck.push([midCol, startRow]);\n cellsToCheck.push([midCol, endRow]);\n }\n if (rangeHeight > 1) {\n cellsToCheck.push([startCol, midRow]);\n cellsToCheck.push([endCol, midRow]);\n }\n }\n \n // Check if all sampled cells are moved\n for (const [col, row] of cellsToCheck) {\n if (!isCellMoved(movedCells, rangeNode.workbookName, rangeNode.sheetName, col, row)) {\n allCellsMoved = false;\n break;\n }\n }\n \n if (allCellsMoved) {\n // Update the entire range\n return {\n ...rangeNode,\n range: {\n start: {\n col: startCol + movedCells.colOffset,\n row: startRow + movedCells.rowOffset,\n },\n end: {\n col: { type: \"number\" as const, value: endCol + movedCells.colOffset },\n row: { type: \"number\" as const, value: endRow + movedCells.rowOffset },\n },\n },\n };\n }\n }\n }\n }\n \n return node;\n });\n\n return astToString(transformedAST);\n } catch (error) {\n // If parsing fails, return the original formula\n return formula;\n }\n}\n\n/**\n * Checks if a formula contains a reference to a specific cell\n * \n * @param formula - The formula string (without the leading =)\n * @param workbookName - The workbook name\n * @param sheetName - The sheet name\n * @param colIndex - The column index\n * @param rowIndex - The row index\n * @returns True if the formula references the cell\n */\nexport function formulaReferencesCell(\n formula: string,\n workbookName: string,\n sheetName: string,\n colIndex: number,\n rowIndex: number\n): boolean {\n try {\n const ast = parseFormula(formula);\n let hasReference = false;\n\n transformAST(ast, (node) => {\n if (node.type === \"reference\") {\n const refNode = node as ReferenceNode;\n \n // Match if same cell (with or without explicit sheet/workbook)\n if (\n refNode.address.colIndex === colIndex &&\n refNode.address.rowIndex === rowIndex\n ) {\n // If reference has workbook/sheet, they must match\n if (refNode.workbookName && refNode.workbookName !== workbookName) {\n return node;\n }\n if (refNode.sheetName && refNode.sheetName !== sheetName) {\n return node;\n }\n \n hasReference = true;\n }\n }\n return node;\n });\n\n return hasReference;\n } catch (error) {\n // If parsing fails, assume no reference\n return false;\n }\n}\n\n/**\n * Checks if a formula contains a reference to a specific range\n * \n * @param formula - The formula string (without the leading =)\n * @param workbookName - The workbook name\n * @param sheetName - The sheet name\n * @param startCol - Range start column\n * @param startRow - Range start row\n * @param endCol - Range end column\n * @param endRow - Range end row\n * @returns True if the formula references the range\n */\nexport function formulaReferencesRange(\n formula: string,\n workbookName: string,\n sheetName: string,\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number\n): boolean {\n try {\n const ast = parseFormula(formula);\n let hasReference = false;\n\n transformAST(ast, (node) => {\n if (node.type === \"range\") {\n const rangeNode = node as RangeNode;\n \n // Check if range matches (must be finite)\n if (\n rangeNode.range.end.col.type === \"number\" &&\n rangeNode.range.end.row.type === \"number\" &&\n rangeNode.range.start.col === startCol &&\n rangeNode.range.start.row === startRow &&\n rangeNode.range.end.col.value === endCol &&\n rangeNode.range.end.row.value === endRow\n ) {\n // If reference has workbook/sheet, they must match\n if (rangeNode.workbookName && rangeNode.workbookName !== workbookName) {\n return node;\n }\n if (rangeNode.sheetName && rangeNode.sheetName !== sheetName) {\n return node;\n }\n \n hasReference = true;\n }\n }\n return node;\n });\n\n return hasReference;\n } catch (error) {\n // If parsing fails, assume no reference\n return false;\n }\n}\n\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "1FE84CE47168974864756E2164756E21",
9
+ "names": []
10
+ }