@coco-vexel/coco-office 0.0.0-stage → 1.0.0

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 (76) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +120 -2
  3. package/THIRD_PARTY_NOTICES.md +1188 -0
  4. package/dist/excel-worker-browser.cjs +6544 -0
  5. package/dist/excel-worker-browser.cjs.map +1 -0
  6. package/dist/excel-worker-browser.d.cts +2 -0
  7. package/dist/excel-worker-browser.d.ts +2 -0
  8. package/dist/excel-worker-browser.js +6523 -0
  9. package/dist/excel-worker-browser.js.map +1 -0
  10. package/dist/excel-worker.cjs +6547 -0
  11. package/dist/excel-worker.cjs.map +1 -0
  12. package/dist/excel-worker.d.cts +2 -0
  13. package/dist/excel-worker.d.ts +2 -0
  14. package/dist/excel-worker.js +6526 -0
  15. package/dist/excel-worker.js.map +1 -0
  16. package/dist/excel.cjs +12523 -0
  17. package/dist/excel.cjs.map +1 -0
  18. package/dist/excel.d.cts +2252 -0
  19. package/dist/excel.d.ts +2252 -0
  20. package/dist/excel.js +12368 -0
  21. package/dist/excel.js.map +1 -0
  22. package/dist/index.cjs +19 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.cts +2 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.js +1 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/kernel-worker-browser.cjs +12304 -0
  29. package/dist/kernel-worker-browser.cjs.map +1 -0
  30. package/dist/kernel-worker-browser.d.cts +2 -0
  31. package/dist/kernel-worker-browser.d.ts +2 -0
  32. package/dist/kernel-worker-browser.js +12283 -0
  33. package/dist/kernel-worker-browser.js.map +1 -0
  34. package/dist/kernel-worker.cjs +12309 -0
  35. package/dist/kernel-worker.cjs.map +1 -0
  36. package/dist/kernel-worker.d.cts +2 -0
  37. package/dist/kernel-worker.d.ts +2 -0
  38. package/dist/kernel-worker.js +12288 -0
  39. package/dist/kernel-worker.js.map +1 -0
  40. package/dist/pack.cjs +459 -0
  41. package/dist/pack.cjs.map +1 -0
  42. package/dist/pack.d.cts +119 -0
  43. package/dist/pack.d.ts +119 -0
  44. package/dist/pack.js +408 -0
  45. package/dist/pack.js.map +1 -0
  46. package/dist/ppt.cjs +7427 -0
  47. package/dist/ppt.cjs.map +1 -0
  48. package/dist/ppt.d.cts +1432 -0
  49. package/dist/ppt.d.ts +1432 -0
  50. package/dist/ppt.js +7355 -0
  51. package/dist/ppt.js.map +1 -0
  52. package/dist/shared.cjs +105 -0
  53. package/dist/shared.cjs.map +1 -0
  54. package/dist/shared.d.cts +31 -0
  55. package/dist/shared.d.ts +31 -0
  56. package/dist/shared.js +81 -0
  57. package/dist/shared.js.map +1 -0
  58. package/dist/types-BVkkdcfh.d.cts +54 -0
  59. package/dist/types-BVkkdcfh.d.ts +54 -0
  60. package/dist/types-C2vQfM-b.d.cts +102 -0
  61. package/dist/types-C2vQfM-b.d.ts +102 -0
  62. package/dist/view-DAkeR0RW.d.ts +1199 -0
  63. package/dist/view-DX2YAG5A.d.cts +1199 -0
  64. package/dist/word-view.cjs +1824 -0
  65. package/dist/word-view.cjs.map +1 -0
  66. package/dist/word-view.d.cts +2 -0
  67. package/dist/word-view.d.ts +2 -0
  68. package/dist/word-view.js +1791 -0
  69. package/dist/word-view.js.map +1 -0
  70. package/dist/word.cjs +14106 -0
  71. package/dist/word.cjs.map +1 -0
  72. package/dist/word.d.cts +3042 -0
  73. package/dist/word.d.ts +3042 -0
  74. package/dist/word.js +14011 -0
  75. package/dist/word.js.map +1 -0
  76. package/package.json +103 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/excel/index.ts","../src/pack/part.ts","../src/pack/package.ts","../src/pack/zip.ts","../src/pack/content-types.ts","../src/excel/namespaces.ts","../src/excel/address.ts","../src/excel/color.ts","../src/excel/styles-reader.ts","../src/excel/workbook-reader.ts","../src/excel/xlsx-reader.ts","../src/excel/xlsx-writer.ts","../src/excel/names.ts","../src/excel/range.ts","../src/excel/objects.ts","../src/excel/reference-rewriter.ts","../src/excel/worksheet.ts","../src/excel/mutations.ts","../src/excel/excel-workbook.ts","../src/excel/analysis.ts","../src/excel/runtime-script.ts","../src/excel/history.ts","../src/excel/runtime-rpc.ts","../src/excel/runtime-transport.ts","../src/excel/runtime.ts","../src/excel/formula/evaluator.ts","../src/excel/formula/parser.ts","../src/excel/formula/types.ts","../src/excel/formula/engine.ts","../src/excel/writeback-planner.ts","../src/excel/shadow-workbook.ts"],"sourcesContent":["export {\n ExcelWorkbook,\n ExcelRuntimeWorkbook,\n ExcelWorksheetCollection,\n ExcelWorksheet,\n ExcelRange,\n ExcelRangeAlignmentFormat,\n ExcelRangeBorderFormat,\n ExcelRangeFillFormat,\n ExcelRangeFontFormat,\n ExcelRangeFormat,\n ExcelCell,\n ExcelNamedItem,\n ExcelNamedItemCollection,\n ExcelChart,\n ExcelChartCollection,\n ExcelComment,\n ExcelCommentCollection,\n ExcelConditionalFormat,\n ExcelConditionalFormatCollection,\n ExcelConditionalFormatRule,\n ExcelConditionalFormatRuleCollection,\n ExcelDataValidation,\n ExcelDataValidationCollection,\n ExcelDrawing,\n ExcelDrawingAnchor,\n ExcelDrawingAnchorCollection,\n ExcelDrawingCollection,\n ExcelDrawingMarker,\n ExcelFormulaRefCollection,\n ExcelHyperlink,\n ExcelHyperlinkCollection,\n ExcelImage,\n ExcelImageCollection,\n ExcelShape,\n ExcelShapeCollection,\n ExcelTable,\n ExcelTableColumn,\n ExcelTableColumnCollection,\n ExcelTableCollection,\n ExcelTableStyle,\n ExcelThreadedComment,\n ExcelThreadedCommentCollection,\n type ExcelModeDecision,\n type ExcelModeSource,\n type ExcelWorkbookLoadOptions,\n type ExcelRuntimeLoadOptions,\n type ExcelRuntimeMode,\n type ExcelWorkerFactory,\n} from './runtime.js';\nexport { ExcelWorkbookCore, type ExcelLoadOptions } from './excel-workbook.js';\nexport type {\n ExcelScriptApiPath,\n ExcelScriptApiReceiver,\n ExcelScriptApiReceiverMap,\n} from './script-api-contract.js';\nexport { readWorkbookModel } from './xlsx-reader.js';\nexport {\n columnIndexToName,\n columnNameToIndex,\n formatCellAddress,\n formatRangeAddress,\n parseCellAddress,\n parseRangeAddress,\n splitSheetQualifiedAddress,\n type CellAddress,\n type RangeAddress,\n type SheetQualifiedAddress,\n} from './address.js';\nexport {\n ExcelCell as ExcelCellCore,\n ExcelRange as ExcelRangeCore,\n ExcelRangeAlignmentFormat as ExcelRangeAlignmentFormatCore,\n ExcelRangeBorderFormat as ExcelRangeBorderFormatCore,\n ExcelRangeFillFormat as ExcelRangeFillFormatCore,\n ExcelRangeFontFormat as ExcelRangeFontFormatCore,\n ExcelRangeFormat as ExcelRangeFormatCore,\n} from './range.js';\nexport {\n ExcelWorksheet as ExcelWorksheetCore,\n ExcelWorksheetCollection as ExcelWorksheetCollectionCore,\n} from './worksheet.js';\nexport {\n ExcelNamedItem as ExcelNamedItemCore,\n ExcelNamedItemCollection as ExcelNamedItemCollectionCore,\n} from './names.js';\nexport {\n ExcelChart as ExcelChartCore,\n ExcelChartCollection as ExcelChartCollectionCore,\n ExcelComment as ExcelCommentCore,\n ExcelCommentCollection as ExcelCommentCollectionCore,\n ExcelConditionalFormat as ExcelConditionalFormatCore,\n ExcelConditionalFormatCollection as ExcelConditionalFormatCollectionCore,\n ExcelConditionalFormatRule as ExcelConditionalFormatRuleCore,\n ExcelConditionalFormatRuleCollection as ExcelConditionalFormatRuleCollectionCore,\n ExcelDataValidation as ExcelDataValidationCore,\n ExcelDataValidationCollection as ExcelDataValidationCollectionCore,\n ExcelDrawing as ExcelDrawingCore,\n ExcelDrawingAnchor as ExcelDrawingAnchorCore,\n ExcelDrawingAnchorCollection as ExcelDrawingAnchorCollectionCore,\n ExcelDrawingCollection as ExcelDrawingCollectionCore,\n ExcelDrawingMarker as ExcelDrawingMarkerCore,\n ExcelFormulaRefCollection as ExcelFormulaRefCollectionCore,\n ExcelHyperlink as ExcelHyperlinkCore,\n ExcelHyperlinkCollection as ExcelHyperlinkCollectionCore,\n ExcelImage as ExcelImageCore,\n ExcelImageCollection as ExcelImageCollectionCore,\n ExcelShape as ExcelShapeCore,\n ExcelShapeCollection as ExcelShapeCollectionCore,\n ExcelTable as ExcelTableCore,\n ExcelTableColumn as ExcelTableColumnCore,\n ExcelTableColumnCollection as ExcelTableColumnCollectionCore,\n ExcelTableCollection as ExcelTableCollectionCore,\n ExcelTableStyle as ExcelTableStyleCore,\n ExcelThreadedComment as ExcelThreadedCommentCore,\n ExcelThreadedCommentCollection as ExcelThreadedCommentCollectionCore,\n} from './objects.js';\nexport {\n renameSheetInFormula,\n renameSheetInReference,\n rewriteFormulaForColumnDelete,\n rewriteFormulaForColumnInsert,\n rewriteFormulaForRowDelete,\n rewriteFormulaForRowInsert,\n rewriteFormulaReferences,\n shiftFormulaReferences,\n rewriteFormulaForRowSort,\n shiftReferenceRelative,\n rewriteReferenceForColumnDelete,\n rewriteReferenceForColumnInsert,\n rewriteReferenceForRowDelete,\n rewriteReferenceForRowInsert,\n type ExcelFormulaReferenceRewriter,\n type ExcelReferenceRewriteOptions,\n type ExcelReferenceRewriteResult,\n} from './reference-rewriter.js';\nexport {\n SpreadsheetFormulaEngine,\n calculateSpreadsheetSheetFormulas,\n collectSpreadsheetFormulaReferences,\n evaluateSpreadsheetFormulaAst,\n parseSpreadsheetFormula,\n type SpreadsheetFormulaAst,\n type SpreadsheetFormulaCellReference,\n type SpreadsheetFormulaError,\n type SpreadsheetFormulaEvaluation,\n type SpreadsheetFormulaEvaluationContext,\n type SpreadsheetFormulaRangeReference,\n type SpreadsheetFormulaReference,\n type SpreadsheetFormulaResult,\n type SpreadsheetFormulaScalar,\n type SpreadsheetFormulaValue,\n} from './formula/engine.js';\nexport {\n diffExcelWorkbookModels,\n planExcelWriteback,\n type ExcelCellDiff,\n type ExcelCellDiffKind,\n type ExcelSheetDiff,\n type ExcelWorkbookDiff,\n type ExcelWorkbookDiffKind,\n type ExcelWritebackCapabilities,\n type ExcelWritebackOperation,\n type ExcelWritebackPlan,\n type ExcelWritebackPlanOptions,\n type ExcelWritebackPreference,\n type ExcelWritebackStrategy,\n} from './writeback-planner.js';\nexport {\n changedSheetNamesFromMutations,\n type ExcelMutationRecorder,\n type ExcelMutationSheetRef,\n type ExcelRangeClearMutation,\n type ExcelRangeMergeMutation,\n type ExcelRangeMutationBase,\n type ExcelRangeSetFormulasMutation,\n type ExcelRangeSetValuesMutation,\n type ExcelRangeUnmergeMutation,\n type ExcelUnsafeMutation,\n type ExcelWorkbookMutation,\n type ExcelWorksheetAddMutation,\n type ExcelWorksheetDeleteMutation,\n type ExcelWorksheetRenameMutation,\n} from './mutations.js';\nexport {\n applyExcelPatch,\n ExcelWorkbookHistory,\n summarizeExcelTransactionGroup,\n type ExcelCellFormatSnapshot,\n type ExcelAgentTransactionGroupOptions,\n type ExcelColumnWidthPatch,\n type ExcelHistoryApplyResult,\n type ExcelMergedRangesPatch,\n type ExcelPatch,\n type ExcelPatchSummary,\n type ExcelRangeCellsPatch,\n type ExcelRangeFormatPatch,\n type ExcelRowHeightPatch,\n type ExcelSnapshotPatch,\n type ExcelTransaction,\n type ExcelTransactionBuilder,\n type ExcelTransactionGroup,\n type ExcelTransactionGroupMetadata,\n type ExcelTransactionGroupOptions,\n type ExcelTransactionGroupSummary,\n type ExcelTransactionSummary,\n type ExcelTransactionSource,\n} from './history.js';\nexport {\n createShadowWorkbookModel,\n createShadowWorkbookPayload,\n type ExcelShadowWorkbookOptions,\n type ExcelShadowWorkbookPayload,\n} from './shadow-workbook.js';\nexport {\n aggregateExcelTable,\n type ExcelAggregateBucket,\n type ExcelAggregateGroupBy,\n type ExcelAggregateMetric,\n type ExcelAggregateOperation,\n type ExcelAggregateSource,\n type ExcelAggregateTableOptions,\n type ExcelAggregateTableResult,\n type ExcelAggregateResultRow,\n} from './analysis.js';\nexport {\n type ExcelCellKind,\n type ExcelAlignmentModel,\n type ExcelBorderModel,\n type ExcelBorderSideModel,\n type ExcelCellFormatModel,\n type ExcelCellModel,\n type ExcelCellValue,\n type ExcelChartAddOptions,\n type ExcelChartModel,\n type ExcelChartPositionModel,\n type ExcelChartSeriesModel,\n type ExcelChartType,\n type ExcelColorModel,\n type ExcelCommentModel,\n type ExcelColumnModel,\n type ExcelConditionalFormatModel,\n type ExcelConditionalFormatRuleModel,\n type ExcelDataValidationModel,\n type ExcelDefinedNameModel,\n type ExcelDrawingAnchorModel,\n type ExcelDrawingMarkerModel,\n type ExcelDrawingModel,\n type ExcelDrawingObjectModel,\n type ExcelFillModel,\n type ExcelFontModel,\n type ExcelHyperlinkModel,\n type ExcelImageModel,\n type ExcelMergedRangeModel,\n type ExcelNumberFormatModel,\n type ExcelRowModel,\n type ExcelPaneModel,\n type ExcelSelectionModel,\n type ExcelSheetModel,\n type ExcelSheetViewModel,\n type ExcelShapeModel,\n type ExcelStylesModel,\n type ExcelTableColumnModel,\n type ExcelTableAutoFilterModel,\n type ExcelTableFilterColumnModel,\n type ExcelTableModel,\n type ExcelTableSortConditionModel,\n type ExcelTableSortStateModel,\n type ExcelTableStyleModel,\n type ExcelThreadedCommentModel,\n type ExcelWorkbookModel,\n} from './model.js';\nexport { SS_NS, REL_NS, OFFICE_REL_NS } from './namespaces.js';\n","/**\n * Part 构造 / 变更 / 查询 的辅助函数。\n *\n * 所有 Part 的\"创建\"都走这里(而非直接字面量),以便:\n * - 守住 path 格式(无前导斜杠)\n * - 守住 XML / 二进制 互斥\n * - 统一 `_dirty` / `_originalBytes` 初始化语义\n */\nimport type { Part } from './types.js';\n\nexport interface CreateXmlPartSpec {\n /** Part 路径,无前导斜杠,如 'word/document.xml' */\n path: string;\n /** MIME content type */\n contentType: string;\n /** 已解析好的 XML DOM(slimdom Document) */\n xmlDom: Document;\n /**\n * 装载时的原始字节。\n * - 传入(来自装载路径):`_dirty` 初始为 `false`,可在 `toZip` 时零 serialize 复用\n * - 省略(新建 part 的场景,后续 #9/#10 的插入新 XML part):`_dirty` 初始为 `true`\n */\n originalBytes?: Uint8Array;\n}\n\nexport interface CreateBinaryPartSpec {\n /** Part 路径,无前导斜杠,如 'word/media/image1.png' */\n path: string;\n /** MIME content type,如 'image/png' */\n contentType: string;\n /** 二进制载荷 */\n bytes: Uint8Array;\n /**\n * 装载时的原始字节;二进制通常装载即最终态,省略时默认 = `bytes`。\n * 二进制 part 初始 `_dirty` 恒为 `false`。\n */\n originalBytes?: Uint8Array;\n}\n\nfunction assertPath(path: string): void {\n if (typeof path !== 'string' || path.length === 0) {\n throw new Error(`invalid part path: must be non-empty string, got: ${JSON.stringify(path)}`);\n }\n if (path.startsWith('/')) {\n throw new Error(`invalid part path: must not start with '/', got: ${path}`);\n }\n}\n\nfunction assertContentType(contentType: string): void {\n if (typeof contentType !== 'string' || contentType.length === 0) {\n throw new Error(`invalid contentType: must be non-empty string`);\n }\n}\n\n/** 从已解析的 XML DOM 创建 XML part。`originalBytes` 传入 → dirty=false;否则 dirty=true(新建场景) */\nexport function createXmlPart(spec: CreateXmlPartSpec): Part {\n assertPath(spec.path);\n assertContentType(spec.contentType);\n if (!spec.xmlDom) {\n throw new Error(`createXmlPart: xmlDom required for ${spec.path}`);\n }\n return {\n path: spec.path,\n contentType: spec.contentType,\n xmlDom: spec.xmlDom,\n _originalBytes: spec.originalBytes,\n _dirty: spec.originalBytes === undefined,\n };\n}\n\n/** 从二进制字节创建 binary part。`originalBytes` 省略时默认 = `bytes`。dirty 恒为 false */\nexport function createBinaryPart(spec: CreateBinaryPartSpec): Part {\n assertPath(spec.path);\n assertContentType(spec.contentType);\n if (!spec.bytes) {\n throw new Error(`createBinaryPart: bytes required for ${spec.path}`);\n }\n return {\n path: spec.path,\n contentType: spec.contentType,\n bytes: spec.bytes,\n _originalBytes: spec.originalBytes ?? spec.bytes,\n _dirty: false,\n };\n}\n\n/** 标记 part 被改动过。toZip / toFlatOpc 会重 serialize 此 part */\nexport function markDirty(part: Part): void {\n part._dirty = true;\n}\n\n/** 查询 part 是否被改动(read-only;读操作不改 part) */\nexport function isDirty(part: Part): boolean {\n return part._dirty;\n}\n\n/** XML part 判定(拥有 xmlDom) */\nexport function isXmlPart(part: Part): boolean {\n return part.xmlDom !== undefined;\n}\n\n/** 二进制 part 判定(拥有 bytes 但无 xmlDom) */\nexport function isBinaryPart(part: Part): boolean {\n return part.bytes !== undefined && part.xmlDom === undefined;\n}\n","/**\n * Package 集合层:create / set / get / has / delete / list\n *\n * Package 只是 path→Part 的 Map 容器;零业务语义,存储格式由 adapter 层(#9 zip / #10 Flat OPC)决定。\n */\nimport type { Package, Part } from './types.js';\n\n/** 空包。后续由 adapter 层填充 parts */\nexport function createPackage(): Package {\n return { parts: new Map() };\n}\n\n/** 以 part.path 为 key 放入 pkg。已存在同 path 时覆盖 */\nexport function setPart(pkg: Package, part: Part): void {\n pkg.parts.set(part.path, part);\n}\n\n/** 按 path 取回 part;不存在返 undefined */\nexport function getPart(pkg: Package, path: string): Part | undefined {\n return pkg.parts.get(path);\n}\n\n/** 按 path 判断存在 */\nexport function hasPart(pkg: Package, path: string): boolean {\n return pkg.parts.has(path);\n}\n\n/** 删除 part,返回是否删除成功(存在即删、不存在返 false) */\nexport function deletePart(pkg: Package, path: string): boolean {\n return pkg.parts.delete(path);\n}\n\n/** 所有 parts 快照数组(稳定遍历顺序 = Map 插入顺序) */\nexport function listParts(pkg: Package): Part[] {\n return Array.from(pkg.parts.values());\n}\n","/**\n * zip ↔ Package 互转(docs/01 §3.2)。\n *\n * - `fromZip(buf)` 解压 .docx,按 `[Content_Types].xml` 恢复每个 part 的 contentType\n * - `toZip(pkg)` 反向:dirty=false 的 part 复用 `_originalBytes`,dirty=true 的按 XML / 二进制重序列化\n *\n * 本实现目标:小文档正确性。极大档性能调优(lazy parse 等)归后续 issue。\n */\nimport JSZip from 'jszip';\nimport { parseXmlDocument, serializeToWellFormedString } from 'slimdom';\nimport type { Package, Part } from './types.js';\nimport { createBinaryPart, createXmlPart, isXmlPart } from './part.js';\nimport { createPackage, setPart } from './package.js';\nimport { ensureContentTypes } from './content-types.js';\n\n/** Content Types 子集 */\nconst CONTENT_TYPES_PATH = '[Content_Types].xml';\nconst CONTENT_TYPES_NS = 'http://schemas.openxmlformats.org/package/2006/content-types';\nconst CONTENT_TYPES_CTYPE = 'application/vnd.openxmlformats-package.content-types+xml';\n\n/**\n * 判断 contentType 是否为 XML 类(决定走 parseXmlDocument 还是保留字节):\n * - 以 `+xml` 结尾(OOXML 所有子 part 的惯例)\n * - 或完全等于 `application/xml` / `text/xml`\n */\nfunction isXmlContentType(ct: string): boolean {\n const normalized = ct.toLowerCase();\n if (\n normalized.startsWith('image/') ||\n normalized.startsWith('audio/') ||\n normalized.startsWith('video/') ||\n normalized === 'application/octet-stream' ||\n normalized === 'application/vnd.openxmlformats-officedocument.oleobject' ||\n normalized.startsWith('application/vnd.ms-office.')\n ) {\n return false;\n }\n return normalized.endsWith('+xml') || normalized === 'application/xml' || normalized === 'text/xml';\n}\n\n/** 解析 [Content_Types].xml 构建 partName → contentType 的查找器 */\ninterface ContentTypeResolver {\n /** partName 无前导 `/`,如 'word/document.xml' */\n resolve(partName: string): string | undefined;\n}\n\nfunction parseContentTypes(xml: string): ContentTypeResolver {\n const doc = parseXmlDocument(xml) as unknown as Document;\n const defaults = new Map<string, string>(); // extension(小写) → contentType\n const overrides = new Map<string, string>(); // partName(无 /)→ contentType\n\n const defaultEls = doc.getElementsByTagNameNS(CONTENT_TYPES_NS, 'Default');\n for (let i = 0; i < defaultEls.length; i++) {\n const el = defaultEls[i];\n if (!el) continue;\n const ext = el.getAttribute('Extension');\n const ct = el.getAttribute('ContentType');\n if (ext && ct) defaults.set(ext.toLowerCase(), ct);\n }\n\n const overrideEls = doc.getElementsByTagNameNS(CONTENT_TYPES_NS, 'Override');\n for (let i = 0; i < overrideEls.length; i++) {\n const el = overrideEls[i];\n if (!el) continue;\n const partName = el.getAttribute('PartName');\n const ct = el.getAttribute('ContentType');\n if (partName && ct) {\n // PartName 以 `/` 开头,剥掉前导斜杠与 Package 内部 path 对齐\n overrides.set(partName.replace(/^\\//, ''), ct);\n }\n }\n\n return {\n resolve(partName: string): string | undefined {\n const override = overrides.get(partName);\n if (override) return override;\n const dot = partName.lastIndexOf('.');\n if (dot === -1) return undefined;\n return defaults.get(partName.slice(dot + 1).toLowerCase());\n },\n };\n}\n\n/**\n * 从 zip 字节重建 Package。\n *\n * 行为:\n * - 先读 `[Content_Types].xml`,构建 contentType 查找器\n * - 遍历 zip entries,跳过目录\n * - 每个 entry 按 contentType 决定 XML / 二进制,创建对应 Part\n * - `[Content_Types].xml` 也作为 XML part 存入 Package\n */\nexport async function fromZip(buf: Uint8Array | ArrayBuffer): Promise<Package> {\n const bytes = buf instanceof Uint8Array ? buf : new Uint8Array(buf);\n const zip = await JSZip.loadAsync(bytes);\n const pkg = createPackage();\n\n const ctFile = zip.file(CONTENT_TYPES_PATH);\n if (!ctFile) {\n throw new Error(`fromZip: missing ${CONTENT_TYPES_PATH}; not a valid OOXML package`);\n }\n const ctXml = await ctFile.async('string');\n const resolver = parseContentTypes(ctXml);\n const ctBytes = await ctFile.async('uint8array');\n setPart(\n pkg,\n createXmlPart({\n path: CONTENT_TYPES_PATH,\n contentType: CONTENT_TYPES_CTYPE,\n xmlDom: parseXmlDocument(ctXml) as unknown as Document,\n originalBytes: ctBytes,\n }),\n );\n\n // 遍历非 [Content_Types].xml 的 entry\n const entryPaths: string[] = [];\n zip.forEach((relativePath, entry) => {\n if (entry.dir) return;\n if (relativePath === CONTENT_TYPES_PATH) return;\n entryPaths.push(relativePath);\n });\n\n for (const path of entryPaths) {\n const entry = zip.file(path);\n if (!entry) continue;\n const contentType = resolver.resolve(path);\n if (!contentType) {\n throw new Error(\n `fromZip: no ContentType for part '${path}' (not in Default by extension, not in Override by partName)`,\n );\n }\n const entryBytes = await entry.async('uint8array');\n\n if (isXmlContentType(contentType)) {\n const xmlText = await entry.async('string');\n const xmlDom = parseXmlDocument(xmlText) as unknown as Document;\n setPart(pkg, createXmlPart({ path, contentType, xmlDom, originalBytes: entryBytes }));\n } else {\n setPart(pkg, createBinaryPart({ path, contentType, bytes: entryBytes }));\n }\n }\n\n return pkg;\n}\n\n/**\n * 将 Package 序列化回 zip 字节。\n *\n * 行为:\n * - `_dirty === false` 且持有 `_originalBytes` → 直接复用字节(零 serialize)\n * - `_dirty === true` 的 XML part → slimdom serialize\n * - `_dirty === true` 的二进制 part → 使用 `bytes`\n */\nexport async function toZip(pkg: Package): Promise<Uint8Array> {\n // Flat OPC → Package 的路径不会产生 [Content_Types].xml;此处补齐以保证产出的 zip 合法。\n // 对 fromZip 出来的 Package 无副作用(CT 已在)。\n ensureContentTypes(pkg);\n\n const zip = new JSZip();\n\n for (const part of pkg.parts.values()) {\n const bytes = partToBytes(part);\n // createFolders=false 显式禁止 JSZip 为含 '/' 的 path 自动创建中间目录 entry——\n // OOXML 规范不允许 zip 包内有空目录 entry,Word 见到会判\"文档已损坏\"拒打开\n // (WPS 宽松能开但产物不合规)。JSZip 3.x 默认 true,必须显式关。\n zip.file(part.path, bytes, { createFolders: false });\n }\n\n // OOXML 主体是高度可压缩的 XML;默认 STORE 会让产物比 Word 原生输出大 10-18×。\n return await zip.generateAsync({\n type: 'uint8array',\n compression: 'DEFLATE',\n compressionOptions: { level: 6 },\n });\n}\n\nfunction partToBytes(part: Part): Uint8Array {\n // dirty=false 且有原始字节:零 serialize\n if (!part._dirty && part._originalBytes) {\n return part._originalBytes;\n }\n\n if (isXmlPart(part)) {\n if (!part.xmlDom) {\n throw new Error(`toZip: XML part '${part.path}' missing xmlDom`);\n }\n // xmlDom 在我们的类型里是 lib.dom 的 Document(消费方友好),slimdom 的 Node 结构兼容但 TS\n // 类型不同;通过 `as never` 绕开 dts 检查,运行时正常。\n const text = serializeToWellFormedString(part.xmlDom as never);\n return new TextEncoder().encode(text);\n }\n\n // 二进制\n if (part.bytes) return part.bytes;\n if (part._originalBytes) return part._originalBytes;\n throw new Error(`toZip: binary part '${part.path}' has no bytes`);\n}\n","/**\n * [Content_Types].xml 的合成与维护。\n *\n * 为什么单列一个模块:\n * - zip 形态要求 [Content_Types].xml 存在(否则 Word/WPS 打不开)\n * - Flat OPC 形态里 contentType 已内联在 <pkg:part> 上,不含 CT 文件\n * - 因此 `fromFlatOpc` 出来的 Package 缺 CT;直接 `toZip` 会产出坏 docx\n *\n * 本模块提供 `ensureContentTypes(pkg)`:若 CT part 缺失,按当前 parts 的\n * (path → contentType)合成一份最小 CT XML 并加入 Package。\n *\n * `toZip` 会在打包前自动调一次,确保产出的 zip 始终可打开。\n */\nimport { parseXmlDocument } from 'slimdom';\nimport { createXmlPart } from './part.js';\nimport { getPart, setPart } from './package.js';\nimport type { Package } from './types.js';\n\nconst CONTENT_TYPES_PATH = '[Content_Types].xml';\nconst CONTENT_TYPES_NS = 'http://schemas.openxmlformats.org/package/2006/content-types';\nconst CONTENT_TYPES_CTYPE = 'application/vnd.openxmlformats-package.content-types+xml';\n\n/** XML 属性值转义(Content Type 里可能含 `+`,但没有 `<` `&` 等需要转义的字符;仍做一遍以防) */\nfunction xmlAttr(v: string): string {\n return v\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/**\n * 如果 Package 里已有 `[Content_Types].xml` part,返回 false,不做改动。\n * 否则,按当前 parts 的 contentType 合成一份最小 CT XML 并加入 Package,返回 true。\n *\n * 合成策略:每个非 CT part 产生一个 `<Override PartName=\"/path\" ContentType=\"...\"/>`。\n * 不尝试推导 Default 扩展名(正确性优先,简洁性次之)。\n */\nexport function ensureContentTypes(pkg: Package): boolean {\n if (getPart(pkg, CONTENT_TYPES_PATH)) return false;\n\n const overrides: string[] = [];\n for (const part of pkg.parts.values()) {\n if (part.path === CONTENT_TYPES_PATH) continue;\n overrides.push(\n ` <Override PartName=\"/${xmlAttr(part.path)}\" ContentType=\"${xmlAttr(part.contentType)}\"/>`,\n );\n }\n\n const xml =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n` +\n `<Types xmlns=\"${CONTENT_TYPES_NS}\">\\n` +\n overrides.join('\\n') +\n (overrides.length > 0 ? '\\n' : '') +\n `</Types>`;\n\n setPart(\n pkg,\n createXmlPart({\n path: CONTENT_TYPES_PATH,\n contentType: CONTENT_TYPES_CTYPE,\n xmlDom: parseXmlDocument(xml) as unknown as Document,\n originalBytes: new TextEncoder().encode(xml),\n }),\n );\n\n return true;\n}\n","export const SS_NS = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main';\nexport const REL_NS = 'http://schemas.openxmlformats.org/package/2006/relationships';\nexport const OFFICE_REL_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';\n","export interface CellAddress {\n address: string;\n row: number;\n column: number;\n}\n\nexport interface RangeAddress {\n address: string;\n sheetName?: string;\n startRow: number;\n startColumn: number;\n rowCount: number;\n columnCount: number;\n}\n\nexport interface SheetQualifiedAddress {\n sheetName?: string;\n address: string;\n}\n\nexport const EXCEL_MAX_ROW = 1_048_576;\nexport const EXCEL_MAX_COLUMN = 16_384;\n\nexport function columnNameToIndex(columnName: string): number {\n let value = 0;\n for (const ch of columnName.toUpperCase()) {\n const code = ch.charCodeAt(0);\n if (code < 65 || code > 90) continue;\n value = value * 26 + (code - 64);\n }\n if (value <= 0) {\n throw new Error(`ExcelWorkbook: invalid column name ${columnName}`);\n }\n return value;\n}\n\nexport function columnIndexToName(column: number): string {\n if (!Number.isInteger(column) || column < 1) {\n throw new Error(`ExcelWorkbook: invalid column index ${column}`);\n }\n let value = column;\n let name = '';\n while (value > 0) {\n const rem = (value - 1) % 26;\n name = String.fromCharCode(65 + rem) + name;\n value = Math.floor((value - 1) / 26);\n }\n return name;\n}\n\nexport function parseCellAddress(address: string): CellAddress {\n const qualified = splitSheetQualifiedAddress(address);\n const normalized = qualified.address.replace(/\\$/g, '').trim();\n const match = /^([A-Za-z]+)(\\d+)$/.exec(normalized);\n if (!match) {\n throw new Error(`ExcelWorkbook: invalid cell address ${address}`);\n }\n const column = columnNameToIndex(match[1]!);\n const row = Number(match[2]);\n if (!Number.isInteger(row) || row < 1) {\n throw new Error(`ExcelWorkbook: invalid cell address ${address}`);\n }\n return {\n address: `${columnIndexToName(column)}${row}`,\n column,\n row,\n };\n}\n\nexport function formatCellAddress(row: number, column: number): string {\n if (!Number.isInteger(row) || row < 1) {\n throw new Error(`ExcelWorkbook: invalid row index ${row}`);\n }\n return `${columnIndexToName(column)}${row}`;\n}\n\nexport function parseRangeAddress(address: string): RangeAddress {\n const qualified = splitSheetQualifiedAddress(address);\n const parts = qualified.address.split(':');\n if (parts.length > 2) {\n throw new Error(`ExcelWorkbook: invalid range address ${address}`);\n }\n const [startRaw, endRaw] = parts;\n if (!startRaw) {\n throw new Error(`ExcelWorkbook: invalid range address ${address}`);\n }\n const wholeColumn = parseWholeColumnRange(parts, address);\n if (wholeColumn) {\n return { ...wholeColumn, sheetName: qualified.sheetName };\n }\n const wholeRow = parseWholeRowRange(parts, address);\n if (wholeRow) {\n return { ...wholeRow, sheetName: qualified.sheetName };\n }\n const start = parseCellAddress(startRaw);\n const end = endRaw ? parseCellAddress(endRaw) : start;\n const startRow = Math.min(start.row, end.row);\n const endRow = Math.max(start.row, end.row);\n const startColumn = Math.min(start.column, end.column);\n const endColumn = Math.max(start.column, end.column);\n const first = formatCellAddress(startRow, startColumn);\n const last = formatCellAddress(endRow, endColumn);\n return {\n address: first === last ? first : `${first}:${last}`,\n sheetName: qualified.sheetName,\n startRow,\n startColumn,\n rowCount: endRow - startRow + 1,\n columnCount: endColumn - startColumn + 1,\n };\n}\n\nfunction parseWholeColumnRange(\n parts: string[],\n originalAddress: string,\n): Omit<RangeAddress, 'sheetName'> | null {\n if (parts.length !== 2) return null;\n const [startRaw, endRaw] = parts;\n const startColumn = parseColumnReference(startRaw);\n const endColumn = endRaw ? parseColumnReference(endRaw) : startColumn;\n if (startColumn === null && endColumn === null) return null;\n if (startColumn === null || endColumn === null) {\n throw new Error(`ExcelWorkbook: invalid range address ${originalAddress}`);\n }\n const firstColumn = Math.min(startColumn, endColumn);\n const lastColumn = Math.max(startColumn, endColumn);\n return {\n address: formatRangeAddress(\n 1,\n firstColumn,\n EXCEL_MAX_ROW,\n lastColumn - firstColumn + 1,\n ),\n startRow: 1,\n startColumn: firstColumn,\n rowCount: EXCEL_MAX_ROW,\n columnCount: lastColumn - firstColumn + 1,\n };\n}\n\nfunction parseWholeRowRange(\n parts: string[],\n originalAddress: string,\n): Omit<RangeAddress, 'sheetName'> | null {\n if (parts.length !== 2) return null;\n const [startRaw, endRaw] = parts;\n const startRow = parseRowReference(startRaw);\n const endRow = endRaw ? parseRowReference(endRaw) : startRow;\n if (startRow === null && endRow === null) return null;\n if (startRow === null || endRow === null) {\n throw new Error(`ExcelWorkbook: invalid range address ${originalAddress}`);\n }\n const firstRow = Math.min(startRow, endRow);\n const lastRow = Math.max(startRow, endRow);\n return {\n address: formatRangeAddress(\n firstRow,\n 1,\n lastRow - firstRow + 1,\n EXCEL_MAX_COLUMN,\n ),\n startRow: firstRow,\n startColumn: 1,\n rowCount: lastRow - firstRow + 1,\n columnCount: EXCEL_MAX_COLUMN,\n };\n}\n\nfunction parseColumnReference(value: string | undefined): number | null {\n const normalized = value?.replace(/\\$/g, '').trim();\n if (!normalized || !/^[A-Za-z]+$/.test(normalized)) return null;\n return columnNameToIndex(normalized);\n}\n\nfunction parseRowReference(value: string | undefined): number | null {\n const normalized = value?.replace(/\\$/g, '').trim();\n if (!normalized || !/^\\d+$/.test(normalized)) return null;\n const row = Number(normalized);\n if (!Number.isInteger(row) || row < 1) {\n throw new Error(`ExcelWorkbook: invalid row reference ${value}`);\n }\n return row;\n}\n\nexport function splitSheetQualifiedAddress(input: string): SheetQualifiedAddress {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new Error(`ExcelWorkbook: invalid address ${input}`);\n }\n\n let inQuote = false;\n for (let i = 0; i < trimmed.length; i++) {\n const ch = trimmed[i];\n if (ch === \"'\") {\n if (inQuote && trimmed[i + 1] === \"'\") {\n i += 1;\n } else {\n inQuote = !inQuote;\n }\n continue;\n }\n if (ch === '!' && !inQuote) {\n const rawSheet = trimmed.slice(0, i).trim();\n const address = trimmed.slice(i + 1).trim();\n if (!rawSheet || !address) {\n throw new Error(`ExcelWorkbook: invalid sheet-qualified address ${input}`);\n }\n return { sheetName: unquoteSheetName(rawSheet), address };\n }\n }\n\n return { address: trimmed };\n}\n\nexport function formatRangeAddress(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n): string {\n if (!Number.isInteger(rowCount) || rowCount < 1) {\n throw new Error(`ExcelWorkbook: invalid row count ${rowCount}`);\n }\n if (!Number.isInteger(columnCount) || columnCount < 1) {\n throw new Error(`ExcelWorkbook: invalid column count ${columnCount}`);\n }\n const first = formatCellAddress(startRow, startColumn);\n const last = formatCellAddress(startRow + rowCount - 1, startColumn + columnCount - 1);\n return first === last ? first : `${first}:${last}`;\n}\n\nfunction unquoteSheetName(raw: string): string {\n if (!raw.startsWith(\"'\")) return raw;\n if (!raw.endsWith(\"'\") || raw.length < 2) {\n throw new Error(`ExcelWorkbook: invalid quoted sheet name ${raw}`);\n }\n return raw.slice(1, -1).replace(/''/g, \"'\");\n}\n","import type { ExcelColorModel } from './model.js';\n\nconst RGB_PATTERN = /^#[0-9A-Fa-f]{6}$/;\n\nexport function normalizeExcelColor(\n color: ExcelColorModel | undefined,\n context = 'Excel color',\n): ExcelColorModel | undefined {\n if (color === undefined) return undefined;\n if (!color || typeof color !== 'object' || !RGB_PATTERN.test(color.rgb)) {\n throw new Error(`${context}: color must use { rgb: \"#RRGGBB\" }`);\n }\n if (Object.keys(color).some((key) => key !== 'rgb')) {\n throw new Error(`${context}: only the rgb field is supported`);\n }\n return { rgb: color.rgb.toUpperCase() };\n}\n\nexport function ooxmlArgbToExcelColor(value: string | undefined): ExcelColorModel | undefined {\n if (!value) return undefined;\n const normalized = value.trim().replace(/^#/, '');\n if (/^[0-9A-Fa-f]{8}$/.test(normalized)) {\n return { rgb: `#${normalized.slice(2).toUpperCase()}` };\n }\n if (/^[0-9A-Fa-f]{6}$/.test(normalized)) {\n return { rgb: `#${normalized.toUpperCase()}` };\n }\n return undefined;\n}\n\nexport function excelColorToOoxmlArgb(color: ExcelColorModel, context = 'Excel color'): string {\n const normalized = normalizeExcelColor(color, context)!;\n return `FF${normalized.rgb.slice(1)}`;\n}\n\nexport function applyExcelTint(color: ExcelColorModel, tint: number | undefined): ExcelColorModel {\n if (tint === undefined || tint === 0 || !Number.isFinite(tint)) return color;\n const ratio = Math.max(-1, Math.min(1, tint));\n const channels = [1, 3, 5].map((offset) =>\n Number.parseInt(color.rgb.slice(offset, offset + 2), 16),\n );\n const adjusted = channels.map((channel) =>\n Math.round(ratio < 0 ? channel * (1 + ratio) : channel + (255 - channel) * ratio),\n );\n return {\n rgb: `#${adjusted\n .map((channel) => channel.toString(16).padStart(2, '0'))\n .join('')\n .toUpperCase()}`,\n };\n}\n","import type { Package } from '../pack/index.js';\nimport type {\n ExcelAlignmentModel,\n ExcelBorderModel,\n ExcelBorderSideModel,\n ExcelCellFormatModel,\n ExcelColorModel,\n ExcelFillModel,\n ExcelFontModel,\n ExcelNumberFormatModel,\n ExcelStylesModel,\n} from './model.js';\nimport { SS_NS } from './namespaces.js';\nimport { getPart } from '../pack/index.js';\nimport { applyExcelTint, ooxmlArgbToExcelColor } from './color.js';\n\nconst DRAWING_NS = 'http://schemas.openxmlformats.org/drawingml/2006/main';\nconst THEME_COLOR_ORDER = [\n 'lt1',\n 'dk1',\n 'lt2',\n 'dk2',\n 'accent1',\n 'accent2',\n 'accent3',\n 'accent4',\n 'accent5',\n 'accent6',\n 'hlink',\n 'folHlink',\n] as const;\nconst INDEXED_COLORS = [\n '000000',\n 'FFFFFF',\n 'FF0000',\n '00FF00',\n '0000FF',\n 'FFFF00',\n 'FF00FF',\n '00FFFF',\n '000000',\n 'FFFFFF',\n 'FF0000',\n '00FF00',\n '0000FF',\n 'FFFF00',\n 'FF00FF',\n '00FFFF',\n '800000',\n '008000',\n '000080',\n '808000',\n '800080',\n '008080',\n 'C0C0C0',\n '808080',\n '9999FF',\n '993366',\n 'FFFFCC',\n 'CCFFFF',\n '660066',\n 'FF8080',\n '0066CC',\n 'CCCCFF',\n '000080',\n 'FF00FF',\n 'FFFF00',\n '00FFFF',\n '800080',\n '800000',\n '008080',\n '0000FF',\n '00CCFF',\n 'CCFFFF',\n 'CCFFCC',\n 'FFFF99',\n '99CCFF',\n 'FF99CC',\n 'CC99FF',\n 'FFCC99',\n '3366FF',\n '33CCCC',\n '99CC00',\n 'FFCC00',\n 'FF9900',\n 'FF6600',\n '666699',\n '969696',\n '003366',\n '339966',\n '003300',\n '333300',\n '993300',\n '993366',\n '333399',\n '333333',\n] as const;\n\ntype ThemeColors = Map<number, ExcelColorModel>;\n\nfunction firstChildNs(parent: Element, ns: string, localName: string): Element | null {\n return parent.getElementsByTagNameNS(ns, localName)[0] ?? null;\n}\n\nfunction childElementsNs(parent: Element, ns: string, localName: string): Element[] {\n const elements = parent.getElementsByTagNameNS(ns, localName);\n return Array.from(elements).filter((el) => el.parentElement === parent);\n}\n\nfunction parseOptionalNumber(raw: string | null): number | undefined {\n if (raw === null || raw === '') return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction parseBooleanAttr(raw: string | null): boolean | undefined {\n if (raw === null) return undefined;\n return raw === '1' || raw === 'true';\n}\n\nfunction setIfDefined<T extends object, K extends keyof T>(\n target: T,\n key: K,\n value: T[K] | undefined,\n): void {\n if (value !== undefined) target[key] = value;\n}\n\nfunction parseColor(\n el: Element | null | undefined,\n themeColors: ThemeColors,\n): ExcelColorModel | undefined {\n if (!el) return undefined;\n let color = ooxmlArgbToExcelColor(el.getAttribute('rgb') ?? undefined);\n const theme = parseOptionalNumber(el.getAttribute('theme'));\n if (!color && theme !== undefined) color = themeColors.get(theme);\n const indexed = parseOptionalNumber(el.getAttribute('indexed'));\n if (!color && indexed !== undefined) {\n const rgb =\n INDEXED_COLORS[indexed] ??\n (indexed === 64 ? '000000' : indexed === 65 ? 'FFFFFF' : undefined);\n if (rgb) color = { rgb: `#${rgb}` };\n }\n if (!color && parseBooleanAttr(el.getAttribute('auto'))) color = { rgb: '#000000' };\n return color ? applyExcelTint(color, parseOptionalNumber(el.getAttribute('tint'))) : undefined;\n}\n\nfunction parseThemeColors(pkg: Package): ThemeColors {\n const themeColors: ThemeColors = new Map();\n const themeDom = getPart(pkg, 'xl/theme/theme1.xml')?.xmlDom;\n if (!themeDom) return themeColors;\n const scheme = themeDom.getElementsByTagNameNS(DRAWING_NS, 'clrScheme')[0];\n if (!scheme) return themeColors;\n THEME_COLOR_ORDER.forEach((name, index) => {\n const slot = Array.from(scheme.getElementsByTagNameNS(DRAWING_NS, name)).find(\n (element) => element.parentElement === scheme,\n );\n const source = slot?.firstElementChild;\n const raw = source?.getAttribute('val') ?? source?.getAttribute('lastClr') ?? undefined;\n const color = ooxmlArgbToExcelColor(raw);\n if (color) themeColors.set(index, color);\n });\n return themeColors;\n}\n\nfunction parseValNumber(parent: Element, name: string): number | undefined {\n return parseOptionalNumber(firstChildNs(parent, SS_NS, name)?.getAttribute('val') ?? null);\n}\n\nfunction parseValString(parent: Element, name: string): string | undefined {\n return firstChildNs(parent, SS_NS, name)?.getAttribute('val') ?? undefined;\n}\n\nfunction emptyStyles(): ExcelStylesModel {\n return {\n numberFormats: [],\n fonts: [],\n fills: [],\n borders: [],\n cellFormats: [],\n };\n}\n\nfunction parseNumberFormats(stylesDom: Document): {\n list: ExcelNumberFormatModel[];\n byId: Map<number, string>;\n} {\n const list: ExcelNumberFormatModel[] = [];\n const byId = new Map<number, string>();\n const numFmtEls = stylesDom.getElementsByTagNameNS(SS_NS, 'numFmt');\n for (let i = 0; i < numFmtEls.length; i++) {\n const el = numFmtEls[i];\n if (!el) continue;\n const id = parseOptionalNumber(el.getAttribute('numFmtId'));\n const code = el.getAttribute('formatCode');\n if (id === undefined || code === null) continue;\n list.push({ id, code });\n byId.set(id, code);\n }\n return { list, byId };\n}\n\nfunction parseFonts(stylesDom: Document, themeColors: ThemeColors): ExcelFontModel[] {\n const fontsEl = stylesDom.getElementsByTagNameNS(SS_NS, 'fonts')[0];\n if (!fontsEl) return [];\n return childElementsNs(fontsEl, SS_NS, 'font').map((fontEl) => {\n const font: ExcelFontModel = {};\n setIfDefined(font, 'name', parseValString(fontEl, 'name'));\n setIfDefined(font, 'size', parseValNumber(fontEl, 'sz'));\n setIfDefined(font, 'family', parseValNumber(fontEl, 'family'));\n setIfDefined(font, 'charset', parseValNumber(fontEl, 'charset'));\n setIfDefined(font, 'scheme', parseValString(fontEl, 'scheme'));\n setIfDefined(font, 'bold', firstChildNs(fontEl, SS_NS, 'b') ? true : undefined);\n setIfDefined(font, 'italic', firstChildNs(fontEl, SS_NS, 'i') ? true : undefined);\n setIfDefined(font, 'underline', firstChildNs(fontEl, SS_NS, 'u') ? true : undefined);\n setIfDefined(font, 'color', parseColor(firstChildNs(fontEl, SS_NS, 'color'), themeColors));\n return font;\n });\n}\n\nfunction parseFills(stylesDom: Document, themeColors: ThemeColors): ExcelFillModel[] {\n const fillsEl = stylesDom.getElementsByTagNameNS(SS_NS, 'fills')[0];\n if (!fillsEl) return [];\n return childElementsNs(fillsEl, SS_NS, 'fill').map((fillEl) => {\n const pattern = firstChildNs(fillEl, SS_NS, 'patternFill');\n const fill: ExcelFillModel = {};\n if (!pattern) return fill;\n setIfDefined(fill, 'patternType', pattern.getAttribute('patternType') ?? undefined);\n setIfDefined(\n fill,\n 'foregroundColor',\n parseColor(firstChildNs(pattern, SS_NS, 'fgColor'), themeColors),\n );\n setIfDefined(\n fill,\n 'backgroundColor',\n parseColor(firstChildNs(pattern, SS_NS, 'bgColor'), themeColors),\n );\n return fill;\n });\n}\n\nfunction parseBorderSide(\n borderEl: Element,\n name: string,\n themeColors: ThemeColors,\n): ExcelBorderSideModel | undefined {\n const sideEl = firstChildNs(borderEl, SS_NS, name);\n if (!sideEl) return undefined;\n const side: ExcelBorderSideModel = {};\n setIfDefined(side, 'style', sideEl.getAttribute('style') ?? undefined);\n setIfDefined(side, 'color', parseColor(firstChildNs(sideEl, SS_NS, 'color'), themeColors));\n return Object.keys(side).length ? side : undefined;\n}\n\nfunction parseBorders(stylesDom: Document, themeColors: ThemeColors): ExcelBorderModel[] {\n const bordersEl = stylesDom.getElementsByTagNameNS(SS_NS, 'borders')[0];\n if (!bordersEl) return [];\n return childElementsNs(bordersEl, SS_NS, 'border').map((borderEl) => {\n const border: ExcelBorderModel = {};\n setIfDefined(border, 'left', parseBorderSide(borderEl, 'left', themeColors));\n setIfDefined(border, 'right', parseBorderSide(borderEl, 'right', themeColors));\n setIfDefined(border, 'top', parseBorderSide(borderEl, 'top', themeColors));\n setIfDefined(border, 'bottom', parseBorderSide(borderEl, 'bottom', themeColors));\n setIfDefined(border, 'diagonal', parseBorderSide(borderEl, 'diagonal', themeColors));\n return border;\n });\n}\n\nfunction parseAlignment(xfEl: Element): ExcelAlignmentModel | undefined {\n const alignmentEl = firstChildNs(xfEl, SS_NS, 'alignment');\n if (!alignmentEl) return undefined;\n const alignment: ExcelAlignmentModel = {};\n setIfDefined(alignment, 'horizontal', alignmentEl.getAttribute('horizontal') ?? undefined);\n setIfDefined(alignment, 'vertical', alignmentEl.getAttribute('vertical') ?? undefined);\n setIfDefined(\n alignment,\n 'textRotation',\n parseOptionalNumber(alignmentEl.getAttribute('textRotation')),\n );\n setIfDefined(alignment, 'wrapText', parseBooleanAttr(alignmentEl.getAttribute('wrapText')));\n setIfDefined(alignment, 'shrinkToFit', parseBooleanAttr(alignmentEl.getAttribute('shrinkToFit')));\n setIfDefined(alignment, 'indent', parseOptionalNumber(alignmentEl.getAttribute('indent')));\n return Object.keys(alignment).length ? alignment : undefined;\n}\n\nfunction parseCellFormats(\n stylesDom: Document,\n numberFormatsById: Map<number, string>,\n): ExcelCellFormatModel[] {\n const cellXfsEl = stylesDom.getElementsByTagNameNS(SS_NS, 'cellXfs')[0];\n if (!cellXfsEl) return [];\n return childElementsNs(cellXfsEl, SS_NS, 'xf').map((xfEl) => {\n const numberFormatId = parseOptionalNumber(xfEl.getAttribute('numFmtId'));\n const format: ExcelCellFormatModel = {};\n setIfDefined(format, 'numberFormatId', numberFormatId);\n setIfDefined(\n format,\n 'numberFormatCode',\n numberFormatId === undefined\n ? undefined\n : (numberFormatsById.get(numberFormatId) ?? builtInNumberFormatCode(numberFormatId)),\n );\n setIfDefined(format, 'fontId', parseOptionalNumber(xfEl.getAttribute('fontId')));\n setIfDefined(format, 'fillId', parseOptionalNumber(xfEl.getAttribute('fillId')));\n setIfDefined(format, 'borderId', parseOptionalNumber(xfEl.getAttribute('borderId')));\n setIfDefined(format, 'xfId', parseOptionalNumber(xfEl.getAttribute('xfId')));\n setIfDefined(\n format,\n 'applyNumberFormat',\n parseBooleanAttr(xfEl.getAttribute('applyNumberFormat')),\n );\n setIfDefined(format, 'applyFont', parseBooleanAttr(xfEl.getAttribute('applyFont')));\n setIfDefined(format, 'applyFill', parseBooleanAttr(xfEl.getAttribute('applyFill')));\n setIfDefined(format, 'applyBorder', parseBooleanAttr(xfEl.getAttribute('applyBorder')));\n setIfDefined(format, 'applyAlignment', parseBooleanAttr(xfEl.getAttribute('applyAlignment')));\n setIfDefined(format, 'alignment', parseAlignment(xfEl));\n return format;\n });\n}\n\nfunction builtInNumberFormatCode(id: number): string | undefined {\n const builtIns: Record<number, string> = {\n 0: 'General',\n 1: '0',\n 2: '0.00',\n 3: '#,##0',\n 4: '#,##0.00',\n 9: '0%',\n 10: '0.00%',\n };\n return builtIns[id];\n}\n\nexport function parseStyles(pkg: Package): ExcelStylesModel {\n const part = getPart(pkg, 'xl/styles.xml');\n if (!part?.xmlDom) return emptyStyles();\n const numberFormats = parseNumberFormats(part.xmlDom);\n const themeColors = parseThemeColors(pkg);\n return {\n numberFormats: numberFormats.list,\n fonts: parseFonts(part.xmlDom, themeColors),\n fills: parseFills(part.xmlDom, themeColors),\n borders: parseBorders(part.xmlDom, themeColors),\n cellFormats: parseCellFormats(part.xmlDom, numberFormats.byId),\n };\n}\n","import type { Package, Part } from '../pack/index.js';\nimport { getPart } from '../pack/index.js';\nimport type { ExcelDefinedNameModel } from './model.js';\nimport { OFFICE_REL_NS, REL_NS, SS_NS } from './namespaces.js';\n\ninterface Relationship {\n id: string;\n type: string;\n target: string;\n targetMode?: string;\n}\n\nexport interface WorkbookSheetRef {\n id: string;\n name: string;\n visibility?: string;\n relationshipId?: string;\n path?: string;\n}\n\nfunction requireXmlPart(pkg: Package, path: string): Part {\n const part = getPart(pkg, path);\n if (!part?.xmlDom) {\n throw new Error(`ExcelWorkbook: missing XML part ${path}`);\n }\n return part;\n}\n\nfunction optionalXmlPart(pkg: Package, path: string): Part | undefined {\n const part = getPart(pkg, path);\n return part?.xmlDom ? part : undefined;\n}\n\nfunction textOf(el: Element | null | undefined): string {\n if (!el) return '';\n return el.textContent ?? '';\n}\n\nfunction firstChildNs(parent: Element, ns: string, localName: string): Element | null {\n return parent.getElementsByTagNameNS(ns, localName)[0] ?? null;\n}\n\nfunction childElementsNs(parent: Element, ns: string, localName: string): Element[] {\n const elements = parent.getElementsByTagNameNS(ns, localName);\n return Array.from(elements).filter((el) => el.parentElement === parent);\n}\n\nfunction parseRelationships(part?: Part): Map<string, Relationship> {\n const rels = new Map<string, Relationship>();\n if (!part?.xmlDom) return rels;\n const relEls = part.xmlDom.getElementsByTagNameNS(REL_NS, 'Relationship');\n for (let i = 0; i < relEls.length; i++) {\n const rel = relEls[i];\n if (!rel) continue;\n const id = rel.getAttribute('Id');\n const type = rel.getAttribute('Type');\n const target = rel.getAttribute('Target');\n if (!id || !type || !target) continue;\n const model: Relationship = { id, type, target };\n const targetMode = rel.getAttribute('TargetMode');\n if (targetMode) model.targetMode = targetMode;\n rels.set(id, model);\n }\n return rels;\n}\n\nfunction dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nfunction normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (!part || part === '.') continue;\n if (part === '..') {\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nfunction resolveRelationshipTarget(sourcePartPath: string, target: string): string {\n if (target.startsWith('/')) return normalizePath(target.slice(1));\n return normalizePath(`${dirname(sourcePartPath)}/${target}`);\n}\n\nexport function parseWorkbookSheets(pkg: Package): WorkbookSheetRef[] {\n const workbook = requireXmlPart(pkg, 'xl/workbook.xml');\n const rels = parseRelationships(optionalXmlPart(pkg, 'xl/_rels/workbook.xml.rels'));\n const sheetsEl = firstChildNs(workbook.xmlDom!.documentElement, SS_NS, 'sheets');\n if (!sheetsEl) return [];\n\n return childElementsNs(sheetsEl, SS_NS, 'sheet').map((sheetEl, index) => {\n const relationshipId = sheetEl.getAttributeNS(OFFICE_REL_NS, 'id') ?? undefined;\n const rel = relationshipId ? rels.get(relationshipId) : undefined;\n const path = rel ? resolveRelationshipTarget('xl/workbook.xml', rel.target) : undefined;\n const name = sheetEl.getAttribute('name') ?? `Sheet${index + 1}`;\n const id = sheetEl.getAttribute('sheetId') ?? String(index + 1);\n const visibility = sheetEl.getAttribute('state') ?? undefined;\n return { id, name, visibility, relationshipId, path };\n });\n}\n\nexport function parseDefinedNames(pkg: Package): ExcelDefinedNameModel[] {\n const workbookPart = requireXmlPart(pkg, 'xl/workbook.xml');\n const definedNameEls = workbookPart.xmlDom!.getElementsByTagNameNS(SS_NS, 'definedName');\n const result: ExcelDefinedNameModel[] = [];\n for (let i = 0; i < definedNameEls.length; i++) {\n const el = definedNameEls[i];\n if (!el) continue;\n const name = el.getAttribute('name');\n if (!name) continue;\n const model: ExcelDefinedNameModel = {\n name,\n text: textOf(el),\n };\n const localSheetId = el.getAttribute('localSheetId');\n if (localSheetId !== null && localSheetId !== '') {\n const value = Number(localSheetId);\n if (Number.isFinite(value)) model.localSheetId = value;\n }\n result.push(model);\n }\n return result;\n}\n\nexport function parseSharedStrings(pkg: Package): string[] {\n const part = optionalXmlPart(pkg, 'xl/sharedStrings.xml');\n if (!part?.xmlDom) return [];\n const strings: string[] = [];\n const siEls = part.xmlDom.getElementsByTagNameNS(SS_NS, 'si');\n for (let i = 0; i < siEls.length; i++) {\n const si = siEls[i];\n if (!si) continue;\n const tEls = si.getElementsByTagNameNS(SS_NS, 't');\n let text = '';\n for (let j = 0; j < tEls.length; j++) {\n text += textOf(tEls[j]);\n }\n strings.push(text);\n }\n return strings;\n}\n","import type { Package, Part } from '../pack/index.js';\nimport { getPart } from '../pack/index.js';\nimport { OFFICE_REL_NS, REL_NS, SS_NS } from './namespaces.js';\nimport type {\n ExcelCellKind,\n ExcelCellModel,\n ExcelCommentModel,\n ExcelConditionalFormatModel,\n ExcelConditionalFormatRuleModel,\n ExcelDataValidationModel,\n ExcelChartModel,\n ExcelDrawingAnchorModel,\n ExcelDrawingMarkerModel,\n ExcelDrawingModel,\n ExcelDrawingObjectModel,\n ExcelImageModel,\n ExcelColumnModel,\n ExcelHyperlinkModel,\n ExcelMergedRangeModel,\n ExcelRowModel,\n ExcelSheetModel,\n ExcelSheetViewModel,\n ExcelPaneModel,\n ExcelSelectionModel,\n ExcelTableColumnModel,\n ExcelTableAutoFilterModel,\n ExcelTableFilterColumnModel,\n ExcelTableSortConditionModel,\n ExcelTableSortStateModel,\n ExcelTableModel,\n ExcelTableStyleModel,\n ExcelThreadedCommentModel,\n ExcelWorkbookModel,\n} from './model.js';\nimport { parseCellAddress } from './address.js';\nimport { parseStyles } from './styles-reader.js';\nimport type { WorkbookSheetRef } from './workbook-reader.js';\nimport { parseDefinedNames, parseSharedStrings, parseWorkbookSheets } from './workbook-reader.js';\n\ninterface Relationship {\n id: string;\n type: string;\n target: string;\n targetMode?: string;\n}\n\nfunction requireXmlPart(pkg: Package, path: string): Part {\n const part = getPart(pkg, path);\n if (!part?.xmlDom) {\n throw new Error(`ExcelWorkbook: missing XML part ${path}`);\n }\n return part;\n}\n\nfunction optionalXmlPart(pkg: Package, path: string): Part | undefined {\n const part = getPart(pkg, path);\n return part?.xmlDom ? part : undefined;\n}\n\nfunction textOf(el: Element | null | undefined): string {\n if (!el) return '';\n return el.textContent ?? '';\n}\n\nfunction firstChildNs(parent: Element, ns: string, localName: string): Element | null {\n return parent.getElementsByTagNameNS(ns, localName)[0] ?? null;\n}\n\nfunction childElementsNs(parent: Element, ns: string, localName: string): Element[] {\n const result: Element[] = [];\n for (let i = 0; i < parent.childNodes.length; i++) {\n const child = parent.childNodes[i];\n if (child?.nodeType !== 1) continue;\n const el = child as Element;\n if (el.namespaceURI === ns && el.localName === localName) {\n result.push(el);\n }\n }\n return result;\n}\n\nfunction parseRelationships(part?: Part): Map<string, Relationship> {\n const result = new Map<string, Relationship>();\n if (!part?.xmlDom) return result;\n\n const rels = part.xmlDom.getElementsByTagNameNS(REL_NS, 'Relationship');\n for (let i = 0; i < rels.length; i++) {\n const rel = rels[i];\n if (!rel) continue;\n const id = rel.getAttribute('Id');\n const type = rel.getAttribute('Type');\n const target = rel.getAttribute('Target');\n if (!id || !type || !target) continue;\n result.set(id, {\n id,\n type,\n target,\n targetMode: rel.getAttribute('TargetMode') ?? undefined,\n });\n }\n return result;\n}\n\nfunction dirname(path: string): string {\n const idx = path.lastIndexOf('/');\n return idx === -1 ? '' : path.slice(0, idx);\n}\n\nfunction normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (!part || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return parts.join('/');\n}\n\nfunction resolveRelationshipTarget(sourcePartPath: string, target: string): string {\n if (target.startsWith('/')) return normalizePath(target.slice(1));\n const base = dirname(sourcePartPath);\n return normalizePath(base ? `${base}/${target}` : target);\n}\n\nfunction parseNumber(raw: string | undefined): number | null {\n if (raw === undefined || raw === '') return null;\n const value = Number(raw);\n return Number.isFinite(value) ? value : null;\n}\n\nfunction parseOptionalNumber(raw: string | null): number | undefined {\n if (raw === null || raw === '') return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction parseBooleanAttr(raw: string | null): boolean | undefined {\n if (raw === null) return undefined;\n return raw === '1' || raw === 'true';\n}\n\nfunction setIfDefined<T extends object, K extends keyof T>(target: T, key: K, value: T[K] | undefined): void {\n if (value !== undefined) target[key] = value;\n}\n\nfunction parseCell(cell: Element, sharedStrings: string[]): ExcelCellModel | null {\n const address = cell.getAttribute('r');\n if (!address) return null;\n const { row, column } = parseCellAddress(address);\n const dataType = cell.getAttribute('t') ?? undefined;\n const styleIdRaw = cell.getAttribute('s');\n const formula = textOf(firstChildNs(cell, SS_NS, 'f')) || undefined;\n const rawValue = textOf(firstChildNs(cell, SS_NS, 'v')) || undefined;\n let kind: ExcelCellKind = formula ? 'formula' : 'blank';\n let value: string | number | boolean | null = null;\n let sharedStringIndex: number | undefined;\n\n if (dataType === 's') {\n sharedStringIndex = rawValue === undefined ? undefined : Number(rawValue);\n value =\n sharedStringIndex === undefined || !Number.isInteger(sharedStringIndex)\n ? null\n : (sharedStrings[sharedStringIndex] ?? null);\n kind = formula ? 'formula' : 'string';\n } else if (dataType === 'inlineStr') {\n const inline = firstChildNs(cell, SS_NS, 'is');\n const tEls = inline?.getElementsByTagNameNS(SS_NS, 't') ?? [];\n let text = '';\n for (let i = 0; i < tEls.length; i++) text += textOf(tEls[i]);\n value = text;\n kind = formula ? 'formula' : 'string';\n } else if (dataType === 'b') {\n value = rawValue === '1';\n kind = formula ? 'formula' : 'boolean';\n } else if (dataType === 'str') {\n value = rawValue ?? null;\n kind = formula ? 'formula' : 'string';\n } else if (dataType === 'e') {\n value = rawValue ?? null;\n kind = 'error';\n } else if (rawValue !== undefined) {\n value = parseNumber(rawValue);\n kind = formula ? 'formula' : 'number';\n }\n\n return {\n address,\n row,\n column,\n kind,\n value,\n rawValue,\n formula,\n dataType,\n styleId: styleIdRaw === null ? undefined : Number(styleIdRaw),\n sharedStringIndex,\n };\n}\n\nfunction parseColumns(sheetDom: Document): ExcelColumnModel[] {\n const colEls = sheetDom.getElementsByTagNameNS(SS_NS, 'col');\n const columns: ExcelColumnModel[] = [];\n for (let i = 0; i < colEls.length; i++) {\n const col = colEls[i];\n if (!col) continue;\n const min = parseOptionalNumber(col.getAttribute('min'));\n const max = parseOptionalNumber(col.getAttribute('max'));\n if (min === undefined || max === undefined) continue;\n const column: ExcelColumnModel = { min, max };\n setIfDefined(column, 'width', parseOptionalNumber(col.getAttribute('width')));\n setIfDefined(column, 'hidden', parseBooleanAttr(col.getAttribute('hidden')));\n setIfDefined(column, 'styleId', parseOptionalNumber(col.getAttribute('style')));\n setIfDefined(column, 'customWidth', parseBooleanAttr(col.getAttribute('customWidth')));\n columns.push(column);\n }\n return columns;\n}\n\nfunction parseRows(sheetDom: Document): ExcelRowModel[] {\n const rowEls = sheetDom.getElementsByTagNameNS(SS_NS, 'row');\n const rows: ExcelRowModel[] = [];\n for (let i = 0; i < rowEls.length; i++) {\n const row = rowEls[i];\n if (!row) continue;\n const index = parseOptionalNumber(row.getAttribute('r'));\n if (index === undefined) continue;\n const rowModel: ExcelRowModel = { index };\n setIfDefined(rowModel, 'height', parseOptionalNumber(row.getAttribute('ht')));\n setIfDefined(rowModel, 'hidden', parseBooleanAttr(row.getAttribute('hidden')));\n setIfDefined(rowModel, 'styleId', parseOptionalNumber(row.getAttribute('s')));\n setIfDefined(rowModel, 'customHeight', parseBooleanAttr(row.getAttribute('customHeight')));\n rows.push(rowModel);\n }\n return rows;\n}\n\nfunction parseMergedRanges(sheetDom: Document): ExcelMergedRangeModel[] {\n const mergeCellEls = sheetDom.getElementsByTagNameNS(SS_NS, 'mergeCell');\n const mergedRanges: ExcelMergedRangeModel[] = [];\n for (let i = 0; i < mergeCellEls.length; i++) {\n const ref = mergeCellEls[i]?.getAttribute('ref');\n if (ref) mergedRanges.push({ address: ref });\n }\n return mergedRanges;\n}\n\nfunction sheetRelationshipPartPath(sheetPath: string): string {\n return `${dirname(sheetPath)}/_rels/${sheetPath.slice(sheetPath.lastIndexOf('/') + 1)}.rels`;\n}\n\nfunction parseHyperlinks(pkg: Package, sheetPath: string, sheetDom: Document): ExcelHyperlinkModel[] {\n const rels = parseRelationships(optionalXmlPart(pkg, sheetRelationshipPartPath(sheetPath)));\n const hyperlinkEls = sheetDom.getElementsByTagNameNS(SS_NS, 'hyperlink');\n const hyperlinks: ExcelHyperlinkModel[] = [];\n for (let i = 0; i < hyperlinkEls.length; i++) {\n const hyperlink = hyperlinkEls[i];\n if (!hyperlink) continue;\n const ref = hyperlink.getAttribute('ref');\n if (!ref) continue;\n const relationshipId = hyperlink.getAttributeNS(OFFICE_REL_NS, 'id') ?? undefined;\n const rel = relationshipId ? rels.get(relationshipId) : undefined;\n const model: ExcelHyperlinkModel = { ref };\n setIfDefined(model, 'relationshipId', relationshipId);\n setIfDefined(\n model,\n 'target',\n rel ? (rel.targetMode === 'External' ? rel.target : resolveRelationshipTarget(sheetPath, rel.target)) : undefined,\n );\n setIfDefined(model, 'targetMode', rel?.targetMode);\n setIfDefined(model, 'location', hyperlink.getAttribute('location') ?? undefined);\n setIfDefined(model, 'display', hyperlink.getAttribute('display') ?? undefined);\n setIfDefined(model, 'tooltip', hyperlink.getAttribute('tooltip') ?? undefined);\n hyperlinks.push(model);\n }\n return hyperlinks;\n}\n\nfunction parseTableColumns(tableDom: Document): ExcelTableColumnModel[] {\n const tableColumnEls = tableDom.getElementsByTagNameNS(SS_NS, 'tableColumn');\n const columns: ExcelTableColumnModel[] = [];\n for (let i = 0; i < tableColumnEls.length; i++) {\n const el = tableColumnEls[i];\n if (!el) continue;\n const id = parseOptionalNumber(el.getAttribute('id'));\n const name = el.getAttribute('name');\n if (id === undefined || name === null) continue;\n const column: ExcelTableColumnModel = { id, name };\n setIfDefined(column, 'totalsRowLabel', el.getAttribute('totalsRowLabel') ?? undefined);\n setIfDefined(column, 'totalsRowFunction', el.getAttribute('totalsRowFunction') ?? undefined);\n columns.push(column);\n }\n return columns;\n}\n\nfunction parseTableStyle(tableDom: Document): ExcelTableStyleModel | undefined {\n const styleEl = tableDom.getElementsByTagNameNS(SS_NS, 'tableStyleInfo')[0];\n if (!styleEl) return undefined;\n const style: ExcelTableStyleModel = {};\n setIfDefined(style, 'name', styleEl.getAttribute('name') ?? undefined);\n setIfDefined(style, 'showFirstColumn', parseBooleanAttr(styleEl.getAttribute('showFirstColumn')));\n setIfDefined(style, 'showLastColumn', parseBooleanAttr(styleEl.getAttribute('showLastColumn')));\n setIfDefined(style, 'showRowStripes', parseBooleanAttr(styleEl.getAttribute('showRowStripes')));\n setIfDefined(style, 'showColumnStripes', parseBooleanAttr(styleEl.getAttribute('showColumnStripes')));\n return Object.keys(style).length ? style : undefined;\n}\n\nfunction parseTableAutoFilter(tableDom: Document): ExcelTableAutoFilterModel | undefined {\n const tableEl = tableDom.getElementsByTagNameNS(SS_NS, 'table')[0];\n const autoFilterEl = tableEl ? firstChildNs(tableEl, SS_NS, 'autoFilter') : null;\n if (!autoFilterEl) return undefined;\n const model: ExcelTableAutoFilterModel = {\n ref: autoFilterEl.getAttribute('ref') ?? undefined,\n filterColumns: parseFilterColumns(autoFilterEl),\n };\n setIfDefined(model, 'sortState', parseSortState(autoFilterEl));\n if (!model.filterColumns.length && !model.sortState) return undefined;\n return model;\n}\n\nfunction parseFilterColumns(autoFilterEl: Element): ExcelTableFilterColumnModel[] {\n return childElementsNs(autoFilterEl, SS_NS, 'filterColumn').flatMap((filterColumnEl) => {\n const colId = parseOptionalNumber(filterColumnEl.getAttribute('colId'));\n if (colId === undefined) return [];\n const filterColumn: ExcelTableFilterColumnModel = { colId };\n setIfDefined(filterColumn, 'hiddenButton', parseBooleanAttr(filterColumnEl.getAttribute('hiddenButton')));\n setIfDefined(filterColumn, 'showButton', parseBooleanAttr(filterColumnEl.getAttribute('showButton')));\n const filtersEl = firstChildNs(filterColumnEl, SS_NS, 'filters');\n const filters = filtersEl\n ? childElementsNs(filtersEl, SS_NS, 'filter')\n .map((filterEl) => filterEl.getAttribute('val') ?? undefined)\n .filter((value): value is string => value !== undefined)\n : [];\n if (filters.length) filterColumn.filters = filters;\n return [filterColumn];\n });\n}\n\nfunction parseSortState(autoFilterEl: Element): ExcelTableSortStateModel | undefined {\n const sortStateEl = firstChildNs(autoFilterEl, SS_NS, 'sortState');\n if (!sortStateEl) return undefined;\n const state: ExcelTableSortStateModel = { conditions: [] };\n setIfDefined(state, 'ref', sortStateEl.getAttribute('ref') ?? undefined);\n setIfDefined(state, 'caseSensitive', parseBooleanAttr(sortStateEl.getAttribute('caseSensitive')));\n setIfDefined(state, 'sortMethod', sortStateEl.getAttribute('sortMethod') ?? undefined);\n state.conditions = childElementsNs(sortStateEl, SS_NS, 'sortCondition').map((conditionEl) => {\n const condition: ExcelTableSortConditionModel = {};\n setIfDefined(condition, 'ref', conditionEl.getAttribute('ref') ?? undefined);\n setIfDefined(condition, 'descending', parseBooleanAttr(conditionEl.getAttribute('descending')));\n setIfDefined(condition, 'sortBy', conditionEl.getAttribute('sortBy') ?? undefined);\n return condition;\n });\n return state;\n}\n\nfunction parseTablePart(pkg: Package, relationshipId: string, path: string): ExcelTableModel {\n const part = optionalXmlPart(pkg, path);\n if (!part?.xmlDom) {\n return { relationshipId, path, columns: [] };\n }\n\n const tableEl = part.xmlDom.getElementsByTagNameNS(SS_NS, 'table')[0];\n if (!tableEl) {\n return { relationshipId, path, columns: [] };\n }\n\n const table: ExcelTableModel = {\n relationshipId,\n path,\n columns: parseTableColumns(part.xmlDom),\n };\n setIfDefined(table, 'id', parseOptionalNumber(tableEl.getAttribute('id')));\n setIfDefined(table, 'name', tableEl.getAttribute('name') ?? undefined);\n setIfDefined(table, 'displayName', tableEl.getAttribute('displayName') ?? undefined);\n setIfDefined(table, 'ref', tableEl.getAttribute('ref') ?? undefined);\n setIfDefined(table, 'headerRowCount', parseOptionalNumber(tableEl.getAttribute('headerRowCount')));\n setIfDefined(table, 'totalsRowCount', parseOptionalNumber(tableEl.getAttribute('totalsRowCount')));\n setIfDefined(table, 'totalsRowShown', parseBooleanAttr(tableEl.getAttribute('totalsRowShown')));\n const autoFilterEl = firstChildNs(tableEl, SS_NS, 'autoFilter');\n const autoFilter = parseTableAutoFilter(part.xmlDom);\n setIfDefined(table, 'autoFilterRef', autoFilterEl?.getAttribute('ref') ?? undefined);\n setIfDefined(table, 'autoFilter', autoFilter);\n setIfDefined(table, 'style', parseTableStyle(part.xmlDom));\n return table;\n}\n\nfunction parseTables(pkg: Package, sheetPath: string, sheetDom: Document): ExcelTableModel[] {\n const rels = parseRelationships(optionalXmlPart(pkg, sheetRelationshipPartPath(sheetPath)));\n const tablePartEls = sheetDom.getElementsByTagNameNS(SS_NS, 'tablePart');\n const tables: ExcelTableModel[] = [];\n for (let i = 0; i < tablePartEls.length; i++) {\n const relationshipId = tablePartEls[i]?.getAttributeNS(OFFICE_REL_NS, 'id') ?? undefined;\n if (!relationshipId) continue;\n const rel = rels.get(relationshipId);\n if (!rel) {\n tables.push({ relationshipId, columns: [] });\n continue;\n }\n tables.push(parseTablePart(pkg, relationshipId, resolveRelationshipTarget(sheetPath, rel.target)));\n }\n return tables;\n}\n\nfunction parseDataValidations(sheetDom: Document): ExcelDataValidationModel[] {\n const validationEls = sheetDom.getElementsByTagNameNS(SS_NS, 'dataValidation');\n const validations: ExcelDataValidationModel[] = [];\n for (let i = 0; i < validationEls.length; i++) {\n const el = validationEls[i];\n if (!el) continue;\n const validation: ExcelDataValidationModel = {};\n setIfDefined(validation, 'sqref', el.getAttribute('sqref') ?? undefined);\n setIfDefined(validation, 'type', el.getAttribute('type') ?? undefined);\n setIfDefined(validation, 'operator', el.getAttribute('operator') ?? undefined);\n setIfDefined(validation, 'allowBlank', parseBooleanAttr(el.getAttribute('allowBlank')));\n setIfDefined(validation, 'showDropDown', parseBooleanAttr(el.getAttribute('showDropDown')));\n setIfDefined(validation, 'showInputMessage', parseBooleanAttr(el.getAttribute('showInputMessage')));\n setIfDefined(validation, 'showErrorMessage', parseBooleanAttr(el.getAttribute('showErrorMessage')));\n setIfDefined(validation, 'errorStyle', el.getAttribute('errorStyle') ?? undefined);\n setIfDefined(validation, 'errorTitle', el.getAttribute('errorTitle') ?? undefined);\n setIfDefined(validation, 'error', el.getAttribute('error') ?? undefined);\n setIfDefined(validation, 'promptTitle', el.getAttribute('promptTitle') ?? undefined);\n setIfDefined(validation, 'prompt', el.getAttribute('prompt') ?? undefined);\n setIfDefined(validation, 'formula1', textOf(firstChildNs(el, SS_NS, 'formula1')) || undefined);\n setIfDefined(validation, 'formula2', textOf(firstChildNs(el, SS_NS, 'formula2')) || undefined);\n validations.push(validation);\n }\n return validations;\n}\n\nfunction parseConditionalFormatRule(ruleEl: Element): ExcelConditionalFormatRuleModel {\n const rule: ExcelConditionalFormatRuleModel = { formulas: [] };\n setIfDefined(rule, 'type', ruleEl.getAttribute('type') ?? undefined);\n setIfDefined(rule, 'priority', parseOptionalNumber(ruleEl.getAttribute('priority')));\n setIfDefined(rule, 'operator', ruleEl.getAttribute('operator') ?? undefined);\n setIfDefined(rule, 'dxfId', parseOptionalNumber(ruleEl.getAttribute('dxfId')));\n setIfDefined(rule, 'stopIfTrue', parseBooleanAttr(ruleEl.getAttribute('stopIfTrue')));\n setIfDefined(rule, 'aboveAverage', parseBooleanAttr(ruleEl.getAttribute('aboveAverage')));\n setIfDefined(rule, 'percent', parseBooleanAttr(ruleEl.getAttribute('percent')));\n setIfDefined(rule, 'bottom', parseBooleanAttr(ruleEl.getAttribute('bottom')));\n setIfDefined(rule, 'rank', parseOptionalNumber(ruleEl.getAttribute('rank')));\n setIfDefined(rule, 'text', ruleEl.getAttribute('text') ?? undefined);\n setIfDefined(rule, 'timePeriod', ruleEl.getAttribute('timePeriod') ?? undefined);\n const formulaEls = childElementsNs(ruleEl, SS_NS, 'formula');\n rule.formulas = formulaEls.map((formula) => textOf(formula));\n return rule;\n}\n\nfunction parseConditionalFormats(sheetDom: Document): ExcelConditionalFormatModel[] {\n const conditionalFormattingEls = sheetDom.getElementsByTagNameNS(SS_NS, 'conditionalFormatting');\n const conditionalFormats: ExcelConditionalFormatModel[] = [];\n for (let i = 0; i < conditionalFormattingEls.length; i++) {\n const el = conditionalFormattingEls[i];\n if (!el) continue;\n const format: ExcelConditionalFormatModel = {\n rules: childElementsNs(el, SS_NS, 'cfRule').map((rule) => parseConditionalFormatRule(rule)),\n };\n setIfDefined(format, 'sqref', el.getAttribute('sqref') ?? undefined);\n conditionalFormats.push(format);\n }\n return conditionalFormats;\n}\n\nfunction relationshipTargetsByType(pkg: Package, sheetPath: string, typeSuffix: string): Array<{ id: string; path: string }> {\n const rels = parseRelationships(optionalXmlPart(pkg, sheetRelationshipPartPath(sheetPath)));\n const targets: Array<{ id: string; path: string }> = [];\n for (const rel of rels.values()) {\n if (rel.type.endsWith(typeSuffix)) {\n targets.push({ id: rel.id, path: resolveRelationshipTarget(sheetPath, rel.target) });\n }\n }\n return targets;\n}\n\nfunction parseComments(pkg: Package, sheetPath: string): ExcelCommentModel[] {\n const targets = relationshipTargetsByType(pkg, sheetPath, '/comments');\n const comments: ExcelCommentModel[] = [];\n for (const target of targets) {\n const part = optionalXmlPart(pkg, target.path);\n if (!part?.xmlDom) continue;\n const authors = Array.from(part.xmlDom.getElementsByTagNameNS(SS_NS, 'author')).map((author) => textOf(author));\n const commentEls = part.xmlDom.getElementsByTagNameNS(SS_NS, 'comment');\n for (let i = 0; i < commentEls.length; i++) {\n const el = commentEls[i];\n if (!el) continue;\n const ref = el.getAttribute('ref');\n if (!ref) continue;\n const authorId = parseOptionalNumber(el.getAttribute('authorId'));\n const comment: ExcelCommentModel = {\n ref,\n text: textOf(firstChildNs(el, SS_NS, 'text')),\n };\n setIfDefined(comment, 'authorId', authorId);\n setIfDefined(comment, 'author', authorId === undefined ? undefined : authors[authorId]);\n setIfDefined(comment, 'shapeId', parseOptionalNumber(el.getAttribute('shapeId')));\n comments.push(comment);\n }\n }\n return comments;\n}\n\nfunction parseThreadedComments(pkg: Package, sheetPath: string): ExcelThreadedCommentModel[] {\n const targets = relationshipTargetsByType(pkg, sheetPath, '/threadedComment');\n const comments: ExcelThreadedCommentModel[] = [];\n for (const target of targets) {\n const part = optionalXmlPart(pkg, target.path);\n if (!part?.xmlDom) continue;\n const commentEls = part.xmlDom.getElementsByTagNameNS('*', 'threadedComment');\n for (let i = 0; i < commentEls.length; i++) {\n const el = commentEls[i];\n if (!el) continue;\n const ref = el.getAttribute('ref');\n if (!ref) continue;\n const comment: ExcelThreadedCommentModel = {\n ref,\n text: textOf(firstChildNs(el, el.namespaceURI ?? '', 'text')) || textOf(el.getElementsByTagNameNS('*', 'text')[0]),\n };\n setIfDefined(comment, 'id', el.getAttribute('id') ?? undefined);\n setIfDefined(comment, 'personId', el.getAttribute('personId') ?? undefined);\n setIfDefined(comment, 'dateTime', el.getAttribute('dT') ?? undefined);\n comments.push(comment);\n }\n }\n return comments;\n}\n\nfunction firstDescendantLocal(parent: Element, localName: string): Element | null {\n return parent.getElementsByTagNameNS('*', localName)[0] ?? null;\n}\n\nfunction descendantsLocal(parent: Element | Document, localName: string): Element[] {\n return Array.from(parent.getElementsByTagNameNS('*', localName));\n}\n\nfunction parseDrawingMarker(parent: Element, localName: string): ExcelDrawingMarkerModel | undefined {\n const markerEl = firstDescendantLocal(parent, localName);\n if (!markerEl) return undefined;\n const marker: ExcelDrawingMarkerModel = {};\n setIfDefined(marker, 'column', parseOptionalNumber(firstDescendantLocal(markerEl, 'col')?.textContent ?? null));\n setIfDefined(marker, 'columnOffset', parseOptionalNumber(firstDescendantLocal(markerEl, 'colOff')?.textContent ?? null));\n setIfDefined(marker, 'row', parseOptionalNumber(firstDescendantLocal(markerEl, 'row')?.textContent ?? null));\n setIfDefined(marker, 'rowOffset', parseOptionalNumber(firstDescendantLocal(markerEl, 'rowOff')?.textContent ?? null));\n return Object.keys(marker).length ? marker : undefined;\n}\n\nfunction drawingObjectName(parent: Element): string | undefined {\n return firstDescendantLocal(parent, 'cNvPr')?.getAttribute('name') ?? undefined;\n}\n\nfunction parseDrawingObject(anchorEl: Element, rels: Map<string, Relationship>, drawingPath: string): ExcelDrawingObjectModel | undefined {\n const chartEl = firstDescendantLocal(anchorEl, 'chart');\n if (chartEl) {\n const relationshipId = chartEl.getAttributeNS(OFFICE_REL_NS, 'id') ?? undefined;\n const rel = relationshipId ? rels.get(relationshipId) : undefined;\n return {\n kind: 'chart',\n name: drawingObjectName(anchorEl),\n relationshipId,\n targetPath: rel ? resolveRelationshipTarget(drawingPath, rel.target) : undefined,\n targetMode: rel?.targetMode,\n };\n }\n\n const blipEl = firstDescendantLocal(anchorEl, 'blip');\n if (blipEl) {\n const relationshipId =\n blipEl.getAttributeNS(OFFICE_REL_NS, 'embed') ?? blipEl.getAttributeNS(OFFICE_REL_NS, 'link') ?? undefined;\n const rel = relationshipId ? rels.get(relationshipId) : undefined;\n return {\n kind: 'image',\n name: drawingObjectName(anchorEl),\n relationshipId,\n targetPath: rel ? resolveRelationshipTarget(drawingPath, rel.target) : undefined,\n targetMode: rel?.targetMode,\n };\n }\n\n if (firstDescendantLocal(anchorEl, 'sp')) {\n return { kind: 'shape', name: drawingObjectName(anchorEl) };\n }\n if (firstDescendantLocal(anchorEl, 'graphicFrame')) {\n return { kind: 'graphicFrame', name: drawingObjectName(anchorEl) };\n }\n return undefined;\n}\n\nfunction parseDrawingAnchors(drawingDom: Document, rels: Map<string, Relationship>, drawingPath: string): ExcelDrawingAnchorModel[] {\n const anchors: ExcelDrawingAnchorModel[] = [];\n const specs = [\n ['twoCellAnchor', 'twoCell'],\n ['oneCellAnchor', 'oneCell'],\n ['absoluteAnchor', 'absolute'],\n ] as const;\n\n for (const [localName, kind] of specs) {\n for (const anchorEl of descendantsLocal(drawingDom, localName)) {\n const anchor: ExcelDrawingAnchorModel = { kind };\n setIfDefined(anchor, 'from', parseDrawingMarker(anchorEl, 'from'));\n setIfDefined(anchor, 'to', parseDrawingMarker(anchorEl, 'to'));\n setIfDefined(anchor, 'object', parseDrawingObject(anchorEl, rels, drawingPath));\n anchors.push(anchor);\n }\n }\n return anchors;\n}\n\nfunction drawingRelationshipPartPath(drawingPath: string): string {\n return `${dirname(drawingPath)}/_rels/${drawingPath.slice(drawingPath.lastIndexOf('/') + 1)}.rels`;\n}\n\nfunction chartTitle(chartDom: Document): string | undefined {\n const titleEl = descendantsLocal(chartDom, 'title')[0];\n if (!titleEl) return undefined;\n const text = descendantsLocal(titleEl, 't').map((el) => textOf(el)).join('');\n return text || undefined;\n}\n\nfunction parseChartPart(pkg: Package, relationshipId: string | undefined, drawingPath: string, path: string): ExcelChartModel {\n const part = optionalXmlPart(pkg, path);\n const chart: ExcelChartModel = { relationshipId, drawingPath, path, formulaRefs: [] };\n if (!part?.xmlDom) return chart;\n setIfDefined(chart, 'title', chartTitle(part.xmlDom));\n chart.formulaRefs = descendantsLocal(part.xmlDom, 'f').map((el) => textOf(el)).filter(Boolean);\n return chart;\n}\n\nfunction parseDrawings(pkg: Package, sheetPath: string, sheetDom: Document): {\n drawings: ExcelDrawingModel[];\n charts: ExcelChartModel[];\n images: ExcelImageModel[];\n} {\n const sheetRels = parseRelationships(optionalXmlPart(pkg, sheetRelationshipPartPath(sheetPath)));\n const drawings: ExcelDrawingModel[] = [];\n const charts: ExcelChartModel[] = [];\n const images: ExcelImageModel[] = [];\n\n for (const drawingEl of descendantsLocal(sheetDom, 'drawing')) {\n const relationshipId = drawingEl.getAttributeNS(OFFICE_REL_NS, 'id') ?? undefined;\n if (!relationshipId) continue;\n const sheetRel = sheetRels.get(relationshipId);\n const drawingPath = sheetRel ? resolveRelationshipTarget(sheetPath, sheetRel.target) : undefined;\n if (!drawingPath) {\n drawings.push({ relationshipId, anchors: [] });\n continue;\n }\n\n const drawingPart = optionalXmlPart(pkg, drawingPath);\n const drawingRels = parseRelationships(optionalXmlPart(pkg, drawingRelationshipPartPath(drawingPath)));\n const anchors = drawingPart?.xmlDom ? parseDrawingAnchors(drawingPart.xmlDom, drawingRels, drawingPath) : [];\n drawings.push({ relationshipId, path: drawingPath, anchors });\n\n for (const anchor of anchors) {\n if (anchor.object?.kind === 'chart' && anchor.object.targetPath) {\n charts.push(parseChartPart(pkg, anchor.object.relationshipId, drawingPath, anchor.object.targetPath));\n } else if (anchor.object?.kind === 'image' && anchor.object.targetPath) {\n images.push({\n relationshipId: anchor.object.relationshipId,\n drawingPath,\n path: anchor.object.targetPath,\n targetMode: anchor.object.targetMode,\n name: anchor.object.name,\n });\n }\n }\n }\n\n return { drawings, charts, images };\n}\n\nfunction parsePane(sheetViewEl: Element): ExcelPaneModel | undefined {\n const paneEl = firstChildNs(sheetViewEl, SS_NS, 'pane');\n if (!paneEl) return undefined;\n const pane: ExcelPaneModel = {};\n setIfDefined(pane, 'xSplit', parseOptionalNumber(paneEl.getAttribute('xSplit')));\n setIfDefined(pane, 'ySplit', parseOptionalNumber(paneEl.getAttribute('ySplit')));\n setIfDefined(pane, 'topLeftCell', paneEl.getAttribute('topLeftCell') ?? undefined);\n setIfDefined(pane, 'activePane', paneEl.getAttribute('activePane') ?? undefined);\n setIfDefined(pane, 'state', paneEl.getAttribute('state') ?? undefined);\n return Object.keys(pane).length ? pane : undefined;\n}\n\nfunction parseSelections(sheetViewEl: Element): ExcelSelectionModel[] {\n return childElementsNs(sheetViewEl, SS_NS, 'selection').map((selectionEl) => {\n const selection: ExcelSelectionModel = {};\n setIfDefined(selection, 'pane', selectionEl.getAttribute('pane') ?? undefined);\n setIfDefined(selection, 'activeCell', selectionEl.getAttribute('activeCell') ?? undefined);\n setIfDefined(selection, 'activeCellId', parseOptionalNumber(selectionEl.getAttribute('activeCellId')));\n setIfDefined(selection, 'sqref', selectionEl.getAttribute('sqref') ?? undefined);\n return selection;\n });\n}\n\nfunction parseSheetViews(sheetDom: Document): ExcelSheetViewModel[] {\n const sheetViewEls = sheetDom.getElementsByTagNameNS(SS_NS, 'sheetView');\n const views: ExcelSheetViewModel[] = [];\n for (let i = 0; i < sheetViewEls.length; i++) {\n const el = sheetViewEls[i];\n if (!el) continue;\n const view: ExcelSheetViewModel = { selections: parseSelections(el) };\n setIfDefined(view, 'workbookViewId', parseOptionalNumber(el.getAttribute('workbookViewId')));\n setIfDefined(view, 'view', el.getAttribute('view') ?? undefined);\n setIfDefined(view, 'tabSelected', parseBooleanAttr(el.getAttribute('tabSelected')));\n setIfDefined(view, 'showGridLines', parseBooleanAttr(el.getAttribute('showGridLines')));\n setIfDefined(view, 'showRowColHeaders', parseBooleanAttr(el.getAttribute('showRowColHeaders')));\n setIfDefined(view, 'zoomScale', parseOptionalNumber(el.getAttribute('zoomScale')));\n setIfDefined(view, 'zoomScaleNormal', parseOptionalNumber(el.getAttribute('zoomScaleNormal')));\n setIfDefined(view, 'topLeftCell', el.getAttribute('topLeftCell') ?? undefined);\n setIfDefined(view, 'pane', parsePane(el));\n views.push(view);\n }\n return views;\n}\n\nfunction parseSheet(pkg: Package, ref: WorkbookSheetRef, sharedStrings: string[]): ExcelSheetModel {\n if (!ref.path) {\n return {\n ...ref,\n sheetViews: [],\n columns: [],\n rows: [],\n mergedRanges: [],\n hyperlinks: [],\n tables: [],\n dataValidations: [],\n conditionalFormats: [],\n comments: [],\n threadedComments: [],\n drawings: [],\n charts: [],\n images: [],\n cells: [],\n };\n }\n const part = optionalXmlPart(pkg, ref.path);\n if (!part?.xmlDom) {\n return {\n ...ref,\n sheetViews: [],\n columns: [],\n rows: [],\n mergedRanges: [],\n hyperlinks: [],\n tables: [],\n dataValidations: [],\n conditionalFormats: [],\n comments: [],\n threadedComments: [],\n drawings: [],\n charts: [],\n images: [],\n cells: [],\n };\n }\n const dimension = part.xmlDom.getElementsByTagNameNS(SS_NS, 'dimension')[0]?.getAttribute('ref') ?? undefined;\n const cellEls = part.xmlDom.getElementsByTagNameNS(SS_NS, 'c');\n const cells: ExcelCellModel[] = [];\n for (let i = 0; i < cellEls.length; i++) {\n const parsed = cellEls[i] ? parseCell(cellEls[i]!, sharedStrings) : null;\n if (parsed) cells.push(parsed);\n }\n const drawingInfo = parseDrawings(pkg, ref.path, part.xmlDom);\n return {\n ...ref,\n dimension,\n sheetViews: parseSheetViews(part.xmlDom),\n columns: parseColumns(part.xmlDom),\n rows: parseRows(part.xmlDom),\n mergedRanges: parseMergedRanges(part.xmlDom),\n hyperlinks: parseHyperlinks(pkg, ref.path, part.xmlDom),\n tables: parseTables(pkg, ref.path, part.xmlDom),\n dataValidations: parseDataValidations(part.xmlDom),\n conditionalFormats: parseConditionalFormats(part.xmlDom),\n comments: parseComments(pkg, ref.path),\n threadedComments: parseThreadedComments(pkg, ref.path),\n drawings: drawingInfo.drawings,\n charts: drawingInfo.charts,\n images: drawingInfo.images,\n cells,\n };\n}\n\nexport function readWorkbookModel(pkg: Package): ExcelWorkbookModel {\n const sharedStrings = parseSharedStrings(pkg);\n const sheetRefs = parseWorkbookSheets(pkg);\n return {\n sharedStrings,\n definedNames: parseDefinedNames(pkg),\n styles: parseStyles(pkg),\n sheets: sheetRefs.map((sheet) => parseSheet(pkg, sheet, sharedStrings)),\n };\n}\n","import {\n createPackage,\n createXmlPart,\n deletePart,\n getPart,\n markDirty,\n setPart,\n type Package,\n type Part,\n} from '../pack/index.js';\nimport { parseXmlDocument } from 'slimdom';\nimport { OFFICE_REL_NS, REL_NS, SS_NS } from './namespaces.js';\nimport type {\n ExcelAlignmentModel,\n ExcelBorderModel,\n ExcelBorderSideModel,\n ExcelCellModel,\n ExcelChartModel,\n ExcelColumnModel,\n ExcelCommentModel,\n ExcelConditionalFormatModel,\n ExcelColorModel,\n ExcelDataValidationModel,\n ExcelDrawingMarkerModel,\n ExcelDrawingModel,\n ExcelFillModel,\n ExcelFontModel,\n ExcelHyperlinkModel,\n ExcelRowModel,\n ExcelSheetModel,\n ExcelSheetViewModel,\n ExcelStylesModel,\n ExcelTableModel,\n ExcelTableAutoFilterModel,\n ExcelTableFilterColumnModel,\n ExcelTableSortStateModel,\n ExcelTableSortConditionModel,\n ExcelThreadedCommentModel,\n ExcelWorkbookModel,\n} from './model.js';\nimport { excelColorToOoxmlArgb } from './color.js';\n\nconst XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\nconst CONTENT_TYPES_NS = 'http://schemas.openxmlformats.org/package/2006/content-types';\nconst CONTENT_TYPES_CONTENT_TYPE = 'application/xml';\nconst WORKBOOK_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml';\nconst WORKSHEET_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml';\nconst STYLES_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml';\nconst TC_NS = 'http://schemas.microsoft.com/office/spreadsheetml/2018/threadedcomments';\nconst RELS_CONTENT_TYPE = 'application/vnd.openxmlformats-package.relationships+xml';\nconst HYPERLINK_REL_TYPE =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink';\nconst COMMENTS_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml';\nconst COMMENTS_REL_TYPE =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments';\nconst THREADED_COMMENTS_REL_TYPE =\n 'http://schemas.microsoft.com/office/2017/10/relationships/threadedComment';\nconst TABLE_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml';\nconst TABLE_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table';\nconst WORKSHEET_REL_TYPE =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet';\nconst DRAWING_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.drawing+xml';\nconst DRAWING_REL_TYPE =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing';\nconst CHART_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml';\nconst CHART_REL_TYPE =\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart';\nconst DRAWING_NS = 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing';\nconst A_NS = 'http://schemas.openxmlformats.org/drawingml/2006/main';\nconst CHART_NS = 'http://schemas.openxmlformats.org/drawingml/2006/chart';\n\ninterface Relationship {\n id: string;\n type: string;\n target: string;\n targetMode?: string;\n}\n\nexport function syncWorkbookModelToPackage(pkg: Package, model: ExcelWorkbookModel): void {\n syncStylesPart(pkg, model.styles);\n syncWorkbookRelationships(pkg, model);\n syncWorkbookPart(pkg, model);\n for (const sheet of model.sheets) {\n syncWorksheetRelationships(pkg, sheet);\n syncWorksheetTableRelationships(pkg, sheet);\n syncWorksheetCommentRelationships(pkg, sheet);\n syncWorksheetThreadedCommentRelationships(pkg, sheet);\n syncWorksheetDrawingRelationships(pkg, sheet);\n syncWorksheetPart(pkg, sheet);\n syncTableParts(pkg, sheet);\n syncCommentParts(pkg, sheet);\n syncThreadedCommentParts(pkg, sheet);\n syncDrawingParts(pkg, sheet);\n syncChartParts(pkg, sheet);\n }\n}\n\nfunction syncWorkbookRelationships(pkg: Package, model: ExcelWorkbookModel): void {\n const relsPath = 'xl/_rels/workbook.xml.rels';\n const rels = parseRelationships(getPart(pkg, relsPath));\n const usedSheetRelIds = new Set<string>();\n let changed = false;\n\n for (const sheet of model.sheets) {\n sheet.path ??= nextIndexedPartPath(pkg, 'xl/worksheets/sheet', '.xml');\n const target = relativeRelationshipTarget('xl/workbook.xml', sheet.path);\n const id = sheet.relationshipId || findReusableRelationshipId(rels, WORKSHEET_REL_TYPE, target);\n if (id) {\n sheet.relationshipId = id;\n } else {\n sheet.relationshipId = nextRelationshipId(rels);\n changed = true;\n }\n usedSheetRelIds.add(sheet.relationshipId);\n const nextRel: Relationship = {\n id: sheet.relationshipId,\n type: WORKSHEET_REL_TYPE,\n target,\n };\n const previous = rels.get(nextRel.id);\n if (!previous || !sameRelationship(previous, nextRel)) {\n rels.set(nextRel.id, nextRel);\n changed = true;\n }\n if (!getPart(pkg, sheet.path)) {\n setXmlPart(\n pkg,\n sheet.path,\n WORKSHEET_CONTENT_TYPE,\n `${XML_DECL}<worksheet xmlns=\"${SS_NS}\" xmlns:r=\"${OFFICE_REL_NS}\"/>`,\n );\n setXmlPart(\n pkg,\n relationshipPartPath(sheet.path),\n RELS_CONTENT_TYPE,\n serializeRelationships(new Map()),\n );\n changed = true;\n }\n ensureContentTypeOverride(pkg, sheet.path, WORKSHEET_CONTENT_TYPE);\n }\n\n for (const rel of Array.from(rels.values())) {\n if (rel.type !== WORKSHEET_REL_TYPE || usedSheetRelIds.has(rel.id)) continue;\n const targetPath = resolveRelationshipTarget('xl/workbook.xml', rel.target);\n rels.delete(rel.id);\n deletePart(pkg, targetPath);\n deletePart(pkg, relationshipPartPath(targetPath));\n removeContentTypeOverride(pkg, targetPath);\n changed = true;\n }\n\n if (changed) writeRelationshipsPart(pkg, relsPath, rels);\n}\n\nfunction syncStylesPart(pkg: Package, styles: ExcelStylesModel): void {\n const normalized = normalizeStyles(styles);\n styles.numberFormats = normalized.numberFormats;\n styles.fonts = normalized.fonts;\n styles.fills = normalized.fills;\n styles.borders = normalized.borders;\n styles.cellFormats = normalized.cellFormats;\n const xml = serializeStyles(styles);\n const part = getPart(pkg, 'xl/styles.xml');\n if (part?.xmlDom) {\n replacePartXml(part, xml);\n } else {\n setXmlPart(pkg, 'xl/styles.xml', STYLES_CONTENT_TYPE, xml);\n }\n ensureContentTypeOverride(pkg, 'xl/styles.xml', STYLES_CONTENT_TYPE);\n}\n\nexport function createWorkbookPackageFromModel(model: ExcelWorkbookModel): Package {\n const pkg = createPackage();\n const standaloneModel = cloneStandaloneWorkbookModel(model);\n seedWorkbookPackage(pkg, standaloneModel);\n syncWorkbookModelToPackage(pkg, standaloneModel);\n return pkg;\n}\n\nfunction cloneStandaloneWorkbookModel(model: ExcelWorkbookModel): ExcelWorkbookModel {\n const clone = JSON.parse(JSON.stringify(model)) as ExcelWorkbookModel;\n for (const sheet of clone.sheets) {\n sheet.threadedComments = [];\n const creatableCharts = sheet.charts.filter((chart) => chart.type);\n sheet.charts = creatableCharts;\n sheet.drawings = sheet.drawings\n .map((drawing) => ({\n ...drawing,\n anchors: drawing.anchors.filter(\n (anchor) =>\n anchor.object?.kind === 'chart' &&\n creatableCharts.some((chart) => chart.path === anchor.object?.targetPath || chart.title === anchor.object?.name),\n ),\n }))\n .filter((drawing) => drawing.anchors.length > 0);\n sheet.images = [];\n }\n return clone;\n}\n\nfunction seedWorkbookPackage(pkg: Package, model: ExcelWorkbookModel): void {\n setXmlPart(\n pkg,\n '[Content_Types].xml',\n CONTENT_TYPES_CONTENT_TYPE,\n serializeBaseContentTypes(model),\n );\n setXmlPart(\n pkg,\n '_rels/.rels',\n RELS_CONTENT_TYPE,\n serializeRelationships(\n new Map([\n [\n 'rId1',\n {\n id: 'rId1',\n type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',\n target: 'xl/workbook.xml',\n },\n ],\n ]),\n ),\n );\n\n const workbookRels = new Map<string, Relationship>();\n model.sheets.forEach((sheet, index) => {\n sheet.relationshipId ||= `rId${index + 1}`;\n sheet.path ||= `xl/worksheets/sheet${index + 1}.xml`;\n workbookRels.set(sheet.relationshipId, {\n id: sheet.relationshipId,\n type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',\n target: `worksheets/sheet${index + 1}.xml`,\n });\n setXmlPart(\n pkg,\n sheet.path,\n WORKSHEET_CONTENT_TYPE,\n `${XML_DECL}<worksheet xmlns=\"${SS_NS}\" xmlns:r=\"${OFFICE_REL_NS}\"/>`,\n );\n setXmlPart(\n pkg,\n relationshipPartPath(sheet.path),\n RELS_CONTENT_TYPE,\n serializeRelationships(new Map()),\n );\n });\n\n setXmlPart(\n pkg,\n 'xl/workbook.xml',\n WORKBOOK_CONTENT_TYPE,\n `${XML_DECL}<workbook xmlns=\"${SS_NS}\" xmlns:r=\"${OFFICE_REL_NS}\"><sheets/></workbook>`,\n );\n setXmlPart(\n pkg,\n 'xl/_rels/workbook.xml.rels',\n RELS_CONTENT_TYPE,\n serializeRelationships(workbookRels),\n );\n}\n\nfunction serializeBaseContentTypes(model: ExcelWorkbookModel): string {\n const overrides: Array<[string, string]> = [\n ['/xl/workbook.xml', WORKBOOK_CONTENT_TYPE],\n ...model.sheets.map((sheet, index) => [\n `/${sheet.path ?? `xl/worksheets/sheet${index + 1}.xml`}`,\n WORKSHEET_CONTENT_TYPE,\n ]),\n ];\n return `${XML_DECL}<Types xmlns=\"${CONTENT_TYPES_NS}\"><Default Extension=\"rels\" ContentType=\"${RELS_CONTENT_TYPE}\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/>${overrides\n .map(\n ([partName, contentType]) =>\n `<Override PartName=\"${xmlAttr(partName)}\" ContentType=\"${xmlAttr(contentType)}\"/>`,\n )\n .join('')}</Types>`;\n}\n\nfunction setXmlPart(pkg: Package, path: string, contentType: string, xml: string): void {\n setPart(\n pkg,\n createXmlPart({\n path,\n contentType,\n xmlDom: parseXmlDocument(xml) as unknown as Document,\n }),\n );\n}\n\nfunction syncWorksheetTableRelationships(pkg: Package, sheet: ExcelSheetModel): void {\n if (!sheet.path) return;\n const relsPath = relationshipPartPath(sheet.path);\n const rels = parseRelationships(getPart(pkg, relsPath));\n if (!sheet.tables.length && !Array.from(rels.values()).some((rel) => rel.type === TABLE_REL_TYPE))\n return;\n const usedTableRelIds = new Set<string>();\n let changed = false;\n\n for (const table of sheet.tables) {\n table.id ??= nextTableId(sheet);\n table.path ??= nextIndexedPartPath(pkg, 'xl/tables/table', '.xml');\n const target = relativeRelationshipTarget(sheet.path, table.path);\n const id = table.relationshipId || findReusableRelationshipId(rels, TABLE_REL_TYPE, target);\n if (id) {\n table.relationshipId = id;\n } else {\n table.relationshipId = nextRelationshipId(rels);\n changed = true;\n }\n usedTableRelIds.add(table.relationshipId);\n const nextRel: Relationship = {\n id: table.relationshipId,\n type: TABLE_REL_TYPE,\n target,\n };\n const previous = rels.get(nextRel.id);\n if (!previous || !sameRelationship(previous, nextRel)) {\n rels.set(nextRel.id, nextRel);\n changed = true;\n }\n }\n\n for (const rel of Array.from(rels.values())) {\n if (rel.type === TABLE_REL_TYPE && !usedTableRelIds.has(rel.id)) {\n const targetPath = resolveRelationshipTarget(sheet.path, rel.target);\n rels.delete(rel.id);\n deletePart(pkg, targetPath);\n removeContentTypeOverride(pkg, targetPath);\n changed = true;\n }\n }\n if (changed) writeRelationshipsPart(pkg, relsPath, rels);\n}\n\nfunction syncWorksheetCommentRelationships(pkg: Package, sheet: ExcelSheetModel): void {\n if (!sheet.path) return;\n const relsPath = relationshipPartPath(sheet.path);\n const rels = parseRelationships(getPart(pkg, relsPath));\n const commentRels = Array.from(rels.values()).filter((rel) => rel.type === COMMENTS_REL_TYPE);\n if (sheet.comments.length || !commentRels.length) return;\n\n for (const rel of commentRels) {\n const targetPath = resolveRelationshipTarget(sheet.path, rel.target);\n rels.delete(rel.id);\n deletePart(pkg, targetPath);\n removeContentTypeOverride(pkg, targetPath);\n }\n writeRelationshipsPart(pkg, relsPath, rels);\n}\n\nfunction syncWorksheetThreadedCommentRelationships(pkg: Package, sheet: ExcelSheetModel): void {\n if (!sheet.path) return;\n const relsPath = relationshipPartPath(sheet.path);\n const rels = parseRelationships(getPart(pkg, relsPath));\n const commentRels = Array.from(rels.values()).filter(\n (rel) => rel.type === THREADED_COMMENTS_REL_TYPE,\n );\n if (sheet.threadedComments.length || !commentRels.length) return;\n\n for (const rel of commentRels) {\n const targetPath = resolveRelationshipTarget(sheet.path, rel.target);\n rels.delete(rel.id);\n deletePart(pkg, targetPath);\n removeContentTypeOverride(pkg, targetPath);\n }\n writeRelationshipsPart(pkg, relsPath, rels);\n}\n\nfunction syncWorksheetDrawingRelationships(pkg: Package, sheet: ExcelSheetModel): void {\n if (!sheet.path) return;\n const needsDrawing = sheet.drawings.some((drawing) => drawing.anchors.length > 0) || sheet.charts.some((chart) => chart.type);\n if (!needsDrawing) return;\n const drawing = sheet.drawings[0] ?? { anchors: [] };\n if (!sheet.drawings[0]) sheet.drawings.push(drawing);\n\n drawing.path ??= nextIndexedPartPath(pkg, 'xl/drawings/drawing', '.xml');\n const sheetRelsPath = relationshipPartPath(sheet.path);\n const sheetRels = parseRelationships(getPart(pkg, sheetRelsPath));\n const drawingTarget = relativeRelationshipTarget(sheet.path, drawing.path);\n drawing.relationshipId ||= findReusableRelationshipId(sheetRels, DRAWING_REL_TYPE, drawingTarget);\n drawing.relationshipId ||= nextRelationshipId(sheetRels);\n sheetRels.set(drawing.relationshipId, {\n id: drawing.relationshipId,\n type: DRAWING_REL_TYPE,\n target: drawingTarget,\n });\n writeRelationshipsPart(pkg, sheetRelsPath, sheetRels);\n ensureContentTypeOverride(pkg, drawing.path, DRAWING_CONTENT_TYPE);\n\n const drawingRelsPath = relationshipPartPath(drawing.path);\n const drawingRels = parseRelationships(getPart(pkg, drawingRelsPath));\n const chartAnchors = drawing.anchors.filter((anchor) => anchor.object?.kind === 'chart');\n const usedChartPaths = new Set(sheet.charts.map((chart) => chart.path).filter((path): path is string => Boolean(path)));\n for (let i = 0; i < sheet.charts.length; i++) {\n const chart = sheet.charts[i];\n if (!chart?.type) continue;\n chart.path ??= nextIndexedPartPathAvoiding(pkg, 'xl/charts/chart', '.xml', usedChartPaths);\n usedChartPaths.add(chart.path);\n chart.drawingPath = drawing.path;\n const chartTarget = relativeRelationshipTarget(drawing.path, chart.path);\n chart.relationshipId ||= findReusableRelationshipId(drawingRels, CHART_REL_TYPE, chartTarget);\n chart.relationshipId ||= nextRelationshipId(drawingRels);\n drawingRels.set(chart.relationshipId, {\n id: chart.relationshipId,\n type: CHART_REL_TYPE,\n target: chartTarget,\n });\n const anchor =\n chartAnchors[i] ??\n ({\n kind: 'twoCell',\n from: chart.position?.from,\n to: chart.position?.to,\n object: { kind: 'chart' },\n } satisfies ExcelDrawingAnchorModel);\n if (!chartAnchors[i]) drawing.anchors.push(anchor);\n anchor.object ??= { kind: 'chart' };\n anchor.object.kind = 'chart';\n anchor.object.name = anchor.object.name ?? chart.title;\n anchor.object.relationshipId = chart.relationshipId;\n anchor.object.targetPath = chart.path;\n if (chart.position) {\n anchor.from = { ...chart.position.from };\n anchor.to = { ...chart.position.to };\n }\n }\n writeRelationshipsPart(pkg, drawingRelsPath, drawingRels);\n}\n\nfunction syncWorksheetRelationships(pkg: Package, sheet: ExcelSheetModel): void {\n if (!sheet.path) return;\n const relsPath = relationshipPartPath(sheet.path);\n const relsPart = getPart(pkg, relsPath);\n const rels = parseRelationships(relsPart);\n const usedHyperlinkIds = new Set<string>();\n let changed = false;\n\n for (const hyperlink of sheet.hyperlinks) {\n if (!hyperlink.target) continue;\n const id = hyperlink.relationshipId || findReusableHyperlinkRelId(rels, hyperlink);\n if (id) {\n hyperlink.relationshipId = id;\n } else {\n hyperlink.relationshipId = nextRelationshipId(rels);\n changed = true;\n }\n usedHyperlinkIds.add(hyperlink.relationshipId);\n const nextRel: Relationship = {\n id: hyperlink.relationshipId,\n type: HYPERLINK_REL_TYPE,\n target: hyperlink.target,\n targetMode: hyperlink.targetMode ?? 'External',\n };\n const previous = rels.get(nextRel.id);\n if (!previous || !sameRelationship(previous, nextRel)) {\n rels.set(nextRel.id, nextRel);\n changed = true;\n }\n }\n\n for (const rel of Array.from(rels.values())) {\n if (rel.type === HYPERLINK_REL_TYPE && !usedHyperlinkIds.has(rel.id)) {\n rels.delete(rel.id);\n changed = true;\n }\n }\n if (!changed && relsPart) return;\n if (!relsPart && !rels.size) return;\n writeRelationshipsPart(pkg, relsPath, rels);\n}\n\nfunction writeRelationshipsPart(\n pkg: Package,\n relsPath: string,\n rels: Map<string, Relationship>,\n): void {\n const relsPart = getPart(pkg, relsPath);\n const xml = serializeRelationships(rels);\n if (relsPart) {\n replacePartXml(relsPart, xml);\n } else {\n setPart(\n pkg,\n createXmlPart({\n path: relsPath,\n contentType: RELS_CONTENT_TYPE,\n xmlDom: parseXmlDocument(xml) as unknown as Document,\n }),\n );\n }\n}\n\nfunction syncWorkbookPart(pkg: Package, model: ExcelWorkbookModel): void {\n const part = getPart(pkg, 'xl/workbook.xml');\n if (!part?.xmlDom) return;\n const sheetsXml = model.sheets\n .map((sheet) => {\n const attrs = [\n `name=\"${xmlAttr(sheet.name)}\"`,\n `sheetId=\"${xmlAttr(sheet.id)}\"`,\n sheet.visibility ? `state=\"${xmlAttr(sheet.visibility)}\"` : '',\n sheet.relationshipId ? `r:id=\"${xmlAttr(sheet.relationshipId)}\"` : '',\n ].filter(Boolean);\n return `<sheet ${attrs.join(' ')}/>`;\n })\n .join('');\n const definedNamesXml = model.definedNames.length\n ? `<definedNames>${model.definedNames\n .map((name) => {\n const attrs = [\n `name=\"${xmlAttr(name.name)}\"`,\n name.localSheetId === undefined ? '' : `localSheetId=\"${name.localSheetId}\"`,\n ].filter(Boolean);\n return `<definedName ${attrs.join(' ')}>${xmlText(name.text)}</definedName>`;\n })\n .join('')}</definedNames>`\n : '';\n replacePartXml(\n part,\n `${XML_DECL}<workbook xmlns=\"${SS_NS}\" xmlns:r=\"${OFFICE_REL_NS}\"><sheets>${sheetsXml}</sheets>${definedNamesXml}</workbook>`,\n );\n}\n\nfunction syncWorksheetPart(pkg: Package, sheet: ExcelSheetModel): void {\n if (!sheet.path) return;\n const part = getPart(pkg, sheet.path);\n if (!part?.xmlDom) return;\n replacePartXml(part, serializeWorksheet(sheet));\n}\n\nfunction serializeWorksheet(sheet: ExcelSheetModel): string {\n return `${XML_DECL}<worksheet xmlns=\"${SS_NS}\" xmlns:r=\"${OFFICE_REL_NS}\">${[\n sheet.dimension ? `<dimension ref=\"${xmlAttr(sheet.dimension)}\"/>` : '',\n serializeSheetViews(sheet.sheetViews),\n serializeColumns(sheet.columns),\n serializeSheetData(sheet),\n serializeMergedRanges(sheet),\n serializeConditionalFormats(sheet.conditionalFormats),\n serializeHyperlinks(sheet.hyperlinks),\n serializeDataValidations(sheet.dataValidations),\n serializeTableParts(sheet.tables),\n serializeDrawingRef(sheet.drawings),\n ]\n .filter(Boolean)\n .join('')}</worksheet>`;\n}\n\nfunction serializeStyles(styles: ExcelStylesModel): string {\n const customNumberFormats = styles.numberFormats.filter((format) => format.id >= 164);\n return `${XML_DECL}<styleSheet xmlns=\"${SS_NS}\">${[\n customNumberFormats.length\n ? `<numFmts count=\"${customNumberFormats.length}\">${customNumberFormats\n .map((format) => `<numFmt numFmtId=\"${format.id}\" formatCode=\"${xmlAttr(format.code)}\"/>`)\n .join('')}</numFmts>`\n : '',\n `<fonts count=\"${styles.fonts.length}\">${styles.fonts.map(serializeFont).join('')}</fonts>`,\n `<fills count=\"${styles.fills.length}\">${styles.fills.map(serializeFill).join('')}</fills>`,\n `<borders count=\"${styles.borders.length}\">${styles.borders.map(serializeBorder).join('')}</borders>`,\n `<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>`,\n `<cellXfs count=\"${styles.cellFormats.length}\">${styles.cellFormats.map(serializeCellFormat).join('')}</cellXfs>`,\n `<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>`,\n ]\n .filter(Boolean)\n .join('')}</styleSheet>`;\n}\n\nfunction serializeFont(font: ExcelFontModel): string {\n return `<font>${[\n font.size === undefined ? '' : `<sz val=\"${font.size}\"/>`,\n font.color ? serializeColor('color', font.color) : '',\n font.name === undefined ? '' : `<name val=\"${xmlAttr(font.name)}\"/>`,\n font.family === undefined ? '' : `<family val=\"${font.family}\"/>`,\n font.charset === undefined ? '' : `<charset val=\"${font.charset}\"/>`,\n font.scheme === undefined ? '' : `<scheme val=\"${xmlAttr(font.scheme)}\"/>`,\n font.bold ? '<b/>' : '',\n font.italic ? '<i/>' : '',\n font.underline ? '<u/>' : '',\n ]\n .filter(Boolean)\n .join('')}</font>`;\n}\n\nfunction serializeFill(fill: ExcelFillModel): string {\n return `<fill><patternFill ${stringAttr('patternType', fill.patternType)}>${[\n fill.foregroundColor ? serializeColor('fgColor', fill.foregroundColor) : '',\n fill.backgroundColor ? serializeColor('bgColor', fill.backgroundColor) : '',\n ]\n .filter(Boolean)\n .join('')}</patternFill></fill>`;\n}\n\nfunction serializeBorder(border: ExcelBorderModel): string {\n return `<border>${['left', 'right', 'top', 'bottom', 'diagonal']\n .map((side) =>\n serializeBorderSide(\n side,\n border[side as keyof ExcelBorderModel] as ExcelBorderSideModel | undefined,\n ),\n )\n .join('')}</border>`;\n}\n\nfunction serializeBorderSide(name: string, side: ExcelBorderSideModel | undefined): string {\n if (!side) return `<${name}/>`;\n return `<${name} ${stringAttr('style', side.style)}>${side.color ? serializeColor('color', side.color) : ''}</${name}>`;\n}\n\nfunction serializeCellFormat(format: ExcelStylesModel['cellFormats'][number]): string {\n const attrs = [\n numberAttr('numFmtId', format.numberFormatId ?? 0),\n numberAttr('fontId', format.fontId ?? 0),\n numberAttr('fillId', format.fillId ?? 0),\n numberAttr('borderId', format.borderId ?? 0),\n numberAttr('xfId', format.xfId ?? 0),\n booleanAttr('applyNumberFormat', format.applyNumberFormat),\n booleanAttr('applyFont', format.applyFont),\n booleanAttr('applyFill', format.applyFill),\n booleanAttr('applyBorder', format.applyBorder),\n booleanAttr('applyAlignment', format.applyAlignment),\n ].filter(Boolean);\n const alignment = format.alignment ? serializeAlignment(format.alignment) : '';\n return alignment ? `<xf ${attrs.join(' ')}>${alignment}</xf>` : `<xf ${attrs.join(' ')}/>`;\n}\n\nfunction serializeAlignment(alignment: ExcelAlignmentModel): string {\n const attrs = [\n stringAttr('horizontal', alignment.horizontal),\n stringAttr('vertical', alignment.vertical),\n numberAttr('textRotation', alignment.textRotation),\n booleanAttr('wrapText', alignment.wrapText),\n booleanAttr('shrinkToFit', alignment.shrinkToFit),\n numberAttr('indent', alignment.indent),\n ].filter(Boolean);\n return `<alignment ${attrs.join(' ')}/>`;\n}\n\nfunction serializeColor(name: string, color: ExcelColorModel): string {\n return `<${name} rgb=\"${excelColorToOoxmlArgb(color, `Excel ${name}`)}\"/>`;\n}\n\nfunction normalizeStyles(styles: ExcelStylesModel): ExcelStylesModel {\n return {\n numberFormats: styles.numberFormats,\n fonts: styles.fonts.length ? styles.fonts : [{}],\n fills: styles.fills.length ? styles.fills : [{}, { patternType: 'gray125' }],\n borders: styles.borders.length ? styles.borders : [{}],\n cellFormats: styles.cellFormats.length ? styles.cellFormats : [{}],\n };\n}\n\nfunction serializeSheetViews(views: ExcelSheetViewModel[]): string {\n if (!views.length) return '';\n return `<sheetViews>${views\n .map((view) => {\n const attrs = [\n numberAttr('workbookViewId', view.workbookViewId),\n stringAttr('view', view.view),\n booleanAttr('tabSelected', view.tabSelected),\n booleanAttr('showGridLines', view.showGridLines),\n booleanAttr('showRowColHeaders', view.showRowColHeaders),\n numberAttr('zoomScale', view.zoomScale),\n numberAttr('zoomScaleNormal', view.zoomScaleNormal),\n stringAttr('topLeftCell', view.topLeftCell),\n ].filter(Boolean);\n const pane = view.pane\n ? `<pane ${[\n numberAttr('xSplit', view.pane.xSplit),\n numberAttr('ySplit', view.pane.ySplit),\n stringAttr('topLeftCell', view.pane.topLeftCell),\n stringAttr('activePane', view.pane.activePane),\n stringAttr('state', view.pane.state),\n ]\n .filter(Boolean)\n .join(' ')}/>`\n : '';\n const selections = view.selections\n .map(\n (selection) =>\n `<selection ${[\n stringAttr('pane', selection.pane),\n stringAttr('activeCell', selection.activeCell),\n numberAttr('activeCellId', selection.activeCellId),\n stringAttr('sqref', selection.sqref),\n ]\n .filter(Boolean)\n .join(' ')}/>`,\n )\n .join('');\n return `<sheetView ${attrs.join(' ')}>${pane}${selections}</sheetView>`;\n })\n .join('')}</sheetViews>`;\n}\n\nfunction serializeColumns(columns: ExcelColumnModel[]): string {\n if (!columns.length) return '';\n return `<cols>${columns\n .map(\n (column) =>\n `<col ${[\n numberAttr('min', column.min),\n numberAttr('max', column.max),\n numberAttr('width', column.width),\n booleanAttr('hidden', column.hidden),\n numberAttr('style', column.styleId),\n booleanAttr('customWidth', column.customWidth),\n ]\n .filter(Boolean)\n .join(' ')}/>`,\n )\n .join('')}</cols>`;\n}\n\nfunction serializeSheetData(sheet: ExcelSheetModel): string {\n const rowMap = new Map<number, { row?: ExcelRowModel; cells: ExcelCellModel[] }>();\n for (const row of sheet.rows) {\n rowMap.set(row.index, { row, cells: [] });\n }\n for (const cell of sheet.cells) {\n const entry = rowMap.get(cell.row) ?? { cells: [] };\n entry.cells.push(cell);\n rowMap.set(cell.row, entry);\n }\n const rows = Array.from(rowMap.entries()).sort(([a], [b]) => a - b);\n return `<sheetData>${rows\n .map(([index, entry]) => {\n const row = entry.row;\n const attrs = [\n numberAttr('r', index),\n numberAttr('ht', row?.height),\n booleanAttr('hidden', row?.hidden),\n numberAttr('s', row?.styleId),\n booleanAttr('customHeight', row?.customHeight),\n ].filter(Boolean);\n const cells = entry.cells\n .sort((a, b) => a.column - b.column)\n .map((cell) => serializeCell(cell))\n .join('');\n return cells ? `<row ${attrs.join(' ')}>${cells}</row>` : `<row ${attrs.join(' ')}/>`;\n })\n .join('')}</sheetData>`;\n}\n\nfunction serializeCell(cell: ExcelCellModel): string {\n const attrs = [stringAttr('r', cell.address), numberAttr('s', cell.styleId)].filter(Boolean);\n const formula = cell.formula ? `<f>${xmlText(cell.formula)}</f>` : '';\n if (cell.kind === 'string') {\n attrs.push('t=\"inlineStr\"');\n return `<c ${attrs.join(' ')}><is><t>${xmlText(String(cell.value ?? ''))}</t></is></c>`;\n }\n if (cell.kind === 'boolean') {\n attrs.push('t=\"b\"');\n return `<c ${attrs.join(' ')}>${formula}<v>${cell.value ? '1' : '0'}</v></c>`;\n }\n if (cell.kind === 'error') {\n attrs.push('t=\"e\"');\n return `<c ${attrs.join(' ')}>${formula}<v>${xmlText(String(cell.value ?? cell.rawValue ?? ''))}</v></c>`;\n }\n if (cell.kind === 'blank' && !formula) {\n return `<c ${attrs.join(' ')}/>`;\n }\n const value = cell.value === null || cell.value === undefined ? '' : String(cell.value);\n return `<c ${attrs.join(' ')}>${formula}${value ? `<v>${xmlText(value)}</v>` : ''}</c>`;\n}\n\nfunction serializeMergedRanges(sheet: ExcelSheetModel): string {\n if (!sheet.mergedRanges.length) return '';\n return `<mergeCells count=\"${sheet.mergedRanges.length}\">${sheet.mergedRanges\n .map((range) => `<mergeCell ref=\"${xmlAttr(range.address)}\"/>`)\n .join('')}</mergeCells>`;\n}\n\nfunction serializeConditionalFormats(formats: ExcelConditionalFormatModel[]): string {\n return formats\n .map(\n (format) =>\n `<conditionalFormatting ${stringAttr('sqref', format.sqref)}>${format.rules\n .map(\n (rule) =>\n `<cfRule ${[\n stringAttr('type', rule.type),\n numberAttr('priority', rule.priority),\n stringAttr('operator', rule.operator),\n numberAttr('dxfId', rule.dxfId),\n booleanAttr('stopIfTrue', rule.stopIfTrue),\n booleanAttr('aboveAverage', rule.aboveAverage),\n booleanAttr('percent', rule.percent),\n booleanAttr('bottom', rule.bottom),\n numberAttr('rank', rule.rank),\n stringAttr('text', rule.text),\n stringAttr('timePeriod', rule.timePeriod),\n ]\n .filter(Boolean)\n .join(\n ' ',\n )}>${rule.formulas.map((formula) => `<formula>${xmlText(formula)}</formula>`).join('')}</cfRule>`,\n )\n .join('')}</conditionalFormatting>`,\n )\n .join('');\n}\n\nfunction serializeHyperlinks(hyperlinks: ExcelHyperlinkModel[]): string {\n if (!hyperlinks.length) return '';\n return `<hyperlinks>${hyperlinks\n .map(\n (hyperlink) =>\n `<hyperlink ${[\n stringAttr('ref', hyperlink.ref),\n hyperlink.relationshipId ? `r:id=\"${xmlAttr(hyperlink.relationshipId)}\"` : '',\n stringAttr('location', hyperlink.location),\n stringAttr('display', hyperlink.display),\n stringAttr('tooltip', hyperlink.tooltip),\n ]\n .filter(Boolean)\n .join(' ')}/>`,\n )\n .join('')}</hyperlinks>`;\n}\n\nfunction serializeDataValidations(validations: ExcelDataValidationModel[]): string {\n if (!validations.length) return '';\n return `<dataValidations count=\"${validations.length}\">${validations\n .map((validation) => {\n const attrs = [\n stringAttr('type', validation.type),\n stringAttr('operator', validation.operator),\n booleanAttr('allowBlank', validation.allowBlank),\n booleanAttr('showDropDown', validation.showDropDown),\n booleanAttr('showInputMessage', validation.showInputMessage),\n booleanAttr('showErrorMessage', validation.showErrorMessage),\n stringAttr('errorStyle', validation.errorStyle),\n stringAttr('sqref', validation.sqref),\n stringAttr('errorTitle', validation.errorTitle),\n stringAttr('error', validation.error),\n stringAttr('promptTitle', validation.promptTitle),\n stringAttr('prompt', validation.prompt),\n ].filter(Boolean);\n return `<dataValidation ${attrs.join(' ')}>${validation.formula1 ? `<formula1>${xmlText(validation.formula1)}</formula1>` : ''}${\n validation.formula2 ? `<formula2>${xmlText(validation.formula2)}</formula2>` : ''\n }</dataValidation>`;\n })\n .join('')}</dataValidations>`;\n}\n\nfunction serializeTableParts(tables: ExcelTableModel[]): string {\n const tableIds = tables\n .map((table) => table.relationshipId)\n .filter((id): id is string => Boolean(id));\n if (!tableIds.length) return '';\n return `<tableParts count=\"${tableIds.length}\">${tableIds.map((id) => `<tablePart r:id=\"${xmlAttr(id)}\"/>`).join('')}</tableParts>`;\n}\n\nfunction serializeDrawingRef(drawings: ExcelDrawingModel[]): string {\n const drawing = drawings.find((item) => item.relationshipId);\n return drawing?.relationshipId ? `<drawing r:id=\"${xmlAttr(drawing.relationshipId)}\"/>` : '';\n}\n\nfunction syncTableParts(pkg: Package, sheet: ExcelSheetModel): void {\n for (const table of sheet.tables) {\n if (!table.path) continue;\n const part = getPart(pkg, table.path);\n const xml = serializeTable(table);\n if (part?.xmlDom) {\n replacePartXml(part, xml);\n } else {\n setPart(\n pkg,\n createXmlPart({\n path: table.path,\n contentType: TABLE_CONTENT_TYPE,\n xmlDom: parseXmlDocument(xml) as unknown as Document,\n }),\n );\n }\n ensureContentTypeOverride(pkg, table.path, TABLE_CONTENT_TYPE);\n }\n}\n\nfunction serializeTable(table: ExcelTableModel): string {\n const attrs = [\n numberAttr('id', table.id),\n stringAttr('name', table.name),\n stringAttr('displayName', table.displayName),\n stringAttr('ref', table.ref),\n numberAttr('headerRowCount', table.headerRowCount),\n numberAttr('totalsRowCount', table.totalsRowCount),\n booleanAttr('totalsRowShown', table.totalsRowShown),\n ].filter(Boolean);\n const autoFilter = serializeTableAutoFilter(table);\n const columns = `<tableColumns count=\"${table.columns.length}\">${table.columns\n .map(\n (column) =>\n `<tableColumn ${[\n numberAttr('id', column.id),\n stringAttr('name', column.name),\n stringAttr('totalsRowLabel', column.totalsRowLabel),\n stringAttr('totalsRowFunction', column.totalsRowFunction),\n ]\n .filter(Boolean)\n .join(' ')}/>`,\n )\n .join('')}</tableColumns>`;\n const style = table.style\n ? `<tableStyleInfo ${[\n stringAttr('name', table.style.name),\n booleanAttr('showFirstColumn', table.style.showFirstColumn),\n booleanAttr('showLastColumn', table.style.showLastColumn),\n booleanAttr('showRowStripes', table.style.showRowStripes),\n booleanAttr('showColumnStripes', table.style.showColumnStripes),\n ]\n .filter(Boolean)\n .join(' ')}/>`\n : '';\n return `${XML_DECL}<table xmlns=\"${SS_NS}\" ${attrs.join(' ')}>${autoFilter}${columns}${style}</table>`;\n}\n\nfunction serializeTableAutoFilter(table: ExcelTableModel): string {\n const autoFilter =\n table.autoFilter ??\n (table.autoFilterRef ? { ref: table.autoFilterRef, filterColumns: [] } : undefined);\n if (!autoFilter) return '';\n const attrs = [stringAttr('ref', autoFilter.ref ?? table.autoFilterRef)].filter(Boolean);\n return `<autoFilter ${attrs.join(' ')}>${[\n ...autoFilter.filterColumns.map(serializeTableFilterColumn),\n autoFilter.sortState ? serializeTableSortState(autoFilter.sortState) : '',\n ]\n .filter(Boolean)\n .join('')}</autoFilter>`;\n}\n\nfunction serializeTableFilterColumn(column: ExcelTableFilterColumnModel): string {\n const attrs = [\n numberAttr('colId', column.colId),\n booleanAttr('hiddenButton', column.hiddenButton),\n booleanAttr('showButton', column.showButton),\n ].filter(Boolean);\n const filters = column.filters?.length\n ? `<filters>${column.filters.map((filter) => `<filter val=\"${xmlAttr(filter)}\"/>`).join('')}</filters>`\n : '';\n return `<filterColumn ${attrs.join(' ')}>${filters}</filterColumn>`;\n}\n\nfunction serializeTableSortState(sortState: ExcelTableSortStateModel): string {\n const attrs = [\n stringAttr('ref', sortState.ref),\n booleanAttr('caseSensitive', sortState.caseSensitive),\n stringAttr('sortMethod', sortState.sortMethod),\n ].filter(Boolean);\n return `<sortState ${attrs.join(' ')}>${sortState.conditions.map(serializeTableSortCondition).join('')}</sortState>`;\n}\n\nfunction serializeTableSortCondition(condition: ExcelTableSortConditionModel): string {\n const attrs = [\n stringAttr('ref', condition.ref),\n booleanAttr('descending', condition.descending),\n stringAttr('sortBy', condition.sortBy),\n ].filter(Boolean);\n return `<sortCondition ${attrs.join(' ')}/>`;\n}\n\nfunction syncCommentParts(pkg: Package, sheet: ExcelSheetModel): void {\n if (!sheet.path || !sheet.comments.length) return;\n const target = ensureCommentPartTarget(pkg, sheet.path);\n const xml = serializeComments(sheet.comments);\n const part = getPart(pkg, target.path);\n if (part?.xmlDom) {\n replacePartXml(part, xml);\n } else {\n setPart(\n pkg,\n createXmlPart({\n path: target.path,\n contentType: COMMENTS_CONTENT_TYPE,\n xmlDom: parseXmlDocument(xml) as unknown as Document,\n }),\n );\n }\n ensureContentTypeOverride(pkg, target.path, COMMENTS_CONTENT_TYPE);\n}\n\nfunction ensureCommentPartTarget(pkg: Package, sheetPath: string): { id: string; path: string } {\n const existing = relationshipTargetsByType(pkg, sheetPath, '/comments')[0];\n if (existing) return existing;\n const relsPath = relationshipPartPath(sheetPath);\n const rels = parseRelationships(getPart(pkg, relsPath));\n const id = nextRelationshipId(rels);\n const path = nextIndexedPartPath(pkg, 'xl/comments', '.xml');\n rels.set(id, {\n id,\n type: COMMENTS_REL_TYPE,\n target: relativeRelationshipTarget(sheetPath, path),\n });\n writeRelationshipsPart(pkg, relsPath, rels);\n return { id, path };\n}\n\nfunction serializeComments(comments: ExcelCommentModel[]): string {\n const authors = Array.from(new Set(comments.map((comment) => comment.author ?? '')));\n return `${XML_DECL}<comments xmlns=\"${SS_NS}\"><authors>${authors\n .map((author) => `<author>${xmlText(author)}</author>`)\n .join('')}</authors><commentList>${comments\n .map((comment) => {\n const authorId = comment.authorId ?? Math.max(0, authors.indexOf(comment.author ?? ''));\n return `<comment ${[\n stringAttr('ref', comment.ref),\n numberAttr('authorId', authorId),\n numberAttr('shapeId', comment.shapeId),\n ]\n .filter(Boolean)\n .join(' ')}><text><t>${xmlText(comment.text)}</t></text></comment>`;\n })\n .join('')}</commentList></comments>`;\n}\n\nfunction syncThreadedCommentParts(pkg: Package, sheet: ExcelSheetModel): void {\n if (!sheet.path || !sheet.threadedComments.length) return;\n const target = relationshipTargetsByType(pkg, sheet.path, '/threadedComment')[0];\n if (!target) return;\n const part = getPart(pkg, target.path);\n if (!part?.xmlDom) return;\n replacePartXml(part, serializeThreadedComments(sheet.threadedComments));\n}\n\nfunction serializeThreadedComments(comments: ExcelThreadedCommentModel[]): string {\n return `${XML_DECL}<ThreadedComments xmlns=\"${TC_NS}\">${comments\n .map(\n (comment) =>\n `<threadedComment ${[\n stringAttr('ref', comment.ref),\n stringAttr('dT', comment.dateTime),\n stringAttr('personId', comment.personId),\n stringAttr('id', comment.id),\n ]\n .filter(Boolean)\n .join(' ')}><text>${xmlText(comment.text)}</text></threadedComment>`,\n )\n .join('')}</ThreadedComments>`;\n}\n\nfunction syncDrawingParts(pkg: Package, sheet: ExcelSheetModel): void {\n for (const drawing of sheet.drawings) {\n if (!drawing.path) continue;\n const part = getPart(pkg, drawing.path);\n if (!part?.xmlDom) {\n setXmlPart(pkg, drawing.path, DRAWING_CONTENT_TYPE, serializeDrawing(drawing));\n ensureContentTypeOverride(pkg, drawing.path, DRAWING_CONTENT_TYPE);\n continue;\n }\n const anchorEls = [\n ...Array.from(part.xmlDom.getElementsByTagNameNS('*', 'twoCellAnchor')),\n ...Array.from(part.xmlDom.getElementsByTagNameNS('*', 'oneCellAnchor')),\n ...Array.from(part.xmlDom.getElementsByTagNameNS('*', 'absoluteAnchor')),\n ];\n for (let i = 0; i < drawing.anchors.length; i++) {\n const anchor = drawing.anchors[i];\n const anchorEl = anchorEls[i];\n if (!anchor || !anchorEl) continue;\n updateMarker(anchorEl, 'from', anchor.from);\n updateMarker(anchorEl, 'to', anchor.to);\n updateDrawingObjectName(anchorEl, anchor.object?.name);\n }\n markDirty(part);\n }\n}\n\nfunction serializeDrawing(drawing: ExcelDrawingModel): string {\n return `${XML_DECL}<xdr:wsDr xmlns:xdr=\"${DRAWING_NS}\" xmlns:a=\"${A_NS}\" xmlns:c=\"${CHART_NS}\" xmlns:r=\"${OFFICE_REL_NS}\">${drawing.anchors\n .map((anchor, index) => serializeDrawingAnchor(anchor, index + 2))\n .join('')}</xdr:wsDr>`;\n}\n\nfunction serializeDrawingAnchor(anchor: ExcelDrawingAnchorModel, id: number): string {\n const from = serializeDrawingMarker('from', anchor.from);\n const to = serializeDrawingMarker('to', anchor.to);\n if (anchor.object?.kind === 'chart' && anchor.object.relationshipId) {\n const name = anchor.object.name ?? `Chart ${id}`;\n return `<xdr:twoCellAnchor editAs=\"oneCell\">${from}${to}<xdr:graphicFrame macro=\"\"><xdr:nvGraphicFramePr><xdr:cNvPr id=\"${id}\" name=\"${xmlAttr(name)}\"/><xdr:cNvGraphicFramePr/></xdr:nvGraphicFramePr><xdr:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/></xdr:xfrm><a:graphic><a:graphicData uri=\"${CHART_NS}\"><c:chart r:id=\"${xmlAttr(anchor.object.relationshipId)}\"/></a:graphicData></a:graphic></xdr:graphicFrame><xdr:clientData/></xdr:twoCellAnchor>`;\n }\n return `<xdr:twoCellAnchor editAs=\"oneCell\">${from}${to}<xdr:clientData/></xdr:twoCellAnchor>`;\n}\n\nfunction serializeDrawingMarker(name: 'from' | 'to', marker: ExcelDrawingMarkerModel | undefined): string {\n const value = marker ?? {};\n return `<xdr:${name}><xdr:col>${value.column ?? 0}</xdr:col><xdr:colOff>${value.columnOffset ?? 0}</xdr:colOff><xdr:row>${value.row ?? 0}</xdr:row><xdr:rowOff>${value.rowOffset ?? 0}</xdr:rowOff></xdr:${name}>`;\n}\n\nfunction updateMarker(\n anchorEl: Element,\n localName: 'from' | 'to',\n marker: ExcelDrawingMarkerModel | undefined,\n): void {\n if (!marker) return;\n const markerEl = anchorEl.getElementsByTagNameNS('*', localName)[0];\n if (!markerEl) return;\n setFirstLocalText(markerEl, 'col', marker.column);\n setFirstLocalText(markerEl, 'colOff', marker.columnOffset);\n setFirstLocalText(markerEl, 'row', marker.row);\n setFirstLocalText(markerEl, 'rowOff', marker.rowOffset);\n}\n\nfunction updateDrawingObjectName(anchorEl: Element, name: string | undefined): void {\n if (name === undefined) return;\n const nameEl = anchorEl.getElementsByTagNameNS('*', 'cNvPr')[0];\n if (nameEl) nameEl.setAttribute('name', name);\n}\n\nfunction syncChartParts(pkg: Package, sheet: ExcelSheetModel): void {\n for (const chart of sheet.charts) {\n syncChartPart(pkg, chart);\n }\n}\n\nfunction syncChartPart(pkg: Package, chart: ExcelChartModel): void {\n if (!chart.path) return;\n const part = getPart(pkg, chart.path);\n if (!part?.xmlDom) {\n if (!chart.type || !chart.categoryRange || !chart.series?.length) return;\n setXmlPart(pkg, chart.path, CHART_CONTENT_TYPE, serializeChart(chart));\n ensureContentTypeOverride(pkg, chart.path, CHART_CONTENT_TYPE);\n return;\n }\n updateChartTitle(part.xmlDom, chart.title);\n const formulaEls = Array.from(part.xmlDom.getElementsByTagNameNS('*', 'f'));\n for (let i = 0; i < chart.formulaRefs.length && i < formulaEls.length; i++) {\n formulaEls[i]!.textContent = chart.formulaRefs[i] ?? '';\n }\n markDirty(part);\n}\n\nfunction serializeChart(chart: ExcelChartModel): string {\n const chartBody = serializeChartBody(chart);\n return `${XML_DECL}<c:chartSpace xmlns:c=\"${CHART_NS}\" xmlns:a=\"${A_NS}\" xmlns:r=\"${OFFICE_REL_NS}\"><c:date1904 val=\"0\"/><c:lang val=\"en-US\"/><c:roundedCorners val=\"0\"/><c:chart>${serializeChartTitle(chart.title)}<c:autoTitleDeleted val=\"${chart.title ? 0 : 1}\"/><c:plotArea><c:layout/>${chartBody}</c:plotArea><c:legend><c:legendPos val=\"r\"/><c:layout/></c:legend><c:plotVisOnly val=\"1\"/></c:chart><c:printSettings><c:headerFooter/><c:pageMargins l=\"0.7\" r=\"0.7\" t=\"0.75\" b=\"0.75\" header=\"0.3\" footer=\"0.3\"/><c:pageSetup/></c:printSettings></c:chartSpace>`;\n}\n\nfunction serializeChartTitle(title: string | undefined): string {\n if (!title) return '';\n return `<c:title><c:tx><c:rich><a:bodyPr/><a:lstStyle/><a:p><a:r><a:t>${xmlText(title)}</a:t></a:r></a:p></c:rich></c:tx><c:layout/></c:title>`;\n}\n\nfunction serializeChartBody(chart: ExcelChartModel): string {\n if (chart.type === 'pie' || chart.type === 'doughnut') return serializePieLikeChart(chart);\n if (chart.type === 'line' || chart.type === 'lineMarkers') return serializeLineChart(chart);\n return serializeBarChart(chart);\n}\n\nfunction serializeBarChart(chart: ExcelChartModel): string {\n const direction = chart.type?.startsWith('bar') ? 'bar' : 'col';\n const grouping = chart.type?.endsWith('Stacked') ? 'stacked' : 'clustered';\n return `<c:barChart><c:barDir val=\"${direction}\"/><c:grouping val=\"${grouping}\"/><c:varyColors val=\"0\"/>${serializeCartesianSeries(chart)}<c:axId val=\"12345678\"/><c:axId val=\"12345679\"/></c:barChart>${serializeCategoryAxis()}${serializeValueAxis()}`;\n}\n\nfunction serializeLineChart(chart: ExcelChartModel): string {\n const marker = chart.type === 'lineMarkers' ? '1' : '0';\n return `<c:lineChart><c:grouping val=\"standard\"/><c:varyColors val=\"0\"/>${serializeCartesianSeries(chart, marker)}<c:axId val=\"12345678\"/><c:axId val=\"12345679\"/></c:lineChart>${serializeCategoryAxis()}${serializeValueAxis()}`;\n}\n\nfunction serializePieLikeChart(chart: ExcelChartModel): string {\n const tag = chart.type === 'doughnut' ? 'doughnutChart' : 'pieChart';\n const hole = chart.type === 'doughnut' ? '<c:holeSize val=\"50\"/>' : '';\n return `<c:${tag}><c:varyColors val=\"1\"/>${serializePieSeries(chart)}${hole}</c:${tag}>`;\n}\n\nfunction serializeCartesianSeries(chart: ExcelChartModel, marker?: string): string {\n return (chart.series ?? [])\n .map((series, index) => {\n const markerXml = marker === undefined ? '' : `<c:marker><c:symbol val=\"${marker === '1' ? 'auto' : 'none'}\"/></c:marker>`;\n return `<c:ser><c:idx val=\"${index}\"/><c:order val=\"${index}\"/>${serializeSeriesText(series.name)}${markerXml}<c:cat><c:strRef><c:f>${xmlText(chart.categoryRange ?? '')}</c:f></c:strRef></c:cat><c:val><c:numRef><c:f>${xmlText(series.values)}</c:f></c:numRef></c:val></c:ser>`;\n })\n .join('');\n}\n\nfunction serializePieSeries(chart: ExcelChartModel): string {\n const series = chart.series?.[0];\n if (!series) return '';\n return `<c:ser><c:idx val=\"0\"/><c:order val=\"0\"/>${serializeSeriesText(series.name)}<c:cat><c:strRef><c:f>${xmlText(chart.categoryRange ?? '')}</c:f></c:strRef></c:cat><c:val><c:numRef><c:f>${xmlText(series.values)}</c:f></c:numRef></c:val></c:ser>`;\n}\n\nfunction serializeSeriesText(name: string | undefined): string {\n if (!name) return '';\n if (name.includes('!') || name.includes('$')) {\n return `<c:tx><c:strRef><c:f>${xmlText(name)}</c:f></c:strRef></c:tx>`;\n }\n return `<c:tx><c:v>${xmlText(name)}</c:v></c:tx>`;\n}\n\nfunction serializeCategoryAxis(): string {\n return '<c:catAx><c:axId val=\"12345678\"/><c:scaling><c:orientation val=\"minMax\"/></c:scaling><c:axPos val=\"b\"/><c:tickLblPos val=\"nextTo\"/><c:crossAx val=\"12345679\"/><c:crosses val=\"autoZero\"/><c:auto val=\"1\"/><c:lblAlgn val=\"ctr\"/><c:lblOffset val=\"100\"/></c:catAx>';\n}\n\nfunction serializeValueAxis(): string {\n return '<c:valAx><c:axId val=\"12345679\"/><c:scaling><c:orientation val=\"minMax\"/></c:scaling><c:axPos val=\"l\"/><c:majorGridlines/><c:numFmt formatCode=\"General\" sourceLinked=\"1\"/><c:tickLblPos val=\"nextTo\"/><c:crossAx val=\"12345678\"/><c:crosses val=\"autoZero\"/><c:crossBetween val=\"between\"/></c:valAx>';\n}\n\nfunction updateChartTitle(chartDom: Document, title: string | undefined): void {\n if (title === undefined) return;\n const titleEl = chartDom.getElementsByTagNameNS('*', 'title')[0];\n if (!titleEl) return;\n const textEl = titleEl.getElementsByTagNameNS('*', 't')[0];\n if (textEl) textEl.textContent = title;\n}\n\nfunction replacePartXml(part: Part, xml: string): void {\n part.xmlDom = parseXmlDocument(xml) as unknown as Document;\n markDirty(part);\n}\n\nfunction relationshipTargetsByType(\n pkg: Package,\n sourcePath: string,\n typeSuffix: string,\n): Array<{ id: string; path: string }> {\n const rels = parseRelationships(getPart(pkg, relationshipPartPath(sourcePath)));\n const targets: Array<{ id: string; path: string }> = [];\n for (const rel of rels.values()) {\n if (rel.type.endsWith(typeSuffix)) {\n targets.push({ id: rel.id, path: resolveRelationshipTarget(sourcePath, rel.target) });\n }\n }\n return targets;\n}\n\nfunction findReusableHyperlinkRelId(\n rels: Map<string, Relationship>,\n hyperlink: ExcelHyperlinkModel,\n): string | undefined {\n for (const rel of rels.values()) {\n if (\n rel.type === HYPERLINK_REL_TYPE &&\n rel.target === hyperlink.target &&\n (rel.targetMode ?? 'External') === (hyperlink.targetMode ?? 'External')\n ) {\n return rel.id;\n }\n }\n return undefined;\n}\n\nfunction findReusableRelationshipId(\n rels: Map<string, Relationship>,\n type: string,\n target: string,\n targetMode?: string,\n): string | undefined {\n for (const rel of rels.values()) {\n if (\n rel.type === type &&\n rel.target === target &&\n (rel.targetMode ?? '') === (targetMode ?? '')\n ) {\n return rel.id;\n }\n }\n return undefined;\n}\n\nfunction nextTableId(sheet: ExcelSheetModel): number {\n let max = 0;\n for (const table of sheet.tables) {\n if (table.id && table.id > max) max = table.id;\n }\n return max + 1;\n}\n\nfunction nextRelationshipId(rels: Map<string, Relationship>): string {\n let next = 1;\n while (rels.has(`rId${next}`)) next++;\n return `rId${next}`;\n}\n\nfunction sameRelationship(left: Relationship, right: Relationship): boolean {\n return (\n left.id === right.id &&\n left.type === right.type &&\n left.target === right.target &&\n (left.targetMode ?? '') === (right.targetMode ?? '')\n );\n}\n\nfunction serializeRelationships(rels: Map<string, Relationship>): string {\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\">${Array.from(rels.values())\n .map((rel) => {\n const attrs = [\n `Id=\"${xmlAttr(rel.id)}\"`,\n `Type=\"${xmlAttr(rel.type)}\"`,\n `Target=\"${xmlAttr(rel.target)}\"`,\n stringAttr('TargetMode', rel.targetMode),\n ].filter(Boolean);\n return `<Relationship ${attrs.join(' ')}/>`;\n })\n .join('')}</Relationships>`;\n}\n\nfunction nextIndexedPartPath(pkg: Package, prefix: string, extension: string): string {\n let next = 1;\n while (getPart(pkg, `${prefix}${next}${extension}`)) next++;\n return `${prefix}${next}${extension}`;\n}\n\nfunction nextIndexedPartPathAvoiding(\n pkg: Package,\n prefix: string,\n extension: string,\n used: Set<string>,\n): string {\n let next = 1;\n while (getPart(pkg, `${prefix}${next}${extension}`) || used.has(`${prefix}${next}${extension}`)) {\n next++;\n }\n return `${prefix}${next}${extension}`;\n}\n\nfunction parseRelationships(part?: Part): Map<string, Relationship> {\n const result = new Map<string, Relationship>();\n if (!part?.xmlDom) return result;\n const rels = part.xmlDom.getElementsByTagNameNS(REL_NS, 'Relationship');\n for (let i = 0; i < rels.length; i++) {\n const rel = rels[i];\n if (!rel) continue;\n const id = rel.getAttribute('Id');\n const type = rel.getAttribute('Type');\n const target = rel.getAttribute('Target');\n if (!id || !type || !target) continue;\n result.set(id, {\n id,\n type,\n target,\n targetMode: rel.getAttribute('TargetMode') ?? undefined,\n });\n }\n return result;\n}\n\nfunction relationshipPartPath(path: string): string {\n return `${dirname(path)}/_rels/${path.slice(path.lastIndexOf('/') + 1)}.rels`;\n}\n\nfunction dirname(path: string): string {\n const idx = path.lastIndexOf('/');\n return idx === -1 ? '' : path.slice(0, idx);\n}\n\nfunction normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (!part || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return parts.join('/');\n}\n\nfunction resolveRelationshipTarget(sourcePartPath: string, target: string): string {\n if (target.startsWith('/')) return normalizePath(target.slice(1));\n const base = dirname(sourcePartPath);\n return normalizePath(base ? `${base}/${target}` : target);\n}\n\nfunction relativeRelationshipTarget(sourcePartPath: string, targetPartPath: string): string {\n const sourceParts = dirname(sourcePartPath).split('/').filter(Boolean);\n const targetParts = targetPartPath.split('/').filter(Boolean);\n let common = 0;\n while (\n common < sourceParts.length &&\n common < targetParts.length &&\n sourceParts[common] === targetParts[common]\n ) {\n common++;\n }\n const up = sourceParts.slice(common).map(() => '..');\n const down = targetParts.slice(common);\n return [...up, ...down].join('/') || targetPartPath;\n}\n\nfunction ensureContentTypeOverride(pkg: Package, path: string, contentType: string): void {\n const part = getPart(pkg, '[Content_Types].xml');\n if (!part?.xmlDom?.documentElement) return;\n const partName = `/${path}`;\n const overrides = part.xmlDom.getElementsByTagNameNS(CONTENT_TYPES_NS, 'Override');\n for (let i = 0; i < overrides.length; i++) {\n const override = overrides[i];\n if (!override || override.getAttribute('PartName') !== partName) continue;\n if (override.getAttribute('ContentType') !== contentType) {\n override.setAttribute('ContentType', contentType);\n markDirty(part);\n }\n return;\n }\n const override = part.xmlDom.createElementNS(CONTENT_TYPES_NS, 'Override');\n override.setAttribute('PartName', partName);\n override.setAttribute('ContentType', contentType);\n part.xmlDom.documentElement.appendChild(override);\n markDirty(part);\n}\n\nfunction removeContentTypeOverride(pkg: Package, path: string): void {\n const part = getPart(pkg, '[Content_Types].xml');\n if (!part?.xmlDom?.documentElement) return;\n const partName = `/${path}`;\n const overrides = Array.from(part.xmlDom.getElementsByTagNameNS(CONTENT_TYPES_NS, 'Override'));\n for (const override of overrides) {\n if (override.getAttribute('PartName') !== partName) continue;\n override.parentNode?.removeChild(override);\n markDirty(part);\n }\n}\n\nfunction setFirstLocalText(parent: Element, localName: string, value: number | undefined): void {\n if (value === undefined) return;\n const el = parent.getElementsByTagNameNS('*', localName)[0];\n if (el) el.textContent = String(value);\n}\n\nfunction stringAttr(name: string, value: string | undefined): string {\n return value === undefined ? '' : `${name}=\"${xmlAttr(value)}\"`;\n}\n\nfunction numberAttr(name: string, value: number | undefined): string {\n return value === undefined ? '' : `${name}=\"${value}\"`;\n}\n\nfunction booleanAttr(name: string, value: boolean | undefined): string {\n return value === undefined ? '' : `${name}=\"${value ? 1 : 0}\"`;\n}\n\nfunction xmlAttr(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\nfunction xmlText(value: string): string {\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n","import type { ExcelDefinedNameModel } from './model.js';\n\nexport class ExcelNamedItem {\n private readonly model: ExcelDefinedNameModel;\n private readonly names: ExcelDefinedNameModel[];\n\n constructor(model: ExcelDefinedNameModel, names: ExcelDefinedNameModel[]) {\n this.model = model;\n this.names = names;\n }\n\n name(): string {\n return this.model.name;\n }\n\n text(): string {\n return this.model.text;\n }\n\n setText(text: string): void {\n this.model.text = text;\n }\n\n rename(name: string): void {\n assertValidName(name);\n if (this.names.some((item) => item !== this.model && item.name === name)) {\n throw new Error(`ExcelWorkbook: defined name already exists: ${name}`);\n }\n this.model.name = name;\n }\n\n localSheetId(): number | undefined {\n return this.model.localSheetId;\n }\n\n setLocalSheetId(localSheetId: number | undefined): void {\n if (localSheetId !== undefined && (!Number.isInteger(localSheetId) || localSheetId < 0)) {\n throw new Error(`ExcelNamedItem.setLocalSheetId: localSheetId must be a non-negative integer`);\n }\n this.model.localSheetId = localSheetId;\n }\n\n toModel(): ExcelDefinedNameModel {\n return { ...this.model };\n }\n}\n\nexport class ExcelNamedItemCollection {\n private readonly itemsByModel: ExcelNamedItem[];\n private readonly models: ExcelDefinedNameModel[];\n\n constructor(names: ExcelDefinedNameModel[]) {\n this.models = names;\n this.itemsByModel = names.map((name) => new ExcelNamedItem(name, names));\n }\n\n items(): ExcelNamedItem[] {\n return [...this.itemsByModel];\n }\n\n getItem(name: string): ExcelNamedItem {\n const item = this.getItemOrNullObject(name);\n if (!item) throw new Error(`ExcelWorkbook: defined name not found: ${name}`);\n return item;\n }\n\n getItemOrNullObject(name: string): ExcelNamedItem | null {\n return this.itemsByModel.find((item) => item.name() === name) ?? null;\n }\n\n add(model: ExcelDefinedNameModel): ExcelNamedItem {\n assertValidName(model.name);\n if (this.getItemOrNullObject(model.name)) {\n throw new Error(`ExcelWorkbook: defined name already exists: ${model.name}`);\n }\n if (model.localSheetId !== undefined && (!Number.isInteger(model.localSheetId) || model.localSheetId < 0)) {\n throw new Error(`ExcelNamedItemCollection.add: localSheetId must be a non-negative integer`);\n }\n const next = { ...model };\n this.models.push(next);\n const item = new ExcelNamedItem(next, this.models);\n this.itemsByModel.push(item);\n return item;\n }\n\n deleteItem(name: string): void {\n const index = this.models.findIndex((item) => item.name === name);\n if (index === -1) throw new Error(`ExcelWorkbook: defined name not found: ${name}`);\n this.models.splice(index, 1);\n this.itemsByModel.splice(index, 1);\n }\n}\n\nfunction assertValidName(name: string): void {\n if (!name || !/^[A-Za-z_\\\\][A-Za-z0-9_.\\\\]*$/.test(name)) {\n throw new Error(`ExcelNamedItem: invalid defined name: ${name}`);\n }\n}\n","import {\n formatCellAddress,\n formatRangeAddress,\n parseRangeAddress,\n type RangeAddress,\n} from './address.js';\nimport type {\n ExcelAlignmentModel,\n ExcelBorderModel,\n ExcelCellFormatModel,\n ExcelCellKind,\n ExcelCellModel,\n ExcelCellValue,\n ExcelColorModel,\n ExcelFillModel,\n ExcelFontModel,\n ExcelSheetModel,\n ExcelStylesModel,\n} from './model.js';\nimport { normalizeExcelColor } from './color.js';\nimport type {\n ExcelMutationRecorder,\n ExcelRangeSetBorderMutation,\n ExcelRangeSetColumnWidthMutation,\n ExcelRangeSetFillForegroundColorMutation,\n ExcelRangeSetFontColorMutation,\n ExcelRangeSetRowHeightMutation,\n ExcelWorkbookMutation,\n} from './mutations.js';\n\ntype ReplayableRangeFormatMutation =\n | Omit<ExcelRangeSetFontColorMutation, 'sheetId' | 'sheetName'>\n | Omit<ExcelRangeSetFillForegroundColorMutation, 'sheetId' | 'sheetName'>\n | Omit<ExcelRangeSetBorderMutation, 'sheetId' | 'sheetName'>;\n\nexport class ExcelRange {\n readonly format: ExcelRangeFormat;\n private readonly sheet: ExcelSheetModel;\n private readonly styles: ExcelStylesModel;\n private readonly ref: RangeAddress;\n private readonly cellsByAddress: Map<string, ExcelCellModel>;\n private readonly recordMutation?: ExcelMutationRecorder;\n\n constructor(\n sheet: ExcelSheetModel,\n address: string,\n styles: ExcelStylesModel = createEmptyStyles(),\n recordMutation?: ExcelMutationRecorder,\n ) {\n this.sheet = sheet;\n this.styles = styles;\n this.recordMutation = recordMutation;\n this.ref = parseRangeAddress(address);\n if (this.ref.sheetName && this.ref.sheetName !== sheet.name) {\n throw new Error(\n `ExcelRange: address sheet '${this.ref.sheetName}' does not match worksheet '${sheet.name}'`,\n );\n }\n this.cellsByAddress = new Map(sheet.cells.map((cell) => [cell.address, cell]));\n this.format = new ExcelRangeFormat(this);\n }\n\n address(): string {\n return this.ref.address;\n }\n\n rowIndex(): number {\n return this.ref.startRow;\n }\n\n columnIndex(): number {\n return this.ref.startColumn;\n }\n\n rowCount(): number {\n return this.ref.rowCount;\n }\n\n columnCount(): number {\n return this.ref.columnCount;\n }\n\n values(): ExcelCellValue[][] {\n return this.matrix((cell) => cell.value);\n }\n\n formulas(): (string | null)[][] {\n return this.matrix((cell) => cell.formula ?? null);\n }\n\n text(): string[][] {\n return this.matrix((cell) => cellToText(cell));\n }\n\n valueTypes(): ExcelCellKind[][] {\n return this.matrix((cell) => cell.kind);\n }\n\n rawValues(): (string | null)[][] {\n return this.matrix((cell) => cell.rawValue ?? null);\n }\n\n styleIds(): (number | undefined)[][] {\n return this.matrix((cell) => cell.styleId);\n }\n\n setStyleId(styleId: number | undefined): void {\n if (styleId !== undefined && (!Number.isInteger(styleId) || styleId < 0)) {\n throw new Error(`ExcelRange.setStyleId: styleId must be a non-negative integer`);\n }\n for (let r = 0; r < this.ref.rowCount; r++) {\n for (let c = 0; c < this.ref.columnCount; c++) {\n const address = formatCellAddress(this.ref.startRow + r, this.ref.startColumn + c);\n const cell = this.ensureCell(address);\n if (styleId === undefined) delete cell.styleId;\n else cell.styleId = styleId;\n }\n }\n normalizeSheetCells(this.sheet);\n this.recordMutation?.({\n kind: 'unsafe',\n scope: 'range',\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n reason: 'range.setStyleId is not replayable by first-phase mutation writeback',\n });\n }\n\n rowHeights(): Array<number | undefined> {\n const heights: Array<number | undefined> = [];\n for (let r = 0; r < this.ref.rowCount; r++) {\n const rowIndex = this.ref.startRow + r;\n heights.push(this.sheet.rows.find((row) => row.index === rowIndex)?.height);\n }\n return heights;\n }\n\n setRowHeight(height: number | undefined): void {\n if (height !== undefined && (!Number.isFinite(height) || height < 0)) {\n throw new Error(`ExcelRange.setRowHeight: height must be a non-negative number`);\n }\n for (let r = 0; r < this.ref.rowCount; r++) {\n const row = this.ensureRow(this.ref.startRow + r);\n if (height === undefined) {\n delete row.height;\n delete row.customHeight;\n } else {\n row.height = height;\n row.customHeight = true;\n }\n }\n this.recordMutation?.({\n kind: 'range.setRowHeight',\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n address: this.ref.address,\n height,\n });\n }\n\n columnWidths(): Array<number | undefined> {\n const widths: Array<number | undefined> = [];\n for (let c = 0; c < this.ref.columnCount; c++) {\n const columnIndex = this.ref.startColumn + c;\n widths.push(\n this.sheet.columns.find((column) => column.min <= columnIndex && column.max >= columnIndex)\n ?.width,\n );\n }\n return widths;\n }\n\n setColumnWidth(width: number | undefined): void {\n if (width !== undefined && (!Number.isFinite(width) || width < 0)) {\n throw new Error(`ExcelRange.setColumnWidth: width must be a non-negative number`);\n }\n for (let c = 0; c < this.ref.columnCount; c++) {\n const column = this.ensureColumn(this.ref.startColumn + c);\n if (width === undefined) {\n delete column.width;\n delete column.customWidth;\n } else {\n column.width = width;\n column.customWidth = true;\n }\n }\n normalizeColumns(this.sheet);\n this.recordMutation?.({\n kind: 'range.setColumnWidth',\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n address: this.ref.address,\n width,\n });\n }\n\n merge(): void {\n const masterAddress = formatCellAddress(this.ref.startRow, this.ref.startColumn);\n for (let r = 0; r < this.ref.rowCount; r++) {\n for (let c = 0; c < this.ref.columnCount; c++) {\n const address = formatCellAddress(this.ref.startRow + r, this.ref.startColumn + c);\n if (address !== masterAddress) this.clearCellContent(address);\n }\n }\n normalizeSheetCells(this.sheet);\n if (!this.sheet.mergedRanges.some((range) => range.address === this.ref.address)) {\n this.sheet.mergedRanges.push({ address: this.ref.address });\n }\n this.recordMutation?.({\n kind: 'range.merge',\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n address: this.ref.address,\n });\n }\n\n unmerge(): void {\n this.sheet.mergedRanges = this.sheet.mergedRanges.filter(\n (range) => range.address !== this.ref.address,\n );\n this.recordMutation?.({\n kind: 'range.unmerge',\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n address: this.ref.address,\n });\n }\n\n setValues(values: ExcelCellValue[][]): void {\n this.assertMatrixShape(values, 'ExcelRange.setValues');\n for (let r = 0; r < this.ref.rowCount; r++) {\n for (let c = 0; c < this.ref.columnCount; c++) {\n const address = formatCellAddress(this.ref.startRow + r, this.ref.startColumn + c);\n this.setCellValue(address, values[r]![c]!);\n }\n }\n normalizeSheetCells(this.sheet);\n this.recordMutation?.({\n kind: 'range.setValues',\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n address: this.ref.address,\n values,\n });\n }\n\n setFormulas(formulas: (string | null)[][]): void {\n this.assertMatrixShape(formulas, 'ExcelRange.setFormulas');\n for (let r = 0; r < this.ref.rowCount; r++) {\n for (let c = 0; c < this.ref.columnCount; c++) {\n const address = formatCellAddress(this.ref.startRow + r, this.ref.startColumn + c);\n this.setCellFormula(address, formulas[r]![c]!);\n }\n }\n normalizeSheetCells(this.sheet);\n this.recordMutation?.({\n kind: 'range.setFormulas',\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n address: this.ref.address,\n formulas,\n });\n }\n\n clear(): void {\n for (let r = 0; r < this.ref.rowCount; r++) {\n for (let c = 0; c < this.ref.columnCount; c++) {\n const address = formatCellAddress(this.ref.startRow + r, this.ref.startColumn + c);\n this.deleteCell(address);\n }\n }\n normalizeSheetCells(this.sheet);\n this.recordMutation?.({\n kind: 'range.clear',\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n address: this.ref.address,\n });\n }\n\n getCell(rowOffset: number, columnOffset: number): ExcelCell {\n this.assertOffset(rowOffset, columnOffset);\n const row = this.ref.startRow + rowOffset;\n const column = this.ref.startColumn + columnOffset;\n return new ExcelCell(this.sheet, formatCellAddress(row, column), this.styles, this.recordMutation);\n }\n\n getRow(rowOffset: number): ExcelRange {\n if (!Number.isInteger(rowOffset) || rowOffset < 0 || rowOffset >= this.ref.rowCount) {\n throw new Error(`ExcelRange.getRow: row offset out of bounds: ${rowOffset}`);\n }\n const row = this.ref.startRow + rowOffset;\n const start = formatCellAddress(row, this.ref.startColumn);\n const end = formatCellAddress(row, this.ref.startColumn + this.ref.columnCount - 1);\n return new ExcelRange(this.sheet, `${start}:${end}`, this.styles, this.recordMutation);\n }\n\n getColumn(columnOffset: number): ExcelRange {\n if (\n !Number.isInteger(columnOffset) ||\n columnOffset < 0 ||\n columnOffset >= this.ref.columnCount\n ) {\n throw new Error(`ExcelRange.getColumn: column offset out of bounds: ${columnOffset}`);\n }\n const column = this.ref.startColumn + columnOffset;\n const start = formatCellAddress(this.ref.startRow, column);\n const end = formatCellAddress(this.ref.startRow + this.ref.rowCount - 1, column);\n return new ExcelRange(this.sheet, `${start}:${end}`, this.styles, this.recordMutation);\n }\n\n resize(rowCount: number, columnCount: number): ExcelRange {\n return new ExcelRange(\n this.sheet,\n formatRangeAddress(this.ref.startRow, this.ref.startColumn, rowCount, columnCount),\n this.styles,\n this.recordMutation,\n );\n }\n\n offset(\n rowOffset: number,\n columnOffset: number,\n rowCount = this.ref.rowCount,\n columnCount = this.ref.columnCount,\n ): ExcelRange {\n if (!Number.isInteger(rowOffset) || !Number.isInteger(columnOffset)) {\n throw new Error(`ExcelRange.offset: offsets must be integers`);\n }\n return new ExcelRange(\n this.sheet,\n formatRangeAddress(\n this.ref.startRow + rowOffset,\n this.ref.startColumn + columnOffset,\n rowCount,\n columnCount,\n ),\n this.styles,\n this.recordMutation,\n );\n }\n\n slice(\n rowOffset: number,\n columnOffset: number,\n rowCount: number,\n columnCount: number,\n ): ExcelRange {\n if (\n !Number.isInteger(rowOffset) ||\n !Number.isInteger(columnOffset) ||\n !Number.isInteger(rowCount) ||\n !Number.isInteger(columnCount) ||\n rowOffset < 0 ||\n columnOffset < 0 ||\n rowCount < 1 ||\n columnCount < 1 ||\n rowOffset + rowCount > this.ref.rowCount ||\n columnOffset + columnCount > this.ref.columnCount\n ) {\n throw new Error(\n `ExcelRange.slice: range out of bounds row=${rowOffset}, column=${columnOffset}, rows=${rowCount}, columns=${columnCount}`,\n );\n }\n return new ExcelRange(\n this.sheet,\n formatRangeAddress(\n this.ref.startRow + rowOffset,\n this.ref.startColumn + columnOffset,\n rowCount,\n columnCount,\n ),\n this.styles,\n this.recordMutation,\n );\n }\n\n toModel(): ExcelCellModel[] {\n const cells: ExcelCellModel[] = [];\n for (let r = 0; r < this.ref.rowCount; r++) {\n for (let c = 0; c < this.ref.columnCount; c++) {\n const address = formatCellAddress(this.ref.startRow + r, this.ref.startColumn + c);\n const cell = this.cellsByAddress.get(address);\n if (cell) cells.push({ ...cell });\n }\n }\n return cells;\n }\n\n getResolvedFormat(): ExcelCellFormatModel {\n const cell = this.firstCell();\n return cloneCellFormat(this.styles.cellFormats[cell?.styleId ?? 0] ?? {});\n }\n\n updateFormat(\n update: (format: ExcelCellFormatModel) => ExcelCellFormatModel,\n options: { recordUnsafe?: boolean } = {},\n ): void {\n for (let r = 0; r < this.ref.rowCount; r++) {\n for (let c = 0; c < this.ref.columnCount; c++) {\n const address = formatCellAddress(this.ref.startRow + r, this.ref.startColumn + c);\n const cell = this.ensureCell(address);\n const current = cloneCellFormat(this.styles.cellFormats[cell.styleId ?? 0] ?? {});\n cell.styleId = ensureCellFormat(this.styles, update(current));\n }\n }\n normalizeSheetCells(this.sheet);\n if (options.recordUnsafe ?? true) {\n this.recordMutation?.({\n kind: 'unsafe',\n scope: 'range',\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n reason: 'range.updateFormat is not replayable by first-phase mutation writeback',\n });\n }\n }\n\n recordReplayableMutation(mutation: ReplayableRangeFormatMutation): void {\n this.recordMutation?.({\n ...mutation,\n sheetId: this.sheet.id,\n sheetName: this.sheet.name,\n } as ExcelWorkbookMutation);\n }\n\n ensureFont(font: ExcelFontModel): number {\n return ensureStyleItem(this.styles.fonts, font, cloneFont);\n }\n\n ensureFill(fill: ExcelFillModel): number {\n return ensureStyleItem(this.styles.fills, fill, cloneFill);\n }\n\n ensureBorder(border: ExcelBorderModel): number {\n return ensureStyleItem(this.styles.borders, border, cloneBorder);\n }\n\n ensureNumberFormat(code: string): number {\n const builtIn = builtInNumberFormatId(code);\n if (builtIn !== undefined) return builtIn;\n const existing = this.styles.numberFormats.find((format) => format.code === code);\n if (existing) return existing.id;\n const maxId = this.styles.numberFormats.reduce((max, format) => Math.max(max, format.id), 163);\n const next = { id: maxId + 1, code };\n this.styles.numberFormats.push(next);\n return next.id;\n }\n\n fontById(id: number | undefined): ExcelFontModel {\n return cloneFont(this.styles.fonts[id ?? 0] ?? {});\n }\n\n fillById(id: number | undefined): ExcelFillModel {\n return cloneFill(this.styles.fills[id ?? 0] ?? {});\n }\n\n borderById(id: number | undefined): ExcelBorderModel {\n return cloneBorder(this.styles.borders[id ?? 0] ?? {});\n }\n\n private matrix<T>(read: (cell: ExcelCellModel) => T): T[][] {\n const rows: T[][] = [];\n for (let r = 0; r < this.ref.rowCount; r++) {\n const row: T[] = [];\n for (let c = 0; c < this.ref.columnCount; c++) {\n const address = formatCellAddress(this.ref.startRow + r, this.ref.startColumn + c);\n row.push(read(this.cellsByAddress.get(address) ?? blankCell(address)));\n }\n rows.push(row);\n }\n return rows;\n }\n\n private assertOffset(rowOffset: number, columnOffset: number): void {\n if (\n !Number.isInteger(rowOffset) ||\n !Number.isInteger(columnOffset) ||\n rowOffset < 0 ||\n columnOffset < 0 ||\n rowOffset >= this.ref.rowCount ||\n columnOffset >= this.ref.columnCount\n ) {\n throw new Error(\n `ExcelRange.getCell: offset out of bounds: row=${rowOffset}, column=${columnOffset}`,\n );\n }\n }\n\n private assertMatrixShape<T>(matrix: T[][], operation: string): void {\n if (matrix.length !== this.ref.rowCount) {\n throw new Error(\n `${operation}: expected ${this.ref.rowCount} rows, received ${matrix.length}`,\n );\n }\n for (let r = 0; r < matrix.length; r++) {\n if (!Array.isArray(matrix[r]) || matrix[r]!.length !== this.ref.columnCount) {\n throw new Error(\n `${operation}: expected row ${r} to contain ${this.ref.columnCount} columns`,\n );\n }\n }\n }\n\n private setCellValue(address: string, value: ExcelCellValue): void {\n if (value === null) {\n this.deleteCell(address);\n return;\n }\n const cell = this.ensureCell(address);\n cell.value = value;\n cell.kind =\n typeof value === 'boolean' ? 'boolean' : typeof value === 'number' ? 'number' : 'string';\n delete cell.formula;\n delete cell.rawValue;\n delete cell.dataType;\n delete cell.sharedStringIndex;\n }\n\n private setCellFormula(address: string, formula: string | null): void {\n if (formula === null) {\n this.deleteCell(address);\n return;\n }\n const cell = this.ensureCell(address);\n cell.kind = 'formula';\n cell.formula = formula.startsWith('=') ? formula.slice(1) : formula;\n cell.value = null;\n delete cell.rawValue;\n delete cell.dataType;\n delete cell.sharedStringIndex;\n }\n\n private ensureCell(address: string): ExcelCellModel {\n const existing = this.cellsByAddress.get(address);\n if (existing) return existing;\n const cell = blankCell(address);\n this.sheet.cells.push(cell);\n this.cellsByAddress.set(address, cell);\n return cell;\n }\n\n private deleteCell(address: string): void {\n const cell = this.cellsByAddress.get(address);\n if (!cell) return;\n this.cellsByAddress.delete(address);\n const index = this.sheet.cells.indexOf(cell);\n if (index !== -1) this.sheet.cells.splice(index, 1);\n }\n\n private clearCellContent(address: string): void {\n const cell = this.cellsByAddress.get(address);\n if (!cell) return;\n if (cell.styleId === undefined) {\n this.deleteCell(address);\n return;\n }\n cell.kind = 'blank';\n cell.value = null;\n delete cell.formula;\n delete cell.rawValue;\n delete cell.dataType;\n delete cell.sharedStringIndex;\n }\n\n private ensureRow(index: number) {\n let row = this.sheet.rows.find((item) => item.index === index);\n if (!row) {\n row = { index };\n this.sheet.rows.push(row);\n this.sheet.rows.sort((a, b) => a.index - b.index);\n }\n return row;\n }\n\n private ensureColumn(index: number) {\n let column = this.sheet.columns.find((item) => item.min === index && item.max === index);\n if (!column) {\n column = { min: index, max: index };\n this.sheet.columns.push(column);\n }\n return column;\n }\n\n private firstCell(): ExcelCellModel | undefined {\n for (let r = 0; r < this.ref.rowCount; r++) {\n for (let c = 0; c < this.ref.columnCount; c++) {\n const address = formatCellAddress(this.ref.startRow + r, this.ref.startColumn + c);\n const cell = this.cellsByAddress.get(address);\n if (cell) return cell;\n }\n }\n return undefined;\n }\n}\n\nexport class ExcelCell {\n private readonly range: ExcelRange;\n\n constructor(\n sheet: ExcelSheetModel,\n address: string,\n styles?: ExcelStylesModel,\n recordMutation?: ExcelMutationRecorder,\n ) {\n this.range = new ExcelRange(sheet, address, styles, recordMutation);\n }\n\n address(): string {\n return this.range.address();\n }\n\n value(): ExcelCellValue {\n return this.range.values()[0]?.[0] ?? null;\n }\n\n formula(): string | null {\n return this.range.formulas()[0]?.[0] ?? null;\n }\n\n text(): string {\n return this.range.text()[0]?.[0] ?? '';\n }\n\n valueType(): ExcelCellKind {\n return this.range.valueTypes()[0]?.[0] ?? 'blank';\n }\n\n rawValue(): string | null {\n return this.range.rawValues()[0]?.[0] ?? null;\n }\n\n styleId(): number | undefined {\n return this.range.styleIds()[0]?.[0];\n }\n\n setStyleId(styleId: number | undefined): void {\n this.range.setStyleId(styleId);\n }\n\n setValue(value: ExcelCellValue): void {\n this.range.setValues([[value]]);\n }\n\n setFormula(formula: string | null): void {\n this.range.setFormulas([[formula]]);\n }\n\n clear(): void {\n this.range.clear();\n }\n\n toRange(): ExcelRange {\n return this.range;\n }\n\n toModel(): ExcelCellModel | null {\n return this.range.toModel()[0] ? { ...this.range.toModel()[0]! } : null;\n }\n}\n\nexport class ExcelRangeFormat {\n readonly font: ExcelRangeFontFormat;\n readonly fill: ExcelRangeFillFormat;\n readonly border: ExcelRangeBorderFormat;\n readonly alignment: ExcelRangeAlignmentFormat;\n\n constructor(private readonly range: ExcelRange) {\n this.font = new ExcelRangeFontFormat(range);\n this.fill = new ExcelRangeFillFormat(range);\n this.border = new ExcelRangeBorderFormat(range);\n this.alignment = new ExcelRangeAlignmentFormat(range);\n }\n\n numberFormatCode(): string | undefined {\n return this.range.getResolvedFormat().numberFormatCode;\n }\n\n setNumberFormatCode(code: string | undefined): void {\n this.range.updateFormat((format) => {\n if (code === undefined) {\n delete format.numberFormatCode;\n delete format.numberFormatId;\n delete format.applyNumberFormat;\n } else {\n format.numberFormatCode = code;\n format.numberFormatId = this.range.ensureNumberFormat(code);\n format.applyNumberFormat = true;\n }\n return format;\n });\n }\n}\n\nexport class ExcelRangeFontFormat {\n constructor(private readonly range: ExcelRange) {}\n\n value(): ExcelFontModel {\n return this.range.fontById(this.range.getResolvedFormat().fontId);\n }\n\n setValue(font: ExcelFontModel, options: { recordUnsafe?: boolean } = {}): void {\n const normalized = {\n ...font,\n color: normalizeExcelColor(font.color, 'ExcelRange.format.font.setValue'),\n };\n removeUndefined(normalized);\n this.range.updateFormat(\n (format) => {\n format.fontId = this.range.ensureFont(normalized);\n format.applyFont = true;\n return format;\n },\n options,\n );\n }\n\n bold(): boolean | undefined {\n return this.value().bold;\n }\n\n setBold(value: boolean | undefined): void {\n this.patch({ bold: value });\n }\n\n italic(): boolean | undefined {\n return this.value().italic;\n }\n\n setItalic(value: boolean | undefined): void {\n this.patch({ italic: value });\n }\n\n underline(): boolean | undefined {\n return this.value().underline;\n }\n\n setUnderline(value: boolean | undefined): void {\n this.patch({ underline: value });\n }\n\n color(): ExcelColorModel | undefined {\n return this.value().color;\n }\n\n setColor(color: ExcelColorModel | undefined): void {\n const normalized = normalizeExcelColor(color, 'ExcelRange.format.font.setColor');\n this.patch({ color: normalized }, { recordUnsafe: false });\n this.range.recordReplayableMutation({\n kind: 'range.format.font.setColor',\n address: this.range.address(),\n color: normalized,\n });\n }\n\n size(): number | undefined {\n return this.value().size;\n }\n\n setSize(size: number | undefined): void {\n this.patch({ size });\n }\n\n name(): string | undefined {\n return this.value().name;\n }\n\n setName(name: string | undefined): void {\n this.patch({ name });\n }\n\n private patch(patch: Partial<ExcelFontModel>, options: { recordUnsafe?: boolean } = {}): void {\n this.range.updateFormat(\n (format) => {\n const next = {\n ...this.range.fontById(format.fontId),\n ...patch,\n };\n removeUndefined(next);\n format.fontId = this.range.ensureFont(next);\n format.applyFont = true;\n return format;\n },\n options,\n );\n }\n}\n\nexport class ExcelRangeFillFormat {\n constructor(private readonly range: ExcelRange) {}\n\n value(): ExcelFillModel {\n return this.range.fillById(this.range.getResolvedFormat().fillId);\n }\n\n setValue(fill: ExcelFillModel, options: { recordUnsafe?: boolean } = {}): void {\n const normalized = {\n ...fill,\n patternType: fill.patternType ?? (fill.foregroundColor ? 'solid' : undefined),\n foregroundColor: normalizeExcelColor(\n fill.foregroundColor,\n 'ExcelRange.format.fill.setValue.foregroundColor',\n ),\n backgroundColor: normalizeExcelColor(\n fill.backgroundColor,\n 'ExcelRange.format.fill.setValue.backgroundColor',\n ),\n };\n removeUndefined(normalized);\n this.range.updateFormat(\n (format) => {\n format.fillId = this.range.ensureFill(normalized);\n format.applyFill = true;\n return format;\n },\n options,\n );\n }\n\n patternType(): string | undefined {\n return this.value().patternType;\n }\n\n setPatternType(patternType: string | undefined): void {\n this.patch({ patternType });\n }\n\n foregroundColor(): ExcelColorModel | undefined {\n return this.value().foregroundColor;\n }\n\n setForegroundColor(color: ExcelColorModel | undefined): void {\n const normalized = normalizeExcelColor(color, 'ExcelRange.format.fill.setForegroundColor');\n this.patch(\n {\n foregroundColor: normalized,\n patternType: normalized ? 'solid' : this.patternType(),\n },\n { recordUnsafe: false },\n );\n this.range.recordReplayableMutation({\n kind: 'range.format.fill.setForegroundColor',\n address: this.range.address(),\n color: normalized,\n });\n }\n\n backgroundColor(): ExcelColorModel | undefined {\n return this.value().backgroundColor;\n }\n\n setBackgroundColor(color: ExcelColorModel | undefined): void {\n this.patch({\n backgroundColor: normalizeExcelColor(color, 'ExcelRange.format.fill.setBackgroundColor'),\n });\n }\n\n private patch(patch: Partial<ExcelFillModel>, options: { recordUnsafe?: boolean } = {}): void {\n const next = { ...this.value(), ...patch };\n removeUndefined(next);\n this.setValue(next, options);\n }\n}\n\nexport class ExcelRangeBorderFormat {\n constructor(private readonly range: ExcelRange) {}\n\n value(): ExcelBorderModel {\n return this.range.borderById(this.range.getResolvedFormat().borderId);\n }\n\n setValue(border: ExcelBorderModel): void {\n const normalized = normalizeBorder(border, 'ExcelRange.format.border.setValue');\n this.range.updateFormat(\n (format) => {\n format.borderId = this.range.ensureBorder(normalized);\n format.applyBorder = true;\n return format;\n },\n { recordUnsafe: false },\n );\n this.range.recordReplayableMutation({\n kind: 'range.format.border.setValue',\n address: this.range.address(),\n border: normalized,\n });\n }\n\n setLeft(side: ExcelBorderModel['left']): void {\n this.patch({ left: side });\n }\n\n setRight(side: ExcelBorderModel['right']): void {\n this.patch({ right: side });\n }\n\n setTop(side: ExcelBorderModel['top']): void {\n this.patch({ top: side });\n }\n\n setBottom(side: ExcelBorderModel['bottom']): void {\n this.patch({ bottom: side });\n }\n\n private patch(patch: Partial<ExcelBorderModel>): void {\n const next = { ...this.value(), ...patch };\n removeUndefined(next);\n this.setValue(next);\n }\n}\n\nfunction normalizeBorder(border: ExcelBorderModel, context: string): ExcelBorderModel {\n const normalized: ExcelBorderModel = {};\n for (const name of ['left', 'right', 'top', 'bottom', 'diagonal'] as const) {\n const side = border[name];\n if (!side) continue;\n normalized[name] = {\n ...side,\n color: normalizeExcelColor(side.color, `${context}.${name}.color`),\n };\n removeUndefined(normalized[name]!);\n }\n return normalized;\n}\n\nexport class ExcelRangeAlignmentFormat {\n constructor(private readonly range: ExcelRange) {}\n\n value(): ExcelAlignmentModel | undefined {\n const value = this.range.getResolvedFormat().alignment;\n return value ? { ...value } : undefined;\n }\n\n setValue(alignment: ExcelAlignmentModel | undefined): void {\n this.range.updateFormat((format) => {\n if (alignment === undefined) {\n delete format.alignment;\n delete format.applyAlignment;\n } else {\n format.alignment = { ...alignment };\n format.applyAlignment = true;\n }\n return format;\n });\n }\n\n setHorizontal(horizontal: string | undefined): void {\n this.patch({ horizontal });\n }\n\n setVertical(vertical: string | undefined): void {\n this.patch({ vertical });\n }\n\n setWrapText(wrapText: boolean | undefined): void {\n this.patch({ wrapText });\n }\n\n private patch(patch: Partial<ExcelAlignmentModel>): void {\n const next = { ...(this.value() ?? {}), ...patch };\n removeUndefined(next);\n this.setValue(Object.keys(next).length ? next : undefined);\n }\n}\n\nfunction blankCell(address: string): ExcelCellModel {\n const match = /^([A-Z]+)(\\d+)$/.exec(address);\n return {\n address,\n row: match ? Number(match[2]) : 0,\n column: match ? columnNameToIndexSafe(match[1]!) : 0,\n kind: 'blank',\n value: null,\n };\n}\n\nfunction columnNameToIndexSafe(columnName: string): number {\n let value = 0;\n for (const ch of columnName) value = value * 26 + (ch.charCodeAt(0) - 64);\n return value;\n}\n\nfunction cellToText(cell: ExcelCellModel): string {\n if (cell.value === null) return '';\n return String(cell.value);\n}\n\nfunction normalizeSheetCells(sheet: ExcelSheetModel): void {\n sheet.cells.sort((a, b) => a.row - b.row || a.column - b.column);\n sheet.dimension = computeDimension(sheet.cells);\n}\n\nfunction normalizeColumns(sheet: ExcelSheetModel): void {\n sheet.columns.sort((a, b) => a.min - b.min || a.max - b.max);\n}\n\nfunction createEmptyStyles(): ExcelStylesModel {\n return {\n numberFormats: [],\n fonts: [{}],\n fills: [{}, { patternType: 'gray125' }],\n borders: [{}],\n cellFormats: [{}],\n };\n}\n\nfunction ensureCellFormat(styles: ExcelStylesModel, format: ExcelCellFormatModel): number {\n const normalized = cloneCellFormat(format);\n removeUndefined(normalized);\n return ensureStyleItem(styles.cellFormats, normalized, cloneCellFormat);\n}\n\nfunction ensureStyleItem<T>(items: T[], item: T, clone: (value: T) => T): number {\n const normalized = clone(item);\n removeUndefined(normalized as object);\n const key = stableStringify(normalized);\n const existing = items.findIndex((candidate) => stableStringify(candidate) === key);\n if (existing !== -1) return existing;\n items.push(normalized);\n return items.length - 1;\n}\n\nfunction cloneCellFormat(format: ExcelCellFormatModel): ExcelCellFormatModel {\n return {\n ...format,\n alignment: format.alignment ? { ...format.alignment } : undefined,\n };\n}\n\nfunction cloneFont(font: ExcelFontModel): ExcelFontModel {\n return { ...font, color: font.color ? { ...font.color } : undefined };\n}\n\nfunction cloneFill(fill: ExcelFillModel): ExcelFillModel {\n return {\n ...fill,\n foregroundColor: fill.foregroundColor ? { ...fill.foregroundColor } : undefined,\n backgroundColor: fill.backgroundColor ? { ...fill.backgroundColor } : undefined,\n };\n}\n\nfunction cloneBorder(border: ExcelBorderModel): ExcelBorderModel {\n return {\n left: border.left\n ? { ...border.left, color: border.left.color ? { ...border.left.color } : undefined }\n : undefined,\n right: border.right\n ? { ...border.right, color: border.right.color ? { ...border.right.color } : undefined }\n : undefined,\n top: border.top\n ? { ...border.top, color: border.top.color ? { ...border.top.color } : undefined }\n : undefined,\n bottom: border.bottom\n ? { ...border.bottom, color: border.bottom.color ? { ...border.bottom.color } : undefined }\n : undefined,\n diagonal: border.diagonal\n ? {\n ...border.diagonal,\n color: border.diagonal.color ? { ...border.diagonal.color } : undefined,\n }\n : undefined,\n };\n}\n\nfunction removeUndefined(value: object): void {\n for (const key of Object.keys(value)) {\n if ((value as Record<string, unknown>)[key] === undefined)\n delete (value as Record<string, unknown>)[key];\n }\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;\n return `{${Object.keys(value as Record<string, unknown>)\n .sort()\n .map(\n (key) => `${JSON.stringify(key)}:${stableStringify((value as Record<string, unknown>)[key])}`,\n )\n .join(',')}}`;\n}\n\nfunction builtInNumberFormatId(code: string): number | undefined {\n const builtIns: Record<string, number> = {\n General: 0,\n '0': 1,\n '0.00': 2,\n '#,##0': 3,\n '#,##0.00': 4,\n '0%': 9,\n '0.00%': 10,\n };\n return builtIns[code];\n}\n\nfunction computeDimension(cells: ExcelCellModel[]): string | undefined {\n if (cells.length === 0) return undefined;\n let minRow = Number.POSITIVE_INFINITY;\n let minColumn = Number.POSITIVE_INFINITY;\n let maxRow = 0;\n let maxColumn = 0;\n for (const cell of cells) {\n minRow = Math.min(minRow, cell.row);\n minColumn = Math.min(minColumn, cell.column);\n maxRow = Math.max(maxRow, cell.row);\n maxColumn = Math.max(maxColumn, cell.column);\n }\n return formatRangeAddress(minRow, minColumn, maxRow - minRow + 1, maxColumn - minColumn + 1);\n}\n","import type {\n ExcelChartAddOptions,\n ExcelChartModel,\n ExcelCommentModel,\n ExcelConditionalFormatModel,\n ExcelConditionalFormatRuleModel,\n ExcelDataValidationModel,\n ExcelDrawingAnchorModel,\n ExcelDrawingMarkerModel,\n ExcelDrawingModel,\n ExcelHyperlinkModel,\n ExcelImageModel,\n ExcelShapeModel,\n ExcelTableAutoFilterModel,\n ExcelTableColumnModel,\n ExcelTableModel,\n ExcelTableSortStateModel,\n ExcelTableStyleModel,\n ExcelThreadedCommentModel,\n} from './model.js';\nimport { parseRangeAddress } from './address.js';\n\nexport class ExcelTable {\n readonly columns: ExcelTableColumnCollection;\n readonly style: ExcelTableStyle;\n\n constructor(\n private readonly model: ExcelTableModel,\n private readonly remove?: () => void,\n ) {\n this.columns = new ExcelTableColumnCollection(() => this.model.columns);\n this.style = new ExcelTableStyle(() => (this.model.style ??= {}));\n }\n\n id(): number | undefined {\n return this.model.id;\n }\n\n name(): string | undefined {\n return this.model.name;\n }\n\n displayName(): string | undefined {\n return this.model.displayName;\n }\n\n setName(name: string): void {\n this.model.name = name;\n }\n\n setDisplayName(displayName: string): void {\n this.model.displayName = displayName;\n }\n\n rangeAddress(): string | undefined {\n return this.model.ref;\n }\n\n setRange(address: string): void {\n parseRangeAddress(address);\n this.model.ref = address;\n if (this.model.autoFilterRef) this.setAutoFilterRange(address);\n }\n\n resize(address: string): void {\n this.setRange(address);\n const range = parseRangeAddress(address);\n const current = this.model.columns;\n if (range.columnCount < current.length) {\n current.splice(range.columnCount);\n }\n while (current.length < range.columnCount) {\n const id = nextTableColumnId(current);\n current.push({ id, name: `Column${id}` });\n }\n }\n\n autoFilterRangeAddress(): string | undefined {\n return this.model.autoFilterRef;\n }\n\n setAutoFilterRange(address: string | undefined): void {\n if (address !== undefined) parseRangeAddress(address);\n this.model.autoFilterRef = address;\n if (address === undefined) {\n delete this.model.autoFilter;\n } else {\n this.model.autoFilter ??= { ref: address, filterColumns: [] };\n this.model.autoFilter.ref = address;\n }\n }\n\n headerRowCount(): number | undefined {\n return this.model.headerRowCount;\n }\n\n setHeaderRowCount(count: number | undefined): void {\n assertOptionalNonNegativeInteger(count, 'ExcelTable.setHeaderRowCount');\n this.model.headerRowCount = count;\n }\n\n totalsRowCount(): number | undefined {\n return this.model.totalsRowCount;\n }\n\n setTotalsRowCount(count: number | undefined): void {\n assertOptionalNonNegativeInteger(count, 'ExcelTable.setTotalsRowCount');\n this.model.totalsRowCount = count;\n }\n\n totalsRowShown(): boolean | undefined {\n return this.model.totalsRowShown;\n }\n\n setTotalsRowShown(value: boolean | undefined): void {\n this.model.totalsRowShown = value;\n }\n\n autoFilter(): ExcelTableAutoFilterModel | undefined {\n return this.model.autoFilter ? cloneAutoFilter(this.model.autoFilter) : undefined;\n }\n\n setAutoFilter(model: ExcelTableAutoFilterModel | undefined): void {\n if (!model) {\n delete this.model.autoFilter;\n delete this.model.autoFilterRef;\n return;\n }\n const copy = cloneAutoFilter(model);\n if (copy.ref) parseRangeAddress(copy.ref);\n this.model.autoFilter = copy;\n this.model.autoFilterRef = copy.ref;\n }\n\n sortState(): ExcelTableSortStateModel | undefined {\n return this.model.autoFilter?.sortState ? cloneSortState(this.model.autoFilter.sortState) : undefined;\n }\n\n setSortState(sortState: ExcelTableSortStateModel | undefined): void {\n if (!sortState) {\n if (this.model.autoFilter) delete this.model.autoFilter.sortState;\n return;\n }\n this.model.autoFilter ??= { ref: this.model.autoFilterRef ?? this.model.ref, filterColumns: [] };\n this.model.autoFilter.sortState = cloneSortState(sortState);\n }\n\n toModel(): ExcelTableModel {\n return cloneTable(this.model);\n }\n\n delete(): void {\n this.remove?.();\n }\n}\n\nexport class ExcelTableColumn {\n constructor(\n private readonly model: ExcelTableColumnModel,\n private readonly remove?: () => void,\n ) {}\n\n id(): number {\n return this.model.id;\n }\n\n name(): string {\n return this.model.name;\n }\n\n setName(name: string): void {\n this.model.name = name;\n }\n\n totalsRowLabel(): string | undefined {\n return this.model.totalsRowLabel;\n }\n\n setTotalsRowLabel(label: string | undefined): void {\n this.model.totalsRowLabel = label;\n }\n\n totalsRowFunction(): string | undefined {\n return this.model.totalsRowFunction;\n }\n\n setTotalsRowFunction(fn: string | undefined): void {\n this.model.totalsRowFunction = fn;\n }\n\n toModel(): ExcelTableColumnModel {\n return { ...this.model };\n }\n\n delete(): void {\n this.remove?.();\n }\n}\n\nexport class ExcelTableColumnCollection {\n constructor(private readonly getModels: () => ExcelTableColumnModel[]) {}\n\n items(): ExcelTableColumn[] {\n return this.getModels().map((model) => this.wrap(model));\n }\n\n getItem(nameOrId: string | number): ExcelTableColumn {\n const item = this.getItemOrNullObject(nameOrId);\n if (!item) throw new Error(`ExcelTableColumnCollection: column not found: ${nameOrId}`);\n return item;\n }\n\n getItemOrNullObject(nameOrId: string | number): ExcelTableColumn | null {\n const model = this.getModels().find((column) => column.name === nameOrId || column.id === nameOrId);\n return model ? this.wrap(model) : null;\n }\n\n add(model: ExcelTableColumnModel): ExcelTableColumn {\n const models = this.getModels();\n if (models.some((column) => column.name === model.name || column.id === model.id)) {\n throw new Error(`ExcelTableColumnCollection: duplicate column: ${model.name || model.id}`);\n }\n const copy = { ...model, id: model.id ?? nextTableColumnId(models) };\n this.getModels().push(copy);\n return this.wrap(copy);\n }\n\n delete(nameOrId: string | number): void {\n const models = this.getModels();\n const index = models.findIndex((column) => column.name === nameOrId || column.id === nameOrId);\n if (index >= 0) models.splice(index, 1);\n }\n\n deleteItem(nameOrId: string | number): void {\n const models = this.getModels();\n const index = models.findIndex((column) => column.name === nameOrId || column.id === nameOrId);\n if (index === -1) throw new Error(`ExcelTableColumnCollection: column not found: ${nameOrId}`);\n models.splice(index, 1);\n }\n\n toModel(): ExcelTableColumnModel[] {\n return this.getModels().map((column) => ({ ...column }));\n }\n\n private wrap(model: ExcelTableColumnModel): ExcelTableColumn {\n return new ExcelTableColumn(model, () => {\n const models = this.getModels();\n const index = models.indexOf(model);\n if (index >= 0) models.splice(index, 1);\n });\n }\n}\n\nexport class ExcelTableStyle {\n constructor(private readonly getModel: () => ExcelTableStyleModel) {}\n\n name(): string | undefined {\n return this.getModel().name;\n }\n\n setName(name: string | undefined): void {\n this.getModel().name = name;\n }\n\n showFirstColumn(): boolean | undefined {\n return this.getModel().showFirstColumn;\n }\n\n setShowFirstColumn(value: boolean | undefined): void {\n this.getModel().showFirstColumn = value;\n }\n\n showLastColumn(): boolean | undefined {\n return this.getModel().showLastColumn;\n }\n\n setShowLastColumn(value: boolean | undefined): void {\n this.getModel().showLastColumn = value;\n }\n\n showRowStripes(): boolean | undefined {\n return this.getModel().showRowStripes;\n }\n\n setShowRowStripes(value: boolean | undefined): void {\n this.getModel().showRowStripes = value;\n }\n\n showColumnStripes(): boolean | undefined {\n return this.getModel().showColumnStripes;\n }\n\n setShowColumnStripes(value: boolean | undefined): void {\n this.getModel().showColumnStripes = value;\n }\n\n toModel(): ExcelTableStyleModel {\n return { ...this.getModel() };\n }\n}\n\nexport class ExcelTableCollection {\n constructor(private readonly getModels: () => ExcelTableModel[]) {}\n\n items(): ExcelTable[] {\n return this.getModels().map((model) => this.wrap(model));\n }\n\n getItem(nameOrDisplayName: string): ExcelTable {\n const item = this.getItemOrNullObject(nameOrDisplayName);\n if (!item) throw new Error(`ExcelTableCollection: table not found: ${nameOrDisplayName}`);\n return item;\n }\n\n getItemOrNullObject(nameOrDisplayName: string): ExcelTable | null {\n const model =\n this.getModels().find((table) => table.name === nameOrDisplayName || table.displayName === nameOrDisplayName) ??\n null;\n return model ? this.wrap(model) : null;\n }\n\n add(model: ExcelTableModel): ExcelTable {\n const copy = cloneTable(model);\n this.getModels().push(copy);\n return this.wrap(copy);\n }\n\n delete(nameOrDisplayName: string): void {\n const models = this.getModels();\n const index = models.findIndex((table) => table.name === nameOrDisplayName || table.displayName === nameOrDisplayName);\n if (index >= 0) models.splice(index, 1);\n }\n\n toModel(): ExcelTableModel[] {\n return this.getModels().map((model) => cloneTable(model));\n }\n\n private wrap(model: ExcelTableModel): ExcelTable {\n return new ExcelTable(model, () => {\n const models = this.getModels();\n const index = models.indexOf(model);\n if (index >= 0) models.splice(index, 1);\n });\n }\n}\n\nexport class ExcelHyperlink {\n constructor(\n private readonly model: ExcelHyperlinkModel,\n private readonly remove?: () => void,\n ) {}\n\n ref(): string {\n return this.model.ref;\n }\n\n setRef(ref: string): void {\n this.model.ref = ref;\n }\n\n target(): string | undefined {\n return this.model.target;\n }\n\n targetMode(): string | undefined {\n return this.model.targetMode;\n }\n\n display(): string | undefined {\n return this.model.display;\n }\n\n setDisplay(display: string | undefined): void {\n this.model.display = display;\n }\n\n setLocation(location: string | undefined): void {\n this.model.location = location;\n }\n\n toModel(): ExcelHyperlinkModel {\n return { ...this.model };\n }\n\n delete(): void {\n this.remove?.();\n }\n}\n\nexport class ExcelHyperlinkCollection {\n constructor(private readonly getModels: () => ExcelHyperlinkModel[]) {}\n\n items(): ExcelHyperlink[] {\n return this.getModels().map((model) => this.wrap(model));\n }\n\n add(model: ExcelHyperlinkModel): ExcelHyperlink {\n const copy = { ...model };\n this.getModels().push(copy);\n return this.wrap(copy);\n }\n\n getItem(ref: string): ExcelHyperlink {\n const item = this.getItemOrNullObject(ref);\n if (!item) throw new Error(`hyperlink not found: ${ref}`);\n return item;\n }\n\n getItemOrNullObject(ref: string): ExcelHyperlink | null {\n const model = this.getModels().find((item) => item.ref === ref);\n return model ? this.wrap(model) : null;\n }\n\n delete(ref: string): void {\n const models = this.getModels();\n for (let i = models.length - 1; i >= 0; i--) {\n if (models[i]?.ref === ref) models.splice(i, 1);\n }\n }\n\n toModel(): ExcelHyperlinkModel[] {\n return this.getModels().map((model) => ({ ...model }));\n }\n\n private wrap(model: ExcelHyperlinkModel): ExcelHyperlink {\n return new ExcelHyperlink(model, () => {\n const models = this.getModels();\n const index = models.indexOf(model);\n if (index >= 0) models.splice(index, 1);\n });\n }\n}\n\nexport class ExcelDataValidation {\n constructor(\n private readonly model: ExcelDataValidationModel,\n private readonly remove?: () => void,\n ) {}\n\n rangeAddress(): string | undefined {\n return this.model.sqref;\n }\n\n setRange(address: string): void {\n this.model.sqref = address;\n }\n\n type(): string | undefined {\n return this.model.type;\n }\n\n setType(type: string | undefined): void {\n this.model.type = type;\n }\n\n operator(): string | undefined {\n return this.model.operator;\n }\n\n setOperator(operator: string | undefined): void {\n this.model.operator = operator;\n }\n\n allowBlank(): boolean | undefined {\n return this.model.allowBlank;\n }\n\n setAllowBlank(value: boolean | undefined): void {\n this.model.allowBlank = value;\n }\n\n showDropDown(): boolean | undefined {\n return this.model.showDropDown;\n }\n\n setShowDropDown(value: boolean | undefined): void {\n this.model.showDropDown = value;\n }\n\n showInputMessage(): boolean | undefined {\n return this.model.showInputMessage;\n }\n\n setShowInputMessage(value: boolean | undefined): void {\n this.model.showInputMessage = value;\n }\n\n showErrorMessage(): boolean | undefined {\n return this.model.showErrorMessage;\n }\n\n setShowErrorMessage(value: boolean | undefined): void {\n this.model.showErrorMessage = value;\n }\n\n errorStyle(): string | undefined {\n return this.model.errorStyle;\n }\n\n setErrorStyle(style: string | undefined): void {\n this.model.errorStyle = style;\n }\n\n errorTitle(): string | undefined {\n return this.model.errorTitle;\n }\n\n error(): string | undefined {\n return this.model.error;\n }\n\n setError(title: string | undefined, message: string | undefined): void {\n this.model.errorTitle = title;\n this.model.error = message;\n }\n\n promptTitle(): string | undefined {\n return this.model.promptTitle;\n }\n\n prompt(): string | undefined {\n return this.model.prompt;\n }\n\n setPrompt(title: string | undefined, message: string | undefined): void {\n this.model.promptTitle = title;\n this.model.prompt = message;\n }\n\n formula1(): string | undefined {\n return this.model.formula1;\n }\n\n setFormula1(formula: string | undefined): void {\n this.model.formula1 = formula;\n }\n\n formula2(): string | undefined {\n return this.model.formula2;\n }\n\n setFormula2(formula: string | undefined): void {\n this.model.formula2 = formula;\n }\n\n toModel(): ExcelDataValidationModel {\n return { ...this.model };\n }\n\n delete(): void {\n this.remove?.();\n }\n}\n\nexport class ExcelDataValidationCollection {\n constructor(private readonly getModels: () => ExcelDataValidationModel[]) {}\n\n items(): ExcelDataValidation[] {\n return this.getModels().map((model) => this.wrap(model));\n }\n\n add(model: ExcelDataValidationModel): ExcelDataValidation {\n const copy = { ...model };\n this.getModels().push(copy);\n return this.wrap(copy);\n }\n\n getItem(rangeAddress: string): ExcelDataValidation {\n const item = this.getItemOrNullObject(rangeAddress);\n if (!item) throw new Error(`data validation not found: ${rangeAddress}`);\n return item;\n }\n\n getItemOrNullObject(rangeAddress: string): ExcelDataValidation | null {\n const model = this.getModels().find((validation) => validation.sqref === rangeAddress);\n return model ? this.wrap(model) : null;\n }\n\n delete(rangeAddress: string): void {\n const models = this.getModels();\n for (let i = models.length - 1; i >= 0; i--) {\n if (models[i]?.sqref === rangeAddress) models.splice(i, 1);\n }\n }\n\n toModel(): ExcelDataValidationModel[] {\n return this.getModels().map((model) => ({ ...model }));\n }\n\n private wrap(model: ExcelDataValidationModel): ExcelDataValidation {\n return new ExcelDataValidation(model, () => {\n const models = this.getModels();\n const index = models.indexOf(model);\n if (index >= 0) models.splice(index, 1);\n });\n }\n}\n\nexport class ExcelConditionalFormat {\n readonly rules: ExcelConditionalFormatRuleCollection;\n\n constructor(\n private readonly model: ExcelConditionalFormatModel,\n private readonly remove?: () => void,\n ) {\n this.rules = new ExcelConditionalFormatRuleCollection(() => this.model.rules);\n }\n\n rangeAddress(): string | undefined {\n return this.model.sqref;\n }\n\n setRange(address: string): void {\n this.model.sqref = address;\n }\n\n toModel(): ExcelConditionalFormatModel {\n return cloneConditionalFormat(this.model);\n }\n\n delete(): void {\n this.remove?.();\n }\n}\n\nexport class ExcelConditionalFormatRule {\n constructor(\n private readonly model: ExcelConditionalFormatRuleModel,\n private readonly remove?: () => void,\n ) {}\n\n type(): string | undefined {\n return this.model.type;\n }\n\n setType(type: string | undefined): void {\n this.model.type = type;\n }\n\n priority(): number | undefined {\n return this.model.priority;\n }\n\n setPriority(priority: number | undefined): void {\n this.model.priority = priority;\n }\n\n operator(): string | undefined {\n return this.model.operator;\n }\n\n setOperator(operator: string | undefined): void {\n this.model.operator = operator;\n }\n\n stopIfTrue(): boolean | undefined {\n return this.model.stopIfTrue;\n }\n\n setStopIfTrue(value: boolean | undefined): void {\n this.model.stopIfTrue = value;\n }\n\n formulas(): string[] {\n return [...this.model.formulas];\n }\n\n setFormula(index: number, formula: string): void {\n this.model.formulas[index] = formula;\n }\n\n addFormula(formula: string): void {\n this.model.formulas.push(formula);\n }\n\n deleteFormula(index: number): void {\n this.model.formulas.splice(index, 1);\n }\n\n toModel(): ExcelConditionalFormatRuleModel {\n return { ...this.model, formulas: [...this.model.formulas] };\n }\n\n delete(): void {\n this.remove?.();\n }\n}\n\nexport class ExcelConditionalFormatRuleCollection {\n constructor(private readonly getModels: () => ExcelConditionalFormatRuleModel[]) {}\n\n items(): ExcelConditionalFormatRule[] {\n return this.getModels().map((model) => this.wrap(model));\n }\n\n getItem(index: number): ExcelConditionalFormatRule {\n const item = this.getItemOrNullObject(index);\n if (!item) throw new Error(`conditional format rule not found: ${index}`);\n return item;\n }\n\n getItemOrNullObject(index: number): ExcelConditionalFormatRule | null {\n const model = this.getModels()[index];\n return model ? this.wrap(model) : null;\n }\n\n add(model: ExcelConditionalFormatRuleModel): ExcelConditionalFormatRule {\n const copy = { ...model, formulas: [...model.formulas] };\n this.getModels().push(copy);\n return this.wrap(copy);\n }\n\n delete(index: number): void {\n this.getModels().splice(index, 1);\n }\n\n toModel(): ExcelConditionalFormatRuleModel[] {\n return this.getModels().map((model) => ({ ...model, formulas: [...model.formulas] }));\n }\n\n private wrap(model: ExcelConditionalFormatRuleModel): ExcelConditionalFormatRule {\n return new ExcelConditionalFormatRule(model, () => {\n const models = this.getModels();\n const index = models.indexOf(model);\n if (index >= 0) models.splice(index, 1);\n });\n }\n}\n\nexport class ExcelConditionalFormatCollection {\n constructor(private readonly getModels: () => ExcelConditionalFormatModel[]) {}\n\n items(): ExcelConditionalFormat[] {\n return this.getModels().map((model) => this.wrap(model));\n }\n\n add(model: ExcelConditionalFormatModel): ExcelConditionalFormat {\n const copy = cloneConditionalFormat(model);\n this.getModels().push(copy);\n return this.wrap(copy);\n }\n\n getItem(rangeAddress: string): ExcelConditionalFormat {\n const item = this.getItemOrNullObject(rangeAddress);\n if (!item) throw new Error(`conditional format not found: ${rangeAddress}`);\n return item;\n }\n\n getItemOrNullObject(rangeAddress: string): ExcelConditionalFormat | null {\n const model = this.getModels().find((format) => format.sqref === rangeAddress);\n return model ? this.wrap(model) : null;\n }\n\n delete(rangeAddress: string): void {\n const models = this.getModels();\n for (let i = models.length - 1; i >= 0; i--) {\n if (models[i]?.sqref === rangeAddress) models.splice(i, 1);\n }\n }\n\n toModel(): ExcelConditionalFormatModel[] {\n return this.getModels().map((model) => cloneConditionalFormat(model));\n }\n\n private wrap(model: ExcelConditionalFormatModel): ExcelConditionalFormat {\n return new ExcelConditionalFormat(model, () => {\n const models = this.getModels();\n const index = models.indexOf(model);\n if (index >= 0) models.splice(index, 1);\n });\n }\n}\n\nexport class ExcelComment {\n constructor(\n private readonly model: ExcelCommentModel,\n private readonly remove?: () => void,\n ) {}\n\n ref(): string {\n return this.model.ref;\n }\n\n setRef(ref: string): void {\n this.model.ref = ref;\n }\n\n text(): string {\n return this.model.text;\n }\n\n setText(text: string): void {\n this.model.text = text;\n }\n\n toModel(): ExcelCommentModel {\n return { ...this.model };\n }\n\n delete(): void {\n this.remove?.();\n }\n}\n\nexport class ExcelCommentCollection {\n constructor(private readonly getModels: () => ExcelCommentModel[]) {}\n\n items(): ExcelComment[] {\n return this.getModels().map((model) => this.wrap(model));\n }\n\n add(model: ExcelCommentModel): ExcelComment {\n const copy = { ...model };\n this.getModels().push(copy);\n return this.wrap(copy);\n }\n\n getItem(ref: string): ExcelComment {\n const item = this.getItemOrNullObject(ref);\n if (!item) throw new Error(`comment not found: ${ref}`);\n return item;\n }\n\n getItemOrNullObject(ref: string): ExcelComment | null {\n const model = this.getModels().find((comment) => comment.ref === ref);\n return model ? this.wrap(model) : null;\n }\n\n delete(ref: string): void {\n const models = this.getModels();\n for (let i = models.length - 1; i >= 0; i--) {\n if (models[i]?.ref === ref) models.splice(i, 1);\n }\n }\n\n toModel(): ExcelCommentModel[] {\n return this.getModels().map((model) => ({ ...model }));\n }\n\n private wrap(model: ExcelCommentModel): ExcelComment {\n return new ExcelComment(model, () => {\n const models = this.getModels();\n const index = models.indexOf(model);\n if (index >= 0) models.splice(index, 1);\n });\n }\n}\n\nexport class ExcelThreadedComment {\n constructor(\n private readonly model: ExcelThreadedCommentModel,\n private readonly deleteSelf?: () => void,\n ) {}\n\n ref(): string {\n return this.model.ref;\n }\n\n setRef(ref: string): void {\n this.model.ref = ref;\n }\n\n text(): string {\n return this.model.text;\n }\n\n setText(text: string): void {\n this.model.text = text;\n }\n\n delete(): void {\n this.deleteSelf?.();\n }\n\n toModel(): ExcelThreadedCommentModel {\n return { ...this.model };\n }\n}\n\nexport class ExcelThreadedCommentCollection {\n constructor(private readonly getModels: () => ExcelThreadedCommentModel[]) {}\n\n items(): ExcelThreadedComment[] {\n return this.getModels().map((model) => this.wrap(model));\n }\n\n getItem(ref: string): ExcelThreadedComment {\n const item = this.getItemOrNullObject(ref);\n if (!item) throw new Error(`threaded comment not found: ${ref}`);\n return item;\n }\n\n getItemOrNullObject(ref: string): ExcelThreadedComment | null {\n const model = this.getModels().find((comment) => comment.ref === ref);\n return model ? this.wrap(model) : null;\n }\n\n delete(ref: string): void {\n const models = this.getModels();\n const index = models.findIndex((comment) => comment.ref === ref);\n if (index >= 0) models.splice(index, 1);\n }\n\n toModel(): ExcelThreadedCommentModel[] {\n return this.getModels().map((model) => ({ ...model }));\n }\n\n private wrap(model: ExcelThreadedCommentModel): ExcelThreadedComment {\n return new ExcelThreadedComment(model, () => {\n const models = this.getModels();\n const index = models.indexOf(model);\n if (index >= 0) models.splice(index, 1);\n });\n }\n}\n\nexport class ExcelDrawingCollection {\n constructor(private readonly getModels: () => ExcelDrawingModel[]) {}\n\n items(): ExcelDrawing[] {\n return this.getModels().map((model) => new ExcelDrawing(model));\n }\n\n toModel(): ExcelDrawingModel[] {\n return this.getModels().map((drawing) => ({\n ...drawing,\n anchors: drawing.anchors.map((anchor) => ({\n ...anchor,\n from: anchor.from ? { ...anchor.from } : undefined,\n to: anchor.to ? { ...anchor.to } : undefined,\n object: anchor.object ? { ...anchor.object } : undefined,\n })),\n }));\n }\n}\n\nexport class ExcelDrawing {\n readonly anchors: ExcelDrawingAnchorCollection;\n\n constructor(private readonly model: ExcelDrawingModel) {\n this.anchors = new ExcelDrawingAnchorCollection(() => this.model.anchors);\n }\n\n relationshipId(): string | undefined {\n return this.model.relationshipId;\n }\n\n path(): string | undefined {\n return this.model.path;\n }\n\n toModel(): ExcelDrawingModel {\n return cloneDrawing(this.model);\n }\n}\n\nexport class ExcelDrawingAnchorCollection {\n constructor(private readonly getModels: () => ExcelDrawingAnchorModel[]) {}\n\n items(): ExcelDrawingAnchor[] {\n return this.getModels().map((model) => new ExcelDrawingAnchor(model));\n }\n\n getItem(index: number): ExcelDrawingAnchor {\n const item = this.getItemOrNullObject(index);\n if (!item) throw new Error(`drawing anchor not found: ${index}`);\n return item;\n }\n\n getItemOrNullObject(index: number): ExcelDrawingAnchor | null {\n const model = this.getModels()[index];\n return model ? new ExcelDrawingAnchor(model) : null;\n }\n\n toModel(): ExcelDrawingAnchorModel[] {\n return this.getModels().map((anchor) => cloneDrawingAnchor(anchor));\n }\n}\n\nexport class ExcelDrawingAnchor {\n readonly from: ExcelDrawingMarker;\n readonly to: ExcelDrawingMarker;\n\n constructor(private readonly model: ExcelDrawingAnchorModel) {\n this.from = new ExcelDrawingMarker(() => (this.model.from ??= {}));\n this.to = new ExcelDrawingMarker(() => (this.model.to ??= {}));\n }\n\n kind(): ExcelDrawingAnchorModel['kind'] {\n return this.model.kind;\n }\n\n object(): ExcelDrawingAnchorModel['object'] | undefined {\n return this.model.object ? { ...this.model.object } : undefined;\n }\n\n toModel(): ExcelDrawingAnchorModel {\n return cloneDrawingAnchor(this.model);\n }\n}\n\nexport class ExcelDrawingMarker {\n constructor(private readonly getModel: () => ExcelDrawingMarkerModel) {}\n\n row(): number | undefined {\n return this.getModel().row;\n }\n\n setRow(row: number | undefined): void {\n this.getModel().row = row;\n }\n\n column(): number | undefined {\n return this.getModel().column;\n }\n\n setColumn(column: number | undefined): void {\n this.getModel().column = column;\n }\n\n rowOffset(): number | undefined {\n return this.getModel().rowOffset;\n }\n\n setRowOffset(offset: number | undefined): void {\n this.getModel().rowOffset = offset;\n }\n\n columnOffset(): number | undefined {\n return this.getModel().columnOffset;\n }\n\n setColumnOffset(offset: number | undefined): void {\n this.getModel().columnOffset = offset;\n }\n\n toModel(): ExcelDrawingMarkerModel {\n return { ...this.getModel() };\n }\n}\n\nexport class ExcelChartCollection {\n constructor(\n private readonly getModels: () => ExcelChartModel[],\n private readonly getDrawings?: () => ExcelDrawingModel[],\n ) {}\n\n items(): ExcelChart[] {\n return this.getModels().map((model) => new ExcelChart(model));\n }\n\n add(options: ExcelChartAddOptions): ExcelChart {\n validateChartAddOptions(options);\n const models = this.getModels();\n const chart: ExcelChartModel = {\n type: options.type,\n title: options.title,\n categoryRange: options.categoryRange,\n series: options.series.map((series) => ({ ...series })),\n position: {\n from: { ...options.position.from },\n to: { ...options.position.to },\n },\n formulaRefs: chartFormulaRefs(options),\n };\n models.push(chart);\n const drawings = this.getDrawings?.();\n if (drawings) {\n const drawing = drawings[0] ?? { anchors: [] };\n if (!drawings[0]) drawings.push(drawing);\n drawing.anchors.push({\n kind: 'twoCell',\n from: { ...options.position.from },\n to: { ...options.position.to },\n object: {\n kind: 'chart',\n name: options.title,\n },\n });\n }\n return new ExcelChart(chart);\n }\n\n toModel(): ExcelChartModel[] {\n return this.getModels().map((chart) => ({\n ...chart,\n series: chart.series?.map((series) => ({ ...series })),\n position: chart.position\n ? { from: { ...chart.position.from }, to: { ...chart.position.to } }\n : undefined,\n formulaRefs: [...chart.formulaRefs],\n }));\n }\n}\n\nfunction chartFormulaRefs(options: ExcelChartAddOptions): string[] {\n return [\n options.categoryRange,\n ...options.series.flatMap((series) =>\n series.name?.includes('!') || series.name?.includes('$')\n ? [series.name, series.values]\n : [series.values],\n ),\n ];\n}\n\nfunction validateChartAddOptions(options: ExcelChartAddOptions): void {\n if (!options.type) throw new Error('ExcelChartCollection.add: chart type is required');\n if (!options.categoryRange) throw new Error('ExcelChartCollection.add: categoryRange is required');\n if (!options.series.length) throw new Error('ExcelChartCollection.add: at least one series is required');\n if ((options.type === 'pie' || options.type === 'doughnut') && options.series.length !== 1) {\n throw new Error(`ExcelChartCollection.add: ${options.type} charts require exactly one series`);\n }\n for (const series of options.series) {\n if (!series.values) throw new Error('ExcelChartCollection.add: series values range is required');\n }\n}\n\nexport class ExcelChart {\n readonly formulaRefs: ExcelFormulaRefCollection;\n\n constructor(private readonly model: ExcelChartModel) {\n this.formulaRefs = new ExcelFormulaRefCollection(() => this.model.formulaRefs);\n }\n\n relationshipId(): string | undefined {\n return this.model.relationshipId;\n }\n\n drawingPath(): string | undefined {\n return this.model.drawingPath;\n }\n\n path(): string | undefined {\n return this.model.path;\n }\n\n title(): string | undefined {\n return this.model.title;\n }\n\n setTitle(title: string | undefined): void {\n this.model.title = title;\n }\n\n toModel(): ExcelChartModel {\n return { ...this.model, formulaRefs: [...this.model.formulaRefs] };\n }\n}\n\nexport class ExcelFormulaRefCollection {\n constructor(private readonly getModels: () => string[]) {}\n\n items(): string[] {\n return [...this.getModels()];\n }\n\n getItem(index: number): string | undefined {\n return this.getModels()[index];\n }\n\n setItem(index: number, formulaRef: string): void {\n this.getModels()[index] = formulaRef;\n }\n\n add(formulaRef: string): void {\n this.getModels().push(formulaRef);\n }\n\n delete(index: number): void {\n this.getModels().splice(index, 1);\n }\n\n toModel(): string[] {\n return this.items();\n }\n}\n\nexport class ExcelImageCollection {\n constructor(private readonly getModels: () => ExcelImageModel[]) {}\n\n items(): ExcelImage[] {\n return this.getModels().map((model) => new ExcelImage(model));\n }\n\n toModel(): ExcelImageModel[] {\n return this.getModels().map((image) => ({ ...image }));\n }\n}\n\nexport class ExcelImage {\n constructor(private readonly model: ExcelImageModel) {}\n\n relationshipId(): string | undefined {\n return this.model.relationshipId;\n }\n\n drawingPath(): string | undefined {\n return this.model.drawingPath;\n }\n\n path(): string | undefined {\n return this.model.path;\n }\n\n targetMode(): string | undefined {\n return this.model.targetMode;\n }\n\n name(): string | undefined {\n return this.model.name;\n }\n\n toModel(): ExcelImageModel {\n return { ...this.model };\n }\n}\n\nexport class ExcelShapeCollection {\n constructor(private readonly getDrawings: () => ExcelDrawingModel[]) {}\n\n items(): ExcelShape[] {\n return this.getShapeEntries().map((entry) => new ExcelShape(entry));\n }\n\n getItem(name: string): ExcelShape {\n const item = this.getItemOrNullObject(name);\n if (!item) throw new Error(`shape not found: ${name}`);\n return item;\n }\n\n getItemOrNullObject(name: string): ExcelShape | null {\n const entry = this.getShapeEntries().find((item) => item.anchor.object?.name === name);\n return entry ? new ExcelShape(entry) : null;\n }\n\n toModel(): ExcelShapeModel[] {\n return this.getShapeEntries().map((entry) => ({\n drawingPath: entry.drawing.path,\n name: entry.anchor.object?.name,\n anchor: cloneDrawingAnchor(entry.anchor),\n }));\n }\n\n private getShapeEntries(): ExcelShapeEntry[] {\n return this.getDrawings().flatMap((drawing) =>\n drawing.anchors\n .filter((anchor) => anchor.object?.kind === 'shape')\n .map((anchor) => ({ drawing, anchor })),\n );\n }\n}\n\nexport class ExcelShape {\n readonly anchor: ExcelDrawingAnchor;\n\n constructor(private readonly entry: ExcelShapeEntry) {\n this.anchor = new ExcelDrawingAnchor(entry.anchor);\n }\n\n drawingPath(): string | undefined {\n return this.entry.drawing.path;\n }\n\n name(): string | undefined {\n return this.entry.anchor.object?.name;\n }\n\n setName(name: string | undefined): void {\n this.entry.anchor.object ??= { kind: 'shape' };\n this.entry.anchor.object.name = name;\n }\n\n toModel(): ExcelShapeModel {\n return {\n drawingPath: this.entry.drawing.path,\n name: this.entry.anchor.object?.name,\n anchor: cloneDrawingAnchor(this.entry.anchor),\n };\n }\n}\n\ninterface ExcelShapeEntry {\n drawing: ExcelDrawingModel;\n anchor: ExcelDrawingAnchorModel;\n}\n\nfunction cloneTable(table: ExcelTableModel): ExcelTableModel {\n return {\n ...table,\n columns: table.columns.map((column) => ({ ...column })),\n autoFilter: table.autoFilter ? cloneAutoFilter(table.autoFilter) : undefined,\n style: table.style ? { ...table.style } : undefined,\n };\n}\n\nfunction cloneAutoFilter(autoFilter: ExcelTableAutoFilterModel): ExcelTableAutoFilterModel {\n const clone = {\n ...autoFilter,\n filterColumns: autoFilter.filterColumns.map((column) => ({\n ...column,\n filters: column.filters ? [...column.filters] : undefined,\n })),\n sortState: autoFilter.sortState ? cloneSortState(autoFilter.sortState) : undefined,\n };\n if (clone.sortState === undefined) delete clone.sortState;\n for (const column of clone.filterColumns) {\n if (column.filters === undefined) delete column.filters;\n }\n return clone;\n}\n\nfunction cloneSortState(sortState: ExcelTableSortStateModel): ExcelTableSortStateModel {\n return {\n ...sortState,\n conditions: sortState.conditions.map((condition) => ({ ...condition })),\n };\n}\n\nfunction nextTableColumnId(columns: ExcelTableColumnModel[]): number {\n return columns.reduce((max, column) => Math.max(max, column.id), 0) + 1;\n}\n\nfunction assertOptionalNonNegativeInteger(value: number | undefined, operation: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value < 0)) {\n throw new Error(`${operation}: value must be a non-negative integer`);\n }\n}\n\nfunction cloneDrawing(drawing: ExcelDrawingModel): ExcelDrawingModel {\n return {\n ...drawing,\n anchors: drawing.anchors.map((anchor) => cloneDrawingAnchor(anchor)),\n };\n}\n\nfunction cloneDrawingAnchor(anchor: ExcelDrawingAnchorModel): ExcelDrawingAnchorModel {\n return {\n ...anchor,\n from: anchor.from ? { ...anchor.from } : undefined,\n to: anchor.to ? { ...anchor.to } : undefined,\n object: anchor.object ? { ...anchor.object } : undefined,\n };\n}\n\nfunction cloneConditionalFormat(format: ExcelConditionalFormatModel): ExcelConditionalFormatModel {\n return {\n ...format,\n rules: format.rules.map((rule) => ({\n ...rule,\n formulas: [...rule.formulas],\n })),\n };\n}\n","import { columnIndexToName, columnNameToIndex, splitSheetQualifiedAddress } from './address.js';\n\nexport interface ExcelReferenceRewriteOptions {\n sheetName?: string;\n}\n\nexport type ExcelReferenceRewriteResult =\n | { ok: true; address: string }\n | { ok: false; address: '#REF!' };\n\nexport type ExcelFormulaReferenceRewriter = (reference: string) => ExcelReferenceRewriteResult;\n\ninterface CellRef {\n row: number;\n column: number;\n rowAbsolute?: boolean;\n columnAbsolute?: boolean;\n}\n\ninterface RangeRef {\n sheetName?: string;\n start: CellRef;\n end: CellRef;\n}\n\ninterface AxisDelete {\n start: number;\n count: number;\n}\n\nexport function renameSheetInReference(address: string, oldName: string, newName: string): string {\n const ref = parseReference(address);\n if (ref.sheetName !== oldName) return formatReference(ref);\n return formatReference({ ...ref, sheetName: newName });\n}\n\nexport function rewriteFormulaReferences(\n formula: string,\n rewrite: ExcelFormulaReferenceRewriter,\n): string {\n let output = '';\n let index = 0;\n while (index < formula.length) {\n const ch = formula[index];\n if (ch === '\"') {\n const literal = readFormulaStringLiteral(formula, index);\n output += literal.text;\n index = literal.end;\n continue;\n }\n\n const match = matchReferenceAt(formula, index);\n if (!match) {\n output += ch;\n index += 1;\n continue;\n }\n\n const rewritten = rewrite(match.reference);\n output += rewritten.ok ? rewritten.address : rewritten.address;\n index = match.end;\n }\n return output;\n}\n\nexport function renameSheetInFormula(formula: string, oldName: string, newName: string): string {\n return rewriteFormulaReferences(formula, (reference) => ({\n ok: true,\n address: renameSheetInReference(reference, oldName, newName),\n }));\n}\n\nexport function rewriteFormulaForRowInsert(\n formula: string,\n rowIndex: number,\n count = 1,\n options: ExcelReferenceRewriteOptions = {},\n): string {\n return rewriteFormulaReferences(formula, (reference) =>\n rewriteReferenceForRowInsert(reference, rowIndex, count, options),\n );\n}\n\nexport function rewriteFormulaForRowDelete(\n formula: string,\n rowIndex: number,\n count = 1,\n options: ExcelReferenceRewriteOptions = {},\n): string {\n return rewriteFormulaReferences(formula, (reference) =>\n rewriteReferenceForRowDelete(reference, rowIndex, count, options),\n );\n}\n\nexport function rewriteFormulaForColumnInsert(\n formula: string,\n columnIndex: number,\n count = 1,\n options: ExcelReferenceRewriteOptions = {},\n): string {\n return rewriteFormulaReferences(formula, (reference) =>\n rewriteReferenceForColumnInsert(reference, columnIndex, count, options),\n );\n}\n\nexport function rewriteFormulaForColumnDelete(\n formula: string,\n columnIndex: number,\n count = 1,\n options: ExcelReferenceRewriteOptions = {},\n): string {\n return rewriteFormulaReferences(formula, (reference) =>\n rewriteReferenceForColumnDelete(reference, columnIndex, count, options),\n );\n}\n\n/**\n * Rebase a formula as if its containing cell moved by the supplied offsets.\n * Relative row/column coordinates move; absolute coordinates and string literals stay unchanged.\n */\nexport function shiftFormulaReferences(\n formula: string,\n rowOffset: number,\n columnOffset: number,\n): string {\n assertInteger(rowOffset, 'rowOffset');\n assertInteger(columnOffset, 'columnOffset');\n return rewriteFormulaReferences(formula, (reference) => shiftReferenceRelative(reference, rowOffset, columnOffset));\n}\n\n/** Rewrites relative row references when a formula's source rows are reordered. */\nexport function rewriteFormulaForRowSort(\n formula: string,\n rowMap: ReadonlyMap<number, number>,\n options: ExcelReferenceRewriteOptions = {},\n): string {\n return rewriteFormulaReferences(formula, (reference) => {\n const ref = parseReference(reference);\n if (!isTargetSheet(ref, options.sheetName)) return { ok: true, address: formatReference(ref) };\n const rewriteCell = (cell: CellRef): CellRef => {\n const row = cell.rowAbsolute ? cell.row : rowMap.get(cell.row) ?? cell.row;\n return { ...cell, row };\n };\n return {\n ok: true,\n address: formatReference({ ...ref, start: rewriteCell(ref.start), end: rewriteCell(ref.end) }),\n };\n });\n}\n\nexport function shiftReferenceRelative(\n address: string,\n rowOffset: number,\n columnOffset: number,\n): ExcelReferenceRewriteResult {\n assertInteger(rowOffset, 'rowOffset');\n assertInteger(columnOffset, 'columnOffset');\n const ref = parseReference(address);\n const start = shiftCellRelative(ref.start, rowOffset, columnOffset);\n const end = shiftCellRelative(ref.end, rowOffset, columnOffset);\n if (!start || !end) return { ok: false, address: '#REF!' };\n return { ok: true, address: formatReference({ ...ref, start, end }) };\n}\n\nexport function rewriteReferenceForRowInsert(\n address: string,\n rowIndex: number,\n count = 1,\n options: ExcelReferenceRewriteOptions = {},\n): ExcelReferenceRewriteResult {\n assertPositiveInteger(rowIndex, 'rowIndex');\n assertPositiveInteger(count, 'count');\n const ref = parseReference(address);\n if (!isTargetSheet(ref, options.sheetName)) return { ok: true, address: formatReference(ref) };\n return {\n ok: true,\n address: formatReference({\n ...ref,\n start: shiftCellRowsForInsert(ref.start, rowIndex, count),\n end: shiftCellRowsForInsert(ref.end, rowIndex, count),\n }),\n };\n}\n\nexport function rewriteReferenceForRowDelete(\n address: string,\n rowIndex: number,\n count = 1,\n options: ExcelReferenceRewriteOptions = {},\n): ExcelReferenceRewriteResult {\n assertPositiveInteger(rowIndex, 'rowIndex');\n assertPositiveInteger(count, 'count');\n const ref = parseReference(address);\n if (!isTargetSheet(ref, options.sheetName)) return { ok: true, address: formatReference(ref) };\n const rows = rewriteAxisForDelete(ref.start.row, ref.end.row, { start: rowIndex, count });\n if (!rows) return { ok: false, address: '#REF!' };\n return {\n ok: true,\n address: formatReference({\n ...ref,\n start: { ...ref.start, row: rows.start },\n end: { ...ref.end, row: rows.end },\n }),\n };\n}\n\nexport function rewriteReferenceForColumnInsert(\n address: string,\n columnIndex: number,\n count = 1,\n options: ExcelReferenceRewriteOptions = {},\n): ExcelReferenceRewriteResult {\n assertPositiveInteger(columnIndex, 'columnIndex');\n assertPositiveInteger(count, 'count');\n const ref = parseReference(address);\n if (!isTargetSheet(ref, options.sheetName)) return { ok: true, address: formatReference(ref) };\n return {\n ok: true,\n address: formatReference({\n ...ref,\n start: shiftCellColumnsForInsert(ref.start, columnIndex, count),\n end: shiftCellColumnsForInsert(ref.end, columnIndex, count),\n }),\n };\n}\n\nexport function rewriteReferenceForColumnDelete(\n address: string,\n columnIndex: number,\n count = 1,\n options: ExcelReferenceRewriteOptions = {},\n): ExcelReferenceRewriteResult {\n assertPositiveInteger(columnIndex, 'columnIndex');\n assertPositiveInteger(count, 'count');\n const ref = parseReference(address);\n if (!isTargetSheet(ref, options.sheetName)) return { ok: true, address: formatReference(ref) };\n const columns = rewriteAxisForDelete(ref.start.column, ref.end.column, {\n start: columnIndex,\n count,\n });\n if (!columns) return { ok: false, address: '#REF!' };\n return {\n ok: true,\n address: formatReference({\n ...ref,\n start: { ...ref.start, column: columns.start },\n end: { ...ref.end, column: columns.end },\n }),\n };\n}\n\nfunction parseReference(address: string): RangeRef {\n const qualified = splitSheetQualifiedAddress(address);\n const parts = qualified.address.split(':');\n if (parts.length > 2 || !parts[0]) {\n throw new Error(`ExcelReference: invalid reference ${address}`);\n }\n const start = parseCellRef(parts[0]);\n const end = parseCellRef(parts[1] ?? parts[0]);\n const reversed = start.row > end.row || start.column > end.column;\n return {\n sheetName: qualified.sheetName,\n start: {\n row: Math.min(start.row, end.row),\n column: Math.min(start.column, end.column),\n rowAbsolute: reversed ? false : start.rowAbsolute,\n columnAbsolute: reversed ? false : start.columnAbsolute,\n },\n end: {\n row: Math.max(start.row, end.row),\n column: Math.max(start.column, end.column),\n rowAbsolute: reversed ? false : end.rowAbsolute,\n columnAbsolute: reversed ? false : end.columnAbsolute,\n },\n };\n}\n\nfunction parseCellRef(address: string): CellRef {\n const normalized = address.trim();\n const match = /^(\\$?)([A-Za-z]+)(\\$?)(\\d+)$/.exec(normalized);\n if (!match) {\n throw new Error(`ExcelReference: invalid cell reference ${address}`);\n }\n const row = Number(match[4]);\n if (!Number.isInteger(row) || row < 1) {\n throw new Error(`ExcelReference: invalid cell reference ${address}`);\n }\n return {\n row,\n column: columnNameToIndex(match[2]!),\n columnAbsolute: match[1] === '$',\n rowAbsolute: match[3] === '$',\n };\n}\n\nfunction formatReference(ref: RangeRef): string {\n const first = formatCellRef(ref.start);\n const last = formatCellRef(ref.end);\n const local = first === last ? first : `${first}:${last}`;\n return ref.sheetName ? `${quoteSheetName(ref.sheetName)}!${local}` : local;\n}\n\nfunction formatCellRef(ref: CellRef): string {\n return `${ref.columnAbsolute ? '$' : ''}${columnIndexToName(ref.column)}${ref.rowAbsolute ? '$' : ''}${ref.row}`;\n}\n\nfunction quoteSheetName(sheetName: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_.]*$/.test(sheetName)) return sheetName;\n return `'${sheetName.replace(/'/g, \"''\")}'`;\n}\n\nfunction shiftCellRowsForInsert(cell: CellRef, rowIndex: number, count: number): CellRef {\n return cell.row >= rowIndex ? { ...cell, row: cell.row + count } : { ...cell };\n}\n\nfunction shiftCellColumnsForInsert(cell: CellRef, columnIndex: number, count: number): CellRef {\n return cell.column >= columnIndex ? { ...cell, column: cell.column + count } : { ...cell };\n}\n\nfunction shiftCellRelative(cell: CellRef, rowOffset: number, columnOffset: number): CellRef | null {\n const row = cell.rowAbsolute ? cell.row : cell.row + rowOffset;\n const column = cell.columnAbsolute ? cell.column : cell.column + columnOffset;\n if (row < 1 || column < 1 || column > 16384) return null;\n return { ...cell, row, column };\n}\n\nfunction rewriteAxisForDelete(start: number, end: number, deletion: AxisDelete): { start: number; end: number } | null {\n const deleteEnd = deletion.start + deletion.count - 1;\n const survivors: number[] = [];\n for (let value = start; value <= end; value++) {\n if (value >= deletion.start && value <= deleteEnd) continue;\n survivors.push(value > deleteEnd ? value - deletion.count : value);\n }\n if (survivors.length === 0) return null;\n return {\n start: Math.min(...survivors),\n end: Math.max(...survivors),\n };\n}\n\nfunction isTargetSheet(ref: RangeRef, sheetName: string | undefined): boolean {\n return sheetName === undefined || ref.sheetName === undefined || ref.sheetName === sheetName;\n}\n\nfunction assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(`ExcelReference: ${name} must be a positive integer`);\n }\n}\n\nfunction assertInteger(value: number, name: string): void {\n if (!Number.isInteger(value)) {\n throw new Error(`ExcelReference: ${name} must be an integer`);\n }\n}\n\ninterface FormulaMatch {\n reference: string;\n end: number;\n}\n\nfunction readFormulaStringLiteral(formula: string, start: number): { text: string; end: number } {\n let index = start + 1;\n while (index < formula.length) {\n if (formula[index] !== '\"') {\n index += 1;\n continue;\n }\n if (formula[index + 1] === '\"') {\n index += 2;\n continue;\n }\n return { text: formula.slice(start, index + 1), end: index + 1 };\n }\n return { text: formula.slice(start), end: formula.length };\n}\n\nfunction matchReferenceAt(formula: string, start: number): FormulaMatch | null {\n if (!isReferenceLeftBoundary(formula[start - 1])) return null;\n const sheet = readSheetPrefix(formula, start);\n const cellStart = sheet ? sheet.end : start;\n const firstCell = readCellToken(formula, cellStart);\n if (!firstCell) return null;\n\n let end = firstCell.end;\n if (formula[end] === ':') {\n const secondCell = readCellToken(formula, end + 1);\n if (secondCell) end = secondCell.end;\n }\n if (!isReferenceRightBoundary(formula[end])) return null;\n if (formula[end] === '(') return null;\n\n return { reference: formula.slice(start, end), end };\n}\n\nfunction readSheetPrefix(formula: string, start: number): { end: number } | null {\n if (formula[start] === \"'\") {\n let index = start + 1;\n while (index < formula.length) {\n if (formula[index] !== \"'\") {\n index += 1;\n continue;\n }\n if (formula[index + 1] === \"'\") {\n index += 2;\n continue;\n }\n return formula[index + 1] === '!' ? { end: index + 2 } : null;\n }\n return null;\n }\n\n const match = /^[A-Za-z_][A-Za-z0-9_.]*!/.exec(formula.slice(start));\n return match ? { end: start + match[0].length } : null;\n}\n\nfunction readCellToken(formula: string, start: number): { end: number } | null {\n const match = /^\\$?[A-Za-z]{1,3}\\$?[1-9][0-9]*/.exec(formula.slice(start));\n if (!match) return null;\n const token = match[0];\n const normalized = token.replace(/\\$/g, '');\n const cell = /^([A-Za-z]+)([1-9][0-9]*)$/.exec(normalized);\n if (!cell) return null;\n const column = columnNameToIndex(cell[1]!);\n if (column > 16384) return null;\n return { end: start + token.length };\n}\n\nfunction isReferenceLeftBoundary(ch: string | undefined): boolean {\n return ch === undefined || !/[A-Za-z0-9_.$]/.test(ch);\n}\n\nfunction isReferenceRightBoundary(ch: string | undefined): boolean {\n return ch === undefined || !/[A-Za-z0-9_.$]/.test(ch);\n}\n","import { ExcelCell, ExcelRange } from './range.js';\nimport type { ExcelDrawingMarkerModel, ExcelSheetModel, ExcelSheetViewModel, ExcelWorkbookModel } from './model.js';\nimport type { ExcelMutationRecorder } from './mutations.js';\nimport {\n ExcelChartCollection,\n ExcelCommentCollection,\n ExcelConditionalFormatCollection,\n ExcelDataValidationCollection,\n ExcelDrawingCollection,\n ExcelHyperlinkCollection,\n ExcelImageCollection,\n ExcelShapeCollection,\n ExcelTableCollection,\n ExcelThreadedCommentCollection,\n} from './objects.js';\nimport { formatCellAddress, formatRangeAddress } from './address.js';\nimport {\n renameSheetInFormula,\n rewriteFormulaForColumnDelete,\n rewriteFormulaForColumnInsert,\n rewriteFormulaForRowDelete,\n rewriteFormulaForRowInsert,\n rewriteReferenceForColumnDelete,\n rewriteReferenceForColumnInsert,\n rewriteReferenceForRowDelete,\n rewriteReferenceForRowInsert,\n type ExcelReferenceRewriteResult,\n} from './reference-rewriter.js';\n\nexport class ExcelWorksheet {\n readonly hyperlinks: ExcelHyperlinkCollection;\n readonly tables: ExcelTableCollection;\n readonly dataValidations: ExcelDataValidationCollection;\n readonly conditionalFormats: ExcelConditionalFormatCollection;\n readonly comments: ExcelCommentCollection;\n readonly threadedComments: ExcelThreadedCommentCollection;\n readonly drawings: ExcelDrawingCollection;\n readonly charts: ExcelChartCollection;\n readonly images: ExcelImageCollection;\n readonly shapes: ExcelShapeCollection;\n private readonly model: ExcelSheetModel;\n private readonly workbook?: ExcelWorkbookModel;\n private readonly recordMutation?: ExcelMutationRecorder;\n\n constructor(model: ExcelSheetModel, workbook?: ExcelWorkbookModel, recordMutation?: ExcelMutationRecorder) {\n this.model = model;\n this.workbook = workbook;\n this.recordMutation = recordMutation;\n this.hyperlinks = new ExcelHyperlinkCollection(() => model.hyperlinks);\n this.tables = new ExcelTableCollection(() => model.tables);\n this.dataValidations = new ExcelDataValidationCollection(() => model.dataValidations);\n this.conditionalFormats = new ExcelConditionalFormatCollection(() => model.conditionalFormats);\n this.comments = new ExcelCommentCollection(() => model.comments);\n this.threadedComments = new ExcelThreadedCommentCollection(() => model.threadedComments);\n this.drawings = new ExcelDrawingCollection(() => model.drawings);\n this.charts = new ExcelChartCollection(\n () => model.charts,\n () => model.drawings,\n );\n this.images = new ExcelImageCollection(() => model.images);\n this.shapes = new ExcelShapeCollection(() => model.drawings);\n }\n\n id(): string {\n return this.model.id;\n }\n\n name(): string {\n return this.model.name;\n }\n\n rename(name: string): void {\n assertValidWorksheetName(name);\n this.assertUniqueWorksheetName(name, this.model);\n const oldName = this.model.name;\n this.model.name = name;\n this.rewriteWorkbookSheetFormulas((text) => renameSheetInFormula(text, oldName, name));\n this.rewriteDefinedNames((text) => renameSheetInFormula(text, oldName, name));\n this.recordMutation?.({\n kind: 'worksheet.rename',\n sheetId: this.model.id,\n sheetName: name,\n oldName,\n newName: name,\n });\n }\n\n insertRows(rowIndex: number, count = 1): void {\n assertPositiveIndex(rowIndex, 'rowIndex');\n assertPositiveCount(count, 'count');\n for (const cell of this.model.cells) {\n if (cell.row >= rowIndex) {\n cell.row += count;\n cell.address = formatCellAddress(cell.row, cell.column);\n }\n if (cell.formula) {\n cell.formula = rewriteFormulaForRowInsert(cell.formula, rowIndex, count, {\n sheetName: this.model.name,\n });\n }\n }\n this.rewriteDefinedNames((text) =>\n rewriteFormulaForRowInsert(text, rowIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteRuleFormulas((text) =>\n rewriteFormulaForRowInsert(text, rowIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteChartFormulaRefs((text) =>\n rewriteFormulaForRowInsert(text, rowIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteRangeReferences((address) =>\n rewriteReferenceForRowInsert(address, rowIndex, count, { sheetName: this.model.name }),\n );\n this.moveRowMetadataForInsert(rowIndex, count);\n this.moveDrawingAnchorsForRowInsert(rowIndex, count);\n normalizeSheetCells(this.model);\n this.recordMutation?.({\n kind: 'unsafe',\n scope: 'worksheet',\n sheetId: this.model.id,\n sheetName: this.model.name,\n reason: 'worksheet.insertRows is not replayable by first-phase mutation writeback',\n });\n }\n\n deleteRows(rowIndex: number, count = 1): void {\n assertPositiveIndex(rowIndex, 'rowIndex');\n assertPositiveCount(count, 'count');\n const endRow = rowIndex + count - 1;\n this.model.cells = this.model.cells.filter((cell) => {\n if (cell.row >= rowIndex && cell.row <= endRow) return false;\n if (cell.row > endRow) {\n cell.row -= count;\n cell.address = formatCellAddress(cell.row, cell.column);\n }\n if (cell.formula) {\n cell.formula = rewriteFormulaForRowDelete(cell.formula, rowIndex, count, {\n sheetName: this.model.name,\n });\n }\n return true;\n });\n this.rewriteDefinedNames((text) =>\n rewriteFormulaForRowDelete(text, rowIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteRuleFormulas((text) =>\n rewriteFormulaForRowDelete(text, rowIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteChartFormulaRefs((text) =>\n rewriteFormulaForRowDelete(text, rowIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteRangeReferences((address) =>\n rewriteReferenceForRowDelete(address, rowIndex, count, { sheetName: this.model.name }),\n );\n this.moveRowMetadataForDelete(rowIndex, count);\n this.moveDrawingAnchorsForRowDelete(rowIndex, count);\n normalizeSheetCells(this.model);\n this.recordMutation?.({\n kind: 'unsafe',\n scope: 'worksheet',\n sheetId: this.model.id,\n sheetName: this.model.name,\n reason: 'worksheet.deleteRows is not replayable by first-phase mutation writeback',\n });\n }\n\n insertColumns(columnIndex: number, count = 1): void {\n assertPositiveIndex(columnIndex, 'columnIndex');\n assertPositiveCount(count, 'count');\n for (const cell of this.model.cells) {\n if (cell.column >= columnIndex) {\n cell.column += count;\n cell.address = formatCellAddress(cell.row, cell.column);\n }\n if (cell.formula) {\n cell.formula = rewriteFormulaForColumnInsert(cell.formula, columnIndex, count, {\n sheetName: this.model.name,\n });\n }\n }\n this.rewriteDefinedNames((text) =>\n rewriteFormulaForColumnInsert(text, columnIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteRuleFormulas((text) =>\n rewriteFormulaForColumnInsert(text, columnIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteChartFormulaRefs((text) =>\n rewriteFormulaForColumnInsert(text, columnIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteRangeReferences((address) =>\n rewriteReferenceForColumnInsert(address, columnIndex, count, { sheetName: this.model.name }),\n );\n this.moveColumnMetadataForInsert(columnIndex, count);\n this.moveDrawingAnchorsForColumnInsert(columnIndex, count);\n normalizeSheetCells(this.model);\n this.recordMutation?.({\n kind: 'unsafe',\n scope: 'worksheet',\n sheetId: this.model.id,\n sheetName: this.model.name,\n reason: 'worksheet.insertColumns is not replayable by first-phase mutation writeback',\n });\n }\n\n deleteColumns(columnIndex: number, count = 1): void {\n assertPositiveIndex(columnIndex, 'columnIndex');\n assertPositiveCount(count, 'count');\n const endColumn = columnIndex + count - 1;\n this.model.cells = this.model.cells.filter((cell) => {\n if (cell.column >= columnIndex && cell.column <= endColumn) return false;\n if (cell.column > endColumn) {\n cell.column -= count;\n cell.address = formatCellAddress(cell.row, cell.column);\n }\n if (cell.formula) {\n cell.formula = rewriteFormulaForColumnDelete(cell.formula, columnIndex, count, {\n sheetName: this.model.name,\n });\n }\n return true;\n });\n this.rewriteDefinedNames((text) =>\n rewriteFormulaForColumnDelete(text, columnIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteRuleFormulas((text) =>\n rewriteFormulaForColumnDelete(text, columnIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteChartFormulaRefs((text) =>\n rewriteFormulaForColumnDelete(text, columnIndex, count, { sheetName: this.model.name }),\n );\n this.rewriteRangeReferences((address) =>\n rewriteReferenceForColumnDelete(address, columnIndex, count, { sheetName: this.model.name }),\n );\n this.moveColumnMetadataForDelete(columnIndex, count);\n this.moveDrawingAnchorsForColumnDelete(columnIndex, count);\n normalizeSheetCells(this.model);\n this.recordMutation?.({\n kind: 'unsafe',\n scope: 'worksheet',\n sheetId: this.model.id,\n sheetName: this.model.name,\n reason: 'worksheet.deleteColumns is not replayable by first-phase mutation writeback',\n });\n }\n\n visibility(): string | undefined {\n return this.model.visibility;\n }\n\n setVisibility(visibility: string | undefined): void {\n if (visibility !== undefined && !['visible', 'hidden', 'veryHidden'].includes(visibility)) {\n throw new Error(`ExcelWorksheet.setVisibility: invalid visibility: ${visibility}`);\n }\n this.model.visibility = visibility;\n this.recordMutation?.({\n kind: 'unsafe',\n scope: 'worksheet',\n sheetId: this.model.id,\n sheetName: this.model.name,\n reason: 'worksheet.setVisibility is not replayable by first-phase mutation writeback',\n });\n }\n\n path(): string | undefined {\n return this.model.path;\n }\n\n dimension(): string | undefined {\n return this.model.dimension;\n }\n\n getRange(address: string): ExcelRange {\n return new ExcelRange(this.model, address, this.workbook?.styles, this.recordMutation);\n }\n\n getCell(address: string): ExcelCell {\n return new ExcelCell(this.model, address, this.workbook?.styles, this.recordMutation);\n }\n\n getUsedRange(): ExcelRange | null {\n if (!this.model.dimension) return null;\n return this.getRange(this.model.dimension);\n }\n\n cells() {\n return this.model.cells.map((cell) => ({ ...cell }));\n }\n\n sheetViews() {\n return cloneSheetViews(this.model.sheetViews);\n }\n\n setSheetViews(sheetViews: ExcelSheetViewModel[]): void {\n this.model.sheetViews = cloneSheetViews(sheetViews);\n this.recordMutation?.({\n kind: 'unsafe',\n scope: 'worksheet',\n sheetId: this.model.id,\n sheetName: this.model.name,\n reason: 'worksheet.setSheetViews is not replayable by first-phase mutation writeback',\n });\n }\n\n columns() {\n return this.model.columns.map((column) => ({ ...column }));\n }\n\n rows() {\n return this.model.rows.map((row) => ({ ...row }));\n }\n\n mergedRanges() {\n return this.model.mergedRanges.map((range) => ({ ...range }));\n }\n\n toModel(): ExcelSheetModel {\n return {\n ...this.model,\n sheetViews: this.sheetViews(),\n columns: this.model.columns.map((column) => ({ ...column })),\n rows: this.model.rows.map((row) => ({ ...row })),\n mergedRanges: this.model.mergedRanges.map((range) => ({ ...range })),\n hyperlinks: this.hyperlinks.toModel(),\n tables: this.tables.toModel(),\n dataValidations: this.dataValidations.toModel(),\n conditionalFormats: this.conditionalFormats.toModel(),\n comments: this.comments.toModel(),\n threadedComments: this.threadedComments.toModel(),\n drawings: this.drawings.toModel(),\n charts: this.charts.toModel(),\n images: this.images.toModel(),\n cells: this.model.cells.map((cell) => ({ ...cell })),\n };\n }\n\n private rewriteDefinedNames(rewrite: (text: string) => string): void {\n if (!this.workbook) return;\n const localSheetIndex = this.workbook.sheets.indexOf(this.model);\n for (const name of this.workbook.definedNames) {\n if (name.localSheetId !== undefined && name.localSheetId !== localSheetIndex) continue;\n name.text = rewrite(name.text);\n }\n }\n\n private rewriteRuleFormulas(rewrite: (text: string) => string): void {\n for (const validation of this.model.dataValidations) {\n if (validation.formula1) validation.formula1 = rewrite(validation.formula1);\n if (validation.formula2) validation.formula2 = rewrite(validation.formula2);\n }\n for (const format of this.model.conditionalFormats) {\n for (const rule of format.rules) {\n rule.formulas = rule.formulas.map((formula) => rewrite(formula));\n }\n }\n }\n\n private rewriteWorkbookSheetFormulas(rewrite: (text: string) => string): void {\n const sheets = this.workbook?.sheets ?? [this.model];\n for (const sheet of sheets) {\n for (const cell of sheet.cells) {\n if (cell.formula) cell.formula = rewrite(cell.formula);\n }\n for (const validation of sheet.dataValidations) {\n if (validation.formula1) validation.formula1 = rewrite(validation.formula1);\n if (validation.formula2) validation.formula2 = rewrite(validation.formula2);\n }\n for (const format of sheet.conditionalFormats) {\n for (const rule of format.rules) {\n rule.formulas = rule.formulas.map((formula) => rewrite(formula));\n }\n }\n for (const chart of sheet.charts) {\n chart.formulaRefs = chart.formulaRefs.map((reference) => rewrite(reference));\n }\n }\n }\n\n private rewriteChartFormulaRefs(rewrite: (text: string) => string): void {\n for (const chart of this.model.charts) {\n chart.formulaRefs = chart.formulaRefs.map((reference) => rewrite(reference));\n }\n }\n\n private rewriteRangeReferences(rewrite: (address: string) => ExcelReferenceRewriteResult): void {\n this.model.mergedRanges = this.model.mergedRanges.flatMap((range) => {\n const result = rewrite(range.address);\n return result.ok ? [{ ...range, address: result.address }] : [];\n });\n this.model.hyperlinks = this.model.hyperlinks.flatMap((hyperlink) => {\n const result = rewrite(hyperlink.ref);\n return result.ok ? [{ ...hyperlink, ref: result.address }] : [];\n });\n this.model.comments = this.model.comments.flatMap((comment) => {\n const result = rewrite(comment.ref);\n return result.ok ? [{ ...comment, ref: result.address }] : [];\n });\n this.model.threadedComments = this.model.threadedComments.flatMap((comment) => {\n const result = rewrite(comment.ref);\n return result.ok ? [{ ...comment, ref: result.address }] : [];\n });\n for (const view of this.model.sheetViews) {\n if (view.pane?.topLeftCell) {\n const result = rewrite(view.pane.topLeftCell);\n view.pane.topLeftCell = result.ok ? result.address : undefined;\n }\n for (const selection of view.selections) {\n if (selection.activeCell) {\n const result = rewrite(selection.activeCell);\n selection.activeCell = result.ok ? result.address : undefined;\n }\n if (selection.sqref) {\n selection.sqref = rewriteSqref(selection.sqref, rewrite);\n }\n }\n }\n this.model.tables = this.model.tables.flatMap((table) => {\n const ref = table.ref ? rewrite(table.ref) : undefined;\n if (table.ref && !ref?.ok) return [];\n const autoFilterRef = table.autoFilterRef ? rewrite(table.autoFilterRef) : undefined;\n return [\n {\n ...table,\n ref: ref?.address,\n autoFilterRef: autoFilterRef?.ok ? autoFilterRef.address : undefined,\n autoFilter:\n table.autoFilter && autoFilterRef?.ok\n ? { ...table.autoFilter, ref: autoFilterRef.address }\n : table.autoFilter,\n },\n ];\n });\n this.model.dataValidations = this.model.dataValidations.flatMap((validation) => {\n const sqref = validation.sqref ? rewriteSqref(validation.sqref, rewrite) : undefined;\n if (validation.sqref && !sqref) return [];\n return [{ ...validation, sqref }];\n });\n this.model.conditionalFormats = this.model.conditionalFormats.flatMap((format) => {\n const sqref = format.sqref ? rewriteSqref(format.sqref, rewrite) : undefined;\n if (format.sqref && !sqref) return [];\n return [{ ...format, sqref }];\n });\n }\n\n private moveRowMetadataForInsert(rowIndex: number, count: number): void {\n for (const row of this.model.rows) {\n if (row.index >= rowIndex) row.index += count;\n }\n }\n\n private moveRowMetadataForDelete(rowIndex: number, count: number): void {\n const endRow = rowIndex + count - 1;\n this.model.rows = this.model.rows.flatMap((row) => {\n if (row.index >= rowIndex && row.index <= endRow) return [];\n if (row.index > endRow) return [{ ...row, index: row.index - count }];\n return [row];\n });\n }\n\n private moveColumnMetadataForInsert(columnIndex: number, count: number): void {\n this.model.columns = this.model.columns.map((column) => {\n if (column.min >= columnIndex) {\n return { ...column, min: column.min + count, max: column.max + count };\n }\n if (column.max >= columnIndex) {\n return { ...column, max: column.max + count };\n }\n return column;\n });\n }\n\n private moveColumnMetadataForDelete(columnIndex: number, count: number): void {\n const endColumn = columnIndex + count - 1;\n this.model.columns = this.model.columns.flatMap((column) => {\n if (column.min >= columnIndex && column.max <= endColumn) return [];\n if (column.min > endColumn) {\n return [{ ...column, min: column.min - count, max: column.max - count }];\n }\n if (column.min < columnIndex && column.max > endColumn) {\n return [{ ...column, max: column.max - count }];\n }\n if (column.min < columnIndex && column.max >= columnIndex) {\n return [{ ...column, max: columnIndex - 1 }];\n }\n if (column.min <= endColumn && column.max > endColumn) {\n return [{ ...column, min: columnIndex, max: column.max - count }];\n }\n return [column];\n });\n }\n\n private moveDrawingAnchorsForRowInsert(rowIndex: number, count: number): void {\n const markerIndex = rowIndex - 1;\n for (const marker of this.drawingMarkers()) {\n if (marker.row !== undefined && marker.row >= markerIndex) marker.row += count;\n }\n }\n\n private moveDrawingAnchorsForRowDelete(rowIndex: number, count: number): void {\n const markerIndex = rowIndex - 1;\n const endIndex = markerIndex + count - 1;\n for (const marker of this.drawingMarkers()) {\n if (marker.row === undefined) continue;\n if (marker.row > endIndex) marker.row -= count;\n else if (marker.row >= markerIndex) marker.row = markerIndex;\n }\n }\n\n private moveDrawingAnchorsForColumnInsert(columnIndex: number, count: number): void {\n const markerIndex = columnIndex - 1;\n for (const marker of this.drawingMarkers()) {\n if (marker.column !== undefined && marker.column >= markerIndex) marker.column += count;\n }\n }\n\n private moveDrawingAnchorsForColumnDelete(columnIndex: number, count: number): void {\n const markerIndex = columnIndex - 1;\n const endIndex = markerIndex + count - 1;\n for (const marker of this.drawingMarkers()) {\n if (marker.column === undefined) continue;\n if (marker.column > endIndex) marker.column -= count;\n else if (marker.column >= markerIndex) marker.column = markerIndex;\n }\n }\n\n private drawingMarkers(): ExcelDrawingMarkerModel[] {\n return this.model.drawings.flatMap((drawing) =>\n drawing.anchors.flatMap((anchor) => {\n const markers: ExcelDrawingMarkerModel[] = [];\n if (anchor.from) markers.push(anchor.from);\n if (anchor.to) markers.push(anchor.to);\n return markers;\n }),\n );\n }\n\n private assertUniqueWorksheetName(name: string, current: ExcelSheetModel): void {\n if (!this.workbook) return;\n if (this.workbook.sheets.some((sheet) => sheet !== current && sheet.name === name)) {\n throw new Error(`ExcelWorkbook: worksheet already exists: ${name}`);\n }\n }\n}\n\nfunction assertValidWorksheetName(name: string): void {\n if (name.length < 1) {\n throw new Error('ExcelWorksheet.rename: worksheet name must not be empty');\n }\n if (name.length > 31) {\n throw new Error('ExcelWorksheet.rename: worksheet name must be 31 characters or fewer');\n }\n if (/[:\\\\/?*[\\]]/.test(name)) {\n throw new Error(`ExcelWorksheet.rename: invalid worksheet name: ${name}`);\n }\n if (name.startsWith(\"'\") || name.endsWith(\"'\")) {\n throw new Error(`ExcelWorksheet.rename: worksheet name must not start or end with apostrophe`);\n }\n}\n\nfunction assertPositiveIndex(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(`ExcelWorksheet: ${name} must be a positive integer`);\n }\n}\n\nfunction assertPositiveCount(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(`ExcelWorksheet: ${name} must be a positive integer`);\n }\n}\n\nfunction normalizeSheetCells(sheet: ExcelSheetModel): void {\n sheet.cells.sort((a, b) => a.row - b.row || a.column - b.column);\n sheet.dimension = computeDimension(sheet);\n}\n\nfunction computeDimension(sheet: ExcelSheetModel): string | undefined {\n if (sheet.cells.length === 0) return undefined;\n let minRow = Number.POSITIVE_INFINITY;\n let minColumn = Number.POSITIVE_INFINITY;\n let maxRow = 0;\n let maxColumn = 0;\n for (const cell of sheet.cells) {\n minRow = Math.min(minRow, cell.row);\n minColumn = Math.min(minColumn, cell.column);\n maxRow = Math.max(maxRow, cell.row);\n maxColumn = Math.max(maxColumn, cell.column);\n }\n return formatRangeAddress(minRow, minColumn, maxRow - minRow + 1, maxColumn - minColumn + 1);\n}\n\nfunction rewriteSqref(\n sqref: string,\n rewrite: (address: string) => ExcelReferenceRewriteResult,\n): string | undefined {\n const refs: string[] = [];\n for (const ref of sqref.split(/\\s+/)) {\n if (!ref) continue;\n const result = rewrite(ref);\n if (result.ok) refs.push(result.address);\n }\n return refs.length ? refs.join(' ') : undefined;\n}\n\nexport class ExcelWorksheetCollection {\n private readonly worksheets: ExcelWorksheet[];\n private readonly sheets: ExcelSheetModel[];\n private readonly workbook?: ExcelWorkbookModel;\n private readonly recordMutation?: ExcelMutationRecorder;\n\n constructor(\n sheets: ExcelSheetModel[],\n workbook?: ExcelWorkbookModel,\n recordMutation?: ExcelMutationRecorder,\n ) {\n this.sheets = sheets;\n this.workbook = workbook;\n this.recordMutation = recordMutation;\n this.worksheets = sheets.map((sheet) => new ExcelWorksheet(sheet, workbook, recordMutation));\n }\n\n items(): ExcelWorksheet[] {\n return [...this.worksheets];\n }\n\n getItem(nameOrId: string): ExcelWorksheet {\n const sheet = this.getItemOrNullObject(nameOrId);\n if (!sheet) {\n throw new Error(`ExcelWorkbook: worksheet not found: ${nameOrId}`);\n }\n return sheet;\n }\n\n getItemOrNullObject(nameOrId: string): ExcelWorksheet | null {\n return (\n this.worksheets.find((sheet) => sheet.name() === nameOrId || sheet.id() === nameOrId) ?? null\n );\n }\n\n add(name: string): ExcelWorksheet {\n assertValidWorksheetName(name);\n if (this.getItemOrNullObject(name)) {\n throw new Error(`ExcelWorkbook: worksheet already exists: ${name}`);\n }\n const sheet = createBlankSheetModel(name, nextSheetId(this.sheets));\n this.sheets.push(sheet);\n const worksheet = new ExcelWorksheet(sheet, this.workbook, this.recordMutation);\n this.worksheets.push(worksheet);\n this.recordMutation?.({\n kind: 'worksheet.add',\n sheetId: sheet.id,\n sheetName: sheet.name,\n });\n return worksheet;\n }\n\n deleteItem(nameOrId: string): void {\n const index = this.worksheets.findIndex(\n (sheet) => sheet.name() === nameOrId || sheet.id() === nameOrId,\n );\n if (index === -1) throw new Error(`ExcelWorkbook: worksheet not found: ${nameOrId}`);\n if (this.worksheets.length === 1)\n throw new Error('ExcelWorkbook: cannot delete the last worksheet');\n const sheet = this.sheets[index]!;\n this.worksheets.splice(index, 1);\n this.sheets.splice(index, 1);\n this.recordMutation?.({\n kind: 'worksheet.delete',\n sheetId: sheet.id,\n sheetName: sheet.name,\n });\n }\n\n move(nameOrId: string, toIndex: number): void {\n if (!Number.isInteger(toIndex) || toIndex < 0 || toIndex >= this.worksheets.length) {\n throw new Error(`ExcelWorksheetCollection.move: toIndex out of bounds: ${toIndex}`);\n }\n const fromIndex = this.worksheets.findIndex(\n (sheet) => sheet.name() === nameOrId || sheet.id() === nameOrId,\n );\n if (fromIndex === -1) throw new Error(`ExcelWorkbook: worksheet not found: ${nameOrId}`);\n if (fromIndex === toIndex) return;\n const [worksheet] = this.worksheets.splice(fromIndex, 1);\n const [sheet] = this.sheets.splice(fromIndex, 1);\n this.worksheets.splice(toIndex, 0, worksheet!);\n this.sheets.splice(toIndex, 0, sheet!);\n }\n\n copy(nameOrId: string, newName?: string): ExcelWorksheet {\n const sourceIndex = this.worksheets.findIndex(\n (sheet) => sheet.name() === nameOrId || sheet.id() === nameOrId,\n );\n if (sourceIndex === -1) throw new Error(`ExcelWorkbook: worksheet not found: ${nameOrId}`);\n const source = this.sheets[sourceIndex]!;\n const name = newName ?? uniqueWorksheetName(source.name, this.sheets);\n assertValidWorksheetName(name);\n if (this.getItemOrNullObject(name)) {\n throw new Error(`ExcelWorkbook: worksheet already exists: ${name}`);\n }\n const clone = cloneSheetModel(source);\n clone.id = nextSheetId(this.sheets);\n clone.name = name;\n clone.relationshipId = undefined;\n clone.path = undefined;\n this.sheets.splice(sourceIndex + 1, 0, clone);\n const worksheet = new ExcelWorksheet(clone, this.workbook, this.recordMutation);\n this.worksheets.splice(sourceIndex + 1, 0, worksheet);\n this.recordMutation?.({\n kind: 'unsafe',\n scope: 'worksheet',\n sheetId: clone.id,\n sheetName: clone.name,\n reason: 'worksheet.copy is not replayable by first-phase mutation writeback',\n });\n return worksheet;\n }\n}\n\nfunction createBlankSheetModel(name: string, id: string): ExcelSheetModel {\n return {\n id,\n name,\n sheetViews: [{ workbookViewId: 0, selections: [{ activeCell: 'A1', sqref: 'A1' }] }],\n columns: [],\n rows: [],\n mergedRanges: [],\n hyperlinks: [],\n tables: [],\n dataValidations: [],\n conditionalFormats: [],\n comments: [],\n threadedComments: [],\n drawings: [],\n charts: [],\n images: [],\n cells: [],\n };\n}\n\nfunction cloneSheetViews(sheetViews: ExcelSheetViewModel[]): ExcelSheetViewModel[] {\n return sheetViews.map((view) => ({\n ...view,\n pane: view.pane ? { ...view.pane } : undefined,\n selections: view.selections.map((selection) => ({ ...selection })),\n }));\n}\n\nfunction nextSheetId(sheets: ExcelSheetModel[]): string {\n let max = 0;\n for (const sheet of sheets) {\n const value = Number(sheet.id);\n if (Number.isFinite(value)) max = Math.max(max, value);\n }\n return String(max + 1 || sheets.length + 1);\n}\n\nfunction uniqueWorksheetName(baseName: string, sheets: ExcelSheetModel[]): string {\n const names = new Set(sheets.map((sheet) => sheet.name));\n for (let index = 2; index < 1000; index++) {\n const name = `${baseName} (${index})`;\n if (name.length <= 31 && !names.has(name)) return name;\n }\n throw new Error(\n `ExcelWorksheetCollection.copy: unable to create unique worksheet name for ${baseName}`,\n );\n}\n\nfunction cloneSheetModel(sheet: ExcelSheetModel): ExcelSheetModel {\n return JSON.parse(JSON.stringify(sheet)) as ExcelSheetModel;\n}\n","import type { ExcelBorderModel, ExcelCellValue, ExcelColorModel } from './model.js';\n\nexport type ExcelWorkbookMutation =\n | ExcelRangeSetValuesMutation\n | ExcelRangeSetFormulasMutation\n | ExcelRangeClearMutation\n | ExcelRangeMergeMutation\n | ExcelRangeUnmergeMutation\n | ExcelRangeSetRowHeightMutation\n | ExcelRangeSetColumnWidthMutation\n | ExcelRangeSetFontColorMutation\n | ExcelRangeSetFillForegroundColorMutation\n | ExcelRangeSetBorderMutation\n | ExcelWorksheetAddMutation\n | ExcelWorksheetDeleteMutation\n | ExcelWorksheetRenameMutation\n | ExcelUnsafeMutation;\n\nexport interface ExcelMutationSheetRef {\n sheetId?: string;\n sheetName: string;\n}\n\nexport interface ExcelRangeMutationBase extends ExcelMutationSheetRef {\n address: string;\n}\n\nexport interface ExcelRangeSetValuesMutation extends ExcelRangeMutationBase {\n kind: 'range.setValues';\n values: ExcelCellValue[][];\n}\n\nexport interface ExcelRangeSetFormulasMutation extends ExcelRangeMutationBase {\n kind: 'range.setFormulas';\n formulas: (string | null)[][];\n}\n\nexport interface ExcelRangeClearMutation extends ExcelRangeMutationBase {\n kind: 'range.clear';\n}\n\nexport interface ExcelRangeMergeMutation extends ExcelRangeMutationBase {\n kind: 'range.merge';\n}\n\nexport interface ExcelRangeUnmergeMutation extends ExcelRangeMutationBase {\n kind: 'range.unmerge';\n}\n\nexport interface ExcelRangeSetRowHeightMutation extends ExcelRangeMutationBase {\n kind: 'range.setRowHeight';\n height: number | undefined;\n}\n\nexport interface ExcelRangeSetColumnWidthMutation extends ExcelRangeMutationBase {\n kind: 'range.setColumnWidth';\n width: number | undefined;\n}\n\nexport interface ExcelRangeSetFontColorMutation extends ExcelRangeMutationBase {\n kind: 'range.format.font.setColor';\n color: ExcelColorModel | undefined;\n}\n\nexport interface ExcelRangeSetFillForegroundColorMutation extends ExcelRangeMutationBase {\n kind: 'range.format.fill.setForegroundColor';\n color: ExcelColorModel | undefined;\n}\n\nexport interface ExcelRangeSetBorderMutation extends ExcelRangeMutationBase {\n kind: 'range.format.border.setValue';\n border: ExcelBorderModel;\n}\n\nexport interface ExcelWorksheetAddMutation extends ExcelMutationSheetRef {\n kind: 'worksheet.add';\n}\n\nexport interface ExcelWorksheetDeleteMutation extends ExcelMutationSheetRef {\n kind: 'worksheet.delete';\n}\n\nexport interface ExcelWorksheetRenameMutation extends ExcelMutationSheetRef {\n kind: 'worksheet.rename';\n oldName: string;\n newName: string;\n}\n\nexport interface ExcelUnsafeMutation {\n kind: 'unsafe';\n scope: 'workbook' | 'worksheet' | 'range' | 'object';\n sheetId?: string;\n sheetName?: string;\n reason: string;\n}\n\nexport type ExcelMutationRecorder = (mutation: ExcelWorkbookMutation) => void;\n\nexport class ExcelMutationLog {\n private readonly items: ExcelWorkbookMutation[] = [];\n\n record(mutation: ExcelWorkbookMutation): void {\n this.items.push(cloneMutation(mutation));\n }\n\n list(): ExcelWorkbookMutation[] {\n return this.items.map(cloneMutation);\n }\n\n clear(): void {\n this.items.length = 0;\n }\n\n hasUnsafe(): boolean {\n return this.items.some((item) => item.kind === 'unsafe');\n }\n}\n\nexport function cloneMutation(mutation: ExcelWorkbookMutation): ExcelWorkbookMutation {\n return JSON.parse(JSON.stringify(mutation)) as ExcelWorkbookMutation;\n}\n\nexport function changedSheetNamesFromMutations(mutations: readonly ExcelWorkbookMutation[]): string[] {\n const names = new Set<string>();\n for (const mutation of mutations) {\n if (mutation.kind === 'worksheet.rename') {\n names.add(mutation.oldName);\n names.add(mutation.newName);\n continue;\n }\n if ('sheetName' in mutation && mutation.sheetName) {\n names.add(mutation.sheetName);\n }\n }\n return [...names];\n}\n","import { createPackage, fromZip, toZip, type Package } from '../pack/index.js';\nimport type { ExcelStylesModel, ExcelWorkbookModel } from './model.js';\nimport { readWorkbookModel } from './xlsx-reader.js';\nimport { createWorkbookPackageFromModel, syncWorkbookModelToPackage } from './xlsx-writer.js';\nimport { ExcelNamedItemCollection } from './names.js';\nimport { ExcelWorksheetCollection } from './worksheet.js';\nimport { ExcelMutationLog, type ExcelWorkbookMutation } from './mutations.js';\n\nexport interface ExcelLoadOptions {\n workbookId?: string;\n}\n\nexport class ExcelWorkbookCore {\n readonly workbookId: string;\n readonly worksheets: ExcelWorksheetCollection;\n readonly names: ExcelNamedItemCollection;\n private readonly pkg: Package;\n private readonly model: ExcelWorkbookModel;\n private readonly mutationLog = new ExcelMutationLog();\n\n private constructor(init: { workbookId: string; pkg: Package; model: ExcelWorkbookModel }) {\n this.workbookId = init.workbookId;\n this.pkg = init.pkg;\n this.model = init.model;\n this.worksheets = new ExcelWorksheetCollection(init.model.sheets, init.model, (mutation) =>\n this.mutationLog.record(mutation),\n );\n this.names = new ExcelNamedItemCollection(init.model.definedNames);\n }\n\n static async fromZip(bytes: Uint8Array | ArrayBuffer, opts: ExcelLoadOptions = {}): Promise<ExcelWorkbookCore> {\n const pkg = await fromZip(bytes);\n return ExcelWorkbookCore.fromPackage(pkg, opts);\n }\n\n static fromPackage(pkg: Package, opts: ExcelLoadOptions = {}): ExcelWorkbookCore {\n return new ExcelWorkbookCore({\n workbookId: opts.workbookId ?? `excel:${Date.now()}`,\n pkg,\n model: readWorkbookModel(pkg),\n });\n }\n\n static fromModel(model: ExcelWorkbookModel, opts: ExcelLoadOptions = {}): ExcelWorkbookCore {\n return new ExcelWorkbookCore({\n workbookId: opts.workbookId ?? `excel:${Date.now()}`,\n pkg: createPackage(),\n model: structuredCloneModel(model),\n });\n }\n\n toModel(): ExcelWorkbookModel {\n return structuredCloneModel(this.model);\n }\n\n styles(): ExcelStylesModel {\n return cloneStyles(this.model.styles);\n }\n\n getMutations(): ExcelWorkbookMutation[] {\n return this.mutationLog.list();\n }\n\n _replaceModelForHistory(model: ExcelWorkbookModel): void {\n const next = structuredCloneModel(model);\n this.model.sharedStrings.splice(0, this.model.sharedStrings.length, ...next.sharedStrings);\n this.model.definedNames.splice(0, this.model.definedNames.length, ...next.definedNames);\n this.model.styles = next.styles;\n this.model.sheets.splice(0, this.model.sheets.length, ...next.sheets);\n Object.defineProperty(this, 'worksheets', {\n value: new ExcelWorksheetCollection(this.model.sheets, this.model, (mutation) =>\n this.mutationLog.record(mutation),\n ),\n writable: true,\n configurable: true,\n });\n Object.defineProperty(this, 'names', {\n value: new ExcelNamedItemCollection(this.model.definedNames),\n writable: true,\n configurable: true,\n });\n }\n\n clearMutations(): void {\n this.mutationLog.clear();\n }\n\n getPackage(): Package {\n return this.pkg;\n }\n\n async toZip(): Promise<Uint8Array> {\n if (this.pkg.parts.size === 0) {\n return toZip(createWorkbookPackageFromModel(this.model));\n }\n syncWorkbookModelToPackage(this.pkg, this.model);\n return toZip(this.pkg);\n }\n}\n\nfunction structuredCloneModel(model: ExcelWorkbookModel): ExcelWorkbookModel {\n return {\n sharedStrings: [...model.sharedStrings],\n definedNames: model.definedNames.map((name) => ({ ...name })),\n styles: cloneStyles(model.styles),\n sheets: model.sheets.map((sheet) => ({\n ...sheet,\n sheetViews: sheet.sheetViews.map((view) => {\n const result = {\n ...view,\n selections: view.selections.map((selection) => ({ ...selection })),\n };\n if (view.pane) {\n result.pane = { ...view.pane };\n }\n return result;\n }),\n columns: sheet.columns.map((column) => ({ ...column })),\n rows: sheet.rows.map((row) => ({ ...row })),\n mergedRanges: sheet.mergedRanges.map((range) => ({ ...range })),\n hyperlinks: sheet.hyperlinks.map((hyperlink) => ({ ...hyperlink })),\n tables: sheet.tables.map((table) => ({\n ...table,\n columns: table.columns.map((column) => ({ ...column })),\n autoFilter: table.autoFilter\n ? {\n ...table.autoFilter,\n filterColumns: table.autoFilter.filterColumns.map((column) => ({\n ...column,\n filters: column.filters ? [...column.filters] : undefined,\n })),\n sortState: table.autoFilter.sortState\n ? {\n ...table.autoFilter.sortState,\n conditions: table.autoFilter.sortState.conditions.map((condition) => ({ ...condition })),\n }\n : undefined,\n }\n : undefined,\n style: table.style ? { ...table.style } : undefined,\n })),\n dataValidations: sheet.dataValidations.map((validation) => ({ ...validation })),\n conditionalFormats: sheet.conditionalFormats.map((format) => ({\n ...format,\n rules: format.rules.map((rule) => ({\n ...rule,\n formulas: [...rule.formulas],\n })),\n })),\n comments: sheet.comments.map((comment) => ({ ...comment })),\n threadedComments: sheet.threadedComments.map((comment) => ({ ...comment })),\n drawings: sheet.drawings.map((drawing) => ({\n ...drawing,\n anchors: drawing.anchors.map((anchor) => ({\n ...anchor,\n from: anchor.from ? { ...anchor.from } : undefined,\n to: anchor.to ? { ...anchor.to } : undefined,\n object: anchor.object ? { ...anchor.object } : undefined,\n })),\n })),\n charts: sheet.charts.map((chart) => ({\n ...chart,\n formulaRefs: [...chart.formulaRefs],\n })),\n images: sheet.images.map((image) => ({ ...image })),\n cells: sheet.cells.map((cell) => ({ ...cell })),\n })),\n };\n}\n\nfunction cloneStyles(styles: ExcelStylesModel): ExcelStylesModel {\n return {\n numberFormats: styles.numberFormats.map((format) => ({ ...format })),\n fonts: styles.fonts.map((font) => ({\n ...font,\n color: font.color ? { ...font.color } : undefined,\n })),\n fills: styles.fills.map((fill) => ({\n ...fill,\n foregroundColor: fill.foregroundColor ? { ...fill.foregroundColor } : undefined,\n backgroundColor: fill.backgroundColor ? { ...fill.backgroundColor } : undefined,\n })),\n borders: styles.borders.map((border) => ({\n left: border.left ? { ...border.left, color: border.left.color ? { ...border.left.color } : undefined } : undefined,\n right: border.right ? { ...border.right, color: border.right.color ? { ...border.right.color } : undefined } : undefined,\n top: border.top ? { ...border.top, color: border.top.color ? { ...border.top.color } : undefined } : undefined,\n bottom: border.bottom\n ? { ...border.bottom, color: border.bottom.color ? { ...border.bottom.color } : undefined }\n : undefined,\n diagonal: border.diagonal\n ? { ...border.diagonal, color: border.diagonal.color ? { ...border.diagonal.color } : undefined }\n : undefined,\n })),\n cellFormats: styles.cellFormats.map((format) => ({\n ...format,\n alignment: format.alignment ? { ...format.alignment } : undefined,\n })),\n };\n}\n","import {\n columnIndexToName,\n columnNameToIndex,\n formatCellAddress,\n parseRangeAddress,\n} from './address.js';\nimport type { ExcelCellModel, ExcelCellValue, ExcelWorkbookModel } from './model.js';\n\nexport type ExcelAggregateOperation = 'sum' | 'count' | 'average' | 'min' | 'max';\nexport type ExcelAggregateBucket = 'none' | 'year' | 'quarter' | 'month' | 'day';\n\nexport interface ExcelAggregateSource {\n sheetName: string;\n address?: string;\n tableName?: string;\n header?: 'firstRow' | 'none';\n}\n\nexport interface ExcelAggregateGroupBy {\n column: string;\n bucket?: ExcelAggregateBucket;\n name?: string;\n}\n\nexport interface ExcelAggregateMetric {\n column?: string;\n op: ExcelAggregateOperation;\n name?: string;\n}\n\nexport interface ExcelAggregateTableOptions {\n source: ExcelAggregateSource;\n groupBy: ExcelAggregateGroupBy[];\n metrics: ExcelAggregateMetric[];\n sort?: 'asc' | 'desc' | 'none';\n}\n\nexport interface ExcelAggregateResultRow {\n key: ExcelCellValue[];\n values: ExcelCellValue[];\n rowCount: number;\n}\n\nexport interface ExcelAggregateTableResult {\n ok: true;\n sheetName: string;\n sourceAddress: string;\n headers: string[];\n rows: ExcelAggregateResultRow[];\n values: ExcelCellValue[][];\n inputRowCount: number;\n outputRowCount: number;\n}\n\ninterface SourceTable {\n sheetName: string;\n address: string;\n headers: string[];\n rows: Array<{\n values: ExcelCellValue[];\n cells: Array<ExcelCellModel | undefined>;\n }>;\n startColumn: number;\n}\n\ninterface GroupBucketValue {\n value: ExcelCellValue;\n sortKey: string;\n}\n\ninterface MetricAccumulator {\n op: ExcelAggregateOperation;\n sum: number;\n count: number;\n min: number | null;\n max: number | null;\n}\n\nexport function aggregateExcelTable(\n workbook: ExcelWorkbookModel,\n options: ExcelAggregateTableOptions,\n): ExcelAggregateTableResult {\n if (options.groupBy.length === 0) {\n throw new Error('aggregateExcelTable: groupBy must contain at least one column');\n }\n if (options.metrics.length === 0) {\n throw new Error('aggregateExcelTable: metrics must contain at least one metric');\n }\n\n const source = readSourceTable(workbook, options.source);\n const groups = new Map<\n string,\n {\n key: ExcelCellValue[];\n sortKeys: string[];\n rowCount: number;\n metrics: MetricAccumulator[];\n }\n >();\n\n const groupColumns = options.groupBy.map((group) => resolveColumn(source, group.column));\n const metricColumns = options.metrics.map((metric) =>\n metric.column ? resolveColumn(source, metric.column) : null,\n );\n\n for (const row of source.rows) {\n const groupValues = groupColumns.map((columnIndex, index) =>\n bucketValue(row.values[columnIndex] ?? null, options.groupBy[index]?.bucket ?? 'none'),\n );\n const keyText = groupValues.map((item) => stableKey(item.value)).join('\\u001f');\n let group = groups.get(keyText);\n if (!group) {\n group = {\n key: groupValues.map((item) => item.value),\n sortKeys: groupValues.map((item) => item.sortKey),\n rowCount: 0,\n metrics: options.metrics.map((metric) => ({\n op: metric.op,\n sum: 0,\n count: 0,\n min: null,\n max: null,\n })),\n };\n groups.set(keyText, group);\n }\n group.rowCount += 1;\n\n options.metrics.forEach((metric, index) => {\n const acc = group!.metrics[index]!;\n const value =\n metric.op === 'count' && !metric.column\n ? 1\n : metricColumns[index] === null\n ? null\n : row.values[metricColumns[index]!] ?? null;\n accumulate(acc, value);\n });\n }\n\n const sortedGroups = Array.from(groups.values());\n if ((options.sort ?? 'asc') !== 'none') {\n const direction = options.sort === 'desc' ? -1 : 1;\n sortedGroups.sort((a, b) => direction * compareSortKeys(a.sortKeys, b.sortKeys));\n }\n\n const rows = sortedGroups.map((group) => ({\n key: group.key,\n values: group.metrics.map(finalizeMetric),\n rowCount: group.rowCount,\n }));\n const headers = [\n ...options.groupBy.map((group) => group.name ?? group.column),\n ...options.metrics.map((metric) => metric.name ?? defaultMetricName(metric)),\n ];\n\n return {\n ok: true,\n sheetName: source.sheetName,\n sourceAddress: source.address,\n headers,\n rows,\n values: [headers, ...rows.map((row) => [...row.key, ...row.values])],\n inputRowCount: source.rows.length,\n outputRowCount: rows.length,\n };\n}\n\nfunction readSourceTable(workbook: ExcelWorkbookModel, source: ExcelAggregateSource): SourceTable {\n const sheet = workbook.sheets.find(\n (item) => item.name === source.sheetName || item.id === source.sheetName,\n );\n if (!sheet) throw new Error(`aggregateExcelTable: worksheet not found: ${source.sheetName}`);\n\n const table = source.tableName\n ? sheet.tables.find(\n (item) => item.name === source.tableName || item.displayName === source.tableName,\n )\n : undefined;\n const address = source.address ?? table?.ref ?? sheet.dimension;\n if (!address) throw new Error(`aggregateExcelTable: source range is empty: ${source.sheetName}`);\n\n const parsed = parseRangeAddress(address);\n const byAddress = new Map(sheet.cells.map((cell) => [cell.address, cell]));\n const matrix: Array<Array<ExcelCellModel | undefined>> = [];\n for (let r = 0; r < parsed.rowCount; r += 1) {\n const row: Array<ExcelCellModel | undefined> = [];\n for (let c = 0; c < parsed.columnCount; c += 1) {\n row.push(byAddress.get(formatCellAddress(parsed.startRow + r, parsed.startColumn + c)));\n }\n matrix.push(row);\n }\n\n const hasHeader = source.header !== 'none';\n const headerCells = hasHeader ? matrix[0] ?? [] : [];\n const headers = Array.from({ length: parsed.columnCount }, (_, index) => {\n const value = headerCells[index]?.value;\n if (hasHeader && value !== null && value !== undefined && String(value).trim().length > 0) {\n return String(value);\n }\n return columnIndexToName(parsed.startColumn + index);\n });\n const dataRows = hasHeader ? matrix.slice(1) : matrix;\n\n return {\n sheetName: sheet.name,\n address: parsed.address,\n headers,\n rows: dataRows.map((cells) => ({\n cells,\n values: cells.map((cell) => cell?.value ?? null),\n })),\n startColumn: parsed.startColumn,\n };\n}\n\nfunction resolveColumn(source: SourceTable, column: string): number {\n const normalized = column.trim();\n const headerIndex = source.headers.findIndex((header) => header === normalized);\n if (headerIndex >= 0) return headerIndex;\n if (/^[A-Za-z]+$/.test(normalized)) {\n const absoluteIndex = columnNameToIndex(normalized.toUpperCase());\n const offset = absoluteIndex - source.startColumn;\n if (offset >= 0 && offset < source.headers.length) return offset;\n }\n throw new Error(`aggregateExcelTable: column not found: ${column}`);\n}\n\nfunction bucketValue(value: ExcelCellValue, bucket: ExcelAggregateBucket): GroupBucketValue {\n if (bucket === 'none') return { value, sortKey: stableKey(value) };\n const date = coerceExcelDate(value);\n if (!date) {\n return { value: value === null ? null : String(value), sortKey: stableKey(value) };\n }\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth() + 1;\n const day = date.getUTCDate();\n if (bucket === 'year') return { value: String(year), sortKey: `${year}` };\n if (bucket === 'quarter') {\n const quarter = Math.floor((month - 1) / 3) + 1;\n return { value: `${year}Q${quarter}`, sortKey: `${year}-${quarter}` };\n }\n if (bucket === 'month') {\n return {\n value: `${year}-${String(month).padStart(2, '0')}`,\n sortKey: `${year}-${String(month).padStart(2, '0')}`,\n };\n }\n return {\n value: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`,\n sortKey: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`,\n };\n}\n\nfunction coerceExcelDate(value: ExcelCellValue): Date | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const epoch = Date.UTC(1899, 11, 30);\n return new Date(epoch + Math.round(value * 86_400_000));\n }\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n const match = /^(\\d{4})[-/年](\\d{1,2})(?:[-/月](\\d{1,2}))?/.exec(trimmed);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = match[3] ? Number(match[3]) : 1;\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n return new Date(Date.UTC(year, month - 1, day));\n}\n\nfunction accumulate(acc: MetricAccumulator, value: ExcelCellValue): void {\n if (acc.op === 'count') {\n if (value !== null && value !== '') acc.count += 1;\n return;\n }\n const numeric = coerceNumber(value);\n if (numeric === null) return;\n acc.sum += numeric;\n acc.count += 1;\n acc.min = acc.min === null ? numeric : Math.min(acc.min, numeric);\n acc.max = acc.max === null ? numeric : Math.max(acc.max, numeric);\n}\n\nfunction finalizeMetric(acc: MetricAccumulator): ExcelCellValue {\n if (acc.op === 'count') return acc.count;\n if (acc.count === 0) return null;\n if (acc.op === 'sum') return acc.sum;\n if (acc.op === 'average') return acc.sum / acc.count;\n if (acc.op === 'min') return acc.min;\n return acc.max;\n}\n\nfunction coerceNumber(value: ExcelCellValue): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value !== 'string') return null;\n const normalized = value.replace(/,/g, '').trim();\n if (normalized.length === 0) return null;\n const number = Number(normalized);\n return Number.isFinite(number) ? number : null;\n}\n\nfunction defaultMetricName(metric: ExcelAggregateMetric): string {\n return metric.column ? `${metric.op}_${metric.column}` : metric.op;\n}\n\nfunction stableKey(value: ExcelCellValue): string {\n if (value === null) return '';\n return `${typeof value}:${String(value)}`;\n}\n\nfunction compareSortKeys(left: string[], right: string[]): number {\n const count = Math.max(left.length, right.length);\n for (let index = 0; index < count; index += 1) {\n const result = (left[index] ?? '').localeCompare(right[index] ?? '', undefined, {\n numeric: true,\n });\n if (result !== 0) return result;\n }\n return 0;\n}\n","import type { ExcelWorkbookCore } from './excel-workbook.js';\n\nexport async function executeExcelScript(\n workbook: ExcelWorkbookCore,\n code: string,\n args: Record<string, unknown> | undefined,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<unknown> {\n if (signal?.aborted) {\n throw new Error('excel script aborted before dispatch');\n }\n\n const runner = new Function(\n 'workbook',\n 'args',\n `\"use strict\"; return (async () => {\\n${code}\\n})()`,\n ) as (workbook: ExcelWorkbookCore, args: Record<string, unknown> | undefined) => Promise<unknown>;\n\n const execution = runner(workbook, args);\n const races: Promise<unknown>[] = [execution];\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let abortHandler: (() => void) | undefined;\n\n if (timeoutMs > 0) {\n races.push(\n new Promise((_, reject) => {\n timeoutHandle = setTimeout(\n () => reject(new Error(`excel script timeout after ${timeoutMs}ms`)),\n timeoutMs,\n );\n }),\n );\n }\n\n if (signal) {\n races.push(\n new Promise((_, reject) => {\n abortHandler = () => reject(new Error('excel script aborted'));\n signal.addEventListener('abort', abortHandler, { once: true });\n }),\n );\n }\n\n try {\n return await Promise.race(races);\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n if (signal && abortHandler) signal.removeEventListener('abort', abortHandler);\n }\n}\n","import { formatCellAddress, formatRangeAddress, parseRangeAddress } from './address.js';\nimport type {\n ExcelBorderModel,\n ExcelCellModel,\n ExcelCellValue,\n ExcelColumnModel,\n ExcelColorModel,\n ExcelDefinedNameModel,\n ExcelMergedRangeModel,\n ExcelRowModel,\n ExcelSheetModel,\n ExcelSheetViewModel,\n ExcelWorkbookModel,\n} from './model.js';\nimport type { ExcelWorkbook } from './runtime.js';\n\nexport type ExcelTransactionSource = 'user' | 'agent' | 'import' | 'system';\n\nexport interface ExcelTransactionGroupMetadata {\n actor?: string;\n description?: string;\n agentRunId?: string;\n agentStepId?: string;\n agentActionId?: string;\n mergeKey?: string;\n [key: string]: unknown;\n}\n\nexport interface ExcelTransactionGroupOptions {\n source: ExcelTransactionSource;\n label: string;\n id?: string;\n mergeKey?: string;\n mergeWindowMs?: number;\n metadata?: ExcelTransactionGroupMetadata;\n}\n\nexport interface ExcelAgentTransactionGroupOptions {\n label: string;\n id?: string;\n actor?: string;\n description?: string;\n agentRunId?: string;\n agentStepId?: string;\n agentActionId?: string;\n mergeKey?: string;\n mergeWindowMs?: number;\n metadata?: ExcelTransactionGroupMetadata;\n}\n\nexport interface ExcelTransactionGroup {\n id: string;\n source: ExcelTransactionSource;\n label: string;\n metadata?: ExcelTransactionGroupMetadata;\n mergeKey?: string;\n mergeWindowMs?: number;\n workbookId: string;\n transactions: ExcelTransaction[];\n affectedSheets: string[];\n affectedRanges: string[];\n createdAt: number;\n committedAt: number;\n}\n\nexport interface ExcelTransaction {\n id: string;\n label: string;\n forward: ExcelPatch[];\n inverse: ExcelPatch[];\n}\n\nexport type ExcelPatch =\n | ExcelRangeCellsPatch\n | ExcelRangeFormatPatch\n | ExcelMergedRangesPatch\n | ExcelSheetViewsPatch\n | ExcelWorkbookSheetsPatch\n | ExcelSheetModelPatch\n | ExcelSheetRowsInsertPatch\n | ExcelSheetRowsDeletePatch\n | ExcelSheetRowsRestorePatch\n | ExcelSheetRowsRestoreDeltaPatch\n | ExcelSheetColumnsInsertPatch\n | ExcelSheetColumnsDeletePatch\n | ExcelSheetColumnsRestorePatch\n | ExcelSheetColumnsRestoreDeltaPatch\n | ExcelRowHeightPatch\n | ExcelColumnWidthPatch\n | ExcelSnapshotPatch;\n\nexport interface ExcelRangeCellsPatch {\n kind: 'range.cells';\n sheetName: string;\n address: string;\n cells: ExcelCellModel[];\n}\n\nexport interface ExcelRangeFormatPatch {\n kind: 'range.format';\n sheetName: string;\n address: string;\n formats: ExcelCellFormatSnapshot[];\n}\n\nexport interface ExcelCellFormatSnapshot {\n row: number;\n column: number;\n styleId: number | undefined;\n}\n\nexport interface ExcelMergedRangesPatch {\n kind: 'sheet.mergedRanges';\n sheetName: string;\n address: string;\n mergedRanges: string[];\n}\n\nexport interface ExcelSheetViewsPatch {\n kind: 'sheet.views';\n sheetName: string;\n address: string;\n sheetViews: ExcelSheetViewModel[];\n}\n\nexport interface ExcelWorkbookSheetsPatch {\n kind: 'workbook.sheets';\n sheetName: string;\n address: string;\n sheets: ExcelSheetModel[];\n definedNames: ExcelDefinedNameModel[];\n}\n\nexport interface ExcelSheetModelPatch {\n kind: 'sheet.model';\n sheetName: string;\n address: string;\n sheet: ExcelSheetModel;\n definedNames: ExcelDefinedNameModel[];\n}\n\nexport interface ExcelSheetRowsInsertPatch {\n kind: 'sheet.rows.insert';\n sheetName: string;\n address: string;\n rowIndex: number;\n count: number;\n}\n\nexport interface ExcelSheetRowsDeletePatch {\n kind: 'sheet.rows.delete';\n sheetName: string;\n address: string;\n rowIndex: number;\n count: number;\n}\n\nexport interface ExcelSheetRowsRestorePatch {\n kind: 'sheet.rows.restore';\n sheetName: string;\n address: string;\n rowIndex: number;\n count: number;\n sheet: ExcelSheetModel;\n definedNames: ExcelDefinedNameModel[];\n}\n\nexport interface ExcelSheetRowsRestoreDeltaPatch {\n kind: 'sheet.rows.restoreDelta';\n sheetName: string;\n address: string;\n rowIndex: number;\n count: number;\n cells: ExcelCellModel[];\n rows: ExcelRowModel[];\n mergedRanges: ExcelMergedRangeModel[];\n definedNames: ExcelDefinedNameModel[];\n}\n\nexport interface ExcelSheetColumnsInsertPatch {\n kind: 'sheet.columns.insert';\n sheetName: string;\n address: string;\n columnIndex: number;\n count: number;\n}\n\nexport interface ExcelSheetColumnsDeletePatch {\n kind: 'sheet.columns.delete';\n sheetName: string;\n address: string;\n columnIndex: number;\n count: number;\n}\n\nexport interface ExcelSheetColumnsRestorePatch {\n kind: 'sheet.columns.restore';\n sheetName: string;\n address: string;\n columnIndex: number;\n count: number;\n sheet: ExcelSheetModel;\n definedNames: ExcelDefinedNameModel[];\n}\n\nexport interface ExcelSheetColumnsRestoreDeltaPatch {\n kind: 'sheet.columns.restoreDelta';\n sheetName: string;\n address: string;\n columnIndex: number;\n count: number;\n cells: ExcelCellModel[];\n columns: ExcelColumnModel[];\n mergedRanges: ExcelMergedRangeModel[];\n definedNames: ExcelDefinedNameModel[];\n}\n\nexport interface ExcelRowHeightPatch {\n kind: 'row.height';\n sheetName: string;\n row: number;\n height: number | undefined;\n}\n\nexport interface ExcelColumnWidthPatch {\n kind: 'column.width';\n sheetName: string;\n column: number;\n width: number | undefined;\n}\n\nexport interface ExcelSnapshotPatch {\n kind: 'snapshot';\n reason: string;\n beforeModel: ExcelWorkbookModel;\n afterModel: ExcelWorkbookModel;\n}\n\nexport interface ExcelHistoryApplyResult {\n group: ExcelTransactionGroup;\n affectedSheets: string[];\n affectedRanges: string[];\n summary: ExcelTransactionGroupSummary;\n}\n\nexport interface ExcelPatchSummary {\n kind: ExcelPatch['kind'];\n direction: 'forward' | 'inverse';\n sheetName: string;\n address: string;\n snapshot: boolean;\n structural: boolean;\n restoreStrategy?: 'delta' | 'full';\n}\n\nexport interface ExcelTransactionSummary {\n id: string;\n label: string;\n forwardPatchKinds: ExcelPatch['kind'][];\n inversePatchKinds: ExcelPatch['kind'][];\n patches: ExcelPatchSummary[];\n}\n\nexport interface ExcelTransactionGroupSummary {\n id: string;\n source: ExcelTransactionSource;\n label: string;\n metadata?: ExcelTransactionGroupMetadata;\n mergeKey?: string;\n workbookId: string;\n transactionCount: number;\n patchCount: number;\n forwardPatchKinds: ExcelPatch['kind'][];\n inversePatchKinds: ExcelPatch['kind'][];\n affectedSheets: string[];\n affectedRanges: string[];\n containsSnapshot: boolean;\n containsStructuralPatch: boolean;\n restoreStrategies: ('delta' | 'full')[];\n transactions: ExcelTransactionSummary[];\n createdAt: number;\n committedAt: number;\n}\n\nexport class ExcelWorkbookHistory {\n private readonly undoStack: ExcelTransactionGroup[] = [];\n private readonly redoStack: ExcelTransactionGroup[] = [];\n\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly options: { limit?: number } = {},\n ) {}\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n undoGroups(): ExcelTransactionGroup[] {\n return this.undoStack.map(cloneTransactionGroup);\n }\n\n redoGroups(): ExcelTransactionGroup[] {\n return this.redoStack.map(cloneTransactionGroup);\n }\n\n async runGroup(\n options: ExcelTransactionGroupOptions,\n run: (transaction: ExcelTransactionBuilder) => Promise<void>,\n ): Promise<ExcelHistoryApplyResult | null> {\n const builder = new ExcelTransactionGroupBuilder(this.workbook, options);\n await run(builder);\n const group = await builder.commit();\n if (!group) return null;\n const committedGroup = this.pushUndo(group, { allowMerge: true });\n this.redoStack.length = 0;\n return {\n group: cloneTransactionGroup(committedGroup),\n affectedSheets: [...committedGroup.affectedSheets],\n affectedRanges: [...committedGroup.affectedRanges],\n summary: summarizeExcelTransactionGroup(committedGroup),\n };\n }\n\n async runAgentGroup(\n options: ExcelAgentTransactionGroupOptions,\n run: (transaction: ExcelTransactionBuilder) => Promise<void>,\n ): Promise<ExcelHistoryApplyResult | null> {\n return this.runGroup(\n {\n id: options.id,\n source: 'agent',\n label: options.label,\n mergeKey: options.mergeKey,\n mergeWindowMs: options.mergeWindowMs,\n metadata: normalizeTransactionMetadata({\n ...options.metadata,\n actor: options.actor ?? options.metadata?.actor,\n description: options.description ?? options.metadata?.description,\n agentRunId: options.agentRunId ?? options.metadata?.agentRunId,\n agentStepId: options.agentStepId ?? options.metadata?.agentStepId,\n agentActionId: options.agentActionId ?? options.metadata?.agentActionId,\n mergeKey: options.mergeKey ?? options.metadata?.mergeKey,\n }),\n },\n run,\n );\n }\n\n async undo(): Promise<ExcelHistoryApplyResult | null> {\n const group = this.undoStack.pop();\n if (!group) return null;\n for (const transaction of [...group.transactions].reverse()) {\n for (const patch of [...transaction.inverse].reverse()) await applyExcelPatch(this.workbook, patch);\n }\n this.redoStack.push(group);\n return {\n group: cloneTransactionGroup(group),\n affectedSheets: [...group.affectedSheets],\n affectedRanges: [...group.affectedRanges],\n summary: summarizeExcelTransactionGroup(group),\n };\n }\n\n async redo(): Promise<ExcelHistoryApplyResult | null> {\n const group = this.redoStack.pop();\n if (!group) return null;\n for (const transaction of group.transactions) {\n for (const patch of transaction.forward) await applyExcelPatch(this.workbook, patch);\n }\n this.pushUndo(group, { allowMerge: false });\n return {\n group: cloneTransactionGroup(group),\n affectedSheets: [...group.affectedSheets],\n affectedRanges: [...group.affectedRanges],\n summary: summarizeExcelTransactionGroup(group),\n };\n }\n\n clear(): void {\n this.undoStack.length = 0;\n this.redoStack.length = 0;\n }\n\n private pushUndo(\n group: ExcelTransactionGroup,\n options: { allowMerge: boolean } = { allowMerge: false },\n ): ExcelTransactionGroup {\n if (options.allowMerge) {\n const previous = this.undoStack[this.undoStack.length - 1];\n if (previous && canMergeTransactionGroups(previous, group)) {\n const merged = mergeTransactionGroups(previous, group);\n this.undoStack[this.undoStack.length - 1] = merged;\n return merged;\n }\n }\n this.undoStack.push(group);\n const limit = this.options.limit ?? 100;\n while (this.undoStack.length > limit) this.undoStack.shift();\n return group;\n }\n}\n\nexport interface ExcelTransactionBuilder {\n setCellValue(sheetName: string, address: string, value: ExcelCellValue): Promise<void>;\n setCellFormula(sheetName: string, address: string, formula: string | null): Promise<void>;\n setRangeValues(sheetName: string, address: string, values: ExcelCellValue[][]): Promise<void>;\n clearRange(sheetName: string, address: string): Promise<void>;\n setRangeBold(sheetName: string, address: string, value: boolean | undefined): Promise<void>;\n setRangeItalic(sheetName: string, address: string, value: boolean | undefined): Promise<void>;\n setRangeUnderline(sheetName: string, address: string, value: boolean | undefined): Promise<void>;\n setRangeFontColor(sheetName: string, address: string, color: ExcelColorModel | undefined): Promise<void>;\n setRangeFillColor(sheetName: string, address: string, color: ExcelColorModel | undefined): Promise<void>;\n setRangeHorizontalAlign(sheetName: string, address: string, horizontal: 'left' | 'center' | 'right' | undefined): Promise<void>;\n setRangeVerticalAlign(sheetName: string, address: string, vertical: 'top' | 'center' | 'bottom' | undefined): Promise<void>;\n setRangeNumberFormat(sheetName: string, address: string, code: string | undefined): Promise<void>;\n clearRangeFormat(sheetName: string, address: string): Promise<void>;\n setRangeStyleId(sheetName: string, address: string, styleId: number | undefined): Promise<void>;\n setSheetViews(sheetName: string, sheetViews: ExcelSheetViewModel[]): Promise<void>;\n addSheet(name: string): Promise<void>;\n deleteSheet(nameOrId: string): Promise<void>;\n renameSheet(nameOrId: string, name: string): Promise<void>;\n copySheet(nameOrId: string, newName: string): Promise<void>;\n moveSheet(nameOrId: string, toIndex: number): Promise<void>;\n mergeRange(sheetName: string, address: string): Promise<void>;\n unmergeRange(sheetName: string, address: string): Promise<void>;\n insertRows(sheetName: string, rowIndex: number, count?: number): Promise<void>;\n deleteRows(sheetName: string, rowIndex: number, count?: number): Promise<void>;\n insertColumns(sheetName: string, columnIndex: number, count?: number): Promise<void>;\n deleteColumns(sheetName: string, columnIndex: number, count?: number): Promise<void>;\n setRangeBorder(sheetName: string, address: string, border: ExcelBorderModel): Promise<void>;\n setRowHeight(sheetName: string, row: number, height: number | undefined): Promise<void>;\n setColumnWidth(sheetName: string, column: number, width: number | undefined): Promise<void>;\n runSnapshot(label: string, reason: string, mutate: () => Promise<void>): Promise<void>;\n}\n\nclass ExcelTransactionGroupBuilder implements ExcelTransactionBuilder {\n private readonly createdAt = Date.now();\n private readonly transactions: ExcelTransaction[] = [];\n\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly options: ExcelTransactionGroupOptions,\n ) {}\n\n async setCellValue(sheetName: string, address: string, value: ExcelCellValue): Promise<void> {\n await this.setRangeValues(sheetName, address, [[value]]);\n }\n\n async setCellFormula(sheetName: string, address: string, formula: string | null): Promise<void> {\n await this.recordRangeCells(sheetName, address, 'Set cell formula', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).setFormulas([[formula]]);\n });\n }\n\n async setRangeValues(sheetName: string, address: string, values: ExcelCellValue[][]): Promise<void> {\n await this.recordRangeCells(sheetName, address, 'Set range values', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).setValues(values);\n });\n }\n\n async clearRange(sheetName: string, address: string): Promise<void> {\n await this.recordRangeCells(sheetName, address, 'Clear range', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).clear();\n });\n }\n\n async setRangeBold(sheetName: string, address: string, value: boolean | undefined): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range bold', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).format.font.setBold(value);\n });\n }\n\n async setRangeItalic(sheetName: string, address: string, value: boolean | undefined): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range italic', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).format.font.setItalic(value);\n });\n }\n\n async setRangeUnderline(sheetName: string, address: string, value: boolean | undefined): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range underline', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).format.font.setUnderline(value);\n });\n }\n\n async setRangeFontColor(sheetName: string, address: string, color: ExcelColorModel | undefined): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range font color', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).format.font.setColor(color);\n });\n }\n\n async setRangeFillColor(sheetName: string, address: string, color: ExcelColorModel | undefined): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range fill color', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).format.fill.setForegroundColor(color);\n });\n }\n\n async setRangeHorizontalAlign(\n sheetName: string,\n address: string,\n horizontal: 'left' | 'center' | 'right' | undefined,\n ): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range horizontal align', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).format.alignment.setHorizontal(horizontal);\n });\n }\n\n async setRangeVerticalAlign(\n sheetName: string,\n address: string,\n vertical: 'top' | 'center' | 'bottom' | undefined,\n ): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range vertical align', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).format.alignment.setVertical(vertical);\n });\n }\n\n async setRangeNumberFormat(sheetName: string, address: string, code: string | undefined): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range number format', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).format.setNumberFormatCode(code);\n });\n }\n\n async clearRangeFormat(sheetName: string, address: string): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Clear range format', async () => {\n await this.workbook.executeCode<void>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetName);\n const range = sheet.getRange(args.address);\n range.format.font.setBold(undefined);\n range.format.font.setItalic(undefined);\n range.format.font.setUnderline(undefined);\n range.format.font.setColor(undefined);\n range.format.fill.setForegroundColor(undefined);\n range.format.border.setValue({});\n range.format.alignment.setValue(undefined);\n range.format.setNumberFormatCode(undefined);\n `,\n { sheetName, address },\n );\n });\n }\n\n async setRangeStyleId(sheetName: string, address: string, styleId: number | undefined): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range style', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).setStyleId(styleId);\n });\n }\n\n async setSheetViews(sheetName: string, sheetViews: ExcelSheetViewModel[]): Promise<void> {\n const sheet = this.workbook.worksheets.getItem(sheetName);\n const before = await sheet.sheetViews();\n await sheet.setSheetViews(sheetViews);\n const after = await sheet.sheetViews();\n if (JSON.stringify(before) === JSON.stringify(after)) return;\n const address = 'views';\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label: 'Set sheet views',\n forward: [{ kind: 'sheet.views', sheetName, address, sheetViews: after }],\n inverse: [{ kind: 'sheet.views', sheetName, address, sheetViews: before }],\n });\n }\n\n async addSheet(name: string): Promise<void> {\n await this.recordWorkbookSheets('Add worksheet', name, async () => {\n await this.workbook.worksheets.add(name);\n });\n }\n\n async deleteSheet(nameOrId: string): Promise<void> {\n await this.recordWorkbookSheets('Delete worksheet', nameOrId, async () => {\n await this.workbook.worksheets.deleteItem(nameOrId);\n });\n }\n\n async renameSheet(nameOrId: string, name: string): Promise<void> {\n await this.recordWorkbookSheets('Rename worksheet', nameOrId, async () => {\n await this.workbook.worksheets.getItem(nameOrId).rename(name);\n });\n }\n\n async copySheet(nameOrId: string, newName: string): Promise<void> {\n await this.recordWorkbookSheets('Copy worksheet', nameOrId, async () => {\n await this.workbook.worksheets.copy(nameOrId, newName);\n });\n }\n\n async moveSheet(nameOrId: string, toIndex: number): Promise<void> {\n await this.recordWorkbookSheets('Move worksheet', nameOrId, async () => {\n await this.workbook.worksheets.move(nameOrId, toIndex);\n });\n }\n\n async mergeRange(sheetName: string, address: string): Promise<void> {\n const beforeCells = await captureRangeCells(this.workbook, sheetName, address);\n const beforeMergedRanges = await captureMergedRanges(this.workbook, sheetName);\n await this.workbook.worksheets.getItem(sheetName).getRange(address).merge();\n const afterCells = await captureRangeCells(this.workbook, sheetName, address);\n const afterMergedRanges = await captureMergedRanges(this.workbook, sheetName);\n if (\n JSON.stringify(beforeCells) === JSON.stringify(afterCells) &&\n JSON.stringify(beforeMergedRanges) === JSON.stringify(afterMergedRanges)\n ) {\n return;\n }\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label: 'Merge range',\n forward: [\n { kind: 'range.cells', sheetName, address, cells: afterCells },\n { kind: 'sheet.mergedRanges', sheetName, address, mergedRanges: afterMergedRanges },\n ],\n inverse: [\n { kind: 'range.cells', sheetName, address, cells: beforeCells },\n { kind: 'sheet.mergedRanges', sheetName, address, mergedRanges: beforeMergedRanges },\n ],\n });\n }\n\n async unmergeRange(sheetName: string, address: string): Promise<void> {\n await this.recordMergedRanges(sheetName, address, 'Unmerge range', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).unmerge();\n });\n }\n\n async insertRows(sheetName: string, rowIndex: number, count = 1): Promise<void> {\n await this.workbook.worksheets.getItem(sheetName).insertRows(rowIndex, count);\n const address = `rows:${rowIndex}:${count}`;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label: 'Insert rows',\n forward: [{ kind: 'sheet.rows.insert', sheetName, address, rowIndex, count }],\n inverse: [{ kind: 'sheet.rows.delete', sheetName, address, rowIndex, count }],\n });\n }\n\n async deleteRows(sheetName: string, rowIndex: number, count = 1): Promise<void> {\n const before = await captureSheetModel(this.workbook, sheetName);\n const restoreDelta = canUseStructuralRestoreDelta(before)\n ? buildRowsRestoreDeltaPatch(sheetName, `rows:${rowIndex}:${count}`, rowIndex, count, before)\n : null;\n await this.workbook.worksheets.getItem(sheetName).deleteRows(rowIndex, count);\n const after = await captureSheetModel(this.workbook, sheetName);\n if (JSON.stringify(before) === JSON.stringify(after)) return;\n const address = `rows:${rowIndex}:${count}`;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label: 'Delete rows',\n forward: [{ kind: 'sheet.rows.delete', sheetName, address, rowIndex, count }],\n inverse: [\n restoreDelta ?? {\n kind: 'sheet.rows.restore',\n sheetName,\n address,\n rowIndex,\n count,\n sheet: before.sheet,\n definedNames: before.definedNames,\n },\n ],\n });\n }\n\n async insertColumns(sheetName: string, columnIndex: number, count = 1): Promise<void> {\n await this.workbook.worksheets.getItem(sheetName).insertColumns(columnIndex, count);\n const address = `columns:${columnIndex}:${count}`;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label: 'Insert columns',\n forward: [{ kind: 'sheet.columns.insert', sheetName, address, columnIndex, count }],\n inverse: [{ kind: 'sheet.columns.delete', sheetName, address, columnIndex, count }],\n });\n }\n\n async deleteColumns(sheetName: string, columnIndex: number, count = 1): Promise<void> {\n const before = await captureSheetModel(this.workbook, sheetName);\n const restoreDelta = canUseStructuralRestoreDelta(before)\n ? buildColumnsRestoreDeltaPatch(sheetName, `columns:${columnIndex}:${count}`, columnIndex, count, before)\n : null;\n await this.workbook.worksheets.getItem(sheetName).deleteColumns(columnIndex, count);\n const after = await captureSheetModel(this.workbook, sheetName);\n if (JSON.stringify(before) === JSON.stringify(after)) return;\n const address = `columns:${columnIndex}:${count}`;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label: 'Delete columns',\n forward: [{ kind: 'sheet.columns.delete', sheetName, address, columnIndex, count }],\n inverse: [\n restoreDelta ?? {\n kind: 'sheet.columns.restore',\n sheetName,\n address,\n columnIndex,\n count,\n sheet: before.sheet,\n definedNames: before.definedNames,\n },\n ],\n });\n }\n\n async setRangeBorder(sheetName: string, address: string, border: ExcelBorderModel): Promise<void> {\n await this.recordRangeFormat(sheetName, address, 'Set range border', async () => {\n await this.workbook.worksheets.getItem(sheetName).getRange(address).format.border.setValue(border);\n });\n }\n\n async setRowHeight(sheetName: string, row: number, height: number | undefined): Promise<void> {\n const address = formatCellAddress(row, 1);\n const range = this.workbook.worksheets.getItem(sheetName).getRange(address);\n const before = (await range.rowHeights())[0];\n await range.setRowHeight(height);\n const after = (await range.rowHeights())[0];\n if (before === after) return;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label: 'Set row height',\n forward: [{ kind: 'row.height', sheetName, row, height: after }],\n inverse: [{ kind: 'row.height', sheetName, row, height: before }],\n });\n }\n\n async setColumnWidth(sheetName: string, column: number, width: number | undefined): Promise<void> {\n const address = formatCellAddress(1, column);\n const range = this.workbook.worksheets.getItem(sheetName).getRange(address);\n const before = (await range.columnWidths())[0];\n await range.setColumnWidth(width);\n const after = (await range.columnWidths())[0];\n if (before === after) return;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label: 'Set column width',\n forward: [{ kind: 'column.width', sheetName, column, width: after }],\n inverse: [{ kind: 'column.width', sheetName, column, width: before }],\n });\n }\n\n async runSnapshot(label: string, reason: string, mutate: () => Promise<void>): Promise<void> {\n const before = await this.workbook.toModel();\n await mutate();\n const after = await this.workbook.toModel();\n if (JSON.stringify(before) === JSON.stringify(after)) return;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label,\n forward: [{ kind: 'snapshot', reason, beforeModel: before, afterModel: after }],\n inverse: [{ kind: 'snapshot', reason, beforeModel: after, afterModel: before }],\n });\n }\n\n async commit(): Promise<ExcelTransactionGroup | null> {\n if (this.transactions.length === 0) return null;\n const affectedSheets = unique(this.transactions.flatMap((transaction) => transaction.forward.map(patchSheetName)));\n const affectedRanges = unique(this.transactions.flatMap((transaction) => transaction.forward.map(patchRangeAddress).filter(Boolean)));\n return {\n id: this.options.id ?? createExcelHistoryId('group'),\n source: this.options.source,\n label: this.options.label,\n metadata: normalizeTransactionMetadata({\n ...this.options.metadata,\n mergeKey: this.options.mergeKey ?? this.options.metadata?.mergeKey,\n }),\n mergeKey: this.options.mergeKey ?? this.options.metadata?.mergeKey,\n mergeWindowMs: this.options.mergeWindowMs,\n workbookId: this.workbook.workbookId,\n transactions: this.transactions.map(cloneTransaction),\n affectedSheets,\n affectedRanges,\n createdAt: this.createdAt,\n committedAt: Date.now(),\n };\n }\n\n private async recordRangeCells(\n sheetName: string,\n address: string,\n label: string,\n mutate: () => Promise<void>,\n ): Promise<void> {\n const before = await captureRangeCells(this.workbook, sheetName, address);\n await mutate();\n const after = await captureRangeCells(this.workbook, sheetName, address);\n if (JSON.stringify(before) === JSON.stringify(after)) return;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label,\n forward: [{ kind: 'range.cells', sheetName, address, cells: after }],\n inverse: [{ kind: 'range.cells', sheetName, address, cells: before }],\n });\n }\n\n private async recordRangeFormat(\n sheetName: string,\n address: string,\n label: string,\n mutate: () => Promise<void>,\n ): Promise<void> {\n const before = await captureRangeFormats(this.workbook, sheetName, address);\n await mutate();\n const after = await captureRangeFormats(this.workbook, sheetName, address);\n if (JSON.stringify(before) === JSON.stringify(after)) return;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label,\n forward: [{ kind: 'range.format', sheetName, address, formats: after }],\n inverse: [{ kind: 'range.format', sheetName, address, formats: before }],\n });\n }\n\n private async recordMergedRanges(\n sheetName: string,\n address: string,\n label: string,\n mutate: () => Promise<void>,\n ): Promise<void> {\n const before = await captureMergedRanges(this.workbook, sheetName);\n await mutate();\n const after = await captureMergedRanges(this.workbook, sheetName);\n if (JSON.stringify(before) === JSON.stringify(after)) return;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label,\n forward: [{ kind: 'sheet.mergedRanges', sheetName, address, mergedRanges: after }],\n inverse: [{ kind: 'sheet.mergedRanges', sheetName, address, mergedRanges: before }],\n });\n }\n\n private async recordSheetModel(\n sheetName: string,\n address: string,\n label: string,\n mutate: () => Promise<void>,\n ): Promise<void> {\n const before = await captureSheetModel(this.workbook, sheetName);\n await mutate();\n const after = await captureSheetModel(this.workbook, sheetName);\n if (JSON.stringify(before) === JSON.stringify(after)) return;\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label,\n forward: [{ kind: 'sheet.model', sheetName, address, sheet: after.sheet, definedNames: after.definedNames }],\n inverse: [{ kind: 'sheet.model', sheetName, address, sheet: before.sheet, definedNames: before.definedNames }],\n });\n }\n\n private async recordWorkbookSheets(\n label: string,\n sheetName: string,\n mutate: () => Promise<void>,\n ): Promise<void> {\n const before = await captureWorkbookSheets(this.workbook);\n await mutate();\n const after = await captureWorkbookSheets(this.workbook);\n if (JSON.stringify(before) === JSON.stringify(after)) return;\n const address = 'sheets';\n this.transactions.push({\n id: createExcelHistoryId('tx'),\n label,\n forward: [{ kind: 'workbook.sheets', sheetName, address, sheets: after.sheets, definedNames: after.definedNames }],\n inverse: [{ kind: 'workbook.sheets', sheetName, address, sheets: before.sheets, definedNames: before.definedNames }],\n });\n }\n}\n\nexport async function applyExcelPatch(workbook: ExcelWorkbook, patch: ExcelPatch): Promise<void> {\n if (patch.kind === 'range.cells') {\n await applyRangeCellsPatch(workbook, patch);\n return;\n }\n if (patch.kind === 'range.format') {\n await applyRangeFormatPatch(workbook, patch);\n return;\n }\n if (patch.kind === 'sheet.mergedRanges') {\n await applyMergedRangesPatch(workbook, patch);\n return;\n }\n if (patch.kind === 'sheet.views') {\n await workbook.worksheets.getItem(patch.sheetName).setSheetViews(patch.sheetViews);\n return;\n }\n if (patch.kind === 'workbook.sheets') {\n await applyWorkbookSheetsPatch(workbook, patch);\n return;\n }\n if (patch.kind === 'sheet.model') {\n await applySheetModelPatch(workbook, patch);\n return;\n }\n if (patch.kind === 'sheet.rows.insert') {\n await workbook.worksheets.getItem(patch.sheetName).insertRows(patch.rowIndex, patch.count);\n return;\n }\n if (patch.kind === 'sheet.rows.delete') {\n await workbook.worksheets.getItem(patch.sheetName).deleteRows(patch.rowIndex, patch.count);\n return;\n }\n if (patch.kind === 'sheet.rows.restore') {\n await applySheetStructuralRestorePatch(workbook, patch);\n return;\n }\n if (patch.kind === 'sheet.rows.restoreDelta') {\n await applyRowsRestoreDeltaPatch(workbook, patch);\n return;\n }\n if (patch.kind === 'sheet.columns.insert') {\n await workbook.worksheets.getItem(patch.sheetName).insertColumns(patch.columnIndex, patch.count);\n return;\n }\n if (patch.kind === 'sheet.columns.delete') {\n await workbook.worksheets.getItem(patch.sheetName).deleteColumns(patch.columnIndex, patch.count);\n return;\n }\n if (patch.kind === 'sheet.columns.restore') {\n await applySheetStructuralRestorePatch(workbook, patch);\n return;\n }\n if (patch.kind === 'sheet.columns.restoreDelta') {\n await applyColumnsRestoreDeltaPatch(workbook, patch);\n return;\n }\n if (patch.kind === 'row.height') {\n await workbook.worksheets.getItem(patch.sheetName).getRange(formatCellAddress(patch.row, 1)).setRowHeight(patch.height);\n return;\n }\n if (patch.kind === 'column.width') {\n await workbook.worksheets.getItem(patch.sheetName).getRange(formatCellAddress(1, patch.column)).setColumnWidth(patch.width);\n return;\n }\n await applySnapshotPatch(workbook, patch);\n}\n\nexport function summarizeExcelTransactionGroup(group: ExcelTransactionGroup): ExcelTransactionGroupSummary {\n const transactions = group.transactions.map(summarizeExcelTransaction);\n const patches = transactions.flatMap((transaction) => transaction.patches);\n const restoreStrategies = unique(\n patches\n .map((patch) => patch.restoreStrategy)\n .filter((strategy): strategy is 'delta' | 'full' => strategy !== undefined),\n ) as ('delta' | 'full')[];\n return {\n id: group.id,\n source: group.source,\n label: group.label,\n metadata: group.metadata ? cloneJson(group.metadata) : undefined,\n mergeKey: group.mergeKey,\n workbookId: group.workbookId,\n transactionCount: group.transactions.length,\n patchCount: patches.length,\n forwardPatchKinds: unique(\n group.transactions.flatMap((transaction) => transaction.forward.map((patch) => patch.kind)),\n ) as ExcelPatch['kind'][],\n inversePatchKinds: unique(\n group.transactions.flatMap((transaction) => transaction.inverse.map((patch) => patch.kind)),\n ) as ExcelPatch['kind'][],\n affectedSheets: [...group.affectedSheets],\n affectedRanges: [...group.affectedRanges],\n containsSnapshot: patches.some((patch) => patch.snapshot),\n containsStructuralPatch: patches.some((patch) => patch.structural),\n restoreStrategies,\n transactions,\n createdAt: group.createdAt,\n committedAt: group.committedAt,\n };\n}\n\nfunction summarizeExcelTransaction(transaction: ExcelTransaction): ExcelTransactionSummary {\n return {\n id: transaction.id,\n label: transaction.label,\n forwardPatchKinds: unique(transaction.forward.map((patch) => patch.kind)) as ExcelPatch['kind'][],\n inversePatchKinds: unique(transaction.inverse.map((patch) => patch.kind)) as ExcelPatch['kind'][],\n patches: [\n ...transaction.forward.map((patch) => summarizeExcelPatch(patch, 'forward')),\n ...transaction.inverse.map((patch) => summarizeExcelPatch(patch, 'inverse')),\n ],\n };\n}\n\nfunction summarizeExcelPatch(patch: ExcelPatch, direction: 'forward' | 'inverse'): ExcelPatchSummary {\n return {\n kind: patch.kind,\n direction,\n sheetName: patchSheetName(patch),\n address: patchRangeAddress(patch),\n snapshot: patch.kind === 'snapshot',\n structural: isStructuralPatch(patch),\n restoreStrategy: patchRestoreStrategy(patch),\n };\n}\n\nasync function captureMergedRanges(workbook: ExcelWorkbook, sheetName: string): Promise<string[]> {\n return (await workbook.worksheets.getItem(sheetName).mergedRanges()).map((range) => range.address);\n}\n\nasync function captureSheetModel(\n workbook: ExcelWorkbook,\n sheetName: string,\n): Promise<{ sheet: ExcelSheetModel; definedNames: ExcelDefinedNameModel[] }> {\n const model = await workbook.toModel();\n const sheet = model.sheets.find((item) => item.name === sheetName || item.id === sheetName);\n if (!sheet) throw new Error(`ExcelWorkbookHistory: sheet not found: ${sheetName}`);\n return {\n sheet,\n definedNames: model.definedNames,\n };\n}\n\nasync function captureWorkbookSheets(\n workbook: ExcelWorkbook,\n): Promise<{ sheets: ExcelSheetModel[]; definedNames: ExcelDefinedNameModel[] }> {\n const model = await workbook.toModel();\n return { sheets: model.sheets, definedNames: model.definedNames };\n}\n\nasync function captureRangeCells(\n workbook: ExcelWorkbook,\n sheetName: string,\n address: string,\n): Promise<ExcelCellModel[]> {\n return workbook.worksheets.getItem(sheetName).getRange(address).toModel();\n}\n\nasync function captureRangeFormats(\n workbook: ExcelWorkbook,\n sheetName: string,\n address: string,\n): Promise<ExcelCellFormatSnapshot[]> {\n const range = parseRangeAddress(address);\n const styleIds = await workbook.worksheets.getItem(sheetName).getRange(address).styleIds();\n const formats: ExcelCellFormatSnapshot[] = [];\n for (let rowOffset = 0; rowOffset < range.rowCount; rowOffset++) {\n for (let columnOffset = 0; columnOffset < range.columnCount; columnOffset++) {\n formats.push({\n row: range.startRow + rowOffset,\n column: range.startColumn + columnOffset,\n styleId: styleIds[rowOffset]?.[columnOffset],\n });\n }\n }\n return formats;\n}\n\nasync function applyRangeCellsPatch(workbook: ExcelWorkbook, patch: ExcelRangeCellsPatch): Promise<void> {\n await workbook.executeCode<void>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetName);\n const range = sheet.getRange(args.address);\n range.clear();\n for (const cell of args.cells) {\n const target = sheet.getCell(cell.address);\n if (cell.formula !== undefined) target.setFormula(cell.formula);\n else target.setValue(cell.value);\n if (cell.styleId !== undefined) target.setStyleId(cell.styleId);\n }\n `,\n { sheetName: patch.sheetName, address: patch.address, cells: patch.cells },\n );\n}\n\nasync function applyRangeFormatPatch(workbook: ExcelWorkbook, patch: ExcelRangeFormatPatch): Promise<void> {\n const formats = patch.formats.map((item) => ({\n address: formatCellAddress(item.row, item.column),\n styleId: item.styleId,\n }));\n await workbook.executeCode<void>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetName);\n for (const item of args.formats) {\n sheet.getCell(item.address).setStyleId(item.styleId);\n }\n `,\n { sheetName: patch.sheetName, formats },\n );\n}\n\nasync function applyMergedRangesPatch(workbook: ExcelWorkbook, patch: ExcelMergedRangesPatch): Promise<void> {\n await workbook.executeCode<void>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetName);\n sheet.model.mergedRanges = args.mergedRanges.map((address) => ({ address }));\n `,\n { sheetName: patch.sheetName, mergedRanges: patch.mergedRanges },\n );\n}\n\nasync function applySheetModelPatch(workbook: ExcelWorkbook, patch: ExcelSheetModelPatch): Promise<void> {\n await workbook.executeCode<void>(\n `\n const model = workbook.toModel();\n const index = model.sheets.findIndex((sheet) => sheet.name === args.sheetName || sheet.id === args.sheetName);\n if (index === -1) throw new Error('ExcelWorkbookHistory: sheet not found: ' + args.sheetName);\n model.sheets[index] = args.sheet;\n model.definedNames = args.definedNames;\n workbook._replaceModelForHistory(model);\n `,\n {\n sheetName: patch.sheetName,\n sheet: patch.sheet,\n definedNames: patch.definedNames,\n },\n );\n}\n\nasync function applyWorkbookSheetsPatch(workbook: ExcelWorkbook, patch: ExcelWorkbookSheetsPatch): Promise<void> {\n await workbook.executeCode<void>(\n `\n const model = workbook.toModel();\n model.sheets = args.sheets;\n model.definedNames = args.definedNames;\n workbook._replaceModelForHistory(model);\n `,\n { sheets: patch.sheets, definedNames: patch.definedNames },\n );\n}\n\nasync function applySheetStructuralRestorePatch(\n workbook: ExcelWorkbook,\n patch: ExcelSheetRowsRestorePatch | ExcelSheetColumnsRestorePatch,\n): Promise<void> {\n await workbook.executeCode<void>(\n `\n const model = workbook.toModel();\n const index = model.sheets.findIndex((sheet) => sheet.name === args.sheetName || sheet.id === args.sheetName);\n if (index === -1) throw new Error('ExcelWorkbookHistory: sheet not found: ' + args.sheetName);\n model.sheets[index] = args.sheet;\n model.definedNames = args.definedNames;\n workbook._replaceModelForHistory(model);\n `,\n {\n sheetName: patch.sheetName,\n sheet: patch.sheet,\n definedNames: patch.definedNames,\n },\n );\n}\n\nasync function applyRowsRestoreDeltaPatch(\n workbook: ExcelWorkbook,\n patch: ExcelSheetRowsRestoreDeltaPatch,\n): Promise<void> {\n await workbook.executeCode<void>(\n `\n function columnIndexToName(column) {\n let value = column;\n let name = '';\n while (value > 0) {\n const rem = (value - 1) % 26;\n name = String.fromCharCode(65 + rem) + name;\n value = Math.floor((value - 1) / 26);\n }\n return name;\n }\n\n function formatCellAddress(row, column) {\n return columnIndexToName(column) + String(row);\n }\n\n function computeDimension(cells) {\n if (!cells.length) return undefined;\n let minRow = Infinity;\n let minColumn = Infinity;\n let maxRow = 0;\n let maxColumn = 0;\n for (const cell of cells) {\n minRow = Math.min(minRow, cell.row);\n minColumn = Math.min(minColumn, cell.column);\n maxRow = Math.max(maxRow, cell.row);\n maxColumn = Math.max(maxColumn, cell.column);\n }\n const first = formatCellAddress(minRow, minColumn);\n const last = formatCellAddress(maxRow, maxColumn);\n return first === last ? first : first + ':' + last;\n }\n\n const sheet = workbook.worksheets.getItem(args.sheetName);\n sheet.insertRows(args.rowIndex, args.count);\n\n const model = workbook.toModel();\n const index = model.sheets.findIndex((item) => item.name === args.sheetName || item.id === args.sheetName);\n if (index === -1) throw new Error('ExcelWorkbookHistory: sheet not found: ' + args.sheetName);\n const sheetModel = model.sheets[index];\n const endRow = args.rowIndex + args.count - 1;\n\n sheetModel.cells = sheetModel.cells.filter((cell) => cell.row < args.rowIndex || cell.row > endRow);\n sheetModel.cells.push(...args.cells.map((cell) => ({ ...cell })));\n sheetModel.cells.sort((a, b) => a.row - b.row || a.column - b.column);\n\n sheetModel.rows = sheetModel.rows.filter((row) => row.index < args.rowIndex || row.index > endRow);\n sheetModel.rows.push(...args.rows.map((row) => ({ ...row })));\n sheetModel.rows.sort((a, b) => a.index - b.index);\n\n sheetModel.mergedRanges = args.mergedRanges.map((range) => ({ ...range }));\n sheetModel.dimension = computeDimension(sheetModel.cells);\n model.definedNames = args.definedNames.map((name) => ({ ...name }));\n workbook._replaceModelForHistory(model);\n `,\n {\n sheetName: patch.sheetName,\n rowIndex: patch.rowIndex,\n count: patch.count,\n cells: patch.cells,\n rows: patch.rows,\n mergedRanges: patch.mergedRanges,\n definedNames: patch.definedNames,\n },\n );\n}\n\nasync function applyColumnsRestoreDeltaPatch(\n workbook: ExcelWorkbook,\n patch: ExcelSheetColumnsRestoreDeltaPatch,\n): Promise<void> {\n await workbook.executeCode<void>(\n `\n function columnIndexToName(column) {\n let value = column;\n let name = '';\n while (value > 0) {\n const rem = (value - 1) % 26;\n name = String.fromCharCode(65 + rem) + name;\n value = Math.floor((value - 1) / 26);\n }\n return name;\n }\n\n function formatCellAddress(row, column) {\n return columnIndexToName(column) + String(row);\n }\n\n function computeDimension(cells) {\n if (!cells.length) return undefined;\n let minRow = Infinity;\n let minColumn = Infinity;\n let maxRow = 0;\n let maxColumn = 0;\n for (const cell of cells) {\n minRow = Math.min(minRow, cell.row);\n minColumn = Math.min(minColumn, cell.column);\n maxRow = Math.max(maxRow, cell.row);\n maxColumn = Math.max(maxColumn, cell.column);\n }\n const first = formatCellAddress(minRow, minColumn);\n const last = formatCellAddress(maxRow, maxColumn);\n return first === last ? first : first + ':' + last;\n }\n\n const sheet = workbook.worksheets.getItem(args.sheetName);\n sheet.insertColumns(args.columnIndex, args.count);\n\n const model = workbook.toModel();\n const index = model.sheets.findIndex((item) => item.name === args.sheetName || item.id === args.sheetName);\n if (index === -1) throw new Error('ExcelWorkbookHistory: sheet not found: ' + args.sheetName);\n const sheetModel = model.sheets[index];\n const endColumn = args.columnIndex + args.count - 1;\n\n sheetModel.cells = sheetModel.cells.filter((cell) => cell.column < args.columnIndex || cell.column > endColumn);\n sheetModel.cells.push(...args.cells.map((cell) => ({ ...cell })));\n sheetModel.cells.sort((a, b) => a.row - b.row || a.column - b.column);\n\n sheetModel.columns = args.columns.map((column) => ({ ...column }));\n sheetModel.columns.sort((a, b) => a.min - b.min || a.max - b.max);\n\n sheetModel.mergedRanges = args.mergedRanges.map((range) => ({ ...range }));\n sheetModel.dimension = computeDimension(sheetModel.cells);\n model.definedNames = args.definedNames.map((name) => ({ ...name }));\n workbook._replaceModelForHistory(model);\n `,\n {\n sheetName: patch.sheetName,\n columnIndex: patch.columnIndex,\n count: patch.count,\n cells: patch.cells,\n columns: patch.columns,\n mergedRanges: patch.mergedRanges,\n definedNames: patch.definedNames,\n },\n );\n}\n\nasync function applySnapshotPatch(workbook: ExcelWorkbook, patch: ExcelSnapshotPatch): Promise<void> {\n await workbook.executeCode<void>(\n `\n workbook._replaceModelForHistory(args.model);\n `,\n { model: patch.afterModel },\n );\n}\n\nfunction patchSheetName(patch: ExcelPatch): string {\n if (patch.kind === 'snapshot') return '';\n return patch.sheetName;\n}\n\nfunction patchRangeAddress(patch: ExcelPatch): string {\n if (patch.kind === 'row.height') return `${patch.sheetName}!${formatCellAddress(patch.row, 1)}`;\n if (patch.kind === 'column.width') return `${patch.sheetName}!${formatCellAddress(1, patch.column)}`;\n if (patch.kind === 'snapshot') return '';\n if (patch.kind === 'sheet.model') return `${patch.sheetName}!${patch.address}`;\n if (patch.kind === 'sheet.views') return `${patch.sheetName}!${patch.address}`;\n if (patch.kind === 'workbook.sheets') return `${patch.sheetName}!${patch.address}`;\n if (\n patch.kind === 'sheet.rows.insert' ||\n patch.kind === 'sheet.rows.delete' ||\n patch.kind === 'sheet.rows.restore' ||\n patch.kind === 'sheet.rows.restoreDelta' ||\n patch.kind === 'sheet.columns.insert' ||\n patch.kind === 'sheet.columns.delete' ||\n patch.kind === 'sheet.columns.restore' ||\n patch.kind === 'sheet.columns.restoreDelta'\n ) {\n return `${patch.sheetName}!${patch.address}`;\n }\n if (patch.kind === 'sheet.mergedRanges') return `${patch.sheetName}!${patch.address}`;\n return `${patch.sheetName}!${patch.address}`;\n}\n\nfunction isStructuralPatch(patch: ExcelPatch): boolean {\n return (\n patch.kind === 'sheet.model' ||\n patch.kind === 'workbook.sheets' ||\n patch.kind === 'sheet.rows.insert' ||\n patch.kind === 'sheet.rows.delete' ||\n patch.kind === 'sheet.rows.restore' ||\n patch.kind === 'sheet.rows.restoreDelta' ||\n patch.kind === 'sheet.columns.insert' ||\n patch.kind === 'sheet.columns.delete' ||\n patch.kind === 'sheet.columns.restore' ||\n patch.kind === 'sheet.columns.restoreDelta' ||\n patch.kind === 'sheet.mergedRanges' ||\n patch.kind === 'snapshot'\n );\n}\n\nfunction patchRestoreStrategy(patch: ExcelPatch): 'delta' | 'full' | undefined {\n if (patch.kind === 'sheet.rows.restoreDelta' || patch.kind === 'sheet.columns.restoreDelta') return 'delta';\n if (patch.kind === 'sheet.rows.restore' || patch.kind === 'sheet.columns.restore') return 'full';\n if (patch.kind === 'sheet.model' || patch.kind === 'snapshot') return 'full';\n if (patch.kind === 'workbook.sheets') return 'full';\n return undefined;\n}\n\nfunction canMergeTransactionGroups(previous: ExcelTransactionGroup, next: ExcelTransactionGroup): boolean {\n if (!previous.mergeKey || !next.mergeKey) return false;\n if (previous.mergeKey !== next.mergeKey) return false;\n if (previous.source !== next.source) return false;\n if (previous.workbookId !== next.workbookId) return false;\n const windowMs = next.mergeWindowMs ?? previous.mergeWindowMs ?? 0;\n if (windowMs <= 0) return false;\n return next.createdAt - previous.committedAt <= windowMs;\n}\n\nfunction mergeTransactionGroups(\n previous: ExcelTransactionGroup,\n next: ExcelTransactionGroup,\n): ExcelTransactionGroup {\n return {\n ...previous,\n label: next.label,\n metadata: normalizeTransactionMetadata({\n ...previous.metadata,\n ...next.metadata,\n mergeKey: next.mergeKey,\n }),\n mergeKey: previous.mergeKey,\n mergeWindowMs: next.mergeWindowMs ?? previous.mergeWindowMs,\n transactions: [...previous.transactions.map(cloneTransaction), ...next.transactions.map(cloneTransaction)],\n affectedSheets: unique([...previous.affectedSheets, ...next.affectedSheets]),\n affectedRanges: unique([...previous.affectedRanges, ...next.affectedRanges]),\n committedAt: next.committedAt,\n };\n}\n\nfunction cloneTransactionGroup(group: ExcelTransactionGroup): ExcelTransactionGroup {\n return JSON.parse(JSON.stringify(group)) as ExcelTransactionGroup;\n}\n\nfunction cloneTransaction(transaction: ExcelTransaction): ExcelTransaction {\n return JSON.parse(JSON.stringify(transaction)) as ExcelTransaction;\n}\n\nfunction buildRowsRestoreDeltaPatch(\n sheetName: string,\n address: string,\n rowIndex: number,\n count: number,\n model: { sheet: ExcelSheetModel; definedNames: ExcelDefinedNameModel[] },\n): ExcelSheetRowsRestoreDeltaPatch {\n const endRow = rowIndex + count - 1;\n return {\n kind: 'sheet.rows.restoreDelta',\n sheetName,\n address,\n rowIndex,\n count,\n cells: model.sheet.cells.filter((cell) => cell.row >= rowIndex && cell.row <= endRow).map(cloneJson),\n rows: model.sheet.rows.filter((row) => row.index >= rowIndex && row.index <= endRow).map(cloneJson),\n mergedRanges: model.sheet.mergedRanges.map(cloneJson),\n definedNames: model.definedNames.map(cloneJson),\n };\n}\n\nfunction buildColumnsRestoreDeltaPatch(\n sheetName: string,\n address: string,\n columnIndex: number,\n count: number,\n model: { sheet: ExcelSheetModel; definedNames: ExcelDefinedNameModel[] },\n): ExcelSheetColumnsRestoreDeltaPatch {\n const endColumn = columnIndex + count - 1;\n return {\n kind: 'sheet.columns.restoreDelta',\n sheetName,\n address,\n columnIndex,\n count,\n cells: model.sheet.cells.filter((cell) => cell.column >= columnIndex && cell.column <= endColumn).map(cloneJson),\n columns: model.sheet.columns.map(cloneJson),\n mergedRanges: model.sheet.mergedRanges.map(cloneJson),\n definedNames: model.definedNames.map(cloneJson),\n };\n}\n\nfunction canUseStructuralRestoreDelta(model: {\n sheet: ExcelSheetModel;\n definedNames: ExcelDefinedNameModel[];\n}): boolean {\n const sheet = model.sheet;\n return (\n model.definedNames.length === 0 &&\n !sheet.cells.some((cell) => cell.formula !== undefined) &&\n sheet.hyperlinks.length === 0 &&\n sheet.tables.length === 0 &&\n sheet.dataValidations.length === 0 &&\n sheet.conditionalFormats.length === 0 &&\n sheet.comments.length === 0 &&\n sheet.threadedComments.length === 0 &&\n sheet.drawings.length === 0 &&\n sheet.charts.length === 0 &&\n sheet.images.length === 0\n );\n}\n\nfunction cloneJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction normalizeTransactionMetadata(\n metadata: ExcelTransactionGroupMetadata | undefined,\n): ExcelTransactionGroupMetadata | undefined {\n if (!metadata) return undefined;\n const normalized: ExcelTransactionGroupMetadata = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== undefined) normalized[key] = value;\n }\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction createExcelHistoryId(prefix: string): string {\n return `${prefix}:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n}\n\nfunction unique(values: string[]): string[] {\n return [...new Set(values.filter(Boolean))];\n}\n","export interface ExcelRpcRequest {\n kind: 'request';\n id: string;\n method: string;\n args: unknown[];\n}\n\nexport interface ExcelRpcResponse {\n kind: 'response';\n id: string;\n result: unknown;\n}\n\nexport interface ExcelRpcError {\n kind: 'error';\n id: string;\n error: ExcelSerializableError;\n}\n\nexport interface ExcelSerializableError {\n message: string;\n name?: string;\n stack?: string;\n}\n\nexport type ExcelRpcMessage = ExcelRpcRequest | ExcelRpcResponse | ExcelRpcError;\n\nexport function serializeExcelError(error: unknown): ExcelSerializableError {\n const err = error as Error | null | undefined;\n return {\n message: err?.message ?? String(error),\n name: err?.name,\n stack: err?.stack,\n };\n}\n\nexport function deserializeExcelError(error: ExcelSerializableError): Error {\n const err = new Error(error.message);\n err.name = error.name ?? 'Error';\n if (error.stack) err.stack = error.stack;\n return err;\n}\n","import {\n deserializeExcelError,\n type ExcelRpcError,\n type ExcelRpcMessage,\n type ExcelRpcRequest,\n type ExcelRpcResponse,\n} from './runtime-rpc.js';\n\nexport interface ExcelWorkerPortLike {\n postMessage(data: unknown, transferList?: unknown[]): void;\n onMessage(listener: (data: unknown) => void): void;\n onError(listener: (err: unknown) => void): void;\n terminate(): Promise<void>;\n}\n\ninterface PendingCall {\n resolve: (value: unknown) => void;\n reject: (err: unknown) => void;\n timeoutHandle?: ReturnType<typeof setTimeout>;\n}\n\nexport class ExcelWorkerTransport {\n private readonly pending = new Map<string, PendingCall>();\n private nextId = 0;\n private disposed = false;\n\n constructor(private readonly port: ExcelWorkerPortLike) {\n port.onMessage((data) => this.handleIncoming(data));\n port.onError((error) => this.rejectAll(error));\n }\n\n call<T>(method: string, args: unknown[], timeoutMs = 0): Promise<T> {\n if (this.disposed) throw new Error('ExcelWorkerTransport has been disposed');\n const id = `excel-${Date.now()}-${this.nextId++}`;\n const req: ExcelRpcRequest = { kind: 'request', id, method, args };\n\n return new Promise<T>((resolve, reject) => {\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n if (timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`excel worker call timeout after ${timeoutMs}ms: ${method}`));\n }, timeoutMs);\n }\n\n this.pending.set(id, {\n resolve: (value) => resolve(value as T),\n reject,\n timeoutHandle,\n });\n this.port.postMessage(req);\n });\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.rejectAll(new Error('ExcelWorkerTransport disposed'));\n await this.port.terminate();\n }\n\n private handleIncoming(data: unknown): void {\n if (data === null || typeof data !== 'object') return;\n const msg = data as ExcelRpcMessage;\n if (msg.kind !== 'response' && msg.kind !== 'error') return;\n\n const pending = this.pending.get(msg.id);\n if (!pending) return;\n this.pending.delete(msg.id);\n if (pending.timeoutHandle) clearTimeout(pending.timeoutHandle);\n\n if (msg.kind === 'response') {\n pending.resolve((msg as ExcelRpcResponse).result);\n } else {\n pending.reject(deserializeExcelError((msg as ExcelRpcError).error));\n }\n }\n\n private rejectAll(error: unknown): void {\n for (const [id, pending] of this.pending) {\n if (pending.timeoutHandle) clearTimeout(pending.timeoutHandle);\n pending.reject(error);\n this.pending.delete(id);\n }\n }\n}\n\nexport async function createNodeExcelWorkerPort(bundleUrl: string | URL): Promise<ExcelWorkerPortLike> {\n const { Worker } = await import('node:worker_threads');\n const worker = new Worker(bundleUrl);\n return {\n postMessage(data, transferList) {\n worker.postMessage(data, transferList as readonly import('node:worker_threads').TransferListItem[] | undefined);\n },\n onMessage(listener) {\n worker.on('message', listener);\n },\n onError(listener) {\n worker.on('error', listener);\n worker.on('exit', (code) => {\n if (code !== 0) listener(new Error(`excel worker exited with code ${code}`));\n });\n },\n async terminate() {\n await worker.terminate();\n },\n };\n}\n","import { ExcelWorkbookCore, type ExcelLoadOptions } from './excel-workbook.js';\nimport {\n aggregateExcelTable,\n type ExcelAggregateTableOptions,\n type ExcelAggregateTableResult,\n} from './analysis.js';\nimport type {\n ExcelAlignmentModel,\n ExcelBorderModel,\n ExcelCellKind,\n ExcelCellModel,\n ExcelCellValue,\n ExcelChartAddOptions,\n ExcelChartModel,\n ExcelColumnModel,\n ExcelCommentModel,\n ExcelConditionalFormatModel,\n ExcelConditionalFormatRuleModel,\n ExcelDataValidationModel,\n ExcelDrawingAnchorModel,\n ExcelDrawingMarkerModel,\n ExcelDrawingObjectModel,\n ExcelDrawingModel,\n ExcelFillModel,\n ExcelFontModel,\n ExcelHyperlinkModel,\n ExcelImageModel,\n ExcelMergedRangeModel,\n ExcelRowModel,\n ExcelSheetModel,\n ExcelSheetViewModel,\n ExcelShapeModel,\n ExcelStylesModel,\n ExcelTableModel,\n ExcelTableAutoFilterModel,\n ExcelTableSortStateModel,\n ExcelThreadedCommentModel,\n ExcelWorkbookModel,\n ExcelDefinedNameModel,\n} from './model.js';\nimport { executeExcelScript } from './runtime-script.js';\nimport { ExcelWorkbookHistory } from './history.js';\nimport {\n createNodeExcelWorkerPort,\n ExcelWorkerTransport,\n type ExcelWorkerPortLike,\n} from './runtime-transport.js';\nimport type { ExcelWorkbookMutation } from './mutations.js';\n\nexport type ExcelRuntimeMode = 'auto' | 'worker' | 'inline';\n\nexport type ExcelModeSource =\n | 'explicit-inline'\n | 'explicit-worker'\n | 'auto/node-with-worker-config'\n | 'auto/node-no-worker-config'\n | 'auto/browser-factory'\n | 'auto/fallback';\n\nexport interface ExcelModeDecision {\n mode: 'worker' | 'inline';\n source: ExcelModeSource;\n}\n\nexport type ExcelWorkerFactory = () => ExcelWorkerPortLike | Promise<ExcelWorkerPortLike>;\n\nexport interface ExcelWorkbookLoadOptions extends ExcelLoadOptions {\n mode?: ExcelRuntimeMode;\n onModeResolved?: (decision: ExcelModeDecision, workbookId: string) => void;\n}\n\ninterface Defaults {\n mode: ExcelRuntimeMode;\n workerFactory?: ExcelWorkerFactory;\n workerBundleUrl?: string | URL;\n}\n\nconst defaults: Defaults = {\n mode: 'auto',\n};\n\nexport class ExcelWorkbook {\n readonly workbookId: string;\n readonly mode: 'worker' | 'inline';\n readonly modeSource: ExcelModeSource;\n readonly worksheets: ExcelWorksheetCollection;\n readonly names: ExcelNamedItemCollection;\n private readonly inlineWorkbook?: ExcelWorkbookCore;\n private readonly workerTransport?: ExcelWorkerTransport;\n private readonly workbookHistory: ExcelWorkbookHistory;\n private disposed = false;\n\n private constructor(init: {\n workbookId: string;\n mode: 'worker' | 'inline';\n modeSource: ExcelModeSource;\n inlineWorkbook?: ExcelWorkbookCore;\n workerTransport?: ExcelWorkerTransport;\n }) {\n this.workbookId = init.workbookId;\n this.mode = init.mode;\n this.modeSource = init.modeSource;\n this.inlineWorkbook = init.inlineWorkbook;\n this.workerTransport = init.workerTransport;\n this.worksheets = new ExcelWorksheetCollection(this);\n this.names = new ExcelNamedItemCollection(this);\n this.workbookHistory = new ExcelWorkbookHistory(this);\n }\n\n static async fromZip(\n bytes: Uint8Array | ArrayBuffer,\n opts: ExcelWorkbookLoadOptions = {},\n ): Promise<ExcelWorkbook> {\n const decision = this.detectModeDecision(opts.mode);\n if (decision.mode === 'inline') {\n const workbook = await ExcelWorkbookCore.fromZip(bytes, opts);\n opts.onModeResolved?.(decision, workbook.workbookId);\n return new ExcelWorkbook({\n workbookId: workbook.workbookId,\n mode: 'inline',\n modeSource: decision.source,\n inlineWorkbook: workbook,\n });\n }\n\n const transport = await this.createWorkerTransport();\n const loaded = await transport.call<{ workbookId: string }>(\n 'load.zip',\n [bytes, toCoreLoadOptions(opts)],\n 30_000,\n );\n opts.onModeResolved?.(decision, loaded.workbookId);\n return new ExcelWorkbook({\n workbookId: loaded.workbookId,\n mode: 'worker',\n modeSource: decision.source,\n workerTransport: transport,\n });\n }\n\n static async fromModel(\n model: ExcelWorkbookModel,\n opts: ExcelWorkbookLoadOptions = {},\n ): Promise<ExcelWorkbook> {\n const decision = this.detectModeDecision(opts.mode);\n if (decision.mode === 'inline') {\n const workbook = ExcelWorkbookCore.fromModel(model, opts);\n opts.onModeResolved?.(decision, workbook.workbookId);\n return new ExcelWorkbook({\n workbookId: workbook.workbookId,\n mode: 'inline',\n modeSource: decision.source,\n inlineWorkbook: workbook,\n });\n }\n\n const transport = await this.createWorkerTransport();\n const loaded = await transport.call<{ workbookId: string }>(\n 'load.model',\n [model, toCoreLoadOptions(opts)],\n 30_000,\n );\n opts.onModeResolved?.(decision, loaded.workbookId);\n return new ExcelWorkbook({\n workbookId: loaded.workbookId,\n mode: 'worker',\n modeSource: decision.source,\n workerTransport: transport,\n });\n }\n\n static fromPackage(\n pkg: Parameters<typeof ExcelWorkbookCore.fromPackage>[0],\n opts: ExcelWorkbookLoadOptions = {},\n ): ExcelWorkbook {\n if (opts.mode === 'worker') {\n throw new Error('ExcelWorkbook.fromPackage currently supports inline mode only; use fromZip for worker mode');\n }\n const workbook = ExcelWorkbookCore.fromPackage(pkg, opts);\n const decision: ExcelModeDecision = { mode: 'inline', source: opts.mode === 'inline' ? 'explicit-inline' : 'auto/node-no-worker-config' };\n opts.onModeResolved?.(decision, workbook.workbookId);\n return new ExcelWorkbook({\n workbookId: workbook.workbookId,\n mode: 'inline',\n modeSource: decision.source,\n inlineWorkbook: workbook,\n });\n }\n\n static setDefaultMode(mode: ExcelRuntimeMode): void {\n defaults.mode = mode;\n }\n\n static setWorkerFactory(factory: ExcelWorkerFactory | undefined): void {\n defaults.workerFactory = factory;\n }\n\n static setWorkerBundleUrl(url: string | URL | undefined): void {\n defaults.workerBundleUrl = url;\n }\n\n static detectMode(): 'worker' | 'inline' {\n return this.detectModeDecision().mode;\n }\n\n static detectModeDecision(mode: ExcelRuntimeMode = defaults.mode): ExcelModeDecision {\n if (mode === 'inline') return { mode: 'inline', source: 'explicit-inline' };\n if (mode === 'worker') {\n if (!this.hasWorkerConfig()) {\n throw new Error('ExcelWorkbook: worker mode requires workerFactory or workerBundleUrl');\n }\n return { mode: 'worker', source: 'explicit-worker' };\n }\n if (defaults.workerFactory) return { mode: 'worker', source: 'auto/browser-factory' };\n if (defaults.workerBundleUrl) return { mode: 'worker', source: 'auto/node-with-worker-config' };\n return { mode: 'inline', source: 'auto/node-no-worker-config' };\n }\n\n static _resetDefaults(): void {\n defaults.mode = 'auto';\n defaults.workerFactory = undefined;\n defaults.workerBundleUrl = undefined;\n }\n\n async executeCode<T = unknown>(\n code: string,\n args?: Record<string, unknown>,\n timeoutMs = 30_000,\n signal?: AbortSignal,\n ): Promise<T> {\n this.assertNotDisposed();\n if (this.inlineWorkbook) {\n return (await executeExcelScript(this.inlineWorkbook, code, args, timeoutMs, signal)) as T;\n }\n if (signal?.aborted) {\n await this.dispose();\n throw new Error('excel worker script aborted before dispatch');\n }\n\n let abortHandler: (() => void) | undefined;\n const abortPromise =\n signal &&\n new Promise<never>((_, reject) => {\n abortHandler = (): void => {\n signal.removeEventListener('abort', abortHandler!);\n reject(new Error('excel worker script aborted'));\n };\n signal.addEventListener('abort', abortHandler, { once: true });\n });\n\n try {\n const call = this.workerTransport!.call<T>('script.execute', [code, args, 0], timeoutMs);\n return abortPromise ? await Promise.race([call, abortPromise]) : await call;\n } catch (error) {\n if (isWorkerTerminalScriptError(error)) {\n await this.dispose();\n }\n throw error;\n } finally {\n if (signal && abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n }\n\n async toModel(): Promise<ExcelWorkbookModel> {\n this.assertNotDisposed();\n if (this.inlineWorkbook) return this.inlineWorkbook.toModel();\n return this.workerTransport!.call<ExcelWorkbookModel>('to.model', [], 30_000);\n }\n\n async getMutations(): Promise<ExcelWorkbookMutation[]> {\n this.assertNotDisposed();\n if (this.inlineWorkbook) return this.inlineWorkbook.getMutations();\n return this.workerTransport!.call<ExcelWorkbookMutation[]>('mutations.list', [], 30_000);\n }\n\n async clearMutations(): Promise<void> {\n this.assertNotDisposed();\n if (this.inlineWorkbook) {\n this.inlineWorkbook.clearMutations();\n return;\n }\n await this.workerTransport!.call<void>('mutations.clear', [], 30_000);\n }\n\n history(): ExcelWorkbookHistory {\n this.assertNotDisposed();\n return this.workbookHistory;\n }\n\n async aggregateTable(options: ExcelAggregateTableOptions): Promise<ExcelAggregateTableResult> {\n this.assertNotDisposed();\n return aggregateExcelTable(await this.toModel(), options);\n }\n\n async toZip(): Promise<Uint8Array> {\n this.assertNotDisposed();\n if (this.inlineWorkbook) return this.inlineWorkbook.toZip();\n return this.workerTransport!.call<Uint8Array>('to.zip', [], 60_000);\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n if (this.workerTransport) {\n await this.workerTransport.dispose();\n }\n }\n\n private static hasWorkerConfig(): boolean {\n return Boolean(defaults.workerFactory || defaults.workerBundleUrl);\n }\n\n private static async createWorkerTransport(): Promise<ExcelWorkerTransport> {\n const port = defaults.workerFactory\n ? await defaults.workerFactory()\n : await createNodeExcelWorkerPort(defaults.workerBundleUrl!);\n return new ExcelWorkerTransport(port);\n }\n\n private assertNotDisposed(): void {\n if (this.disposed) throw new Error('ExcelWorkbook has been disposed');\n }\n}\n\nexport { ExcelWorkbook as ExcelRuntimeWorkbook };\nexport type ExcelRuntimeLoadOptions = ExcelWorkbookLoadOptions;\n\nfunction toCoreLoadOptions(opts: ExcelWorkbookLoadOptions): ExcelLoadOptions {\n return {\n workbookId: opts.workbookId,\n };\n}\n\nexport class ExcelWorksheetCollection {\n constructor(private readonly workbook: ExcelWorkbook) {}\n\n async items(): Promise<ExcelWorksheet[]> {\n const sheets = await this.workbook.executeCode<Array<{ id: string; name: string }>>(`\n return workbook.worksheets.items().map((sheet) => ({ id: sheet.id(), name: sheet.name() }));\n `);\n return sheets.map((sheet) => new ExcelWorksheet(this.workbook, sheet.name, sheet.id));\n }\n\n getItem(nameOrId: string): ExcelWorksheet {\n return new ExcelWorksheet(this.workbook, nameOrId);\n }\n\n async getItemOrNullObject(nameOrId: string): Promise<ExcelWorksheet | null> {\n const exists = await this.workbook.executeCode<boolean>(\n `\n return workbook.worksheets.getItemOrNullObject(args.nameOrId) !== null;\n `,\n { nameOrId },\n );\n return exists ? new ExcelWorksheet(this.workbook, nameOrId) : null;\n }\n\n async add(name: string): Promise<ExcelWorksheet> {\n const sheet = await this.workbook.executeCode<{ id: string; name: string }>(\n `\n const sheet = workbook.worksheets.add(args.name);\n return { id: sheet.id(), name: sheet.name() };\n `,\n { name },\n );\n return new ExcelWorksheet(this.workbook, sheet.name, sheet.id);\n }\n\n async deleteItem(nameOrId: string): Promise<void> {\n await this.workbook.executeCode<void>(`workbook.worksheets.deleteItem(args.nameOrId);`, { nameOrId });\n }\n\n async move(nameOrId: string, toIndex: number): Promise<void> {\n await this.workbook.executeCode<void>(`workbook.worksheets.move(args.nameOrId, args.toIndex);`, {\n nameOrId,\n toIndex,\n });\n }\n\n async copy(nameOrId: string, newName?: string): Promise<ExcelWorksheet> {\n const sheet = await this.workbook.executeCode<{ id: string; name: string }>(\n `\n const sheet = workbook.worksheets.copy(args.nameOrId, args.newName);\n return { id: sheet.id(), name: sheet.name() };\n `,\n { nameOrId, newName },\n );\n return new ExcelWorksheet(this.workbook, sheet.name, sheet.id);\n }\n}\n\nexport class ExcelWorksheet {\n readonly tables: ExcelTableCollection;\n readonly hyperlinks: ExcelHyperlinkCollection;\n readonly comments: ExcelCommentCollection;\n readonly threadedComments: ExcelThreadedCommentCollection;\n readonly dataValidations: ExcelDataValidationCollection;\n readonly conditionalFormats: ExcelConditionalFormatCollection;\n readonly drawings: ExcelDrawingCollection;\n readonly charts: ExcelChartCollection;\n readonly images: ExcelImageCollection;\n readonly shapes: ExcelShapeCollection;\n\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly nameOrId: string,\n private readonly knownId?: string,\n ) {\n this.tables = new ExcelTableCollection(workbook, nameOrId);\n this.hyperlinks = new ExcelHyperlinkCollection(workbook, nameOrId);\n this.comments = new ExcelCommentCollection(workbook, nameOrId);\n this.threadedComments = new ExcelThreadedCommentCollection(workbook, nameOrId);\n this.dataValidations = new ExcelDataValidationCollection(workbook, nameOrId);\n this.conditionalFormats = new ExcelConditionalFormatCollection(workbook, nameOrId);\n this.drawings = new ExcelDrawingCollection(workbook, nameOrId);\n this.charts = new ExcelChartCollection(workbook, nameOrId);\n this.images = new ExcelImageCollection(workbook, nameOrId);\n this.shapes = new ExcelShapeCollection(workbook, nameOrId);\n }\n\n async id(): Promise<string> {\n if (this.knownId) return this.knownId;\n return this.run<string>(`return sheet.id();`);\n }\n\n async name(): Promise<string> {\n return this.run<string>(`return sheet.name();`);\n }\n\n async rename(name: string): Promise<void> {\n await this.run<void>(`sheet.rename(args.name);`, { name });\n }\n\n async visibility(): Promise<string | undefined> {\n return this.run<string | undefined>(`return sheet.visibility();`);\n }\n\n async setVisibility(visibility: string | undefined): Promise<void> {\n await this.run<void>(`sheet.setVisibility(args.visibility);`, { visibility });\n }\n\n async path(): Promise<string | undefined> {\n return this.run<string | undefined>(`return sheet.path();`);\n }\n\n async dimension(): Promise<string | undefined> {\n return this.run<string | undefined>(`return sheet.dimension();`);\n }\n\n getRange(address: string): ExcelRange {\n return new ExcelRange(this.workbook, this.nameOrId, address);\n }\n\n getCell(address: string): ExcelCell {\n return new ExcelCell(this.workbook, this.nameOrId, address);\n }\n\n async getUsedRange(): Promise<ExcelRange | null> {\n const address = await this.run<string | null>(`\n const range = sheet.getUsedRange();\n return range ? range.address() : null;\n `);\n return address ? this.getRange(address) : null;\n }\n\n async cells(): Promise<ExcelCellModel[]> {\n return this.run<ExcelCellModel[]>(`return sheet.cells();`);\n }\n\n async sheetViews(): Promise<ExcelSheetViewModel[]> {\n return this.run<ExcelSheetViewModel[]>(`return sheet.sheetViews();`);\n }\n\n async setSheetViews(sheetViews: ExcelSheetViewModel[]): Promise<void> {\n await this.run<void>(`sheet.setSheetViews(args.sheetViews);`, { sheetViews });\n }\n\n async columns(): Promise<ExcelColumnModel[]> {\n return this.run<ExcelColumnModel[]>(`return sheet.columns();`);\n }\n\n async rows(): Promise<ExcelRowModel[]> {\n return this.run<ExcelRowModel[]>(`return sheet.rows();`);\n }\n\n async mergedRanges(): Promise<ExcelMergedRangeModel[]> {\n return this.run<ExcelMergedRangeModel[]>(`return sheet.mergedRanges();`);\n }\n\n async insertRows(rowIndex: number, count = 1): Promise<void> {\n await this.run<void>(`sheet.insertRows(args.rowIndex, args.count);`, { rowIndex, count });\n }\n\n async deleteRows(rowIndex: number, count = 1): Promise<void> {\n await this.run<void>(`sheet.deleteRows(args.rowIndex, args.count);`, { rowIndex, count });\n }\n\n async insertColumns(columnIndex: number, count = 1): Promise<void> {\n await this.run<void>(`sheet.insertColumns(args.columnIndex, args.count);`, { columnIndex, count });\n }\n\n async deleteColumns(columnIndex: number, count = 1): Promise<void> {\n await this.run<void>(`sheet.deleteColumns(args.columnIndex, args.count);`, { columnIndex, count });\n }\n\n async toModel(): Promise<ExcelSheetModel> {\n return this.run<ExcelSheetModel>(`return sheet.toModel();`);\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.nameOrId);\n ${code}\n `,\n { ...(args ?? {}), nameOrId: this.nameOrId },\n );\n }\n}\n\nexport class ExcelRange {\n readonly format: ExcelRangeFormat;\n\n constructor(\n protected readonly workbook: ExcelWorkbook,\n protected readonly sheetNameOrId: string,\n protected readonly rangeAddress: string,\n ) {\n this.format = new ExcelRangeFormat(this);\n }\n\n async address(): Promise<string> {\n return this.run<string>(`return range.address();`);\n }\n\n async rowIndex(): Promise<number> {\n return this.run<number>(`return range.rowIndex();`);\n }\n\n async columnIndex(): Promise<number> {\n return this.run<number>(`return range.columnIndex();`);\n }\n\n async rowCount(): Promise<number> {\n return this.run<number>(`return range.rowCount();`);\n }\n\n async columnCount(): Promise<number> {\n return this.run<number>(`return range.columnCount();`);\n }\n\n async values(): Promise<ExcelCellValue[][]> {\n return this.run<ExcelCellValue[][]>(`return range.values();`);\n }\n\n async formulas(): Promise<(string | null)[][]> {\n return this.run<(string | null)[][]>(`return range.formulas();`);\n }\n\n async text(): Promise<string[][]> {\n return this.run<string[][]>(`return range.text();`);\n }\n\n async valueTypes(): Promise<ExcelCellKind[][]> {\n return this.run<ExcelCellKind[][]>(`return range.valueTypes();`);\n }\n\n async rawValues(): Promise<(string | null)[][]> {\n return this.run<(string | null)[][]>(`return range.rawValues();`);\n }\n\n async styleIds(): Promise<(number | undefined)[][]> {\n return this.run<(number | undefined)[][]>(`return range.styleIds();`);\n }\n\n async setStyleId(styleId: number | undefined): Promise<void> {\n await this.run<void>(`range.setStyleId(args.styleId);`, { styleId });\n }\n\n async rowHeights(): Promise<Array<number | undefined>> {\n return this.run<Array<number | undefined>>(`return range.rowHeights();`);\n }\n\n async setRowHeight(height: number | undefined): Promise<void> {\n await this.run<void>(`range.setRowHeight(args.height);`, { height });\n }\n\n async columnWidths(): Promise<Array<number | undefined>> {\n return this.run<Array<number | undefined>>(`return range.columnWidths();`);\n }\n\n async setColumnWidth(width: number | undefined): Promise<void> {\n await this.run<void>(`range.setColumnWidth(args.width);`, { width });\n }\n\n async merge(): Promise<void> {\n await this.run<void>(`range.merge();`);\n }\n\n async unmerge(): Promise<void> {\n await this.run<void>(`range.unmerge();`);\n }\n\n async setValues(values: ExcelCellValue[][]): Promise<void> {\n await this.run<void>(`range.setValues(args.values);`, { values });\n }\n\n async setFormulas(formulas: (string | null)[][]): Promise<void> {\n await this.run<void>(`range.setFormulas(args.formulas);`, { formulas });\n }\n\n async clear(): Promise<void> {\n await this.run<void>(`range.clear();`);\n }\n\n getCell(rowOffset: number, columnOffset: number): ExcelCell {\n return new ExcelCell(this.workbook, this.sheetNameOrId, this.rangeAddress, rowOffset, columnOffset);\n }\n\n getRow(rowOffset: number): ExcelRange {\n return new ExcelDerivedRange(this.workbook, this.sheetNameOrId, this.rangeAddress, `range.getRow(args.rowOffset)`, {\n rowOffset,\n });\n }\n\n getColumn(columnOffset: number): ExcelRange {\n return new ExcelDerivedRange(\n this.workbook,\n this.sheetNameOrId,\n this.rangeAddress,\n `range.getColumn(args.columnOffset)`,\n { columnOffset },\n );\n }\n\n resize(rowCount: number, columnCount: number): ExcelRange {\n return new ExcelDerivedRange(\n this.workbook,\n this.sheetNameOrId,\n this.rangeAddress,\n `range.resize(args.rowCount, args.columnCount)`,\n { rowCount, columnCount },\n );\n }\n\n offset(rowOffset: number, columnOffset: number, rowCount?: number, columnCount?: number): ExcelRange {\n return new ExcelDerivedRange(\n this.workbook,\n this.sheetNameOrId,\n this.rangeAddress,\n `range.offset(args.rowOffset, args.columnOffset, args.rowCount, args.columnCount)`,\n { rowOffset, columnOffset, rowCount, columnCount },\n );\n }\n\n slice(rowOffset: number, columnOffset: number, rowCount: number, columnCount: number): ExcelRange {\n return new ExcelDerivedRange(\n this.workbook,\n this.sheetNameOrId,\n this.rangeAddress,\n `range.slice(args.rowOffset, args.columnOffset, args.rowCount, args.columnCount)`,\n { rowOffset, columnOffset, rowCount, columnCount },\n );\n }\n\n async toModel(): Promise<ExcelCellModel[]> {\n return this.run<ExcelCellModel[]>(`return range.toModel();`);\n }\n\n runFormat<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.run<T>(code, args);\n }\n\n protected run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const range = sheet.getRange(args.rangeAddress);\n ${code}\n `,\n { ...(args ?? {}), sheetNameOrId: this.sheetNameOrId, rangeAddress: this.rangeAddress },\n );\n }\n}\n\nclass ExcelDerivedRange extends ExcelRange {\n constructor(\n workbook: ExcelWorkbook,\n sheetNameOrId: string,\n rangeAddress: string,\n private readonly expression: string,\n private readonly expressionArgs: Record<string, unknown>,\n ) {\n super(workbook, sheetNameOrId, rangeAddress);\n }\n\n protected override run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n let range = sheet.getRange(args.rangeAddress);\n range = ${this.expression};\n ${code}\n `,\n { ...(args ?? {}), ...this.expressionArgs, sheetNameOrId: this.sheetNameOrId, rangeAddress: this.rangeAddress },\n );\n }\n}\n\nexport class ExcelCell {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly cellAddressOrRangeAddress: string,\n private readonly rowOffset?: number,\n private readonly columnOffset?: number,\n ) {}\n\n async address(): Promise<string> {\n return this.run<string>(`return cell.address();`);\n }\n\n async value(): Promise<ExcelCellValue> {\n return this.run<ExcelCellValue>(`return cell.value();`);\n }\n\n async formula(): Promise<string | null> {\n return this.run<string | null>(`return cell.formula();`);\n }\n\n async text(): Promise<string> {\n return this.run<string>(`return cell.text();`);\n }\n\n async valueType(): Promise<ExcelCellKind> {\n return this.run<ExcelCellKind>(`return cell.valueType();`);\n }\n\n async rawValue(): Promise<string | null> {\n return this.run<string | null>(`return cell.rawValue();`);\n }\n\n async styleId(): Promise<number | undefined> {\n return this.run<number | undefined>(`return cell.styleId();`);\n }\n\n async setStyleId(styleId: number | undefined): Promise<void> {\n await this.run<void>(`cell.setStyleId(args.styleId);`, { styleId });\n }\n\n async setValue(value: ExcelCellValue): Promise<void> {\n await this.run<void>(`cell.setValue(args.value);`, { value });\n }\n\n async setFormula(formula: string | null): Promise<void> {\n await this.run<void>(`cell.setFormula(args.formula);`, { formula });\n }\n\n async clear(): Promise<void> {\n await this.run<void>(`cell.clear();`);\n }\n\n toRange(): ExcelRange {\n return new ExcelRange(this.workbook, this.sheetNameOrId, this.cellAddressOrRangeAddress);\n }\n\n async toModel(): Promise<ExcelCellModel | null> {\n return this.run<ExcelCellModel | null>(`return cell.toModel();`);\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n const isOffsetCell = this.rowOffset !== undefined && this.columnOffset !== undefined;\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const cell = args.isOffsetCell\n ? sheet.getRange(args.address).getCell(args.rowOffset, args.columnOffset)\n : sheet.getCell(args.address);\n ${code}\n `,\n {\n ...(args ?? {}),\n sheetNameOrId: this.sheetNameOrId,\n address: this.cellAddressOrRangeAddress,\n isOffsetCell,\n rowOffset: this.rowOffset,\n columnOffset: this.columnOffset,\n },\n );\n }\n}\n\nexport class ExcelRangeFormat {\n readonly font: ExcelRangeFontFormat;\n readonly fill: ExcelRangeFillFormat;\n readonly border: ExcelRangeBorderFormat;\n readonly alignment: ExcelRangeAlignmentFormat;\n\n constructor(private readonly range: ExcelRange) {\n this.font = new ExcelRangeFontFormat(range);\n this.fill = new ExcelRangeFillFormat(range);\n this.border = new ExcelRangeBorderFormat(range);\n this.alignment = new ExcelRangeAlignmentFormat(range);\n }\n\n numberFormatCode(): Promise<string | undefined> {\n return this.range.runFormat<string | undefined>(`return range.format.numberFormatCode();`);\n }\n\n setNumberFormatCode(code: string | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.setNumberFormatCode(args.code);`, { code });\n }\n}\n\nexport class ExcelRangeFontFormat {\n constructor(private readonly range: ExcelRange) {}\n\n value(): Promise<ExcelFontModel> {\n return this.range.runFormat<ExcelFontModel>(`return range.format.font.value();`);\n }\n\n setValue(font: ExcelFontModel): Promise<void> {\n return this.range.runFormat<void>(`range.format.font.setValue(args.font);`, { font });\n }\n\n bold(): Promise<boolean | undefined> {\n return this.range.runFormat<boolean | undefined>(`return range.format.font.bold();`);\n }\n\n setBold(value: boolean | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.font.setBold(args.value);`, { value });\n }\n\n italic(): Promise<boolean | undefined> {\n return this.range.runFormat<boolean | undefined>(`return range.format.font.italic();`);\n }\n\n setItalic(value: boolean | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.font.setItalic(args.value);`, { value });\n }\n\n underline(): Promise<boolean | undefined> {\n return this.range.runFormat<boolean | undefined>(`return range.format.font.underline();`);\n }\n\n setUnderline(value: boolean | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.font.setUnderline(args.value);`, { value });\n }\n\n color(): Promise<ExcelFontModel['color']> {\n return this.range.runFormat<ExcelFontModel['color']>(`return range.format.font.color();`);\n }\n\n setColor(color: ExcelFontModel['color']): Promise<void> {\n return this.range.runFormat<void>(`range.format.font.setColor(args.color);`, { color });\n }\n\n size(): Promise<number | undefined> {\n return this.range.runFormat<number | undefined>(`return range.format.font.size();`);\n }\n\n setSize(size: number | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.font.setSize(args.size);`, { size });\n }\n\n name(): Promise<string | undefined> {\n return this.range.runFormat<string | undefined>(`return range.format.font.name();`);\n }\n\n setName(name: string | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.font.setName(args.name);`, { name });\n }\n}\n\nexport class ExcelRangeFillFormat {\n constructor(private readonly range: ExcelRange) {}\n\n value(): Promise<ExcelFillModel> {\n return this.range.runFormat<ExcelFillModel>(`return range.format.fill.value();`);\n }\n\n setValue(fill: ExcelFillModel): Promise<void> {\n return this.range.runFormat<void>(`range.format.fill.setValue(args.fill);`, { fill });\n }\n\n patternType(): Promise<string | undefined> {\n return this.range.runFormat<string | undefined>(`return range.format.fill.patternType();`);\n }\n\n setPatternType(patternType: string | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.fill.setPatternType(args.patternType);`, { patternType });\n }\n\n foregroundColor(): Promise<ExcelFillModel['foregroundColor']> {\n return this.range.runFormat<ExcelFillModel['foregroundColor']>(`return range.format.fill.foregroundColor();`);\n }\n\n setForegroundColor(color: ExcelFillModel['foregroundColor']): Promise<void> {\n return this.range.runFormat<void>(`range.format.fill.setForegroundColor(args.color);`, { color });\n }\n\n backgroundColor(): Promise<ExcelFillModel['backgroundColor']> {\n return this.range.runFormat<ExcelFillModel['backgroundColor']>(`return range.format.fill.backgroundColor();`);\n }\n\n setBackgroundColor(color: ExcelFillModel['backgroundColor']): Promise<void> {\n return this.range.runFormat<void>(`range.format.fill.setBackgroundColor(args.color);`, { color });\n }\n}\n\nexport class ExcelRangeBorderFormat {\n constructor(private readonly range: ExcelRange) {}\n\n value(): Promise<ExcelBorderModel> {\n return this.range.runFormat<ExcelBorderModel>(`return range.format.border.value();`);\n }\n\n setValue(border: ExcelBorderModel): Promise<void> {\n return this.range.runFormat<void>(`range.format.border.setValue(args.border);`, { border });\n }\n\n setLeft(side: ExcelBorderModel['left']): Promise<void> {\n return this.range.runFormat<void>(`range.format.border.setLeft(args.side);`, { side });\n }\n\n setRight(side: ExcelBorderModel['right']): Promise<void> {\n return this.range.runFormat<void>(`range.format.border.setRight(args.side);`, { side });\n }\n\n setTop(side: ExcelBorderModel['top']): Promise<void> {\n return this.range.runFormat<void>(`range.format.border.setTop(args.side);`, { side });\n }\n\n setBottom(side: ExcelBorderModel['bottom']): Promise<void> {\n return this.range.runFormat<void>(`range.format.border.setBottom(args.side);`, { side });\n }\n}\n\nexport class ExcelRangeAlignmentFormat {\n constructor(private readonly range: ExcelRange) {}\n\n value(): Promise<ExcelAlignmentModel | undefined> {\n return this.range.runFormat<ExcelAlignmentModel | undefined>(`return range.format.alignment.value();`);\n }\n\n setValue(alignment: ExcelAlignmentModel | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.alignment.setValue(args.alignment);`, { alignment });\n }\n\n setHorizontal(horizontal: string | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.alignment.setHorizontal(args.horizontal);`, { horizontal });\n }\n\n setVertical(vertical: string | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.alignment.setVertical(args.vertical);`, { vertical });\n }\n\n setWrapText(wrapText: boolean | undefined): Promise<void> {\n return this.range.runFormat<void>(`range.format.alignment.setWrapText(args.wrapText);`, { wrapText });\n }\n}\n\nexport class ExcelTableCollection {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n ) {}\n\n async items(): Promise<ExcelTable[]> {\n const tables = await runSheetCollection<ExcelTableModel[]>(this.workbook, this.sheetNameOrId, 'tables', 'toModel');\n return tables.map((table) => new ExcelTable(this.workbook, this.sheetNameOrId, table.name ?? table.displayName ?? ''));\n }\n\n getItem(nameOrDisplayName: string): ExcelTable {\n return new ExcelTable(this.workbook, this.sheetNameOrId, nameOrDisplayName);\n }\n\n async getItemOrNullObject(nameOrDisplayName: string): Promise<ExcelTable | null> {\n return (await sheetCollectionItemExists(this.workbook, this.sheetNameOrId, 'tables', nameOrDisplayName))\n ? this.getItem(nameOrDisplayName)\n : null;\n }\n\n async add(model: ExcelTableModel): Promise<ExcelTable> {\n const added = await runSheetCollection<ExcelTableModel>(this.workbook, this.sheetNameOrId, 'tables', 'add', { model });\n return new ExcelTable(this.workbook, this.sheetNameOrId, added.name ?? added.displayName ?? '');\n }\n\n async delete(nameOrDisplayName: string): Promise<void> {\n await runSheetCollection<void>(this.workbook, this.sheetNameOrId, 'tables', 'delete', { key: nameOrDisplayName });\n }\n\n async toModel(): Promise<ExcelTableModel[]> {\n return runSheetCollection<ExcelTableModel[]>(this.workbook, this.sheetNameOrId, 'tables', 'toModel');\n }\n}\n\nexport class ExcelTable {\n readonly columns: ExcelTableColumnCollection;\n readonly style: ExcelTableStyle;\n\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly nameOrDisplayName: string,\n ) {\n this.columns = new ExcelTableColumnCollection(workbook, sheetNameOrId, nameOrDisplayName);\n this.style = new ExcelTableStyle(workbook, sheetNameOrId, nameOrDisplayName);\n }\n\n async id(): Promise<number | undefined> {\n return this.run<number | undefined>(`return item.id();`);\n }\n\n async name(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.name();`);\n }\n\n async displayName(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.displayName();`);\n }\n\n async setName(name: string): Promise<void> {\n await this.run<void>(`item.setName(args.name);`, { name });\n }\n\n async setDisplayName(displayName: string): Promise<void> {\n await this.run<void>(`item.setDisplayName(args.displayName);`, { displayName });\n }\n\n async rangeAddress(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.rangeAddress();`);\n }\n\n async setRange(address: string): Promise<void> {\n await this.run<void>(`item.setRange(args.address);`, { address });\n }\n\n async resize(address: string): Promise<void> {\n await this.run<void>(`item.resize(args.address);`, { address });\n }\n\n async autoFilterRangeAddress(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.autoFilterRangeAddress();`);\n }\n\n async setAutoFilterRange(address: string | undefined): Promise<void> {\n await this.run<void>(`item.setAutoFilterRange(args.address);`, { address });\n }\n\n async headerRowCount(): Promise<number | undefined> {\n return this.run<number | undefined>(`return item.headerRowCount();`);\n }\n\n async setHeaderRowCount(count: number | undefined): Promise<void> {\n await this.run<void>(`item.setHeaderRowCount(args.count);`, { count });\n }\n\n async totalsRowCount(): Promise<number | undefined> {\n return this.run<number | undefined>(`return item.totalsRowCount();`);\n }\n\n async setTotalsRowCount(count: number | undefined): Promise<void> {\n await this.run<void>(`item.setTotalsRowCount(args.count);`, { count });\n }\n\n async totalsRowShown(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return item.totalsRowShown();`);\n }\n\n async setTotalsRowShown(value: boolean | undefined): Promise<void> {\n await this.run<void>(`item.setTotalsRowShown(args.value);`, { value });\n }\n\n async autoFilter(): Promise<ExcelTableAutoFilterModel | undefined> {\n return this.run<ExcelTableAutoFilterModel | undefined>(`return item.autoFilter();`);\n }\n\n async setAutoFilter(model: ExcelTableAutoFilterModel | undefined): Promise<void> {\n await this.run<void>(`item.setAutoFilter(args.model);`, { model });\n }\n\n async sortState(): Promise<ExcelTableSortStateModel | undefined> {\n return this.run<ExcelTableSortStateModel | undefined>(`return item.sortState();`);\n }\n\n async setSortState(sortState: ExcelTableSortStateModel | undefined): Promise<void> {\n await this.run<void>(`item.setSortState(args.sortState);`, { sortState });\n }\n\n async toModel(): Promise<ExcelTableModel> {\n return this.run<ExcelTableModel>(`return item.toModel();`);\n }\n\n async delete(): Promise<void> {\n await this.run<void>(`item.delete();`);\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return runSheetItem<T>(this.workbook, this.sheetNameOrId, 'tables', this.nameOrDisplayName, code, args);\n }\n}\n\nexport class ExcelTableColumnCollection {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly tableNameOrDisplayName: string,\n ) {}\n\n async items(): Promise<ExcelTableColumn[]> {\n const columns = await this.run<ExcelTableModel['columns']>(`return item.columns.toModel();`);\n return columns.map((column) => new ExcelTableColumn(this.workbook, this.sheetNameOrId, this.tableNameOrDisplayName, column.id));\n }\n\n getItem(nameOrId: string | number): ExcelTableColumn {\n return new ExcelTableColumn(this.workbook, this.sheetNameOrId, this.tableNameOrDisplayName, nameOrId);\n }\n\n async add(model: ExcelTableModel['columns'][number]): Promise<ExcelTableColumn> {\n const added = await this.run<ExcelTableModel['columns'][number]>(`return item.columns.add(args.model).toModel();`, { model });\n return this.getItem(added.id);\n }\n\n async delete(nameOrId: string | number): Promise<void> {\n await this.run<void>(`item.columns.delete(args.nameOrId);`, { nameOrId });\n }\n\n async deleteItem(nameOrId: string | number): Promise<void> {\n await this.run<void>(`item.columns.deleteItem(args.nameOrId);`, { nameOrId });\n }\n\n async toModel(): Promise<ExcelTableModel['columns']> {\n return this.run<ExcelTableModel['columns']>(`return item.columns.toModel();`);\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return runSheetItem<T>(this.workbook, this.sheetNameOrId, 'tables', this.tableNameOrDisplayName, code, args);\n }\n}\n\nexport class ExcelTableColumn {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly tableNameOrDisplayName: string,\n private readonly nameOrId: string | number,\n ) {}\n\n async id(): Promise<number> {\n return this.run<number>(`return column.id();`);\n }\n\n async name(): Promise<string> {\n return this.run<string>(`return column.name();`);\n }\n\n async setName(name: string): Promise<void> {\n await this.run<void>(`column.setName(args.name);`, { name });\n }\n\n async totalsRowLabel(): Promise<string | undefined> {\n return this.run<string | undefined>(`return column.totalsRowLabel();`);\n }\n\n async setTotalsRowLabel(label: string | undefined): Promise<void> {\n await this.run<void>(`column.setTotalsRowLabel(args.label);`, { label });\n }\n\n async totalsRowFunction(): Promise<string | undefined> {\n return this.run<string | undefined>(`return column.totalsRowFunction();`);\n }\n\n async setTotalsRowFunction(fn: string | undefined): Promise<void> {\n await this.run<void>(`column.setTotalsRowFunction(args.fn);`, { fn });\n }\n\n async toModel(): Promise<ExcelTableModel['columns'][number]> {\n return this.run<ExcelTableModel['columns'][number]>(`return column.toModel();`);\n }\n\n async delete(): Promise<void> {\n await this.run<void>(`column.delete();`);\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const table = sheet.tables.getItem(args.tableNameOrDisplayName);\n const column = table.columns.getItem(args.nameOrId);\n ${code}\n `,\n { ...(args ?? {}), sheetNameOrId: this.sheetNameOrId, tableNameOrDisplayName: this.tableNameOrDisplayName, nameOrId: this.nameOrId },\n );\n }\n}\n\nexport class ExcelTableStyle {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly tableNameOrDisplayName: string,\n ) {}\n\n async toModel(): Promise<ExcelTableModel['style']> {\n return runSheetItem<ExcelTableModel['style']>(\n this.workbook,\n this.sheetNameOrId,\n 'tables',\n this.tableNameOrDisplayName,\n `return item.style.toModel();`,\n );\n }\n\n async name(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.style.name();`);\n }\n\n async setName(name: string | undefined): Promise<void> {\n await this.run<void>(`item.style.setName(args.name);`, { name });\n }\n\n async showFirstColumn(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return item.style.showFirstColumn();`);\n }\n\n async setShowFirstColumn(value: boolean | undefined): Promise<void> {\n await this.run<void>(`item.style.setShowFirstColumn(args.value);`, { value });\n }\n\n async showLastColumn(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return item.style.showLastColumn();`);\n }\n\n async setShowLastColumn(value: boolean | undefined): Promise<void> {\n await this.run<void>(`item.style.setShowLastColumn(args.value);`, { value });\n }\n\n async showRowStripes(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return item.style.showRowStripes();`);\n }\n\n async setShowRowStripes(value: boolean | undefined): Promise<void> {\n await this.run<void>(`item.style.setShowRowStripes(args.value);`, { value });\n }\n\n async showColumnStripes(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return item.style.showColumnStripes();`);\n }\n\n async setShowColumnStripes(value: boolean | undefined): Promise<void> {\n await this.run<void>(`item.style.setShowColumnStripes(args.value);`, { value });\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return runSheetItem<T>(this.workbook, this.sheetNameOrId, 'tables', this.tableNameOrDisplayName, code, args);\n }\n}\n\nabstract class SimpleSheetCollection<TModel, TItem> {\n protected constructor(\n protected readonly workbook: ExcelWorkbook,\n protected readonly sheetNameOrId: string,\n private readonly collection: string,\n private readonly wrap: (workbook: ExcelWorkbook, sheetNameOrId: string, model: TModel) => TItem,\n ) {}\n\n async items(): Promise<TItem[]> {\n const models = await this.toModel();\n return models.map((model) => this.wrap(this.workbook, this.sheetNameOrId, model));\n }\n\n getItem(key: string): TItem {\n return this.wrap(this.workbook, this.sheetNameOrId, { ref: key, sqref: key } as TModel);\n }\n\n async getItemOrNullObject(key: string): Promise<TItem | null> {\n return (await sheetCollectionItemExists(this.workbook, this.sheetNameOrId, this.collection, key))\n ? this.getItem(key)\n : null;\n }\n\n async add(model: TModel): Promise<TItem> {\n const added = await runSheetCollection<TModel>(this.workbook, this.sheetNameOrId, this.collection, 'add', { model });\n return this.wrap(this.workbook, this.sheetNameOrId, added);\n }\n\n async delete(key: string): Promise<void> {\n await runSheetCollection<void>(this.workbook, this.sheetNameOrId, this.collection, 'delete', { key });\n }\n\n async toModel(): Promise<TModel[]> {\n return runSheetCollection<TModel[]>(this.workbook, this.sheetNameOrId, this.collection, 'toModel');\n }\n}\n\nabstract class SimpleSheetItem<TModel> {\n protected abstract readonly collection: string;\n\n constructor(\n protected readonly workbook: ExcelWorkbook,\n protected readonly sheetNameOrId: string,\n protected key: string,\n ) {}\n\n async toModel(): Promise<TModel> {\n return runSheetItem<TModel>(this.workbook, this.sheetNameOrId, this.collection, this.key, `return item.toModel();`);\n }\n\n async delete(): Promise<void> {\n await runSheetItem<void>(this.workbook, this.sheetNameOrId, this.collection, this.key, `item.delete();`);\n }\n\n protected run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return runSheetItem<T>(this.workbook, this.sheetNameOrId, this.collection, this.key, code, args);\n }\n}\n\nabstract class ReadonlySheetCollection<TModel, TItem> {\n protected constructor(\n protected readonly workbook: ExcelWorkbook,\n protected readonly sheetNameOrId: string,\n private readonly collection: string,\n private readonly wrap: (workbook: ExcelWorkbook, sheetNameOrId: string, index: number) => TItem,\n ) {}\n\n async items(): Promise<TItem[]> {\n const models = await this.toModel();\n return models.map((_, index) => this.wrap(this.workbook, this.sheetNameOrId, index));\n }\n\n async toModel(): Promise<TModel[]> {\n return runSheetCollection<TModel[]>(this.workbook, this.sheetNameOrId, this.collection, 'toModel');\n }\n}\n\nabstract class IndexedSheetItem<TModel> {\n protected abstract readonly collection: string;\n\n constructor(\n protected readonly workbook: ExcelWorkbook,\n protected readonly sheetNameOrId: string,\n protected indexOrName: number | string,\n ) {}\n\n async toModel(): Promise<TModel> {\n return this.run<TModel>(`return item.toModel();`);\n }\n\n protected run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const collection = sheet[args.collection];\n const item = typeof args.indexOrName === 'number' ? collection.items()[args.indexOrName] : collection.getItem(args.indexOrName);\n ${code}\n `,\n { ...(args ?? {}), sheetNameOrId: this.sheetNameOrId, collection: this.collection, indexOrName: this.indexOrName },\n );\n }\n}\n\nexport class ExcelHyperlinkCollection extends SimpleSheetCollection<ExcelHyperlinkModel, ExcelHyperlink> {\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string) {\n super(workbook, sheetNameOrId, 'hyperlinks', (workbook, sheetNameOrId, model) => new ExcelHyperlink(workbook, sheetNameOrId, model.ref));\n }\n}\n\nexport class ExcelHyperlink extends SimpleSheetItem<ExcelHyperlinkModel> {\n protected readonly collection = 'hyperlinks';\n\n async ref(): Promise<string> {\n return this.run<string>(`return item.ref();`);\n }\n\n async setRef(ref: string): Promise<void> {\n await this.run<void>(`item.setRef(args.ref);`, { ref });\n this.key = ref;\n }\n\n async target(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.target();`);\n }\n\n async targetMode(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.targetMode();`);\n }\n\n async display(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.display();`);\n }\n\n async setDisplay(display: string | undefined): Promise<void> {\n await this.run<void>(`item.setDisplay(args.display);`, { display });\n }\n\n async setLocation(location: string | undefined): Promise<void> {\n await this.run<void>(`item.setLocation(args.location);`, { location });\n }\n}\n\nexport class ExcelCommentCollection extends SimpleSheetCollection<ExcelCommentModel, ExcelComment> {\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string) {\n super(workbook, sheetNameOrId, 'comments', (workbook, sheetNameOrId, model) => new ExcelComment(workbook, sheetNameOrId, model.ref));\n }\n}\n\nexport class ExcelComment extends SimpleSheetItem<ExcelCommentModel> {\n protected readonly collection = 'comments';\n\n async ref(): Promise<string> {\n return this.run<string>(`return item.ref();`);\n }\n\n async setRef(ref: string): Promise<void> {\n await this.run<void>(`item.setRef(args.ref);`, { ref });\n this.key = ref;\n }\n\n async text(): Promise<string> {\n return this.run<string>(`return item.text();`);\n }\n\n async setText(text: string): Promise<void> {\n await this.run<void>(`item.setText(args.text);`, { text });\n }\n}\n\nexport class ExcelThreadedCommentCollection extends SimpleSheetCollection<ExcelThreadedCommentModel, ExcelThreadedComment> {\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string) {\n super(workbook, sheetNameOrId, 'threadedComments', (workbook, sheetNameOrId, model) => new ExcelThreadedComment(workbook, sheetNameOrId, model.ref));\n }\n}\n\nexport class ExcelThreadedComment extends SimpleSheetItem<ExcelThreadedCommentModel> {\n protected readonly collection = 'threadedComments';\n\n async ref(): Promise<string> {\n return this.run<string>(`return item.ref();`);\n }\n\n async setRef(ref: string): Promise<void> {\n await this.run<void>(`item.setRef(args.ref);`, { ref });\n this.key = ref;\n }\n\n async text(): Promise<string> {\n return this.run<string>(`return item.text();`);\n }\n\n async setText(text: string): Promise<void> {\n await this.run<void>(`item.setText(args.text);`, { text });\n }\n}\n\nexport class ExcelDataValidationCollection extends SimpleSheetCollection<ExcelDataValidationModel, ExcelDataValidation> {\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string) {\n super(workbook, sheetNameOrId, 'dataValidations', (workbook, sheetNameOrId, model) => new ExcelDataValidation(workbook, sheetNameOrId, model.sqref ?? ''));\n }\n}\n\nexport class ExcelDataValidation extends SimpleSheetItem<ExcelDataValidationModel> {\n protected readonly collection = 'dataValidations';\n\n async rangeAddress(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.rangeAddress();`);\n }\n\n async setRange(address: string): Promise<void> {\n await this.run<void>(`item.setRange(args.address);`, { address });\n this.key = address;\n }\n\n async type(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.type();`);\n }\n\n async setType(type: string | undefined): Promise<void> {\n await this.run<void>(`item.setType(args.type);`, { type });\n }\n\n async operator(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.operator();`);\n }\n\n async setOperator(operator: string | undefined): Promise<void> {\n await this.run<void>(`item.setOperator(args.operator);`, { operator });\n }\n\n async allowBlank(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return item.allowBlank();`);\n }\n\n async setAllowBlank(value: boolean | undefined): Promise<void> {\n await this.run<void>(`item.setAllowBlank(args.value);`, { value });\n }\n\n async showDropDown(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return item.showDropDown();`);\n }\n\n async setShowDropDown(value: boolean | undefined): Promise<void> {\n await this.run<void>(`item.setShowDropDown(args.value);`, { value });\n }\n\n async showInputMessage(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return item.showInputMessage();`);\n }\n\n async setShowInputMessage(value: boolean | undefined): Promise<void> {\n await this.run<void>(`item.setShowInputMessage(args.value);`, { value });\n }\n\n async showErrorMessage(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return item.showErrorMessage();`);\n }\n\n async setShowErrorMessage(value: boolean | undefined): Promise<void> {\n await this.run<void>(`item.setShowErrorMessage(args.value);`, { value });\n }\n\n async errorStyle(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.errorStyle();`);\n }\n\n async setErrorStyle(style: string | undefined): Promise<void> {\n await this.run<void>(`item.setErrorStyle(args.style);`, { style });\n }\n\n async errorTitle(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.errorTitle();`);\n }\n\n async error(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.error();`);\n }\n\n async setError(title: string | undefined, message: string | undefined): Promise<void> {\n await this.run<void>(`item.setError(args.title, args.message);`, { title, message });\n }\n\n async promptTitle(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.promptTitle();`);\n }\n\n async prompt(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.prompt();`);\n }\n\n async setPrompt(title: string | undefined, message: string | undefined): Promise<void> {\n await this.run<void>(`item.setPrompt(args.title, args.message);`, { title, message });\n }\n\n async formula1(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.formula1();`);\n }\n\n async setFormula1(formula: string | undefined): Promise<void> {\n await this.run<void>(`item.setFormula1(args.formula);`, { formula });\n }\n\n async formula2(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.formula2();`);\n }\n\n async setFormula2(formula: string | undefined): Promise<void> {\n await this.run<void>(`item.setFormula2(args.formula);`, { formula });\n }\n}\n\nexport class ExcelConditionalFormatCollection extends SimpleSheetCollection<ExcelConditionalFormatModel, ExcelConditionalFormat> {\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string) {\n super(workbook, sheetNameOrId, 'conditionalFormats', (workbook, sheetNameOrId, model) => new ExcelConditionalFormat(workbook, sheetNameOrId, model.sqref ?? ''));\n }\n}\n\nexport class ExcelConditionalFormat extends SimpleSheetItem<ExcelConditionalFormatModel> {\n protected readonly collection = 'conditionalFormats';\n readonly rules: ExcelConditionalFormatRuleCollection;\n\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string, key: string) {\n super(workbook, sheetNameOrId, key);\n this.rules = new ExcelConditionalFormatRuleCollection(workbook, sheetNameOrId, key);\n }\n\n async rangeAddress(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.rangeAddress();`);\n }\n\n async setRange(address: string): Promise<void> {\n await this.run<void>(`item.setRange(args.address);`, { address });\n this.key = address;\n this.rules.formatKey = address;\n }\n}\n\nexport class ExcelConditionalFormatRuleCollection {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n public formatKey: string,\n ) {}\n\n async items(): Promise<ExcelConditionalFormatRule[]> {\n const models = await this.toModel();\n return models.map((_, index) => new ExcelConditionalFormatRule(this.workbook, this.sheetNameOrId, this.formatKey, index));\n }\n\n getItem(index: number): ExcelConditionalFormatRule {\n return new ExcelConditionalFormatRule(this.workbook, this.sheetNameOrId, this.formatKey, index);\n }\n\n async getItemOrNullObject(index: number): Promise<ExcelConditionalFormatRule | null> {\n const exists = await this.workbook.executeCode<boolean>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const format = sheet.conditionalFormats.getItem(args.formatKey);\n return format.rules.getItemOrNullObject(args.index) !== null;\n `,\n { sheetNameOrId: this.sheetNameOrId, formatKey: this.formatKey, index },\n );\n return exists ? this.getItem(index) : null;\n }\n\n async add(model: ExcelConditionalFormatRuleModel): Promise<ExcelConditionalFormatRule> {\n const addedIndex = await this.workbook.executeCode<number>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const format = sheet.conditionalFormats.getItem(args.formatKey);\n format.rules.add(args.model);\n return format.rules.items().length - 1;\n `,\n { sheetNameOrId: this.sheetNameOrId, formatKey: this.formatKey, model },\n );\n return this.getItem(addedIndex);\n }\n\n async delete(index: number): Promise<void> {\n await this.workbook.executeCode<void>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const format = sheet.conditionalFormats.getItem(args.formatKey);\n format.rules.delete(args.index);\n `,\n { sheetNameOrId: this.sheetNameOrId, formatKey: this.formatKey, index },\n );\n }\n\n async toModel(): Promise<ExcelConditionalFormatRuleModel[]> {\n return this.workbook.executeCode<ExcelConditionalFormatRuleModel[]>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const format = sheet.conditionalFormats.getItem(args.formatKey);\n return format.rules.toModel();\n `,\n { sheetNameOrId: this.sheetNameOrId, formatKey: this.formatKey },\n );\n }\n}\n\nexport class ExcelConditionalFormatRule {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly formatKey: string,\n private readonly index: number,\n ) {}\n\n async type(): Promise<string | undefined> {\n return this.run<string | undefined>(`return rule.type();`);\n }\n\n async setType(type: string | undefined): Promise<void> {\n await this.run<void>(`rule.setType(args.type);`, { type });\n }\n\n async priority(): Promise<number | undefined> {\n return this.run<number | undefined>(`return rule.priority();`);\n }\n\n async setPriority(priority: number | undefined): Promise<void> {\n await this.run<void>(`rule.setPriority(args.priority);`, { priority });\n }\n\n async operator(): Promise<string | undefined> {\n return this.run<string | undefined>(`return rule.operator();`);\n }\n\n async setOperator(operator: string | undefined): Promise<void> {\n await this.run<void>(`rule.setOperator(args.operator);`, { operator });\n }\n\n async stopIfTrue(): Promise<boolean | undefined> {\n return this.run<boolean | undefined>(`return rule.stopIfTrue();`);\n }\n\n async setStopIfTrue(value: boolean | undefined): Promise<void> {\n await this.run<void>(`rule.setStopIfTrue(args.value);`, { value });\n }\n\n async formulas(): Promise<string[]> {\n return this.run<string[]>(`return rule.formulas();`);\n }\n\n async setFormula(index: number, formula: string): Promise<void> {\n await this.run<void>(`rule.setFormula(args.index, args.formula);`, { index, formula });\n }\n\n async addFormula(formula: string): Promise<void> {\n await this.run<void>(`rule.addFormula(args.formula);`, { formula });\n }\n\n async deleteFormula(index: number): Promise<void> {\n await this.run<void>(`rule.deleteFormula(args.index);`, { index });\n }\n\n async toModel(): Promise<ExcelConditionalFormatRuleModel> {\n return this.run<ExcelConditionalFormatRuleModel>(`return rule.toModel();`);\n }\n\n async delete(): Promise<void> {\n await this.run<void>(`rule.delete();`);\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const format = sheet.conditionalFormats.getItem(args.formatKey);\n const rule = format.rules.getItem(args.ruleIndex);\n ${code}\n `,\n { ...(args ?? {}), sheetNameOrId: this.sheetNameOrId, formatKey: this.formatKey, ruleIndex: this.index },\n );\n }\n}\n\nexport class ExcelDrawingCollection extends ReadonlySheetCollection<ExcelDrawingModel, ExcelDrawing> {\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string) {\n super(workbook, sheetNameOrId, 'drawings', (workbook, sheetNameOrId, index) => new ExcelDrawing(workbook, sheetNameOrId, index));\n }\n}\n\nexport class ExcelDrawing extends IndexedSheetItem<ExcelDrawingModel> {\n protected readonly collection = 'drawings';\n readonly anchors: ExcelDrawingAnchorCollection;\n\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string, index: number) {\n super(workbook, sheetNameOrId, index);\n this.anchors = new ExcelDrawingAnchorCollection(workbook, sheetNameOrId, index);\n }\n\n async relationshipId(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.relationshipId();`);\n }\n\n async path(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.path();`);\n }\n}\n\nexport class ExcelDrawingAnchorCollection {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly drawingIndex: number,\n ) {}\n\n async items(): Promise<ExcelDrawingAnchor[]> {\n const models = await this.toModel();\n return models.map((_, index) => new ExcelDrawingAnchor(this.workbook, this.sheetNameOrId, this.drawingIndex, index));\n }\n\n getItem(index: number): ExcelDrawingAnchor {\n return new ExcelDrawingAnchor(this.workbook, this.sheetNameOrId, this.drawingIndex, index);\n }\n\n async getItemOrNullObject(index: number): Promise<ExcelDrawingAnchor | null> {\n const exists = await this.workbook.executeCode<boolean>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const drawing = sheet.drawings.items()[args.drawingIndex];\n return Boolean(drawing?.anchors.getItemOrNullObject(args.index));\n `,\n { sheetNameOrId: this.sheetNameOrId, drawingIndex: this.drawingIndex, index },\n );\n return exists ? this.getItem(index) : null;\n }\n\n async toModel(): Promise<ExcelDrawingAnchorModel[]> {\n return this.workbook.executeCode<ExcelDrawingAnchorModel[]>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n return sheet.drawings.items()[args.drawingIndex].anchors.toModel();\n `,\n { sheetNameOrId: this.sheetNameOrId, drawingIndex: this.drawingIndex },\n );\n }\n}\n\nexport class ExcelDrawingAnchor {\n readonly from: ExcelDrawingMarker;\n readonly to: ExcelDrawingMarker;\n\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly drawingIndex: number,\n private readonly anchorIndex: number,\n ) {\n this.from = new ExcelDrawingMarker(workbook, sheetNameOrId, drawingIndex, anchorIndex, 'from');\n this.to = new ExcelDrawingMarker(workbook, sheetNameOrId, drawingIndex, anchorIndex, 'to');\n }\n\n async kind(): Promise<ExcelDrawingAnchorModel['kind']> {\n return this.run<ExcelDrawingAnchorModel['kind']>(`return anchor.kind();`);\n }\n\n async object(): Promise<ExcelDrawingObjectModel | undefined> {\n return this.run<ExcelDrawingObjectModel | undefined>(`return anchor.object();`);\n }\n\n async toModel(): Promise<ExcelDrawingAnchorModel> {\n return this.run<ExcelDrawingAnchorModel>(`return anchor.toModel();`);\n }\n\n private run<T>(code: string): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const anchor = sheet.drawings.items()[args.drawingIndex].anchors.getItem(args.anchorIndex);\n ${code}\n `,\n { sheetNameOrId: this.sheetNameOrId, drawingIndex: this.drawingIndex, anchorIndex: this.anchorIndex },\n );\n }\n}\n\nexport class ExcelDrawingMarker {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly drawingIndex: number,\n private readonly anchorIndex: number,\n private readonly markerName: 'from' | 'to',\n ) {}\n\n async row(): Promise<number | undefined> {\n return this.run<number | undefined>(`return marker.row();`);\n }\n\n async setRow(row: number | undefined): Promise<void> {\n await this.run<void>(`marker.setRow(args.row);`, { row });\n }\n\n async column(): Promise<number | undefined> {\n return this.run<number | undefined>(`return marker.column();`);\n }\n\n async setColumn(column: number | undefined): Promise<void> {\n await this.run<void>(`marker.setColumn(args.column);`, { column });\n }\n\n async rowOffset(): Promise<number | undefined> {\n return this.run<number | undefined>(`return marker.rowOffset();`);\n }\n\n async setRowOffset(offset: number | undefined): Promise<void> {\n await this.run<void>(`marker.setRowOffset(args.offset);`, { offset });\n }\n\n async columnOffset(): Promise<number | undefined> {\n return this.run<number | undefined>(`return marker.columnOffset();`);\n }\n\n async setColumnOffset(offset: number | undefined): Promise<void> {\n await this.run<void>(`marker.setColumnOffset(args.offset);`, { offset });\n }\n\n async toModel(): Promise<ExcelDrawingMarkerModel> {\n return this.run<ExcelDrawingMarkerModel>(`return marker.toModel();`);\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const anchor = sheet.drawings.items()[args.drawingIndex].anchors.getItem(args.anchorIndex);\n const marker = anchor[args.markerName];\n ${code}\n `,\n {\n ...(args ?? {}),\n sheetNameOrId: this.sheetNameOrId,\n drawingIndex: this.drawingIndex,\n anchorIndex: this.anchorIndex,\n markerName: this.markerName,\n },\n );\n }\n}\n\nexport class ExcelChartCollection extends ReadonlySheetCollection<ExcelChartModel, ExcelChart> {\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string) {\n super(workbook, sheetNameOrId, 'charts', (workbook, sheetNameOrId, index) => new ExcelChart(workbook, sheetNameOrId, index));\n }\n\n async add(options: ExcelChartAddOptions): Promise<ExcelChart> {\n const index = await this.workbook.executeCode<number>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n sheet.charts.add(args.options);\n return sheet.charts.items().length - 1;\n `,\n { sheetNameOrId: this.sheetNameOrId, options },\n );\n return new ExcelChart(this.workbook, this.sheetNameOrId, index);\n }\n}\n\nexport class ExcelChart extends IndexedSheetItem<ExcelChartModel> {\n protected readonly collection = 'charts';\n readonly formulaRefs: ExcelFormulaRefCollection;\n\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string, index: number) {\n super(workbook, sheetNameOrId, index);\n this.formulaRefs = new ExcelFormulaRefCollection(workbook, sheetNameOrId, index);\n }\n\n async relationshipId(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.relationshipId();`);\n }\n\n async drawingPath(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.drawingPath();`);\n }\n\n async path(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.path();`);\n }\n\n async title(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.title();`);\n }\n\n async setTitle(title: string | undefined): Promise<void> {\n await this.run<void>(`item.setTitle(args.title);`, { title });\n }\n}\n\nexport class ExcelFormulaRefCollection {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private readonly sheetNameOrId: string,\n private readonly chartIndex: number,\n ) {}\n\n async items(): Promise<string[]> {\n return this.run<string[]>(`return item.formulaRefs.items();`);\n }\n\n async getItem(index: number): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.formulaRefs.getItem(args.index);`, { index });\n }\n\n async setItem(index: number, formulaRef: string): Promise<void> {\n await this.run<void>(`item.formulaRefs.setItem(args.index, args.formulaRef);`, { index, formulaRef });\n }\n\n async add(formulaRef: string): Promise<void> {\n await this.run<void>(`item.formulaRefs.add(args.formulaRef);`, { formulaRef });\n }\n\n async delete(index: number): Promise<void> {\n await this.run<void>(`item.formulaRefs.delete(args.index);`, { index });\n }\n\n async toModel(): Promise<string[]> {\n return this.run<string[]>(`return item.formulaRefs.toModel();`);\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const item = sheet.charts.items()[args.chartIndex];\n ${code}\n `,\n { ...(args ?? {}), sheetNameOrId: this.sheetNameOrId, chartIndex: this.chartIndex },\n );\n }\n}\n\nexport class ExcelImageCollection extends ReadonlySheetCollection<ExcelImageModel, ExcelImage> {\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string) {\n super(workbook, sheetNameOrId, 'images', (workbook, sheetNameOrId, index) => new ExcelImage(workbook, sheetNameOrId, index));\n }\n}\n\nexport class ExcelImage extends IndexedSheetItem<ExcelImageModel> {\n protected readonly collection = 'images';\n\n async relationshipId(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.relationshipId();`);\n }\n\n async drawingPath(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.drawingPath();`);\n }\n\n async path(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.path();`);\n }\n\n async targetMode(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.targetMode();`);\n }\n\n async name(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.name();`);\n }\n}\n\nexport class ExcelShapeCollection extends ReadonlySheetCollection<ExcelShapeModel, ExcelShape> {\n constructor(workbook: ExcelWorkbook, sheetNameOrId: string) {\n super(workbook, sheetNameOrId, 'shapes', (workbook, sheetNameOrId, index) => new ExcelShape(workbook, sheetNameOrId, index));\n }\n\n getItem(name: string): ExcelShape {\n return new ExcelShape(this.workbook, this.sheetNameOrId, name);\n }\n}\n\nexport class ExcelShape extends IndexedSheetItem<ExcelShapeModel> {\n protected readonly collection = 'shapes';\n\n async drawingPath(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.drawingPath();`);\n }\n\n async name(): Promise<string | undefined> {\n return this.run<string | undefined>(`return item.name();`);\n }\n\n async setName(name: string | undefined): Promise<void> {\n await this.run<void>(`item.setName(args.name);`, { name });\n if (name !== undefined) this.indexOrName = name;\n }\n}\n\nfunction runSheetCollection<T>(\n workbook: ExcelWorkbook,\n sheetNameOrId: string,\n collection: string,\n method: string,\n args?: Record<string, unknown>,\n): Promise<T> {\n return workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const collection = sheet[args.collection];\n if (args.method === 'add') return collection.add(args.model).toModel();\n if (args.method === 'delete') return collection.delete(args.key);\n if (args.method === 'toModel') return collection.toModel();\n throw new Error('unsupported collection method: ' + args.method);\n `,\n { ...(args ?? {}), sheetNameOrId, collection, method },\n );\n}\n\nfunction runSheetItem<T>(\n workbook: ExcelWorkbook,\n sheetNameOrId: string,\n collection: string,\n key: string,\n code: string,\n args?: Record<string, unknown>,\n): Promise<T> {\n return workbook.executeCode<T>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n const item = sheet[args.collection].getItem(args.key);\n ${code}\n `,\n { ...(args ?? {}), sheetNameOrId, collection, key },\n );\n}\n\nfunction sheetCollectionItemExists(\n workbook: ExcelWorkbook,\n sheetNameOrId: string,\n collection: string,\n key: string,\n): Promise<boolean> {\n return workbook.executeCode<boolean>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetNameOrId);\n return sheet[args.collection].getItemOrNullObject(args.key) !== null;\n `,\n { sheetNameOrId, collection, key },\n );\n}\n\nexport class ExcelNamedItemCollection {\n constructor(private readonly workbook: ExcelWorkbook) {}\n\n async items(): Promise<ExcelNamedItem[]> {\n const names = await this.workbook.executeCode<Array<{ name: string }>>(`\n return workbook.names.items().map((name) => ({ name: name.name() }));\n `);\n return names.map((name) => new ExcelNamedItem(this.workbook, name.name));\n }\n\n getItem(name: string): ExcelNamedItem {\n return new ExcelNamedItem(this.workbook, name);\n }\n\n async getItemOrNullObject(name: string): Promise<ExcelNamedItem | null> {\n const exists = await this.workbook.executeCode<boolean>(\n `return workbook.names.getItemOrNullObject(args.name) !== null;`,\n { name },\n );\n return exists ? new ExcelNamedItem(this.workbook, name) : null;\n }\n\n async add(model: ExcelDefinedNameModel): Promise<ExcelNamedItem> {\n const added = await this.workbook.executeCode<ExcelDefinedNameModel>(\n `return workbook.names.add(args.model).toModel();`,\n { model },\n );\n return new ExcelNamedItem(this.workbook, added.name);\n }\n\n async deleteItem(name: string): Promise<void> {\n await this.workbook.executeCode<void>(`workbook.names.deleteItem(args.name);`, { name });\n }\n}\n\nexport class ExcelNamedItem {\n constructor(\n private readonly workbook: ExcelWorkbook,\n private nameValue: string,\n ) {}\n\n async name(): Promise<string> {\n return this.run<string>(`return item.name();`);\n }\n\n async text(): Promise<string> {\n return this.run<string>(`return item.text();`);\n }\n\n async setText(text: string): Promise<void> {\n await this.run<void>(`item.setText(args.text);`, { text });\n }\n\n async rename(name: string): Promise<void> {\n await this.run<void>(`item.rename(args.nextName);`, { nextName: name });\n this.nameValue = name;\n }\n\n async localSheetId(): Promise<number | undefined> {\n return this.run<number | undefined>(`return item.localSheetId();`);\n }\n\n async setLocalSheetId(localSheetId: number | undefined): Promise<void> {\n await this.run<void>(`item.setLocalSheetId(args.localSheetId);`, { localSheetId });\n }\n\n private run<T>(code: string, args?: Record<string, unknown>): Promise<T> {\n return this.workbook.executeCode<T>(\n `\n const item = workbook.names.getItem(args.name);\n ${code}\n `,\n { ...(args ?? {}), name: this.nameValue },\n );\n }\n}\n\nfunction isWorkerTerminalScriptError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes('excel worker call timeout') || message.includes('excel worker script aborted');\n}\n","import { formatCellAddress, parseCellAddress } from '../address.js';\nimport type {\n SpreadsheetFormulaAst,\n SpreadsheetFormulaError,\n SpreadsheetFormulaReference,\n SpreadsheetFormulaScalar,\n SpreadsheetFormulaValue,\n} from './types.js';\n\nexport interface SpreadsheetFormulaEvaluationContext {\n getCellValue(address: string, sheetName?: string): SpreadsheetFormulaScalar;\n getCellEvaluation?(address: string, sheetName?: string): SpreadsheetFormulaEvaluation;\n getNameValue?(name: string): SpreadsheetFormulaEvaluation;\n isRowHidden?(row: number, sheetName?: string): boolean;\n /** Returns today's date as an Excel serial number. Injectable for deterministic hosts/tests. */\n getToday?: () => number;\n}\n\nexport interface SpreadsheetFormulaEvaluation {\n value: SpreadsheetFormulaValue;\n error: SpreadsheetFormulaError | null;\n dependencies: SpreadsheetFormulaReference[];\n}\n\nexport function evaluateSpreadsheetFormulaAst(\n ast: SpreadsheetFormulaAst,\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n return evaluateNode(ast, context);\n}\n\nfunction evaluateNode(\n ast: SpreadsheetFormulaAst,\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n switch (ast.kind) {\n case 'number':\n case 'string':\n return ok(ast.value);\n case 'name':\n return context.getNameValue?.(ast.name) ?? error('#NAME?');\n case 'cell': {\n const evaluated = context.getCellEvaluation?.(ast.address, ast.sheetName);\n if (evaluated) {\n const reference: SpreadsheetFormulaReference = ast.sheetName\n ? { kind: 'cell', address: ast.address, sheetName: ast.sheetName }\n : { kind: 'cell', address: ast.address };\n return {\n value: evaluated.value,\n error: evaluated.error,\n dependencies: [reference],\n };\n }\n const value = context.getCellValue(ast.address, ast.sheetName);\n return ok(value, [{ kind: 'cell', address: ast.address, sheetName: ast.sheetName }]);\n }\n case 'range':\n return evaluateRange(ast.startAddress, ast.endAddress, ast.sheetName, context);\n case 'unary':\n return evaluateUnary(ast, context);\n case 'binary':\n return evaluateBinary(ast, context);\n case 'call':\n return evaluateCall(ast.name, ast.args, context);\n }\n}\n\nfunction evaluateRange(\n startAddress: string,\n endAddress: string,\n sheetName: string | undefined,\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n const start = parseCellAddress(startAddress);\n const end = parseCellAddress(endAddress);\n const startRow = Math.min(start.row, end.row);\n const endRow = Math.max(start.row, end.row);\n const startColumn = Math.min(start.column, end.column);\n const endColumn = Math.max(start.column, end.column);\n const values: SpreadsheetFormulaScalar[][] = [];\n for (let row = startRow; row <= endRow; row++) {\n const rowValues: SpreadsheetFormulaScalar[] = [];\n for (let column = startColumn; column <= endColumn; column++) {\n rowValues.push(context.getCellValue(formatCellAddress(row, column), sheetName));\n }\n values.push(rowValues);\n }\n return ok(values, [{ kind: 'range', startAddress, endAddress, sheetName }]);\n}\n\nfunction evaluateUnary(\n ast: Extract<SpreadsheetFormulaAst, { kind: 'unary' }>,\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n const argument = evaluateNode(ast.argument, context);\n if (argument.error) return argument;\n const number = toNumber(argument.value);\n if (number === null) return error('#VALUE!', argument.dependencies);\n if (ast.operator === '%') return ok(number / 100, argument.dependencies);\n return ok(ast.operator === '-' ? -number : number, argument.dependencies);\n}\n\nfunction evaluateBinary(\n ast: Extract<SpreadsheetFormulaAst, { kind: 'binary' }>,\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n const left = evaluateNode(ast.left, context);\n if (left.error) return left;\n const right = evaluateNode(ast.right, context);\n const dependencies = [...left.dependencies, ...right.dependencies];\n if (right.error) return { ...right, dependencies };\n if (Array.isArray(left.value) || Array.isArray(right.value)) {\n return evaluateMatrixBinary(ast.operator, left.value, right.value, dependencies);\n }\n if (['=', '<>', '>', '>=', '<', '<='].includes(ast.operator)) {\n return ok(compareValues(left.value, right.value, ast.operator), dependencies);\n }\n if (ast.operator === '&') {\n return ok(`${toText(left.value)}${toText(right.value)}`, dependencies);\n }\n const leftNumber = toNumber(left.value);\n const rightNumber = toNumber(right.value);\n if (leftNumber === null || rightNumber === null) return error('#VALUE!', dependencies);\n if (ast.operator === '/' && rightNumber === 0) return error('#DIV/0!', dependencies);\n const value =\n ast.operator === '+'\n ? leftNumber + rightNumber\n : ast.operator === '-'\n ? leftNumber - rightNumber\n : ast.operator === '*'\n ? leftNumber * rightNumber\n : leftNumber / rightNumber;\n return ok(value, dependencies);\n}\n\nfunction evaluateCall(\n name: string,\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (name === 'IF') return evaluateIf(args, context);\n if (name === 'IFERROR') return evaluateIfError(args, context);\n if (name === 'IFNA') return evaluateIfNa(args, context);\n if (name === 'ISERROR' || name === 'ISERR' || name === 'ISNA') return evaluateErrorPredicate(name, args, context);\n if (name === 'LET') return evaluateLet(args, context);\n if (name === 'IFS') return evaluateIfs(args, context);\n if (name === 'SWITCH') return evaluateSwitch(args, context);\n if (name === 'SUBTOTAL') return evaluateSubtotal(args, context);\n if (name === 'AGGREGATE') return evaluateAggregate(args, context);\n const values: SpreadsheetFormulaValue[] = [];\n let dependencies: SpreadsheetFormulaReference[] = [];\n for (const arg of args) {\n const evaluated = evaluateNode(arg, context);\n dependencies = [...dependencies, ...evaluated.dependencies];\n if (evaluated.error) return { ...evaluated, dependencies };\n values.push(evaluated.value);\n }\n if (name === 'SUMPRODUCT') return evaluateSumProduct(values, dependencies);\n switch (name) {\n case 'TRUE':\n return args.length === 0 ? ok(true, dependencies) : error('#VALUE!', dependencies);\n case 'FALSE':\n return args.length === 0 ? ok(false, dependencies) : error('#VALUE!', dependencies);\n case 'NA':\n return args.length === 0 ? error('#N/A', dependencies) : error('#VALUE!', dependencies);\n case 'N': {\n const value = values[0] ?? null;\n if (typeof value === 'number') return ok(value, dependencies);\n if (typeof value === 'boolean') return ok(value ? 1 : 0, dependencies);\n return ok(0, dependencies);\n }\n case 'AND':\n return ok(values.every(truthy), dependencies);\n case 'OR':\n return ok(values.some(truthy), dependencies);\n case 'NOT':\n return values.length === 1 ? ok(!truthy(values[0]!), dependencies) : error('#VALUE!', dependencies);\n case 'SUM':\n return ok(numericValues(values).reduce((sum, value) => sum + value, 0), dependencies);\n case 'PRODUCT': {\n const numbers = numericValues(values);\n return ok(numbers.reduce((product, value) => product * value, 1), dependencies);\n }\n case 'SUMSQ':\n return ok(numericValues(values).reduce((sum, value) => sum + value * value, 0), dependencies);\n case 'AVERAGE': {\n const numbers = numericValues(values);\n return numbers.length === 0\n ? error('#DIV/0!', dependencies)\n : ok(numbers.reduce((sum, value) => sum + value, 0) / numbers.length, dependencies);\n }\n case 'COUNT':\n return ok(numericValues(values).length, dependencies);\n case 'COUNTA':\n return ok(flatten(values).filter((value) => value !== null && value !== '').length, dependencies);\n case 'MIN': {\n const numbers = numericValues(values);\n return numbers.length === 0 ? ok(0, dependencies) : ok(Math.min(...numbers), dependencies);\n }\n case 'MAX': {\n const numbers = numericValues(values);\n return numbers.length === 0 ? ok(0, dependencies) : ok(Math.max(...numbers), dependencies);\n }\n case 'MEDIAN': {\n const numbers = numericValues(values).sort((left, right) => left - right);\n if (!numbers.length) return error('#NUM!', dependencies);\n const middle = Math.floor(numbers.length / 2);\n return ok(numbers.length % 2 ? numbers[middle]! : (numbers[middle - 1]! + numbers[middle]!) / 2, dependencies);\n }\n case 'LARGE':\n case 'SMALL': {\n const numbers = numericValues([values[0] ?? null]).sort((left, right) => name === 'LARGE' ? right - left : left - right);\n const index = toNumber(values[1] ?? null);\n if (index === null || !Number.isInteger(index) || index < 1 || index > numbers.length) return error('#NUM!', dependencies);\n return ok(numbers[index - 1]!, dependencies);\n }\n case 'RANK':\n case 'RANK.EQ':\n case 'RANK.AVG': {\n const number = toNumber(values[0] ?? null);\n const reference = numericValues([values[1] ?? null]);\n const order = toNumber(values[2] ?? 0);\n if (number === null || order === null || !reference.length) return error('#N/A', dependencies);\n const rank = reference.filter((value) => order === 0 ? value > number : value < number).length + 1;\n if (name === 'RANK.AVG') {\n const tieCount = reference.filter((value) => value === number).length;\n return ok(tieCount > 1 ? rank + (tieCount - 1) / 2 : rank, dependencies);\n }\n return ok(rank, dependencies);\n }\n case 'ABS': {\n const number = toNumber(values[0] ?? null);\n return number === null ? error('#VALUE!', dependencies) : ok(Math.abs(number), dependencies);\n }\n case 'SIGN': {\n const number = toNumber(values[0] ?? null);\n return number === null ? error('#VALUE!', dependencies) : ok(number < 0 ? -1 : number > 0 ? 1 : 0, dependencies);\n }\n case 'POWER': {\n const base = toNumber(values[0] ?? null);\n const exponent = toNumber(values[1] ?? null);\n if (base === null || exponent === null) return error('#VALUE!', dependencies);\n const result = base ** exponent;\n return Number.isFinite(result) ? ok(result, dependencies) : error('#NUM!', dependencies);\n }\n case 'SQRT': {\n const number = toNumber(values[0] ?? null);\n return number === null ? error('#VALUE!', dependencies) : number < 0 ? error('#NUM!', dependencies) : ok(Math.sqrt(number), dependencies);\n }\n case 'EXP': {\n const number = toNumber(values[0] ?? null);\n if (number === null) return error('#VALUE!', dependencies);\n const result = Math.exp(number);\n return Number.isFinite(result) ? ok(result, dependencies) : error('#NUM!', dependencies);\n }\n case 'LN': {\n const number = toNumber(values[0] ?? null);\n return number === null ? error('#VALUE!', dependencies) : number <= 0 ? error('#NUM!', dependencies) : ok(Math.log(number), dependencies);\n }\n case 'LOG': {\n const number = toNumber(values[0] ?? null);\n const base = toNumber(values[1] ?? 10);\n return number === null || base === null || number <= 0 || base <= 0 || base === 1\n ? error(number === null || base === null ? '#VALUE!' : '#NUM!', dependencies)\n : ok(Math.log(number) / Math.log(base), dependencies);\n }\n case 'PMT':\n case 'FV':\n case 'PV':\n return evaluateFinancial(name, values, dependencies);\n case 'NPV': {\n const rate = toNumber(values[0] ?? null);\n const cashFlows = numericValues(values.slice(1));\n if (rate === null || rate <= -1) return error(rate === null ? '#VALUE!' : '#NUM!', dependencies);\n return ok(cashFlows.reduce((total, cashFlow, index) => total + cashFlow / (1 + rate) ** (index + 1), 0), dependencies);\n }\n case 'IRR':\n return evaluateIrr(values, dependencies);\n case 'RATE':\n return evaluateRate(values, dependencies);\n case 'VAR':\n case 'VAR.P':\n case 'VAR.S':\n case 'STDEV':\n case 'STDEV.P':\n case 'STDEV.S':\n return evaluateVariance(name, values, dependencies);\n case 'PERCENTILE':\n case 'PERCENTILE.INC':\n case 'PERCENTILE.EXC':\n return evaluatePercentile(name, values, dependencies);\n case 'QUARTILE':\n case 'QUARTILE.INC':\n case 'QUARTILE.EXC':\n return evaluateQuartile(name, values, dependencies);\n case 'ROUND': {\n const number = toNumber(values[0] ?? null);\n const digits = toNumber(values[1] ?? 0);\n if (number === null || digits === null) return error('#VALUE!', dependencies);\n const factor = 10 ** Math.trunc(digits);\n return ok(Math.round(number * factor) / factor, dependencies);\n }\n case 'ROUNDUP':\n case 'ROUNDDOWN': {\n const number = toNumber(values[0] ?? null);\n const digits = toNumber(values[1] ?? 0);\n if (number === null || digits === null) return error('#VALUE!', dependencies);\n return ok(roundDirectional(number, Math.trunc(digits), name === 'ROUNDUP'), dependencies);\n }\n case 'CEILING':\n case 'FLOOR': {\n const number = toNumber(values[0] ?? null);\n const significance = toNumber(values[1] ?? 1);\n if (number === null || significance === null || significance === 0) return error('#VALUE!', dependencies);\n const step = Math.abs(significance);\n const rounded = name === 'CEILING'\n ? Math.ceil(number / step) * step\n : Math.floor(number / step) * step;\n return ok(rounded, dependencies);\n }\n case 'INT': {\n const number = toNumber(values[0] ?? null);\n return number === null ? error('#VALUE!', dependencies) : ok(Math.floor(number), dependencies);\n }\n case 'MOD': {\n const number = toNumber(values[0] ?? null);\n const divisor = toNumber(values[1] ?? null);\n if (number === null || divisor === null) return error('#VALUE!', dependencies);\n return divisor === 0 ? error('#DIV/0!', dependencies) : ok(number % divisor, dependencies);\n }\n case 'LEN':\n return values.length === 1 ? ok(toText(values[0]!).length, dependencies) : error('#VALUE!', dependencies);\n case 'TRIM':\n return values.length === 1 ? ok(toText(values[0]!).trim().replace(/\\s+/g, ' '), dependencies) : error('#VALUE!', dependencies);\n case 'LOWER':\n return values.length === 1 ? ok(toText(values[0]!).toLowerCase(), dependencies) : error('#VALUE!', dependencies);\n case 'UPPER':\n return values.length === 1 ? ok(toText(values[0]!).toUpperCase(), dependencies) : error('#VALUE!', dependencies);\n case 'LEFT': {\n const text = toText(values[0] ?? '');\n const count = toNumber(values[1] ?? 1);\n return count === null || count < 0 ? error('#VALUE!', dependencies) : ok(text.slice(0, Math.trunc(count)), dependencies);\n }\n case 'RIGHT': {\n const text = toText(values[0] ?? '');\n const count = toNumber(values[1] ?? 1);\n return count === null || count < 0 ? error('#VALUE!', dependencies) : ok(text.slice(Math.max(0, text.length - Math.trunc(count))), dependencies);\n }\n case 'MID': {\n const text = toText(values[0] ?? '');\n const start = toNumber(values[1] ?? null);\n const count = toNumber(values[2] ?? null);\n if (start === null || count === null || start < 1 || count < 0) return error('#VALUE!', dependencies);\n return ok(text.slice(Math.trunc(start) - 1, Math.trunc(start) - 1 + Math.trunc(count)), dependencies);\n }\n case 'FIND':\n case 'SEARCH': {\n const needle = toText(values[0] ?? '');\n const haystack = toText(values[1] ?? '');\n const start = toNumber(values[2] ?? 1);\n if (start === null || start < 1) return error('#VALUE!', dependencies);\n const source = name === 'SEARCH' ? haystack.toLowerCase() : haystack;\n const target = name === 'SEARCH' ? needle.toLowerCase() : needle;\n const index = source.indexOf(target, Math.trunc(start) - 1);\n return index < 0 ? error('#VALUE!', dependencies) : ok(index + 1, dependencies);\n }\n case 'SUBSTITUTE': {\n const text = toText(values[0] ?? '');\n const oldText = toText(values[1] ?? '');\n const newText = toText(values[2] ?? '');\n if (oldText === '') return ok(text, dependencies);\n const instance = values[3] === undefined ? null : toNumber(values[3]);\n if (instance !== null && (instance === null || instance < 1)) return error('#VALUE!', dependencies);\n if (instance === null) return ok(text.split(oldText).join(newText), dependencies);\n let occurrence = 0;\n return ok(text.split(oldText).map((part, index, parts) => {\n if (index === parts.length - 1) return part;\n occurrence++;\n return `${part}${occurrence === Math.trunc(instance) ? newText : oldText}`;\n }).join(''), dependencies);\n }\n case 'REPLACE': {\n const text = toText(values[0] ?? '');\n const start = toNumber(values[1] ?? null);\n const count = toNumber(values[2] ?? null);\n if (start === null || count === null || start < 1 || count < 0) return error('#VALUE!', dependencies);\n return ok(text.slice(0, Math.trunc(start) - 1) + toText(values[3] ?? '') + text.slice(Math.trunc(start) - 1 + Math.trunc(count)), dependencies);\n }\n case 'TEXT':\n return values.length === 2 ? ok(formatTextValue(values[0]!, toText(values[1]!)), dependencies) : error('#VALUE!', dependencies);\n case 'CONCAT':\n case 'CONCATENATE':\n return ok(flatten(values).map((value) => toText(value)).join(''), dependencies);\n case 'TEXTJOIN': {\n const delimiter = toText(values[0] ?? '');\n const ignoreEmpty = truthy(values[1] ?? false);\n const textValues = flatten(values.slice(2)).map((value) => toText(value));\n return ok(textValues.filter((value) => !ignoreEmpty || value !== '').join(delimiter), dependencies);\n }\n case 'TEXTBEFORE':\n return evaluateTextBoundary('before', values, dependencies);\n case 'TEXTAFTER':\n return evaluateTextBoundary('after', values, dependencies);\n case 'DATEDIF':\n return evaluateDateDifference(values, dependencies);\n case 'TODAY':\n return args.length === 0 ? ok(context.getToday?.() ?? excelSerialFromDate(new Date()), dependencies) : error('#VALUE!', dependencies);\n case 'VALUE': {\n const number = toNumber(values[0] ?? null);\n return number === null ? error('#VALUE!', dependencies) : ok(number, dependencies);\n }\n case 'COUNTBLANK': {\n const matrix = toMatrix(values[0]);\n return !matrix ? error('#VALUE!', dependencies) : ok(flatten([matrix]).filter((value) => value === null || value === '').length, dependencies);\n }\n case 'ISBLANK':\n return values.length === 1 ? ok(values[0] === null || values[0] === '', dependencies) : error('#VALUE!', dependencies);\n case 'ISNUMBER':\n return values.length === 1 ? ok(typeof values[0] === 'number' && Number.isFinite(values[0]), dependencies) : error('#VALUE!', dependencies);\n case 'ISTEXT':\n return values.length === 1 ? ok(typeof values[0] === 'string', dependencies) : error('#VALUE!', dependencies);\n case 'DATE':\n return evaluateDate(values, dependencies);\n case 'DATEVALUE': {\n const date = toDateParts(values[0]);\n return values.length === 1 && date ? ok(excelSerialFromTime(date.time), dependencies) : error('#VALUE!', dependencies);\n }\n case 'TIME': {\n const hour = toNumber(values[0] ?? null);\n const minute = toNumber(values[1] ?? null);\n const second = toNumber(values[2] ?? null);\n if (values.length !== 3 || hour === null || minute === null || second === null) return error('#VALUE!', dependencies);\n return ok((Math.trunc(hour) * 3600 + Math.trunc(minute) * 60 + Math.trunc(second)) / 86400, dependencies);\n }\n case 'YEAR':\n case 'MONTH':\n case 'DAY':\n return evaluateDatePart(name, values, dependencies);\n case 'HOUR':\n case 'MINUTE':\n case 'SECOND':\n return evaluateTimePart(name, values, dependencies);\n case 'DAYS':\n return evaluateDays(values, dependencies);\n case 'WEEKDAY':\n return evaluateWeekday(values, dependencies);\n case 'EDATE':\n case 'EOMONTH':\n return evaluateMonthShift(name, values, dependencies);\n case 'WORKDAY':\n return evaluateWorkday(values, dependencies);\n case 'NETWORKDAYS':\n return evaluateNetworkdays(values, dependencies);\n case 'SUMIF':\n return evaluateConditionalAggregate('SUMIF', values, dependencies);\n case 'COUNTIF':\n return evaluateConditionalAggregate('COUNTIF', values, dependencies);\n case 'AVERAGEIF':\n return evaluateConditionalAggregate('AVERAGEIF', values, dependencies);\n case 'SUMIFS':\n return evaluateMultiConditionalAggregate('SUMIFS', values, dependencies);\n case 'COUNTIFS':\n return evaluateMultiConditionalAggregate('COUNTIFS', values, dependencies);\n case 'AVERAGEIFS':\n return evaluateMultiConditionalAggregate('AVERAGEIFS', values, dependencies);\n case 'MAXIFS':\n return evaluateMultiConditionalAggregate('MAXIFS', values, dependencies);\n case 'MINIFS':\n return evaluateMultiConditionalAggregate('MINIFS', values, dependencies);\n case 'VLOOKUP':\n return evaluateLookup('VLOOKUP', values, dependencies);\n case 'HLOOKUP':\n return evaluateLookup('HLOOKUP', values, dependencies);\n case 'INDEX':\n return evaluateIndex(values, dependencies);\n case 'MATCH':\n return evaluateMatch(values, dependencies);\n case 'XLOOKUP':\n return evaluateXLookup(values, dependencies);\n case 'XMATCH':\n return evaluateXMatch(values, dependencies);\n case 'FILTER':\n return evaluateFilter(values, dependencies);\n case 'SORT':\n return evaluateSort(values, dependencies);\n case 'UNIQUE':\n return evaluateUnique(values, dependencies);\n case 'SEQUENCE':\n return evaluateSequence(values, dependencies);\n case 'SORTBY':\n return evaluateSortBy(values, dependencies);\n case 'TAKE':\n return evaluateTakeDrop('TAKE', values, dependencies);\n case 'DROP':\n return evaluateTakeDrop('DROP', values, dependencies);\n case 'CHOOSECOLS':\n return evaluateChooseAxis('columns', values, dependencies);\n case 'CHOOSEROWS':\n return evaluateChooseAxis('rows', values, dependencies);\n case 'TOCOL':\n return evaluateToLine('column', values, dependencies);\n case 'TOROW':\n return evaluateToLine('row', values, dependencies);\n default:\n return error('#NAME?', dependencies);\n }\n}\n\nfunction evaluateMatrixBinary(\n operator: Extract<SpreadsheetFormulaAst, { kind: 'binary' }>['operator'],\n left: SpreadsheetFormulaValue,\n right: SpreadsheetFormulaValue,\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const leftMatrix = toMatrix(left);\n const rightMatrix = toMatrix(right);\n if (!leftMatrix || !rightMatrix) return error('#VALUE!', dependencies);\n const rows = Math.max(leftMatrix.length, rightMatrix.length);\n const columns = Math.max(leftMatrix[0]?.length ?? 0, rightMatrix[0]?.length ?? 0);\n if (!isScalar(left) && !isScalar(right) && !sameShape(leftMatrix, rightMatrix)) return error('#VALUE!', dependencies);\n const output: SpreadsheetFormulaScalar[][] = [];\n for (let row = 0; row < rows; row++) {\n const values: SpreadsheetFormulaScalar[] = [];\n for (let column = 0; column < columns; column++) {\n const leftValue = isScalar(left) ? left : leftMatrix[row]?.[column] ?? null;\n const rightValue = isScalar(right) ? right : rightMatrix[row]?.[column] ?? null;\n const result = evaluateScalarBinary(operator, leftValue, rightValue, dependencies);\n if (result.error) return result;\n if (Array.isArray(result.value)) return error('#VALUE!', dependencies);\n values.push(result.value);\n }\n output.push(values);\n }\n return ok(output, dependencies);\n}\n\nfunction evaluateScalarBinary(\n operator: Extract<SpreadsheetFormulaAst, { kind: 'binary' }>['operator'],\n left: SpreadsheetFormulaScalar,\n right: SpreadsheetFormulaScalar,\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (['=', '<>', '>', '>=', '<', '<='].includes(operator)) {\n return ok(compareValues(left, right, operator), dependencies);\n }\n if (operator === '&') return ok(`${toText(left)}${toText(right)}`, dependencies);\n const leftNumber = toNumber(left);\n const rightNumber = toNumber(right);\n if (leftNumber === null || rightNumber === null) return error('#VALUE!', dependencies);\n if (operator === '/' && rightNumber === 0) return error('#DIV/0!', dependencies);\n const value = operator === '+'\n ? leftNumber + rightNumber\n : operator === '-'\n ? leftNumber - rightNumber\n : operator === '*'\n ? leftNumber * rightNumber\n : leftNumber / rightNumber;\n return ok(value, dependencies);\n}\n\nfunction evaluateSumProduct(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const matrices = values.map(toMatrix);\n if (matrices.some((matrix) => !matrix) || matrices.length === 0) return error('#VALUE!', dependencies);\n const first = matrices[0]!;\n if (matrices.some((matrix) => !sameShape(first, matrix!))) return error('#VALUE!', dependencies);\n let total = 0;\n forEachMatrix(first, (_value, row, column) => {\n let product = 1;\n for (const matrix of matrices) {\n const number = toNumber(matrix![row]?.[column] ?? null);\n product *= number ?? 0;\n }\n total += product;\n });\n return ok(total, dependencies);\n}\n\nfunction isScalar(value: SpreadsheetFormulaValue): value is SpreadsheetFormulaScalar {\n return !Array.isArray(value);\n}\n\nfunction evaluateDateDifference(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length !== 3) return error('#VALUE!', dependencies);\n const start = toDateParts(values[0]);\n const end = toDateParts(values[1]);\n const unit = toText(values[2] ?? '').toUpperCase();\n if (!start || !end || !['Y', 'M', 'D'].includes(unit)) return error('#VALUE!', dependencies);\n if (start.time > end.time) return error('#NUM!', dependencies);\n if (unit === 'D') return ok(Math.floor((end.time - start.time) / MS_PER_DAY), dependencies);\n const totalMonths = (end.year - start.year) * 12 + end.month - start.month;\n const adjustedMonths = end.day < start.day ? totalMonths - 1 : totalMonths;\n return ok(unit === 'M' ? adjustedMonths : Math.floor(adjustedMonths / 12), dependencies);\n}\n\nfunction evaluateTextBoundary(\n mode: 'before' | 'after',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 2 || values.length > 4) return error('#VALUE!', dependencies);\n const text = toText(values[0] ?? '');\n const delimiter = toText(values[1] ?? '');\n if (delimiter === '') return error('#VALUE!', dependencies);\n const instanceValue = values[2] === undefined ? 1 : toNumber(values[2]);\n if (instanceValue === null || instanceValue === 0 || !Number.isFinite(instanceValue)) {\n return error('#VALUE!', dependencies);\n }\n const instance = Math.trunc(instanceValue);\n const index = findDelimiterIndex(text, delimiter, instance);\n if (index < 0) {\n return values.length === 4 ? ok(toText(values[3] ?? ''), dependencies) : error('#N/A', dependencies);\n }\n return ok(mode === 'before' ? text.slice(0, index) : text.slice(index + delimiter.length), dependencies);\n}\n\nfunction findDelimiterIndex(text: string, delimiter: string, instance: number): number {\n if (instance > 0) {\n let start = 0;\n let index = -1;\n for (let occurrence = 0; occurrence < instance; occurrence++) {\n index = text.indexOf(delimiter, start);\n if (index < 0) return -1;\n start = index + delimiter.length;\n }\n return index;\n }\n\n let end = text.length;\n let index = -1;\n for (let occurrence = 0; occurrence < Math.abs(instance); occurrence++) {\n index = text.lastIndexOf(delimiter, end);\n if (index < 0) return -1;\n end = index - 1;\n }\n return index;\n}\n\nfunction evaluateIf(\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (args.length < 2 || args.length > 3) return error('#VALUE!');\n const condition = evaluateNode(args[0]!, context);\n if (condition.error) return condition;\n const branch = truthy(condition.value) ? args[1]! : args[2];\n if (!branch) return ok(false, condition.dependencies);\n const evaluated = evaluateNode(branch, context);\n return {\n ...evaluated,\n dependencies: [...condition.dependencies, ...evaluated.dependencies],\n };\n}\n\nfunction evaluateIfError(\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (args.length !== 2) return error('#VALUE!');\n const value = evaluateNode(args[0]!, context);\n if (!value.error) return value;\n const fallback = evaluateNode(args[1]!, context);\n return {\n ...fallback,\n dependencies: [...value.dependencies, ...fallback.dependencies],\n };\n}\n\nfunction evaluateIfNa(\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (args.length !== 2) return error('#VALUE!');\n const value = evaluateNode(args[0]!, context);\n if (!value.error || value.error !== '#N/A') return value;\n const fallback = evaluateNode(args[1]!, context);\n return {\n ...fallback,\n dependencies: [...value.dependencies, ...fallback.dependencies],\n };\n}\n\nfunction evaluateErrorPredicate(\n name: 'ISERROR' | 'ISERR' | 'ISNA',\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (args.length !== 1) return error('#VALUE!');\n const evaluated = evaluateNode(args[0]!, context);\n const isError = evaluated.error !== null;\n const matches = name === 'ISERROR'\n ? isError\n : name === 'ISERR'\n ? isError && evaluated.error !== '#N/A'\n : evaluated.error === '#N/A';\n return ok(matches, evaluated.dependencies);\n}\n\nfunction evaluateLet(\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (args.length < 3 || args.length % 2 === 0) return error('#VALUE!');\n const variables = new Map<string, SpreadsheetFormulaEvaluation>();\n let dependencies: SpreadsheetFormulaReference[] = [];\n const scopedContext = (): SpreadsheetFormulaEvaluationContext => ({\n ...context,\n getNameValue: (name) => variables.get(name.toUpperCase()) ?? context.getNameValue?.(name) ?? error('#NAME?'),\n });\n for (let index = 0; index < args.length - 1; index += 2) {\n const name = args[index];\n if (name?.kind !== 'name') return error('#NAME?', dependencies);\n const value = evaluateNode(args[index + 1]!, scopedContext());\n dependencies = [...dependencies, ...value.dependencies];\n if (value.error) return { ...value, dependencies };\n variables.set(name.name.toUpperCase(), value);\n }\n const result = evaluateNode(args[args.length - 1]!, scopedContext());\n return { ...result, dependencies: [...dependencies, ...result.dependencies] };\n}\n\nfunction evaluateIfs(\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (args.length < 2 || args.length % 2 !== 0) return error('#VALUE!');\n let dependencies: SpreadsheetFormulaReference[] = [];\n for (let index = 0; index < args.length; index += 2) {\n const condition = evaluateNode(args[index]!, context);\n dependencies = [...dependencies, ...condition.dependencies];\n if (condition.error) return { ...condition, dependencies };\n if (truthy(condition.value)) {\n const result = evaluateNode(args[index + 1]!, context);\n return { ...result, dependencies: [...dependencies, ...result.dependencies] };\n }\n }\n return error('#N/A', dependencies);\n}\n\nfunction evaluateSwitch(\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (args.length < 3) return error('#VALUE!');\n const expression = evaluateNode(args[0]!, context);\n if (expression.error) return expression;\n const hasDefault = (args.length - 1) % 2 === 1;\n const pairEnd = hasDefault ? args.length - 1 : args.length;\n let dependencies = [...expression.dependencies];\n for (let index = 1; index < pairEnd; index += 2) {\n const match = evaluateNode(args[index]!, context);\n dependencies = [...dependencies, ...match.dependencies];\n if (match.error) return { ...match, dependencies };\n if (compareValues(expression.value, match.value, '=')) {\n const result = evaluateNode(args[index + 1]!, context);\n return { ...result, dependencies: [...dependencies, ...result.dependencies] };\n }\n }\n if (hasDefault) {\n const result = evaluateNode(args[args.length - 1]!, context);\n return { ...result, dependencies: [...dependencies, ...result.dependencies] };\n }\n return error('#N/A', dependencies);\n}\n\nfunction evaluateSubtotal(\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (args.length < 2) return error('#VALUE!');\n const functionNumber = evaluateNode(args[0]!, context);\n const number = toNumber(functionNumber.value);\n if (functionNumber.error || number === null || !Number.isInteger(number) || number < 1 || number > 111) {\n return error('#VALUE!', functionNumber.dependencies);\n }\n const baseFunction = number > 100 ? number - 100 : number;\n if (![1, 2, 3, 4, 5, 6, 9, 101, 102, 103, 104, 105, 106, 109].includes(number)) {\n return error('#VALUE!', functionNumber.dependencies);\n }\n let dependencies = [...functionNumber.dependencies];\n const values: SpreadsheetFormulaValue[] = [];\n for (const argument of args.slice(1)) {\n const evaluated = evaluateNode(argument, context);\n dependencies = [...dependencies, ...evaluated.dependencies];\n if (evaluated.error) return { ...evaluated, dependencies };\n values.push(number >= 100 ? filterHiddenRows(evaluated.value, argument, context) : evaluated.value);\n }\n return aggregateValues(baseFunction, values, dependencies);\n}\n\nfunction evaluateAggregate(\n args: SpreadsheetFormulaAst[],\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaEvaluation {\n if (args.length < 3) return error('#VALUE!');\n const functionNumber = evaluateNode(args[0]!, context);\n const options = evaluateNode(args[1]!, context);\n const number = toNumber(functionNumber.value);\n const option = toNumber(options.value);\n if (functionNumber.error || options.error || number === null || option === null || !Number.isInteger(number) || !Number.isInteger(option)) {\n return error('#VALUE!', [...functionNumber.dependencies, ...options.dependencies]);\n }\n const hiddenRows = [1, 3, 5, 7].includes(option);\n let dependencies = [...functionNumber.dependencies, ...options.dependencies];\n const values: SpreadsheetFormulaValue[] = [];\n for (const argument of args.slice(2, number === 14 || number === 15 ? 3 : undefined)) {\n const evaluated = evaluateNode(argument, context);\n dependencies = [...dependencies, ...evaluated.dependencies];\n if (evaluated.error) return { ...evaluated, dependencies };\n values.push(hiddenRows ? filterHiddenRows(evaluated.value, argument, context) : evaluated.value);\n }\n if (number === 14 || number === 15) {\n const k = toNumber(args[3] ? (evaluateNode(args[3], context).value) : null);\n if (k === null) return error('#VALUE!', dependencies);\n values.push(k);\n }\n return aggregateValues(number, values, dependencies);\n}\n\nfunction filterHiddenRows(\n value: SpreadsheetFormulaValue,\n ast: SpreadsheetFormulaAst,\n context: SpreadsheetFormulaEvaluationContext,\n): SpreadsheetFormulaValue {\n const isRowHidden = context.isRowHidden;\n if (!isRowHidden || !Array.isArray(value)) return value;\n if (ast.kind === 'cell') {\n return isRowHidden(parseCellAddress(ast.address).row, ast.sheetName) ? [] : value;\n }\n if (ast.kind !== 'range') return value;\n const start = parseCellAddress(ast.startAddress);\n const end = parseCellAddress(ast.endAddress);\n return value.filter((_row, offset) => !isRowHidden(start.row + offset, ast.sheetName));\n}\n\nfunction aggregateValues(\n functionNumber: number,\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (functionNumber === 1) {\n const numbers = numericValues(values);\n return numbers.length ? ok(numbers.reduce((sum, value) => sum + value, 0) / numbers.length, dependencies) : error('#DIV/0!', dependencies);\n }\n if (functionNumber === 2) return ok(numericValues(values).length, dependencies);\n if (functionNumber === 3) return ok(flatten(values).filter((value) => value !== null && value !== '').length, dependencies);\n if (functionNumber === 4) {\n const numbers = numericValues(values);\n return numbers.length ? ok(Math.max(...numbers), dependencies) : ok(0, dependencies);\n }\n if (functionNumber === 5) {\n const numbers = numericValues(values);\n return numbers.length ? ok(Math.min(...numbers), dependencies) : ok(0, dependencies);\n }\n if (functionNumber === 6) {\n return ok(numericValues(values).reduce((product, value) => product * value, 1), dependencies);\n }\n if (functionNumber === 9) return ok(numericValues(values).reduce((sum, value) => sum + value, 0), dependencies);\n if (functionNumber === 12) {\n const numbers = numericValues(values).sort((left, right) => left - right);\n if (!numbers.length) return error('#NUM!', dependencies);\n const middle = Math.floor(numbers.length / 2);\n return ok(numbers.length % 2 ? numbers[middle]! : (numbers[middle - 1]! + numbers[middle]!) / 2, dependencies);\n }\n if (functionNumber === 14 || functionNumber === 15) {\n const k = toNumber(values[values.length - 1] ?? null);\n const numbers = numericValues(values.slice(0, -1)).sort((left, right) => functionNumber === 14 ? right - left : left - right);\n if (k === null || !Number.isInteger(k) || k < 1 || k > numbers.length) return error('#NUM!', dependencies);\n return ok(numbers[k - 1]!, dependencies);\n }\n return error('#VALUE!', dependencies);\n}\n\nfunction roundDirectional(number: number, digits: number, roundUp: boolean): number {\n const factor = 10 ** digits;\n const scaled = number * factor;\n const rounded = roundUp\n ? Math.sign(scaled) * Math.ceil(Math.abs(scaled))\n : Math.trunc(scaled);\n return rounded / factor;\n}\n\nfunction evaluateFinancial(\n name: 'PMT' | 'FV' | 'PV',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 3 || values.length > 5) return error('#VALUE!', dependencies);\n const rate = toNumber(values[0] ?? null);\n const periods = toNumber(values[1] ?? null);\n const third = toNumber(values[2] ?? null);\n const fourth = toNumber(values[3] ?? 0);\n const type = toNumber(values[4] ?? 0);\n if (rate === null || periods === null || third === null || fourth === null || type === null) {\n return error('#VALUE!', dependencies);\n }\n if (periods === 0 || ![0, 1].includes(Math.trunc(type))) return error('#NUM!', dependencies);\n const normalizedType = Math.trunc(type);\n const growth = (1 + rate) ** periods;\n if (!Number.isFinite(growth)) return error('#NUM!', dependencies);\n if (rate === 0) {\n if (name === 'PMT') return ok(-(third + fourth) / periods, dependencies);\n if (name === 'FV') return ok(-(fourth + third * periods), dependencies);\n return ok(-(fourth + third * periods), dependencies);\n }\n const annuity = ((growth - 1) / rate) * (1 + rate * normalizedType);\n if (name === 'PMT') return ok(-(third * growth + fourth) * rate / (growth - 1), dependencies);\n if (name === 'FV') return ok(-(fourth * growth + third * annuity), dependencies);\n return ok(-(fourth + third * annuity) / growth, dependencies);\n}\n\nfunction evaluateIrr(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const cashFlows = numericValues([values[0] ?? null]);\n const guess = toNumber(values[1] ?? 0.1);\n if (!cashFlows.length || guess === null) return error('#VALUE!', dependencies);\n const rate = solveRate(cashFlows, guess);\n return rate === null ? error('#NUM!', dependencies) : ok(rate, dependencies);\n}\n\nfunction evaluateRate(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 3 || values.length > 6) return error('#VALUE!', dependencies);\n const periods = toNumber(values[0] ?? null);\n const payment = toNumber(values[1] ?? null);\n const presentValue = toNumber(values[2] ?? null);\n const futureValue = toNumber(values[3] ?? 0);\n const type = toNumber(values[4] ?? 0);\n const guess = toNumber(values[5] ?? 0.1);\n if ([periods, payment, presentValue, futureValue, type, guess].some((value) => value === null)) {\n return error('#VALUE!', dependencies);\n }\n if (periods === 0 || ![0, 1].includes(Math.trunc(type!))) return error('#NUM!', dependencies);\n const normalizedPeriods = Math.trunc(periods!);\n const normalizedType = Math.trunc(type!);\n const cashFlows = [presentValue! + (normalizedType === 1 ? payment! : 0)];\n for (let index = 1; index <= normalizedPeriods; index++) {\n cashFlows.push((normalizedType === 1 && index === normalizedPeriods ? 0 : payment!) + (index === normalizedPeriods ? futureValue! : 0));\n }\n const rate = solveRate(cashFlows, guess!);\n return rate === null ? error('#NUM!', dependencies) : ok(rate, dependencies);\n}\n\nfunction solveRate(cashFlows: number[], initialGuess: number): number | null {\n const evaluate = (rate: number): number => cashFlows.reduce((sum, cashFlow, index) => sum + cashFlow / (1 + rate) ** index, 0);\n const derivative = (rate: number): number => cashFlows.reduce((sum, cashFlow, index) => (\n index === 0 ? sum : sum - index * cashFlow / (1 + rate) ** (index + 1)\n ), 0);\n let rate = Math.max(-0.9999, initialGuess);\n for (let iteration = 0; iteration < 100; iteration++) {\n const value = evaluate(rate);\n if (Math.abs(value) < 1e-10) return rate;\n const slope = derivative(rate);\n if (!Number.isFinite(value) || !Number.isFinite(slope) || Math.abs(slope) < 1e-14) break;\n const next = rate - value / slope;\n if (!Number.isFinite(next) || next <= -1 || Math.abs(next - rate) > 10) break;\n rate = next;\n }\n let left = -0.9999;\n let leftValue = evaluate(left);\n for (let index = 1; index <= 2000; index++) {\n const right = -0.9999 + index * 0.01;\n const rightValue = evaluate(right);\n if (Number.isFinite(leftValue) && Number.isFinite(rightValue) && leftValue * rightValue <= 0) {\n let low = left;\n let high = right;\n for (let iteration = 0; iteration < 80; iteration++) {\n const middle = (low + high) / 2;\n const middleValue = evaluate(middle);\n if (Math.abs(middleValue) < 1e-10) return middle;\n if (leftValue * middleValue <= 0) {\n high = middle;\n } else {\n low = middle;\n leftValue = middleValue;\n }\n }\n return (low + high) / 2;\n }\n left = right;\n leftValue = rightValue;\n }\n return null;\n}\n\nfunction evaluateVariance(\n name: 'VAR' | 'VAR.P' | 'VAR.S' | 'STDEV' | 'STDEV.P' | 'STDEV.S',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const numbers = numericValues(values);\n const sample = name === 'VAR' || name === 'STDEV' || name.endsWith('.S');\n if (numbers.length < (sample ? 2 : 1)) return error('#DIV/0!', dependencies);\n const mean = numbers.reduce((sum, value) => sum + value, 0) / numbers.length;\n const variance = numbers.reduce((sum, value) => sum + (value - mean) ** 2, 0) / (numbers.length - (sample ? 1 : 0));\n return ok(name.startsWith('STDEV') ? Math.sqrt(variance) : variance, dependencies);\n}\n\nfunction evaluatePercentile(\n name: 'PERCENTILE' | 'PERCENTILE.INC' | 'PERCENTILE.EXC',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length !== 2) return error('#VALUE!', dependencies);\n return percentileValue(values[0], values[1]!, name === 'PERCENTILE.EXC', dependencies);\n}\n\nfunction evaluateQuartile(\n name: 'QUARTILE' | 'QUARTILE.INC' | 'QUARTILE.EXC',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length !== 2) return error('#VALUE!', dependencies);\n const quartile = toNumber(values[1] ?? null);\n if (quartile === null || !Number.isInteger(quartile) || quartile < 0 || quartile > 4) {\n return error('#NUM!', dependencies);\n }\n return percentileValue(values[0], quartile / 4, name === 'QUARTILE.EXC', dependencies);\n}\n\nfunction percentileValue(\n source: SpreadsheetFormulaValue | undefined,\n percentile: SpreadsheetFormulaValue,\n exclusive: boolean,\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const numbers = numericValues([source ?? null]).sort((left, right) => left - right);\n const k = toNumber(percentile);\n if (!numbers.length || k === null) return error('#NUM!', dependencies);\n const position = exclusive ? k * (numbers.length + 1) - 1 : k * (numbers.length - 1);\n if (position < 0 || position > numbers.length - 1) return error('#NUM!', dependencies);\n const lower = Math.floor(position);\n const upper = Math.ceil(position);\n if (lower === upper) return ok(numbers[lower]!, dependencies);\n const fraction = position - lower;\n return ok(numbers[lower]! + (numbers[upper]! - numbers[lower]!) * fraction, dependencies);\n}\n\nfunction evaluateDate(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length !== 3) return error('#VALUE!', dependencies);\n const year = toNumber(values[0] ?? null);\n const month = toNumber(values[1] ?? null);\n const day = toNumber(values[2] ?? null);\n if (year === null || month === null || day === null) return error('#VALUE!', dependencies);\n const normalizedYear = Math.trunc(year) < 1900 ? Math.trunc(year) + 1900 : Math.trunc(year);\n const time = Date.UTC(normalizedYear, Math.trunc(month) - 1, Math.trunc(day));\n return Number.isFinite(time) ? ok(Math.floor((time - Date.UTC(1899, 11, 30)) / MS_PER_DAY), dependencies) : error('#NUM!', dependencies);\n}\n\nfunction evaluateDatePart(\n name: 'YEAR' | 'MONTH' | 'DAY',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const date = toDateParts(values[0]);\n if (!date || values.length !== 1) return error('#VALUE!', dependencies);\n return ok(name === 'YEAR' ? date.year : name === 'MONTH' ? date.month : date.day, dependencies);\n}\n\nfunction evaluateTimePart(\n name: 'HOUR' | 'MINUTE' | 'SECOND',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const value = values[0];\n const date = toDateParts(value);\n if (!date || values.length !== 1) return error('#VALUE!', dependencies);\n const time = ((date.time % MS_PER_DAY) + MS_PER_DAY) % MS_PER_DAY;\n const totalSeconds = Math.floor(time / 1000);\n if (name === 'HOUR') return ok(Math.floor(totalSeconds / 3600), dependencies);\n if (name === 'MINUTE') return ok(Math.floor((totalSeconds % 3600) / 60), dependencies);\n return ok(totalSeconds % 60, dependencies);\n}\n\nfunction evaluateDays(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const end = toDateParts(values[0]);\n const start = toDateParts(values[1]);\n if (!end || !start || values.length !== 2) return error('#VALUE!', dependencies);\n return ok(Math.floor((end.time - start.time) / MS_PER_DAY), dependencies);\n}\n\nfunction evaluateWeekday(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const date = toDateParts(values[0]);\n const returnType = toNumber(values[1] ?? 1);\n if (!date || values.length < 1 || values.length > 2 || returnType === null || ![1, 2, 3].includes(Math.trunc(returnType))) return error('#NUM!', dependencies);\n const day = new Date(date.time).getUTCDay();\n if (Math.trunc(returnType) === 2) return ok(day === 0 ? 7 : day, dependencies);\n if (Math.trunc(returnType) === 3) return ok(day === 0 ? 6 : day - 1, dependencies);\n return ok(day + 1, dependencies);\n}\n\nfunction evaluateMonthShift(\n name: 'EDATE' | 'EOMONTH',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const date = toDateParts(values[0]);\n const months = toNumber(values[1] ?? null);\n if (!date || months === null || values.length !== 2) return error('#VALUE!', dependencies);\n const shifted = new Date(Date.UTC(date.year, date.month - 1 + Math.trunc(months), name === 'EOMONTH' ? 0 : date.day));\n return ok(Math.floor((shifted.getTime() - Date.UTC(1899, 11, 30)) / MS_PER_DAY), dependencies);\n}\n\nfunction evaluateWorkday(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 2 || values.length > 3) return error('#VALUE!', dependencies);\n const start = toDateParts(values[0]);\n const days = toNumber(values[1] ?? null);\n const holidays = holidayTimes(values[2]);\n if (!start || days === null || holidays === null) return error('#VALUE!', dependencies);\n const direction = days < 0 ? -1 : 1;\n let remaining = Math.abs(Math.trunc(days));\n let time = start.time;\n while (remaining > 0 || isWeekend(time) || holidays.has(time)) {\n time += direction * MS_PER_DAY;\n if (!isWeekend(time) && !holidays.has(time)) remaining--;\n }\n return ok(excelSerialFromTime(time), dependencies);\n}\n\nfunction evaluateNetworkdays(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 2 || values.length > 3) return error('#VALUE!', dependencies);\n const start = toDateParts(values[0]);\n const end = toDateParts(values[1]);\n const holidays = holidayTimes(values[2]);\n if (!start || !end || holidays === null) return error('#VALUE!', dependencies);\n const direction = start.time <= end.time ? 1 : -1;\n let time = direction === 1 ? start.time : end.time;\n const limit = direction === 1 ? end.time : start.time;\n let count = 0;\n while (time <= limit) {\n if (!isWeekend(time) && !holidays.has(time)) count++;\n time += MS_PER_DAY;\n }\n return ok(direction * count, dependencies);\n}\n\nfunction holidayTimes(value: SpreadsheetFormulaValue | undefined): Set<number> | null {\n if (value === undefined) return new Set();\n const dates = flatten([value]).map(toDateParts);\n if (dates.some((date) => !date)) return null;\n return new Set(dates.map((date) => date!.time));\n}\n\nfunction isWeekend(time: number): boolean {\n const day = new Date(time).getUTCDay();\n return day === 0 || day === 6;\n}\n\nfunction excelSerialFromTime(time: number): number {\n return Math.floor((time - Date.UTC(1899, 11, 30)) / MS_PER_DAY);\n}\n\nfunction formatTextValue(value: SpreadsheetFormulaValue, format: string): string {\n const number = toNumber(value);\n if (number === null) return toText(value);\n if (format.includes('%')) {\n const decimals = decimalPlaces(format.replace('%', ''));\n return `${(number * 100).toFixed(decimals)}%`;\n }\n const decimals = decimalPlaces(format);\n if (format.includes(',')) return number.toLocaleString('en-US', { minimumFractionDigits: decimals, maximumFractionDigits: decimals });\n return decimals > 0 ? number.toFixed(decimals) : String(Math.round(number));\n}\n\nfunction decimalPlaces(format: string): number {\n const match = /\\.([0#]+)/.exec(format);\n return match?.[1]?.length ?? 0;\n}\n\nfunction evaluateXLookup(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 3 || values.length > 6) return error('#VALUE!', dependencies);\n const lookupValue = values[0];\n const lookupArray = flatten([values[1]!]);\n const returnArray = flatten([values[2]!]);\n const matchMode = toNumber(values[4] ?? 0);\n if (matchMode === null || Math.trunc(matchMode) !== 0 || lookupArray.length !== returnArray.length) return error('#VALUE!', dependencies);\n const index = lookupArray.findIndex((value) => compareValues(value, lookupValue ?? null, '='));\n if (index < 0) return values[3] === undefined ? error('#N/A', dependencies) : ok(values[3]!, dependencies);\n return ok(returnArray[index] ?? null, dependencies);\n}\n\nfunction evaluateXMatch(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 2 || values.length > 4) return error('#VALUE!', dependencies);\n const lookupArray = flatten([values[1]!]);\n const matchMode = toNumber(values[2] ?? 0);\n if (matchMode === null || Math.trunc(matchMode) !== 0) return error('#N/A', dependencies);\n const index = lookupArray.findIndex((value) => compareValues(value, values[0] ?? null, '='));\n return index < 0 ? error('#N/A', dependencies) : ok(index + 1, dependencies);\n}\n\nfunction evaluateFilter(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 2 || values.length > 3) return error('#VALUE!', dependencies);\n const source = toMatrix(values[0]);\n const include = toMatrix(values[1]);\n if (!source || !include) return error('#VALUE!', dependencies);\n const rowMode = include.length === source.length && include[0]?.length === 1;\n const columnMode = include.length === 1 && include[0]?.length === source[0]?.length;\n if (!rowMode && !columnMode) return error('#VALUE!', dependencies);\n if (rowMode) {\n const rows = source.filter((_row, index) => truthy(include[index]?.[0] ?? false));\n return rows.length > 0 ? ok(rows, dependencies) : values[2] !== undefined ? ok(toMatrix(values[2])!, dependencies) : error('#CALC!', dependencies);\n }\n const columns = source[0]?.map((_value, column) => column).filter((column) => truthy(include[0]?.[column] ?? false)) ?? [];\n if (columns.length === 0) return values[2] !== undefined ? ok(toMatrix(values[2])!, dependencies) : error('#CALC!', dependencies);\n return ok(source.map((row) => columns.map((column) => row[column] ?? null)), dependencies);\n}\n\nfunction evaluateSort(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 1 || values.length > 4) return error('#VALUE!', dependencies);\n const source = toMatrix(values[0]);\n const sortIndex = toNumber(values[1] ?? 1);\n const sortOrder = toNumber(values[2] ?? 1);\n const byColumn = truthy(values[3] ?? false);\n if (!source || sortIndex === null || sortOrder === null || ![1, -1].includes(Math.trunc(sortOrder))) return error('#VALUE!', dependencies);\n const index = Math.trunc(sortIndex) - 1;\n if (byColumn) {\n if (index < 0 || index >= source.length) return error('#VALUE!', dependencies);\n const columns = Array.from({ length: source[0]?.length ?? 0 }, (_, column) => column);\n columns.sort((left, right) => compareForSort(source[index]?.[left] ?? null, source[index]?.[right] ?? null) * Math.trunc(sortOrder));\n return ok(source.map((row) => columns.map((column) => row[column] ?? null)), dependencies);\n }\n if (index < 0 || index >= (source[0]?.length ?? 0)) return error('#VALUE!', dependencies);\n const rows = source.map((_row, row) => row);\n rows.sort((left, right) => compareForSort(source[left]?.[index] ?? null, source[right]?.[index] ?? null) * Math.trunc(sortOrder));\n return ok(rows.map((row) => [...source[row]!]), dependencies);\n}\n\nfunction evaluateUnique(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 1 || values.length > 3) return error('#VALUE!', dependencies);\n const source = toMatrix(values[0]);\n if (!source) return error('#VALUE!', dependencies);\n const byColumn = truthy(values[1] ?? false);\n const exactlyOnce = truthy(values[2] ?? false);\n const items = byColumn\n ? (source[0] ?? []).map((_value, column) => source.map((row) => row[column] ?? null))\n : source.map((row) => [...row]);\n const keys = items.map((item) => JSON.stringify(item));\n const counts = new Map<string, number>();\n keys.forEach((key) => counts.set(key, (counts.get(key) ?? 0) + 1));\n const uniqueItems = items.filter((item, index) => {\n const first = keys.indexOf(keys[index]!);\n return first === index && (!exactlyOnce || counts.get(keys[index]!) === 1);\n });\n if (byColumn) {\n return ok(uniqueItems[0]?.map((_value, row) => uniqueItems.map((item) => item[row] ?? null)) ?? [], dependencies);\n }\n return ok(uniqueItems, dependencies);\n}\n\nfunction evaluateSequence(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 1 || values.length > 4) return error('#VALUE!', dependencies);\n const rows = toNumber(values[0] ?? null);\n const columns = toNumber(values[1] ?? 1);\n const start = toNumber(values[2] ?? 1);\n const step = toNumber(values[3] ?? 1);\n if (rows === null || columns === null || start === null || step === null || rows < 1 || columns < 1 || !Number.isInteger(rows) || !Number.isInteger(columns)) return error('#VALUE!', dependencies);\n return ok(Array.from({ length: Math.trunc(rows) }, (_row, row) =>\n Array.from({ length: Math.trunc(columns) }, (_column, column) => start + (row * Math.trunc(columns) + column) * step)), dependencies);\n}\n\nfunction compareForSort(left: SpreadsheetFormulaScalar, right: SpreadsheetFormulaScalar): number {\n if (compareValues(left, right, '=')) return 0;\n return compareValues(left, right, '<') ? -1 : 1;\n}\n\nfunction evaluateSortBy(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 3 || values.length % 2 === 0) return error('#VALUE!', dependencies);\n const source = toMatrix(values[0]);\n if (!source) return error('#VALUE!', dependencies);\n const rowCount = source.length;\n const columnCount = source[0]?.length ?? 0;\n const keys = [] as { values: SpreadsheetFormulaScalar[]; order: number }[];\n for (let index = 1; index < values.length; index += 2) {\n const keyMatrix = toMatrix(values[index]);\n const order = toNumber(values[index + 1] ?? 1);\n if (!keyMatrix || order === null || ![1, -1].includes(Math.trunc(order))) return error('#VALUE!', dependencies);\n const rowKey = keyMatrix.length === rowCount && keyMatrix.every((row) => row.length === 1);\n const columnKey = keyMatrix.length === 1 && keyMatrix[0]!.length === columnCount;\n if (!rowKey && !columnKey) return error('#VALUE!', dependencies);\n keys.push({\n values: rowKey ? keyMatrix.map((row) => row[0] ?? null) : keyMatrix[0]!.slice(),\n order: Math.trunc(order),\n });\n }\n const rowMode = keys[0]!.values.length === rowCount;\n const positions = Array.from({ length: rowMode ? rowCount : columnCount }, (_, index) => index);\n positions.sort((left, right) => {\n for (const key of keys) {\n const comparison = compareForSort(key.values[left] ?? null, key.values[right] ?? null) * key.order;\n if (comparison !== 0) return comparison;\n }\n return left - right;\n });\n return ok(rowMode\n ? positions.map((row) => [...source[row]!])\n : source.map((row) => positions.map((column) => row[column] ?? null)), dependencies);\n}\n\nfunction evaluateTakeDrop(\n name: 'TAKE' | 'DROP',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 2 || values.length > 3) return error('#VALUE!', dependencies);\n const source = toMatrix(values[0]);\n const rowCount = toNumber(values[1] ?? null);\n const columnCount = values[2] === undefined ? null : toNumber(values[2]);\n if (!source || rowCount === null || columnCount === null && values[2] !== undefined) return error('#VALUE!', dependencies);\n const rows = sliceMatrix(name, source, Math.trunc(rowCount), 0);\n if (!rows.length) return error('#CALC!', dependencies);\n if (columnCount === null) return ok(rows, dependencies);\n const columns = sliceMatrix(name, rows, Math.trunc(columnCount), 1);\n return columns.length && columns[0]!.length ? ok(columns, dependencies) : error('#CALC!', dependencies);\n}\n\nfunction sliceMatrix(\n name: 'TAKE' | 'DROP',\n source: SpreadsheetFormulaScalar[][],\n count: number,\n axis: 0 | 1,\n): SpreadsheetFormulaScalar[][] {\n const size = axis === 0 ? source.length : source[0]?.length ?? 0;\n if (count === 0 || Math.abs(count) > size) return [];\n const start = name === 'TAKE'\n ? count > 0 ? 0 : size + count\n : count > 0 ? count : 0;\n const end = name === 'TAKE'\n ? count > 0 ? count : size\n : count > 0 ? size : size + count;\n if (axis === 0) return source.slice(start, end).map((row) => [...row]);\n return source.map((row) => row.slice(start, end));\n}\n\nfunction evaluateChooseAxis(\n axis: 'rows' | 'columns',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 2) return error('#VALUE!', dependencies);\n const source = toMatrix(values[0]);\n if (!source) return error('#VALUE!', dependencies);\n const size = axis === 'rows' ? source.length : source[0]?.length ?? 0;\n const indexes: number[] = [];\n for (const value of values.slice(1)) {\n const index = toNumber(value);\n if (index === null || !Number.isInteger(index) || index === 0) return error('#VALUE!', dependencies);\n const normalized = index > 0 ? index - 1 : size + index;\n if (normalized < 0 || normalized >= size) return error('#VALUE!', dependencies);\n indexes.push(normalized);\n }\n if (axis === 'rows') return ok(indexes.map((row) => [...source[row]!]), dependencies);\n return ok(source.map((row) => indexes.map((column) => row[column] ?? null)), dependencies);\n}\n\nfunction evaluateToLine(\n axis: 'row' | 'column',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n if (values.length < 1 || values.length > 3) return error('#VALUE!', dependencies);\n const source = toMatrix(values[0]);\n const ignore = toNumber(values[1] ?? 0);\n const scanByColumn = truthy(values[2] ?? false);\n if (!source || ignore === null || ![0, 1, 2, 3].includes(Math.trunc(ignore))) return error('#VALUE!', dependencies);\n const flattened: SpreadsheetFormulaScalar[] = [];\n if (scanByColumn) {\n for (let column = 0; column < (source[0]?.length ?? 0); column++) {\n for (const row of source) flattened.push(row[column] ?? null);\n }\n } else {\n for (const row of source) flattened.push(...row);\n }\n const filtered = flattened.filter((value) => {\n const blank = value === null || value === '';\n return ignore === 0 || (ignore === 1 && !blank) || (ignore === 2) || (ignore === 3 && !blank);\n });\n return ok(axis === 'column' ? filtered.map((value) => [value]) : [filtered], dependencies);\n}\n\nfunction evaluateConditionalAggregate(\n name: 'SUMIF' | 'COUNTIF' | 'AVERAGEIF',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const criteriaRange = toMatrix(values[0]);\n const criteria = values[1];\n if (!criteriaRange || criteria === undefined) return error('#VALUE!', dependencies);\n const sumRange = toMatrix(name === 'COUNTIF' ? values[0] : (values[2] ?? values[0]));\n if (!sumRange || !sameShape(criteriaRange, sumRange)) return error('#VALUE!', dependencies);\n const matched: SpreadsheetFormulaScalar[] = [];\n forEachMatrix(criteriaRange, (criteriaValue, row, column) => {\n if (matchesCriteria(criteriaValue, criteria)) matched.push(sumRange[row]?.[column] ?? null);\n });\n if (name === 'COUNTIF') return ok(matched.length, dependencies);\n const numbers = numericValues(matched);\n if (name === 'SUMIF') return ok(numbers.reduce((sum, value) => sum + value, 0), dependencies);\n return numbers.length === 0\n ? error('#DIV/0!', dependencies)\n : ok(numbers.reduce((sum, value) => sum + value, 0) / numbers.length, dependencies);\n}\n\nfunction evaluateMultiConditionalAggregate(\n name: 'SUMIFS' | 'COUNTIFS' | 'AVERAGEIFS' | 'MAXIFS' | 'MINIFS',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const valueRange = toMatrix(values[0]);\n if (!valueRange || values.length < 3) return error('#VALUE!', dependencies);\n const criteriaPairs = name === 'COUNTIFS' ? values : values.slice(1);\n if (criteriaPairs.length % 2 !== 0) return error('#VALUE!', dependencies);\n const pairs: { range: SpreadsheetFormulaScalar[][]; criteria: SpreadsheetFormulaValue }[] = [];\n for (let index = 0; index < criteriaPairs.length; index += 2) {\n const range = toMatrix(criteriaPairs[index]);\n const criteria = criteriaPairs[index + 1];\n if (!range || criteria === undefined || !sameShape(valueRange, range)) return error('#VALUE!', dependencies);\n pairs.push({ range, criteria });\n }\n const matched: SpreadsheetFormulaScalar[] = [];\n forEachMatrix(valueRange, (value, row, column) => {\n if (pairs.every((pair) => matchesCriteria(pair.range[row]?.[column] ?? null, pair.criteria))) {\n matched.push(value);\n }\n });\n if (name === 'COUNTIFS') return ok(matched.length, dependencies);\n const numbers = numericValues(matched);\n if (name === 'MAXIFS') return ok(numbers.length ? Math.max(...numbers) : 0, dependencies);\n if (name === 'MINIFS') return ok(numbers.length ? Math.min(...numbers) : 0, dependencies);\n if (name === 'SUMIFS') return ok(numbers.reduce((sum, value) => sum + value, 0), dependencies);\n return numbers.length === 0\n ? error('#DIV/0!', dependencies)\n : ok(numbers.reduce((sum, value) => sum + value, 0) / numbers.length, dependencies);\n}\n\nfunction evaluateLookup(\n name: 'VLOOKUP' | 'HLOOKUP',\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const lookupValue = values[0];\n const table = toMatrix(values[1]);\n const index = toNumber(values[2] ?? null);\n const approximate = values.length >= 4 ? truthy(values[3]!) : true;\n if (!table || index === null || index < 1 || approximate) return error(approximate ? '#N/A' : '#VALUE!', dependencies);\n const targetIndex = Math.trunc(index) - 1;\n if (name === 'VLOOKUP') {\n if (targetIndex >= (table[0]?.length ?? 0)) return error('#REF!', dependencies);\n const row = table.find((item) => compareValues(item[0] ?? null, lookupValue ?? null, '='));\n return row ? ok(row[targetIndex] ?? null, dependencies) : error('#N/A', dependencies);\n }\n if (targetIndex >= table.length) return error('#REF!', dependencies);\n const column = table[0]?.findIndex((value) => compareValues(value, lookupValue ?? null, '=')) ?? -1;\n return column >= 0 ? ok(table[targetIndex]?.[column] ?? null, dependencies) : error('#N/A', dependencies);\n}\n\nfunction evaluateIndex(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const matrix = toMatrix(values[0]);\n const row = toNumber(values[1] ?? 1);\n const column = toNumber(values[2] ?? 1);\n if (!matrix || row === null || column === null || row < 1 || column < 1) return error('#VALUE!', dependencies);\n const value = matrix[Math.trunc(row) - 1]?.[Math.trunc(column) - 1];\n return value === undefined ? error('#REF!', dependencies) : ok(value, dependencies);\n}\n\nfunction evaluateMatch(\n values: SpreadsheetFormulaValue[],\n dependencies: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaEvaluation {\n const lookupValue = values[0];\n const matrix = toMatrix(values[1]);\n const matchType = toNumber(values[2] ?? 1);\n if (!matrix || matchType === null || matchType !== 0) return error('#N/A', dependencies);\n const vector = matrix.length === 1 ? matrix[0]! : matrix.map((row) => row[0] ?? null);\n const index = vector.findIndex((value) => compareValues(value, lookupValue ?? null, '='));\n return index >= 0 ? ok(index + 1, dependencies) : error('#N/A', dependencies);\n}\n\nfunction ok(\n value: SpreadsheetFormulaValue,\n dependencies: SpreadsheetFormulaReference[] = [],\n): SpreadsheetFormulaEvaluation {\n return { value, error: null, dependencies };\n}\n\nfunction error(\n value: SpreadsheetFormulaError,\n dependencies: SpreadsheetFormulaReference[] = [],\n): SpreadsheetFormulaEvaluation {\n return { value: null, error: value, dependencies };\n}\n\nfunction numericValues(values: SpreadsheetFormulaValue[]): number[] {\n return flatten(values)\n .map((value) => toNumber(value))\n .filter((value): value is number => value !== null);\n}\n\nfunction toMatrix(value: SpreadsheetFormulaValue | undefined): SpreadsheetFormulaScalar[][] | null {\n if (value === undefined) return null;\n return Array.isArray(value) ? value : [[value]];\n}\n\nfunction sameShape(\n left: SpreadsheetFormulaScalar[][],\n right: SpreadsheetFormulaScalar[][],\n): boolean {\n return left.length === right.length && left.every((row, index) => row.length === (right[index]?.length ?? -1));\n}\n\nfunction forEachMatrix(\n matrix: SpreadsheetFormulaScalar[][],\n visit: (value: SpreadsheetFormulaScalar, row: number, column: number) => void,\n): void {\n for (let row = 0; row < matrix.length; row++) {\n for (let column = 0; column < matrix[row]!.length; column++) {\n visit(matrix[row]![column]!, row, column);\n }\n }\n}\n\nfunction flatten(values: SpreadsheetFormulaValue[]): SpreadsheetFormulaScalar[] {\n return values.flatMap((value) => (Array.isArray(value) ? value.flat() : [value]));\n}\n\nfunction toText(value: SpreadsheetFormulaValue): string {\n if (Array.isArray(value)) return value.flat().map((item) => toText(item)).join('');\n if (value === null) return '';\n if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE';\n return String(value);\n}\n\nfunction toNumber(value: SpreadsheetFormulaValue): number | null {\n if (Array.isArray(value)) return null;\n if (value === null || value === '') return 0;\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (typeof value === 'string') {\n const number = Number(value);\n return Number.isFinite(number) ? number : null;\n }\n return null;\n}\n\nfunction matchesCriteria(\n value: SpreadsheetFormulaScalar,\n criteria: SpreadsheetFormulaValue,\n): boolean {\n if (Array.isArray(criteria)) return false;\n if (typeof criteria !== 'string') return compareValues(value, criteria, '=');\n const match = /^(<=|>=|<>|=|<|>)(.*)$/.exec(criteria);\n if (!match) return wildcardMatches(value, criteria) ?? compareValues(value, criteria, '=');\n const operator = match[1]!;\n const rawRight = match[2]!;\n const numericRight = Number(rawRight);\n const right: SpreadsheetFormulaScalar = rawRight !== '' && Number.isFinite(numericRight) ? numericRight : rawRight;\n if (operator === '=' || operator === '<>') {\n const wildcard = wildcardMatches(value, rawRight);\n if (wildcard !== null) return operator === '=' ? wildcard : !wildcard;\n }\n return compareValues(value, right, operator);\n}\n\nfunction wildcardMatches(value: SpreadsheetFormulaScalar, criteria: string): boolean | null {\n if (!criteria.includes('*') && !criteria.includes('?')) return null;\n let pattern = '';\n for (let index = 0; index < criteria.length; index++) {\n const char = criteria[index]!;\n if (char === '~' && index + 1 < criteria.length) {\n pattern += escapeRegex(criteria[++index]!);\n } else if (char === '*') {\n pattern += '.*';\n } else if (char === '?') {\n pattern += '.';\n } else {\n pattern += escapeRegex(char);\n }\n }\n return new RegExp(`^${pattern}$`, 'i').test(toText(value));\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction truthy(value: SpreadsheetFormulaValue): boolean {\n if (Array.isArray(value)) return value.flat().some(truthy);\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value !== 0;\n if (typeof value === 'string') return value.length > 0;\n return false;\n}\n\nfunction compareValues(\n left: SpreadsheetFormulaValue,\n right: SpreadsheetFormulaValue,\n operator: string,\n): boolean {\n const leftNumber = toNumber(left);\n const rightNumber = toNumber(right);\n const comparableLeft = leftNumber ?? String(left ?? '');\n const comparableRight = rightNumber ?? String(right ?? '');\n switch (operator) {\n case '=':\n return comparableLeft === comparableRight;\n case '<>':\n return comparableLeft !== comparableRight;\n case '>':\n return comparableLeft > comparableRight;\n case '>=':\n return comparableLeft >= comparableRight;\n case '<':\n return comparableLeft < comparableRight;\n case '<=':\n return comparableLeft <= comparableRight;\n default:\n return false;\n }\n}\n\nconst MS_PER_DAY = 86_400_000;\n\ninterface FormulaDateParts {\n year: number;\n month: number;\n day: number;\n time: number;\n}\n\nfunction toDateParts(value: SpreadsheetFormulaValue | undefined): FormulaDateParts | null {\n if (Array.isArray(value) || value === null || value === '') return null;\n if (typeof value === 'number' && Number.isFinite(value)) {\n const time = Date.UTC(1899, 11, 30) + value * MS_PER_DAY;\n return datePartsFromTime(time);\n }\n if (typeof value !== 'string') return null;\n const match = /^\\s*(\\d{4})[-\\/.](\\d{1,2})[-\\/.](\\d{1,2})\\s*$/.exec(value);\n const time = match\n ? Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]))\n : Date.parse(value);\n return Number.isFinite(time) ? datePartsFromTime(time) : null;\n}\n\nfunction datePartsFromTime(time: number): FormulaDateParts | null {\n const date = new Date(time);\n if (!Number.isFinite(date.getTime())) return null;\n return { year: date.getUTCFullYear(), month: date.getUTCMonth() + 1, day: date.getUTCDate(), time };\n}\n\nfunction excelSerialFromDate(date: Date): number {\n const utcMidnight = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate());\n return Math.floor((utcMidnight - Date.UTC(1899, 11, 30)) / MS_PER_DAY);\n}\n","import { formatCellAddress, parseCellAddress } from '../address.js';\nimport type { SpreadsheetFormulaAst, SpreadsheetFormulaReference } from './types.js';\n\ntype Token =\n | { kind: 'number'; value: number }\n | { kind: 'string'; value: string }\n | { kind: 'identifier'; value: string }\n | { kind: 'cell'; value: string; sheetName?: string }\n | { kind: 'operator'; value: string }\n | { kind: 'paren'; value: '(' | ')' }\n | { kind: 'comma'; value: ',' }\n | { kind: 'colon'; value: ':' }\n | { kind: 'eof' };\n\nexport function parseSpreadsheetFormula(formula: string): SpreadsheetFormulaAst {\n const parser = new FormulaParser(tokenizeFormula(stripFormulaPrefix(formula)));\n return parser.parse();\n}\n\nexport function collectSpreadsheetFormulaReferences(\n formula: string,\n): SpreadsheetFormulaReference[] {\n const references: SpreadsheetFormulaReference[] = [];\n try {\n collectReferences(parseSpreadsheetFormula(formula), references);\n } catch {\n return [];\n }\n return dedupeReferences(references);\n}\n\nfunction collectReferences(\n ast: SpreadsheetFormulaAst,\n output: SpreadsheetFormulaReference[],\n): void {\n switch (ast.kind) {\n case 'cell':\n output.push({ kind: 'cell', address: ast.address, sheetName: ast.sheetName });\n return;\n case 'range':\n output.push({\n kind: 'range',\n startAddress: ast.startAddress,\n endAddress: ast.endAddress,\n sheetName: ast.sheetName,\n });\n return;\n case 'unary':\n collectReferences(ast.argument, output);\n return;\n case 'binary':\n collectReferences(ast.left, output);\n collectReferences(ast.right, output);\n return;\n case 'call':\n ast.args.forEach((arg) => collectReferences(arg, output));\n return;\n case 'number':\n case 'string':\n case 'name':\n return;\n }\n}\n\nfunction dedupeReferences(\n references: SpreadsheetFormulaReference[],\n): SpreadsheetFormulaReference[] {\n const seen = new Set<string>();\n return references.filter((reference) => {\n const key =\n reference.kind === 'cell'\n ? `cell:${reference.sheetName ?? ''}:${reference.address}`\n : `range:${reference.sheetName ?? ''}:${reference.startAddress}:${reference.endAddress}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nfunction stripFormulaPrefix(formula: string): string {\n return formula.trim().startsWith('=') ? formula.trim().slice(1) : formula.trim();\n}\n\nfunction tokenizeFormula(input: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n while (index < input.length) {\n const ch = input[index]!;\n if (/\\s/.test(ch)) {\n index++;\n continue;\n }\n if (/\\d/.test(ch) || (ch === '.' && /\\d/.test(input[index + 1] ?? ''))) {\n const start = index;\n index++;\n while (index < input.length && /[\\d.]/.test(input[index]!)) index++;\n const value = Number(input.slice(start, index));\n if (!Number.isFinite(value)) throw new Error('Invalid number literal');\n tokens.push({ kind: 'number', value });\n continue;\n }\n if (ch === '\"') {\n let value = '';\n index++;\n while (index < input.length) {\n const next = input[index]!;\n if (next === '\"') {\n if (input[index + 1] === '\"') {\n value += '\"';\n index += 2;\n continue;\n }\n index++;\n break;\n }\n value += next;\n index++;\n }\n tokens.push({ kind: 'string', value });\n continue;\n }\n if (ch === \"'\") {\n const sheetStart = index + 1;\n let sheetName = '';\n index = sheetStart;\n while (index < input.length) {\n if (input[index] === \"'\") {\n if (input[index + 1] === \"'\") {\n sheetName += \"'\";\n index += 2;\n continue;\n }\n break;\n }\n sheetName += input[index]!;\n index++;\n }\n if (input[index] !== \"'\" || input[index + 1] !== '!') throw new Error('Invalid sheet reference');\n index += 2;\n const start = index;\n while (index < input.length && /[A-Za-z0-9_$]/.test(input[index]!)) index++;\n const cell = normalizeCellReference(input.slice(start, index));\n if (!cell) throw new Error('Invalid sheet cell reference');\n tokens.push({ kind: 'cell', value: cell, sheetName });\n continue;\n }\n if (ch === '(' || ch === ')') {\n tokens.push({ kind: 'paren', value: ch });\n index++;\n continue;\n }\n if (ch === ',') {\n tokens.push({ kind: 'comma', value: ch });\n index++;\n continue;\n }\n if (ch === ':') {\n tokens.push({ kind: 'colon', value: ch });\n index++;\n continue;\n }\n const twoChar = input.slice(index, index + 2);\n if (twoChar === '>=' || twoChar === '<=' || twoChar === '<>') {\n tokens.push({ kind: 'operator', value: twoChar });\n index += 2;\n continue;\n }\n if ('+-*/&%=><'.includes(ch)) {\n tokens.push({ kind: 'operator', value: ch });\n index++;\n continue;\n }\n if (/[A-Za-z_$]/.test(ch)) {\n const start = index;\n index++;\n while (index < input.length && /[A-Za-z0-9_$.]/.test(input[index]!)) index++;\n const raw = input.slice(start, index);\n if (input[index] === '!') {\n index++;\n const cellStart = index;\n while (index < input.length && /[A-Za-z0-9_$]/.test(input[index]!)) index++;\n const cell = normalizeCellReference(input.slice(cellStart, index));\n if (!cell) throw new Error('Invalid sheet cell reference');\n tokens.push({ kind: 'cell', value: cell, sheetName: raw });\n continue;\n }\n const cell = normalizeCellReference(raw);\n tokens.push(cell ? { kind: 'cell', value: cell } : { kind: 'identifier', value: raw });\n continue;\n }\n throw new Error(`Unexpected token: ${ch}`);\n }\n tokens.push({ kind: 'eof' });\n return tokens;\n}\n\nclass FormulaParser {\n private index = 0;\n\n constructor(private readonly tokens: Token[]) {}\n\n parse(): SpreadsheetFormulaAst {\n const expression = this.parseComparison();\n this.expect('eof');\n return expression;\n }\n\n private parseComparison(): SpreadsheetFormulaAst {\n let left = this.parseConcatenation();\n while (this.isOperator('=', '<>', '>', '>=', '<', '<=')) {\n const operator = this.advanceOperator() as '=' | '<>' | '>' | '>=' | '<' | '<=';\n left = { kind: 'binary', operator, left, right: this.parseConcatenation() };\n }\n return left;\n }\n\n private parseConcatenation(): SpreadsheetFormulaAst {\n let left = this.parseAdditive();\n while (this.isOperator('&')) {\n this.advanceOperator();\n left = { kind: 'binary', operator: '&', left, right: this.parseAdditive() };\n }\n return left;\n }\n\n private parseAdditive(): SpreadsheetFormulaAst {\n let left = this.parseMultiplicative();\n while (this.isOperator('+', '-')) {\n const operator = this.advanceOperator() as '+' | '-';\n left = { kind: 'binary', operator, left, right: this.parseMultiplicative() };\n }\n return left;\n }\n\n private parseMultiplicative(): SpreadsheetFormulaAst {\n let left = this.parseUnary();\n while (this.isOperator('*', '/')) {\n const operator = this.advanceOperator() as '*' | '/';\n left = { kind: 'binary', operator, left, right: this.parseUnary() };\n }\n return left;\n }\n\n private parseUnary(): SpreadsheetFormulaAst {\n if (this.isOperator('+', '-')) {\n const operator = this.advanceOperator() as '+' | '-';\n return { kind: 'unary', operator, argument: this.parseUnary() };\n }\n return this.parsePostfix();\n }\n\n private parsePostfix(): SpreadsheetFormulaAst {\n let expression = this.parsePrimary();\n while (this.isOperator('%')) {\n this.advanceOperator();\n expression = { kind: 'unary', operator: '%', argument: expression };\n }\n return expression;\n }\n\n private parsePrimary(): SpreadsheetFormulaAst {\n const token = this.advance();\n if (token.kind === 'number') return { kind: 'number', value: token.value };\n if (token.kind === 'string') return { kind: 'string', value: token.value };\n if (token.kind === 'cell') {\n if (this.peek().kind === 'colon') {\n this.advance();\n const end = this.advance();\n if (end.kind !== 'cell') throw new Error('Range reference must end with a cell');\n if (end.sheetName && end.sheetName !== token.sheetName) throw new Error('Range sheets must match');\n return {\n kind: 'range',\n startAddress: token.value,\n endAddress: end.value,\n sheetName: token.sheetName,\n };\n }\n return { kind: 'cell', address: token.value, sheetName: token.sheetName };\n }\n if (token.kind === 'identifier') {\n return this.isParen('(') ? this.parseCall(token.value) : { kind: 'name', name: token.value };\n }\n if (token.kind === 'paren' && token.value === '(') {\n const expression = this.parseComparison();\n this.expect('paren', ')');\n return expression;\n }\n throw new Error('Expected expression');\n }\n\n private parseCall(name: string): SpreadsheetFormulaAst {\n this.expect('paren', '(');\n const args: SpreadsheetFormulaAst[] = [];\n if (!this.isParen(')')) {\n do {\n args.push(this.parseComparison());\n } while (this.consume('comma'));\n }\n this.expect('paren', ')');\n return { kind: 'call', name: name.toUpperCase(), args };\n }\n\n private isOperator(...operators: string[]): boolean {\n const token = this.peek();\n return token.kind === 'operator' && operators.includes(token.value);\n }\n\n private isParen(value: '(' | ')'): boolean {\n const token = this.peek();\n return token.kind === 'paren' && token.value === value;\n }\n\n private advanceOperator(): string {\n const token = this.advance();\n if (token.kind !== 'operator') throw new Error('Expected operator');\n return token.value;\n }\n\n private consume(kind: Token['kind']): boolean {\n if (this.peek().kind !== kind) return false;\n this.advance();\n return true;\n }\n\n private expect(kind: Token['kind'], value?: string): Token {\n const token = this.advance();\n if (token.kind !== kind || (value !== undefined && 'value' in token && token.value !== value)) {\n throw new Error(`Expected ${kind}`);\n }\n return token;\n }\n\n private peek(): Token {\n return this.tokens[this.index] ?? { kind: 'eof' };\n }\n\n private advance(): Token {\n return this.tokens[this.index++] ?? { kind: 'eof' };\n }\n}\n\nfunction normalizeCellReference(raw: string): string | null {\n try {\n const parsed = parseCellAddress(raw.replace(/\\$/g, ''));\n return formatCellAddress(parsed.row, parsed.column);\n } catch {\n return null;\n }\n}\n","import type { ExcelCellValue } from '../model.js';\n\nexport type SpreadsheetFormulaError =\n | '#DIV/0!'\n | '#NUM!'\n | '#VALUE!'\n | '#REF!'\n | '#NAME?'\n | '#N/A'\n | '#CALC!'\n | '#SPILL!'\n | '#CYCLE!';\n\nexport type SpreadsheetFormulaScalar = ExcelCellValue | boolean;\n\nexport type SpreadsheetFormulaValue = SpreadsheetFormulaScalar | SpreadsheetFormulaScalar[][];\n\nexport interface SpreadsheetFormulaCellReference {\n kind: 'cell';\n address: string;\n sheetName?: string;\n}\n\nexport interface SpreadsheetFormulaRangeReference {\n kind: 'range';\n startAddress: string;\n endAddress: string;\n sheetName?: string;\n}\n\nexport type SpreadsheetFormulaReference =\n | SpreadsheetFormulaCellReference\n | SpreadsheetFormulaRangeReference;\n\nexport type SpreadsheetFormulaAst =\n | { kind: 'number'; value: number }\n | { kind: 'string'; value: string }\n | { kind: 'name'; name: string }\n | { kind: 'cell'; address: string; sheetName?: string }\n | { kind: 'range'; startAddress: string; endAddress: string; sheetName?: string }\n | { kind: 'unary'; operator: '+' | '-' | '%'; argument: SpreadsheetFormulaAst }\n | {\n kind: 'binary';\n operator: '+' | '-' | '*' | '/' | '&' | '=' | '<>' | '>' | '>=' | '<' | '<=';\n left: SpreadsheetFormulaAst;\n right: SpreadsheetFormulaAst;\n }\n | { kind: 'call'; name: string; args: SpreadsheetFormulaAst[] };\n\nexport interface SpreadsheetFormulaResult {\n value: SpreadsheetFormulaValue;\n displayText: string;\n error: SpreadsheetFormulaError | null;\n dependencies: SpreadsheetFormulaReference[];\n}\n\nexport function formulaError(\n error: SpreadsheetFormulaError,\n dependencies: SpreadsheetFormulaReference[] = [],\n): SpreadsheetFormulaResult {\n return {\n value: null,\n displayText: error,\n error,\n dependencies,\n };\n}\n\nexport function formulaValue(\n value: SpreadsheetFormulaValue,\n dependencies: SpreadsheetFormulaReference[] = [],\n): SpreadsheetFormulaResult {\n const displayValue = Array.isArray(value) ? value[0]?.[0] ?? null : value;\n return {\n value,\n displayText: displayValue === null ? '' : String(displayValue),\n error: null,\n dependencies,\n };\n}\n","import type { ExcelCellModel, ExcelCellValue, ExcelSheetModel } from '../model.js';\nimport { evaluateSpreadsheetFormulaAst } from './evaluator.js';\nimport { parseSpreadsheetFormula } from './parser.js';\nimport {\n formulaError,\n formulaValue,\n type SpreadsheetFormulaReference,\n type SpreadsheetFormulaError,\n type SpreadsheetFormulaResult,\n} from './types.js';\n\nexport interface SpreadsheetFormulaEngineOptions {\n /** Evaluation date used by TODAY(). Defaults to the host's current local date. */\n today?: Date;\n /** Workbook sheets used to resolve quoted cross-sheet references. */\n sheets?: readonly ExcelSheetModel[];\n}\n\nclass SpreadsheetFormulaEvaluationError extends Error {\n constructor(\n readonly formulaError: SpreadsheetFormulaError,\n readonly dependencies: SpreadsheetFormulaReference[] = [],\n ) {\n super(formulaError);\n }\n}\n\nexport class SpreadsheetFormulaEngine {\n private readonly cellsByAddress: Map<string, ExcelCellModel>;\n private readonly resultsByAddress = new Map<string, SpreadsheetFormulaResult>();\n private readonly resultsBySheetAddress = new Map<string, SpreadsheetFormulaResult>();\n private readonly dependenciesByAddress = new Map<string, SpreadsheetFormulaReference[]>();\n private readonly dependentsByAddress = new Map<string, Set<string>>();\n private readonly evaluating = new Set<string>();\n private readonly cellsBySheet = new Map<string, Map<string, ExcelCellModel>>();\n private readonly sheetsByName = new Map<string, ExcelSheetModel>();\n\n constructor(\n private readonly sheet: ExcelSheetModel,\n private readonly options: SpreadsheetFormulaEngineOptions = {},\n ) {\n this.cellsByAddress = new Map(sheet.cells.map((cell) => [cell.address, cell]));\n const sheets = options.sheets ?? [sheet];\n for (const item of sheets) {\n this.sheetsByName.set(item.name, item);\n this.cellsBySheet.set(item.name, new Map(item.cells.map((cell) => [cell.address, cell])));\n }\n }\n\n calculate(): Map<string, SpreadsheetFormulaResult> {\n for (const cell of this.sheet.cells) {\n if (cell.formula) this.evaluateFormulaCell(cell.address);\n }\n return this.withSpillResults(new Map(this.resultsByAddress));\n }\n\n recalculate(changedAddresses: Iterable<string>): Map<string, SpreadsheetFormulaResult> {\n this.calculate();\n const affected = this.getAffectedFormulaAddresses(changedAddresses);\n for (const address of affected) {\n this.resultsByAddress.delete(address);\n this.resultsBySheetAddress.delete(sheetAddressKey(this.sheet.name, address));\n this.dependenciesByAddress.delete(address);\n }\n this.rebuildDependents();\n for (const address of affected) {\n this.evaluateFormulaCell(address);\n }\n return this.withSpillResults(new Map(\n [...affected]\n .map((address) => [address, this.resultsByAddress.get(address)] as const)\n .filter((entry): entry is readonly [string, SpreadsheetFormulaResult] => entry[1] !== undefined),\n ));\n }\n\n updateCellValue(address: string, value: ExcelCellValue): Map<string, SpreadsheetFormulaResult> {\n const normalized = addressFromKey(normalizeAddressKey(address));\n const affected = new Set([\n ...this.getAffectedFormulaAddresses([normalized]),\n normalized,\n ]);\n this.setCellValue(normalized, value);\n return this.recalculateKnownAffected(affected);\n }\n\n updateCellFormula(address: string, formula: string | null): Map<string, SpreadsheetFormulaResult> {\n const normalized = addressFromKey(normalizeAddressKey(address));\n const affected = new Set([\n ...this.getAffectedFormulaAddresses([normalized]),\n normalized,\n ]);\n this.setCellFormula(normalized, formula);\n return this.recalculateKnownAffected(affected);\n }\n\n evaluateFormulaCell(address: string): SpreadsheetFormulaResult {\n return this.evaluateFormulaCellAt(this.sheet, address);\n }\n\n private evaluateFormulaCellAt(targetSheet: ExcelSheetModel, address: string): SpreadsheetFormulaResult {\n const cacheKey = sheetAddressKey(targetSheet.name, address);\n const cached = this.resultsBySheetAddress.get(cacheKey);\n if (cached) return cached;\n const cell = (targetSheet === this.sheet ? this.cellsByAddress : this.cellsBySheet.get(targetSheet.name))?.get(address);\n if (!cell?.formula) return formulaValue(cell?.value ?? null);\n if (this.evaluating.has(cacheKey)) {\n const result = formulaError('#CYCLE!');\n this.resultsBySheetAddress.set(cacheKey, result);\n return result;\n }\n this.evaluating.add(cacheKey);\n let result: SpreadsheetFormulaResult;\n try {\n const ast = parseSpreadsheetFormula(cell.formula);\n const evaluated = evaluateSpreadsheetFormulaAst(ast, {\n getToday: () => excelSerialFromDate(this.options.today ?? new Date()),\n isRowHidden: (row, sheetName) => {\n const referencedSheet = sheetName ? this.sheetsByName.get(sheetName) : targetSheet;\n return referencedSheet?.rows.find((item) => item.index === row)?.hidden === true;\n },\n getCellEvaluation: (cellAddress, sheetName) => {\n const referencedSheet = sheetName ? this.sheetsByName.get(sheetName) : targetSheet;\n const referenced = (sheetName ? this.cellsBySheet.get(sheetName) : targetSheet === this.sheet ? this.cellsByAddress : this.cellsBySheet.get(targetSheet.name))?.get(cellAddress);\n if (!referenced) return formulaValue(null);\n if (!referenced.formula) return formulaValue(referenced.value);\n return this.evaluateFormulaCellAt(referencedSheet ?? targetSheet, cellAddress);\n },\n getCellValue: (cellAddress, sheetName) => {\n const referencedSheet = sheetName ? this.sheetsByName.get(sheetName) : targetSheet;\n const referenced = (sheetName ? this.cellsBySheet.get(sheetName) : targetSheet === this.sheet ? this.cellsByAddress : this.cellsBySheet.get(targetSheet.name))?.get(cellAddress);\n if (!referenced) return null;\n if (!referenced.formula) return referenced.value;\n const nested = this.evaluateFormulaCellAt(referencedSheet ?? targetSheet, cellAddress);\n if (nested.error) {\n throw new SpreadsheetFormulaEvaluationError(nested.error, [\n { kind: 'cell', address: cellAddress },\n ...nested.dependencies,\n ]);\n }\n return Array.isArray(nested.value) ? nested.value[0]?.[0] ?? null : nested.value;\n },\n });\n result = evaluated.error\n ? formulaError(evaluated.error, evaluated.dependencies)\n : formulaValue(evaluated.value, evaluated.dependencies);\n } catch (error) {\n result =\n error instanceof SpreadsheetFormulaEvaluationError\n ? formulaError(error.formulaError, error.dependencies)\n : formulaError('#VALUE!');\n } finally {\n this.evaluating.delete(cacheKey);\n }\n this.resultsBySheetAddress.set(cacheKey, result);\n if (targetSheet === this.sheet) {\n this.resultsByAddress.set(address, result);\n this.registerDependencies(address, result.dependencies);\n }\n return result;\n }\n\n getDependencies(address: string): SpreadsheetFormulaReference[] {\n if (!this.dependenciesByAddress.has(address)) this.evaluateFormulaCell(address);\n return [...(this.dependenciesByAddress.get(address) ?? [])];\n }\n\n getDependents(address: string): string[] {\n this.calculate();\n return [...(this.dependentsByAddress.get(normalizeAddressKey(address)) ?? [])].sort(compareAddresses);\n }\n\n getAffectedFormulaAddresses(changedAddresses: Iterable<string>): string[] {\n this.calculate();\n const affected = new Set<string>();\n const queue = [...changedAddresses].map(normalizeAddressKey);\n for (let index = 0; index < queue.length; index++) {\n const address = queue[index]!;\n const dependents = this.dependentsByAddress.get(address);\n if (!dependents) continue;\n for (const dependent of dependents) {\n if (affected.has(dependent)) continue;\n affected.add(dependent);\n queue.push(normalizeAddressKey(dependent));\n }\n }\n return this.sortAffectedFormulaAddresses(affected);\n }\n\n private registerDependencies(\n formulaAddress: string,\n dependencies: SpreadsheetFormulaReference[],\n ): void {\n this.dependenciesByAddress.set(formulaAddress, dependencies);\n this.addDependentEdges(formulaAddress, dependencies);\n }\n\n private addDependentEdges(\n formulaAddress: string,\n dependencies: SpreadsheetFormulaReference[],\n ): void {\n for (const dependency of dependencies) {\n for (const address of expandDependencyAddresses(dependency)) {\n let dependents = this.dependentsByAddress.get(address);\n if (!dependents) {\n dependents = new Set<string>();\n this.dependentsByAddress.set(address, dependents);\n }\n dependents.add(formulaAddress);\n }\n }\n }\n\n private rebuildDependents(): void {\n this.dependentsByAddress.clear();\n for (const [address, dependencies] of this.dependenciesByAddress) {\n this.addDependentEdges(address, dependencies);\n }\n }\n\n private recalculateKnownAffected(\n affected: Set<string>,\n ): Map<string, SpreadsheetFormulaResult> {\n this.clearCalculationState();\n this.calculate();\n const sorted = this.sortAffectedFormulaAddresses(\n new Set([...affected].filter((address) => this.cellsByAddress.get(address)?.formula)),\n );\n return this.withSpillResults(new Map(\n sorted\n .map((address) => [address, this.resultsByAddress.get(address)] as const)\n .filter((entry): entry is readonly [string, SpreadsheetFormulaResult] => entry[1] !== undefined),\n ));\n }\n\n private clearCalculationState(): void {\n this.resultsByAddress.clear();\n this.resultsBySheetAddress.clear();\n this.dependenciesByAddress.clear();\n this.dependentsByAddress.clear();\n this.evaluating.clear();\n }\n\n private withSpillResults(results: Map<string, SpreadsheetFormulaResult>): Map<string, SpreadsheetFormulaResult> {\n const occupiedSpillCells = new Set<string>();\n for (const cell of this.sheet.cells) {\n if (!cell.formula) continue;\n const result = results.get(cell.address);\n if (!result || result.error || !Array.isArray(result.value)) continue;\n const array = result.value;\n const occupied = new Set(this.sheet.cells.filter((item) => item.address !== cell.address && (item.formula || item.value !== null)).map((item) => `${item.row}:${item.column}`));\n const hasConflict = array.some((row, rowOffset) => row.some((_value, columnOffset) => {\n const key = `${cell.row + rowOffset}:${cell.column + columnOffset}`;\n return occupied.has(key) || occupiedSpillCells.has(key);\n }));\n if (hasConflict) {\n results.set(cell.address, formulaError('#SPILL!', result.dependencies));\n continue;\n }\n for (let rowOffset = 0; rowOffset < array.length; rowOffset++) {\n for (let columnOffset = 0; columnOffset < (array[rowOffset]?.length ?? 0); columnOffset++) {\n if (rowOffset === 0 && columnOffset === 0) continue;\n const address = addressFromRowColumn(cell.row + rowOffset, cell.column + columnOffset);\n occupiedSpillCells.add(`${cell.row + rowOffset}:${cell.column + columnOffset}`);\n results.set(address, formulaValue(array[rowOffset]?.[columnOffset] ?? null, [{ kind: 'cell', address: cell.address }]));\n }\n }\n }\n return results;\n }\n\n private setCellValue(address: string, value: ExcelCellValue): void {\n if (value === null) {\n this.deleteCell(address);\n return;\n }\n const cell = this.ensureCell(address);\n cell.value = value;\n cell.kind =\n typeof value === 'boolean' ? 'boolean' : typeof value === 'number' ? 'number' : 'string';\n delete cell.formula;\n delete cell.rawValue;\n delete cell.dataType;\n delete cell.sharedStringIndex;\n }\n\n private setCellFormula(address: string, formula: string | null): void {\n if (formula === null) {\n this.deleteCell(address);\n return;\n }\n const cell = this.ensureCell(address);\n cell.kind = 'formula';\n cell.formula = formula.startsWith('=') ? formula.slice(1) : formula;\n cell.value = null;\n delete cell.rawValue;\n delete cell.dataType;\n delete cell.sharedStringIndex;\n }\n\n private ensureCell(address: string): ExcelCellModel {\n const existing = this.cellsByAddress.get(address);\n if (existing) return existing;\n const parsed = parseAddress(address);\n const cell: ExcelCellModel = {\n address,\n row: parsed.row,\n column: parsed.column,\n kind: 'blank',\n value: null,\n };\n this.sheet.cells.push(cell);\n this.sheet.cells.sort((left, right) => left.row - right.row || left.column - right.column);\n this.cellsByAddress.set(address, cell);\n return cell;\n }\n\n private deleteCell(address: string): void {\n const cell = this.cellsByAddress.get(address);\n if (!cell) return;\n this.cellsByAddress.delete(address);\n const index = this.sheet.cells.indexOf(cell);\n if (index !== -1) this.sheet.cells.splice(index, 1);\n }\n\n private sortAffectedFormulaAddresses(affected: Set<string>): string[] {\n const remaining = new Set(affected);\n const sorted: string[] = [];\n while (remaining.size > 0) {\n const ready = [...remaining]\n .filter((address) => {\n const dependencies = this.dependenciesByAddress.get(address) ?? [];\n return !dependencies.some((dependency) =>\n expandDependencyAddresses(dependency).some((dependencyAddress) =>\n remaining.has(addressFromKey(dependencyAddress)),\n ),\n );\n })\n .sort(compareAddresses);\n if (ready.length === 0) {\n sorted.push(...[...remaining].sort(compareAddresses));\n break;\n }\n for (const address of ready) {\n remaining.delete(address);\n sorted.push(address);\n }\n }\n return sorted;\n }\n}\n\nfunction sheetAddressKey(sheetName: string, address: string): string {\n return `${sheetName}\\u0000${address}`;\n}\n\nfunction addressFromRowColumn(row: number, column: number): string {\n return `${columnIndexToName(column)}${row}`;\n}\n\nexport function calculateSpreadsheetSheetFormulas(\n sheet: ExcelSheetModel,\n options: SpreadsheetFormulaEngineOptions = {},\n): Map<string, SpreadsheetFormulaResult> {\n return new SpreadsheetFormulaEngine(sheet, options).calculate();\n}\n\nfunction excelSerialFromDate(date: Date): number {\n const utcMidnight = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate());\n return Math.floor((utcMidnight - Date.UTC(1899, 11, 30)) / 86_400_000);\n}\n\nfunction expandDependencyAddresses(dependency: SpreadsheetFormulaReference): string[] {\n if (dependency.kind === 'cell') return [normalizeAddressKey(dependency.address)];\n const start = parseAddress(dependency.startAddress);\n const end = parseAddress(dependency.endAddress);\n const addresses: string[] = [];\n for (let row = Math.min(start.row, end.row); row <= Math.max(start.row, end.row); row++) {\n for (\n let column = Math.min(start.column, end.column);\n column <= Math.max(start.column, end.column);\n column++\n ) {\n addresses.push(`${row}:${column}`);\n }\n }\n return addresses;\n}\n\nfunction normalizeAddressKey(address: string): string {\n const parsed = parseAddress(address);\n return `${parsed.row}:${parsed.column}`;\n}\n\nfunction addressFromKey(key: string): string {\n const [row, column] = key.split(':').map(Number);\n if (!row || !column) return key;\n return `${columnIndexToName(column)}${row}`;\n}\n\nfunction parseAddress(address: string): { row: number; column: number } {\n const match = /^\\$?([A-Za-z]+)\\$?(\\d+)$/.exec(address.trim());\n if (!match) return { row: 0, column: 0 };\n return {\n row: Number(match[2]),\n column: columnNameToIndex(match[1]!),\n };\n}\n\nfunction columnNameToIndex(columnName: string): number {\n let value = 0;\n for (const ch of columnName.toUpperCase()) value = value * 26 + (ch.charCodeAt(0) - 64);\n return value;\n}\n\nfunction columnIndexToName(columnIndex: number): string {\n let value = columnIndex;\n let name = '';\n while (value > 0) {\n const remainder = (value - 1) % 26;\n name = String.fromCharCode(65 + remainder) + name;\n value = Math.floor((value - 1) / 26);\n }\n return name;\n}\n\nfunction compareAddresses(left: string, right: string): number {\n const leftRef = parseAddress(left);\n const rightRef = parseAddress(right);\n return leftRef.row - rightRef.row || leftRef.column - rightRef.column || left.localeCompare(right);\n}\n\nexport * from './types.js';\nexport * from './parser.js';\nexport * from './evaluator.js';\n","import type { ExcelCellModel, ExcelSheetModel, ExcelStylesModel, ExcelWorkbookModel } from './model.js';\n\nexport type ExcelWritebackStrategy =\n | 'no-op'\n | 'workbook-package-replace'\n | 'sheet-shadow-replace'\n | 'diff-patch'\n | 'unsupported';\n\nexport type ExcelWritebackPreference = 'auto' | 'package' | 'sheet-shadow' | 'diff';\n\nexport interface ExcelWritebackCapabilities {\n /**\n * Host can replace the currently-open workbook with a full xlsx package in place.\n * This is usually desktop/file-system territory, not Office/WPS/ONLYOFFICE plugin mode.\n */\n canReplaceWorkbookPackage?: boolean;\n /** Host can insert sheets from a generated workbook package or shadow workbook. */\n canInsertShadowSheets?: boolean;\n /** Host can copy sheet/range content from a shadow sheet into an existing sheet. */\n canCopySheetContent?: boolean;\n /** Host can delete temporary or existing sheets. */\n canDeleteSheet?: boolean;\n /** Host can rename sheets. */\n canRenameSheet?: boolean;\n /** Host can patch cell values/formulas directly through live object calls. */\n canPatchCells?: boolean;\n /** Host can patch non-cell sheet objects such as tables, drawings, comments, validations, and formats. */\n canPatchSheetObjects?: boolean;\n /** Upper bound for live cell patch operations before planner should prefer sheet/package replacement. */\n maxCellPatchCount?: number;\n}\n\nexport interface ExcelWritebackPlanOptions {\n preference?: ExcelWritebackPreference;\n}\n\nexport type ExcelWorkbookDiffKind = 'added' | 'deleted' | 'renamed' | 'modified';\n\nexport type ExcelCellDiffKind = 'added' | 'deleted' | 'modified';\n\nexport interface ExcelCellDiff {\n kind: ExcelCellDiffKind;\n address: string;\n before?: ExcelCellModel;\n after?: ExcelCellModel;\n}\n\nexport interface ExcelSheetDiff {\n kind: ExcelWorkbookDiffKind;\n sheetId: string;\n beforeName?: string;\n afterName?: string;\n cellChanges: number;\n cells: ExcelCellDiff[];\n structuralChanged: boolean;\n objectChanged: boolean;\n}\n\nexport interface ExcelWorkbookDiff {\n changed: boolean;\n sheets: ExcelSheetDiff[];\n}\n\nexport type ExcelWritebackOperation =\n | { type: 'replaceWorkbookPackage' }\n | {\n type: 'insertShadowSheet';\n sheetId: string;\n sheetName: string;\n targetSheet: ExcelSheetModel;\n targetStyles: ExcelStylesModel;\n }\n | { type: 'copySheetContent'; fromSheetName: string; toSheetName: string }\n | { type: 'repairSheetObjects'; sheetName: string }\n | { type: 'deleteSheet'; sheetName: string }\n | { type: 'renameSheet'; fromName: string; toName: string }\n | { type: 'patchCells'; sheetName: string; cellCount: number; changes: ExcelCellDiff[] }\n | { type: 'patchSheetObjects'; sheetName: string };\n\nexport interface ExcelWritebackPlan {\n strategy: ExcelWritebackStrategy;\n diff: ExcelWorkbookDiff;\n operations: ExcelWritebackOperation[];\n warnings: string[];\n unsupportedReasons: string[];\n}\n\nexport function diffExcelWorkbookModels(before: ExcelWorkbookModel, after: ExcelWorkbookModel): ExcelWorkbookDiff {\n const beforeById = new Map(before.sheets.map((sheet) => [sheet.id, sheet]));\n const afterById = new Map(after.sheets.map((sheet) => [sheet.id, sheet]));\n const sheets: ExcelSheetDiff[] = [];\n\n for (const beforeSheet of before.sheets) {\n const afterSheet = afterById.get(beforeSheet.id);\n if (!afterSheet) {\n sheets.push({\n kind: 'deleted',\n sheetId: beforeSheet.id,\n beforeName: beforeSheet.name,\n cellChanges: beforeSheet.cells.length,\n cells: beforeSheet.cells.map((cell) => ({\n kind: 'deleted',\n address: cell.address,\n before: cloneCell(cell),\n })),\n structuralChanged: true,\n objectChanged: hasSheetObjects(beforeSheet),\n });\n continue;\n }\n\n const cells = diffCells(beforeSheet.cells, afterSheet.cells);\n const structuralChanged = sheetStructureKey(beforeSheet) !== sheetStructureKey(afterSheet);\n const objectChanged = sheetObjectsKey(beforeSheet) !== sheetObjectsKey(afterSheet);\n if (beforeSheet.name !== afterSheet.name) {\n sheets.push({\n kind: 'renamed',\n sheetId: beforeSheet.id,\n beforeName: beforeSheet.name,\n afterName: afterSheet.name,\n cellChanges: cells.length,\n cells,\n structuralChanged,\n objectChanged,\n });\n } else if (cells.length || structuralChanged || objectChanged) {\n sheets.push({\n kind: 'modified',\n sheetId: beforeSheet.id,\n beforeName: beforeSheet.name,\n afterName: afterSheet.name,\n cellChanges: cells.length,\n cells,\n structuralChanged,\n objectChanged,\n });\n }\n }\n\n for (const afterSheet of after.sheets) {\n if (!beforeById.has(afterSheet.id)) {\n sheets.push({\n kind: 'added',\n sheetId: afterSheet.id,\n afterName: afterSheet.name,\n cellChanges: afterSheet.cells.length,\n cells: afterSheet.cells.map((cell) => ({\n kind: 'added',\n address: cell.address,\n after: cloneCell(cell),\n })),\n structuralChanged: true,\n objectChanged: hasSheetObjects(afterSheet),\n });\n }\n }\n\n return {\n changed:\n sheets.length > 0 ||\n stableJson(before.definedNames) !== stableJson(after.definedNames) ||\n stableJson(before.styles) !== stableJson(after.styles),\n sheets,\n };\n}\n\nexport function planExcelWriteback(\n before: ExcelWorkbookModel,\n after: ExcelWorkbookModel,\n capabilities: ExcelWritebackCapabilities,\n options: ExcelWritebackPlanOptions = {},\n): ExcelWritebackPlan {\n const diff = diffExcelWorkbookModels(before, after);\n if (!diff.changed) {\n return { strategy: 'no-op', diff, operations: [], warnings: [], unsupportedReasons: [] };\n }\n\n const preference = options.preference ?? 'auto';\n const packagePlan = tryPlanPackage(diff, capabilities);\n if (preference === 'package') return packagePlan;\n\n const shadowPlan = tryPlanSheetShadow(diff, after, capabilities);\n if (preference === 'sheet-shadow') return shadowPlan;\n\n const diffPlan = tryPlanDiff(diff, capabilities);\n if (preference === 'diff') return diffPlan;\n\n if (packagePlan.strategy !== 'unsupported') return packagePlan;\n if (shadowPlan.strategy !== 'unsupported') return shadowPlan;\n if (diffPlan.strategy !== 'unsupported') return diffPlan;\n\n return unsupported(diff, [\n ...diffPlan.unsupportedReasons,\n ...shadowPlan.unsupportedReasons,\n ...packagePlan.unsupportedReasons,\n ]);\n}\n\nfunction tryPlanPackage(diff: ExcelWorkbookDiff, capabilities: ExcelWritebackCapabilities): ExcelWritebackPlan {\n if (!capabilities.canReplaceWorkbookPackage) {\n return unsupported(diff, ['host cannot replace the active workbook package in place']);\n }\n return {\n strategy: 'workbook-package-replace',\n diff,\n operations: [{ type: 'replaceWorkbookPackage' }],\n warnings: [],\n unsupportedReasons: [],\n };\n}\n\nfunction tryPlanDiff(diff: ExcelWorkbookDiff, capabilities: ExcelWritebackCapabilities): ExcelWritebackPlan {\n if (!capabilities.canPatchCells) {\n return unsupported(diff, ['host cannot patch cells directly']);\n }\n const maxCellPatchCount = capabilities.maxCellPatchCount ?? Number.POSITIVE_INFINITY;\n const operations: ExcelWritebackOperation[] = [];\n const warnings: string[] = [];\n\n for (const sheet of diff.sheets) {\n if (sheet.kind === 'added' || sheet.kind === 'deleted') {\n return unsupported(diff, [`diff patch cannot ${sheet.kind} sheets without sheet lifecycle support`]);\n }\n if (sheet.kind === 'renamed') {\n if (!capabilities.canRenameSheet || !sheet.beforeName || !sheet.afterName) {\n return unsupported(diff, ['diff patch cannot rename sheets with current host capabilities']);\n }\n operations.push({ type: 'renameSheet', fromName: sheet.beforeName, toName: sheet.afterName });\n }\n if (sheet.cellChanges > maxCellPatchCount) {\n return unsupported(diff, [`cell patch count ${sheet.cellChanges} exceeds maxCellPatchCount ${maxCellPatchCount}`]);\n }\n if (sheet.cellChanges > 0 && sheet.afterName) {\n operations.push({\n type: 'patchCells',\n sheetName: sheet.afterName,\n cellCount: sheet.cellChanges,\n changes: sheet.cells.map(cloneCellDiff),\n });\n }\n if (sheet.structuralChanged || sheet.objectChanged) {\n if (!capabilities.canPatchSheetObjects || !sheet.afterName) {\n return unsupported(diff, ['diff patch cannot patch sheet structure or objects with current host capabilities']);\n }\n operations.push({ type: 'patchSheetObjects', sheetName: sheet.afterName });\n warnings.push('sheet object patch is adapter-defined and may require domain-specific repair logic');\n }\n }\n\n return { strategy: 'diff-patch', diff, operations, warnings, unsupportedReasons: [] };\n}\n\nfunction tryPlanSheetShadow(\n diff: ExcelWorkbookDiff,\n after: ExcelWorkbookModel,\n capabilities: ExcelWritebackCapabilities,\n): ExcelWritebackPlan {\n const missing = requireCapabilities(capabilities, [\n 'canInsertShadowSheets',\n 'canCopySheetContent',\n 'canDeleteSheet',\n 'canRenameSheet',\n ]);\n if (missing.length) {\n return unsupported(diff, [`sheet shadow replace requires ${missing.join(', ')}`]);\n }\n\n const operations: ExcelWritebackOperation[] = [];\n const warnings: string[] = [];\n const afterById = new Map(after.sheets.map((sheet) => [sheet.id, sheet]));\n for (const sheet of diff.sheets) {\n if (sheet.kind === 'deleted') {\n if (sheet.beforeName) operations.push({ type: 'deleteSheet', sheetName: sheet.beforeName });\n continue;\n }\n if (!sheet.afterName) continue;\n const targetSheet = afterById.get(sheet.sheetId);\n if (!targetSheet) {\n return unsupported(diff, [`target sheet model not found for sheet id ${sheet.sheetId}`]);\n }\n const shadowName = `__coco_shadow_${sheet.sheetId}`;\n operations.push({\n type: 'insertShadowSheet',\n sheetId: sheet.sheetId,\n sheetName: shadowName,\n targetSheet: cloneSheet(targetSheet),\n targetStyles: cloneStyles(after.styles),\n });\n if (sheet.kind === 'added') {\n operations.push({ type: 'renameSheet', fromName: shadowName, toName: sheet.afterName });\n continue;\n }\n const targetName = sheet.beforeName ?? sheet.afterName;\n operations.push({ type: 'copySheetContent', fromSheetName: shadowName, toSheetName: targetName });\n if (sheet.objectChanged) {\n operations.push({ type: 'repairSheetObjects', sheetName: targetName });\n warnings.push(`sheet ${targetName} has object changes; adapter must repair host-specific object fidelity`);\n }\n operations.push({ type: 'deleteSheet', sheetName: shadowName });\n if (sheet.kind === 'renamed' && sheet.beforeName && sheet.afterName) {\n operations.push({ type: 'renameSheet', fromName: sheet.beforeName, toName: sheet.afterName });\n }\n }\n\n return { strategy: 'sheet-shadow-replace', diff, operations, warnings, unsupportedReasons: [] };\n}\n\nfunction requireCapabilities(\n capabilities: ExcelWritebackCapabilities,\n names: Array<keyof ExcelWritebackCapabilities>,\n): string[] {\n return names.filter((name) => capabilities[name] !== true);\n}\n\nfunction unsupported(diff: ExcelWorkbookDiff, unsupportedReasons: string[]): ExcelWritebackPlan {\n return {\n strategy: 'unsupported',\n diff,\n operations: [],\n warnings: [],\n unsupportedReasons: [...new Set(unsupportedReasons)],\n };\n}\n\nfunction diffCells(before: ExcelCellModel[], after: ExcelCellModel[]): ExcelCellDiff[] {\n const beforeByAddress = new Map(before.map((cell) => [cell.address, cell]));\n const afterByAddress = new Map(after.map((cell) => [cell.address, cell]));\n const changes: ExcelCellDiff[] = [];\n for (const beforeCell of before) {\n const afterCell = afterByAddress.get(beforeCell.address);\n if (!afterCell) {\n changes.push({ kind: 'deleted', address: beforeCell.address, before: cloneCell(beforeCell) });\n } else if (stableJson(beforeCell) !== stableJson(afterCell)) {\n changes.push({\n kind: 'modified',\n address: beforeCell.address,\n before: cloneCell(beforeCell),\n after: cloneCell(afterCell),\n });\n }\n }\n for (const afterCell of after) {\n if (!beforeByAddress.has(afterCell.address)) {\n changes.push({ kind: 'added', address: afterCell.address, after: cloneCell(afterCell) });\n }\n }\n return changes.sort((left, right) => left.address.localeCompare(right.address, undefined, { numeric: true }));\n}\n\nfunction cloneCellDiff(diff: ExcelCellDiff): ExcelCellDiff {\n return {\n kind: diff.kind,\n address: diff.address,\n before: diff.before ? cloneCell(diff.before) : undefined,\n after: diff.after ? cloneCell(diff.after) : undefined,\n };\n}\n\nfunction cloneCell(cell: ExcelCellModel): ExcelCellModel {\n return { ...cell };\n}\n\nfunction cloneStyles(styles: ExcelStylesModel): ExcelStylesModel {\n return {\n numberFormats: styles.numberFormats.map((format) => ({ ...format })),\n fonts: styles.fonts.map((font) => ({\n ...font,\n color: font.color ? { ...font.color } : undefined,\n })),\n fills: styles.fills.map((fill) => ({\n ...fill,\n foregroundColor: fill.foregroundColor ? { ...fill.foregroundColor } : undefined,\n backgroundColor: fill.backgroundColor ? { ...fill.backgroundColor } : undefined,\n })),\n borders: styles.borders.map((border) => ({\n left: border.left ? { ...border.left, color: border.left.color ? { ...border.left.color } : undefined } : undefined,\n right: border.right ? { ...border.right, color: border.right.color ? { ...border.right.color } : undefined } : undefined,\n top: border.top ? { ...border.top, color: border.top.color ? { ...border.top.color } : undefined } : undefined,\n bottom: border.bottom\n ? { ...border.bottom, color: border.bottom.color ? { ...border.bottom.color } : undefined }\n : undefined,\n diagonal: border.diagonal\n ? { ...border.diagonal, color: border.diagonal.color ? { ...border.diagonal.color } : undefined }\n : undefined,\n })),\n cellFormats: styles.cellFormats.map((format) => ({\n ...format,\n alignment: format.alignment ? { ...format.alignment } : undefined,\n })),\n };\n}\n\nfunction cloneSheet(sheet: ExcelSheetModel): ExcelSheetModel {\n return {\n ...sheet,\n sheetViews: sheet.sheetViews.map((view) => ({\n ...view,\n pane: view.pane ? { ...view.pane } : undefined,\n selections: view.selections.map((selection) => ({ ...selection })),\n })),\n columns: sheet.columns.map((column) => ({ ...column })),\n rows: sheet.rows.map((row) => ({ ...row })),\n mergedRanges: sheet.mergedRanges.map((range) => ({ ...range })),\n hyperlinks: sheet.hyperlinks.map((hyperlink) => ({ ...hyperlink })),\n tables: sheet.tables.map((table) => ({\n ...table,\n columns: table.columns.map((column) => ({ ...column })),\n autoFilter: table.autoFilter\n ? {\n ...table.autoFilter,\n filterColumns: table.autoFilter.filterColumns.map((column) => ({\n ...column,\n filters: column.filters ? [...column.filters] : undefined,\n })),\n sortState: table.autoFilter.sortState\n ? {\n ...table.autoFilter.sortState,\n conditions: table.autoFilter.sortState.conditions.map((condition) => ({ ...condition })),\n }\n : undefined,\n }\n : undefined,\n style: table.style ? { ...table.style } : undefined,\n })),\n dataValidations: sheet.dataValidations.map((validation) => ({ ...validation })),\n conditionalFormats: sheet.conditionalFormats.map((format) => ({\n ...format,\n rules: format.rules.map((rule) => ({ ...rule, formulas: [...rule.formulas] })),\n })),\n comments: sheet.comments.map((comment) => ({ ...comment })),\n threadedComments: sheet.threadedComments.map((comment) => ({ ...comment })),\n drawings: sheet.drawings.map((drawing) => ({\n ...drawing,\n anchors: drawing.anchors.map((anchor) => ({\n ...anchor,\n from: anchor.from ? { ...anchor.from } : undefined,\n to: anchor.to ? { ...anchor.to } : undefined,\n object: anchor.object ? { ...anchor.object } : undefined,\n })),\n })),\n charts: sheet.charts.map((chart) => ({ ...chart, formulaRefs: [...chart.formulaRefs] })),\n images: sheet.images.map((image) => ({ ...image })),\n cells: sheet.cells.map(cloneCell),\n };\n}\n\nfunction hasSheetObjects(sheet: ExcelSheetModel): boolean {\n return (\n sheet.hyperlinks.length > 0 ||\n sheet.tables.length > 0 ||\n sheet.dataValidations.length > 0 ||\n sheet.conditionalFormats.length > 0 ||\n sheet.comments.length > 0 ||\n sheet.threadedComments.length > 0 ||\n sheet.drawings.length > 0 ||\n sheet.charts.length > 0 ||\n sheet.images.length > 0\n );\n}\n\nfunction sheetStructureKey(sheet: ExcelSheetModel): string {\n return stableJson({\n name: sheet.name,\n visibility: sheet.visibility,\n dimension: sheet.dimension,\n sheetViews: sheet.sheetViews,\n columns: sheet.columns,\n rows: sheet.rows,\n mergedRanges: sheet.mergedRanges,\n });\n}\n\nfunction sheetObjectsKey(sheet: ExcelSheetModel): string {\n return stableJson({\n hyperlinks: sheet.hyperlinks,\n tables: sheet.tables,\n dataValidations: sheet.dataValidations,\n conditionalFormats: sheet.conditionalFormats,\n comments: sheet.comments,\n threadedComments: sheet.threadedComments,\n drawings: sheet.drawings,\n charts: sheet.charts,\n images: sheet.images,\n });\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(sortForJson(value));\n}\n\nfunction sortForJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortForJson);\n if (!value || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => [key, sortForJson(entryValue)]),\n );\n}\n","import { toZip, type Package } from '../pack/index.js';\nimport type {\n ExcelDefinedNameModel,\n ExcelSheetModel,\n ExcelStylesModel,\n ExcelWorkbookModel,\n} from './model.js';\nimport { createWorkbookPackageFromModel } from './xlsx-writer.js';\n\nexport interface ExcelShadowWorkbookOptions {\n /** Name written into the one-sheet workbook. Usually the planner's temporary shadow sheet name. */\n sheetName?: string;\n /** Sheet id written into the one-sheet workbook. Defaults to the source sheet id. */\n sheetId?: string;\n /** Workbook styles required by cells, rows, columns, tables, and formats referenced by style ids. */\n styles?: ExcelStylesModel;\n /** Optional workbook defined names to include in the generated package. */\n definedNames?: ExcelDefinedNameModel[];\n}\n\nexport interface ExcelShadowWorkbookPayload {\n sheetName: string;\n model: ExcelWorkbookModel;\n package: Package;\n bytes: Uint8Array;\n base64: string;\n}\n\nexport async function createShadowWorkbookPayload(\n sheet: ExcelSheetModel,\n options: ExcelShadowWorkbookOptions = {},\n): Promise<ExcelShadowWorkbookPayload> {\n const model = createShadowWorkbookModel(sheet, options);\n const pkg = createWorkbookPackageFromModel(model);\n const bytes = await toZip(pkg);\n return {\n sheetName: model.sheets[0]!.name,\n model,\n package: pkg,\n bytes,\n base64: bytesToBase64(bytes),\n };\n}\n\nexport function createShadowWorkbookModel(\n sheet: ExcelSheetModel,\n options: ExcelShadowWorkbookOptions = {},\n): ExcelWorkbookModel {\n const shadowSheet = cloneJson(sheet);\n shadowSheet.id = options.sheetId ?? shadowSheet.id;\n shadowSheet.name = options.sheetName ?? shadowSheet.name;\n shadowSheet.relationshipId = undefined;\n shadowSheet.path = undefined;\n\n return {\n sharedStrings: [],\n definedNames: (options.definedNames ?? []).map((name) => ({ ...name })),\n styles: cloneStyles(options.styles ?? emptyStyles()),\n sheets: [shadowSheet],\n };\n}\n\nfunction emptyStyles(): ExcelStylesModel {\n return {\n numberFormats: [],\n fonts: [],\n fills: [],\n borders: [],\n cellFormats: [],\n };\n}\n\nfunction cloneStyles(styles: ExcelStylesModel): ExcelStylesModel {\n return cloneJson(styles);\n}\n\nfunction cloneJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(bytes).toString('base64');\n }\n let binary = '';\n const chunkSize = 0x8000;\n for (let i = 0; i < bytes.length; i += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));\n }\n return btoa(binary);\n}\n"],"mappings":"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","names":["ExcelCell","ExcelChart","ExcelChartCollection","ExcelComment","ExcelCommentCollection","ExcelConditionalFormat","ExcelConditionalFormatCollection","ExcelConditionalFormatRule","ExcelConditionalFormatRuleCollection","ExcelDataValidation","ExcelDataValidationCollection","ExcelDrawing","ExcelDrawingAnchor","ExcelDrawingAnchorCollection","ExcelDrawingCollection","ExcelDrawingMarker","ExcelFormulaRefCollection","ExcelHyperlink","ExcelHyperlinkCollection","ExcelImage","ExcelImageCollection","ExcelNamedItem","ExcelNamedItemCollection","ExcelRange","ExcelRangeAlignmentFormat","ExcelRangeBorderFormat","ExcelRangeFillFormat","ExcelRangeFontFormat","ExcelRangeFormat","ExcelShape","ExcelShapeCollection","ExcelTable","ExcelTableCollection","ExcelTableColumn","ExcelTableColumnCollection","ExcelTableStyle","ExcelThreadedComment","ExcelThreadedCommentCollection","ExcelWorksheet","ExcelWorksheetCollection","import_slimdom","CONTENT_TYPES_PATH","CONTENT_TYPES_NS","CONTENT_TYPES_CTYPE","defaults","JSZip","xmlText","_a","firstChildNs","childElementsNs","optionalXmlPart","textOf","firstChildNs","childElementsNs","parseRelationships","dirname","normalizePath","resolveRelationshipTarget","parseOptionalNumber","parseBooleanAttr","setIfDefined","_a","_b","import_slimdom","CONTENT_TYPES_NS","DRAWING_NS","parseRelationships","resolveRelationshipTarget","_a","xmlAttr","drawing","relationshipTargetsByType","dirname","normalizePath","override","normalizeSheetCells","computeDimension","sheet","_a","error","error","ExcelWorksheetCollection","ExcelNamedItemCollection","error","_ExcelWorksheetCollection","ExcelWorksheet","ExcelWorksheetCollection","_ExcelWorksheet","ExcelTableCollection","ExcelHyperlinkCollection","ExcelCommentCollection","ExcelThreadedCommentCollection","ExcelDataValidationCollection","ExcelConditionalFormatCollection","ExcelDrawingCollection","ExcelChartCollection","ExcelImageCollection","ExcelShapeCollection","ExcelRange","ExcelCell","_ExcelRange","ExcelRangeFormat","_ExcelCell","_ExcelRangeFormat","ExcelRangeFontFormat","ExcelRangeFillFormat","ExcelRangeBorderFormat","ExcelRangeAlignmentFormat","_ExcelRangeFontFormat","_ExcelRangeFillFormat","_ExcelRangeBorderFormat","_ExcelRangeAlignmentFormat","_ExcelTableCollection","ExcelTable","_ExcelTable","ExcelTableColumnCollection","ExcelTableStyle","_ExcelTableColumnCollection","ExcelTableColumn","_ExcelTableColumn","_ExcelTableStyle","_ExcelHyperlinkCollection","workbook","sheetNameOrId","ExcelHyperlink","_ExcelHyperlink","_ExcelCommentCollection","ExcelComment","_ExcelComment","_ExcelThreadedCommentCollection","ExcelThreadedComment","_ExcelThreadedComment","_ExcelDataValidationCollection","ExcelDataValidation","_ExcelDataValidation","_ExcelConditionalFormatCollection","ExcelConditionalFormat","_ExcelConditionalFormat","ExcelConditionalFormatRuleCollection","_ExcelConditionalFormatRuleCollection","ExcelConditionalFormatRule","_ExcelConditionalFormatRule","_ExcelDrawingCollection","ExcelDrawing","_ExcelDrawing","ExcelDrawingAnchorCollection","_ExcelDrawingAnchorCollection","ExcelDrawingAnchor","_ExcelDrawingAnchor","ExcelDrawingMarker","_ExcelDrawingMarker","_ExcelChartCollection","ExcelChart","_ExcelChart","ExcelFormulaRefCollection","_ExcelFormulaRefCollection","_ExcelImageCollection","ExcelImage","_ExcelImage","_ExcelShapeCollection","ExcelShape","_ExcelShape","_ExcelNamedItemCollection","ExcelNamedItem","ExcelNamedItemCollection","_ExcelNamedItem","error","index","rate","decimals","_a","_b","_c","_d","time","cell","error","formulaError","result","_a","excelSerialFromDate","_b","error","columnIndexToName","columnNameToIndex","cloneStyles","cloneJson","cloneStyles","emptyStyles"]}