@devmm/puredocs-excel 1.0.5 → 1.0.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/io/xml-parser.ts","../src/io/zip-reader.ts","../src/io/zip-writer.ts","../src/io/xml-builder.ts","../src/io/ooxml-templates.ts","../src/io/drawing-part.ts","../src/io/preserved-parts.ts","../src/model/shared-string-manager.ts","../src/style/excel-color.ts","../src/style/excel-font.ts","../src/style/excel-fill.ts","../src/style/excel-border.ts","../src/style/excel-alignment.ts","../src/style/excel-number-format.ts","../src/style/cell-style.ts","../src/style/style-manager.ts","../src/style/number-format-renderer.ts","../src/model/cell-reference.ts","../src/model/oa-date.ts","../src/model/cell.ts","../src/model/range.ts","../src/model/worksheet.ts","../src/model/defined-name.ts","../src/model/workbook.ts"],"names":["unzipSync","zipSync","xml","ExcelUnderline","ExcelVerticalAlignRun","ExcelPatternType","ExcelBorderStyle","ExcelHorizontalAlignment","ExcelVerticalAlignment","ExcelReadingOrder","code","_sharedStrings","_styles","escXml"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Cross-platform XML parser.\n *\n * Uses the browser DOMParser when available; otherwise (Node.js, Deno, Bun without a\n * DOM global) it uses a built-in char-scanning parser. The built-in parser handles the\n * subset of XML that OOXML produces: nested/self-closing elements, attributes, text,\n * CDATA sections, processing instructions and comments, plus standard entity decoding.\n * It is deliberately not a general-purpose XML parser.\n */\n\nexport type XmlElement = {\n readonly tagName: string;\n readonly attributes: Readonly<Record<string, string>>;\n readonly children: XmlElement[];\n readonly textContent: string;\n};\n\n// ── DOMParser-based implementation (browser / Node 18+) ──────────────────────\n\nfunction domElementToXml(el: Element): XmlElement {\n const attributes: Record<string, string> = {};\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i]!;\n attributes[attr.name] = attr.value;\n }\n\n const children: XmlElement[] = [];\n for (let i = 0; i < el.children.length; i++) {\n children.push(domElementToXml(el.children[i]!));\n }\n\n return {\n tagName: el.tagName,\n attributes,\n children,\n textContent: el.textContent ?? '',\n };\n}\n\nfunction parseDom(xmlString: string): XmlElement {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xmlString, 'application/xml');\n\n const parseError = doc.querySelector('parsererror');\n if (parseError) {\n throw new Error(`XML parse error: ${parseError.textContent}`);\n }\n\n if (!doc.documentElement) {\n throw new Error('XML parse error: no document element.');\n }\n\n return domElementToXml(doc.documentElement);\n}\n\n// ── Minimal hand-rolled parser for basic OOXML attribute extraction ───────────\n\n/**\n * Minimal regex-based XML parser.\n * Handles simple well-formed OOXML documents — NOT a general-purpose parser.\n * Used as fallback when DOMParser is not available.\n */\nfunction parseMinimal(xmlString: string): XmlElement {\n const stack: XmlElement[] = [];\n let pos = 0;\n let root: XmlElement | undefined;\n\n const peek = () => xmlString[pos] ?? '';\n const consume = (n = 1) => { pos += n; };\n\n function skipUntil(ch: string) {\n while (pos < xmlString.length && xmlString[pos] !== ch) pos++;\n }\n\n function parseAttributes(raw: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const re = /(\\S+?)\\s*=\\s*[\"']([^\"']*)[\"']/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n attrs[m[1]!] = m[2]!.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '\"').replace(/&apos;/g, \"'\").replace(/&amp;/g, '&');\n }\n return attrs;\n }\n\n while (pos < xmlString.length) {\n if (xmlString[pos] === '<') {\n pos++;\n\n if (xmlString[pos] === '?') { skipUntil('>'); pos++; continue; } // PI\n if (xmlString[pos] === '!') {\n // CDATA section: copy contents verbatim into the current element's text.\n if (xmlString.startsWith('![CDATA[', pos)) {\n const cdataStart = pos + '![CDATA['.length;\n const cdataEnd = xmlString.indexOf(']]>', cdataStart);\n const end = cdataEnd === -1 ? xmlString.length : cdataEnd;\n const cdata = xmlString.slice(cdataStart, end);\n if (stack.length > 0) {\n (stack[stack.length - 1]! as { textContent: string }).textContent += cdata;\n }\n pos = cdataEnd === -1 ? xmlString.length : cdataEnd + 3;\n continue;\n }\n skipUntil('>'); pos++; continue; // comment / doctype\n }\n\n const isClose = xmlString[pos] === '/';\n if (isClose) pos++;\n\n // Read tag content until >\n const tagStart = pos;\n skipUntil('>');\n const tagContent = xmlString.slice(tagStart, pos).trim();\n pos++;\n\n const isSelfClose = tagContent.endsWith('/');\n const raw = isSelfClose ? tagContent.slice(0, -1).trim() : tagContent;\n\n const spaceIdx = raw.search(/\\s/);\n const tagName = spaceIdx === -1 ? raw : raw.slice(0, spaceIdx);\n const attrRaw = spaceIdx === -1 ? '' : raw.slice(spaceIdx);\n const attributes = parseAttributes(attrRaw);\n\n if (isClose) {\n stack.pop();\n } else {\n const el: XmlElement = { tagName, attributes, children: [], textContent: '' };\n if (stack.length > 0) {\n (stack[stack.length - 1]!.children as XmlElement[]).push(el);\n } else {\n root = el;\n }\n if (!isSelfClose) stack.push(el);\n }\n } else {\n // Text content\n const textStart = pos;\n skipUntil('<');\n const text = xmlString.slice(textStart, pos)\n .replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '\"').replace(/&apos;/g, \"'\").replace(/&amp;/g, '&');\n if (stack.length > 0 && text.trim()) {\n (stack[stack.length - 1]! as { textContent: string }).textContent += text;\n }\n }\n }\n\n if (!root) throw new Error('XML parse error: empty document.');\n return root;\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Parses an XML string into a simple XmlElement tree.\n */\nexport function parseXml(xmlString: string): XmlElement {\n if (typeof DOMParser !== 'undefined') {\n return parseDom(xmlString);\n }\n return parseMinimal(xmlString);\n}\n\n/**\n * Decodes a Uint8Array to a UTF-8 string.\n */\nexport function decodeUtf8(bytes: Uint8Array): string {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder('utf-8').decode(bytes);\n }\n // Node.js Buffer fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(bytes).toString('utf-8');\n}\n\n/**\n * Encodes a string to UTF-8 bytes.\n */\nexport function encodeUtf8(str: string): Uint8Array {\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(str, 'utf-8');\n}\n\n/**\n * Queries all descendant elements matching a local tag name.\n * Handles namespace-prefixed tags (e.g. \"a:t\" matches tagName ending in \":t\" or equal to \"t\").\n */\nexport function getElementsByTagName(root: XmlElement, localName: string): XmlElement[] {\n const results: XmlElement[] = [];\n const lname = localName.toLowerCase();\n\n function walk(el: XmlElement) {\n const tag = el.tagName.toLowerCase();\n // Match \"tagname\" or \"prefix:tagname\"\n if (tag === lname || tag.endsWith(`:${lname}`)) {\n results.push(el);\n }\n for (const child of el.children) walk(child);\n }\n\n walk(root);\n return results;\n}\n\n/**\n * Gets a named attribute value, handling namespace prefixes.\n * Tries exact match first, then suffix match (e.g. \"r:id\" → looks for \"r:id\" or \"id\").\n */\nexport function getAttr(el: XmlElement, name: string): string | undefined {\n if (name in el.attributes) return el.attributes[name];\n // Try without prefix\n const local = name.includes(':') ? name.split(':').pop()! : name;\n // Try any key that ends with the local name\n for (const [key, val] of Object.entries(el.attributes)) {\n if (key === local || key.endsWith(`:${local}`)) return val;\n }\n return undefined;\n}\n","/**\n * ZIP reader for .xlsx files (which are ZIP archives).\n * Uses fflate for decompression — MIT licensed, ~9KB gzip.\n *\n * Port concept from TVE.PureDocs.Excel — the C# version uses System.IO.Compression.\n */\nimport { unzipSync } from 'fflate';\nimport { decodeUtf8 } from './xml-parser.js';\n\n/**\n * Represents the contents of an unzipped xlsx file.\n * Keys are file paths within the archive (e.g. \"xl/workbook.xml\").\n * Values are raw UTF-8 bytes.\n */\nexport type ZipEntries = Map<string, Uint8Array>;\n\n/**\n * Unzips an xlsx file buffer into a map of path → bytes.\n *\n * @param buffer - ArrayBuffer or Uint8Array of the xlsx file\n * @returns Map of file paths to their raw bytes\n */\nexport function unzipXlsx(buffer: ArrayBuffer | Uint8Array): ZipEntries {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n\n let raw: Record<string, Uint8Array>;\n try {\n raw = unzipSync(bytes);\n } catch (err) {\n throw new Error(\n `Failed to unzip xlsx: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const entries = new Map<string, Uint8Array>();\n for (const [path, data] of Object.entries(raw)) {\n // Normalise path separators (Windows ZIP files sometimes use backslash)\n entries.set(path.replace(/\\\\/g, '/'), data);\n }\n\n return entries;\n}\n\n/**\n * Reads and decodes a UTF-8 text entry from a zip archive.\n * Returns undefined if the entry does not exist.\n */\nexport function readXmlEntry(entries: ZipEntries, path: string): string | undefined {\n const bytes = entries.get(path);\n if (!bytes) return undefined;\n return decodeUtf8(bytes);\n}\n\n/**\n * Reads and decodes a UTF-8 text entry, throwing if missing.\n */\nexport function requireXmlEntry(entries: ZipEntries, path: string): string {\n const text = readXmlEntry(entries, path);\n if (text === undefined) {\n throw new Error(`Required xlsx entry not found: \"${path}\".`);\n }\n return text;\n}\n\n/**\n * Returns all entry paths that match the given prefix.\n * Useful for listing worksheets: prefix = \"xl/worksheets/\".\n */\nexport function listEntries(entries: ZipEntries, prefix: string): string[] {\n const results: string[] = [];\n for (const key of entries.keys()) {\n if (key.startsWith(prefix)) results.push(key);\n }\n return results.sort();\n}\n","/**\n * ZIP writer for producing .xlsx files.\n * Uses fflate for compression — MIT licensed.\n */\nimport { zipSync, type Zippable } from 'fflate';\nimport { encodeUtf8 } from './xml-parser.js';\n\n/**\n * Represents the file entries to be zipped.\n * Keys are paths within the archive, values are either bytes or a UTF-8 string.\n */\nexport type ZipInput = Map<string, Uint8Array | string>;\n\n/**\n * Zips a collection of file entries into an xlsx-compatible buffer.\n *\n * @param entries - Map of path → content (string auto-encoded to UTF-8)\n * @returns Uint8Array of the resulting ZIP file\n */\nexport function zipXlsx(entries: ZipInput): Uint8Array {\n const zippable: Zippable = {};\n\n for (const [path, content] of entries) {\n const bytes = typeof content === 'string' ? encodeUtf8(content) : content;\n zippable[path] = [bytes, { level: 6 }];\n }\n\n try {\n return zipSync(zippable);\n } catch (err) {\n throw new Error(\n `Failed to create xlsx: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Helper to add or update a UTF-8 text entry.\n */\nexport function setXmlEntry(entries: ZipInput, path: string, xml: string): void {\n entries.set(path, xml);\n}\n\n/**\n * Helper to add or update a binary entry.\n */\nexport function setBinaryEntry(entries: ZipInput, path: string, bytes: Uint8Array): void {\n entries.set(path, bytes);\n}\n","/**\n * Lightweight XML builder for OOXML document parts.\n * Produces well-formed XML strings without external dependencies.\n */\n\n/** Escapes special XML characters in an attribute value or text content. */\nexport function escapeXml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\n/** Serialises a key-value map to XML attribute string. */\nfunction attrsToString(attrs: Record<string, string | number | boolean | undefined>): string {\n let result = '';\n for (const [key, val] of Object.entries(attrs)) {\n if (val === undefined || val === null) continue;\n result += ` ${key}=\"${escapeXml(String(val))}\"`;\n }\n return result;\n}\n\nexport type XmlAttrs = Record<string, string | number | boolean | undefined>;\n\nexport class XmlBuilder {\n private readonly parts: string[] = [];\n\n /** Appends the XML declaration header. */\n xmlDeclaration(): this {\n this.parts.push('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n return this;\n }\n\n /** Opens a tag with optional attributes. */\n open(tag: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})}>`);\n return this;\n }\n\n /** Closes a tag. */\n close(tag: string): this {\n this.parts.push(`</${tag}>`);\n return this;\n }\n\n /** Writes a self-closing tag. */\n self(tag: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})} />`);\n return this;\n }\n\n /** Writes a tag with text content. */\n text(tag: string, content: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})}>${escapeXml(content)}</${tag}>`);\n return this;\n }\n\n /** Writes raw (pre-escaped) XML — use with caution. */\n raw(xml: string): this {\n this.parts.push(xml);\n return this;\n }\n\n /** Returns the complete XML string. */\n toString(): string {\n return this.parts.join('');\n }\n\n /** Returns UTF-8 encoded bytes. */\n toBytes(): Uint8Array {\n const str = this.toString();\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str);\n }\n // Node.js fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(str, 'utf-8') as Uint8Array;\n }\n}\n\n/** Convenience factory. */\nexport function xml(): XmlBuilder {\n return new XmlBuilder();\n}\n\n// ── Common OOXML namespace declarations ───────────────────────────────────────\n\nexport const NS = {\n // SpreadsheetML\n spreadsheetml: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n // Relationships\n relationships: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n relationshipsPackage: 'http://schemas.openxmlformats.org/package/2006/relationships',\n // Drawing\n drawingml: 'http://schemas.openxmlformats.org/drawingml/2006/main',\n spreadsheetDrawing: 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing',\n // Content types\n contentTypes: 'http://schemas.openxmlformats.org/package/2006/content-types',\n // Core properties\n coreProperties: 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties',\n} as const;\n\nexport const REL_TYPES = {\n officeDocument: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',\n worksheet: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',\n sharedStrings: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',\n styles: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',\n chart: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',\n drawing: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',\n hyperlink: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',\n} as const;\n\nexport const CONTENT_TYPES = {\n workbook: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',\n worksheet: 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml',\n sharedStrings: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml',\n styles: 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml',\n drawing: 'application/vnd.openxmlformats-officedocument.drawing+xml',\n chart: 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml',\n relationships: 'application/vnd.openxmlformats-package.relationships+xml',\n coreProperties: 'application/vnd.openxmlformats-package.core-properties+xml',\n} as const;\n","/**\r\n * Default OOXML file templates for creating a new empty workbook.\r\n *\r\n * An .xlsx file is a ZIP containing XML parts. The minimal set required is:\r\n * [Content_Types].xml\r\n * _rels/.rels\r\n * xl/workbook.xml\r\n * xl/_rels/workbook.xml.rels\r\n * xl/styles.xml\r\n * xl/sharedStrings.xml\r\n *\r\n * Port of TVE.PureDocs.Excel.Workbook.InitializeWorkbook() and CreateDefaultStylesheet().\r\n */\r\nimport { CONTENT_TYPES, REL_TYPES } from './xml-builder.js';\r\n\r\n// ── [Content_Types].xml ──────────────────────────────────────────────────────\r\n\r\nexport function buildContentTypes(\r\n sheetCount: number,\r\n extraOverrides: ReadonlyArray<{ partName: string; contentType: string }> = [],\r\n extraDefaults: ReadonlyArray<{ extension: string; contentType: string }> = [],\r\n): string {\r\n const overrides = Array.from({ length: sheetCount }, (_, i) =>\r\n ` <Override PartName=\"/xl/worksheets/sheet${i + 1}.xml\" ContentType=\"${CONTENT_TYPES.worksheet}\"/>`,\r\n );\r\n\r\n // Later entries win, so a generated override replaces a preserved one for the\r\n // same part rather than declaring it twice.\r\n const seen = new Set<string>();\r\n for (const { partName, contentType } of [...extraOverrides].reverse()) {\r\n if (seen.has(partName)) continue;\r\n seen.add(partName);\r\n overrides.push(` <Override PartName=\"${partName}\" ContentType=\"${contentType}\"/>`);\r\n }\r\n\r\n const defaults = extraDefaults.map(\r\n ({ extension, contentType }) =>\r\n ` <Default Extension=\"${extension}\" ContentType=\"${contentType}\"/>`,\r\n );\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Types xmlns=\"${'http://schemas.openxmlformats.org/package/2006/content-types'}\">\r\n <Default Extension=\"rels\" ContentType=\"${CONTENT_TYPES.relationships}\"/>\r\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\r\n${defaults.length > 0 ? `${defaults.join('\\n')}\\n` : ''} <Override PartName=\"/xl/workbook.xml\" ContentType=\"${CONTENT_TYPES.workbook}\"/>\r\n <Override PartName=\"/xl/styles.xml\" ContentType=\"${CONTENT_TYPES.styles}\"/>\r\n <Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"${CONTENT_TYPES.sharedStrings}\"/>\r\n${overrides.join('\\n')}\r\n</Types>`;\r\n}\r\n\r\n// ── _rels/.rels ──────────────────────────────────────────────────────────────\r\n\r\nexport const ROOT_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"${REL_TYPES.officeDocument}\" Target=\"xl/workbook.xml\"/>\r\n</Relationships>`;\r\n\r\n// ── xl/_rels/workbook.xml.rels ───────────────────────────────────────────────\r\n\r\nexport function buildWorkbookRels(sheetCount: number): string {\r\n const sheetRels = Array.from(\r\n { length: sheetCount },\r\n (_, i) =>\r\n ` <Relationship Id=\"rId${i + 1}\" Type=\"${REL_TYPES.worksheet}\" Target=\"worksheets/sheet${i + 1}.xml\"/>`,\r\n ).join('\\n');\r\n\r\n const stylesId = sheetCount + 1;\r\n const sharedId = sheetCount + 2;\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n${sheetRels}\r\n <Relationship Id=\"rId${stylesId}\" Type=\"${REL_TYPES.styles}\" Target=\"styles.xml\"/>\r\n <Relationship Id=\"rId${sharedId}\" Type=\"${REL_TYPES.sharedStrings}\" Target=\"sharedStrings.xml\"/>\r\n</Relationships>`;\r\n}\r\n\r\n// ── xl/workbook.xml ──────────────────────────────────────────────────────────\r\n\r\nexport interface SheetMeta {\r\n name: string;\r\n sheetId: number;\r\n relationshipId: string;\r\n state?: 'visible' | 'hidden' | 'veryHidden';\r\n}\r\n\r\n/**\r\n * A defined name (named range) as serialised in workbook.xml.\r\n * `localSheetId` is the 0-based worksheet index for sheet-scoped names, or\r\n * undefined for workbook-global names.\r\n */\r\nexport interface DefinedNameMeta {\r\n name: string;\r\n refersTo: string; // without leading '='\r\n localSheetId?: number;\r\n}\r\n\r\nexport function buildWorkbookXml(\r\n sheets: SheetMeta[],\r\n definedNames: ReadonlyArray<DefinedNameMeta> = [],\r\n): string {\r\n const sheetElems = sheets\r\n .map(({ name, sheetId, relationshipId, state }) => {\r\n const stateAttr = state && state !== 'visible' ? ` state=\"${state}\"` : '';\r\n return ` <sheet name=\"${escapeAttr(name)}\" sheetId=\"${sheetId}\" r:id=\"${relationshipId}\"${stateAttr}/>`;\r\n })\r\n .join('\\n');\r\n\r\n let definedNamesBlock = '';\r\n if (definedNames.length > 0) {\r\n const items = definedNames\r\n .map(({ name, refersTo, localSheetId }) => {\r\n const local = localSheetId !== undefined ? ` localSheetId=\"${localSheetId}\"` : '';\r\n return ` <definedName name=\"${escapeAttr(name)}\"${local}>${escapeContent(refersTo)}</definedName>`;\r\n })\r\n .join('\\n');\r\n definedNamesBlock = `\\n <definedNames>\\n${items}\\n </definedNames>`;\r\n }\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <fileVersion appName=\"xl\" lastEdited=\"7\" lowestEdited=\"7\" rupBuild=\"22228\"/>\r\n <workbookPr defaultThemeVersion=\"124226\"/>\r\n <bookViews>\r\n <workbookView xWindow=\"240\" yWindow=\"105\" windowWidth=\"14805\" windowHeight=\"8010\"/>\r\n </bookViews>\r\n <sheets>\r\n${sheetElems}\r\n </sheets>${definedNamesBlock}\r\n <calcPr calcId=\"191028\" fullCalcOnLoad=\"1\"/>\r\n</workbook>`;\r\n}\r\n\r\n// ── xl/sharedStrings.xml ─────────────────────────────────────────────────────\r\n\r\nexport function buildSharedStringsXml(strings: string[]): string {\r\n const items = strings\r\n .map(s => ` <si><t ${s.startsWith(' ') || s.endsWith(' ') ? 'xml:space=\"preserve\"' : ''}>${escapeContent(s)}</t></si>`)\r\n .join('\\n');\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${strings.length}\" uniqueCount=\"${strings.length}\">\r\n${items}\r\n</sst>`;\r\n}\r\n\r\n// ── xl/styles.xml ────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Default stylesheet — mirrors Workbook.CreateDefaultStylesheet() in C#.\r\n * Contains exactly:\r\n * - 1 default font (Calibri 11pt)\r\n * - 2 required fills (none + gray125)\r\n * - 1 default border (all empty)\r\n * - 1 default cell format (format 0, all indices 0)\r\n */\r\nexport const DEFAULT_STYLES_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\r\n <fonts count=\"1\">\r\n <font>\r\n <sz val=\"11\"/>\r\n <color theme=\"1\"/>\r\n <name val=\"Calibri\"/>\r\n </font>\r\n </fonts>\r\n <fills count=\"2\">\r\n <fill><patternFill patternType=\"none\"/></fill>\r\n <fill><patternFill patternType=\"gray125\"/></fill>\r\n </fills>\r\n <borders count=\"1\">\r\n <border>\r\n <left/><right/><top/><bottom/><diagonal/>\r\n </border>\r\n </borders>\r\n <cellStyleXfs count=\"1\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\r\n </cellStyleXfs>\r\n <cellXfs count=\"1\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>\r\n </cellXfs>\r\n</styleSheet>`;\r\n\r\n// ── xl/worksheets/sheet1.xml ─────────────────────────────────────────────────\r\n\r\nexport const EMPTY_WORKSHEET_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheetData/>\r\n</worksheet>`;\r\n\r\n// ── helpers ───────────────────────────────────────────────────────────────────\r\n\r\nfunction escapeAttr(s: string): string {\r\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\r\n}\r\n\r\nfunction escapeContent(s: string): string {\r\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n}\r\n","/**\n * Generic drawing extension point.\n *\n * The core library knows nothing about charts, images or any specific drawing\n * type. It only knows how to place an opaque \"drawing provider\" into the package:\n * a provider yields one anchor fragment (positioned inside `<xdr:wsDr>`) plus one\n * dependent part (e.g. a chart part) that the anchor references by relationship.\n *\n * This lets satellite packages such as `@devmm/puredocs-excel-charts` inject valid\n * OOXML parts during `Workbook.saveAsBuffer()` without the core depending on them,\n * and without reaching into core internals.\n */\nimport { NS } from './xml-builder.js';\n\n/** A part that a drawing anchor references (e.g. `xl/charts/chart1.xml`). */\nexport interface DrawingDependentPart {\n /** Package-relative path, no leading slash — e.g. `xl/charts/chart1.xml`. */\n readonly path: string;\n /** Full XML content of the part. */\n readonly content: string;\n /** Content type for the `[Content_Types].xml` Override entry. */\n readonly contentType: string;\n /** Relationship type used by the drawing → part relationship. */\n readonly relType: string;\n}\n\n/**\n * Contributes one anchored object (chart, image, …) to a worksheet's drawing.\n * Implemented by satellite packages; consumed by the core save pipeline.\n */\nexport interface DrawingProvider {\n /**\n * Builds the `<xdr:*Anchor>` fragment placed inside `<xdr:wsDr>`.\n * @param relationshipId the id (e.g. `\"rId1\"`) the anchor must reference for\n * its embedded dependent part.\n */\n buildAnchorXml(relationshipId: string): string;\n\n /**\n * Builds the dependent part this drawing references.\n * @param partIndex a workbook-unique 1-based index for building a unique path\n * (e.g. `xl/charts/chart{partIndex}.xml`).\n */\n buildPart(partIndex: number): DrawingDependentPart;\n}\n\n/** Relationship id used by a worksheet to reference its single drawing part. */\nexport const WORKSHEET_DRAWING_REL_ID = 'rId1';\n\n/** Wraps anchor fragments into a complete `xl/drawings/drawingN.xml` part. */\nexport function buildDrawingXml(anchorsXml: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<xdr:wsDr xmlns:xdr=\"${NS.spreadsheetDrawing}\" xmlns:a=\"${NS.drawingml}\">${anchorsXml}</xdr:wsDr>`;\n}\n\n/** Builds a generic `.rels` part from a list of `<Relationship .../>` strings. */\nexport function buildRelsXml(relationships: readonly string[]): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n${relationships.join('\\n')}\n</Relationships>`;\n}\n","/**\r\n * Round-trip preservation of package parts the core model does not understand.\r\n *\r\n * `Workbook.saveAsBuffer()` rebuilds the package from the in-memory model, so\r\n * any part core never parsed — drawings, images, themes, comments, pivot\r\n * caches, docProps — would silently disappear on open→save. This module\r\n * captures those parts at open time so the save pipeline can pass them through\r\n * untouched.\r\n *\r\n * Parts core *does* own are excluded: it regenerates them, and keeping a stale\r\n * copy would produce duplicates or dangling relationships.\r\n */\r\nimport type { ZipEntries } from './zip-reader.js';\r\nimport { decodeUtf8 } from './xml-parser.js';\r\n\r\n/**\r\n * Paths regenerated by the save pipeline. Worksheets and their rels are matched\r\n * by prefix because the source file may name or number them differently than we\r\n * will on the way out.\r\n */\r\nfunction isCoreOwned(path: string): boolean {\r\n return (\r\n path === '[Content_Types].xml' ||\r\n path === '_rels/.rels' ||\r\n path === 'xl/workbook.xml' ||\r\n path === 'xl/_rels/workbook.xml.rels' ||\r\n path === 'xl/styles.xml' ||\r\n path === 'xl/sharedStrings.xml' ||\r\n path.startsWith('xl/worksheets/')\r\n );\r\n}\r\n\r\n/** Captures every part the save pipeline will not write itself. */\r\nexport function collectPreservedParts(entries: ZipEntries): Map<string, Uint8Array> {\r\n const preserved = new Map<string, Uint8Array>();\r\n for (const [path, bytes] of entries) {\r\n if (!isCoreOwned(path)) preserved.set(path, bytes);\r\n }\r\n return preserved;\r\n}\r\n\r\nexport interface ContentTypeDeclarations {\r\n /** Extension → content type, e.g. \"png\" → \"image/png\". */\r\n defaults: Map<string, string>;\r\n /** Absolute part name (with leading slash) → content type. */\r\n overrides: Map<string, string>;\r\n}\r\n\r\n/**\r\n * Parses `[Content_Types].xml` so preserved parts keep their declarations. Both\r\n * maps matter: binary parts such as images are typed by `<Default>` extension,\r\n * XML parts such as charts by `<Override>`.\r\n */\r\nexport function parseContentTypes(xml: string): ContentTypeDeclarations {\r\n const defaults = new Map<string, string>();\r\n const overrides = new Map<string, string>();\r\n\r\n for (const m of xml.matchAll(/<Default\\s+[^>]*\\/?>/g)) {\r\n const ext = /Extension=\"([^\"]*)\"/.exec(m[0])?.[1];\r\n const ct = /ContentType=\"([^\"]*)\"/.exec(m[0])?.[1];\r\n if (ext && ct) defaults.set(ext.toLowerCase(), ct);\r\n }\r\n for (const m of xml.matchAll(/<Override\\s+[^>]*\\/?>/g)) {\r\n const part = /PartName=\"([^\"]*)\"/.exec(m[0])?.[1];\r\n const ct = /ContentType=\"([^\"]*)\"/.exec(m[0])?.[1];\r\n if (part && ct) overrides.set(part, ct);\r\n }\r\n\r\n return { defaults, overrides };\r\n}\r\n\r\nexport interface Relationship {\r\n id: string;\r\n type: string;\r\n /** Target exactly as written in the source rels part. */\r\n target: string;\r\n /** Target resolved to a package-absolute path, or undefined if external. */\r\n resolved?: string;\r\n /** True when the relationship points outside the package (TargetMode). */\r\n external: boolean;\r\n}\r\n\r\n/** Resolves a possibly-relative rels target against the part's own directory. */\r\nfunction resolveTarget(target: string, baseDir: string): string {\r\n if (target.startsWith('/')) return target.slice(1);\r\n\r\n const segments = baseDir.split('/').filter(Boolean);\r\n for (const seg of target.split('/')) {\r\n if (seg === '.' || seg === '') continue;\r\n if (seg === '..') segments.pop();\r\n else segments.push(seg);\r\n }\r\n return segments.join('/');\r\n}\r\n\r\n/**\r\n * Parses a `.rels` part.\r\n *\r\n * @param ownerPath package path of the part the rels belong to, e.g.\r\n * `xl/worksheets/sheet1.xml` — used to resolve relative targets.\r\n */\r\nexport function parseRelationships(relsXml: string, ownerPath: string): Relationship[] {\r\n const baseDir = ownerPath.slice(0, ownerPath.lastIndexOf('/'));\r\n const rels: Relationship[] = [];\r\n\r\n for (const m of relsXml.matchAll(/<Relationship\\s+[^>]*\\/?>/g)) {\r\n const tag = m[0];\r\n const id = /\\bId=\"([^\"]*)\"/.exec(tag)?.[1];\r\n const type = /\\bType=\"([^\"]*)\"/.exec(tag)?.[1];\r\n const target = /\\bTarget=\"([^\"]*)\"/.exec(tag)?.[1];\r\n if (!id || !type || target === undefined) continue;\r\n\r\n const external = /TargetMode=\"External\"/.test(tag);\r\n rels.push({\r\n id,\r\n type,\r\n target,\r\n resolved: external ? undefined : resolveTarget(target, baseDir),\r\n external,\r\n });\r\n }\r\n return rels;\r\n}\r\n\r\n/**\r\n * Walks the relationship graph from `startPath`, returning that part plus every\r\n * part reachable from it. Used to drop a preserved drawing together with the\r\n * charts and images only it referenced, so overriding a sheet's drawing does\r\n * not leave orphaned parts behind.\r\n */\r\nexport function collectSubtree(\r\n parts: ReadonlyMap<string, Uint8Array>,\r\n startPath: string,\r\n): Set<string> {\r\n const seen = new Set<string>();\r\n const queue = [startPath];\r\n\r\n while (queue.length > 0) {\r\n const path = queue.pop()!;\r\n if (seen.has(path) || !parts.has(path)) continue;\r\n seen.add(path);\r\n\r\n const dir = path.slice(0, path.lastIndexOf('/'));\r\n const file = path.slice(path.lastIndexOf('/') + 1);\r\n const relsPath = `${dir}/_rels/${file}.rels`;\r\n const relsBytes = parts.get(relsPath);\r\n if (!relsBytes) continue;\r\n\r\n seen.add(relsPath);\r\n for (const rel of parseRelationships(decodeUtf8(relsBytes), path)) {\r\n if (rel.resolved) queue.push(rel.resolved);\r\n }\r\n }\r\n\r\n return seen;\r\n}\r\n\r\n/**\r\n * Empty worksheet child elements that reference a part by relationship id and\r\n * must survive round-tripping. All are leaf elements per CT_Worksheet, so they\r\n * can be captured as raw text. Container elements (`tableParts`, `oleObjects`,\r\n * `controls`) are deliberately not preserved — they carry structure the model\r\n * would have to understand to keep consistent.\r\n */\r\nconst PRESERVED_TAIL_TAGS = ['drawing', 'legacyDrawing', 'legacyDrawingHF', 'picture'] as const;\r\n\r\nexport interface PreservedTailElement {\r\n tag: string;\r\n /** The relationship id the element references. */\r\n relId: string;\r\n /** Raw element text, re-emitted verbatim. */\r\n xml: string;\r\n}\r\n\r\n/** Extracts the relationship-bearing leaf elements from a worksheet part. */\r\nexport function parseTailElements(worksheetXml: string): PreservedTailElement[] {\r\n const found: PreservedTailElement[] = [];\r\n\r\n for (const tag of PRESERVED_TAIL_TAGS) {\r\n // Leaf elements: `<drawing r:id=\"rId1\"/>` (optionally with a closing tag).\r\n const re = new RegExp(`<(?:\\\\w+:)?${tag}\\\\s[^>]*?/>|<(?:\\\\w+:)?${tag}\\\\s[^>]*?>\\\\s*</(?:\\\\w+:)?${tag}>`, 'g');\r\n for (const m of worksheetXml.matchAll(re)) {\r\n const relId = /r:id=\"([^\"]*)\"/.exec(m[0])?.[1];\r\n if (relId) found.push({ tag, relId, xml: m[0] });\r\n }\r\n }\r\n\r\n return found;\r\n}\r\n","/**\n * Manages the shared string table for efficient string storage in xlsx files.\n * Excel stores repeated strings in a shared table and references them by index,\n * dramatically reducing file size for repeated values.\n *\n * Port of TVE.PureDocs.Excel.SharedStringManager (C#)\n *\n * Key differences:\n * - Uses Map instead of Dictionary (same O(1) performance)\n * - No threading concerns (JS single-threaded)\n * - Parses/serialises XML directly instead of using OpenXml SDK\n */\nimport { parseXml, getElementsByTagName } from '../io/xml-parser.js';\n\nexport class SharedStringManager {\n /** Forward map: string value → index */\n readonly #stringToIndex = new Map<string, number>();\n /** Reverse map: index → string value */\n readonly #indexToString: string[] = [];\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /** Total number of unique strings. */\n get count(): number {\n return this.#indexToString.length;\n }\n\n /**\n * Adds a string to the table (if not already present) and returns its index.\n * O(1) average case.\n */\n addOrGet(value: string): number {\n const existing = this.#stringToIndex.get(value);\n if (existing !== undefined) return existing;\n\n const idx = this.#indexToString.length;\n this.#indexToString.push(value);\n this.#stringToIndex.set(value, idx);\n return idx;\n }\n\n /**\n * Returns the string at the given index.\n * Throws if index is out of range.\n */\n getString(index: number): string {\n const s = this.#indexToString[index];\n if (s === undefined) {\n throw new RangeError(\n `Shared string index ${index} out of range [0, ${this.#indexToString.length - 1}].`,\n );\n }\n return s;\n }\n\n /**\n * Returns the string at index, or undefined if not found.\n * Safe alternative to getString().\n */\n tryGetString(index: number): string | undefined {\n return this.#indexToString[index];\n }\n\n /** Returns true if the string is already in the table. */\n has(value: string): boolean {\n return this.#stringToIndex.has(value);\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /**\n * Builds the xl/sharedStrings.xml string.\n */\n buildXml(): string {\n const count = this.#indexToString.length;\n const items = this.#indexToString\n .map(s => {\n const preserveSpace = s.startsWith(' ') || s.endsWith(' ') ? ' xml:space=\"preserve\"' : '';\n return `<si><t${preserveSpace}>${escContent(s)}</t></si>`;\n })\n .join('');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${count}\" uniqueCount=\"${count}\">\n${items}\n</sst>`;\n }\n\n /**\n * Parses an existing xl/sharedStrings.xml and loads strings into the table.\n */\n loadFromXml(xml: string): void {\n this.#stringToIndex.clear();\n this.#indexToString.length = 0;\n\n const root = parseXml(xml);\n // Each <si> element contains one or more <t> elements (rich text uses multiple <r><t>)\n for (const si of getElementsByTagName(root, 'si')) {\n // Concatenate all <t> text nodes within the <si>\n const tNodes = getElementsByTagName(si, 't');\n const text = tNodes.map(t => t.textContent).join('');\n this.addOrGet(text);\n }\n }\n}\n\nfunction escContent(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n","/**\n * Represents a color for use in Excel styling (fonts, fills, borders).\n * Supports hex, RGB, ARGB, theme, and indexed colors.\n *\n * Port of TVE.PureDocs.Excel.ExcelColor (C#)\n *\n * Key differences from C#:\n * - Constructor is private; use static factory methods\n * - Predefined colors use camelCase (ExcelColor.red vs ExcelColor.Red)\n * - toXmlAttrs() replaces ToOpenXmlColor() — returns plain object for XML serialisation\n */\n\nexport interface ColorXmlAttrs {\n rgb?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n}\n\nexport class ExcelColor {\n /** ARGB hex string e.g. \"FFFF0000\" for opaque red. */\n readonly hex: string | undefined;\n /** Theme color index. */\n readonly theme: number | undefined;\n /** Theme tint (-1.0 to 1.0). */\n readonly tint: number | undefined;\n /** Indexed color value. */\n readonly indexed: number | undefined;\n\n private constructor(opts: {\n hex?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n }) {\n this.hex = opts.hex;\n this.theme = opts.theme;\n this.tint = opts.tint;\n this.indexed = opts.indexed;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a color from a hex string.\n * Accepts \"#RGB\", \"#RRGGBB\", \"RRGGBB\", or \"AARRGGBB\" formats.\n */\n static fromHex(hex: string): ExcelColor {\n if (!hex) throw new Error('Hex color cannot be empty.');\n\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n // Expand shorthand #RGB → FFRRGGBB\n h = `FF${h[0]}${h[0]}${h[1]}${h[1]}${h[2]}${h[2]}`;\n } else if (h.length === 6) {\n h = `FF${h}`;\n } else if (h.length !== 8) {\n throw new Error(\n `Invalid hex color \"${hex}\". Expected 3, 6, or 8 hex characters (with optional # prefix).`,\n );\n }\n\n const upper = h.toUpperCase();\n if (!/^[0-9A-F]{8}$/.test(upper)) {\n throw new Error(`Invalid hex color \"${hex}\": contains non-hex characters.`);\n }\n\n return new ExcelColor({ hex: upper });\n }\n\n /** Creates a color from RGB values (0–255). Alpha is set to 255 (opaque). */\n static fromRgb(red: number, green: number, blue: number): ExcelColor {\n return new ExcelColor({\n hex: `FF${byteHex(red)}${byteHex(green)}${byteHex(blue)}`,\n });\n }\n\n /** Creates a color from ARGB values (0–255). */\n static fromArgb(alpha: number, red: number, green: number, blue: number): ExcelColor {\n return new ExcelColor({\n hex: `${byteHex(alpha)}${byteHex(red)}${byteHex(green)}${byteHex(blue)}`,\n });\n }\n\n /** Creates a theme color with optional tint value (-1.0 to 1.0). */\n static fromTheme(themeIndex: number, tint = 0): ExcelColor {\n return new ExcelColor({\n theme: themeIndex,\n tint: tint !== 0 ? tint : undefined,\n });\n }\n\n /** Creates an indexed color. */\n static fromIndexed(index: number): ExcelColor {\n return new ExcelColor({ indexed: index });\n }\n\n // ── Predefined colors (camelCase, per TypeScript convention) ─────────────\n\n static readonly black = ExcelColor.fromHex('FF000000');\n static readonly white = ExcelColor.fromHex('FFFFFFFF');\n static readonly red = ExcelColor.fromHex('FFFF0000');\n static readonly green = ExcelColor.fromHex('FF00FF00');\n static readonly blue = ExcelColor.fromHex('FF0000FF');\n static readonly yellow = ExcelColor.fromHex('FFFFFF00');\n static readonly magenta = ExcelColor.fromHex('FFFF00FF');\n static readonly cyan = ExcelColor.fromHex('FF00FFFF');\n static readonly orange = ExcelColor.fromHex('FFFF8C00');\n static readonly purple = ExcelColor.fromHex('FF800080');\n static readonly darkRed = ExcelColor.fromHex('FF8B0000');\n static readonly darkGreen = ExcelColor.fromHex('FF006400');\n static readonly darkBlue = ExcelColor.fromHex('FF00008B');\n static readonly lightGray = ExcelColor.fromHex('FFD3D3D3');\n static readonly darkGray = ExcelColor.fromHex('FFA9A9A9');\n static readonly gray = ExcelColor.fromHex('FF808080');\n static readonly lightBlue = ExcelColor.fromHex('FFADD8E6');\n static readonly lightGreen = ExcelColor.fromHex('FF90EE90');\n static readonly lightYellow = ExcelColor.fromHex('FFFFFFED');\n static readonly lightPink = ExcelColor.fromHex('FFFFB6C1');\n static readonly transparent = ExcelColor.fromArgb(0, 0, 0, 0);\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n /** Returns XML attribute key-value pairs for embedding in OOXML elements. */\n toXmlAttrs(): ColorXmlAttrs {\n if (this.hex !== undefined) return { rgb: this.hex };\n if (this.theme !== undefined) {\n const attrs: ColorXmlAttrs = { theme: this.theme };\n if (this.tint !== undefined) attrs.tint = this.tint;\n return attrs;\n }\n if (this.indexed !== undefined) return { indexed: this.indexed };\n return {};\n }\n\n /** Builds an XML color element string for use inside other elements. */\n toXmlElement(tagName: string): string {\n const attrs = this.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb !== undefined) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n return `<${tagName} ${parts.join(' ')}/>`;\n }\n\n /** Parses a color from OOXML XML attributes. Returns undefined if no color data. */\n static fromXmlAttrs(attrs: Record<string, string | undefined>): ExcelColor | undefined {\n const rgb = attrs['rgb'];\n if (rgb) return ExcelColor.fromHex(rgb);\n\n const themeStr = attrs['theme'];\n if (themeStr !== undefined) {\n const tintStr = attrs['tint'];\n return ExcelColor.fromTheme(parseInt(themeStr, 10), tintStr ? parseFloat(tintStr) : 0);\n }\n\n const indexedStr = attrs['indexed'];\n if (indexedStr !== undefined) return ExcelColor.fromIndexed(parseInt(indexedStr, 10));\n\n return undefined;\n }\n\n toString(): string {\n if (this.hex !== undefined) return `#${this.hex}`;\n if (this.theme !== undefined) return `Theme(${this.theme}${this.tint ? `,${this.tint}` : ''})`;\n if (this.indexed !== undefined) return `Indexed(${this.indexed})`;\n return 'None';\n }\n}\n\nfunction byteHex(n: number): string {\n return Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0').toUpperCase();\n}\n","/**\n * Font configuration for cell styling.\n * Port of TVE.PureDocs.Excel.ExcelFont (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelUnderline {\n None = 'none',\n Single = 'single',\n Double = 'double',\n SingleAccounting = 'singleAccounting',\n DoubleAccounting = 'doubleAccounting',\n}\n\nexport enum ExcelVerticalAlignRun {\n Baseline = 'baseline',\n Superscript = 'superscript',\n Subscript = 'subscript',\n}\n\nexport interface ExcelFontOptions {\n name?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: ExcelUnderline;\n strikethrough?: boolean;\n color?: ExcelColor;\n verticalAlign?: ExcelVerticalAlignRun;\n}\n\nexport class ExcelFont {\n name?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: ExcelUnderline;\n strikethrough?: boolean;\n color?: ExcelColor;\n verticalAlign?: ExcelVerticalAlignRun;\n\n constructor(opts: ExcelFontOptions = {}) {\n Object.assign(this, opts);\n }\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n const parts: string[] = [];\n\n if (this.bold) parts.push('<b/>');\n if (this.italic) parts.push('<i/>');\n if (this.strikethrough) parts.push('<strike/>');\n\n if (this.underline && this.underline !== ExcelUnderline.None) {\n parts.push(`<u val=\"${this.underline}\"/>`);\n }\n\n if (this.verticalAlign && this.verticalAlign !== ExcelVerticalAlignRun.Baseline) {\n parts.push(`<vertAlign val=\"${this.verticalAlign}\"/>`);\n }\n\n parts.push(`<sz val=\"${this.size ?? 11}\"/>`);\n\n if (this.color) {\n parts.push(this.color.toXmlElement('color'));\n } else {\n parts.push('<color theme=\"1\"/>');\n }\n\n parts.push(`<name val=\"${this.name ?? 'Calibri'}\"/>`);\n\n return `<font>${parts.join('')}</font>`;\n }\n\n /** Parses font from parsed XML child elements. */\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; textContent: string }>): ExcelFont {\n const font = new ExcelFont();\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, ''); // strip namespace prefix\n switch (tag) {\n case 'b': font.bold = true; break;\n case 'i': font.italic = true; break;\n case 'strike': font.strikethrough = true; break;\n case 'sz': font.size = parseFloat(el.attributes['val'] ?? '11'); break;\n case 'name': font.name = el.attributes['val']; break;\n case 'u': {\n const val = el.attributes['val'] ?? 'single';\n font.underline = (Object.values(ExcelUnderline) as string[]).includes(val)\n ? (val as ExcelUnderline)\n : ExcelUnderline.Single;\n break;\n }\n case 'vertAlign': {\n const val = el.attributes['val'] ?? 'baseline';\n font.verticalAlign = (Object.values(ExcelVerticalAlignRun) as string[]).includes(val)\n ? (val as ExcelVerticalAlignRun)\n : ExcelVerticalAlignRun.Baseline;\n break;\n }\n case 'color':\n font.color = ExcelColor.fromXmlAttrs(el.attributes);\n break;\n }\n }\n\n return font;\n }\n\n /** Builds a canonical cache key for deduplication in StyleManager. */\n cacheKey(): string {\n return [\n `n:${this.name ?? 'Calibri'}`,\n `s:${this.size ?? 11}`,\n `b:${this.bold ?? false}`,\n `i:${this.italic ?? false}`,\n `u:${this.underline ?? ExcelUnderline.None}`,\n `st:${this.strikethrough ?? false}`,\n `va:${this.verticalAlign ?? ExcelVerticalAlignRun.Baseline}`,\n `c:${this.color?.toString() ?? 'null'}`,\n ].join('|');\n }\n\n clone(): ExcelFont {\n return new ExcelFont({\n name: this.name,\n size: this.size,\n bold: this.bold,\n italic: this.italic,\n underline: this.underline,\n strikethrough: this.strikethrough,\n color: this.color,\n verticalAlign: this.verticalAlign,\n });\n }\n}\n","/**\n * Cell fill (background) configuration.\n * Port of TVE.PureDocs.Excel.ExcelFill (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelPatternType {\n None = 'none',\n Solid = 'solid',\n DarkGray = 'darkGray',\n MediumGray = 'mediumGray',\n LightGray = 'lightGray',\n Gray125 = 'gray125',\n Gray0625 = 'gray0625',\n DarkHorizontal = 'darkHorizontal',\n DarkVertical = 'darkVertical',\n DarkDown = 'darkDown',\n DarkUp = 'darkUp',\n DarkGrid = 'darkGrid',\n DarkTrellis = 'darkTrellis',\n LightHorizontal = 'lightHorizontal',\n LightVertical = 'lightVertical',\n LightDown = 'lightDown',\n LightUp = 'lightUp',\n LightGrid = 'lightGrid',\n LightTrellis = 'lightTrellis',\n}\n\nexport class ExcelFill {\n patternType: ExcelPatternType;\n /** Foreground/pattern color — for solid fills this IS the background color. */\n foregroundColor?: ExcelColor;\n /** Background color for pattern fills. */\n backgroundColor?: ExcelColor;\n\n constructor(\n patternType: ExcelPatternType = ExcelPatternType.None,\n foregroundColor?: ExcelColor,\n backgroundColor?: ExcelColor,\n ) {\n this.patternType = patternType;\n this.foregroundColor = foregroundColor;\n this.backgroundColor = backgroundColor;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a solid fill with the given color.\n * Excel requires the magic indexed(64) background color for solid fills.\n */\n static solid(color: ExcelColor): ExcelFill {\n return new ExcelFill(\n ExcelPatternType.Solid,\n color,\n ExcelColor.fromIndexed(64), // required by Excel spec\n );\n }\n\n /** Creates a pattern fill. */\n static pattern(\n pattern: ExcelPatternType,\n foreground: ExcelColor,\n background?: ExcelColor,\n ): ExcelFill {\n return new ExcelFill(pattern, foreground, background);\n }\n\n /** No fill (default). */\n static readonly none = new ExcelFill(ExcelPatternType.None);\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n let inner = `<patternFill patternType=\"${this.patternType}\">`;\n\n if (this.foregroundColor) {\n const attrs = this.foregroundColor.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n inner += `<fgColor ${parts.join(' ')}/>`;\n }\n\n if (this.backgroundColor) {\n const attrs = this.backgroundColor.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n inner += `<bgColor ${parts.join(' ')}/>`;\n }\n\n inner += '</patternFill>';\n return `<fill>${inner}</fill>`;\n }\n\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }>): ExcelFill {\n const fill = new ExcelFill();\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, '');\n if (tag === 'patternFill') {\n const pt = el.attributes['patternType'];\n if (pt && (Object.values(ExcelPatternType) as string[]).includes(pt)) {\n fill.patternType = pt as ExcelPatternType;\n }\n\n for (const child of el.children) {\n const ctag = child.tagName.replace(/^.*:/, '');\n const color = ExcelColor.fromXmlAttrs(child.attributes);\n if (ctag === 'fgColor' && color) fill.foregroundColor = color;\n if (ctag === 'bgColor' && color) fill.backgroundColor = color;\n }\n }\n }\n\n return fill;\n }\n\n cacheKey(): string {\n return [\n `p:${this.patternType}`,\n `fg:${this.foregroundColor?.toString() ?? 'null'}`,\n `bg:${this.backgroundColor?.toString() ?? 'null'}`,\n ].join('|');\n }\n}\n","/**\n * Border configuration for cells.\n * Port of TVE.PureDocs.Excel.ExcelBorder and ExcelBorderEdge (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelBorderStyle {\n None = 'none',\n Thin = 'thin',\n Medium = 'medium',\n Thick = 'thick',\n Dashed = 'dashed',\n Dotted = 'dotted',\n Double = 'double',\n Hair = 'hair',\n MediumDashed = 'mediumDashed',\n DashDot = 'dashDot',\n MediumDashDot = 'mediumDashDot',\n DashDotDot = 'dashDotDot',\n MediumDashDotDot = 'mediumDashDotDot',\n SlantDashDot = 'slantDashDot',\n}\n\nexport class ExcelBorderEdge {\n style: ExcelBorderStyle;\n color?: ExcelColor;\n\n constructor(style: ExcelBorderStyle = ExcelBorderStyle.None, color?: ExcelColor) {\n this.style = style;\n this.color = color;\n }\n\n toXml(tag: string): string {\n if (this.style === ExcelBorderStyle.None) return `<${tag}/>`;\n\n let inner = '';\n if (this.color) inner = this.color.toXmlElement('color');\n\n return `<${tag} style=\"${this.style}\">${inner}</${tag}>`;\n }\n\n static fromXmlElement(el: { attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }): ExcelBorderEdge {\n const styleStr = el.attributes['style'] ?? 'none';\n const style = (Object.values(ExcelBorderStyle) as string[]).includes(styleStr)\n ? (styleStr as ExcelBorderStyle)\n : ExcelBorderStyle.None;\n\n let color: ExcelColor | undefined;\n for (const child of el.children) {\n const tag = child.tagName.replace(/^.*:/, '');\n if (tag === 'color') {\n color = ExcelColor.fromXmlAttrs(child.attributes) ?? undefined;\n }\n }\n\n return new ExcelBorderEdge(style, color);\n }\n\n cacheKey(): string {\n return `${this.style}:${this.color?.toString() ?? 'null'}`;\n }\n}\n\nexport class ExcelBorder {\n left: ExcelBorderEdge;\n right: ExcelBorderEdge;\n top: ExcelBorderEdge;\n bottom: ExcelBorderEdge;\n diagonal: ExcelBorderEdge;\n diagonalDown: boolean;\n diagonalUp: boolean;\n\n constructor() {\n this.left = new ExcelBorderEdge();\n this.right = new ExcelBorderEdge();\n this.top = new ExcelBorderEdge();\n this.bottom = new ExcelBorderEdge();\n this.diagonal = new ExcelBorderEdge();\n this.diagonalDown = false;\n this.diagonalUp = false;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /** Sets all four sides to the same style and color. */\n static box(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n const edge = new ExcelBorderEdge(style, color);\n b.left = new ExcelBorderEdge(style, color);\n b.right = new ExcelBorderEdge(style, color);\n b.top = new ExcelBorderEdge(style, color);\n b.bottom = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static bottomOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.bottom = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static topOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.top = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static leftOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.left = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static rightOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.right = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static readonly none = new ExcelBorder();\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n const dd = this.diagonalDown ? ' diagonalDown=\"1\"' : '';\n const du = this.diagonalUp ? ' diagonalUp=\"1\"' : '';\n return `<border${dd}${du}>${this.left.toXml('left')}${this.right.toXml('right')}${this.top.toXml('top')}${this.bottom.toXml('bottom')}${this.diagonal.toXml('diagonal')}</border>`;\n }\n\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }>, borderAttrs: Record<string, string>): ExcelBorder {\n const b = new ExcelBorder();\n b.diagonalDown = borderAttrs['diagonalDown'] === '1';\n b.diagonalUp = borderAttrs['diagonalUp'] === '1';\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, '');\n const edge = ExcelBorderEdge.fromXmlElement(el);\n switch (tag) {\n case 'left': b.left = edge; break;\n case 'right': b.right = edge; break;\n case 'top': b.top = edge; break;\n case 'bottom': b.bottom = edge; break;\n case 'diagonal': b.diagonal = edge; break;\n }\n }\n\n return b;\n }\n\n cacheKey(): string {\n return [\n `l:${this.left.cacheKey()}`,\n `r:${this.right.cacheKey()}`,\n `t:${this.top.cacheKey()}`,\n `b:${this.bottom.cacheKey()}`,\n `d:${this.diagonal.cacheKey()}`,\n `dd:${this.diagonalDown}`,\n `du:${this.diagonalUp}`,\n ].join('|');\n }\n}\n","/**\n * Text alignment configuration for cells.\n * Port of TVE.PureDocs.Excel.ExcelAlignment (C#)\n */\n\nexport enum ExcelHorizontalAlignment {\n General = 'general',\n Left = 'left',\n Center = 'center',\n Right = 'right',\n Fill = 'fill',\n Justify = 'justify',\n CenterContinuous = 'centerContinuous',\n Distributed = 'distributed',\n}\n\nexport enum ExcelVerticalAlignment {\n Top = 'top',\n Center = 'center',\n Bottom = 'bottom',\n Justify = 'justify',\n Distributed = 'distributed',\n}\n\nexport enum ExcelReadingOrder {\n ContextDependent = 0,\n LeftToRight = 1,\n RightToLeft = 2,\n}\n\nexport class ExcelAlignment {\n horizontal?: ExcelHorizontalAlignment;\n vertical?: ExcelVerticalAlignment;\n wrapText?: boolean;\n shrinkToFit?: boolean;\n textRotation?: number;\n indent?: number;\n readingOrder?: ExcelReadingOrder;\n\n toXml(): string {\n const parts: string[] = [];\n if (this.horizontal) parts.push(`horizontal=\"${this.horizontal}\"`);\n if (this.vertical) parts.push(`vertical=\"${this.vertical}\"`);\n if (this.wrapText) parts.push('wrapText=\"1\"');\n if (this.shrinkToFit) parts.push('shrinkToFit=\"1\"');\n if (this.textRotation !== undefined) parts.push(`textRotation=\"${this.textRotation}\"`);\n if (this.indent !== undefined) parts.push(`indent=\"${this.indent}\"`);\n if (this.readingOrder !== undefined) parts.push(`readingOrder=\"${this.readingOrder}\"`);\n\n if (parts.length === 0) return '';\n return `<alignment ${parts.join(' ')}/>`;\n }\n\n static fromXmlAttrs(attrs: Record<string, string>): ExcelAlignment {\n const a = new ExcelAlignment();\n const h = attrs['horizontal'];\n const v = attrs['vertical'];\n\n if (h && (Object.values(ExcelHorizontalAlignment) as string[]).includes(h)) {\n a.horizontal = h as ExcelHorizontalAlignment;\n }\n if (v && (Object.values(ExcelVerticalAlignment) as string[]).includes(v)) {\n a.vertical = v as ExcelVerticalAlignment;\n }\n if (attrs['wrapText'] === '1' || attrs['wrapText'] === 'true') a.wrapText = true;\n if (attrs['shrinkToFit'] === '1' || attrs['shrinkToFit'] === 'true') a.shrinkToFit = true;\n if (attrs['textRotation'] !== undefined) a.textRotation = parseInt(attrs['textRotation']!, 10);\n if (attrs['indent'] !== undefined) a.indent = parseInt(attrs['indent']!, 10);\n if (attrs['readingOrder'] !== undefined) a.readingOrder = parseInt(attrs['readingOrder']!, 10) as ExcelReadingOrder;\n return a;\n }\n\n cacheKey(): string {\n return [\n `h:${this.horizontal ?? ''}`,\n `v:${this.vertical ?? ''}`,\n `w:${this.wrapText ?? false}`,\n `s:${this.shrinkToFit ?? false}`,\n `r:${this.textRotation ?? 0}`,\n `i:${this.indent ?? 0}`,\n `ro:${this.readingOrder ?? 0}`,\n ].join('|');\n }\n}\n","/**\n * Number format for cell display.\n * Port of TVE.PureDocs.Excel.ExcelNumberFormat (C#)\n *\n * Built-in format IDs (per OOXML spec §18.8.30):\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 * 11 = 0.00E+00\n * 14 = mm-dd-yy (date)\n * …\n * 49 = @ (text)\n * Custom formats start at ID 164.\n */\n\nconst BUILT_IN_FORMAT_CODES: Record<number, string> = {\n 0: 'General', 1: '0', 2: '0.00', 3: '#,##0', 4: '#,##0.00',\n 5: '$#,##0_);($#,##0)', 6: '$#,##0_);[Red]($#,##0)',\n 7: '$#,##0.00_);($#,##0.00)', 8: '$#,##0.00_);[Red]($#,##0.00)',\n 9: '0%', 10: '0.00%', 11: '0.00E+00', 12: '# ?/?', 13: '# ??/??',\n 14: 'mm-dd-yy', 15: 'd-mmm-yy', 16: 'd-mmm', 17: 'mmm-yy',\n 18: 'h:mm AM/PM', 19: 'h:mm:ss AM/PM', 20: 'h:mm', 21: 'h:mm:ss',\n 22: 'm/d/yy h:mm',\n 37: '#,##0 ;(#,##0)', 38: '#,##0 ;[Red](#,##0)',\n 39: '#,##0.00;(#,##0.00)', 40: '#,##0.00;[Red](#,##0.00)',\n 45: 'mm:ss', 46: '[h]:mm:ss', 47: 'mmss.0', 48: '##0.0E+0', 49: '@',\n};\n\nconst CODE_TO_BUILT_IN_ID: Map<string, number> = new Map(\n Object.entries(BUILT_IN_FORMAT_CODES).map(([id, code]) => [code, Number(id)]),\n);\n\nexport class ExcelNumberFormat {\n readonly formatCode: string;\n readonly formatId: number;\n\n private constructor(formatCode: string, formatId: number) {\n this.formatCode = formatCode;\n this.formatId = formatId;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /** Creates a number format from a custom format code string. */\n static custom(formatCode: string): ExcelNumberFormat {\n if (!formatCode) throw new Error('Format code cannot be empty.');\n\n // Check if it maps to a built-in format\n const builtInId = CODE_TO_BUILT_IN_ID.get(formatCode);\n if (builtInId !== undefined) {\n return new ExcelNumberFormat(formatCode, builtInId);\n }\n\n // Custom formats get ID assigned by StyleManager (starts at 164)\n return new ExcelNumberFormat(formatCode, 0);\n }\n\n /** Creates from format ID and optional custom formats map. */\n static fromFormatId(\n formatId: number,\n customFormats?: Map<number, string>,\n ): ExcelNumberFormat {\n // Check custom formats first\n if (customFormats && formatId >= 164) {\n const code = customFormats.get(formatId);\n if (code) return new ExcelNumberFormat(code, formatId);\n }\n\n // Built-in\n const code = BUILT_IN_FORMAT_CODES[formatId] ?? 'General';\n return new ExcelNumberFormat(code, formatId);\n }\n\n // ── Predefined formats (camelCase, per TypeScript convention) ─────────────\n\n static readonly general = new ExcelNumberFormat('General', 0);\n static readonly integer = new ExcelNumberFormat('0', 1);\n static readonly decimal2 = new ExcelNumberFormat('0.00', 2);\n static readonly thousandsSeparator = new ExcelNumberFormat('#,##0', 3);\n static readonly thousandsDecimal2 = new ExcelNumberFormat('#,##0.00', 4);\n static readonly percentage = new ExcelNumberFormat('0%', 9);\n static readonly percentageDecimal2 = new ExcelNumberFormat('0.00%', 10);\n static readonly scientific = new ExcelNumberFormat('0.00E+00', 11);\n static readonly fraction = new ExcelNumberFormat('# ?/?', 12);\n static readonly fractionTwoDigits = new ExcelNumberFormat('# ??/??', 13);\n static readonly shortDate = new ExcelNumberFormat('mm-dd-yy', 14);\n static readonly longDate = new ExcelNumberFormat('d-mmm-yy', 15);\n static readonly dayMonth = new ExcelNumberFormat('d-mmm', 16);\n static readonly monthYear = new ExcelNumberFormat('mmm-yy', 17);\n static readonly time12h = new ExcelNumberFormat('h:mm AM/PM', 18);\n static readonly time12hSeconds = new ExcelNumberFormat('h:mm:ss AM/PM', 19);\n static readonly time24h = new ExcelNumberFormat('h:mm', 20);\n static readonly time24hSeconds = new ExcelNumberFormat('h:mm:ss', 21);\n static readonly dateTime = new ExcelNumberFormat('m/d/yy h:mm', 22);\n static readonly accounting = new ExcelNumberFormat('#,##0 ;(#,##0)', 37);\n static readonly accountingRed = new ExcelNumberFormat('#,##0 ;[Red](#,##0)', 38);\n static readonly accountingDecimal2 = new ExcelNumberFormat('#,##0.00;(#,##0.00)', 39);\n static readonly text = new ExcelNumberFormat('@', 49);\n static readonly currency = ExcelNumberFormat.custom('$#,##0.00');\n static readonly currencyNoDecimal = ExcelNumberFormat.custom('$#,##0');\n static readonly isoDate = ExcelNumberFormat.custom('yyyy-mm-dd');\n static readonly isoDateTime = ExcelNumberFormat.custom('yyyy-mm-dd hh:mm:ss');\n static readonly phoneNumber = ExcelNumberFormat.custom('[<=9999999]###-####;(###) ###-####');\n static readonly zipCode = ExcelNumberFormat.custom('00000');\n\n /** Returns true if this format code represents a date/time value. */\n isDateFormat(): boolean {\n const id = this.formatId;\n if ((id >= 14 && id <= 22) || (id >= 45 && id <= 47)) return true;\n\n const lower = this.formatCode.toLowerCase();\n // Check for date patterns — avoid false positive on mm:ss (time only)\n return (\n lower.includes('y') ||\n lower.includes('d') ||\n (lower.includes('m') && !lower.startsWith('mm:') && !lower.startsWith('[')) ||\n (lower.includes('h') && !lower.startsWith('[h]'))\n );\n }\n\n toString(): string {\n return this.formatCode;\n }\n}\n","/**\n * Complete cell style configuration with fluent builder API.\n * Port of TVE.PureDocs.Excel.CellStyle (C#)\n *\n * Key difference from C#: method names are camelCase (setBold vs SetBold).\n */\nimport { ExcelFont, ExcelUnderline, ExcelVerticalAlignRun } from './excel-font.js';\nimport { ExcelFill, ExcelPatternType } from './excel-fill.js';\nimport { ExcelBorder, ExcelBorderStyle, ExcelBorderEdge } from './excel-border.js';\nimport { ExcelAlignment, ExcelHorizontalAlignment, ExcelVerticalAlignment } from './excel-alignment.js';\nimport { ExcelNumberFormat } from './excel-number-format.js';\nimport { ExcelColor } from './excel-color.js';\n\nexport class CellStyle {\n font?: ExcelFont;\n fill?: ExcelFill;\n border?: ExcelBorder;\n alignment?: ExcelAlignment;\n numberFormat?: ExcelNumberFormat;\n isLocked?: boolean;\n isHidden?: boolean;\n\n // ── Font fluent API ────────────────────────────────────────────────────────\n\n setFontName(name: string): this {\n this.#ensureFont().name = name;\n return this;\n }\n\n setFontSize(size: number): this {\n this.#ensureFont().size = size;\n return this;\n }\n\n setBold(bold = true): this {\n this.#ensureFont().bold = bold;\n return this;\n }\n\n setItalic(italic = true): this {\n this.#ensureFont().italic = italic;\n return this;\n }\n\n setUnderline(underline: ExcelUnderline = ExcelUnderline.Single): this {\n this.#ensureFont().underline = underline;\n return this;\n }\n\n setStrikethrough(strikethrough = true): this {\n this.#ensureFont().strikethrough = strikethrough;\n return this;\n }\n\n setFontColor(color: ExcelColor): this;\n setFontColor(hex: string): this;\n setFontColor(colorOrHex: ExcelColor | string): this {\n this.#ensureFont().color =\n typeof colorOrHex === 'string' ? ExcelColor.fromHex(colorOrHex) : colorOrHex;\n return this;\n }\n\n setVerticalAlign(align: ExcelVerticalAlignRun): this {\n this.#ensureFont().verticalAlign = align;\n return this;\n }\n\n // ── Fill fluent API ────────────────────────────────────────────────────────\n\n setBackgroundColor(color: ExcelColor): this;\n setBackgroundColor(hex: string): this;\n setBackgroundColor(colorOrHex: ExcelColor | string): this {\n const color = typeof colorOrHex === 'string' ? ExcelColor.fromHex(colorOrHex) : colorOrHex;\n this.fill = ExcelFill.solid(color);\n return this;\n }\n\n setPatternFill(\n pattern: ExcelPatternType,\n foreground: ExcelColor,\n background?: ExcelColor,\n ): this {\n this.fill = ExcelFill.pattern(pattern, foreground, background);\n return this;\n }\n\n // ── Border fluent API ──────────────────────────────────────────────────────\n\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.border = ExcelBorder.box(style, color);\n return this;\n }\n\n setBorder(border: ExcelBorder): this {\n this.border = border;\n return this;\n }\n\n setLeftBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().left = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setRightBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().right = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setTopBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().top = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setBottomBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().bottom = new ExcelBorderEdge(style, color);\n return this;\n }\n\n // ── Alignment fluent API ───────────────────────────────────────────────────\n\n setHorizontalAlignment(alignment: ExcelHorizontalAlignment): this {\n this.#ensureAlignment().horizontal = alignment;\n return this;\n }\n\n setVerticalAlignment(alignment: ExcelVerticalAlignment): this {\n this.#ensureAlignment().vertical = alignment;\n return this;\n }\n\n setWrapText(wrap = true): this {\n this.#ensureAlignment().wrapText = wrap;\n return this;\n }\n\n setShrinkToFit(shrink = true): this {\n this.#ensureAlignment().shrinkToFit = shrink;\n return this;\n }\n\n setTextRotation(degrees: number): this {\n this.#ensureAlignment().textRotation = degrees;\n return this;\n }\n\n setIndent(indent: number): this {\n this.#ensureAlignment().indent = indent;\n return this;\n }\n\n // ── Number format fluent API ───────────────────────────────────────────────\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n this.numberFormat =\n typeof formatOrCode === 'string'\n ? ExcelNumberFormat.custom(formatOrCode)\n : formatOrCode;\n return this;\n }\n\n // ── Protection fluent API ──────────────────────────────────────────────────\n\n setLocked(locked = true): this {\n this.isLocked = locked;\n return this;\n }\n\n setFormulaHidden(hidden = true): this {\n this.isHidden = hidden;\n return this;\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n /** Creates a deep copy of this style. */\n clone(): CellStyle {\n const s = new CellStyle();\n if (this.font) s.font = this.font.clone();\n s.fill = this.fill; // ExcelFill is effectively immutable via factory methods\n s.border = this.border;\n s.alignment = this.alignment\n ? Object.assign(new ExcelAlignment(), this.alignment)\n : undefined;\n s.numberFormat = this.numberFormat;\n s.isLocked = this.isLocked;\n s.isHidden = this.isHidden;\n return s;\n }\n\n #ensureFont(): ExcelFont {\n if (!this.font) this.font = new ExcelFont();\n return this.font;\n }\n\n #ensureBorder(): ExcelBorder {\n if (!this.border) this.border = new ExcelBorder();\n return this.border;\n }\n\n #ensureAlignment(): ExcelAlignment {\n if (!this.alignment) this.alignment = new ExcelAlignment();\n return this.alignment;\n }\n}\n","/**\n * Manages the workbook stylesheet — fonts, fills, borders, number formats, cell formats.\n * Handles deduplication and index management.\n *\n * Port of TVE.PureDocs.Excel.StyleManager (C#)\n *\n * Key differences:\n * - Works with parsed XmlElement trees instead of OpenXml SDK objects\n * - Serialises directly to XML strings\n * - No lazy save — isDirty flag still used, caller must call buildStylesXml()\n */\nimport { CellStyle } from './cell-style.js';\nimport { ExcelFont } from './excel-font.js';\nimport { ExcelFill, ExcelPatternType } from './excel-fill.js';\nimport { ExcelBorder } from './excel-border.js';\nimport { ExcelAlignment } from './excel-alignment.js';\nimport { ExcelNumberFormat } from './excel-number-format.js';\nimport { ExcelColor } from './excel-color.js';\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\n\ninterface FontEntry { font: ExcelFont; key: string; }\ninterface FillEntry { fill: ExcelFill; key: string; }\ninterface BorderEntry{ border: ExcelBorder; key: string; }\ninterface NumFmtEntry{ code: string; id: number; }\n\ninterface CellFormat {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n applyFont: boolean;\n applyFill: boolean;\n applyBorder: boolean;\n applyNumFmt: boolean;\n alignment?: ExcelAlignment;\n applyAlign: boolean;\n isLocked?: boolean;\n isHidden?: boolean;\n applyProt: boolean;\n}\n\nexport class StyleManager {\n // Index arrays — position = index\n private fonts: FontEntry[] = [];\n private fills: FillEntry[] = [];\n private borders: BorderEntry[] = [];\n private numFmts: NumFmtEntry[] = [];\n private cellXfs: CellFormat[] = [];\n\n // Dedup caches: key → index\n private fontCache: Map<string, number> = new Map();\n private fillCache: Map<string, number> = new Map();\n private borderCache: Map<string, number> = new Map();\n private numFmtCache: Map<string, number> = new Map(); // code → id\n private cellXfCache: Map<string, number> = new Map();\n\n private nextCustomNumFmtId = 164;\n isDirty = false;\n\n constructor() {\n this.#initDefaults();\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Returns the cellXf index for the given CellStyle.\n * Creates new font/fill/border entries as needed (with deduplication).\n */\n getOrCreateCellFormatIndex(style: CellStyle): number {\n const fontId = style.font ? this.#getOrCreateFont(style.font) : 0;\n const fillId = style.fill ? this.#getOrCreateFill(style.fill) : 0;\n const borderId = style.border ? this.#getOrCreateBorder(style.border): 0;\n const numFmtId = style.numberFormat\n ? this.#getOrCreateNumFmt(style.numberFormat)\n : 0;\n\n const cf: CellFormat = {\n fontId, fillId, borderId, numFmtId,\n applyFont: style.font != null,\n applyFill: style.fill != null,\n applyBorder: style.border != null,\n applyNumFmt: style.numberFormat != null,\n alignment: style.alignment,\n applyAlign: style.alignment != null,\n isLocked: style.isLocked,\n isHidden: style.isHidden,\n applyProt: style.isLocked != null || style.isHidden != null,\n };\n\n const key = this.#cellFormatKey(cf);\n const existing = this.cellXfCache.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.cellXfs.length;\n this.cellXfs.push(cf);\n this.cellXfCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n /**\n * Reconstructs a CellStyle from a cellXf index.\n * Used by Cell.style getter.\n */\n getCellStyle(styleIndex: number): CellStyle {\n const cf = this.cellXfs[styleIndex];\n if (!cf) return new CellStyle();\n\n const s = new CellStyle();\n\n const fontEntry = this.fonts[cf.fontId];\n if (fontEntry && cf.applyFont) s.font = fontEntry.font;\n\n const fillEntry = this.fills[cf.fillId];\n if (fillEntry && cf.applyFill) s.fill = fillEntry.fill;\n\n const borderEntry = this.borders[cf.borderId];\n if (borderEntry && cf.applyBorder) s.border = borderEntry.border;\n\n if (cf.applyNumFmt) {\n const customMap = new Map(\n this.numFmts.map(n => [n.id, n.code] as [number, string]),\n );\n s.numberFormat = ExcelNumberFormat.fromFormatId(cf.numFmtId, customMap);\n }\n\n if (cf.alignment && cf.applyAlign) s.alignment = cf.alignment;\n if (cf.applyProt) {\n s.isLocked = cf.isLocked;\n s.isHidden = cf.isHidden;\n }\n\n return s;\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /** Builds the complete xl/styles.xml string. */\n buildStylesXml(): string {\n const numFmtsXml = this.numFmts.length > 0\n ? `<numFmts count=\"${this.numFmts.length}\">${this.numFmts.map(n => `<numFmt numFmtId=\"${n.id}\" formatCode=\"${escAttr(n.code)}\"/>`).join('')}</numFmts>`\n : '';\n\n const fontsXml = `<fonts count=\"${this.fonts.length}\">${this.fonts.map(f => f.font.toXml()).join('')}</fonts>`;\n\n const fillsXml = `<fills count=\"${this.fills.length}\">${this.fills.map(f => f.fill.toXml()).join('')}</fills>`;\n\n const bordersXml = `<borders count=\"${this.borders.length}\">${this.borders.map(b => b.border.toXml()).join('')}</borders>`;\n\n const cellXfsXml = `<cellXfs count=\"${this.cellXfs.length}\">${this.cellXfs.map(cf => this.#cfToXml(cf)).join('')}</cellXfs>`;\n\n this.isDirty = false;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n${numFmtsXml}${fontsXml}${fillsXml}${bordersXml}\n<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>\n${cellXfsXml}\n</styleSheet>`;\n }\n\n /** Loads an existing styles.xml, rebuilding all caches. */\n loadFromXml(stylesXml: string): void {\n this.fonts = [];\n this.fills = [];\n this.borders = [];\n this.numFmts = [];\n this.cellXfs = [];\n this.fontCache.clear();\n this.fillCache.clear();\n this.borderCache.clear();\n this.numFmtCache.clear();\n this.cellXfCache.clear();\n this.nextCustomNumFmtId = 164;\n\n const root = parseXml(stylesXml);\n\n // numFmts\n for (const el of getElementsByTagName(root, 'numFmt')) {\n const id = parseInt(getAttr(el, 'numFmtId') ?? '0', 10);\n const code = getAttr(el, 'formatCode') ?? '';\n this.numFmts.push({ id, code });\n this.numFmtCache.set(code, id);\n if (id >= this.nextCustomNumFmtId) this.nextCustomNumFmtId = id + 1;\n }\n\n // fonts\n for (const el of getElementsByTagName(root, 'fonts')) {\n for (const fontEl of el.children) {\n const font = ExcelFont.fromXmlChildren(fontEl.children as Parameters<typeof ExcelFont.fromXmlChildren>[0]);\n const key = font.cacheKey();\n this.fonts.push({ font, key });\n this.fontCache.set(key, this.fonts.length - 1);\n }\n }\n\n // fills\n for (const el of getElementsByTagName(root, 'fills')) {\n for (const fillEl of el.children) {\n const fill = ExcelFill.fromXmlChildren(fillEl.children as Parameters<typeof ExcelFill.fromXmlChildren>[0]);\n const key = fill.cacheKey();\n this.fills.push({ fill, key });\n this.fillCache.set(key, this.fills.length - 1);\n }\n }\n\n // borders\n for (const el of getElementsByTagName(root, 'borders')) {\n for (const borderEl of el.children) {\n const border = ExcelBorder.fromXmlChildren(\n borderEl.children as Parameters<typeof ExcelBorder.fromXmlChildren>[0],\n borderEl.attributes,\n );\n const key = border.cacheKey();\n this.borders.push({ border, key });\n this.borderCache.set(key, this.borders.length - 1);\n }\n }\n\n // cellXfs (main cell formats)\n for (const el of getElementsByTagName(root, 'cellXfs')) {\n for (const xfEl of el.children) {\n const cf: CellFormat = {\n fontId: parseInt(getAttr(xfEl, 'fontId') ?? '0', 10),\n fillId: parseInt(getAttr(xfEl, 'fillId') ?? '0', 10),\n borderId: parseInt(getAttr(xfEl, 'borderId') ?? '0', 10),\n numFmtId: parseInt(getAttr(xfEl, 'numFmtId') ?? '0', 10),\n applyFont: getAttr(xfEl, 'applyFont') === '1',\n applyFill: getAttr(xfEl, 'applyFill') === '1',\n applyBorder: getAttr(xfEl, 'applyBorder') === '1',\n applyNumFmt: getAttr(xfEl, 'applyNumberFormat') === '1',\n applyAlign: getAttr(xfEl, 'applyAlignment') === '1',\n applyProt: getAttr(xfEl, 'applyProtection') === '1',\n };\n\n // alignment child\n const alignEl = xfEl.children.find(c => c.tagName.replace(/^.*:/, '') === 'alignment');\n if (alignEl) cf.alignment = ExcelAlignment.fromXmlAttrs(alignEl.attributes);\n\n const key = this.#cellFormatKey(cf);\n this.cellXfs.push(cf);\n this.cellXfCache.set(key, this.cellXfs.length - 1);\n }\n }\n\n // Ensure defaults exist\n if (this.fonts.length === 0) this.#initDefaults();\n if (this.cellXfs.length === 0) this.#initDefaults();\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n #initDefaults(): void {\n // Default font — Calibri 11pt\n const defaultFont = new ExcelFont({ name: 'Calibri', size: 11 });\n const fontKey = defaultFont.cacheKey();\n this.fonts = [{ font: defaultFont, key: fontKey }];\n this.fontCache.set(fontKey, 0);\n\n // Required fills: none + gray125\n const noneFill = new ExcelFill(ExcelPatternType.None);\n const grayFill = new ExcelFill(ExcelPatternType.Gray125);\n this.fills = [\n { fill: noneFill, key: noneFill.cacheKey() },\n { fill: grayFill, key: grayFill.cacheKey() },\n ];\n this.fillCache.set(noneFill.cacheKey(), 0);\n this.fillCache.set(grayFill.cacheKey(), 1);\n\n // Default border — all empty\n const defaultBorder = new ExcelBorder();\n const borderKey = defaultBorder.cacheKey();\n this.borders = [{ border: defaultBorder, key: borderKey }];\n this.borderCache.set(borderKey, 0);\n\n // Default cell format\n const defaultCf: CellFormat = {\n fontId: 0, fillId: 0, borderId: 0, numFmtId: 0,\n applyFont: false, applyFill: false, applyBorder: false,\n applyNumFmt: false, applyAlign: false, applyProt: false,\n };\n const cfKey = this.#cellFormatKey(defaultCf);\n this.cellXfs = [defaultCf];\n this.cellXfCache.set(cfKey, 0);\n }\n\n #getOrCreateFont(font: ExcelFont): number {\n const key = font.cacheKey();\n const existing = this.fontCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.fonts.length;\n this.fonts.push({ font, key });\n this.fontCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateFill(fill: ExcelFill): number {\n const key = fill.cacheKey();\n const existing = this.fillCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.fills.length;\n this.fills.push({ fill, key });\n this.fillCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateBorder(border: ExcelBorder): number {\n const key = border.cacheKey();\n const existing = this.borderCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.borders.length;\n this.borders.push({ border, key });\n this.borderCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateNumFmt(fmt: ExcelNumberFormat): number {\n // Built-in formats (ID < 164) don't need to be stored\n if (fmt.formatId > 0 && fmt.formatId < 164) return fmt.formatId;\n if (fmt.formatCode === 'General') return 0;\n\n const existing = this.numFmtCache.get(fmt.formatCode);\n if (existing !== undefined) return existing;\n\n const id = this.nextCustomNumFmtId++;\n this.numFmts.push({ id, code: fmt.formatCode });\n this.numFmtCache.set(fmt.formatCode, id);\n this.isDirty = true;\n return id;\n }\n\n #cellFormatKey(cf: CellFormat): string {\n return [\n cf.fontId, cf.fillId, cf.borderId, cf.numFmtId,\n cf.applyFont, cf.applyFill, cf.applyBorder, cf.applyNumFmt,\n cf.applyAlign, cf.applyProt,\n cf.alignment?.cacheKey() ?? '',\n cf.isLocked ?? '',\n cf.isHidden ?? '',\n ].join('|');\n }\n\n #cfToXml(cf: CellFormat): string {\n const attrs = [\n `numFmtId=\"${cf.numFmtId}\"`,\n `fontId=\"${cf.fontId}\"`,\n `fillId=\"${cf.fillId}\"`,\n `borderId=\"${cf.borderId}\"`,\n `xfId=\"0\"`,\n cf.applyFont ? 'applyFont=\"1\"' : '',\n cf.applyFill ? 'applyFill=\"1\"' : '',\n cf.applyBorder ? 'applyBorder=\"1\"' : '',\n cf.applyNumFmt ? 'applyNumberFormat=\"1\"' : '',\n cf.applyAlign ? 'applyAlignment=\"1\"' : '',\n cf.applyProt ? 'applyProtection=\"1\"' : '',\n ].filter(Boolean).join(' ');\n\n const alignXml = cf.alignment?.toXml() ?? '';\n const protXml = cf.applyProt\n ? `<protection${cf.isLocked !== undefined ? ` locked=\"${cf.isLocked ? '1' : '0'}\"` : ''}${cf.isHidden !== undefined ? ` hidden=\"${cf.isHidden ? '1' : '0'}\"` : ''}/>`\n : '';\n\n const inner = alignXml + protXml;\n return inner ? `<xf ${attrs}>${inner}</xf>` : `<xf ${attrs}/>`;\n }\n}\n\nfunction escAttr(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n","/**\r\n * Renders a numeric value through an OOXML number-format code.\r\n *\r\n * Deliberately a *subset* of the full spec — it covers the codes an editor\r\n * actually round-trips (integers, fixed decimals, thousands separators,\r\n * currency, percentages, and positive/negative/zero sections) and returns\r\n * `null` for anything it does not understand, so callers can fall back to the\r\n * raw value rather than display something wrong.\r\n *\r\n * Not handled (returns null): fractions (`# ?/?`), scientific (`0.00E+00`),\r\n * date/time codes (handled by the date path in Cell), and conditional sections\r\n * such as `[<=9999999]###-####`.\r\n */\r\n\r\n/** Splits a format code on unquoted ';' separators. */\r\nfunction splitSections(code: string): string[] {\r\n const sections: string[] = [];\r\n let current = '';\r\n let inQuote = false;\r\n\r\n for (let i = 0; i < code.length; i++) {\r\n const ch = code[i]!;\r\n if (ch === '\"') { inQuote = !inQuote; current += ch; continue; }\r\n if (ch === '\\\\' && i + 1 < code.length) { current += ch + code[++i]!; continue; }\r\n if (ch === ';' && !inQuote) { sections.push(current); current = ''; continue; }\r\n current += ch;\r\n }\r\n sections.push(current);\r\n return sections;\r\n}\r\n\r\n/** True when the section uses constructs this renderer intentionally skips. */\r\nfunction isUnsupported(section: string): boolean {\r\n // Conditional/comparison sections: [<=100], [>0]. Colour and locale brackets\r\n // ([Red], [$-409], [$€-x-euro]) are fine — they are stripped below.\r\n if (/\\[[<>=]/.test(section)) return true;\r\n if (/[?]/.test(section)) return true; // fractions\r\n if (/[Ee][+-]/.test(section)) return true; // scientific\r\n return false;\r\n}\r\n\r\ninterface Parsed {\r\n literalOnly: boolean;\r\n prefix: string;\r\n suffix: string;\r\n minIntDigits: number;\r\n decimals: number;\r\n useGrouping: boolean;\r\n percentScale: number;\r\n}\r\n\r\n/**\r\n * Parses one section into literal prefix/suffix plus the numeric pattern.\r\n * A section with no digit placeholder is literal-only (e.g. the `\"—\"` zero\r\n * section of `0.00;-0.00;\"—\"`) and renders as just that text.\r\n */\r\nfunction parseSection(section: string): Parsed {\r\n // Strip colour / locale / condition brackets, keeping any currency symbol\r\n // carried inside a locale bracket (e.g. \"[$€-x-euro]\" → \"€\").\r\n const stripped = section.replace(/\\[(\\$([^\\]-]*)[^\\]]*|[^\\]]*)\\]/g, (_m, _all, currency) =>\r\n typeof currency === 'string' ? currency : '',\r\n );\r\n\r\n let prefix = '';\r\n let suffix = '';\r\n let pattern = '';\r\n let seenPattern = false;\r\n let percentScale = 1;\r\n\r\n for (let i = 0; i < stripped.length; i++) {\r\n const ch = stripped[i]!;\r\n\r\n // Quoted literal\r\n if (ch === '\"') {\r\n const end = stripped.indexOf('\"', i + 1);\r\n const literal = stripped.slice(i + 1, end < 0 ? undefined : end);\r\n if (seenPattern) suffix += literal; else prefix += literal;\r\n i = end < 0 ? stripped.length : end;\r\n continue;\r\n }\r\n // Escaped character\r\n if (ch === '\\\\' && i + 1 < stripped.length) {\r\n const literal = stripped[++i]!;\r\n if (seenPattern) suffix += literal; else prefix += literal;\r\n continue;\r\n }\r\n // '_x' reserves the width of x; '*x' repeats x as fill. Both are layout\r\n // hints with no textual output here.\r\n if (ch === '_' || ch === '*') { i++; continue; }\r\n\r\n if (ch === '#' || ch === '0' || ch === '.' || ch === ',') {\r\n pattern += ch;\r\n seenPattern = true;\r\n continue;\r\n }\r\n\r\n if (ch === '%') {\r\n percentScale *= 100;\r\n if (seenPattern) suffix += ch; else prefix += ch;\r\n continue;\r\n }\r\n\r\n if (seenPattern) suffix += ch; else prefix += ch;\r\n }\r\n\r\n const dot = pattern.indexOf('.');\r\n const intPart = dot < 0 ? pattern : pattern.slice(0, dot);\r\n const fracPart = dot < 0 ? '' : pattern.slice(dot + 1);\r\n\r\n return {\r\n literalOnly: !seenPattern,\r\n prefix,\r\n suffix,\r\n minIntDigits: (intPart.match(/0/g) ?? []).length,\r\n decimals: (fracPart.match(/[#0]/g) ?? []).length,\r\n useGrouping: intPart.includes(','),\r\n percentScale,\r\n };\r\n}\r\n\r\nfunction renderNumber(value: number, p: Parsed): string {\r\n if (p.literalOnly) return p.prefix + p.suffix;\r\n\r\n const scaled = value * p.percentScale;\r\n const fixed = scaled.toFixed(p.decimals);\r\n\r\n let [intDigits = '0', fracDigits = ''] = fixed.split('.');\r\n if (intDigits.length < p.minIntDigits) {\r\n intDigits = intDigits.padStart(p.minIntDigits, '0');\r\n }\r\n if (p.useGrouping) {\r\n intDigits = intDigits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\r\n }\r\n\r\n return p.prefix + intDigits + (fracDigits ? `.${fracDigits}` : '') + p.suffix;\r\n}\r\n\r\n/**\r\n * Applies `formatCode` to `value`.\r\n *\r\n * @returns the formatted string, or `null` when the code is outside the\r\n * supported subset (caller should fall back to the raw value).\r\n */\r\nexport function formatNumberWithCode(value: number, formatCode: string): string | null {\r\n if (!Number.isFinite(value)) return null;\r\n if (!formatCode || formatCode === 'General') return null;\r\n if (formatCode === '@') return String(value);\r\n\r\n const sections = splitSections(formatCode);\r\n // Sections are positive; negative; zero; text — later ones are optional and\r\n // fall back to the first.\r\n const negative = sections[1];\r\n const zero = sections[2];\r\n\r\n let section: string | undefined;\r\n let magnitude = value;\r\n\r\n if (value === 0 && zero !== undefined) {\r\n section = zero;\r\n } else if (value < 0 && negative !== undefined) {\r\n // A dedicated negative section supplies its own sign convention (a literal\r\n // '-', or parentheses), so the value is rendered unsigned.\r\n section = negative;\r\n magnitude = Math.abs(value);\r\n } else {\r\n section = sections[0];\r\n }\r\n\r\n if (section === undefined || isUnsupported(section)) return null;\r\n\r\n return renderNumber(magnitude, parseSection(section));\r\n}\r\n","/**\n * Utility for converting between cell references (e.g. \"A1\") and\n * 1-based row/column indices.\n *\n * Port of TVE.PureDocs.Excel.CellReference (C#)\n */\n\nexport interface ParsedCellRef {\n readonly row: number;\n readonly column: number;\n}\n\n/**\n * Parses a cell reference string into 1-based row and column indices.\n *\n * @example\n * parseCellRef(\"A1\") // { row: 1, column: 1 }\n * parseCellRef(\"B10\") // { row: 10, column: 2 }\n * parseCellRef(\"AA1\") // { row: 1, column: 27 }\n * parseCellRef(\"$B$2\") // { row: 2, column: 2 } — $ stripped\n */\nexport function parseCellRef(cellReference: string): ParsedCellRef {\n if (!cellReference) {\n throw new Error('Cell reference cannot be null or empty.');\n }\n\n // Strip absolute reference markers\n const ref = cellReference.replace(/\\$/g, '').toUpperCase();\n\n let i = 0;\n let column = 0;\n\n // Parse column letters\n while (i < ref.length && ref.charCodeAt(i) >= 65 && ref.charCodeAt(i) <= 90) {\n column = column * 26 + (ref.charCodeAt(i) - 64); // 'A' = 65, so A-64 = 1\n i++;\n }\n\n if (column === 0) {\n throw new Error(`Invalid cell reference: \"${cellReference}\" — no column letters found.`);\n }\n\n // Parse row digits\n const rowStr = ref.slice(i);\n const row = parseInt(rowStr, 10);\n\n if (isNaN(row) || row < 1 || rowStr === '') {\n throw new Error(`Invalid cell reference: \"${cellReference}\" — no valid row number found.`);\n }\n\n return { row, column };\n}\n\n/**\n * Converts 1-based row and column indices to a cell reference string.\n *\n * @example\n * cellRefFromRowCol(1, 1) // \"A1\"\n * cellRefFromRowCol(10, 2) // \"B10\"\n * cellRefFromRowCol(1, 27) // \"AA1\"\n */\nexport function cellRefFromRowCol(row: number, column: number): string {\n if (row < 1) throw new RangeError(`Row must be >= 1, got ${row}.`);\n if (column < 1) throw new RangeError(`Column must be >= 1, got ${column}.`);\n\n return `${columnLetter(column)}${row}`;\n}\n\n/**\n * Converts a 1-based column index to its letter representation.\n *\n * @example\n * columnLetter(1) // \"A\"\n * columnLetter(26) // \"Z\"\n * columnLetter(27) // \"AA\"\n */\nexport function columnLetter(column: number): string {\n if (column < 1) throw new RangeError(`Column must be >= 1, got ${column}.`);\n\n let result = '';\n let col = column;\n\n while (col > 0) {\n const remainder = (col - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n col = Math.floor((col - remainder) / 26);\n }\n\n return result;\n}\n\n/**\n * Converts a column letter string to a 1-based column number.\n *\n * @example\n * columnNumber(\"A\") // 1\n * columnNumber(\"Z\") // 26\n * columnNumber(\"AA\") // 27\n */\nexport function columnNumber(letters: string): number {\n if (!letters) throw new Error('Column letter cannot be empty.');\n\n const upper = letters.toUpperCase();\n let col = 0;\n\n for (let i = 0; i < upper.length; i++) {\n const code = upper.charCodeAt(i);\n if (code < 65 || code > 90) {\n throw new Error(`Invalid column letter: \"${letters}\".`);\n }\n col = col * 26 + (code - 64);\n }\n\n return col;\n}\n\n/**\n * Parses a range reference string like \"A1:B10\" into start/end coordinates.\n */\nexport function parseRangeRef(rangeReference: string): {\n startRow: number;\n startColumn: number;\n endRow: number;\n endColumn: number;\n} {\n const parts = rangeReference.split(':');\n if (parts.length !== 2) {\n throw new Error(`Invalid range reference: \"${rangeReference}\" — expected \"A1:B10\" format.`);\n }\n\n const start = parseCellRef(parts[0]!);\n const end = parseCellRef(parts[1]!);\n\n if (start.row > end.row || start.column > end.column) {\n throw new Error(\n `Invalid range reference: \"${rangeReference}\" — start must be top-left of end.`,\n );\n }\n\n return {\n startRow: start.row,\n startColumn: start.column,\n endRow: end.row,\n endColumn: end.column,\n };\n}\n","/**\n * OLE Automation Date (OADate) helpers.\n *\n * Excel stores dates as floating-point numbers where:\n * - The integer part = number of days since Dec 30, 1899 (OADate epoch)\n * - The fractional part = time of day (0.5 = noon)\n *\n * Note: Excel has a known bug treating 1900 as a leap year (day 60 = Feb 29 1900),\n * which never existed. This implementation matches Excel's behaviour exactly.\n */\n\n// OADate epoch: Dec 30, 1899 00:00:00 UTC\nconst OA_EPOCH_MS = Date.UTC(1899, 11, 30, 0, 0, 0, 0);\nconst MS_PER_DAY = 86_400_000;\n\n/**\n * Converts a JavaScript Date to an Excel OADate serial number.\n *\n * @example\n * toOADate(new Date(1900, 0, 1)) // 1\n * toOADate(new Date(2025, 0, 1)) // 45658\n */\nexport function toOADate(date: Date): number {\n const utcMs = Date.UTC(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n return (utcMs - OA_EPOCH_MS) / MS_PER_DAY;\n}\n\n/**\n * Converts an Excel OADate serial number to a JavaScript Date.\n *\n * @example\n * fromOADate(1) // Jan 1, 1900\n * fromOADate(45658) // Jan 1, 2025\n */\nexport function fromOADate(oaDate: number): Date {\n const ms = OA_EPOCH_MS + oaDate * MS_PER_DAY;\n const d = new Date(ms);\n // Return local date (strip UTC offset)\n return new Date(\n d.getUTCFullYear(),\n d.getUTCMonth(),\n d.getUTCDate(),\n d.getUTCHours(),\n d.getUTCMinutes(),\n d.getUTCSeconds(),\n d.getUTCMilliseconds(),\n );\n}\n\n/**\n * Built-in date format IDs per OOXML spec (§18.8.30).\n * IDs 14–22 and 45–47 are date/time formats.\n */\nconst DATE_FORMAT_IDS = new Set([14, 15, 16, 17, 18, 19, 20, 21, 22, 45, 46, 47]);\n\n/**\n * Returns true if the given number format ID represents a date/time value.\n */\nexport function isDateFormatId(formatId: number): boolean {\n return DATE_FORMAT_IDS.has(formatId);\n}\n\n/**\n * Returns true if the format code string contains date/time patterns.\n */\nexport function isDateFormatCode(formatCode: string): boolean {\n const lower = formatCode.toLowerCase();\n return (\n lower.includes('y') ||\n lower.includes('d') ||\n (lower.includes('m') && !lower.includes('mm:')) || // m = month unless part of mm:ss\n lower.includes('h') ||\n lower.includes('am') ||\n lower.includes('pm')\n );\n}\n","/**\r\n * Represents a single cell in a worksheet.\r\n * Port of TVE.PureDocs.Excel.Cell (C#)\r\n *\r\n * Key differences from C#:\r\n * - All method names are camelCase\r\n * - No OpenXml SDK dependency — works with plain XML strings\r\n * - DateTime uses JavaScript Date\r\n */\r\nimport { SharedStringManager } from './shared-string-manager.js';\r\nimport { StyleManager } from '../style/style-manager.js';\r\nimport { CellStyle } from '../style/cell-style.js';\r\nimport { ExcelColor } from '../style/excel-color.js';\r\nimport { ExcelBorderStyle } from '../style/excel-border.js';\r\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\r\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\r\nimport { formatNumberWithCode } from '../style/number-format-renderer.js';\r\nimport { parseCellRef } from './cell-reference.js';\r\nimport { toOADate, fromOADate, isDateFormatId, isDateFormatCode } from './oa-date.js';\r\n\r\n/** Possible raw types stored in a cell. */\r\nexport type CellValue = string | number | boolean | Date | null;\r\n\r\n/** Internal cell data representation (mirrors what OOXML stores). */\r\nexport interface CellData {\r\n reference: string; // e.g. \"A1\"\r\n /** 's' = sharedString, 'n' = number, 'b' = boolean, 'str' = inlineStr */\r\n dataType?: 's' | 'n' | 'b' | 'str';\r\n rawValue?: string; // raw text from <v>\r\n formula?: string; // formula text (without leading =)\r\n /** Spill range for a dynamic-array formula anchor, e.g. \"A1:A3\". */\r\n arrayRef?: string;\r\n styleIndex: number; // index into cellXfs\r\n}\r\n\r\nexport class Cell {\r\n readonly #data: CellData;\r\n readonly #sharedStrings: SharedStringManager;\r\n readonly #styles: StyleManager;\r\n\r\n /** @internal */\r\n constructor(data: CellData, sharedStrings: SharedStringManager, styles: StyleManager) {\r\n this.#data = data;\r\n this.#sharedStrings = sharedStrings;\r\n this.#styles = styles;\r\n }\r\n\r\n // ── Identity ───────────────────────────────────────────────────────────────\r\n\r\n /** Cell reference string e.g. \"A1\". */\r\n get reference(): string { return this.#data.reference; }\r\n\r\n /** 1-based row index. */\r\n get row(): number { return parseCellRef(this.#data.reference).row; }\r\n\r\n /** 1-based column index. */\r\n get column(): number { return parseCellRef(this.#data.reference).column; }\r\n\r\n // ── Value API ──────────────────────────────────────────────────────────────\r\n\r\n /** Sets a string value. */\r\n setValue(value: string): this;\r\n /** Sets a numeric value. */\r\n setValue(value: number): this;\r\n /** Sets a boolean value. */\r\n setValue(value: boolean): this;\r\n /** Sets a Date value (stored as OADate number). */\r\n setValue(value: Date): this;\r\n /** Clears the cell value (sets to null). */\r\n setValue(value: null): this;\r\n setValue(value: CellValue): this {\r\n this.#data.formula = undefined;\r\n\r\n if (value === null || value === undefined) {\r\n this.#data.dataType = undefined;\r\n this.#data.rawValue = undefined;\r\n return this;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const idx = this.#sharedStrings.addOrGet(value);\r\n this.#data.dataType = 's';\r\n this.#data.rawValue = String(idx);\r\n return this;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n this.#data.dataType = 'b';\r\n this.#data.rawValue = value ? '1' : '0';\r\n return this;\r\n }\r\n\r\n if (value instanceof Date) {\r\n this.#data.dataType = 'n';\r\n this.#data.rawValue = String(toOADate(value));\r\n // Apply short date format if no format already set\r\n if (this.#data.styleIndex === 0) {\r\n const style = new CellStyle();\r\n style.setNumberFormat(ExcelNumberFormat.shortDate);\r\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(style);\r\n }\r\n return this;\r\n }\r\n\r\n // number\r\n this.#data.dataType = 'n';\r\n this.#data.rawValue = String(value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the typed cell value.\r\n * Returns string | number | boolean | Date | null.\r\n * Date detection is based on the cell's number format.\r\n */\r\n getValue(): CellValue {\r\n if (this.#data.rawValue === undefined || this.#data.rawValue === '') return null;\r\n\r\n switch (this.#data.dataType) {\r\n case 's': {\r\n const idx = parseInt(this.#data.rawValue, 10);\r\n return this.#sharedStrings.tryGetString(idx) ?? this.#data.rawValue;\r\n }\r\n case 'b':\r\n return this.#data.rawValue === '1';\r\n case 'str':\r\n return this.#data.rawValue;\r\n default: {\r\n // Number or untyped — try to parse as a number\r\n const num = parseFloat(this.#data.rawValue);\r\n if (isNaN(num)) return this.#data.rawValue;\r\n\r\n // Check if this cell has a date format\r\n if (this.#isDateStyle()) {\r\n try { return fromOADate(num); } catch { return num; }\r\n }\r\n return num;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns the display text of the cell value (always a string).\r\n *\r\n * Numbers are returned unformatted; use {@link getFormattedText} to apply the\r\n * cell's number format.\r\n */\r\n getText(): string {\r\n const val = this.getValue();\r\n if (val === null) return '';\r\n if (val instanceof Date) return val.toLocaleDateString();\r\n return String(val);\r\n }\r\n\r\n /**\r\n * Returns the display text with the cell's number format applied, e.g. a\r\n * value of 4.5 under `$#,##0.00` renders as `$4.50`.\r\n *\r\n * Falls back to {@link getText} for non-numeric values and for format codes\r\n * outside the supported subset (fractions, scientific notation, conditional\r\n * sections) — so the result is never a misleading rendering.\r\n */\r\n getFormattedText(): string {\r\n const val = this.getValue();\r\n if (typeof val !== 'number') return this.getText();\r\n\r\n const format = this.#styles.getCellStyle(this.#data.styleIndex).numberFormat;\r\n if (!format) return this.getText();\r\n\r\n return formatNumberWithCode(val, format.formatCode) ?? this.getText();\r\n }\r\n\r\n // ── Formula API ────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Sets a formula. The leading '=' is optional.\r\n * Clears any cached value.\r\n */\r\n setFormula(formula: string): this {\r\n if (!formula) throw new Error('Formula cannot be empty.');\r\n this.#data.formula = formula.startsWith('=') ? formula.slice(1) : formula;\r\n this.#data.rawValue = undefined; // cached value cleared; will be set after recalc\r\n this.#data.dataType = undefined;\r\n this.#data.arrayRef = undefined; // scalar unless marked as a dynamic array\r\n return this;\r\n }\r\n\r\n /**\r\n * Marks (or unmarks) this cell as a dynamic-array formula anchor. `spillRef`\r\n * is the block the array spills over (e.g. \"A1:C2\"); pass null to revert to a\r\n * plain scalar formula. Serialises as `<f t=\"array\" ref=\"…\">`.\r\n */\r\n setArrayRef(spillRef: string | null): this {\r\n this.#data.arrayRef = spillRef ?? undefined;\r\n return this;\r\n }\r\n\r\n /** The dynamic-array spill range, or null if this is not an array anchor. */\r\n getArrayRef(): string | null {\r\n return this.#data.arrayRef ?? null;\r\n }\r\n\r\n /**\r\n * Sets the cached/computed result of this cell WITHOUT touching its formula.\r\n *\r\n * This is what a recalculation engine calls after evaluating the formula: it\r\n * stores the value that XLSX serialises into `<v>` alongside the `<f>`. Unlike\r\n * setValue(), it does NOT clear the formula, and strings are stored inline\r\n * (t=\"str\") the way Excel stores calculated string results — they are not\r\n * added to the shared-string table.\r\n */\r\n setComputedValue(value: CellValue): this {\r\n if (value === null || value === undefined) {\r\n this.#data.dataType = undefined;\r\n this.#data.rawValue = undefined;\r\n return this;\r\n }\r\n if (typeof value === 'string') {\r\n this.#data.dataType = 'str';\r\n this.#data.rawValue = value;\r\n return this;\r\n }\r\n if (typeof value === 'boolean') {\r\n this.#data.dataType = 'b';\r\n this.#data.rawValue = value ? '1' : '0';\r\n return this;\r\n }\r\n if (value instanceof Date) {\r\n this.#data.dataType = 'n';\r\n this.#data.rawValue = String(toOADate(value));\r\n return this;\r\n }\r\n // number\r\n this.#data.dataType = 'n';\r\n this.#data.rawValue = String(value);\r\n return this;\r\n }\r\n\r\n /** Returns the formula text (without leading '='), or null if no formula. */\r\n getFormula(): string | null {\r\n return this.#data.formula ?? null;\r\n }\r\n\r\n /** True if this cell contains a formula. */\r\n get hasFormula(): boolean {\r\n return this.#data.formula !== undefined && this.#data.formula !== '';\r\n }\r\n\r\n // ── Style API ──────────────────────────────────────────────────────────────\r\n\r\n /** Gets the current CellStyle. Returns a new CellStyle if no style is set. */\r\n get style(): CellStyle {\r\n return this.#styles.getCellStyle(this.#data.styleIndex);\r\n }\r\n\r\n /** Replaces the entire cell style. */\r\n set style(value: CellStyle) {\r\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(value);\r\n }\r\n\r\n /**\r\n * Applies style changes via a callback on the current style.\r\n * Returns this for chaining.\r\n *\r\n * @example\r\n * cell.applyStyle(s => s.setBold(true).setFontColor(ExcelColor.red))\r\n */\r\n applyStyle(action: (style: CellStyle) => void): this {\r\n const s = this.#styles.getCellStyle(this.#data.styleIndex).clone();\r\n action(s);\r\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(s);\r\n return this;\r\n }\r\n\r\n // Convenience style shortcuts (mirror Cell.cs methods)\r\n\r\n setBold(bold = true): this { return this.applyStyle(s => s.setBold(bold)); }\r\n setItalic(italic = true): this { return this.applyStyle(s => s.setItalic(italic)); }\r\n setFontSize(size: number): this { return this.applyStyle(s => s.setFontSize(size)); }\r\n setFontColor(color: ExcelColor | string): this { return this.applyStyle(s => s.setFontColor(color as ExcelColor)); }\r\n setFontName(name: string): this { return this.applyStyle(s => s.setFontName(name)); }\r\n setBackgroundColor(color: ExcelColor | string): this{ return this.applyStyle(s => s.setBackgroundColor(color as ExcelColor)); }\r\n setWrapText(wrap = true): this { return this.applyStyle(s => s.setWrapText(wrap)); }\r\n setHorizontalAlignment(a: ExcelHorizontalAlignment): this { return this.applyStyle(s => s.setHorizontalAlignment(a)); }\r\n setVerticalAlignment(a: ExcelVerticalAlignment): this { return this.applyStyle(s => s.setVerticalAlignment(a)); }\r\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this { return this.applyStyle(s => s.setAllBorders(style, color)); }\r\n\r\n setNumberFormat(format: ExcelNumberFormat): this;\r\n setNumberFormat(formatCode: string): this;\r\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\r\n return this.applyStyle(s => s.setNumberFormat(formatOrCode as ExcelNumberFormat));\r\n }\r\n\r\n // ── Clear ──────────────────────────────────────────────────────────────────\r\n\r\n /** Clears the cell value and formula, preserving style. */\r\n clear(): void {\r\n this.#data.rawValue = undefined;\r\n this.#data.dataType = undefined;\r\n this.#data.formula = undefined;\r\n this.#data.arrayRef = undefined;\r\n }\r\n\r\n /** Clears the cell value, formula, AND style. */\r\n clearAll(): void {\r\n this.clear();\r\n this.#data.styleIndex = 0;\r\n }\r\n\r\n // ── XML serialisation ──────────────────────────────────────────────────────\r\n\r\n /** @internal Builds the <c> XML element string for this cell. */\r\n toXml(): string {\r\n const ref = this.#data.reference;\r\n const style = this.#data.styleIndex > 0 ? ` s=\"${this.#data.styleIndex}\"` : '';\r\n\r\n const formulaXml = this.#data.formula\r\n ? (this.#data.arrayRef\r\n ? `<f t=\"array\" ref=\"${this.#data.arrayRef}\" aca=\"1\" ca=\"1\">${escXml(this.#data.formula)}</f>`\r\n : `<f>${escXml(this.#data.formula)}</f>`)\r\n : '';\r\n\r\n const valueXml =\r\n this.#data.rawValue !== undefined && this.#data.rawValue !== ''\r\n ? `<v>${escXml(this.#data.rawValue)}</v>`\r\n : '';\r\n\r\n // Chỉ ghi thuộc tính type khi ô thực sự có value/formula tương ứng.\r\n const type =\r\n this.#data.dataType && (formulaXml || valueXml) ? ` t=\"${this.#data.dataType}\"` : '';\r\n\r\n if (!formulaXml && !valueXml && this.#data.styleIndex === 0) return '';\r\n\r\n return `<c r=\"${ref}\"${style}${type}>${formulaXml}${valueXml}</c>`;\r\n }\r\n\r\n /** @internal Parses a <c> XML element into CellData. */\r\n static fromXmlElement(\r\n el: {\r\n attributes: Record<string, string>;\r\n children: Array<{ tagName: string; textContent: string; attributes?: Record<string, string> }>;\r\n },\r\n ref: string,\r\n ): CellData {\r\n const dataType = (el.attributes['t'] ?? undefined) as CellData['dataType'];\r\n const styleIndex = parseInt(el.attributes['s'] ?? '0', 10);\r\n\r\n let rawValue: string | undefined;\r\n let formula: string | undefined;\r\n let arrayRef: string | undefined;\r\n\r\n for (const child of el.children) {\r\n const tag = child.tagName.replace(/^.*:/, '');\r\n if (tag === 'v') rawValue = child.textContent;\r\n if (tag === 'f') {\r\n formula = child.textContent;\r\n // Dynamic-array formula anchor: <f t=\"array\" ref=\"A1:C2\">\r\n if (child.attributes && child.attributes['t'] === 'array' && child.attributes['ref']) {\r\n arrayRef = child.attributes['ref'];\r\n }\r\n }\r\n }\r\n\r\n return { reference: ref, dataType, rawValue, formula, arrayRef, styleIndex };\r\n }\r\n\r\n // ── Private helpers ────────────────────────────────────────────────────────\r\n\r\n #isDateStyle(): boolean {\r\n const style = this.#styles.getCellStyle(this.#data.styleIndex);\r\n if (!style.numberFormat) return false;\r\n if (isDateFormatId(style.numberFormat.formatId)) return true;\r\n return isDateFormatCode(style.numberFormat.formatCode);\r\n }\r\n}\r\n\r\nfunction escXml(s: string): string {\r\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n}\r\n","/**\n * Represents a rectangular range of cells for bulk operations.\n * Port of TVE.PureDocs.Excel.Range (C#)\n */\nimport type { Worksheet } from './worksheet.js';\nimport { CellStyle } from '../style/cell-style.js';\nimport { ExcelColor } from '../style/excel-color.js';\nimport { ExcelBorderStyle } from '../style/excel-border.js';\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\nimport { parseRangeRef, cellRefFromRowCol } from './cell-reference.js';\nimport type { CellValue } from './cell.js';\n\nexport class Range {\n readonly #sheet: Worksheet;\n readonly #startRow: number;\n readonly #startColumn: number;\n readonly #endRow: number;\n readonly #endColumn: number;\n readonly #address: string;\n\n constructor(sheet: Worksheet, rangeReference: string) {\n this.#sheet = sheet;\n this.#address = rangeReference.toUpperCase();\n const { startRow, startColumn, endRow, endColumn } = parseRangeRef(rangeReference);\n this.#startRow = startRow;\n this.#startColumn = startColumn;\n this.#endRow = endRow;\n this.#endColumn = endColumn;\n }\n\n /** The range address e.g. \"A1:B10\". */\n get address(): string { return this.#address; }\n\n /** Number of rows in the range. */\n get rowCount(): number { return this.#endRow - this.#startRow + 1; }\n\n /** Number of columns in the range. */\n get columnCount(): number { return this.#endColumn - this.#startColumn + 1; }\n\n // ── Value bulk operations ──────────────────────────────────────────────────\n\n /**\n * Sets values from a 2D array.\n * Values that exceed the range boundary are silently ignored.\n */\n setValues(values: CellValue[][]): void {\n for (let r = 0; r < values.length && this.#startRow + r <= this.#endRow; r++) {\n const rowValues = values[r]!;\n for (let c = 0; c < rowValues.length && this.#startColumn + c <= this.#endColumn; c++) {\n const cell = this.#sheet.getCell(this.#startRow + r, this.#startColumn + c);\n const val = rowValues[c]!;\n cell.setValue(val as never);\n }\n }\n }\n\n /**\n * Gets all cell values as a 2D array (row-major order).\n */\n getValues(): CellValue[][] {\n const result: CellValue[][] = [];\n for (let r = 0; r < this.rowCount; r++) {\n const row: CellValue[] = [];\n for (let c = 0; c < this.columnCount; c++) {\n const cell = this.#sheet.tryGetCell(this.#startRow + r, this.#startColumn + c);\n row.push(cell ? cell.getValue() : null);\n }\n result.push(row);\n }\n return result;\n }\n\n /** Clears all cells in the range (values only, preserves style). */\n clear(): void {\n this.#forEach(cell => cell.clear());\n }\n\n /** Auto-fits all columns in the range. */\n autoFit(): void {\n for (let col = this.#startColumn; col <= this.#endColumn; col++) {\n this.#sheet.autoFitColumn(col);\n }\n }\n\n // ── Style bulk operations ──────────────────────────────────────────────────\n\n /** Applies a CellStyle to all cells in the range. Returns this for chaining. */\n setStyle(style: CellStyle): this {\n this.#forEach(cell => { cell.style = style; });\n return this;\n }\n\n /**\n * Applies style changes to all cells in the range.\n * @example range.applyStyle(s => s.setBold(true).setBackgroundColor(ExcelColor.lightGray))\n */\n applyStyle(action: (style: CellStyle) => void): this {\n this.#forEach(cell => cell.applyStyle(action));\n return this;\n }\n\n setBold(bold = true): this {\n this.#forEach(cell => cell.setBold(bold));\n return this;\n }\n\n setFontSize(size: number): this {\n this.#forEach(cell => cell.setFontSize(size));\n return this;\n }\n\n setFontColor(color: ExcelColor | string): this {\n this.#forEach(cell => cell.setFontColor(color as ExcelColor));\n return this;\n }\n\n setFontName(name: string): this {\n this.#forEach(cell => cell.setFontName(name));\n return this;\n }\n\n setBackgroundColor(color: ExcelColor | string): this {\n this.#forEach(cell => cell.setBackgroundColor(color as ExcelColor));\n return this;\n }\n\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#forEach(cell => cell.setAllBorders(style, color));\n return this;\n }\n\n setHorizontalAlignment(alignment: ExcelHorizontalAlignment): this {\n this.#forEach(cell => cell.setHorizontalAlignment(alignment));\n return this;\n }\n\n setVerticalAlignment(alignment: ExcelVerticalAlignment): this {\n this.#forEach(cell => cell.setVerticalAlignment(alignment));\n return this;\n }\n\n setWrapText(wrap = true): this {\n this.#forEach(cell => cell.setWrapText(wrap));\n return this;\n }\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n this.#forEach(cell => cell.setNumberFormat(formatOrCode as ExcelNumberFormat));\n return this;\n }\n\n // ── Private helper ─────────────────────────────────────────────────────────\n\n #forEach(action: (cell: ReturnType<Worksheet['getCell']>) => void): void {\n for (let r = this.#startRow; r <= this.#endRow; r++) {\n for (let c = this.#startColumn; c <= this.#endColumn; c++) {\n action(this.#sheet.getCell(r, c));\n }\n }\n }\n}\n","/**\r\n * Represents a worksheet in an Excel workbook.\r\n * Port of TVE.PureDocs.Excel.Worksheet (C#)\r\n *\r\n * Key differences from C#:\r\n * - All public methods camelCase\r\n * - XML parsed/serialised directly — no OpenXml SDK\r\n * - No CalcChain yet (added later via @devmm/puredocs-excel-formula)\r\n */\r\nimport { Cell, CellData } from './cell.js';\r\nimport { SharedStringManager } from './shared-string-manager.js';\r\nimport { StyleManager } from '../style/style-manager.js';\r\nimport { CellStyle } from '../style/cell-style.js';\r\nimport { ExcelColor } from '../style/excel-color.js';\r\nimport { ExcelBorderStyle } from '../style/excel-border.js';\r\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\r\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\r\nimport { parseCellRef, cellRefFromRowCol, parseRangeRef } from './cell-reference.js';\r\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\r\nimport { type DrawingProvider } from '../io/drawing-part.js';\r\nimport {\r\n parseTailElements,\r\n type PreservedTailElement,\r\n type Relationship,\r\n} from '../io/preserved-parts.js';\r\nimport { Range } from './range.js';\r\n\r\n// Internal row representation\r\ninterface RowData {\r\n rowIndex: number;\r\n height?: number;\r\n customHeight?: boolean;\r\n hidden?: boolean;\r\n cells: Map<string, CellData>; // ref → CellData\r\n}\r\n\r\n// Internal column definition\r\ninterface ColDef {\r\n min: number;\r\n max: number;\r\n width: number;\r\n customWidth: boolean;\r\n hidden?: boolean;\r\n}\r\n\r\n// Merge cell reference\r\ninterface MergeCell {\r\n ref: string; // e.g. \"A1:B2\"\r\n}\r\n\r\n// Freeze pane settings\r\ninterface PaneSettings {\r\n row: number; // rows to freeze\r\n column: number; // columns to freeze\r\n}\r\n\r\n// Auto filter\r\ninterface AutoFilter {\r\n ref: string;\r\n}\r\n\r\n// Data validation\r\ninterface DataValidation {\r\n sqref: string;\r\n formula: string;\r\n}\r\n\r\nexport type SheetVisibility = 'visible' | 'hidden' | 'veryHidden';\r\n\r\nexport class Worksheet {\r\n readonly #sharedStrings: SharedStringManager;\r\n readonly #styles: StyleManager;\r\n\r\n #name: string;\r\n #rows: Map<number, RowData> = new Map();\r\n #cols: ColDef[] = [];\r\n #mergeCells: MergeCell[] = [];\r\n #pane?: PaneSettings;\r\n #autoFilter?: AutoFilter;\r\n #dataValidations: DataValidation[] = [];\r\n #visibility: SheetVisibility = 'visible';\r\n #drawings: DrawingProvider[] = [];\r\n\r\n // Round-trip state captured when this sheet was loaded from a file: the\r\n // relationship-bearing leaf elements of the worksheet part, and the sheet's\r\n // original relationships. Re-emitted on save so drawings, images and legacy\r\n // comment anchors survive open→save. See io/preserved-parts.ts.\r\n #preservedTail: PreservedTailElement[] = [];\r\n #preservedRels: Relationship[] = [];\r\n\r\n /** @internal */\r\n constructor(name: string, sharedStrings: SharedStringManager, styles: StyleManager) {\r\n this.#name = name;\r\n this.#sharedStrings = sharedStrings;\r\n this.#styles = styles;\r\n }\r\n\r\n // ── Identity ───────────────────────────────────────────────────────────────\r\n\r\n get name(): string { return this.#name; }\r\n set name(value: string) {\r\n if (!value) throw new Error('Worksheet name cannot be empty.');\r\n this.#name = value;\r\n }\r\n\r\n // ── Cell access ────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Gets (or creates) a cell by reference string (e.g. \"A1\") or 1-based row/col.\r\n * Creates the row/cell if it doesn't exist.\r\n */\r\n getCell(reference: string): Cell;\r\n getCell(row: number, column: number): Cell;\r\n getCell(refOrRow: string | number, column?: number): Cell {\r\n const ref = typeof refOrRow === 'string'\r\n ? refOrRow.replace(/\\$/g, '').toUpperCase()\r\n : cellRefFromRowCol(refOrRow, column!);\r\n\r\n const { row } = parseCellRef(ref);\r\n const rowData = this.#getOrCreateRow(row);\r\n let cellData = rowData.cells.get(ref);\r\n if (!cellData) {\r\n cellData = { reference: ref, styleIndex: 0 };\r\n rowData.cells.set(ref, cellData);\r\n }\r\n return new Cell(cellData, this.#sharedStrings, this.#styles);\r\n }\r\n\r\n /**\r\n * Returns a Cell if it exists, or null if the row/cell has not been created.\r\n * Does NOT create a new cell (read-only access).\r\n */\r\n tryGetCell(reference: string): Cell | null;\r\n tryGetCell(row: number, column: number): Cell | null;\r\n tryGetCell(refOrRow: string | number, column?: number): Cell | null {\r\n const ref = typeof refOrRow === 'string'\r\n ? refOrRow.replace(/\\$/g, '').toUpperCase()\r\n : cellRefFromRowCol(refOrRow, column!);\r\n\r\n const { row } = parseCellRef(ref);\r\n const rowData = this.#rows.get(row);\r\n if (!rowData) return null;\r\n const cellData = rowData.cells.get(ref);\r\n if (!cellData) return null;\r\n return new Cell(cellData, this.#sharedStrings, this.#styles);\r\n }\r\n\r\n /** Shorthand indexer — sheet.cell(\"A1\") or sheet.cell(1, 1). */\r\n cell(reference: string): Cell;\r\n cell(row: number, column: number): Cell;\r\n cell(refOrRow: string | number, column?: number): Cell {\r\n return typeof refOrRow === 'string'\r\n ? this.getCell(refOrRow)\r\n : this.getCell(refOrRow, column!);\r\n }\r\n\r\n /** Gets a Range object for bulk operations. */\r\n getRange(rangeReference: string): Range {\r\n if (!rangeReference) throw new Error('Range reference cannot be empty.');\r\n return new Range(this, rangeReference);\r\n }\r\n\r\n /** Gets the raw value of a cell (for formula evaluation). */\r\n getCellValue(reference: string): unknown {\r\n return this.tryGetCell(reference)?.getValue() ?? null;\r\n }\r\n\r\n /** Formula text (without leading '=') of a cell, or null if it has none. */\r\n getCellFormula(reference: string): string | null {\r\n return this.tryGetCell(reference)?.getFormula() ?? null;\r\n }\r\n\r\n /** Spill range (e.g. \"A1:A3\") of a dynamic-array anchor, or null. Supports A1#. */\r\n getSpillRange(reference: string): string | null {\r\n return this.tryGetCell(reference)?.getArrayRef() ?? null;\r\n }\r\n\r\n /**\r\n * Returns the 1-based extent of populated cells (largest row and column that\r\n * contain data). Returns zeros for an empty sheet. Useful for snapshotting a\r\n * sheet into a dense 2D array.\r\n */\r\n get usedBounds(): { rowCount: number; columnCount: number } {\r\n let rowCount = 0;\r\n let columnCount = 0;\r\n for (const row of this.#rows.values()) {\r\n if (row.cells.size === 0) continue;\r\n if (row.rowIndex > rowCount) rowCount = row.rowIndex;\r\n for (const ref of row.cells.keys()) {\r\n const col = parseCellRef(ref).column;\r\n if (col > columnCount) columnCount = col;\r\n }\r\n }\r\n return { rowCount, columnCount };\r\n }\r\n\r\n // ── Layout ─────────────────────────────────────────────────────────────────\r\n\r\n /** Sets the width of a column (1-based index). */\r\n setColumnWidth(columnIndex: number, width: number): void {\r\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\r\n if (width <= 0) throw new RangeError('Width must be > 0.');\r\n\r\n // Remove existing definition for this column\r\n this.#cols = this.#cols.filter(c => !(c.min <= columnIndex && c.max >= columnIndex));\r\n this.#cols.push({ min: columnIndex, max: columnIndex, width, customWidth: true });\r\n this.#cols.sort((a, b) => a.min - b.min);\r\n }\r\n\r\n /**\r\n * Returns the explicit width of a column (1-based index), or `undefined` when\r\n * the column uses the sheet default. Counterpart to {@link setColumnWidth};\r\n * widths parsed from an existing file are visible here too, so column layout\r\n * can be round-tripped.\r\n */\r\n getColumnWidth(columnIndex: number): number | undefined {\r\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\r\n return this.#cols.find(c => c.min <= columnIndex && c.max >= columnIndex)?.width;\r\n }\r\n\r\n /** Auto-fits column width based on content (approximate). */\r\n autoFitColumn(columnIndex: number): void {\r\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\r\n\r\n let maxLen = 8; // minimum\r\n for (const row of this.#rows.values()) {\r\n const ref = cellRefFromRowCol(row.rowIndex, columnIndex);\r\n const cellData = row.cells.get(ref);\r\n if (cellData) {\r\n const cell = new Cell(cellData, this.#sharedStrings, this.#styles);\r\n const textLen = cell.getText().length;\r\n if (textLen > maxLen) maxLen = textLen;\r\n }\r\n }\r\n // Approximate: character width * 1.2 + 2 padding, capped at 255\r\n this.setColumnWidth(columnIndex, Math.min(maxLen * 1.2 + 2, 255));\r\n }\r\n\r\n /** Sets the height of a row (1-based index). */\r\n setRowHeight(rowIndex: number, height: number): void {\r\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\r\n if (height <= 0) throw new RangeError('Height must be > 0.');\r\n const row = this.#getOrCreateRow(rowIndex);\r\n row.height = height;\r\n row.customHeight = true;\r\n }\r\n\r\n /**\r\n * Returns the explicit height of a row (1-based index), or `undefined` when\r\n * the row uses the sheet default. Counterpart to {@link setRowHeight}.\r\n */\r\n getRowHeight(rowIndex: number): number | undefined {\r\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\r\n return this.#rows.get(rowIndex)?.height;\r\n }\r\n\r\n /** Shows or hides a row (1-based index). Hidden rows affect SUBTOTAL(101-111). */\r\n setRowHidden(rowIndex: number, hidden = true): void {\r\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\r\n this.#getOrCreateRow(rowIndex).hidden = hidden;\r\n }\r\n\r\n /** True if the given 1-based row is hidden. */\r\n isRowHidden(rowIndex: number): boolean {\r\n return this.#rows.get(rowIndex)?.hidden === true;\r\n }\r\n\r\n /** Merges cells in the given range (e.g. \"A1:B2\"). */\r\n mergeCells(rangeReference: string): void {\r\n if (!rangeReference) throw new Error('Range reference cannot be empty.');\r\n this.#mergeCells.push({ ref: rangeReference });\r\n }\r\n\r\n /** Removes a merge for the given range reference. */\r\n unmergeCells(rangeReference: string): void {\r\n this.#mergeCells = this.#mergeCells.filter(m => m.ref !== rangeReference);\r\n }\r\n\r\n /**\r\n * All merged ranges on this sheet, in the order they were added (or parsed).\r\n * Includes merges read from an existing file, so callers never need to track\r\n * their own copy of the list.\r\n */\r\n get merges(): readonly string[] {\r\n return this.#mergeCells.map(m => m.ref);\r\n }\r\n\r\n /**\r\n * Freezes rows and/or columns.\r\n * @param row Number of rows to freeze (0 = none)\r\n * @param column Number of columns to freeze (0 = none)\r\n */\r\n freezePanes(row: number, column: number): void {\r\n if (row < 0) throw new RangeError('Row must be >= 0.');\r\n if (column < 0) throw new RangeError('Column must be >= 0.');\r\n this.#pane = (row === 0 && column === 0) ? undefined : { row, column };\r\n }\r\n\r\n /** Sets auto-filter on the given range. */\r\n setAutoFilter(rangeReference: string): void {\r\n this.#autoFilter = { ref: rangeReference };\r\n }\r\n\r\n /**\r\n * Adds a dropdown data validation to a cell range.\r\n * @param cellRange Range to apply (e.g. \"F2:F1000\")\r\n * @param listFormula Formula for the dropdown list (e.g. \"'Sheet2'!$A$1:$A$10\")\r\n */\r\n addDropdownValidation(cellRange: string, listFormula: string): void {\r\n this.#dataValidations.push({ sqref: cellRange, formula: listFormula });\r\n }\r\n\r\n /** Sets the visibility state of this worksheet. */\r\n setVisibility(state: SheetVisibility): void {\r\n this.#visibility = state;\r\n }\r\n\r\n get visibility(): SheetVisibility { return this.#visibility; }\r\n\r\n // ── Drawings (charts, images …) ──────────────────────────────────────────────\r\n\r\n /**\r\n * Attaches a drawing provider (e.g. a chart) to this worksheet.\r\n * Satellite packages such as `@devmm/puredocs-excel-charts` call this; the core\r\n * save pipeline turns registered providers into valid OOXML drawing/chart parts.\r\n */\r\n addDrawingProvider(provider: DrawingProvider): void {\r\n this.#drawings.push(provider);\r\n }\r\n\r\n /**\r\n * Detaches every drawing from this worksheet — both providers added in memory\r\n * and any drawing preserved from the file the workbook was opened from.\r\n *\r\n * Call before re-adding charts when exporting the same in-memory workbook\r\n * repeatedly, otherwise each export appends another copy; call on its own to\r\n * deliberately drop a chart that came from the source file.\r\n */\r\n clearDrawings(): void {\r\n this.#drawings = [];\r\n this.#preservedTail = this.#preservedTail.filter(t => t.tag !== 'drawing');\r\n }\r\n\r\n /** True when this worksheet has at least one drawing to serialise. */\r\n get hasDrawings(): boolean { return this.#drawings.length > 0; }\r\n\r\n /** @internal — drawing providers, consumed by the save pipeline. */\r\n get drawingProviders(): readonly DrawingProvider[] { return this.#drawings; }\r\n\r\n // ── Round-trip preservation (internal) ───────────────────────────────────────\r\n\r\n /**\r\n * @internal Relationships carried over from the source file, minus any whose\r\n * leaf element is no longer emitted (a drawing replaced by live providers, or\r\n * cleared outright). The save pipeline writes these into the sheet's rels.\r\n */\r\n get preservedRelationships(): readonly Relationship[] {\r\n const liveIds = new Set(this.#activeTail().map(t => t.relId));\r\n return this.#preservedRels.filter(r => liveIds.has(r.id));\r\n }\r\n\r\n /**\r\n * @internal Package paths of relationships that were preserved at load time\r\n * but are no longer referenced — a drawing replaced by live providers, or one\r\n * cleared outright. The save pipeline prunes these parts so the output has no\r\n * orphans.\r\n */\r\n get droppedPreservedTargets(): readonly string[] {\r\n const liveIds = new Set(this.#activeTail().map(t => t.relId));\r\n return this.#preservedRels\r\n .filter(r => !liveIds.has(r.id) && r.resolved !== undefined)\r\n .map(r => r.resolved!);\r\n }\r\n\r\n /**\r\n * @internal Relationship id for a drawing built from live providers. Chosen to\r\n * clear every preserved id so the two sets cannot collide.\r\n */\r\n get drawingRelId(): string {\r\n let max = 0;\r\n for (const r of this.#preservedRels) {\r\n const n = /^rId(\\d+)$/.exec(r.id);\r\n if (n) max = Math.max(max, parseInt(n[1]!, 10));\r\n }\r\n return `rId${max + 1}`;\r\n }\r\n\r\n /**\r\n * Preserved leaf elements that will actually be emitted. A sheet may only have\r\n * one `<drawing>`, so live providers suppress a preserved one — every consumer\r\n * (serialisation, relationships, pruning) must agree on that, hence one helper.\r\n */\r\n #activeTail(): PreservedTailElement[] {\r\n return this.#preservedTail.filter(t => !(t.tag === 'drawing' && this.hasDrawings));\r\n }\r\n\r\n /** @internal Captures round-trip state from the source package. */\r\n loadPreservedState(worksheetXml: string, relationships: readonly Relationship[]): void {\r\n this.#preservedRels = [...relationships];\r\n // Only keep leaf elements whose relationship actually resolved — a dangling\r\n // r:id would make Excel treat the file as corrupt.\r\n const known = new Set(relationships.map(r => r.id));\r\n this.#preservedTail = parseTailElements(worksheetXml).filter(t => known.has(t.relId));\r\n }\r\n\r\n // ── XML serialisation ──────────────────────────────────────────────────────\r\n\r\n /** Builds the xl/worksheets/sheetN.xml string. */\r\n buildXml(): string {\r\n const colsXml = this.#buildColsXml();\r\n const sheetDataXml = this.#buildSheetDataXml();\r\n const mergeXml = this.#buildMergeCellsXml();\r\n const filterXml = this.#autoFilter ? `<autoFilter ref=\"${this.#autoFilter.ref}\"/>` : '';\r\n const validXml = this.#buildDataValidationsXml();\r\n const sheetViewXml = this.#buildSheetViewXml();\r\n // <drawing> must be the last child of <worksheet> per the CT_Worksheet\r\n // schema, and a sheet may only have one. Live providers therefore replace a\r\n // drawing preserved from the source file; the other preserved leaf elements\r\n // (legacyDrawing, picture …) are re-emitted either way.\r\n const preservedTailXml = this.#activeTail().map(t => t.xml).join('');\r\n const drawingXml = this.hasDrawings ? `<drawing r:id=\"${this.drawingRelId}\"/>` : '';\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\r\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheetViews>${sheetViewXml}</sheetViews>\r\n${colsXml}${sheetDataXml}${filterXml}${mergeXml}${validXml}${preservedTailXml}${drawingXml}\r\n</worksheet>`;\r\n }\r\n\r\n /** Parses xl/worksheets/sheetN.xml and loads cells into memory. */\r\n loadFromXml(xml: string): void {\r\n this.#rows.clear();\r\n this.#cols = [];\r\n this.#mergeCells = [];\r\n this.#pane = undefined;\r\n this.#autoFilter = undefined;\r\n this.#dataValidations = [];\r\n\r\n const root = parseXml(xml);\r\n\r\n // Columns\r\n for (const colEl of getElementsByTagName(root, 'col')) {\r\n this.#cols.push({\r\n min: parseInt(getAttr(colEl, 'min') ?? '1', 10),\r\n max: parseInt(getAttr(colEl, 'max') ?? '1', 10),\r\n width: parseFloat(getAttr(colEl, 'width') ?? '8'),\r\n customWidth: getAttr(colEl, 'customWidth') === '1',\r\n hidden: getAttr(colEl, 'hidden') === '1',\r\n });\r\n }\r\n\r\n // Sheet data (rows and cells)\r\n for (const rowEl of getElementsByTagName(root, 'row')) {\r\n const rowIndex = parseInt(getAttr(rowEl, 'r') ?? '0', 10);\r\n if (rowIndex < 1) continue;\r\n\r\n const rowData: RowData = { rowIndex, cells: new Map() };\r\n\r\n const ht = getAttr(rowEl, 'ht');\r\n if (ht) { rowData.height = parseFloat(ht); rowData.customHeight = true; }\r\n if (getAttr(rowEl, 'hidden') === '1') rowData.hidden = true;\r\n\r\n for (const cellEl of rowEl.children) {\r\n const tag = cellEl.tagName.replace(/^.*:/, '');\r\n if (tag !== 'c') continue;\r\n const ref = getAttr(cellEl, 'r');\r\n if (!ref) continue;\r\n const cellData = Cell.fromXmlElement(\r\n { attributes: cellEl.attributes, children: cellEl.children as Parameters<typeof Cell.fromXmlElement>[0]['children'] },\r\n ref.toUpperCase(),\r\n );\r\n rowData.cells.set(ref.toUpperCase(), cellData);\r\n }\r\n\r\n this.#rows.set(rowIndex, rowData);\r\n }\r\n\r\n // Merge cells\r\n for (const mcEl of getElementsByTagName(root, 'mergeCell')) {\r\n const ref = getAttr(mcEl, 'ref');\r\n if (ref) this.#mergeCells.push({ ref });\r\n }\r\n\r\n // Auto filter\r\n const afEls = getElementsByTagName(root, 'autoFilter');\r\n if (afEls.length > 0) {\r\n const ref = getAttr(afEls[0]!, 'ref');\r\n if (ref) this.#autoFilter = { ref };\r\n }\r\n\r\n // Freeze pane\r\n for (const paneEl of getElementsByTagName(root, 'pane')) {\r\n const state = getAttr(paneEl, 'state');\r\n if (state === 'frozen' || state === 'frozenSplit') {\r\n this.#pane = {\r\n row: parseInt(getAttr(paneEl, 'ySplit') ?? '0', 10),\r\n column: parseInt(getAttr(paneEl, 'xSplit') ?? '0', 10),\r\n };\r\n }\r\n }\r\n\r\n // Data validations\r\n for (const dvEl of getElementsByTagName(root, 'dataValidation')) {\r\n const sqref = getAttr(dvEl, 'sqref') ?? '';\r\n const f1Els = getElementsByTagName(dvEl, 'formula1');\r\n const formula = f1Els[0]?.textContent ?? '';\r\n if (sqref && formula) this.#dataValidations.push({ sqref, formula });\r\n }\r\n }\r\n\r\n // ── Private XML builders ───────────────────────────────────────────────────\r\n\r\n #buildColsXml(): string {\r\n if (this.#cols.length === 0) return '';\r\n const inner = this.#cols\r\n .map(c => {\r\n const hidden = c.hidden ? ' hidden=\"1\"' : '';\r\n return `<col min=\"${c.min}\" max=\"${c.max}\" width=\"${c.width.toFixed(2)}\" customWidth=\"${c.customWidth ? 1 : 0}\"${hidden}/>`;\r\n })\r\n .join('');\r\n return `<cols>${inner}</cols>`;\r\n }\r\n\r\n #buildSheetDataXml(): string {\r\n const sortedRows = [...this.#rows.values()].sort((a, b) => a.rowIndex - b.rowIndex);\r\n if (sortedRows.length === 0) return '<sheetData/>';\r\n\r\n const rowsXml = sortedRows.map(row => {\r\n const ht = row.height !== undefined && row.customHeight\r\n ? ` ht=\"${row.height}\" customHeight=\"1\"`\r\n : '';\r\n const hidden = row.hidden ? ' hidden=\"1\"' : '';\r\n\r\n const sortedCells = [...row.cells.values()].sort((a, b) => {\r\n const ra = parseCellRef(a.reference);\r\n const rb = parseCellRef(b.reference);\r\n return ra.column - rb.column;\r\n });\r\n\r\n const cellsXml = sortedCells\r\n .map(cd => new Cell(cd, this.#sharedStrings, this.#styles).toXml())\r\n .filter(Boolean)\r\n .join('');\r\n\r\n if (!cellsXml && !ht && !hidden) return '';\r\n return `<row r=\"${row.rowIndex}\"${ht}${hidden}>${cellsXml}</row>`;\r\n }).filter(Boolean).join('');\r\n\r\n return `<sheetData>${rowsXml}</sheetData>`;\r\n }\r\n\r\n #buildMergeCellsXml(): string {\r\n if (this.#mergeCells.length === 0) return '';\r\n const inner = this.#mergeCells.map(m => `<mergeCell ref=\"${m.ref}\"/>`).join('');\r\n return `<mergeCells count=\"${this.#mergeCells.length}\">${inner}</mergeCells>`;\r\n }\r\n\r\n #buildDataValidationsXml(): string {\r\n if (this.#dataValidations.length === 0) return '';\r\n const inner = this.#dataValidations\r\n .map(dv =>\r\n `<dataValidation type=\"list\" allowBlank=\"1\" showInputMessage=\"1\" showErrorMessage=\"1\" sqref=\"${dv.sqref}\"><formula1>${escXml(dv.formula)}</formula1></dataValidation>`,\r\n )\r\n .join('');\r\n return `<dataValidations count=\"${this.#dataValidations.length}\">${inner}</dataValidations>`;\r\n }\r\n\r\n #buildSheetViewXml(): string {\r\n if (!this.#pane) return '<sheetView workbookViewId=\"0\"/>';\r\n\r\n const { row, column } = this.#pane;\r\n const topLeftRow = row > 0 ? row + 1 : 1;\r\n const topLeftCol = column > 0 ? column + 1 : 1;\r\n const topLeft = cellRefFromRowCol(topLeftRow, topLeftCol);\r\n\r\n const activePane = row > 0 && column > 0 ? 'bottomRight'\r\n : row > 0 ? 'bottomLeft' : 'topRight';\r\n\r\n const xSplit = column > 0 ? ` xSplit=\"${column}\"` : '';\r\n const ySplit = row > 0 ? ` ySplit=\"${row}\"` : '';\r\n\r\n return `<sheetView workbookViewId=\"0\"><pane${xSplit}${ySplit} topLeftCell=\"${topLeft}\" activePane=\"${activePane}\" state=\"frozen\"/></sheetView>`;\r\n }\r\n\r\n #getOrCreateRow(rowIndex: number): RowData {\r\n let row = this.#rows.get(rowIndex);\r\n if (!row) {\r\n row = { rowIndex, cells: new Map() };\r\n this.#rows.set(rowIndex, row);\r\n }\r\n return row;\r\n }\r\n}\r\n\r\nfunction escXml(s: string): string {\r\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n}\r\n","/**\r\n * Defined names (named ranges) for a workbook.\r\n *\r\n * A defined name maps an identifier (e.g. \"TaxRate\", \"SalesData\") to a\r\n * refers-to expression (e.g. \"Sheet1!$A$1\", \"Sheet1!$A$1:$B$10\", \"0.2*100\").\r\n * Names may be workbook-global or scoped to a single worksheet.\r\n *\r\n * This module only models and stores the data (and serialises it to OOXML).\r\n * Resolution/evaluation of the refers-to expression is the responsibility of\r\n * the formula engine (@devmm/puredocs-excel-formula), which reads names through\r\n * Workbook.getDefinedName().\r\n */\r\n\r\n/** A single defined name. */\r\nexport interface DefinedName {\r\n /** The name identifier. Case-insensitive when resolved. */\r\n readonly name: string;\r\n /** The refers-to expression, WITHOUT a leading '='. */\r\n readonly refersTo: string;\r\n /**\r\n * Worksheet name this name is scoped to, or undefined for a workbook-global\r\n * name. Excel resolves a sheet-scoped name ahead of a global name of the\r\n * same identifier when a formula on that sheet references it.\r\n */\r\n readonly scope?: string;\r\n}\r\n\r\n/**\r\n * In-memory store for a workbook's defined names, with Excel scoping semantics.\r\n * Kept separate from Workbook so the storage rules live in one place.\r\n */\r\nexport class DefinedNameManager {\r\n readonly #names: DefinedName[] = [];\r\n\r\n /** All defined names, in insertion order. */\r\n get all(): readonly DefinedName[] {\r\n return this.#names;\r\n }\r\n\r\n get size(): number {\r\n return this.#names.length;\r\n }\r\n\r\n /**\r\n * Adds or replaces a defined name. A name is uniquely identified by the pair\r\n * (identifier, scope): the same identifier may exist once globally and once\r\n * per worksheet. The leading '=' of refersTo is stripped.\r\n */\r\n define(name: string, refersTo: string, scope?: string): void {\r\n if (!name) throw new Error('Defined name cannot be empty.');\r\n if (!refersTo) throw new Error('Defined name refersTo cannot be empty.');\r\n const cleaned = refersTo.startsWith('=') ? refersTo.slice(1) : refersTo;\r\n\r\n const idx = this.#indexOf(name, scope);\r\n const entry: DefinedName = { name, refersTo: cleaned, scope };\r\n if (idx >= 0) this.#names[idx] = entry;\r\n else this.#names.push(entry);\r\n }\r\n\r\n /** Removes a defined name by identifier and scope. Returns true if removed. */\r\n remove(name: string, scope?: string): boolean {\r\n const idx = this.#indexOf(name, scope);\r\n if (idx < 0) return false;\r\n this.#names.splice(idx, 1);\r\n return true;\r\n }\r\n\r\n /**\r\n * Resolves a name to its refers-to expression following Excel scoping:\r\n * a name scoped to `sheetName` takes precedence over the workbook-global\r\n * name of the same identifier. Returns undefined if no name matches.\r\n */\r\n resolve(name: string, sheetName?: string): string | undefined {\r\n const key = name.toUpperCase();\r\n if (sheetName) {\r\n const local = this.#names.find(\r\n n => n.name.toUpperCase() === key && n.scope?.toUpperCase() === sheetName.toUpperCase(),\r\n );\r\n if (local) return local.refersTo;\r\n }\r\n const global = this.#names.find(n => n.name.toUpperCase() === key && n.scope === undefined);\r\n return global?.refersTo;\r\n }\r\n\r\n #indexOf(name: string, scope?: string): number {\r\n const key = name.toUpperCase();\r\n const scopeKey = scope?.toUpperCase();\r\n return this.#names.findIndex(\r\n n => n.name.toUpperCase() === key && (n.scope?.toUpperCase()) === scopeKey,\r\n );\r\n }\r\n}\r\n","/**\r\n * Main entry point for the @devmm/puredocs-excel library.\r\n * Port of TVE.PureDocs.Excel.Workbook (C#)\r\n *\r\n * Key differences from C#:\r\n * - All factory methods are async (file I/O)\r\n * - saveAsBuffer() returns Uint8Array instead of MemoryStream\r\n * - saveToFile() is Node.js only\r\n * - No IDisposable — call close() or use Symbol.dispose\r\n * - WorksheetCollection replaced by a simple managed array\r\n */\r\nimport { unzipXlsx, readXmlEntry, requireXmlEntry } from '../io/zip-reader.js';\r\nimport { zipXlsx, type ZipInput } from '../io/zip-writer.js';\r\nimport {\r\n buildContentTypes,\r\n ROOT_RELS,\r\n buildWorkbookRels,\r\n buildWorkbookXml,\r\n buildSharedStringsXml,\r\n DEFAULT_STYLES_XML,\r\n EMPTY_WORKSHEET_XML,\r\n type SheetMeta,\r\n type DefinedNameMeta,\r\n} from '../io/ooxml-templates.js';\r\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\r\nimport { REL_TYPES, CONTENT_TYPES } from '../io/xml-builder.js';\r\nimport {\r\n buildDrawingXml,\r\n buildRelsXml,\r\n WORKSHEET_DRAWING_REL_ID,\r\n} from '../io/drawing-part.js';\r\nimport {\r\n collectPreservedParts,\r\n collectSubtree,\r\n parseContentTypes,\r\n parseRelationships,\r\n type ContentTypeDeclarations,\r\n type Relationship,\r\n} from '../io/preserved-parts.js';\r\nimport { SharedStringManager } from './shared-string-manager.js';\r\nimport { StyleManager } from '../style/style-manager.js';\r\nimport { Worksheet } from './worksheet.js';\r\nimport { DefinedNameManager, type DefinedName } from './defined-name.js';\r\n\r\ninterface SheetEntry {\r\n worksheet: Worksheet;\r\n sheetId: number;\r\n relId: string; // e.g. \"rId1\"\r\n}\r\n\r\nexport class Workbook {\r\n readonly #sharedStrings: SharedStringManager;\r\n readonly #styles: StyleManager;\r\n readonly #sheets: SheetEntry[] = [];\r\n readonly #definedNames = new DefinedNameManager();\r\n #closed = false;\r\n\r\n /** Parts carried over verbatim from the file this workbook was opened from. */\r\n #preservedParts: Map<string, Uint8Array> = new Map();\r\n #preservedContentTypes?: ContentTypeDeclarations;\r\n /** Preserved targets whose referring worksheet has been removed. */\r\n readonly #orphanedTargets: string[] = [];\r\n\r\n private constructor(\r\n sharedStrings: SharedStringManager,\r\n styles: StyleManager,\r\n ) {\r\n this.#sharedStrings = sharedStrings;\r\n this.#styles = styles;\r\n }\r\n\r\n // ── Factory methods ────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Creates a new empty workbook.\r\n * Mirrors Workbook.Create() in C#.\r\n */\r\n static create(): Workbook {\r\n const ss = new SharedStringManager();\r\n const sm = new StyleManager();\r\n return new Workbook(ss, sm);\r\n }\r\n\r\n /**\r\n * Opens an existing workbook from a binary buffer (ArrayBuffer or Uint8Array).\r\n * Works in both browser and Node.js.\r\n * Mirrors Workbook.Open(stream) in C#.\r\n */\r\n static fromBuffer(buffer: ArrayBuffer | Uint8Array): Workbook {\r\n const entries = unzipXlsx(buffer);\r\n const ss = new SharedStringManager();\r\n const sm = new StyleManager();\r\n const wb = new Workbook(ss, sm);\r\n\r\n // Load shared strings\r\n const ssXml = readXmlEntry(entries, 'xl/sharedStrings.xml');\r\n if (ssXml) ss.loadFromXml(ssXml);\r\n\r\n // Load styles\r\n const stylesXml = readXmlEntry(entries, 'xl/styles.xml');\r\n if (stylesXml) sm.loadFromXml(stylesXml);\r\n\r\n // Parse workbook.xml to get sheet names and relationship IDs\r\n const wbXml = requireXmlEntry(entries, 'xl/workbook.xml');\r\n const wbRoot = parseXml(wbXml);\r\n\r\n for (const sheetEl of getElementsByTagName(wbRoot, 'sheet')) {\r\n const name = getAttr(sheetEl, 'name') ?? 'Sheet';\r\n const sheetId = parseInt(getAttr(sheetEl, 'sheetId') ?? '1', 10);\r\n const relId = getAttr(sheetEl, 'r:id') ?? getAttr(sheetEl, 'id') ?? `rId${sheetId}`;\r\n const state = getAttr(sheetEl, 'state') as Worksheet['visibility'] | undefined;\r\n\r\n // Find worksheet XML path from workbook rels\r\n const relXml = readXmlEntry(entries, 'xl/_rels/workbook.xml.rels') ?? '';\r\n const wsPath = resolveWorksheetPath(relXml, relId);\r\n const wsXml = wsPath ? (readXmlEntry(entries, wsPath) ?? EMPTY_WORKSHEET_XML) : EMPTY_WORKSHEET_XML;\r\n\r\n const ws = new Worksheet(name, ss, sm);\r\n if (state) ws.setVisibility(state);\r\n ws.loadFromXml(wsXml);\r\n\r\n // Round-trip state: the sheet's own relationships (drawings, images,\r\n // legacy comment anchors) and the leaf elements referencing them.\r\n if (wsPath) {\r\n const dir = wsPath.slice(0, wsPath.lastIndexOf('/'));\r\n const file = wsPath.slice(wsPath.lastIndexOf('/') + 1);\r\n const wsRelsXml = readXmlEntry(entries, `${dir}/_rels/${file}.rels`);\r\n if (wsRelsXml) {\r\n ws.loadPreservedState(wsXml, parseRelationships(wsRelsXml, wsPath));\r\n }\r\n }\r\n\r\n wb.#sheets.push({ worksheet: ws, sheetId, relId });\r\n }\r\n\r\n // Parts core never parses (drawings, images, themes, pivot caches, docProps)\r\n // are carried over verbatim so open→save does not silently drop them.\r\n wb.#preservedParts = collectPreservedParts(entries);\r\n const ctXml = readXmlEntry(entries, '[Content_Types].xml');\r\n if (ctXml) wb.#preservedContentTypes = parseContentTypes(ctXml);\r\n\r\n // Defined names (named ranges). Parsed after sheets so localSheetId can be\r\n // mapped to a worksheet name by document-order index.\r\n for (const dn of getElementsByTagName(wbRoot, 'definedName')) {\r\n const name = getAttr(dn, 'name');\r\n if (!name) continue;\r\n const refersTo = dn.textContent.trim();\r\n if (!refersTo) continue;\r\n const localSheetId = getAttr(dn, 'localSheetId');\r\n let scope: string | undefined;\r\n if (localSheetId !== undefined) {\r\n const idx = parseInt(localSheetId, 10);\r\n scope = wb.#sheets[idx]?.worksheet.name;\r\n }\r\n wb.#definedNames.define(name, refersTo, scope);\r\n }\r\n\r\n return wb;\r\n }\r\n\r\n /**\r\n * Opens an existing workbook from a file path (Node.js only).\r\n * Mirrors Workbook.Open(filePath) in C#.\r\n */\r\n static async fromFile(filePath: string): Promise<Workbook> {\r\n // Dynamic import so the library doesn't break in browser environments\r\n const fs = await import('node:fs/promises');\r\n const buffer = await fs.readFile(filePath);\r\n return Workbook.fromBuffer(buffer);\r\n }\r\n\r\n // ── Worksheet management ───────────────────────────────────────────────────\r\n\r\n /**\r\n * Collection of worksheets (read-only array view).\r\n * Access by index: workbook.worksheets[0]\r\n * Access by name: workbook.worksheets.find(s => s.name === 'Sheet1')\r\n */\r\n get worksheets(): readonly Worksheet[] {\r\n return this.#sheets.map(e => e.worksheet);\r\n }\r\n\r\n /**\r\n * Adds a new worksheet with the given name and returns it.\r\n * Mirrors workbook.AddWorksheet(name) in C#.\r\n */\r\n addWorksheet(name: string): Worksheet {\r\n this.#assertOpen();\r\n if (!name) throw new Error('Worksheet name cannot be empty.');\r\n if (this.#sheets.some(e => e.worksheet.name === name)) {\r\n throw new Error(`Worksheet \"${name}\" already exists.`);\r\n }\r\n\r\n const sheetId = this.#sheets.length + 1;\r\n const relId = `rId${sheetId}`;\r\n const ws = new Worksheet(name, this.#sharedStrings, this.#styles);\r\n this.#sheets.push({ worksheet: ws, sheetId, relId });\r\n return ws;\r\n }\r\n\r\n /**\r\n * Removes the worksheet with the given name, along with any defined names\r\n * scoped to it. Throws if the sheet does not exist or is the last remaining\r\n * one — a workbook must always keep at least one sheet.\r\n *\r\n * Sheet ids and relationship ids are re-derived from document order on save,\r\n * so the remaining sheets stay consistent after a removal.\r\n */\r\n removeWorksheet(name: string): void {\r\n this.#assertOpen();\r\n const idx = this.#sheets.findIndex(e => e.worksheet.name === name);\r\n if (idx < 0) throw new Error(`Worksheet \"${name}\" not found.`);\r\n if (this.#sheets.length === 1) {\r\n throw new Error('Cannot remove the last worksheet; a workbook must have at least one.');\r\n }\r\n\r\n // The sheet's preserved parts (drawing, images …) lose their only referrer\r\n // once it is gone. Record them now — after the splice nothing else knows\r\n // they existed, and they would ship as orphans.\r\n const removed = this.#sheets[idx]!.worksheet;\r\n for (const rel of removed.preservedRelationships) {\r\n if (rel.resolved) this.#orphanedTargets.push(rel.resolved);\r\n }\r\n\r\n this.#sheets.splice(idx, 1);\r\n\r\n // Drop names scoped to the removed sheet — they would otherwise serialise\r\n // with a localSheetId pointing at an unrelated worksheet.\r\n // Snapshot first: `all` exposes the live backing array.\r\n for (const dn of [...this.#definedNames.all]) {\r\n if (dn.scope === name) this.#definedNames.remove(dn.name, dn.scope);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a worksheet by name. Throws if not found.\r\n */\r\n getWorksheet(name: string): Worksheet {\r\n const entry = this.#sheets.find(e => e.worksheet.name === name);\r\n if (!entry) throw new Error(`Worksheet \"${name}\" not found.`);\r\n return entry.worksheet;\r\n }\r\n\r\n // ── Defined names (named ranges) ─────────────────────────────────────────────\r\n\r\n /**\r\n * Defines (or replaces) a named range.\r\n *\r\n * @param name The name identifier (case-insensitive when resolved).\r\n * @param refersTo The refers-to expression, e.g. \"Sheet1!$A$1:$B$10\". A\r\n * leading '=' is optional and stripped.\r\n * @param options `scope` restricts the name to a single worksheet; omit for\r\n * a workbook-global name.\r\n */\r\n defineName(name: string, refersTo: string, options?: { scope?: string }): void {\r\n this.#assertOpen();\r\n const scope = options?.scope;\r\n if (scope !== undefined && !this.#sheets.some(e => e.worksheet.name === scope)) {\r\n throw new Error(`Cannot scope defined name \"${name}\" to unknown worksheet \"${scope}\".`);\r\n }\r\n this.#definedNames.define(name, refersTo, scope);\r\n }\r\n\r\n /**\r\n * Resolves a defined name to its refers-to expression (without leading '=').\r\n * Follows Excel scoping: a name scoped to `sheetName` wins over the global\r\n * name of the same identifier. Returns undefined if no name matches.\r\n *\r\n * This is the seam the formula engine calls to resolve NamedRangeNode.\r\n */\r\n getDefinedName(name: string, sheetName?: string): string | undefined {\r\n return this.#definedNames.resolve(name, sheetName);\r\n }\r\n\r\n /** Removes a defined name. Returns true if a matching name was removed. */\r\n removeName(name: string, scope?: string): boolean {\r\n this.#assertOpen();\r\n return this.#definedNames.remove(name, scope);\r\n }\r\n\r\n /** All defined names in the workbook, in insertion order. */\r\n get definedNames(): readonly DefinedName[] {\r\n return this.#definedNames.all;\r\n }\r\n\r\n // ── Serialisation ──────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Serialises the workbook to a Uint8Array (xlsx binary).\r\n * Mirrors workbook.SaveAs(stream) in C#.\r\n * Works in browser and Node.js.\r\n */\r\n saveAsBuffer(): Uint8Array {\r\n this.#assertOpen();\r\n const entries = this.#buildZipEntries();\r\n return zipXlsx(entries);\r\n }\r\n\r\n /**\r\n * Saves the workbook to a file (Node.js only).\r\n * Mirrors workbook.SaveAs(filePath) in C#.\r\n */\r\n async saveToFile(filePath: string): Promise<void> {\r\n this.#assertOpen();\r\n const buffer = this.saveAsBuffer();\r\n const fs = await import('node:fs/promises');\r\n const path = await import('node:path');\r\n const dir = path.dirname(filePath);\r\n await fs.mkdir(dir, { recursive: true });\r\n await fs.writeFile(filePath, buffer);\r\n }\r\n\r\n // ── Lifecycle ──────────────────────────────────────────────────────────────\r\n\r\n /** Releases resources. The workbook should not be used after this call. */\r\n close(): void { this.#closed = true; }\r\n\r\n /** Symbol.dispose support for `using` keyword (TypeScript 5.2+). */\r\n [Symbol.dispose](): void { this.close(); }\r\n\r\n // ── Private helpers ────────────────────────────────────────────────────────\r\n\r\n #assertOpen(): void {\r\n if (this.#closed) throw new Error('Workbook has been closed.');\r\n }\r\n\r\n /**\r\n * Copies preserved source parts into the output, minus those that are now\r\n * orphaned. A part is dropped when the only relationship pointing at it has\r\n * gone (a drawing replaced by live providers, a sheet removed, an explicit\r\n * `clearDrawings()`) and nothing else still reaches it.\r\n *\r\n * @returns the set of paths written, so later steps can avoid colliding with\r\n * them when naming newly generated parts.\r\n */\r\n #seedPreservedParts(entries: ZipInput): Set<string> {\r\n if (this.#preservedParts.size === 0) return new Set();\r\n\r\n // Everything still reachable from a live worksheet relationship.\r\n const retained = new Set<string>();\r\n for (const { worksheet } of this.#sheets) {\r\n for (const rel of worksheet.preservedRelationships) {\r\n if (rel.resolved) {\r\n for (const p of collectSubtree(this.#preservedParts, rel.resolved)) retained.add(p);\r\n }\r\n }\r\n }\r\n\r\n // Candidates for removal: targets of relationships that went away — but\r\n // only if nothing retained still reaches them (an image may be shared).\r\n const candidates = [\r\n ...this.#sheets.flatMap(e => [...e.worksheet.droppedPreservedTargets]),\r\n ...this.#orphanedTargets,\r\n ];\r\n\r\n const dropped = new Set<string>();\r\n for (const target of candidates) {\r\n for (const p of collectSubtree(this.#preservedParts, target)) {\r\n if (!retained.has(p)) dropped.add(p);\r\n }\r\n }\r\n\r\n const written = new Set<string>();\r\n for (const [path, bytes] of this.#preservedParts) {\r\n if (dropped.has(path)) continue;\r\n entries.set(path, bytes);\r\n written.add(path);\r\n }\r\n return written;\r\n }\r\n\r\n /**\r\n * Content-type declarations for preserved parts. `<Default>` entries are kept\r\n * wholesale — they are extension-scoped and are what types binary parts such\r\n * as images — while `<Override>` entries are filtered to parts that survived.\r\n */\r\n #preservedContentTypeDeclarations(preservedPaths: ReadonlySet<string>): {\r\n defaults: Array<{ extension: string; contentType: string }>;\r\n overrides: Array<{ partName: string; contentType: string }>;\r\n } {\r\n const ct = this.#preservedContentTypes;\r\n if (!ct) return { defaults: [], overrides: [] };\r\n\r\n const defaults = [...ct.defaults]\r\n // 'rels' and 'xml' are already declared by the generated template.\r\n .filter(([ext]) => ext !== 'rels' && ext !== 'xml')\r\n .map(([extension, contentType]) => ({ extension, contentType }));\r\n\r\n const overrides = [...ct.overrides]\r\n .filter(([partName]) => preservedPaths.has(partName.replace(/^\\//, '')))\r\n .map(([partName, contentType]) => ({ partName, contentType }));\r\n\r\n return { defaults, overrides };\r\n }\r\n\r\n #buildZipEntries(): ZipInput {\r\n const entries: ZipInput = new Map();\r\n\r\n const sheetCount = this.#sheets.length;\r\n\r\n // Parts from the source file that core does not model are laid down first,\r\n // so anything written below deliberately overrides them.\r\n const preservedPaths = this.#seedPreservedParts(entries);\r\n\r\n // _rels/.rels\r\n entries.set('_rels/.rels', ROOT_RELS);\r\n\r\n // Build sheet metadata for workbook.xml\r\n // sheetId/rId are re-derived from document order rather than reusing the\r\n // values captured at open/add time: the parts and rels below are written as\r\n // sheet{i+1}.xml / rId{i+1}, so any gap (e.g. after removeWorksheet, or a\r\n // source file with non-sequential rels) would otherwise dangle.\r\n const sheetMetas: SheetMeta[] = this.#sheets.map((e, i) => ({\r\n name: e.worksheet.name,\r\n sheetId: i + 1,\r\n relationshipId: `rId${i + 1}`,\r\n state: e.worksheet.visibility !== 'visible' ? e.worksheet.visibility : undefined,\r\n }));\r\n\r\n // Defined names → workbook.xml <definedNames>. Map sheet-scope name to its\r\n // 0-based document-order index (localSheetId).\r\n const definedNameMetas: DefinedNameMeta[] = this.#definedNames.all.map(dn => {\r\n let localSheetId: number | undefined;\r\n if (dn.scope !== undefined) {\r\n const idx = this.#sheets.findIndex(e => e.worksheet.name === dn.scope);\r\n if (idx >= 0) localSheetId = idx;\r\n }\r\n return { name: dn.name, refersTo: dn.refersTo, localSheetId };\r\n });\r\n\r\n // xl/workbook.xml\r\n entries.set('xl/workbook.xml', buildWorkbookXml(sheetMetas, definedNameMetas));\r\n\r\n // xl/_rels/workbook.xml.rels\r\n entries.set('xl/_rels/workbook.xml.rels', buildWorkbookRels(sheetCount));\r\n\r\n // xl/styles.xml\r\n entries.set('xl/styles.xml', this.#styles.buildStylesXml());\r\n\r\n // xl/sharedStrings.xml\r\n entries.set('xl/sharedStrings.xml', this.#sharedStrings.buildXml());\r\n\r\n // xl/worksheets/sheetN.xml\r\n for (let i = 0; i < this.#sheets.length; i++) {\r\n entries.set(`xl/worksheets/sheet${i + 1}.xml`, this.#sheets[i]!.worksheet.buildXml());\r\n }\r\n\r\n // Drawings & their dependent parts (charts, images …).\r\n // Each worksheet with providers gets ONE drawing part aggregating all anchors;\r\n // every provider contributes one dependent part referenced from the drawing rels.\r\n const extraOverrides: Array<{ partName: string; contentType: string }> = [];\r\n let drawingCounter = 0;\r\n let partCounter = 0;\r\n\r\n for (let i = 0; i < this.#sheets.length; i++) {\r\n const ws = this.#sheets[i]!.worksheet;\r\n\r\n // Relationships carried over from the source file — the sheet's preserved\r\n // drawing, images, legacy comment anchors. Written verbatim; their targets\r\n // are relative to the worksheets folder, which is where this sheet lands\r\n // regardless of how it was renumbered.\r\n const sheetRels: string[] = ws.preservedRelationships.map(\r\n r => ` <Relationship Id=\"${r.id}\" Type=\"${r.type}\" Target=\"${r.target}\"${\r\n r.external ? ' TargetMode=\"External\"' : ''\r\n }/>`,\r\n );\r\n\r\n if (ws.hasDrawings) {\r\n // Skip any name a preserved part already occupies.\r\n do { drawingCounter++; } while (preservedPaths.has(`xl/drawings/drawing${drawingCounter}.xml`));\r\n const drawingPath = `xl/drawings/drawing${drawingCounter}.xml`;\r\n const anchors: string[] = [];\r\n const drawingRels: string[] = [];\r\n\r\n ws.drawingProviders.forEach((provider, idx) => {\r\n const relId = `rId${idx + 1}`;\r\n anchors.push(provider.buildAnchorXml(relId));\r\n\r\n let part = provider.buildPart(++partCounter);\r\n while (preservedPaths.has(part.path)) part = provider.buildPart(++partCounter);\r\n\r\n entries.set(part.path, part.content);\r\n extraOverrides.push({ partName: `/${part.path}`, contentType: part.contentType });\r\n\r\n // Rel target is relative to xl/drawings/ (all parts live under xl/).\r\n const target = `../${part.path.slice('xl/'.length)}`;\r\n drawingRels.push(\r\n ` <Relationship Id=\"${relId}\" Type=\"${part.relType}\" Target=\"${target}\"/>`,\r\n );\r\n });\r\n\r\n // xl/drawings/drawingN.xml + its rels\r\n entries.set(drawingPath, buildDrawingXml(anchors.join('')));\r\n entries.set(`xl/drawings/_rels/drawing${drawingCounter}.xml.rels`, buildRelsXml(drawingRels));\r\n extraOverrides.push({ partName: `/${drawingPath}`, contentType: CONTENT_TYPES.drawing });\r\n\r\n sheetRels.push(\r\n ` <Relationship Id=\"${ws.drawingRelId}\" Type=\"${REL_TYPES.drawing}\" Target=\"../drawings/drawing${drawingCounter}.xml\"/>`,\r\n );\r\n }\r\n\r\n if (sheetRels.length > 0) {\r\n entries.set(`xl/worksheets/_rels/sheet${i + 1}.xml.rels`, buildRelsXml(sheetRels));\r\n }\r\n }\r\n\r\n // [Content_Types].xml — written last so every generated and preserved part\r\n // is declared.\r\n const preservedCt = this.#preservedContentTypeDeclarations(preservedPaths);\r\n entries.set(\r\n '[Content_Types].xml',\r\n buildContentTypes(\r\n sheetCount,\r\n [...preservedCt.overrides, ...extraOverrides],\r\n preservedCt.defaults,\r\n ),\r\n );\r\n\r\n return entries;\r\n }\r\n}\r\n\r\n/**\r\n * Resolves the worksheet file path from workbook.xml.rels by relationship ID.\r\n * Returns path relative to xl/ e.g. \"xl/worksheets/sheet1.xml\".\r\n */\r\nfunction resolveWorksheetPath(relsXml: string, relId: string): string | undefined {\r\n if (!relsXml) return undefined;\r\n try {\r\n const root = parseXml(relsXml);\r\n for (const el of getElementsByTagName(root, 'Relationship')) {\r\n if (getAttr(el, 'Id') === relId) {\r\n const target = getAttr(el, 'Target') ?? '';\r\n // Target is relative to xl/, so \"worksheets/sheet1.xml\" → \"xl/worksheets/sheet1.xml\"\r\n return target.startsWith('xl/') ? target : `xl/${target}`;\r\n }\r\n }\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n return undefined;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/io/xml-parser.ts","../src/io/zip-reader.ts","../src/io/zip-container.ts","../src/io/zip-writer.ts","../src/io/xml-builder.ts","../src/io/ooxml-templates.ts","../src/io/drawing-part.ts","../src/io/preserved-parts.ts","../src/model/shared-string-manager.ts","../src/style/excel-color.ts","../src/style/excel-font.ts","../src/style/excel-fill.ts","../src/style/excel-border.ts","../src/style/excel-alignment.ts","../src/style/excel-number-format.ts","../src/style/cell-style.ts","../src/model/oa-date.ts","../src/style/style-manager.ts","../src/style/number-format-renderer.ts","../src/style/date-format-renderer.ts","../src/model/cell-reference.ts","../src/model/cell.ts","../src/model/ref-shift.ts","../src/model/formula-ref-shift.ts","../src/model/formula-ref-translate.ts","../src/model/range.ts","../src/model/worksheet.ts","../src/model/defined-name.ts","../src/model/workbook.ts"],"names":["unzipSync","zipSync","deflateSync","deflate","xml","ExcelUnderline","ExcelVerticalAlignRun","ExcelPatternType","ExcelBorderStyle","ExcelHorizontalAlignment","ExcelVerticalAlignment","ExcelReadingOrder","code","isWordChar","parseCellComponent","parseColComponent","parseRowComponent","emitCell","_sharedStrings","_styles","_version","touch_fn","escXml"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Cross-platform XML parser.\n *\n * Uses the browser DOMParser when available; otherwise (Node.js, Deno, Bun without a\n * DOM global) it uses a built-in char-scanning parser. The built-in parser handles the\n * subset of XML that OOXML produces: nested/self-closing elements, attributes, text,\n * CDATA sections, processing instructions and comments, plus standard entity decoding.\n * It is deliberately not a general-purpose XML parser.\n */\n\nexport type XmlElement = {\n readonly tagName: string;\n readonly attributes: Readonly<Record<string, string>>;\n readonly children: XmlElement[];\n readonly textContent: string;\n};\n\n// ── DOMParser-based implementation (browser / Node 18+) ──────────────────────\n\nfunction domElementToXml(el: Element): XmlElement {\n const attributes: Record<string, string> = {};\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i]!;\n attributes[attr.name] = attr.value;\n }\n\n const children: XmlElement[] = [];\n for (let i = 0; i < el.children.length; i++) {\n children.push(domElementToXml(el.children[i]!));\n }\n\n return {\n tagName: el.tagName,\n attributes,\n children,\n textContent: el.textContent ?? '',\n };\n}\n\nfunction parseDom(xmlString: string): XmlElement {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xmlString, 'application/xml');\n\n const parseError = doc.querySelector('parsererror');\n if (parseError) {\n throw new Error(`XML parse error: ${parseError.textContent}`);\n }\n\n if (!doc.documentElement) {\n throw new Error('XML parse error: no document element.');\n }\n\n return domElementToXml(doc.documentElement);\n}\n\n// ── Minimal hand-rolled parser for basic OOXML attribute extraction ───────────\n\n/**\n * Minimal regex-based XML parser.\n * Handles simple well-formed OOXML documents — NOT a general-purpose parser.\n * Used as fallback when DOMParser is not available.\n */\nfunction parseMinimal(xmlString: string): XmlElement {\n const stack: XmlElement[] = [];\n let pos = 0;\n let root: XmlElement | undefined;\n\n const peek = () => xmlString[pos] ?? '';\n const consume = (n = 1) => { pos += n; };\n\n function skipUntil(ch: string) {\n while (pos < xmlString.length && xmlString[pos] !== ch) pos++;\n }\n\n function parseAttributes(raw: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n // The value is delimited by whichever quote opened it, so the other quote is\n // legal inside — `location=\"'Sheet 2'!A1\"` is ordinary in a spreadsheet.\n const re = /([^\\s=/>]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n attrs[m[1]!] = decodeXmlEntities(m[2] ?? m[3] ?? '');\n }\n return attrs;\n }\n\n while (pos < xmlString.length) {\n if (xmlString[pos] === '<') {\n pos++;\n\n if (xmlString[pos] === '?') { skipUntil('>'); pos++; continue; } // PI\n if (xmlString[pos] === '!') {\n // CDATA section: copy contents verbatim into the current element's text.\n if (xmlString.startsWith('![CDATA[', pos)) {\n const cdataStart = pos + '![CDATA['.length;\n const cdataEnd = xmlString.indexOf(']]>', cdataStart);\n const end = cdataEnd === -1 ? xmlString.length : cdataEnd;\n const cdata = xmlString.slice(cdataStart, end);\n if (stack.length > 0) {\n (stack[stack.length - 1]! as { textContent: string }).textContent += cdata;\n }\n pos = cdataEnd === -1 ? xmlString.length : cdataEnd + 3;\n continue;\n }\n skipUntil('>'); pos++; continue; // comment / doctype\n }\n\n const isClose = xmlString[pos] === '/';\n if (isClose) pos++;\n\n // Read tag content until >\n const tagStart = pos;\n skipUntil('>');\n const tagContent = xmlString.slice(tagStart, pos).trim();\n pos++;\n\n const isSelfClose = tagContent.endsWith('/');\n const raw = isSelfClose ? tagContent.slice(0, -1).trim() : tagContent;\n\n const spaceIdx = raw.search(/\\s/);\n const tagName = spaceIdx === -1 ? raw : raw.slice(0, spaceIdx);\n const attrRaw = spaceIdx === -1 ? '' : raw.slice(spaceIdx);\n const attributes = parseAttributes(attrRaw);\n\n if (isClose) {\n stack.pop();\n } else {\n const el: XmlElement = { tagName, attributes, children: [], textContent: '' };\n if (stack.length > 0) {\n (stack[stack.length - 1]!.children as XmlElement[]).push(el);\n } else {\n root = el;\n }\n if (!isSelfClose) stack.push(el);\n }\n } else {\n // Text content\n const textStart = pos;\n skipUntil('<');\n const text = decodeXmlEntities(xmlString.slice(textStart, pos));\n if (stack.length > 0 && text.trim()) {\n (stack[stack.length - 1]! as { textContent: string }).textContent += text;\n }\n }\n }\n\n if (!root) throw new Error('XML parse error: empty document.');\n return root;\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Parses an XML string into a simple XmlElement tree.\n */\n/**\n * Decodes the five predefined XML entities. `&amp;` is expanded last so that an\n * escaped entity such as `&amp;lt;` decodes to the literal text `&lt;` rather\n * than being expanded twice.\n */\nexport function decodeXmlEntities(value: string): string {\n if (value.indexOf('&') === -1) return value;\n return value\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, '&');\n}\n\nexport function parseXml(xmlString: string): XmlElement {\n if (typeof DOMParser !== 'undefined') {\n return parseDom(xmlString);\n }\n return parseMinimal(xmlString);\n}\n\n/**\n * Decodes a Uint8Array to a UTF-8 string.\n */\nexport function decodeUtf8(bytes: Uint8Array): string {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder('utf-8').decode(bytes);\n }\n // Node.js Buffer fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(bytes).toString('utf-8');\n}\n\n/**\n * Encodes a string to UTF-8 bytes.\n */\nexport function encodeUtf8(str: string): Uint8Array {\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(str, 'utf-8');\n}\n\n/**\n * Queries all descendant elements matching a local tag name.\n * Handles namespace-prefixed tags (e.g. \"a:t\" matches tagName ending in \":t\" or equal to \"t\").\n */\nexport function getElementsByTagName(root: XmlElement, localName: string): XmlElement[] {\n const results: XmlElement[] = [];\n const lname = localName.toLowerCase();\n\n function walk(el: XmlElement) {\n const tag = el.tagName.toLowerCase();\n // Match \"tagname\" or \"prefix:tagname\"\n if (tag === lname || tag.endsWith(`:${lname}`)) {\n results.push(el);\n }\n for (const child of el.children) walk(child);\n }\n\n walk(root);\n return results;\n}\n\n/**\n * Gets a named attribute value, handling namespace prefixes.\n * Tries exact match first, then suffix match (e.g. \"r:id\" → looks for \"r:id\" or \"id\").\n */\nexport function getAttr(el: XmlElement, name: string): string | undefined {\n if (name in el.attributes) return el.attributes[name];\n // Try without prefix\n const local = name.includes(':') ? name.split(':').pop()! : name;\n // Try any key that ends with the local name\n for (const [key, val] of Object.entries(el.attributes)) {\n if (key === local || key.endsWith(`:${local}`)) return val;\n }\n return undefined;\n}\n","/**\n * ZIP reader for .xlsx files (which are ZIP archives).\n * Uses fflate for decompression — MIT licensed, ~9KB gzip.\n *\n * Port concept from TVE.PureDocs.Excel — the C# version uses System.IO.Compression.\n */\nimport { unzipSync } from 'fflate';\nimport { decodeUtf8 } from './xml-parser.js';\n\n/**\n * Represents the contents of an unzipped xlsx file.\n * Keys are file paths within the archive (e.g. \"xl/workbook.xml\").\n * Values are raw UTF-8 bytes.\n */\nexport type ZipEntries = Map<string, Uint8Array>;\n\n/**\n * Unzips an xlsx file buffer into a map of path → bytes.\n *\n * @param buffer - ArrayBuffer or Uint8Array of the xlsx file\n * @returns Map of file paths to their raw bytes\n */\nexport function unzipXlsx(buffer: ArrayBuffer | Uint8Array): ZipEntries {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n\n let raw: Record<string, Uint8Array>;\n try {\n raw = unzipSync(bytes);\n } catch (err) {\n throw new Error(\n `Failed to unzip xlsx: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const entries = new Map<string, Uint8Array>();\n for (const [path, data] of Object.entries(raw)) {\n // Normalise path separators (Windows ZIP files sometimes use backslash)\n entries.set(path.replace(/\\\\/g, '/'), data);\n }\n\n return entries;\n}\n\n/**\n * Reads and decodes a UTF-8 text entry from a zip archive.\n * Returns undefined if the entry does not exist.\n */\nexport function readXmlEntry(entries: ZipEntries, path: string): string | undefined {\n const bytes = entries.get(path);\n if (!bytes) return undefined;\n return decodeUtf8(bytes);\n}\n\n/**\n * Reads and decodes a UTF-8 text entry, throwing if missing.\n */\nexport function requireXmlEntry(entries: ZipEntries, path: string): string {\n const text = readXmlEntry(entries, path);\n if (text === undefined) {\n throw new Error(`Required xlsx entry not found: \"${path}\".`);\n }\n return text;\n}\n\n/**\n * Returns all entry paths that match the given prefix.\n * Useful for listing worksheets: prefix = \"xl/worksheets/\".\n */\nexport function listEntries(entries: ZipEntries, prefix: string): string[] {\n const results: string[] = [];\n for (const key of entries.keys()) {\n if (key.startsWith(prefix)) results.push(key);\n }\n return results.sort();\n}\n","/**\n * Minimal ZIP container assembly, over parts that are already deflated.\n *\n * Why this exists. Saving a workbook spends essentially all of its time in\n * deflate — for a 20-sheet workbook, 65 ms of a 50 ms save (the rest overlaps),\n * against 1.6 ms to build the XML. An editor that autosaves after a one-cell edit\n * pays that in full every time, even though nineteen of the twenty sheets\n * produced byte-identical input. Deflate is a pure function of its input, so the\n * output can be cached per part — but `zipSync` compresses and frames in one\n * step, with no way to hand it bytes that are already compressed. Hence this: the\n * framing, separated from the compression.\n *\n * Scope, deliberately narrow. Store-by-deflate only, no zip64, no data\n * descriptors, no encryption, no comments, and a fixed timestamp (1980-01-01, the\n * conventional \"no time\" value) so that saving an unchanged workbook twice\n * produces identical bytes. Anything outside that — more than 65 535 parts, or a\n * package past 4 GiB — is rejected by {@link exceedsZipLimits} so the caller can\n * fall back to fflate rather than emit a file that needs zip64 to be read.\n */\n\n/** One part, already compressed. */\nexport interface DeflatedPart {\n /** Path inside the archive, e.g. `xl/worksheets/sheet1.xml`. */\n readonly name: string;\n /** The deflate (method 8) stream. */\n readonly deflated: Uint8Array;\n /** CRC-32 of the *uncompressed* bytes. */\n readonly crc: number;\n /** Length of the uncompressed bytes. */\n readonly rawSize: number;\n}\n\nconst LOCAL_HEADER = 0x04034b50;\nconst CENTRAL_HEADER = 0x02014b50;\nconst END_OF_CENTRAL_DIR = 0x06054b50;\n/** DOS date for 1980-01-01; DOS time 0. A literal zero date is out of range. */\nconst DOS_DATE = 0x0021;\nconst DOS_TIME = 0x0000;\nconst MAX_ENTRIES = 0xffff;\nconst MAX_BYTES = 0xffffffff;\n\n// ── CRC-32 ────────────────────────────────────────────────────────────────────\n\nconst CRC_TABLE = (() => {\n const table = new Int32Array(256);\n for (let i = 0; i < 256; i++) {\n let c = i;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n table[i] = c;\n }\n return table;\n})();\n\n/** CRC-32 (IEEE 802.3), the checksum every ZIP entry carries. */\nexport function crc32(data: Uint8Array): number {\n let c = -1;\n for (let i = 0; i < data.length; i++) {\n c = (c >>> 8) ^ CRC_TABLE[(c ^ data[i]!) & 0xff]!;\n }\n return (c ^ -1) >>> 0;\n}\n\n// ── Container ─────────────────────────────────────────────────────────────────\n\n/** True when a part list needs features this writer does not implement. */\nexport function exceedsZipLimits(parts: readonly DeflatedPart[]): boolean {\n if (parts.length > MAX_ENTRIES) return true;\n let total = 0;\n for (const p of parts) {\n // Local header + name + data, plus the eventual central-directory record.\n total += 30 + utf8Length(p.name) * 2 + 46 + p.deflated.length;\n if (total > MAX_BYTES || p.rawSize > MAX_BYTES) return true;\n }\n return false;\n}\n\n/**\n * Frames already-deflated parts into a ZIP archive.\n *\n * The caller must have checked {@link exceedsZipLimits}; this function assumes\n * every offset and size fits in 32 bits.\n */\nexport function buildZipContainer(parts: readonly DeflatedPart[]): Uint8Array {\n const names = parts.map(p => encodeName(p.name));\n\n let localSize = 0;\n let centralSize = 0;\n for (let i = 0; i < parts.length; i++) {\n localSize += 30 + names[i]!.bytes.length + parts[i]!.deflated.length;\n centralSize += 46 + names[i]!.bytes.length;\n }\n\n const out = new Uint8Array(localSize + centralSize + 22);\n const view = new DataView(out.buffer);\n const offsets: number[] = [];\n let at = 0;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n const name = names[i]!;\n offsets.push(at);\n\n view.setUint32(at, LOCAL_HEADER, true);\n view.setUint16(at + 4, 20, true); // version needed\n view.setUint16(at + 6, name.utf8Flag, true); // general purpose flags\n view.setUint16(at + 8, 8, true); // method: deflate\n view.setUint16(at + 10, DOS_TIME, true);\n view.setUint16(at + 12, DOS_DATE, true);\n view.setUint32(at + 14, part.crc, true);\n view.setUint32(at + 18, part.deflated.length, true);\n view.setUint32(at + 22, part.rawSize, true);\n view.setUint16(at + 26, name.bytes.length, true);\n view.setUint16(at + 28, 0, true); // extra field length\n at += 30;\n out.set(name.bytes, at);\n at += name.bytes.length;\n out.set(part.deflated, at);\n at += part.deflated.length;\n }\n\n const centralStart = at;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n const name = names[i]!;\n\n view.setUint32(at, CENTRAL_HEADER, true);\n view.setUint16(at + 4, 20, true); // version made by\n view.setUint16(at + 6, 20, true); // version needed\n view.setUint16(at + 8, name.utf8Flag, true);\n view.setUint16(at + 10, 8, true); // method: deflate\n view.setUint16(at + 12, DOS_TIME, true);\n view.setUint16(at + 14, DOS_DATE, true);\n view.setUint32(at + 16, part.crc, true);\n view.setUint32(at + 20, part.deflated.length, true);\n view.setUint32(at + 24, part.rawSize, true);\n view.setUint16(at + 28, name.bytes.length, true);\n view.setUint16(at + 30, 0, true); // extra field length\n view.setUint16(at + 32, 0, true); // comment length\n view.setUint16(at + 34, 0, true); // disk number start\n view.setUint16(at + 36, 0, true); // internal attributes\n view.setUint32(at + 38, 0, true); // external attributes\n view.setUint32(at + 42, offsets[i]!, true);\n at += 46;\n out.set(name.bytes, at);\n at += name.bytes.length;\n }\n\n view.setUint32(at, END_OF_CENTRAL_DIR, true);\n view.setUint16(at + 4, 0, true); // this disk\n view.setUint16(at + 6, 0, true); // disk with central dir\n view.setUint16(at + 8, parts.length, true);\n view.setUint16(at + 10, parts.length, true);\n view.setUint32(at + 12, at - centralStart, true);\n view.setUint32(at + 16, centralStart, true);\n view.setUint16(at + 20, 0, true); // archive comment length\n\n return out;\n}\n\ninterface EncodedName { bytes: Uint8Array; utf8Flag: number }\n\n/**\n * Encodes a part name. OOXML part names are ASCII in practice, but a preserved\n * part from an unusual producer may not be — in which case bit 11 has to say the\n * name is UTF-8, or a reader will decode it as CP437.\n */\nfunction encodeName(name: string): EncodedName {\n const bytes = new TextEncoder().encode(name);\n let ascii = true;\n for (let i = 0; i < bytes.length; i++) {\n if (bytes[i]! > 0x7f) { ascii = false; break; }\n }\n return { bytes, utf8Flag: ascii ? 0 : 0x0800 };\n}\n\nfunction utf8Length(name: string): number {\n return new TextEncoder().encode(name).length;\n}\n","/**\n * ZIP writer for producing .xlsx files.\n * Uses fflate for compression — MIT licensed.\n */\nimport { zipSync, deflate, deflateSync, type Zippable } from 'fflate';\nimport {\n buildZipContainer,\n crc32,\n exceedsZipLimits,\n type DeflatedPart,\n} from './zip-container.js';\nimport { encodeUtf8 } from './xml-parser.js';\n\n/**\n * Represents the file entries to be zipped.\n * Keys are paths within the archive, values are either bytes or a UTF-8 string.\n */\nexport type ZipInput = Map<string, Uint8Array | string>;\n\n/**\n * Zips a collection of file entries into an xlsx-compatible buffer.\n *\n * @param entries - Map of path → content (string auto-encoded to UTF-8)\n * @returns Uint8Array of the resulting ZIP file\n */\nexport function zipXlsx(entries: ZipInput): Uint8Array {\n const zippable: Zippable = {};\n\n for (const [path, content] of entries) {\n const bytes = typeof content === 'string' ? encodeUtf8(content) : content;\n zippable[path] = [bytes, { level: 6 }];\n }\n\n try {\n return zipSync(zippable);\n } catch (err) {\n throw new Error(\n `Failed to create xlsx: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Compressed output for one part, kept so an unchanged part is never deflated\n * twice. `source` is what produced it, compared by identity/value on the next\n * save — for a worksheet that is the memoised XML string, so the check is a\n * reference comparison.\n */\ninterface CachedPart extends DeflatedPart {\n readonly source: Uint8Array | string;\n}\n\n/**\n * Below this many uncompressed bytes, the async save compresses inline instead of\n * dispatching to a worker: the dispatch alone costs more than the work.\n */\nconst ASYNC_MIN_BYTES = 512 * 1024;\n\n/** Per-workbook store of compressed parts. Opaque to callers. */\nexport type DeflateCache = Map<string, CachedPart>;\n\nexport function createDeflateCache(): DeflateCache {\n return new Map();\n}\n\n/** Deflates `bytes` the way {@link zipXlsx} would, and records the checksum. */\nfunction compress(name: string, source: Uint8Array | string, bytes: Uint8Array): CachedPart {\n return {\n name,\n source,\n deflated: deflateSync(bytes, { level: 6 }),\n crc: crc32(bytes),\n rawSize: bytes.length,\n };\n}\n\n/**\n * Zips the entries, reusing the compressed form of every part whose content is\n * unchanged since the last call with this cache.\n *\n * This is the whole point of the cache: deflate dominates a save, and an autosave\n * after one edit changes one part. Parts are compared by content, so a part that\n * is rebuilt into an identical string still counts as unchanged.\n *\n * Falls back to {@link zipXlsx} when the package would need ZIP features this\n * writer does not implement (zip64) — a rejected archive is worse than a slow one.\n */\nexport function zipXlsxCached(entries: ZipInput, cache: DeflateCache): Uint8Array {\n const parts = collectParts(entries, cache);\n pruneCache(entries, cache);\n return exceedsZipLimits(parts) ? zipXlsx(entries) : buildZipContainer(parts);\n}\n\n/**\n * {@link zipXlsxCached} without blocking the calling thread: the parts that do\n * need compressing are deflated off-thread, in parallel, and only the framing\n * happens here.\n */\nexport async function zipXlsxCachedAsync(entries: ZipInput, cache: DeflateCache): Promise<Uint8Array> {\n const order: string[] = [];\n const ready = new Map<string, CachedPart>();\n const jobs: Array<Promise<CachedPart>> = [];\n const todo: Array<{ path: string; content: Uint8Array | string; bytes: Uint8Array }> = [];\n let todoBytes = 0;\n\n for (const [path, content] of entries) {\n order.push(path);\n const cached = cache.get(path);\n if (cached && cached.source === content) {\n ready.set(path, cached);\n continue;\n }\n const bytes = typeof content === 'string' ? encodeUtf8(content) : content;\n todo.push({ path, content, bytes });\n todoBytes += bytes.length;\n }\n\n // Handing work to a worker costs more than the work itself when there is\n // little of it — measured at ~20 ms of startup against ~4 ms to compress one\n // edited sheet. So a small save stays on this thread and simply finishes.\n if (todoBytes <= ASYNC_MIN_BYTES) {\n for (const { path, content, bytes } of todo) {\n const compressed = compress(path, content, bytes);\n cache.set(path, compressed);\n ready.set(path, compressed);\n }\n } else {\n for (const { path, content, bytes } of todo) {\n jobs.push(deflateAsync(bytes).then(deflated => ({\n name: path, source: content, deflated, crc: crc32(bytes), rawSize: bytes.length,\n })));\n }\n }\n\n for (const part of await Promise.all(jobs)) {\n cache.set(part.name, part);\n ready.set(part.name, part);\n }\n pruneCache(entries, cache);\n\n // Entry order is the archive order; a package whose parts move around is not\n // the same file even if it holds the same bytes.\n const parts = order.map(path => ready.get(path)!);\n return exceedsZipLimits(parts) ? zipXlsx(entries) : buildZipContainer(parts);\n}\n\nfunction deflateAsync(bytes: Uint8Array): Promise<Uint8Array> {\n return new Promise((resolve, reject) => {\n deflate(bytes, { level: 6 }, (err, data) => {\n if (err) reject(new Error(`Failed to create xlsx: ${err.message}`));\n else resolve(data);\n });\n });\n}\n\n/**\n * Walks the entries, returning one part each: the cached compressed form when the\n * content is unchanged, otherwise a freshly compressed one.\n */\nfunction collectParts(entries: ZipInput, cache: DeflateCache): CachedPart[] {\n const parts: CachedPart[] = [];\n for (const [path, content] of entries) {\n const cached = cache.get(path);\n if (cached && cached.source === content) {\n parts.push(cached);\n continue;\n }\n const bytes = typeof content === 'string' ? encodeUtf8(content) : content;\n const part = compress(path, content, bytes);\n cache.set(path, part);\n parts.push(part);\n }\n return parts;\n}\n\n/** Forgets parts that are no longer in the package. */\nfunction pruneCache(entries: ZipInput, cache: DeflateCache): void {\n if (cache.size === entries.size) return;\n for (const path of [...cache.keys()]) {\n if (!entries.has(path)) cache.delete(path);\n }\n}\n\n/**\n * Helper to add or update a UTF-8 text entry.\n */\nexport function setXmlEntry(entries: ZipInput, path: string, xml: string): void {\n entries.set(path, xml);\n}\n\n/**\n * Helper to add or update a binary entry.\n */\nexport function setBinaryEntry(entries: ZipInput, path: string, bytes: Uint8Array): void {\n entries.set(path, bytes);\n}\n","/**\n * Lightweight XML builder for OOXML document parts.\n * Produces well-formed XML strings without external dependencies.\n */\n\n/** Escapes special XML characters in an attribute value or text content. */\nexport function escapeXml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\n/** Serialises a key-value map to XML attribute string. */\nfunction attrsToString(attrs: Record<string, string | number | boolean | undefined>): string {\n let result = '';\n for (const [key, val] of Object.entries(attrs)) {\n if (val === undefined || val === null) continue;\n result += ` ${key}=\"${escapeXml(String(val))}\"`;\n }\n return result;\n}\n\nexport type XmlAttrs = Record<string, string | number | boolean | undefined>;\n\nexport class XmlBuilder {\n private readonly parts: string[] = [];\n\n /** Appends the XML declaration header. */\n xmlDeclaration(): this {\n this.parts.push('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n return this;\n }\n\n /** Opens a tag with optional attributes. */\n open(tag: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})}>`);\n return this;\n }\n\n /** Closes a tag. */\n close(tag: string): this {\n this.parts.push(`</${tag}>`);\n return this;\n }\n\n /** Writes a self-closing tag. */\n self(tag: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})} />`);\n return this;\n }\n\n /** Writes a tag with text content. */\n text(tag: string, content: string, attrs?: XmlAttrs): this {\n this.parts.push(`<${tag}${attrsToString(attrs ?? {})}>${escapeXml(content)}</${tag}>`);\n return this;\n }\n\n /** Writes raw (pre-escaped) XML — use with caution. */\n raw(xml: string): this {\n this.parts.push(xml);\n return this;\n }\n\n /** Returns the complete XML string. */\n toString(): string {\n return this.parts.join('');\n }\n\n /** Returns UTF-8 encoded bytes. */\n toBytes(): Uint8Array {\n const str = this.toString();\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str);\n }\n // Node.js fallback\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Buffer as any).from(str, 'utf-8') as Uint8Array;\n }\n}\n\n/** Convenience factory. */\nexport function xml(): XmlBuilder {\n return new XmlBuilder();\n}\n\n// ── Common OOXML namespace declarations ───────────────────────────────────────\n\nexport const NS = {\n // SpreadsheetML\n spreadsheetml: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n // Relationships\n relationships: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n relationshipsPackage: 'http://schemas.openxmlformats.org/package/2006/relationships',\n // Drawing\n drawingml: 'http://schemas.openxmlformats.org/drawingml/2006/main',\n spreadsheetDrawing: 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing',\n // Content types\n contentTypes: 'http://schemas.openxmlformats.org/package/2006/content-types',\n // Core properties\n coreProperties: 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties',\n} as const;\n\nexport const REL_TYPES = {\n officeDocument: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument',\n worksheet: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet',\n sharedStrings: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings',\n styles: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',\n chart: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',\n drawing: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',\n hyperlink: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',\n comments: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',\n vmlDrawing: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing',\n calcChain: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain',\n} as const;\n\nexport const CONTENT_TYPES = {\n workbook: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',\n worksheet: 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml',\n sharedStrings: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml',\n styles: 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml',\n drawing: 'application/vnd.openxmlformats-officedocument.drawing+xml',\n chart: 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml',\n relationships: 'application/vnd.openxmlformats-package.relationships+xml',\n coreProperties: 'application/vnd.openxmlformats-package.core-properties+xml',\n comments: 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml',\n vmlDrawing: 'application/vnd.openxmlformats-officedocument.vmlDrawing',\n calcChain: 'application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml',\n} as const;\n","/**\n * Default OOXML file templates for creating a new empty workbook.\n *\n * An .xlsx file is a ZIP containing XML parts. The minimal set required is:\n * [Content_Types].xml\n * _rels/.rels\n * xl/workbook.xml\n * xl/_rels/workbook.xml.rels\n * xl/styles.xml\n * xl/sharedStrings.xml\n *\n * Port of TVE.PureDocs.Excel.Workbook.InitializeWorkbook() and CreateDefaultStylesheet().\n */\nimport { CONTENT_TYPES, REL_TYPES } from './xml-builder.js';\n\n// ── [Content_Types].xml ──────────────────────────────────────────────────────\n\nexport function buildContentTypes(\n sheetCount: number,\n extraOverrides: ReadonlyArray<{ partName: string; contentType: string }> = [],\n extraDefaults: ReadonlyArray<{ extension: string; contentType: string }> = [],\n): string {\n const overrides = Array.from({ length: sheetCount }, (_, i) =>\n ` <Override PartName=\"/xl/worksheets/sheet${i + 1}.xml\" ContentType=\"${CONTENT_TYPES.worksheet}\"/>`,\n );\n\n // Later entries win, so a generated override replaces a preserved one for the\n // same part rather than declaring it twice.\n const seen = new Set<string>();\n for (const { partName, contentType } of [...extraOverrides].reverse()) {\n if (seen.has(partName)) continue;\n seen.add(partName);\n overrides.push(` <Override PartName=\"${partName}\" ContentType=\"${contentType}\"/>`);\n }\n\n const defaults = extraDefaults.map(\n ({ extension, contentType }) =>\n ` <Default Extension=\"${extension}\" ContentType=\"${contentType}\"/>`,\n );\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"${'http://schemas.openxmlformats.org/package/2006/content-types'}\">\n <Default Extension=\"rels\" ContentType=\"${CONTENT_TYPES.relationships}\"/>\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n${defaults.length > 0 ? `${defaults.join('\\n')}\\n` : ''} <Override PartName=\"/xl/workbook.xml\" ContentType=\"${CONTENT_TYPES.workbook}\"/>\n <Override PartName=\"/xl/styles.xml\" ContentType=\"${CONTENT_TYPES.styles}\"/>\n <Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"${CONTENT_TYPES.sharedStrings}\"/>\n${overrides.join('\\n')}\n</Types>`;\n}\n\n// ── _rels/.rels ──────────────────────────────────────────────────────────────\n\nexport const ROOT_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"${REL_TYPES.officeDocument}\" Target=\"xl/workbook.xml\"/>\n</Relationships>`;\n\n// ── xl/_rels/workbook.xml.rels ───────────────────────────────────────────────\n\nexport function buildWorkbookRels(sheetCount: number, includeCalcChain = false): string {\n const sheetRels = Array.from(\n { length: sheetCount },\n (_, i) =>\n ` <Relationship Id=\"rId${i + 1}\" Type=\"${REL_TYPES.worksheet}\" Target=\"worksheets/sheet${i + 1}.xml\"/>`,\n ).join('\\n');\n\n const stylesId = sheetCount + 1;\n const sharedId = sheetCount + 2;\n // Without this relationship Excel never reads calcChain.xml, so a part written\n // without it is dead weight rather than a calculation order.\n const calcChainRel = includeCalcChain\n ? `\\n <Relationship Id=\"rId${sheetCount + 3}\" Type=\"${REL_TYPES.calcChain}\" Target=\"calcChain.xml\"/>`\n : '';\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n${sheetRels}\n <Relationship Id=\"rId${stylesId}\" Type=\"${REL_TYPES.styles}\" Target=\"styles.xml\"/>\n <Relationship Id=\"rId${sharedId}\" Type=\"${REL_TYPES.sharedStrings}\" Target=\"sharedStrings.xml\"/>${calcChainRel}\n</Relationships>`;\n}\n\n// ── xl/workbook.xml ──────────────────────────────────────────────────────────\n\nexport interface SheetMeta {\n name: string;\n sheetId: number;\n relationshipId: string;\n state?: 'visible' | 'hidden' | 'veryHidden';\n}\n\n/**\n * A defined name (named range) as serialised in workbook.xml.\n * `localSheetId` is the 0-based worksheet index for sheet-scoped names, or\n * undefined for workbook-global names.\n */\nexport interface DefinedNameMeta {\n name: string;\n refersTo: string; // without leading '='\n localSheetId?: number;\n}\n\nexport function buildWorkbookXml(\n sheets: SheetMeta[],\n definedNames: ReadonlyArray<DefinedNameMeta> = [],\n): string {\n const sheetElems = sheets\n .map(({ name, sheetId, relationshipId, state }) => {\n const stateAttr = state && state !== 'visible' ? ` state=\"${state}\"` : '';\n return ` <sheet name=\"${escapeAttr(name)}\" sheetId=\"${sheetId}\" r:id=\"${relationshipId}\"${stateAttr}/>`;\n })\n .join('\\n');\n\n let definedNamesBlock = '';\n if (definedNames.length > 0) {\n const items = definedNames\n .map(({ name, refersTo, localSheetId }) => {\n const local = localSheetId !== undefined ? ` localSheetId=\"${localSheetId}\"` : '';\n return ` <definedName name=\"${escapeAttr(name)}\"${local}>${escapeContent(refersTo)}</definedName>`;\n })\n .join('\\n');\n definedNamesBlock = `\\n <definedNames>\\n${items}\\n </definedNames>`;\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <fileVersion appName=\"xl\" lastEdited=\"7\" lowestEdited=\"7\" rupBuild=\"22228\"/>\n <workbookPr defaultThemeVersion=\"124226\"/>\n <bookViews>\n <workbookView xWindow=\"240\" yWindow=\"105\" windowWidth=\"14805\" windowHeight=\"8010\"/>\n </bookViews>\n <sheets>\n${sheetElems}\n </sheets>${definedNamesBlock}\n <calcPr calcId=\"191028\" fullCalcOnLoad=\"1\"/>\n</workbook>`;\n}\n\n// ── xl/sharedStrings.xml ─────────────────────────────────────────────────────\n\nexport function buildSharedStringsXml(strings: string[]): string {\n const items = strings\n .map(s => ` <si><t ${s.startsWith(' ') || s.endsWith(' ') ? 'xml:space=\"preserve\"' : ''}>${escapeContent(s)}</t></si>`)\n .join('\\n');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${strings.length}\" uniqueCount=\"${strings.length}\">\n${items}\n</sst>`;\n}\n\n// ── xl/styles.xml ────────────────────────────────────────────────────────────\n\n/**\n * Default stylesheet — mirrors Workbook.CreateDefaultStylesheet() in C#.\n * Contains exactly:\n * - 1 default font (Calibri 11pt)\n * - 2 required fills (none + gray125)\n * - 1 default border (all empty)\n * - 1 default cell format (format 0, all indices 0)\n */\nexport const DEFAULT_STYLES_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n <fonts count=\"1\">\n <font>\n <sz val=\"11\"/>\n <color theme=\"1\"/>\n <name val=\"Calibri\"/>\n </font>\n </fonts>\n <fills count=\"2\">\n <fill><patternFill patternType=\"none\"/></fill>\n <fill><patternFill patternType=\"gray125\"/></fill>\n </fills>\n <borders count=\"1\">\n <border>\n <left/><right/><top/><bottom/><diagonal/>\n </border>\n </borders>\n <cellStyleXfs count=\"1\">\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\n </cellStyleXfs>\n <cellXfs count=\"1\">\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>\n </cellXfs>\n</styleSheet>`;\n\n// ── xl/worksheets/sheet1.xml ─────────────────────────────────────────────────\n\nexport const EMPTY_WORKSHEET_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <sheetData/>\n</worksheet>`;\n\n// ── helpers ───────────────────────────────────────────────────────────────────\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction escapeContent(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n","/**\n * Generic drawing extension point.\n *\n * The core library knows nothing about charts, images or any specific drawing\n * type. It only knows how to place an opaque \"drawing provider\" into the package:\n * a provider yields one anchor fragment (positioned inside `<xdr:wsDr>`) plus one\n * dependent part (e.g. a chart part) that the anchor references by relationship.\n *\n * This lets satellite packages such as `@devmm/puredocs-excel-charts` inject valid\n * OOXML parts during `Workbook.saveAsBuffer()` without the core depending on them,\n * and without reaching into core internals.\n */\nimport { NS } from './xml-builder.js';\n\n/** A part that a drawing anchor references (e.g. `xl/charts/chart1.xml`). */\nexport interface DrawingDependentPart {\n /** Package-relative path, no leading slash — e.g. `xl/charts/chart1.xml`. */\n readonly path: string;\n /** Full XML content of the part. */\n readonly content: string;\n /** Content type for the `[Content_Types].xml` Override entry. */\n readonly contentType: string;\n /** Relationship type used by the drawing → part relationship. */\n readonly relType: string;\n}\n\n/**\n * Contributes one anchored object (chart, image, …) to a worksheet's drawing.\n * Implemented by satellite packages; consumed by the core save pipeline.\n */\nexport interface DrawingProvider {\n /**\n * Builds the `<xdr:*Anchor>` fragment placed inside `<xdr:wsDr>`.\n * @param relationshipId the id (e.g. `\"rId1\"`) the anchor must reference for\n * its embedded dependent part.\n */\n buildAnchorXml(relationshipId: string): string;\n\n /**\n * Builds the dependent part this drawing references.\n * @param partIndex a workbook-unique 1-based index for building a unique path\n * (e.g. `xl/charts/chart{partIndex}.xml`).\n */\n buildPart(partIndex: number): DrawingDependentPart;\n}\n\n/** Relationship id used by a worksheet to reference its single drawing part. */\nexport const WORKSHEET_DRAWING_REL_ID = 'rId1';\n\n/** Wraps anchor fragments into a complete `xl/drawings/drawingN.xml` part. */\nexport function buildDrawingXml(anchorsXml: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<xdr:wsDr xmlns:xdr=\"${NS.spreadsheetDrawing}\" xmlns:a=\"${NS.drawingml}\">${anchorsXml}</xdr:wsDr>`;\n}\n\n/** Builds a generic `.rels` part from a list of `<Relationship .../>` strings. */\nexport function buildRelsXml(relationships: readonly string[]): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n${relationships.join('\\n')}\n</Relationships>`;\n}\n","/**\n * Round-trip preservation of package parts the core model does not understand.\n *\n * `Workbook.saveAsBuffer()` rebuilds the package from the in-memory model, so\n * any part core never parsed — drawings, images, themes, comments, pivot\n * caches, docProps — would silently disappear on open→save. This module\n * captures those parts at open time so the save pipeline can pass them through\n * untouched.\n *\n * Parts core *does* own are excluded: it regenerates them, and keeping a stale\n * copy would produce duplicates or dangling relationships.\n */\nimport type { ZipEntries } from './zip-reader.js';\nimport { decodeUtf8, decodeXmlEntities } from './xml-parser.js';\n\n/**\n * Paths regenerated by the save pipeline. Worksheets and their rels are matched\n * by prefix because the source file may name or number them differently than we\n * will on the way out.\n */\nfunction isCoreOwned(path: string): boolean {\n return (\n path === '[Content_Types].xml' ||\n path === '_rels/.rels' ||\n path === 'xl/workbook.xml' ||\n path === 'xl/_rels/workbook.xml.rels' ||\n path === 'xl/styles.xml' ||\n path === 'xl/sharedStrings.xml' ||\n path.startsWith('xl/worksheets/')\n );\n}\n\n/** Captures every part the save pipeline will not write itself. */\nexport function collectPreservedParts(entries: ZipEntries): Map<string, Uint8Array> {\n const preserved = new Map<string, Uint8Array>();\n for (const [path, bytes] of entries) {\n if (!isCoreOwned(path)) preserved.set(path, bytes);\n }\n return preserved;\n}\n\nexport interface ContentTypeDeclarations {\n /** Extension → content type, e.g. \"png\" → \"image/png\". */\n defaults: Map<string, string>;\n /** Absolute part name (with leading slash) → content type. */\n overrides: Map<string, string>;\n}\n\n/**\n * Parses `[Content_Types].xml` so preserved parts keep their declarations. Both\n * maps matter: binary parts such as images are typed by `<Default>` extension,\n * XML parts such as charts by `<Override>`.\n */\nexport function parseContentTypes(xml: string): ContentTypeDeclarations {\n const defaults = new Map<string, string>();\n const overrides = new Map<string, string>();\n\n for (const m of xml.matchAll(/<Default\\s+[^>]*\\/?>/g)) {\n const ext = /Extension=\"([^\"]*)\"/.exec(m[0])?.[1];\n const ct = /ContentType=\"([^\"]*)\"/.exec(m[0])?.[1];\n if (ext && ct) defaults.set(ext.toLowerCase(), ct);\n }\n for (const m of xml.matchAll(/<Override\\s+[^>]*\\/?>/g)) {\n const part = /PartName=\"([^\"]*)\"/.exec(m[0])?.[1];\n const ct = /ContentType=\"([^\"]*)\"/.exec(m[0])?.[1];\n if (part && ct) overrides.set(part, ct);\n }\n\n return { defaults, overrides };\n}\n\nexport interface Relationship {\n id: string;\n type: string;\n /** Target exactly as written in the source rels part. */\n target: string;\n /** Target resolved to a package-absolute path, or undefined if external. */\n resolved?: string;\n /** True when the relationship points outside the package (TargetMode). */\n external: boolean;\n}\n\n/** Resolves a possibly-relative rels target against the part's own directory. */\nfunction resolveTarget(target: string, baseDir: string): string {\n if (target.startsWith('/')) return target.slice(1);\n\n const segments = baseDir.split('/').filter(Boolean);\n for (const seg of target.split('/')) {\n if (seg === '.' || seg === '') continue;\n if (seg === '..') segments.pop();\n else segments.push(seg);\n }\n return segments.join('/');\n}\n\n/**\n * Parses a `.rels` part.\n *\n * @param ownerPath package path of the part the rels belong to, e.g.\n * `xl/worksheets/sheet1.xml` — used to resolve relative targets.\n */\nexport function parseRelationships(relsXml: string, ownerPath: string): Relationship[] {\n const baseDir = ownerPath.slice(0, ownerPath.lastIndexOf('/'));\n const rels: Relationship[] = [];\n\n for (const m of relsXml.matchAll(/<Relationship\\s+[^>]*\\/?>/g)) {\n const tag = m[0];\n const id = /\\bId=\"([^\"]*)\"/.exec(tag)?.[1];\n const type = /\\bType=\"([^\"]*)\"/.exec(tag)?.[1];\n const rawTarget = /\\bTarget=\"([^\"]*)\"/.exec(tag)?.[1];\n if (!id || !type || rawTarget === undefined) continue;\n\n // Targets are attribute values, so entities must be decoded — a URL with a\n // query string routinely contains `&amp;`.\n const target = decodeXmlEntities(rawTarget);\n const external = /TargetMode=\"External\"/.test(tag);\n rels.push({\n id,\n type,\n target,\n resolved: external ? undefined : resolveTarget(target, baseDir),\n external,\n });\n }\n return rels;\n}\n\n/**\n * Walks the relationship graph from `startPath`, returning that part plus every\n * part reachable from it. Used to drop a preserved drawing together with the\n * charts and images only it referenced, so overriding a sheet's drawing does\n * not leave orphaned parts behind.\n */\nexport function collectSubtree(\n parts: ReadonlyMap<string, Uint8Array>,\n startPath: string,\n): Set<string> {\n const seen = new Set<string>();\n const queue = [startPath];\n\n while (queue.length > 0) {\n const path = queue.pop()!;\n if (seen.has(path) || !parts.has(path)) continue;\n seen.add(path);\n\n const dir = path.slice(0, path.lastIndexOf('/'));\n const file = path.slice(path.lastIndexOf('/') + 1);\n const relsPath = `${dir}/_rels/${file}.rels`;\n const relsBytes = parts.get(relsPath);\n if (!relsBytes) continue;\n\n seen.add(relsPath);\n for (const rel of parseRelationships(decodeUtf8(relsBytes), path)) {\n if (rel.resolved) queue.push(rel.resolved);\n }\n }\n\n return seen;\n}\n\n/**\n * Empty worksheet child elements that reference a part by relationship id and\n * must survive round-tripping. All are leaf elements per CT_Worksheet, so they\n * can be captured as raw text. Container elements (`tableParts`, `oleObjects`,\n * `controls`) are deliberately not preserved — they carry structure the model\n * would have to understand to keep consistent.\n */\nconst PRESERVED_TAIL_TAGS = ['drawing', 'legacyDrawing', 'legacyDrawingHF', 'picture'] as const;\n\nexport interface PreservedTailElement {\n tag: string;\n /** The relationship id the element references. */\n relId: string;\n /** Raw element text, re-emitted verbatim. */\n xml: string;\n}\n\n/** Extracts the relationship-bearing leaf elements from a worksheet part. */\nexport function parseTailElements(worksheetXml: string): PreservedTailElement[] {\n const found: PreservedTailElement[] = [];\n\n for (const tag of PRESERVED_TAIL_TAGS) {\n // Leaf elements: `<drawing r:id=\"rId1\"/>` (optionally with a closing tag).\n const re = new RegExp(`<(?:\\\\w+:)?${tag}\\\\s[^>]*?/>|<(?:\\\\w+:)?${tag}\\\\s[^>]*?>\\\\s*</(?:\\\\w+:)?${tag}>`, 'g');\n for (const m of worksheetXml.matchAll(re)) {\n const relId = /r:id=\"([^\"]*)\"/.exec(m[0])?.[1];\n if (relId) found.push({ tag, relId, xml: m[0] });\n }\n }\n\n return found;\n}\n","/**\n * Manages the shared string table for efficient string storage in xlsx files.\n * Excel stores repeated strings in a shared table and references them by index,\n * dramatically reducing file size for repeated values.\n *\n * Port of TVE.PureDocs.Excel.SharedStringManager (C#)\n *\n * Key differences:\n * - Uses Map instead of Dictionary (same O(1) performance)\n * - No threading concerns (JS single-threaded)\n * - Parses/serialises XML directly instead of using OpenXml SDK\n */\nimport { parseXml, getElementsByTagName } from '../io/xml-parser.js';\n\nexport class SharedStringManager {\n /** Forward map: string value → index */\n readonly #stringToIndex = new Map<string, number>();\n /** Reverse map: index → string value */\n readonly #indexToString: string[] = [];\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /** Total number of unique strings. */\n get count(): number {\n return this.#indexToString.length;\n }\n\n /**\n * Adds a string to the table (if not already present) and returns its index.\n * O(1) average case.\n */\n addOrGet(value: string): number {\n const existing = this.#stringToIndex.get(value);\n if (existing !== undefined) return existing;\n\n const idx = this.#indexToString.length;\n this.#indexToString.push(value);\n this.#stringToIndex.set(value, idx);\n return idx;\n }\n\n /**\n * Returns the string at the given index.\n * Throws if index is out of range.\n */\n getString(index: number): string {\n const s = this.#indexToString[index];\n if (s === undefined) {\n throw new RangeError(\n `Shared string index ${index} out of range [0, ${this.#indexToString.length - 1}].`,\n );\n }\n return s;\n }\n\n /**\n * Returns the string at index, or undefined if not found.\n * Safe alternative to getString().\n */\n tryGetString(index: number): string | undefined {\n return this.#indexToString[index];\n }\n\n /** Returns true if the string is already in the table. */\n has(value: string): boolean {\n return this.#stringToIndex.has(value);\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /**\n * Builds the xl/sharedStrings.xml string.\n */\n buildXml(): string {\n const count = this.#indexToString.length;\n const items = this.#indexToString\n .map(s => {\n const preserveSpace = s.startsWith(' ') || s.endsWith(' ') ? ' xml:space=\"preserve\"' : '';\n return `<si><t${preserveSpace}>${escContent(s)}</t></si>`;\n })\n .join('');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${count}\" uniqueCount=\"${count}\">\n${items}\n</sst>`;\n }\n\n /**\n * Parses an existing xl/sharedStrings.xml and loads strings into the table.\n */\n loadFromXml(xml: string): void {\n this.#stringToIndex.clear();\n this.#indexToString.length = 0;\n\n const root = parseXml(xml);\n // Each <si> element contains one or more <t> elements (rich text uses multiple <r><t>)\n for (const si of getElementsByTagName(root, 'si')) {\n // Concatenate all <t> text nodes within the <si>\n const tNodes = getElementsByTagName(si, 't');\n const text = tNodes.map(t => t.textContent).join('');\n this.addOrGet(text);\n }\n }\n}\n\nfunction escContent(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n","/**\n * Represents a color for use in Excel styling (fonts, fills, borders).\n * Supports hex, RGB, ARGB, theme, and indexed colors.\n *\n * Port of TVE.PureDocs.Excel.ExcelColor (C#)\n *\n * Key differences from C#:\n * - Constructor is private; use static factory methods\n * - Predefined colors use camelCase (ExcelColor.red vs ExcelColor.Red)\n * - toXmlAttrs() replaces ToOpenXmlColor() — returns plain object for XML serialisation\n */\n\nexport interface ColorXmlAttrs {\n rgb?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n}\n\nexport class ExcelColor {\n /** ARGB hex string e.g. \"FFFF0000\" for opaque red. */\n readonly hex: string | undefined;\n /** Theme color index. */\n readonly theme: number | undefined;\n /** Theme tint (-1.0 to 1.0). */\n readonly tint: number | undefined;\n /** Indexed color value. */\n readonly indexed: number | undefined;\n\n private constructor(opts: {\n hex?: string;\n theme?: number;\n tint?: number;\n indexed?: number;\n }) {\n this.hex = opts.hex;\n this.theme = opts.theme;\n this.tint = opts.tint;\n this.indexed = opts.indexed;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a color from a hex string.\n * Accepts \"#RGB\", \"#RRGGBB\", \"RRGGBB\", or \"AARRGGBB\" formats.\n */\n static fromHex(hex: string): ExcelColor {\n if (!hex) throw new Error('Hex color cannot be empty.');\n\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n // Expand shorthand #RGB → FFRRGGBB\n h = `FF${h[0]}${h[0]}${h[1]}${h[1]}${h[2]}${h[2]}`;\n } else if (h.length === 6) {\n h = `FF${h}`;\n } else if (h.length !== 8) {\n throw new Error(\n `Invalid hex color \"${hex}\". Expected 3, 6, or 8 hex characters (with optional # prefix).`,\n );\n }\n\n const upper = h.toUpperCase();\n if (!/^[0-9A-F]{8}$/.test(upper)) {\n throw new Error(`Invalid hex color \"${hex}\": contains non-hex characters.`);\n }\n\n return new ExcelColor({ hex: upper });\n }\n\n /** Creates a color from RGB values (0–255). Alpha is set to 255 (opaque). */\n static fromRgb(red: number, green: number, blue: number): ExcelColor {\n return new ExcelColor({\n hex: `FF${byteHex(red)}${byteHex(green)}${byteHex(blue)}`,\n });\n }\n\n /** Creates a color from ARGB values (0–255). */\n static fromArgb(alpha: number, red: number, green: number, blue: number): ExcelColor {\n return new ExcelColor({\n hex: `${byteHex(alpha)}${byteHex(red)}${byteHex(green)}${byteHex(blue)}`,\n });\n }\n\n /** Creates a theme color with optional tint value (-1.0 to 1.0). */\n static fromTheme(themeIndex: number, tint = 0): ExcelColor {\n return new ExcelColor({\n theme: themeIndex,\n tint: tint !== 0 ? tint : undefined,\n });\n }\n\n /** Creates an indexed color. */\n static fromIndexed(index: number): ExcelColor {\n return new ExcelColor({ indexed: index });\n }\n\n // ── Predefined colors (camelCase, per TypeScript convention) ─────────────\n\n static readonly black = ExcelColor.fromHex('FF000000');\n static readonly white = ExcelColor.fromHex('FFFFFFFF');\n static readonly red = ExcelColor.fromHex('FFFF0000');\n static readonly green = ExcelColor.fromHex('FF00FF00');\n static readonly blue = ExcelColor.fromHex('FF0000FF');\n static readonly yellow = ExcelColor.fromHex('FFFFFF00');\n static readonly magenta = ExcelColor.fromHex('FFFF00FF');\n static readonly cyan = ExcelColor.fromHex('FF00FFFF');\n static readonly orange = ExcelColor.fromHex('FFFF8C00');\n static readonly purple = ExcelColor.fromHex('FF800080');\n static readonly darkRed = ExcelColor.fromHex('FF8B0000');\n static readonly darkGreen = ExcelColor.fromHex('FF006400');\n static readonly darkBlue = ExcelColor.fromHex('FF00008B');\n static readonly lightGray = ExcelColor.fromHex('FFD3D3D3');\n static readonly darkGray = ExcelColor.fromHex('FFA9A9A9');\n static readonly gray = ExcelColor.fromHex('FF808080');\n static readonly lightBlue = ExcelColor.fromHex('FFADD8E6');\n static readonly lightGreen = ExcelColor.fromHex('FF90EE90');\n static readonly lightYellow = ExcelColor.fromHex('FFFFFFED');\n static readonly lightPink = ExcelColor.fromHex('FFFFB6C1');\n static readonly transparent = ExcelColor.fromArgb(0, 0, 0, 0);\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n /** Returns XML attribute key-value pairs for embedding in OOXML elements. */\n toXmlAttrs(): ColorXmlAttrs {\n if (this.hex !== undefined) return { rgb: this.hex };\n if (this.theme !== undefined) {\n const attrs: ColorXmlAttrs = { theme: this.theme };\n if (this.tint !== undefined) attrs.tint = this.tint;\n return attrs;\n }\n if (this.indexed !== undefined) return { indexed: this.indexed };\n return {};\n }\n\n /** Builds an XML color element string for use inside other elements. */\n toXmlElement(tagName: string): string {\n const attrs = this.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb !== undefined) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n return `<${tagName} ${parts.join(' ')}/>`;\n }\n\n /** Parses a color from OOXML XML attributes. Returns undefined if no color data. */\n static fromXmlAttrs(attrs: Record<string, string | undefined>): ExcelColor | undefined {\n const rgb = attrs['rgb'];\n if (rgb) return ExcelColor.fromHex(rgb);\n\n const themeStr = attrs['theme'];\n if (themeStr !== undefined) {\n const tintStr = attrs['tint'];\n return ExcelColor.fromTheme(parseInt(themeStr, 10), tintStr ? parseFloat(tintStr) : 0);\n }\n\n const indexedStr = attrs['indexed'];\n if (indexedStr !== undefined) return ExcelColor.fromIndexed(parseInt(indexedStr, 10));\n\n return undefined;\n }\n\n toString(): string {\n if (this.hex !== undefined) return `#${this.hex}`;\n if (this.theme !== undefined) return `Theme(${this.theme}${this.tint ? `,${this.tint}` : ''})`;\n if (this.indexed !== undefined) return `Indexed(${this.indexed})`;\n return 'None';\n }\n}\n\nfunction byteHex(n: number): string {\n return Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0').toUpperCase();\n}\n","/**\n * Font configuration for cell styling.\n * Port of TVE.PureDocs.Excel.ExcelFont (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelUnderline {\n None = 'none',\n Single = 'single',\n Double = 'double',\n SingleAccounting = 'singleAccounting',\n DoubleAccounting = 'doubleAccounting',\n}\n\nexport enum ExcelVerticalAlignRun {\n Baseline = 'baseline',\n Superscript = 'superscript',\n Subscript = 'subscript',\n}\n\nexport interface ExcelFontOptions {\n name?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: ExcelUnderline;\n strikethrough?: boolean;\n color?: ExcelColor;\n verticalAlign?: ExcelVerticalAlignRun;\n}\n\nexport class ExcelFont {\n name?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: ExcelUnderline;\n strikethrough?: boolean;\n color?: ExcelColor;\n verticalAlign?: ExcelVerticalAlignRun;\n\n constructor(opts: ExcelFontOptions = {}) {\n Object.assign(this, opts);\n }\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n const parts: string[] = [];\n\n if (this.bold) parts.push('<b/>');\n if (this.italic) parts.push('<i/>');\n if (this.strikethrough) parts.push('<strike/>');\n\n if (this.underline && this.underline !== ExcelUnderline.None) {\n parts.push(`<u val=\"${this.underline}\"/>`);\n }\n\n if (this.verticalAlign && this.verticalAlign !== ExcelVerticalAlignRun.Baseline) {\n parts.push(`<vertAlign val=\"${this.verticalAlign}\"/>`);\n }\n\n parts.push(`<sz val=\"${this.size ?? 11}\"/>`);\n\n if (this.color) {\n parts.push(this.color.toXmlElement('color'));\n } else {\n parts.push('<color theme=\"1\"/>');\n }\n\n parts.push(`<name val=\"${this.name ?? 'Calibri'}\"/>`);\n\n return `<font>${parts.join('')}</font>`;\n }\n\n /** Parses font from parsed XML child elements. */\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; textContent: string }>): ExcelFont {\n const font = new ExcelFont();\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, ''); // strip namespace prefix\n switch (tag) {\n case 'b': font.bold = true; break;\n case 'i': font.italic = true; break;\n case 'strike': font.strikethrough = true; break;\n case 'sz': font.size = parseFloat(el.attributes['val'] ?? '11'); break;\n case 'name': font.name = el.attributes['val']; break;\n case 'u': {\n const val = el.attributes['val'] ?? 'single';\n font.underline = (Object.values(ExcelUnderline) as string[]).includes(val)\n ? (val as ExcelUnderline)\n : ExcelUnderline.Single;\n break;\n }\n case 'vertAlign': {\n const val = el.attributes['val'] ?? 'baseline';\n font.verticalAlign = (Object.values(ExcelVerticalAlignRun) as string[]).includes(val)\n ? (val as ExcelVerticalAlignRun)\n : ExcelVerticalAlignRun.Baseline;\n break;\n }\n case 'color':\n font.color = ExcelColor.fromXmlAttrs(el.attributes);\n break;\n }\n }\n\n return font;\n }\n\n /** Builds a canonical cache key for deduplication in StyleManager. */\n cacheKey(): string {\n return [\n `n:${this.name ?? 'Calibri'}`,\n `s:${this.size ?? 11}`,\n `b:${this.bold ?? false}`,\n `i:${this.italic ?? false}`,\n `u:${this.underline ?? ExcelUnderline.None}`,\n `st:${this.strikethrough ?? false}`,\n `va:${this.verticalAlign ?? ExcelVerticalAlignRun.Baseline}`,\n `c:${this.color?.toString() ?? 'null'}`,\n ].join('|');\n }\n\n clone(): ExcelFont {\n return new ExcelFont({\n name: this.name,\n size: this.size,\n bold: this.bold,\n italic: this.italic,\n underline: this.underline,\n strikethrough: this.strikethrough,\n color: this.color,\n verticalAlign: this.verticalAlign,\n });\n }\n}\n","/**\n * Cell fill (background) configuration.\n * Port of TVE.PureDocs.Excel.ExcelFill (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelPatternType {\n None = 'none',\n Solid = 'solid',\n DarkGray = 'darkGray',\n MediumGray = 'mediumGray',\n LightGray = 'lightGray',\n Gray125 = 'gray125',\n Gray0625 = 'gray0625',\n DarkHorizontal = 'darkHorizontal',\n DarkVertical = 'darkVertical',\n DarkDown = 'darkDown',\n DarkUp = 'darkUp',\n DarkGrid = 'darkGrid',\n DarkTrellis = 'darkTrellis',\n LightHorizontal = 'lightHorizontal',\n LightVertical = 'lightVertical',\n LightDown = 'lightDown',\n LightUp = 'lightUp',\n LightGrid = 'lightGrid',\n LightTrellis = 'lightTrellis',\n}\n\nexport class ExcelFill {\n patternType: ExcelPatternType;\n /** Foreground/pattern color — for solid fills this IS the background color. */\n foregroundColor?: ExcelColor;\n /** Background color for pattern fills. */\n backgroundColor?: ExcelColor;\n\n constructor(\n patternType: ExcelPatternType = ExcelPatternType.None,\n foregroundColor?: ExcelColor,\n backgroundColor?: ExcelColor,\n ) {\n this.patternType = patternType;\n this.foregroundColor = foregroundColor;\n this.backgroundColor = backgroundColor;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a solid fill with the given color.\n * Excel requires the magic indexed(64) background color for solid fills.\n */\n static solid(color: ExcelColor): ExcelFill {\n return new ExcelFill(\n ExcelPatternType.Solid,\n color,\n ExcelColor.fromIndexed(64), // required by Excel spec\n );\n }\n\n /** Creates a pattern fill. */\n static pattern(\n pattern: ExcelPatternType,\n foreground: ExcelColor,\n background?: ExcelColor,\n ): ExcelFill {\n return new ExcelFill(pattern, foreground, background);\n }\n\n /** No fill (default). */\n static readonly none = new ExcelFill(ExcelPatternType.None);\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n let inner = `<patternFill patternType=\"${this.patternType}\">`;\n\n if (this.foregroundColor) {\n const attrs = this.foregroundColor.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n inner += `<fgColor ${parts.join(' ')}/>`;\n }\n\n if (this.backgroundColor) {\n const attrs = this.backgroundColor.toXmlAttrs();\n const parts: string[] = [];\n if (attrs.rgb) parts.push(`rgb=\"${attrs.rgb}\"`);\n if (attrs.theme !== undefined) parts.push(`theme=\"${attrs.theme}\"`);\n if (attrs.tint !== undefined) parts.push(`tint=\"${attrs.tint}\"`);\n if (attrs.indexed !== undefined) parts.push(`indexed=\"${attrs.indexed}\"`);\n inner += `<bgColor ${parts.join(' ')}/>`;\n }\n\n inner += '</patternFill>';\n return `<fill>${inner}</fill>`;\n }\n\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }>): ExcelFill {\n const fill = new ExcelFill();\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, '');\n if (tag === 'patternFill') {\n const pt = el.attributes['patternType'];\n if (pt && (Object.values(ExcelPatternType) as string[]).includes(pt)) {\n fill.patternType = pt as ExcelPatternType;\n }\n\n for (const child of el.children) {\n const ctag = child.tagName.replace(/^.*:/, '');\n const color = ExcelColor.fromXmlAttrs(child.attributes);\n if (ctag === 'fgColor' && color) fill.foregroundColor = color;\n if (ctag === 'bgColor' && color) fill.backgroundColor = color;\n }\n }\n }\n\n return fill;\n }\n\n cacheKey(): string {\n return [\n `p:${this.patternType}`,\n `fg:${this.foregroundColor?.toString() ?? 'null'}`,\n `bg:${this.backgroundColor?.toString() ?? 'null'}`,\n ].join('|');\n }\n}\n","/**\n * Border configuration for cells.\n * Port of TVE.PureDocs.Excel.ExcelBorder and ExcelBorderEdge (C#)\n */\nimport { ExcelColor } from './excel-color.js';\n\nexport enum ExcelBorderStyle {\n None = 'none',\n Thin = 'thin',\n Medium = 'medium',\n Thick = 'thick',\n Dashed = 'dashed',\n Dotted = 'dotted',\n Double = 'double',\n Hair = 'hair',\n MediumDashed = 'mediumDashed',\n DashDot = 'dashDot',\n MediumDashDot = 'mediumDashDot',\n DashDotDot = 'dashDotDot',\n MediumDashDotDot = 'mediumDashDotDot',\n SlantDashDot = 'slantDashDot',\n}\n\nexport class ExcelBorderEdge {\n style: ExcelBorderStyle;\n color?: ExcelColor;\n\n constructor(style: ExcelBorderStyle = ExcelBorderStyle.None, color?: ExcelColor) {\n this.style = style;\n this.color = color;\n }\n\n toXml(tag: string): string {\n if (this.style === ExcelBorderStyle.None) return `<${tag}/>`;\n\n let inner = '';\n if (this.color) inner = this.color.toXmlElement('color');\n\n return `<${tag} style=\"${this.style}\">${inner}</${tag}>`;\n }\n\n static fromXmlElement(el: { attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }): ExcelBorderEdge {\n const styleStr = el.attributes['style'] ?? 'none';\n const style = (Object.values(ExcelBorderStyle) as string[]).includes(styleStr)\n ? (styleStr as ExcelBorderStyle)\n : ExcelBorderStyle.None;\n\n let color: ExcelColor | undefined;\n for (const child of el.children) {\n const tag = child.tagName.replace(/^.*:/, '');\n if (tag === 'color') {\n color = ExcelColor.fromXmlAttrs(child.attributes) ?? undefined;\n }\n }\n\n return new ExcelBorderEdge(style, color);\n }\n\n cacheKey(): string {\n return `${this.style}:${this.color?.toString() ?? 'null'}`;\n }\n\n /** An independent copy. ExcelColor is immutable, so it is shared. */\n clone(): ExcelBorderEdge {\n return new ExcelBorderEdge(this.style, this.color);\n }\n}\n\nexport class ExcelBorder {\n left: ExcelBorderEdge;\n right: ExcelBorderEdge;\n top: ExcelBorderEdge;\n bottom: ExcelBorderEdge;\n diagonal: ExcelBorderEdge;\n diagonalDown: boolean;\n diagonalUp: boolean;\n\n constructor() {\n this.left = new ExcelBorderEdge();\n this.right = new ExcelBorderEdge();\n this.top = new ExcelBorderEdge();\n this.bottom = new ExcelBorderEdge();\n this.diagonal = new ExcelBorderEdge();\n this.diagonalDown = false;\n this.diagonalUp = false;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /** Sets all four sides to the same style and color. */\n static box(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n const edge = new ExcelBorderEdge(style, color);\n b.left = new ExcelBorderEdge(style, color);\n b.right = new ExcelBorderEdge(style, color);\n b.top = new ExcelBorderEdge(style, color);\n b.bottom = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static bottomOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.bottom = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static topOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.top = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static leftOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.left = new ExcelBorderEdge(style, color);\n return b;\n }\n\n static rightOnly(style: ExcelBorderStyle, color?: ExcelColor): ExcelBorder {\n const b = new ExcelBorder();\n b.right = new ExcelBorderEdge(style, color);\n return b;\n }\n\n /**\n * A border with no edges set.\n *\n * A fresh instance per access, not a shared singleton. `ExcelBorder` is mutable\n * (`border.left.style = …` is the normal way to use it), so a shared instance\n * handed to two styles let an edit through one of them reach the other — and,\n * once anything had assigned `none` and then modified it, every later\n * `ExcelBorder.none` came back already carrying that edge.\n */\n static get none(): ExcelBorder {\n return new ExcelBorder();\n }\n\n /**\n * A deep copy: the edges are new objects, so mutating the copy cannot reach the\n * original. {@link CellStyle.clone} relies on this.\n */\n clone(): ExcelBorder {\n const b = new ExcelBorder();\n b.left = this.left.clone();\n b.right = this.right.clone();\n b.top = this.top.clone();\n b.bottom = this.bottom.clone();\n b.diagonal = this.diagonal.clone();\n b.diagonalDown = this.diagonalDown;\n b.diagonalUp = this.diagonalUp;\n return b;\n }\n\n // ── Serialisation ─────────────────────────────────────────────────────────\n\n toXml(): string {\n const dd = this.diagonalDown ? ' diagonalDown=\"1\"' : '';\n const du = this.diagonalUp ? ' diagonalUp=\"1\"' : '';\n return `<border${dd}${du}>${this.left.toXml('left')}${this.right.toXml('right')}${this.top.toXml('top')}${this.bottom.toXml('bottom')}${this.diagonal.toXml('diagonal')}</border>`;\n }\n\n static fromXmlChildren(children: Array<{ tagName: string; attributes: Record<string, string>; children: Array<{ tagName: string; attributes: Record<string, string> }> }>, borderAttrs: Record<string, string>): ExcelBorder {\n const b = new ExcelBorder();\n b.diagonalDown = borderAttrs['diagonalDown'] === '1';\n b.diagonalUp = borderAttrs['diagonalUp'] === '1';\n\n for (const el of children) {\n const tag = el.tagName.replace(/^.*:/, '');\n const edge = ExcelBorderEdge.fromXmlElement(el);\n switch (tag) {\n case 'left': b.left = edge; break;\n case 'right': b.right = edge; break;\n case 'top': b.top = edge; break;\n case 'bottom': b.bottom = edge; break;\n case 'diagonal': b.diagonal = edge; break;\n }\n }\n\n return b;\n }\n\n cacheKey(): string {\n return [\n `l:${this.left.cacheKey()}`,\n `r:${this.right.cacheKey()}`,\n `t:${this.top.cacheKey()}`,\n `b:${this.bottom.cacheKey()}`,\n `d:${this.diagonal.cacheKey()}`,\n `dd:${this.diagonalDown}`,\n `du:${this.diagonalUp}`,\n ].join('|');\n }\n}\n","/**\n * Text alignment configuration for cells.\n * Port of TVE.PureDocs.Excel.ExcelAlignment (C#)\n */\n\nexport enum ExcelHorizontalAlignment {\n General = 'general',\n Left = 'left',\n Center = 'center',\n Right = 'right',\n Fill = 'fill',\n Justify = 'justify',\n CenterContinuous = 'centerContinuous',\n Distributed = 'distributed',\n}\n\nexport enum ExcelVerticalAlignment {\n Top = 'top',\n Center = 'center',\n Bottom = 'bottom',\n Justify = 'justify',\n Distributed = 'distributed',\n}\n\nexport enum ExcelReadingOrder {\n ContextDependent = 0,\n LeftToRight = 1,\n RightToLeft = 2,\n}\n\nexport class ExcelAlignment {\n horizontal?: ExcelHorizontalAlignment;\n vertical?: ExcelVerticalAlignment;\n wrapText?: boolean;\n shrinkToFit?: boolean;\n textRotation?: number;\n indent?: number;\n readingOrder?: ExcelReadingOrder;\n\n toXml(): string {\n const parts: string[] = [];\n if (this.horizontal) parts.push(`horizontal=\"${this.horizontal}\"`);\n if (this.vertical) parts.push(`vertical=\"${this.vertical}\"`);\n if (this.wrapText) parts.push('wrapText=\"1\"');\n if (this.shrinkToFit) parts.push('shrinkToFit=\"1\"');\n if (this.textRotation !== undefined) parts.push(`textRotation=\"${this.textRotation}\"`);\n if (this.indent !== undefined) parts.push(`indent=\"${this.indent}\"`);\n if (this.readingOrder !== undefined) parts.push(`readingOrder=\"${this.readingOrder}\"`);\n\n if (parts.length === 0) return '';\n return `<alignment ${parts.join(' ')}/>`;\n }\n\n static fromXmlAttrs(attrs: Record<string, string>): ExcelAlignment {\n const a = new ExcelAlignment();\n const h = attrs['horizontal'];\n const v = attrs['vertical'];\n\n if (h && (Object.values(ExcelHorizontalAlignment) as string[]).includes(h)) {\n a.horizontal = h as ExcelHorizontalAlignment;\n }\n if (v && (Object.values(ExcelVerticalAlignment) as string[]).includes(v)) {\n a.vertical = v as ExcelVerticalAlignment;\n }\n if (attrs['wrapText'] === '1' || attrs['wrapText'] === 'true') a.wrapText = true;\n if (attrs['shrinkToFit'] === '1' || attrs['shrinkToFit'] === 'true') a.shrinkToFit = true;\n if (attrs['textRotation'] !== undefined) a.textRotation = parseInt(attrs['textRotation']!, 10);\n if (attrs['indent'] !== undefined) a.indent = parseInt(attrs['indent']!, 10);\n if (attrs['readingOrder'] !== undefined) a.readingOrder = parseInt(attrs['readingOrder']!, 10) as ExcelReadingOrder;\n return a;\n }\n\n cacheKey(): string {\n return [\n `h:${this.horizontal ?? ''}`,\n `v:${this.vertical ?? ''}`,\n `w:${this.wrapText ?? false}`,\n `s:${this.shrinkToFit ?? false}`,\n `r:${this.textRotation ?? 0}`,\n `i:${this.indent ?? 0}`,\n `ro:${this.readingOrder ?? 0}`,\n ].join('|');\n }\n}\n","/**\n * Number format for cell display.\n * Port of TVE.PureDocs.Excel.ExcelNumberFormat (C#)\n *\n * Built-in format IDs (per OOXML spec §18.8.30):\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 * 11 = 0.00E+00\n * 14 = mm-dd-yy (date)\n * …\n * 49 = @ (text)\n * Custom formats start at ID 164.\n */\n\nconst BUILT_IN_FORMAT_CODES: Record<number, string> = {\n 0: 'General', 1: '0', 2: '0.00', 3: '#,##0', 4: '#,##0.00',\n 5: '$#,##0_);($#,##0)', 6: '$#,##0_);[Red]($#,##0)',\n 7: '$#,##0.00_);($#,##0.00)', 8: '$#,##0.00_);[Red]($#,##0.00)',\n 9: '0%', 10: '0.00%', 11: '0.00E+00', 12: '# ?/?', 13: '# ??/??',\n 14: 'mm-dd-yy', 15: 'd-mmm-yy', 16: 'd-mmm', 17: 'mmm-yy',\n 18: 'h:mm AM/PM', 19: 'h:mm:ss AM/PM', 20: 'h:mm', 21: 'h:mm:ss',\n 22: 'm/d/yy h:mm',\n 37: '#,##0 ;(#,##0)', 38: '#,##0 ;[Red](#,##0)',\n 39: '#,##0.00;(#,##0.00)', 40: '#,##0.00;[Red](#,##0.00)',\n 45: 'mm:ss', 46: '[h]:mm:ss', 47: 'mmss.0', 48: '##0.0E+0', 49: '@',\n};\n\nconst CODE_TO_BUILT_IN_ID: Map<string, number> = new Map(\n Object.entries(BUILT_IN_FORMAT_CODES).map(([id, code]) => [code, Number(id)]),\n);\n\nexport class ExcelNumberFormat {\n readonly formatCode: string;\n readonly formatId: number;\n\n private constructor(formatCode: string, formatId: number) {\n this.formatCode = formatCode;\n this.formatId = formatId;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /** Creates a number format from a custom format code string. */\n static custom(formatCode: string): ExcelNumberFormat {\n if (!formatCode) throw new Error('Format code cannot be empty.');\n\n // Check if it maps to a built-in format\n const builtInId = CODE_TO_BUILT_IN_ID.get(formatCode);\n if (builtInId !== undefined) {\n return new ExcelNumberFormat(formatCode, builtInId);\n }\n\n // Custom formats get ID assigned by StyleManager (starts at 164)\n return new ExcelNumberFormat(formatCode, 0);\n }\n\n /** Creates from format ID and optional custom formats map. */\n static fromFormatId(\n formatId: number,\n customFormats?: Map<number, string>,\n ): ExcelNumberFormat {\n // Check custom formats first\n if (customFormats && formatId >= 164) {\n const code = customFormats.get(formatId);\n if (code) return new ExcelNumberFormat(code, formatId);\n }\n\n // Built-in\n const code = BUILT_IN_FORMAT_CODES[formatId] ?? 'General';\n return new ExcelNumberFormat(code, formatId);\n }\n\n // ── Predefined formats (camelCase, per TypeScript convention) ─────────────\n\n static readonly general = new ExcelNumberFormat('General', 0);\n static readonly integer = new ExcelNumberFormat('0', 1);\n static readonly decimal2 = new ExcelNumberFormat('0.00', 2);\n static readonly thousandsSeparator = new ExcelNumberFormat('#,##0', 3);\n static readonly thousandsDecimal2 = new ExcelNumberFormat('#,##0.00', 4);\n static readonly percentage = new ExcelNumberFormat('0%', 9);\n static readonly percentageDecimal2 = new ExcelNumberFormat('0.00%', 10);\n static readonly scientific = new ExcelNumberFormat('0.00E+00', 11);\n static readonly fraction = new ExcelNumberFormat('# ?/?', 12);\n static readonly fractionTwoDigits = new ExcelNumberFormat('# ??/??', 13);\n static readonly shortDate = new ExcelNumberFormat('mm-dd-yy', 14);\n static readonly longDate = new ExcelNumberFormat('d-mmm-yy', 15);\n static readonly dayMonth = new ExcelNumberFormat('d-mmm', 16);\n static readonly monthYear = new ExcelNumberFormat('mmm-yy', 17);\n static readonly time12h = new ExcelNumberFormat('h:mm AM/PM', 18);\n static readonly time12hSeconds = new ExcelNumberFormat('h:mm:ss AM/PM', 19);\n static readonly time24h = new ExcelNumberFormat('h:mm', 20);\n static readonly time24hSeconds = new ExcelNumberFormat('h:mm:ss', 21);\n static readonly dateTime = new ExcelNumberFormat('m/d/yy h:mm', 22);\n static readonly accounting = new ExcelNumberFormat('#,##0 ;(#,##0)', 37);\n static readonly accountingRed = new ExcelNumberFormat('#,##0 ;[Red](#,##0)', 38);\n static readonly accountingDecimal2 = new ExcelNumberFormat('#,##0.00;(#,##0.00)', 39);\n static readonly text = new ExcelNumberFormat('@', 49);\n static readonly currency = ExcelNumberFormat.custom('$#,##0.00');\n static readonly currencyNoDecimal = ExcelNumberFormat.custom('$#,##0');\n static readonly isoDate = ExcelNumberFormat.custom('yyyy-mm-dd');\n static readonly isoDateTime = ExcelNumberFormat.custom('yyyy-mm-dd hh:mm:ss');\n static readonly phoneNumber = ExcelNumberFormat.custom('[<=9999999]###-####;(###) ###-####');\n static readonly zipCode = ExcelNumberFormat.custom('00000');\n\n /** Returns true if this format code represents a date/time value. */\n isDateFormat(): boolean {\n const id = this.formatId;\n if ((id >= 14 && id <= 22) || (id >= 45 && id <= 47)) return true;\n\n const lower = this.formatCode.toLowerCase();\n // Check for date patterns — avoid false positive on mm:ss (time only)\n return (\n lower.includes('y') ||\n lower.includes('d') ||\n (lower.includes('m') && !lower.startsWith('mm:') && !lower.startsWith('[')) ||\n (lower.includes('h') && !lower.startsWith('[h]'))\n );\n }\n\n toString(): string {\n return this.formatCode;\n }\n}\n","/**\n * Complete cell style configuration with fluent builder API.\n * Port of TVE.PureDocs.Excel.CellStyle (C#)\n *\n * Key difference from C#: method names are camelCase (setBold vs SetBold).\n */\nimport { ExcelFont, ExcelUnderline, ExcelVerticalAlignRun } from './excel-font.js';\nimport { ExcelFill, ExcelPatternType } from './excel-fill.js';\nimport { ExcelBorder, ExcelBorderStyle, ExcelBorderEdge } from './excel-border.js';\nimport { ExcelAlignment, ExcelHorizontalAlignment, ExcelVerticalAlignment } from './excel-alignment.js';\nimport { ExcelNumberFormat } from './excel-number-format.js';\nimport { ExcelColor } from './excel-color.js';\n\nexport class CellStyle {\n font?: ExcelFont;\n fill?: ExcelFill;\n border?: ExcelBorder;\n alignment?: ExcelAlignment;\n numberFormat?: ExcelNumberFormat;\n isLocked?: boolean;\n isHidden?: boolean;\n\n // ── Font fluent API ────────────────────────────────────────────────────────\n\n setFontName(name: string): this {\n this.#ensureFont().name = name;\n return this;\n }\n\n setFontSize(size: number): this {\n this.#ensureFont().size = size;\n return this;\n }\n\n setBold(bold = true): this {\n this.#ensureFont().bold = bold;\n return this;\n }\n\n setItalic(italic = true): this {\n this.#ensureFont().italic = italic;\n return this;\n }\n\n setUnderline(underline: ExcelUnderline = ExcelUnderline.Single): this {\n this.#ensureFont().underline = underline;\n return this;\n }\n\n setStrikethrough(strikethrough = true): this {\n this.#ensureFont().strikethrough = strikethrough;\n return this;\n }\n\n setFontColor(color: ExcelColor): this;\n setFontColor(hex: string): this;\n setFontColor(colorOrHex: ExcelColor | string): this {\n this.#ensureFont().color =\n typeof colorOrHex === 'string' ? ExcelColor.fromHex(colorOrHex) : colorOrHex;\n return this;\n }\n\n setVerticalAlign(align: ExcelVerticalAlignRun): this {\n this.#ensureFont().verticalAlign = align;\n return this;\n }\n\n // ── Fill fluent API ────────────────────────────────────────────────────────\n\n setBackgroundColor(color: ExcelColor): this;\n setBackgroundColor(hex: string): this;\n setBackgroundColor(colorOrHex: ExcelColor | string): this {\n const color = typeof colorOrHex === 'string' ? ExcelColor.fromHex(colorOrHex) : colorOrHex;\n this.fill = ExcelFill.solid(color);\n return this;\n }\n\n setPatternFill(\n pattern: ExcelPatternType,\n foreground: ExcelColor,\n background?: ExcelColor,\n ): this {\n this.fill = ExcelFill.pattern(pattern, foreground, background);\n return this;\n }\n\n // ── Border fluent API ──────────────────────────────────────────────────────\n\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.border = ExcelBorder.box(style, color);\n return this;\n }\n\n setBorder(border: ExcelBorder): this {\n this.border = border;\n return this;\n }\n\n setLeftBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().left = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setRightBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().right = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setTopBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().top = new ExcelBorderEdge(style, color);\n return this;\n }\n\n setBottomBorder(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#ensureBorder().bottom = new ExcelBorderEdge(style, color);\n return this;\n }\n\n // ── Alignment fluent API ───────────────────────────────────────────────────\n\n setHorizontalAlignment(alignment: ExcelHorizontalAlignment): this {\n this.#ensureAlignment().horizontal = alignment;\n return this;\n }\n\n setVerticalAlignment(alignment: ExcelVerticalAlignment): this {\n this.#ensureAlignment().vertical = alignment;\n return this;\n }\n\n setWrapText(wrap = true): this {\n this.#ensureAlignment().wrapText = wrap;\n return this;\n }\n\n setShrinkToFit(shrink = true): this {\n this.#ensureAlignment().shrinkToFit = shrink;\n return this;\n }\n\n setTextRotation(degrees: number): this {\n this.#ensureAlignment().textRotation = degrees;\n return this;\n }\n\n setIndent(indent: number): this {\n this.#ensureAlignment().indent = indent;\n return this;\n }\n\n // ── Number format fluent API ───────────────────────────────────────────────\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n this.numberFormat =\n typeof formatOrCode === 'string'\n ? ExcelNumberFormat.custom(formatOrCode)\n : formatOrCode;\n return this;\n }\n\n // ── Protection fluent API ──────────────────────────────────────────────────\n\n setLocked(locked = true): this {\n this.isLocked = locked;\n return this;\n }\n\n setFormulaHidden(hidden = true): this {\n this.isHidden = hidden;\n return this;\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n /** Creates a deep copy of this style. */\n clone(): CellStyle {\n const s = new CellStyle();\n if (this.font) s.font = this.font.clone();\n s.fill = this.fill; // ExcelFill is effectively immutable via factory methods\n // Deep-copied: ExcelBorder exposes mutable edges, so sharing it made\n // `style.clone().setAllBorders(...)` rewrite the original's borders too.\n s.border = this.border?.clone();\n s.alignment = this.alignment\n ? Object.assign(new ExcelAlignment(), this.alignment)\n : undefined;\n s.numberFormat = this.numberFormat;\n s.isLocked = this.isLocked;\n s.isHidden = this.isHidden;\n return s;\n }\n\n #ensureFont(): ExcelFont {\n if (!this.font) this.font = new ExcelFont();\n return this.font;\n }\n\n #ensureBorder(): ExcelBorder {\n if (!this.border) this.border = new ExcelBorder();\n return this.border;\n }\n\n #ensureAlignment(): ExcelAlignment {\n if (!this.alignment) this.alignment = new ExcelAlignment();\n return this.alignment;\n }\n}\n","/**\n * OLE Automation Date (OADate) helpers.\n *\n * Excel stores dates as floating-point numbers where:\n * - The integer part = number of days since Dec 30, 1899 (OADate epoch)\n * - The fractional part = time of day (0.5 = noon)\n *\n * Note: Excel has a known bug treating 1900 as a leap year (day 60 = Feb 29 1900),\n * which never existed. This implementation matches Excel's behaviour exactly.\n */\n\n// OADate epoch: Dec 30, 1899 00:00:00 UTC\nconst OA_EPOCH_MS = Date.UTC(1899, 11, 30, 0, 0, 0, 0);\nconst MS_PER_DAY = 86_400_000;\n\n/**\n * Converts a JavaScript Date to an Excel OADate serial number.\n *\n * @example\n * toOADate(new Date(1900, 0, 1)) // 1\n * toOADate(new Date(2025, 0, 1)) // 45658\n */\nexport function toOADate(date: Date): number {\n const utcMs = Date.UTC(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n return (utcMs - OA_EPOCH_MS) / MS_PER_DAY;\n}\n\n/**\n * Converts an Excel OADate serial number to a JavaScript Date.\n *\n * @example\n * fromOADate(1) // Jan 1, 1900\n * fromOADate(45658) // Jan 1, 2025\n */\nexport function fromOADate(oaDate: number): Date {\n const ms = OA_EPOCH_MS + oaDate * MS_PER_DAY;\n const d = new Date(ms);\n // Return local date (strip UTC offset)\n return new Date(\n d.getUTCFullYear(),\n d.getUTCMonth(),\n d.getUTCDate(),\n d.getUTCHours(),\n d.getUTCMinutes(),\n d.getUTCSeconds(),\n d.getUTCMilliseconds(),\n );\n}\n\n/**\n * Built-in date format IDs per OOXML spec (§18.8.30).\n * IDs 14–22 and 45–47 are date/time formats.\n */\nconst DATE_FORMAT_IDS = new Set([14, 15, 16, 17, 18, 19, 20, 21, 22, 45, 46, 47]);\n\n/**\n * Returns true if the given number format ID represents a date/time value.\n */\nexport function isDateFormatId(formatId: number): boolean {\n return DATE_FORMAT_IDS.has(formatId);\n}\n\n/**\n * Returns true if the format code string contains date/time patterns.\n */\nexport function isDateFormatCode(formatCode: string): boolean {\n const lower = formatCode.toLowerCase();\n return (\n lower.includes('y') ||\n lower.includes('d') ||\n (lower.includes('m') && !lower.includes('mm:')) || // m = month unless part of mm:ss\n lower.includes('h') ||\n lower.includes('am') ||\n lower.includes('pm')\n );\n}\n","/**\n * Manages the workbook stylesheet — fonts, fills, borders, number formats, cell formats.\n * Handles deduplication and index management.\n *\n * Port of TVE.PureDocs.Excel.StyleManager (C#)\n *\n * Key differences:\n * - Works with parsed XmlElement trees instead of OpenXml SDK objects\n * - Serialises directly to XML strings\n * - No lazy save — isDirty flag still used, caller must call buildStylesXml()\n */\nimport { CellStyle } from './cell-style.js';\nimport { ExcelFont } from './excel-font.js';\nimport { ExcelFill, ExcelPatternType } from './excel-fill.js';\nimport { ExcelBorder } from './excel-border.js';\nimport { ExcelAlignment } from './excel-alignment.js';\nimport { ExcelNumberFormat } from './excel-number-format.js';\nimport { ExcelColor } from './excel-color.js';\nimport { isDateFormatId, isDateFormatCode } from '../model/oa-date.js';\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\n\ninterface FontEntry { font: ExcelFont; key: string; }\ninterface FillEntry { fill: ExcelFill; key: string; }\ninterface BorderEntry{ border: ExcelBorder; key: string; }\ninterface NumFmtEntry{ code: string; id: number; }\n\ninterface CellFormat {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n applyFont: boolean;\n applyFill: boolean;\n applyBorder: boolean;\n applyNumFmt: boolean;\n alignment?: ExcelAlignment;\n applyAlign: boolean;\n isLocked?: boolean;\n isHidden?: boolean;\n applyProt: boolean;\n}\n\nexport class StyleManager {\n // Index arrays — position = index\n private fonts: FontEntry[] = [];\n private fills: FillEntry[] = [];\n private borders: BorderEntry[] = [];\n private numFmts: NumFmtEntry[] = [];\n private cellXfs: CellFormat[] = [];\n\n // Dedup caches: key → index\n private fontCache: Map<string, number> = new Map();\n private fillCache: Map<string, number> = new Map();\n private borderCache: Map<string, number> = new Map();\n private numFmtCache: Map<string, number> = new Map(); // code → id\n private cellXfCache: Map<string, number> = new Map();\n\n private nextCustomNumFmtId = 164;\n isDirty = false;\n\n /**\n * `numFmtId` → format code for the custom (≥164) formats, materialised once.\n * Rebuilding it per lookup made every numeric cell read O(custom formats),\n * and reading a cell's value has to consult it to tell dates from numbers.\n * Invalidated whenever `numFmts` changes — see {@link #invalidateFormatCaches}.\n */\n #numFmtMapCache?: Map<number, string>;\n /**\n * cellXf index → does its number format render a date? Memoised because\n * {@link Cell.getValue} asks this for every numeric cell, and answering it\n * from scratch reconstructs a whole CellStyle. Entries stay valid because\n * `cellXfs` and `numFmts` are append-only: an existing index never changes\n * meaning.\n */\n #dateStyleMemo = new Map<number, boolean>();\n\n constructor() {\n this.#initDefaults();\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Returns the cellXf index for the given CellStyle.\n * Creates new font/fill/border entries as needed (with deduplication).\n */\n getOrCreateCellFormatIndex(style: CellStyle): number {\n const fontId = style.font ? this.#getOrCreateFont(style.font) : 0;\n const fillId = style.fill ? this.#getOrCreateFill(style.fill) : 0;\n const borderId = style.border ? this.#getOrCreateBorder(style.border): 0;\n const numFmtId = style.numberFormat\n ? this.#getOrCreateNumFmt(style.numberFormat)\n : 0;\n\n const cf: CellFormat = {\n fontId, fillId, borderId, numFmtId,\n applyFont: style.font != null,\n applyFill: style.fill != null,\n applyBorder: style.border != null,\n applyNumFmt: style.numberFormat != null,\n alignment: style.alignment,\n applyAlign: style.alignment != null,\n isLocked: style.isLocked,\n isHidden: style.isHidden,\n applyProt: style.isLocked != null || style.isHidden != null,\n };\n\n const key = this.#cellFormatKey(cf);\n const existing = this.cellXfCache.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.cellXfs.length;\n this.cellXfs.push(cf);\n this.cellXfCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n /**\n * Reconstructs a CellStyle from a cellXf index.\n * Used by Cell.style getter.\n */\n getCellStyle(styleIndex: number): CellStyle {\n const cf = this.cellXfs[styleIndex];\n if (!cf) return new CellStyle();\n\n const s = new CellStyle();\n\n const fontEntry = this.fonts[cf.fontId];\n if (fontEntry && cf.applyFont) s.font = fontEntry.font;\n\n const fillEntry = this.fills[cf.fillId];\n if (fillEntry && cf.applyFill) s.fill = fillEntry.fill;\n\n const borderEntry = this.borders[cf.borderId];\n if (borderEntry && cf.applyBorder) s.border = borderEntry.border;\n\n if (cf.applyNumFmt) {\n s.numberFormat = ExcelNumberFormat.fromFormatId(cf.numFmtId, this.#numFmtMap());\n }\n\n if (cf.alignment && cf.applyAlign) s.alignment = cf.alignment;\n if (cf.applyProt) {\n s.isLocked = cf.isLocked;\n s.isHidden = cf.isHidden;\n }\n\n return s;\n }\n\n /**\n * Whether the cellXf at `styleIndex` formats its value as a date. This is the\n * one style question the value-reading path has to ask, so it is answered\n * without reconstructing a CellStyle: the result is derived from the stored\n * format id/code and memoised per index.\n *\n * Equivalent to `getCellStyle(i).numberFormat` being date-like, by\n * construction — both read the same `applyNumFmt`/`numFmtId` pair through\n * {@link ExcelNumberFormat.fromFormatId}.\n */\n isDateStyle(styleIndex: number): boolean {\n const memo = this.#dateStyleMemo.get(styleIndex);\n if (memo !== undefined) return memo;\n\n const cf = this.cellXfs[styleIndex];\n // An index past the end of cellXfs is not memoised: a later format could be\n // appended there, and a cached \"false\" would then be wrong.\n if (!cf) return false;\n\n let isDate = false;\n if (cf.applyNumFmt) {\n const fmt = ExcelNumberFormat.fromFormatId(cf.numFmtId, this.#numFmtMap());\n isDate = isDateFormatId(fmt.formatId) || isDateFormatCode(fmt.formatCode);\n }\n this.#dateStyleMemo.set(styleIndex, isDate);\n return isDate;\n }\n\n #numFmtMap(): Map<number, string> {\n if (!this.#numFmtMapCache) {\n this.#numFmtMapCache = new Map(this.numFmts.map(n => [n.id, n.code] as [number, string]));\n }\n return this.#numFmtMapCache;\n }\n\n /** Drops the derived format caches after `numFmts` or `cellXfs` changed. */\n #invalidateFormatCaches(): void {\n this.#numFmtMapCache = undefined;\n this.#dateStyleMemo.clear();\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /** Builds the complete xl/styles.xml string. */\n buildStylesXml(): string {\n const numFmtsXml = this.numFmts.length > 0\n ? `<numFmts count=\"${this.numFmts.length}\">${this.numFmts.map(n => `<numFmt numFmtId=\"${n.id}\" formatCode=\"${escAttr(n.code)}\"/>`).join('')}</numFmts>`\n : '';\n\n const fontsXml = `<fonts count=\"${this.fonts.length}\">${this.fonts.map(f => f.font.toXml()).join('')}</fonts>`;\n\n const fillsXml = `<fills count=\"${this.fills.length}\">${this.fills.map(f => f.fill.toXml()).join('')}</fills>`;\n\n const bordersXml = `<borders count=\"${this.borders.length}\">${this.borders.map(b => b.border.toXml()).join('')}</borders>`;\n\n const cellXfsXml = `<cellXfs count=\"${this.cellXfs.length}\">${this.cellXfs.map(cf => this.#cfToXml(cf)).join('')}</cellXfs>`;\n\n this.isDirty = false;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\n${numFmtsXml}${fontsXml}${fillsXml}${bordersXml}\n<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>\n${cellXfsXml}\n</styleSheet>`;\n }\n\n /** Loads an existing styles.xml, rebuilding all caches. */\n loadFromXml(stylesXml: string): void {\n this.fonts = [];\n this.fills = [];\n this.borders = [];\n this.numFmts = [];\n this.cellXfs = [];\n this.fontCache.clear();\n this.fillCache.clear();\n this.borderCache.clear();\n this.numFmtCache.clear();\n this.cellXfCache.clear();\n this.nextCustomNumFmtId = 164;\n this.#invalidateFormatCaches();\n\n const root = parseXml(stylesXml);\n\n // numFmts\n for (const el of getElementsByTagName(root, 'numFmt')) {\n const id = parseInt(getAttr(el, 'numFmtId') ?? '0', 10);\n const code = getAttr(el, 'formatCode') ?? '';\n this.numFmts.push({ id, code });\n this.numFmtCache.set(code, id);\n if (id >= this.nextCustomNumFmtId) this.nextCustomNumFmtId = id + 1;\n }\n\n // fonts\n for (const el of getElementsByTagName(root, 'fonts')) {\n for (const fontEl of el.children) {\n const font = ExcelFont.fromXmlChildren(fontEl.children as Parameters<typeof ExcelFont.fromXmlChildren>[0]);\n const key = font.cacheKey();\n this.fonts.push({ font, key });\n this.fontCache.set(key, this.fonts.length - 1);\n }\n }\n\n // fills\n for (const el of getElementsByTagName(root, 'fills')) {\n for (const fillEl of el.children) {\n const fill = ExcelFill.fromXmlChildren(fillEl.children as Parameters<typeof ExcelFill.fromXmlChildren>[0]);\n const key = fill.cacheKey();\n this.fills.push({ fill, key });\n this.fillCache.set(key, this.fills.length - 1);\n }\n }\n\n // borders\n for (const el of getElementsByTagName(root, 'borders')) {\n for (const borderEl of el.children) {\n const border = ExcelBorder.fromXmlChildren(\n borderEl.children as Parameters<typeof ExcelBorder.fromXmlChildren>[0],\n borderEl.attributes,\n );\n const key = border.cacheKey();\n this.borders.push({ border, key });\n this.borderCache.set(key, this.borders.length - 1);\n }\n }\n\n // cellXfs (main cell formats)\n for (const el of getElementsByTagName(root, 'cellXfs')) {\n for (const xfEl of el.children) {\n const cf: CellFormat = {\n fontId: parseInt(getAttr(xfEl, 'fontId') ?? '0', 10),\n fillId: parseInt(getAttr(xfEl, 'fillId') ?? '0', 10),\n borderId: parseInt(getAttr(xfEl, 'borderId') ?? '0', 10),\n numFmtId: parseInt(getAttr(xfEl, 'numFmtId') ?? '0', 10),\n applyFont: getAttr(xfEl, 'applyFont') === '1',\n applyFill: getAttr(xfEl, 'applyFill') === '1',\n applyBorder: getAttr(xfEl, 'applyBorder') === '1',\n applyNumFmt: getAttr(xfEl, 'applyNumberFormat') === '1',\n applyAlign: getAttr(xfEl, 'applyAlignment') === '1',\n applyProt: getAttr(xfEl, 'applyProtection') === '1',\n };\n\n // alignment child\n const alignEl = xfEl.children.find(c => c.tagName.replace(/^.*:/, '') === 'alignment');\n if (alignEl) cf.alignment = ExcelAlignment.fromXmlAttrs(alignEl.attributes);\n\n const key = this.#cellFormatKey(cf);\n this.cellXfs.push(cf);\n this.cellXfCache.set(key, this.cellXfs.length - 1);\n }\n }\n\n // Ensure defaults exist\n if (this.fonts.length === 0) this.#initDefaults();\n if (this.cellXfs.length === 0) this.#initDefaults();\n\n // The tables were replaced wholesale; nothing derived from the previous ones\n // may survive.\n this.#invalidateFormatCaches();\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n #initDefaults(): void {\n // Default font — Calibri 11pt\n const defaultFont = new ExcelFont({ name: 'Calibri', size: 11 });\n const fontKey = defaultFont.cacheKey();\n this.fonts = [{ font: defaultFont, key: fontKey }];\n this.fontCache.set(fontKey, 0);\n\n // Required fills: none + gray125\n const noneFill = new ExcelFill(ExcelPatternType.None);\n const grayFill = new ExcelFill(ExcelPatternType.Gray125);\n this.fills = [\n { fill: noneFill, key: noneFill.cacheKey() },\n { fill: grayFill, key: grayFill.cacheKey() },\n ];\n this.fillCache.set(noneFill.cacheKey(), 0);\n this.fillCache.set(grayFill.cacheKey(), 1);\n\n // Default border — all empty\n const defaultBorder = new ExcelBorder();\n const borderKey = defaultBorder.cacheKey();\n this.borders = [{ border: defaultBorder, key: borderKey }];\n this.borderCache.set(borderKey, 0);\n\n // Default cell format\n const defaultCf: CellFormat = {\n fontId: 0, fillId: 0, borderId: 0, numFmtId: 0,\n applyFont: false, applyFill: false, applyBorder: false,\n applyNumFmt: false, applyAlign: false, applyProt: false,\n };\n const cfKey = this.#cellFormatKey(defaultCf);\n this.cellXfs = [defaultCf];\n this.cellXfCache.set(cfKey, 0);\n }\n\n #getOrCreateFont(font: ExcelFont): number {\n const key = font.cacheKey();\n const existing = this.fontCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.fonts.length;\n this.fonts.push({ font, key });\n this.fontCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateFill(fill: ExcelFill): number {\n const key = fill.cacheKey();\n const existing = this.fillCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.fills.length;\n this.fills.push({ fill, key });\n this.fillCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateBorder(border: ExcelBorder): number {\n const key = border.cacheKey();\n const existing = this.borderCache.get(key);\n if (existing !== undefined) return existing;\n const idx = this.borders.length;\n this.borders.push({ border, key });\n this.borderCache.set(key, idx);\n this.isDirty = true;\n return idx;\n }\n\n #getOrCreateNumFmt(fmt: ExcelNumberFormat): number {\n // Built-in formats (ID < 164) don't need to be stored\n if (fmt.formatId > 0 && fmt.formatId < 164) return fmt.formatId;\n if (fmt.formatCode === 'General') return 0;\n\n const existing = this.numFmtCache.get(fmt.formatCode);\n if (existing !== undefined) return existing;\n\n const id = this.nextCustomNumFmtId++;\n this.numFmts.push({ id, code: fmt.formatCode });\n this.numFmtCache.set(fmt.formatCode, id);\n this.#invalidateFormatCaches();\n this.isDirty = true;\n return id;\n }\n\n #cellFormatKey(cf: CellFormat): string {\n return [\n cf.fontId, cf.fillId, cf.borderId, cf.numFmtId,\n cf.applyFont, cf.applyFill, cf.applyBorder, cf.applyNumFmt,\n cf.applyAlign, cf.applyProt,\n cf.alignment?.cacheKey() ?? '',\n cf.isLocked ?? '',\n cf.isHidden ?? '',\n ].join('|');\n }\n\n #cfToXml(cf: CellFormat): string {\n const attrs = [\n `numFmtId=\"${cf.numFmtId}\"`,\n `fontId=\"${cf.fontId}\"`,\n `fillId=\"${cf.fillId}\"`,\n `borderId=\"${cf.borderId}\"`,\n `xfId=\"0\"`,\n cf.applyFont ? 'applyFont=\"1\"' : '',\n cf.applyFill ? 'applyFill=\"1\"' : '',\n cf.applyBorder ? 'applyBorder=\"1\"' : '',\n cf.applyNumFmt ? 'applyNumberFormat=\"1\"' : '',\n cf.applyAlign ? 'applyAlignment=\"1\"' : '',\n cf.applyProt ? 'applyProtection=\"1\"' : '',\n ].filter(Boolean).join(' ');\n\n const alignXml = cf.alignment?.toXml() ?? '';\n const protXml = cf.applyProt\n ? `<protection${cf.isLocked !== undefined ? ` locked=\"${cf.isLocked ? '1' : '0'}\"` : ''}${cf.isHidden !== undefined ? ` hidden=\"${cf.isHidden ? '1' : '0'}\"` : ''}/>`\n : '';\n\n const inner = alignXml + protXml;\n return inner ? `<xf ${attrs}>${inner}</xf>` : `<xf ${attrs}/>`;\n }\n}\n\nfunction escAttr(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n","/**\n * Renders a numeric value through an OOXML number-format code.\n *\n * Deliberately a *subset* of the full spec — it covers the codes an editor\n * actually round-trips (integers, fixed decimals, thousands separators,\n * currency, percentages, and positive/negative/zero sections) and returns\n * `null` for anything it does not understand, so callers can fall back to the\n * raw value rather than display something wrong.\n *\n * Not handled (returns null): fractions (`# ?/?`), scientific (`0.00E+00`),\n * date/time codes (see date-format-renderer.ts, which Cell routes Date values\n * to), and conditional sections such as `[<=9999999]###-####`.\n */\n\n/** Splits a format code on unquoted ';' separators. */\nfunction splitSections(code: string): string[] {\n const sections: string[] = [];\n let current = '';\n let inQuote = false;\n\n for (let i = 0; i < code.length; i++) {\n const ch = code[i]!;\n if (ch === '\"') { inQuote = !inQuote; current += ch; continue; }\n if (ch === '\\\\' && i + 1 < code.length) { current += ch + code[++i]!; continue; }\n if (ch === ';' && !inQuote) { sections.push(current); current = ''; continue; }\n current += ch;\n }\n sections.push(current);\n return sections;\n}\n\n/**\n * True when the section contains date/time placeholders. Quoted literals,\n * escapes and bracket contents are removed first, so `0.00\" usd\"` and\n * `[$€-x-euro]#,##0` are correctly seen as pure number formats.\n */\nfunction hasDateTokens(section: string): boolean {\n const bare = section\n .replace(/\"[^\"]*\"/g, '')\n .replace(/\\\\./g, '')\n .replace(/\\[[^\\]]*\\]/g, '');\n return /[ymdhsYMDHS]/.test(bare);\n}\n\n/** True when the section uses constructs this renderer intentionally skips. */\nfunction isUnsupported(section: string): boolean {\n // Conditional/comparison sections: [<=100], [>0]. Colour and locale brackets\n // ([Red], [$-409], [$€-x-euro]) are fine — they are stripped below.\n if (/\\[[<>=]/.test(section)) return true;\n if (/[?]/.test(section)) return true; // fractions\n if (/[Ee][+-]/.test(section)) return true; // scientific\n if (hasDateTokens(section)) return true; // date/time — wrong renderer\n return false;\n}\n\ninterface Parsed {\n literalOnly: boolean;\n prefix: string;\n suffix: string;\n minIntDigits: number;\n decimals: number;\n useGrouping: boolean;\n percentScale: number;\n}\n\n/**\n * Parses one section into literal prefix/suffix plus the numeric pattern.\n * A section with no digit placeholder is literal-only (e.g. the `\"—\"` zero\n * section of `0.00;-0.00;\"—\"`) and renders as just that text.\n */\nfunction parseSection(section: string): Parsed {\n // Strip colour / locale / condition brackets, keeping any currency symbol\n // carried inside a locale bracket (e.g. \"[$€-x-euro]\" → \"€\").\n const stripped = section.replace(/\\[(\\$([^\\]-]*)[^\\]]*|[^\\]]*)\\]/g, (_m, _all, currency) =>\n typeof currency === 'string' ? currency : '',\n );\n\n let prefix = '';\n let suffix = '';\n let pattern = '';\n let seenPattern = false;\n let percentScale = 1;\n\n for (let i = 0; i < stripped.length; i++) {\n const ch = stripped[i]!;\n\n // Quoted literal\n if (ch === '\"') {\n const end = stripped.indexOf('\"', i + 1);\n const literal = stripped.slice(i + 1, end < 0 ? undefined : end);\n if (seenPattern) suffix += literal; else prefix += literal;\n i = end < 0 ? stripped.length : end;\n continue;\n }\n // Escaped character\n if (ch === '\\\\' && i + 1 < stripped.length) {\n const literal = stripped[++i]!;\n if (seenPattern) suffix += literal; else prefix += literal;\n continue;\n }\n // '_x' reserves the width of x; '*x' repeats x as fill. Both are layout\n // hints with no textual output here.\n if (ch === '_' || ch === '*') { i++; continue; }\n\n if (ch === '#' || ch === '0' || ch === '.' || ch === ',') {\n pattern += ch;\n seenPattern = true;\n continue;\n }\n\n if (ch === '%') {\n percentScale *= 100;\n if (seenPattern) suffix += ch; else prefix += ch;\n continue;\n }\n\n if (seenPattern) suffix += ch; else prefix += ch;\n }\n\n const dot = pattern.indexOf('.');\n const intPart = dot < 0 ? pattern : pattern.slice(0, dot);\n const fracPart = dot < 0 ? '' : pattern.slice(dot + 1);\n\n return {\n literalOnly: !seenPattern,\n prefix,\n suffix,\n minIntDigits: (intPart.match(/0/g) ?? []).length,\n decimals: (fracPart.match(/[#0]/g) ?? []).length,\n useGrouping: intPart.includes(','),\n percentScale,\n };\n}\n\nfunction renderNumber(value: number, p: Parsed): string {\n if (p.literalOnly) return p.prefix + p.suffix;\n\n const scaled = value * p.percentScale;\n const fixed = scaled.toFixed(p.decimals);\n\n let [intDigits = '0', fracDigits = ''] = fixed.split('.');\n if (intDigits.length < p.minIntDigits) {\n intDigits = intDigits.padStart(p.minIntDigits, '0');\n }\n if (p.useGrouping) {\n intDigits = intDigits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n }\n\n return p.prefix + intDigits + (fracDigits ? `.${fracDigits}` : '') + p.suffix;\n}\n\n/**\n * Applies `formatCode` to `value`.\n *\n * @returns the formatted string, or `null` when the code is outside the\n * supported subset (caller should fall back to the raw value).\n */\nexport function formatNumberWithCode(value: number, formatCode: string): string | null {\n if (!Number.isFinite(value)) return null;\n if (!formatCode || formatCode === 'General') return null;\n if (formatCode === '@') return String(value);\n\n const sections = splitSections(formatCode);\n // Sections are positive; negative; zero; text — later ones are optional and\n // fall back to the first.\n const negative = sections[1];\n const zero = sections[2];\n\n let section: string | undefined;\n let magnitude = value;\n\n if (value === 0 && zero !== undefined) {\n section = zero;\n } else if (value < 0 && negative !== undefined) {\n // A dedicated negative section supplies its own sign convention (a literal\n // '-', or parentheses), so the value is rendered unsigned.\n section = negative;\n magnitude = Math.abs(value);\n } else {\n section = sections[0];\n }\n\n if (section === undefined || isUnsupported(section)) return null;\n\n return renderNumber(magnitude, parseSection(section));\n}\n","/**\n * Renders a Date through an OOXML date/time format code.\n *\n * Deliberately a *subset* of the full spec, mirroring the philosophy of\n * number-format-renderer: it covers the codes an editor actually round-trips\n * (`yyyy`, `yy`, `m`→`mmmm`, `d`→`dddd`, `h`/`hh`, `s`/`ss`, `AM/PM`, quoted\n * literals, separators) and returns `null` for anything it does not\n * understand — elapsed-time brackets (`[h]`), fractional seconds (`ss.00`),\n * era codes — so callers can fall back rather than display something wrong.\n *\n * The `m` month-vs-minute ambiguity uses the standard OOXML rule: `m`/`mm`\n * means minutes when the previous time token is hours or the next one is\n * seconds; otherwise it means month.\n */\n\nconst MONTHS = ['January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'];\nconst DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\ninterface Token {\n /** 'y' | 'm' | 'd' | 'h' | 's' | 'ampm' | 'literal' */\n kind: string;\n /** Repeat count for date tokens, or the literal text. */\n text: string;\n}\n\n/** Splits the first unquoted ';' section off a format code. */\nfunction firstSection(code: string): string {\n let inQuote = false;\n for (let i = 0; i < code.length; i++) {\n const ch = code[i]!;\n if (ch === '\"') inQuote = !inQuote;\n else if (ch === ';' && !inQuote) return code.slice(0, i);\n }\n return code;\n}\n\n/** Tokenises a date format section. Returns null on unsupported constructs. */\nfunction tokenize(section: string): Token[] | null {\n const tokens: Token[] = [];\n let i = 0;\n const n = section.length;\n\n while (i < n) {\n const ch = section[i]!;\n\n if (ch === '\"') {\n let j = i + 1;\n let text = '';\n while (j < n && section[j] !== '\"') text += section[j++]!;\n tokens.push({ kind: 'literal', text });\n i = j + 1;\n continue;\n }\n if (ch === '\\\\') {\n tokens.push({ kind: 'literal', text: section[i + 1] ?? '' });\n i += 2;\n continue;\n }\n if (ch === '[') {\n const close = section.indexOf(']', i);\n if (close === -1) return null;\n const inner = section.slice(i + 1, close);\n // Colour and locale brackets are stripped; elapsed-time brackets\n // ([h], [mm], [ss]) are a different semantic — unsupported.\n if (/^[hmsHMS]+$/.test(inner)) return null;\n i = close + 1;\n continue;\n }\n\n const rest = section.slice(i);\n const ampm = /^(AM\\/PM|A\\/P|am\\/pm|a\\/p)/.exec(rest);\n if (ampm) {\n tokens.push({ kind: 'ampm', text: ampm[1]! });\n i += ampm[1]!.length;\n continue;\n }\n\n const lower = ch.toLowerCase();\n if ('ymdhs'.includes(lower)) {\n let j = i;\n while (j < n && section[j]!.toLowerCase() === lower) j++;\n tokens.push({ kind: lower, text: section.slice(i, j) });\n i = j;\n // Fractional seconds (`ss.0`) are unsupported.\n if (lower === 's' && section[i] === '.' && /\\d|0/.test(section[i + 1] ?? '')) return null;\n continue;\n }\n\n // Era/other format letters we do not understand.\n if (/[a-zA-Z]/.test(ch)) return null;\n\n tokens.push({ kind: 'literal', text: ch });\n i++;\n }\n\n return tokens;\n}\n\n/** Resolves each 'm' token to month or minutes using its h/s neighbours. */\nfunction resolveMonthVsMinute(tokens: Token[]): void {\n const dateKinds = new Set(['y', 'm', 'd', 'h', 's']);\n for (let t = 0; t < tokens.length; t++) {\n const token = tokens[t]!;\n if (token.kind !== 'm' || token.text.length > 2) continue;\n\n let prev: Token | undefined;\n for (let p = t - 1; p >= 0; p--) {\n if (dateKinds.has(tokens[p]!.kind)) { prev = tokens[p]; break; }\n }\n let next: Token | undefined;\n for (let q = t + 1; q < tokens.length; q++) {\n if (dateKinds.has(tokens[q]!.kind)) { next = tokens[q]; break; }\n }\n if (prev?.kind === 'h' || next?.kind === 's') token.kind = 'minute';\n }\n}\n\nconst pad = (v: number, len: number): string => String(v).padStart(len, '0');\n\n/**\n * Formats a Date with an OOXML date/time format code, e.g. a value of\n * 2025-01-31 under `dd/mm/yyyy` renders as `31/01/2025`.\n *\n * Returns `null` when the code uses constructs outside the supported subset\n * (elapsed time `[h]`, fractional seconds, era codes) — callers should fall\n * back to a locale default rather than render something misleading.\n */\nexport function formatDateCode(date: Date, formatCode: string): string | null {\n if (!formatCode || formatCode === 'General') return null;\n\n const tokens = tokenize(firstSection(formatCode));\n if (!tokens) return null;\n if (!tokens.some(t => 'ymdhs'.includes(t.kind))) return null; // nothing date-like\n resolveMonthVsMinute(tokens);\n\n const twelveHour = tokens.some(t => t.kind === 'ampm');\n const hours24 = date.getHours();\n const hours12 = hours24 % 12 === 0 ? 12 : hours24 % 12;\n\n let out = '';\n for (const t of tokens) {\n switch (t.kind) {\n case 'literal': out += t.text; break;\n case 'y':\n out += t.text.length <= 2 ? pad(date.getFullYear() % 100, 2) : String(date.getFullYear());\n break;\n case 'm': {\n const month = date.getMonth(); // 0-based\n if (t.text.length === 1) out += String(month + 1);\n else if (t.text.length === 2) out += pad(month + 1, 2);\n else if (t.text.length === 3) out += MONTHS[month]!.slice(0, 3);\n else if (t.text.length === 5) out += MONTHS[month]![0]!;\n else out += MONTHS[month]!;\n break;\n }\n case 'minute':\n out += t.text.length === 1 ? String(date.getMinutes()) : pad(date.getMinutes(), 2);\n break;\n case 'd': {\n const day = date.getDate();\n if (t.text.length === 1) out += String(day);\n else if (t.text.length === 2) out += pad(day, 2);\n else if (t.text.length === 3) out += DAYS[date.getDay()]!.slice(0, 3);\n else out += DAYS[date.getDay()]!;\n break;\n }\n case 'h': {\n const h = twelveHour ? hours12 : hours24;\n out += t.text.length === 1 ? String(h) : pad(h, 2);\n break;\n }\n case 's':\n out += t.text.length === 1 ? String(date.getSeconds()) : pad(date.getSeconds(), 2);\n break;\n case 'ampm': {\n const isAm = hours24 < 12;\n if (t.text === 'a/p') out += isAm ? 'a' : 'p';\n else if (t.text === 'A/P') out += isAm ? 'A' : 'P';\n else if (t.text === 'am/pm') out += isAm ? 'am' : 'pm';\n else out += isAm ? 'AM' : 'PM';\n break;\n }\n }\n }\n return out;\n}\n","/**\n * Utility for converting between cell references (e.g. \"A1\") and\n * 1-based row/column indices.\n *\n * Port of TVE.PureDocs.Excel.CellReference (C#)\n */\n\n/** Largest 1-based row index a worksheet can have (Excel limit). */\nexport const EXCEL_MAX_ROWS = 1048576;\n/** Largest 1-based column index a worksheet can have (column XFD). */\nexport const EXCEL_MAX_COLUMNS = 16384;\n\nexport interface ParsedCellRef {\n readonly row: number;\n readonly column: number;\n}\n\n/** True when a reference contains a `$` or a lower-case letter. */\nfunction needsNormalizing(ref: string): boolean {\n for (let i = 0; i < ref.length; i++) {\n const code = ref.charCodeAt(i);\n if (code === 36 /* $ */ || (code >= 97 && code <= 122)) return true;\n }\n return false;\n}\n\n/**\n * Parses a cell reference string into 1-based row and column indices.\n *\n * @example\n * parseCellRef(\"A1\") // { row: 1, column: 1 }\n * parseCellRef(\"B10\") // { row: 10, column: 2 }\n * parseCellRef(\"AA1\") // { row: 1, column: 27 }\n * parseCellRef(\"$B$2\") // { row: 2, column: 2 } — $ stripped\n */\nexport function parseCellRef(cellReference: string): ParsedCellRef {\n if (!cellReference) {\n throw new Error('Cell reference cannot be null or empty.');\n }\n\n // Strip absolute markers and upper-case — but only when needed. References\n // held in the model are already canonical, and this is the most-called\n // function in the package, so the two string copies are worth avoiding.\n const ref = needsNormalizing(cellReference)\n ? cellReference.replace(/\\$/g, '').toUpperCase()\n : cellReference;\n\n let i = 0;\n let column = 0;\n\n // Parse column letters\n while (i < ref.length && ref.charCodeAt(i) >= 65 && ref.charCodeAt(i) <= 90) {\n column = column * 26 + (ref.charCodeAt(i) - 64); // 'A' = 65, so A-64 = 1\n i++;\n }\n\n if (column === 0) {\n throw new Error(`Invalid cell reference: \"${cellReference}\" — no column letters found.`);\n }\n\n // Parse row digits\n const rowStr = ref.slice(i);\n const row = parseInt(rowStr, 10);\n\n if (isNaN(row) || row < 1 || rowStr === '') {\n throw new Error(`Invalid cell reference: \"${cellReference}\" — no valid row number found.`);\n }\n\n return { row, column };\n}\n\n/**\n * Converts 1-based row and column indices to a cell reference string.\n *\n * @example\n * cellRefFromRowCol(1, 1) // \"A1\"\n * cellRefFromRowCol(10, 2) // \"B10\"\n * cellRefFromRowCol(1, 27) // \"AA1\"\n */\nexport function cellRefFromRowCol(row: number, column: number): string {\n if (row < 1) throw new RangeError(`Row must be >= 1, got ${row}.`);\n if (column < 1) throw new RangeError(`Column must be >= 1, got ${column}.`);\n\n return `${columnLetter(column)}${row}`;\n}\n\n/**\n * Converts a 1-based column index to its letter representation.\n *\n * @example\n * columnLetter(1) // \"A\"\n * columnLetter(26) // \"Z\"\n * columnLetter(27) // \"AA\"\n */\nexport function columnLetter(column: number): string {\n if (column < 1) throw new RangeError(`Column must be >= 1, got ${column}.`);\n\n let result = '';\n let col = column;\n\n while (col > 0) {\n const remainder = (col - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n col = Math.floor((col - remainder) / 26);\n }\n\n return result;\n}\n\n/**\n * Converts a column letter string to a 1-based column number.\n *\n * @example\n * columnNumber(\"A\") // 1\n * columnNumber(\"Z\") // 26\n * columnNumber(\"AA\") // 27\n */\nexport function columnNumber(letters: string): number {\n if (!letters) throw new Error('Column letter cannot be empty.');\n\n const upper = letters.toUpperCase();\n let col = 0;\n\n for (let i = 0; i < upper.length; i++) {\n const code = upper.charCodeAt(i);\n if (code < 65 || code > 90) {\n throw new Error(`Invalid column letter: \"${letters}\".`);\n }\n col = col * 26 + (code - 64);\n }\n\n return col;\n}\n\n/**\n * Formats start/end coordinates as a range reference string. Collapses to a\n * single cell reference when start and end are the same cell.\n *\n * @example\n * formatRangeRef(1, 1, 10, 2) // \"A1:B10\"\n * formatRangeRef(1, 1, 1, 1) // \"A1\"\n */\nexport function formatRangeRef(\n startRow: number,\n startColumn: number,\n endRow: number,\n endColumn: number,\n): string {\n const start = cellRefFromRowCol(startRow, startColumn);\n if (startRow === endRow && startColumn === endColumn) return start;\n return `${start}:${cellRefFromRowCol(endRow, endColumn)}`;\n}\n\n/**\n * Parses a range reference string like \"A1:B10\" into start/end coordinates.\n */\nexport function parseRangeRef(rangeReference: string): {\n startRow: number;\n startColumn: number;\n endRow: number;\n endColumn: number;\n} {\n const parts = rangeReference.split(':');\n if (parts.length !== 2) {\n throw new Error(`Invalid range reference: \"${rangeReference}\" — expected \"A1:B10\" format.`);\n }\n\n const start = parseCellRef(parts[0]!);\n const end = parseCellRef(parts[1]!);\n\n if (start.row > end.row || start.column > end.column) {\n throw new Error(\n `Invalid range reference: \"${rangeReference}\" — start must be top-left of end.`,\n );\n }\n\n return {\n startRow: start.row,\n startColumn: start.column,\n endRow: end.row,\n endColumn: end.column,\n };\n}\n","/**\n * Represents a single cell in a worksheet.\n * Port of TVE.PureDocs.Excel.Cell (C#)\n *\n * Key differences from C#:\n * - All method names are camelCase\n * - No OpenXml SDK dependency — works with plain XML strings\n * - DateTime uses JavaScript Date\n */\nimport { SharedStringManager } from './shared-string-manager.js';\nimport { StyleManager } from '../style/style-manager.js';\nimport { CellStyle } from '../style/cell-style.js';\nimport { ExcelColor } from '../style/excel-color.js';\nimport { ExcelBorderStyle } from '../style/excel-border.js';\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\nimport { formatNumberWithCode } from '../style/number-format-renderer.js';\nimport { formatDateCode } from '../style/date-format-renderer.js';\nimport { parseCellRef } from './cell-reference.js';\nimport { toOADate, fromOADate } from './oa-date.js';\n\n/** Possible raw types stored in a cell. */\nexport type CellValue = string | number | boolean | Date | null;\n\n/** Internal cell data representation (mirrors what OOXML stores). */\nexport interface CellData {\n reference: string; // e.g. \"A1\"\n /** 's' = sharedString, 'n' = number, 'b' = boolean, 'str' = inlineStr */\n dataType?: 's' | 'n' | 'b' | 'str';\n rawValue?: string; // raw text from <v>\n formula?: string; // formula text (without leading =)\n /** Spill range for a dynamic-array formula anchor, e.g. \"A1:A3\". */\n arrayRef?: string;\n styleIndex: number; // index into cellXfs\n /**\n * Shared-formula group id (`<f t=\"shared\" si=\"…\">`) as read from the file.\n *\n * Only meaningful while a sheet is loading, where it links the cells of one\n * fill-down to the single copy of the formula text Excel stored. Once the group\n * is resolved every cell carries its own `formula`, and this is not written\n * back out — see {@link Worksheet.loadFromXml}.\n */\n sharedIndex?: number;\n}\n\n/**\n * Reads the typed value out of a {@link CellData} record.\n *\n * This is the body of {@link Cell.getValue}, lifted out of the class so the\n * read-only paths (`Worksheet.getCellValue`, range reads during recalculation)\n * can use it without allocating a Cell wrapper per access. A full recalculation\n * of a real workbook reads tens of millions of cells; one wrapper each was\n * enough garbage to push the run into GC thrash.\n *\n * @internal\n */\nexport function readCellValue(\n data: CellData,\n sharedStrings: SharedStringManager,\n styles: StyleManager,\n): CellValue {\n const raw = data.rawValue;\n if (raw === undefined || raw === '') return null;\n\n switch (data.dataType) {\n case 's': {\n const idx = parseInt(raw, 10);\n return sharedStrings.tryGetString(idx) ?? raw;\n }\n case 'b':\n return raw === '1';\n case 'str':\n return raw;\n default: {\n // Number or untyped — try to parse as a number\n const num = parseFloat(raw);\n if (isNaN(num)) return raw;\n\n // Check if this cell has a date format\n if (styles.isDateStyle(data.styleIndex)) {\n try { return fromOADate(num); } catch { return num; }\n }\n return num;\n }\n }\n}\n\n/**\n * Serialises one {@link CellData} record to its `<c>` element.\n *\n * Lifted out of {@link Cell.toXml} for the same reason as {@link readCellValue}:\n * saving walks every populated cell, and wrapping each one in a Cell just to ask\n * for its XML allocated an object per cell of the workbook.\n *\n * @internal\n */\nexport function buildCellXml(data: CellData): string {\n const style = data.styleIndex > 0 ? ` s=\"${data.styleIndex}\"` : '';\n\n const formulaXml = data.formula\n ? (data.arrayRef\n ? `<f t=\"array\" ref=\"${data.arrayRef}\" aca=\"1\" ca=\"1\">${escXml(data.formula)}</f>`\n : `<f>${escXml(data.formula)}</f>`)\n : '';\n\n const valueXml =\n data.rawValue !== undefined && data.rawValue !== ''\n ? `<v>${escXml(data.rawValue)}</v>`\n : '';\n\n // Chỉ ghi thuộc tính type khi ô thực sự có value/formula tương ứng.\n const type = data.dataType && (formulaXml || valueXml) ? ` t=\"${data.dataType}\"` : '';\n\n if (!formulaXml && !valueXml && data.styleIndex === 0) return '';\n\n return `<c r=\"${data.reference}\"${style}${type}>${formulaXml}${valueXml}</c>`;\n}\n\n/**\n * A mutation counter shared by a worksheet and the {@link Cell} views it hands\n * out. A Cell writes straight into the sheet's stored {@link CellData}, so the\n * sheet cannot otherwise tell that it changed — and both the used-range memo and\n * the saved-XML reuse depend on knowing.\n *\n * @internal\n */\nexport interface SheetVersion { v: number }\n\nexport class Cell {\n readonly #data: CellData;\n readonly #sharedStrings: SharedStringManager;\n readonly #styles: StyleManager;\n readonly #version?: SheetVersion;\n\n /** @internal */\n constructor(\n data: CellData,\n sharedStrings: SharedStringManager,\n styles: StyleManager,\n version?: SheetVersion,\n ) {\n this.#data = data;\n this.#sharedStrings = sharedStrings;\n this.#styles = styles;\n this.#version = version;\n }\n\n /** Records that this cell's stored data changed. */\n #touch(): void {\n if (this.#version) this.#version.v++;\n }\n\n // ── Identity ───────────────────────────────────────────────────────────────\n\n /** Cell reference string e.g. \"A1\". */\n get reference(): string { return this.#data.reference; }\n\n /** 1-based row index. */\n get row(): number { return parseCellRef(this.#data.reference).row; }\n\n /** 1-based column index. */\n get column(): number { return parseCellRef(this.#data.reference).column; }\n\n // ── Value API ──────────────────────────────────────────────────────────────\n\n /** Sets a string value. */\n setValue(value: string): this;\n /** Sets a numeric value. */\n setValue(value: number): this;\n /** Sets a boolean value. */\n setValue(value: boolean): this;\n /** Sets a Date value (stored as OADate number). */\n setValue(value: Date): this;\n /** Clears the cell value (sets to null). */\n setValue(value: null): this;\n setValue(value: CellValue): this {\n this.#touch();\n this.#data.formula = undefined;\n\n if (value === null || value === undefined) {\n this.#data.dataType = undefined;\n this.#data.rawValue = undefined;\n return this;\n }\n\n if (typeof value === 'string') {\n const idx = this.#sharedStrings.addOrGet(value);\n this.#data.dataType = 's';\n this.#data.rawValue = String(idx);\n return this;\n }\n\n if (typeof value === 'boolean') {\n this.#data.dataType = 'b';\n this.#data.rawValue = value ? '1' : '0';\n return this;\n }\n\n if (value instanceof Date) {\n this.#data.dataType = 'n';\n this.#data.rawValue = String(toOADate(value));\n // Apply short date format if no format already set\n if (this.#data.styleIndex === 0) {\n const style = new CellStyle();\n style.setNumberFormat(ExcelNumberFormat.shortDate);\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(style);\n }\n return this;\n }\n\n // number\n this.#data.dataType = 'n';\n this.#data.rawValue = String(value);\n return this;\n }\n\n /**\n * Gets the typed cell value.\n * Returns string | number | boolean | Date | null.\n * Date detection is based on the cell's number format.\n */\n getValue(): CellValue {\n return readCellValue(this.#data, this.#sharedStrings, this.#styles);\n }\n\n /**\n * Returns the display text of the cell value (always a string).\n *\n * Numbers are returned unformatted; use {@link getFormattedText} to apply the\n * cell's number format.\n */\n getText(): string {\n const val = this.getValue();\n if (val === null) return '';\n if (val instanceof Date) return val.toLocaleDateString();\n return String(val);\n }\n\n /**\n * Returns the display text with the cell's number format applied, e.g. a\n * value of 4.5 under `$#,##0.00` renders as `$4.50`, and a date under\n * `dd/mm/yyyy` as `31/01/2025`.\n *\n * Falls back to {@link getText} for values with no format and for format\n * codes outside the supported subset (fractions, scientific notation,\n * conditional sections, elapsed time) — so the result is never a misleading\n * rendering.\n */\n getFormattedText(): string {\n const val = this.getValue();\n if (typeof val !== 'number' && !(val instanceof Date)) return this.getText();\n\n const format = this.#styles.getCellStyle(this.#data.styleIndex).numberFormat;\n if (!format) return this.getText();\n\n return val instanceof Date\n ? formatDateCode(val, format.formatCode) ?? this.getText()\n : formatNumberWithCode(val, format.formatCode) ?? this.getText();\n }\n\n // ── Formula API ────────────────────────────────────────────────────────────\n\n /**\n * Sets a formula. The leading '=' is optional.\n * Clears any cached value.\n */\n setFormula(formula: string): this {\n if (!formula) throw new Error('Formula cannot be empty.');\n this.#touch();\n this.#data.formula = formula.startsWith('=') ? formula.slice(1) : formula;\n this.#data.rawValue = undefined; // cached value cleared; will be set after recalc\n this.#data.dataType = undefined;\n this.#data.arrayRef = undefined; // scalar unless marked as a dynamic array\n return this;\n }\n\n /**\n * Marks (or unmarks) this cell as a dynamic-array formula anchor. `spillRef`\n * is the block the array spills over (e.g. \"A1:C2\"); pass null to revert to a\n * plain scalar formula. Serialises as `<f t=\"array\" ref=\"…\">`.\n */\n setArrayRef(spillRef: string | null): this {\n this.#touch();\n this.#data.arrayRef = spillRef ?? undefined;\n return this;\n }\n\n /** The dynamic-array spill range, or null if this is not an array anchor. */\n getArrayRef(): string | null {\n return this.#data.arrayRef ?? null;\n }\n\n /**\n * Sets the cached/computed result of this cell WITHOUT touching its formula.\n *\n * This is what a recalculation engine calls after evaluating the formula: it\n * stores the value that XLSX serialises into `<v>` alongside the `<f>`. Unlike\n * setValue(), it does NOT clear the formula, and strings are stored inline\n * (t=\"str\") the way Excel stores calculated string results — they are not\n * added to the shared-string table.\n */\n setComputedValue(value: CellValue): this {\n this.#touch();\n if (value === null || value === undefined) {\n this.#data.dataType = undefined;\n this.#data.rawValue = undefined;\n return this;\n }\n if (typeof value === 'string') {\n this.#data.dataType = 'str';\n this.#data.rawValue = value;\n return this;\n }\n if (typeof value === 'boolean') {\n this.#data.dataType = 'b';\n this.#data.rawValue = value ? '1' : '0';\n return this;\n }\n if (value instanceof Date) {\n this.#data.dataType = 'n';\n this.#data.rawValue = String(toOADate(value));\n return this;\n }\n // number\n this.#data.dataType = 'n';\n this.#data.rawValue = String(value);\n return this;\n }\n\n /** Returns the formula text (without leading '='), or null if no formula. */\n getFormula(): string | null {\n return this.#data.formula ?? null;\n }\n\n /** True if this cell contains a formula. */\n get hasFormula(): boolean {\n return this.#data.formula !== undefined && this.#data.formula !== '';\n }\n\n // ── Style API ──────────────────────────────────────────────────────────────\n\n /** Gets the current CellStyle. Returns a new CellStyle if no style is set. */\n get style(): CellStyle {\n return this.#styles.getCellStyle(this.#data.styleIndex);\n }\n\n /** Replaces the entire cell style. */\n set style(value: CellStyle) {\n this.#touch();\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(value);\n }\n\n /**\n * Applies style changes via a callback on the current style.\n * Returns this for chaining.\n *\n * @example\n * cell.applyStyle(s => s.setBold(true).setFontColor(ExcelColor.red))\n */\n applyStyle(action: (style: CellStyle) => void): this {\n this.#touch();\n const s = this.#styles.getCellStyle(this.#data.styleIndex).clone();\n action(s);\n this.#data.styleIndex = this.#styles.getOrCreateCellFormatIndex(s);\n return this;\n }\n\n // Convenience style shortcuts (mirror Cell.cs methods)\n\n setBold(bold = true): this { return this.applyStyle(s => s.setBold(bold)); }\n setItalic(italic = true): this { return this.applyStyle(s => s.setItalic(italic)); }\n setFontSize(size: number): this { return this.applyStyle(s => s.setFontSize(size)); }\n setFontColor(color: ExcelColor | string): this { return this.applyStyle(s => s.setFontColor(color as ExcelColor)); }\n setFontName(name: string): this { return this.applyStyle(s => s.setFontName(name)); }\n setBackgroundColor(color: ExcelColor | string): this{ return this.applyStyle(s => s.setBackgroundColor(color as ExcelColor)); }\n setWrapText(wrap = true): this { return this.applyStyle(s => s.setWrapText(wrap)); }\n setHorizontalAlignment(a: ExcelHorizontalAlignment): this { return this.applyStyle(s => s.setHorizontalAlignment(a)); }\n setVerticalAlignment(a: ExcelVerticalAlignment): this { return this.applyStyle(s => s.setVerticalAlignment(a)); }\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this { return this.applyStyle(s => s.setAllBorders(style, color)); }\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n return this.applyStyle(s => s.setNumberFormat(formatOrCode as ExcelNumberFormat));\n }\n\n // ── Clear ──────────────────────────────────────────────────────────────────\n\n /** Clears the cell value and formula, preserving style. */\n clear(): void {\n this.#touch();\n this.#data.rawValue = undefined;\n this.#data.dataType = undefined;\n this.#data.formula = undefined;\n this.#data.arrayRef = undefined;\n }\n\n /** Clears the cell value, formula, AND style. */\n clearAll(): void {\n this.#touch();\n this.clear();\n this.#data.styleIndex = 0;\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /** @internal Builds the <c> XML element string for this cell. */\n toXml(): string {\n return buildCellXml(this.#data);\n }\n\n\n /** @internal Parses a <c> XML element into CellData. */\n static fromXmlElement(\n el: {\n attributes: Record<string, string>;\n children: Array<{ tagName: string; textContent: string; attributes?: Record<string, string> }>;\n },\n ref: string,\n ): CellData {\n const dataType = (el.attributes['t'] ?? undefined) as CellData['dataType'];\n const styleIndex = parseInt(el.attributes['s'] ?? '0', 10);\n\n let rawValue: string | undefined;\n let formula: string | undefined;\n let arrayRef: string | undefined;\n let sharedIndex: number | undefined;\n\n for (const child of el.children) {\n const tag = child.tagName.replace(/^.*:/, '');\n if (tag === 'v') rawValue = child.textContent;\n if (tag === 'f') {\n formula = child.textContent;\n const attrs = child.attributes;\n const type = attrs?.['t'];\n // Dynamic-array formula anchor: <f t=\"array\" ref=\"A1:C2\">\n if (type === 'array' && attrs?.['ref']) {\n arrayRef = attrs['ref'];\n }\n // Shared formula: the group's master carries the text, its instances\n // carry only `si` and are resolved by the loader.\n if (type === 'shared' && attrs?.['si'] !== undefined) {\n const si = parseInt(attrs['si'], 10);\n if (!Number.isNaN(si)) sharedIndex = si;\n }\n }\n }\n\n // An empty `<f/>` means \"no formula of my own\", not \"the empty formula\".\n if (formula === '') formula = undefined;\n\n return { reference: ref, dataType, rawValue, formula, arrayRef, styleIndex, sharedIndex };\n }\n\n}\n\nfunction escXml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n","/**\n * Index/span arithmetic for structural edits (inserting or deleting rows and\n * columns). These are the primitives everything else builds on: cell refs,\n * merge ranges, autofilter/validation ranges and formula references all shift\n * through the same two rules, so they live in one place.\n *\n * Semantics follow Excel:\n * - Insert at `at`: every index >= `at` moves by +count. A span whose start\n * is above the boundary and whose end is at/below it therefore expands.\n * - Delete band [at, at+count-1]: indices before the band are unchanged,\n * indices inside it are gone, indices after it move by -count. A span\n * overlapping the band is clamped; a span entirely inside it is dead.\n */\nimport { parseCellRef, cellRefFromRowCol } from './cell-reference.js';\n\n/** Describes one structural edit on a sheet. */\nexport interface RefShift {\n readonly dim: 'row' | 'col';\n readonly kind: 'insert' | 'delete';\n /** 1-based index of the first inserted/deleted row or column. */\n readonly at: number;\n /** Number of rows/columns inserted or deleted (>= 1). */\n readonly count: number;\n /** Name of the sheet the structural edit happened on. */\n readonly sheetName: string;\n}\n\n/**\n * Shifts one 1-based index. Returns `null` when the index falls inside a\n * delete band (the row/column it pointed at no longer exists).\n */\nexport function shiftIndex(index: number, shift: RefShift): number | null {\n if (shift.kind === 'insert') {\n return index >= shift.at ? index + shift.count : index;\n }\n const bandEnd = shift.at + shift.count - 1;\n if (index < shift.at) return index;\n if (index <= bandEnd) return null;\n return index - shift.count;\n}\n\n/**\n * Shifts an inclusive 1-based [start, end] span, clamping it against a delete\n * band the way Excel does (endpoints move independently; a partially deleted\n * span shrinks). Returns `null` when the span is entirely deleted.\n */\nexport function shiftSpan(\n start: number,\n end: number,\n shift: RefShift,\n): { start: number; end: number } | null {\n if (shift.kind === 'insert') {\n return {\n start: start >= shift.at ? start + shift.count : start,\n end: end >= shift.at ? end + shift.count : end,\n };\n }\n const bandEnd = shift.at + shift.count - 1;\n // Clamp each endpoint into surviving territory, expressed post-shift.\n const newStart = start < shift.at ? start\n : start <= bandEnd ? shift.at\n : start - shift.count;\n const newEnd = end < shift.at ? end\n : end <= bandEnd ? shift.at - 1\n : end - shift.count;\n return newEnd < newStart ? null : { start: newStart, end: newEnd };\n}\n\n/**\n * Shifts a plain \"A1\" or \"A1:B2\" reference (no `$` markers — this is for\n * model metadata such as merges, autofilter and validation sqref parts, which\n * never carry them). Returns `null` when the referenced area is entirely\n * deleted.\n */\nexport function shiftRangeRef(ref: string, shift: RefShift): string | null {\n const [startRef, endRef] = ref.split(':') as [string, string?];\n const start = parseCellRef(startRef);\n const end = endRef !== undefined ? parseCellRef(endRef) : start;\n\n const rows = shift.dim === 'row'\n ? shiftSpan(start.row, end.row, shift)\n : { start: start.row, end: end.row };\n const cols = shift.dim === 'col'\n ? shiftSpan(start.column, end.column, shift)\n : { start: start.column, end: end.column };\n if (!rows || !cols) return null;\n\n // A single-cell input stays single-cell; a range stays a range even when it\n // collapses to one cell, so callers can tell the two shapes apart.\n const startOut = cellRefFromRowCol(rows.start, cols.start);\n if (endRef === undefined) return startOut;\n return `${startOut}:${cellRefFromRowCol(rows.end, cols.end)}`;\n}\n\n/**\n * Shifts a space-separated list of range references (the OOXML `sqref` shape\n * used by data validations). Parts that are entirely deleted are dropped;\n * returns `null` when nothing survives.\n */\nexport function shiftSqref(sqref: string, shift: RefShift): string | null {\n const surviving = sqref\n .split(/\\s+/)\n .filter(Boolean)\n .map(part => shiftRangeRef(part, shift))\n .filter((part): part is string => part !== null);\n return surviving.length > 0 ? surviving.join(' ') : null;\n}\n","/**\n * Lexical rewriting of A1-style references in formula text after a structural\n * edit (rows/columns inserted or deleted).\n *\n * This is deliberately a scanner, not a parser: rewriting only needs to find\n * reference tokens while skipping string literals, quoted sheet names,\n * function names and defined names — grammar (precedence, arity) is\n * irrelevant. The output stays parseable by @devmm/puredocs-excel-formula,\n * whose lexer treats `#REF!` as an error literal.\n *\n * Handled: cell refs (`A1`, `$B$2`), ranges (`A1:B2`), whole-column (`A:C`)\n * and whole-row (`3:5`) ranges, spill refs (`A1#`), sheet-qualified refs\n * (`Sheet1!A1`, `'My Sheet'!A1`) with `''` escapes, string literals with `\"\"`\n * escapes, `$` markers preserved per endpoint.\n *\n * Passed through verbatim (documented limitations): 3-D references\n * (`Sheet1:Sheet3!A1`), structured table references (`Table1[Col]`), and\n * anything that fails the reference bounds check (defined names — a token\n * like `XFE1` or `A1234567890` exceeds XFD/1048576 and is a name, while\n * `TAX2024` is a real cell reference, exactly as in Excel).\n */\nimport { columnLetter, columnNumber, EXCEL_MAX_ROWS, EXCEL_MAX_COLUMNS } from './cell-reference.js';\nimport { shiftIndex, shiftSpan, type RefShift } from './ref-shift.js';\n\nexport interface FormulaRewriteResult {\n /** The rewritten formula text (without leading '='). */\n readonly text: string;\n /** True when any reference was actually rewritten. */\n readonly changed: boolean;\n /** True when at least one reference was replaced by `#REF!`. */\n readonly hasRefError: boolean;\n}\n\nconst MAX_ROW = EXCEL_MAX_ROWS;\nconst MAX_COL = EXCEL_MAX_COLUMNS;\n\n/**\n * True for characters that can appear inside a reference or identifier.\n * A char-code test rather than a regex: this runs once per character of every\n * formula on the sheet, and a regex literal in an expression position would\n * allocate a RegExp on each call.\n */\nfunction isWordChar(code: number): boolean {\n return (\n (code >= 65 && code <= 90) || // A-Z\n (code >= 97 && code <= 122) || // a-z\n (code >= 48 && code <= 57) || // 0-9\n code === 95 || // _\n code === 46 || // .\n code === 36 // $\n );\n}\n\ninterface CellComponent {\n colAbs: boolean;\n col: number;\n rowAbs: boolean;\n row: number;\n}\n\n/** `$A$1`-shaped word within reference bounds, or null. */\nfunction parseCellComponent(word: string): CellComponent | null {\n const m = /^(\\$?)([A-Za-z]{1,3})(\\$?)(\\d+)$/.exec(word);\n if (!m) return null;\n const col = columnNumber(m[2]!);\n const row = parseInt(m[4]!, 10);\n if (col > MAX_COL || row < 1 || row > MAX_ROW) return null;\n return { colAbs: m[1] === '$', col, rowAbs: m[3] === '$', row };\n}\n\n/** `$A`-shaped word (column only) within bounds, or null. */\nfunction parseColComponent(word: string): { abs: boolean; col: number } | null {\n const m = /^(\\$?)([A-Za-z]{1,3})$/.exec(word);\n if (!m) return null;\n const col = columnNumber(m[2]!);\n if (col > MAX_COL) return null;\n return { abs: m[1] === '$', col };\n}\n\n/** `$3`-shaped word (row only) within bounds, or null. */\nfunction parseRowComponent(word: string): { abs: boolean; row: number } | null {\n const m = /^(\\$?)(\\d+)$/.exec(word);\n if (!m) return null;\n const row = parseInt(m[2]!, 10);\n if (row < 1 || row > MAX_ROW) return null;\n return { abs: m[1] === '$', row };\n}\n\nfunction emitCell(c: CellComponent, row: number, col: number): string {\n return `${c.colAbs ? '$' : ''}${columnLetter(col)}${c.rowAbs ? '$' : ''}${row}`;\n}\n\n/**\n * Rewrites the references in one formula for a structural edit.\n *\n * @param formula Formula text without the leading '='.\n * @param shift The structural edit that happened.\n * @param formulaSheet Name of the sheet this formula lives on — unqualified\n * references resolve against it.\n */\nexport function shiftFormulaRefs(\n formula: string,\n shift: RefShift,\n formulaSheet: string,\n): FormulaRewriteResult {\n const n = formula.length;\n const editedSheet = shift.sheetName.toUpperCase();\n const unqualifiedRewritable = formulaSheet.toUpperCase() === editedSheet;\n const isRowShift = shift.dim === 'row';\n\n // Output is built lazily: verbatim stretches of the input are copied in one\n // slice only once a rewrite actually happens, so a formula that nothing\n // touches — the common case — allocates no strings at all.\n let out = '';\n let flushed = 0;\n let changed = false;\n let hasRefError = false;\n let i = 0;\n\n /** Replaces formula[start..i) with `text`; a no-op when they are identical. */\n const replace = (start: number, text: string): void => {\n if (text.length === i - start && formula.startsWith(text, start)) return;\n out += formula.slice(flushed, start) + text;\n flushed = i;\n changed = true;\n };\n\n /** Reads a maximal run of word characters starting at `i`. */\n const readWord = (): string => {\n let j = i;\n while (j < n && isWordChar(formula.charCodeAt(j))) j++;\n const w = formula.slice(i, j);\n i = j;\n return w;\n };\n\n /** Reads a `'quoted name'` starting at `i` (which must be a `'`). */\n const readQuoted = (): string => {\n let j = i + 1;\n while (j < n) {\n if (formula[j] === \"'\") {\n if (formula[j + 1] === \"'\") { j += 2; continue; }\n j++;\n break;\n }\n j++;\n }\n const q = formula.slice(i, j);\n i = j;\n return q;\n };\n\n /**\n * Consumes one reference construct (cell, range, whole-col/row range or spill\n * ref) starting at `i` and rewrites the span [refStart, i) in place.\n * `rewritable` gates whether this ref belongs to the edited sheet;\n * `refStart` is where the reference itself begins, after any sheet prefix.\n */\n const consumeRef = (refStart: number, rewritable: boolean): void => {\n const first = readWord();\n // Each component is parsed once and reused by every branch below.\n let firstCell = parseCellComponent(first);\n let firstCol = firstCell ? null : parseColComponent(first);\n let firstRow = firstCell || firstCol ? null : parseRowComponent(first);\n\n // Optional ':' + second component makes a range.\n let second: string | null = null;\n let secondCell: CellComponent | null = null;\n let secondCol: { abs: boolean; col: number } | null = null;\n let secondRow: { abs: boolean; row: number } | null = null;\n\n if (formula[i] === ':' && i + 1 < n && isWordChar(formula.charCodeAt(i + 1))) {\n const save = i;\n i++; // ':'\n const w = readWord();\n if (firstCell) secondCell = parseCellComponent(w);\n else if (firstCol) secondCol = parseColComponent(w);\n else if (firstRow) secondRow = parseRowComponent(w);\n\n if (secondCell || secondCol || secondRow) {\n second = w;\n } else {\n i = save; // not a range — leave ':' for the main loop\n }\n }\n\n // Function call? (only possible for a single word — `LOG10(`)\n if (second === null && formula[i] === '(') return;\n\n const dead = (): void => {\n // A spill marker on a dead anchor is meaningless — swallow it too.\n if (formula[i] === '#') i++;\n replace(refStart, '#REF!');\n hasRefError = true;\n };\n\n if (second !== null) {\n if (!rewritable) return;\n\n if (firstCell && secondCell) {\n const a = firstCell, b = secondCell;\n const rows = isRowShift ? shiftSpan(a.row, b.row, shift) : { start: a.row, end: b.row };\n const cols = isRowShift ? { start: a.col, end: b.col } : shiftSpan(a.col, b.col, shift);\n if (!rows || !cols) { dead(); return; }\n replace(refStart, `${emitCell(a, rows.start, cols.start)}:${emitCell(b, rows.end, cols.end)}`);\n return;\n }\n if (firstCol && secondCol) {\n if (isRowShift) return; // a whole-column range is row-agnostic\n const span = shiftSpan(firstCol.col, secondCol.col, shift);\n if (!span) { dead(); return; }\n const a = firstCol.abs ? '$' : '';\n const b = secondCol.abs ? '$' : '';\n replace(refStart, `${a}${columnLetter(span.start)}:${b}${columnLetter(span.end)}`);\n return;\n }\n if (firstRow && secondRow) {\n if (!isRowShift) return; // a whole-row range is column-agnostic\n const span = shiftSpan(firstRow.row, secondRow.row, shift);\n if (!span) { dead(); return; }\n const a = firstRow.abs ? '$' : '';\n const b = secondRow.abs ? '$' : '';\n replace(refStart, `${a}${span.start}:${b}${span.end}`);\n return;\n }\n return;\n }\n\n // Single word: cell ref (possibly a spill anchor) or a pass-through token.\n if (!firstCell || !rewritable) return;\n const row = isRowShift ? shiftIndex(firstCell.row, shift) : firstCell.row;\n const col = isRowShift ? firstCell.col : shiftIndex(firstCell.col, shift);\n if (row === null || col === null) { dead(); return; }\n replace(refStart, emitCell(firstCell, row, col));\n };\n\n while (i < n) {\n const ch = formula[i]!;\n\n // String literal — verbatim.\n if (ch === '\"') {\n let j = i + 1;\n while (j < n) {\n if (formula[j] === '\"') {\n if (formula[j + 1] === '\"') { j += 2; continue; }\n j++;\n break;\n }\n j++;\n }\n i = j;\n continue;\n }\n\n // Quoted sheet name.\n if (ch === \"'\") {\n const quoted = readQuoted();\n if (formula[i] === '!') {\n i++; // '!'\n // A ':' inside the quoted name is a 3-D span — not rewritable.\n const name = quoted.slice(1, -1);\n const rewritable = name.indexOf(':') === -1\n && (name.indexOf(\"''\") === -1 ? name : name.replace(/''/g, \"'\")).toUpperCase() === editedSheet;\n consumeRef(i, rewritable);\n }\n continue;\n }\n\n if (isWordChar(formula.charCodeAt(i))) {\n const start = i;\n const word = readWord();\n\n // Bare sheet prefix: `Sheet1!A1` or 3-D `Sheet1:Sheet3!A1`.\n if (formula[i] === '!') {\n i++;\n consumeRef(i, word.toUpperCase() === editedSheet);\n continue;\n }\n if (formula[i] === ':') {\n // Look ahead for `word:word!` (3-D) before treating ':' as a range.\n const save = i;\n i++;\n const w2 = i < n && isWordChar(formula.charCodeAt(i)) ? readWord() : '';\n if (w2 && formula[i] === '!') {\n i++;\n consumeRef(i, false);\n continue;\n }\n i = save;\n }\n\n // Structured table reference `Name[...]` — verbatim through the brackets.\n if (formula[i] === '[') {\n let depth = 0;\n let j = i;\n while (j < n) {\n if (formula[j] === '[') depth++;\n else if (formula[j] === ']' && --depth === 0) { j++; break; }\n j++;\n }\n i = j;\n continue;\n }\n\n // Plain reference or identifier.\n i = start;\n consumeRef(start, unqualifiedRewritable);\n continue;\n }\n\n i++;\n }\n\n if (!changed) return { text: formula, changed: false, hasRefError };\n return { text: out + formula.slice(flushed), changed: true, hasRefError };\n}\n","/**\n * Translation of A1-style references by a row/column offset.\n *\n * This is what makes Excel's *shared formulas* readable. Excel stores a\n * fill-down once — `<f t=\"shared\" ref=\"B1:B3\" si=\"0\">A1*2</f>` on the first cell,\n * `<f t=\"shared\" si=\"0\"/>` on the rest — and every other cell's formula is the\n * master's with its **relative** references moved by the distance between the\n * two cells. `$` markers pin a component in place, exactly as when copying a\n * formula in the UI.\n *\n * Same scanner discipline as `formula-ref-shift.ts`: string literals, quoted\n * sheet names, function names, defined names and structured table references are\n * skipped, not parsed. 3-D references (`Sheet1:Sheet3!A1`) are passed through.\n *\n * A component pushed outside the sheet becomes `#REF!` for the whole reference,\n * which is what Excel shows for the same situation.\n */\nimport { columnLetter, columnNumber, EXCEL_MAX_ROWS, EXCEL_MAX_COLUMNS } from './cell-reference.js';\n\nexport interface FormulaTranslateResult {\n /** The translated formula text (without leading '='). */\n readonly text: string;\n /** True when at least one reference fell outside the sheet. */\n readonly hasRefError: boolean;\n}\n\nfunction isWordChar(code: number): boolean {\n return (\n (code >= 65 && code <= 90) || // A-Z\n (code >= 97 && code <= 122) || // a-z\n (code >= 48 && code <= 57) || // 0-9\n code === 95 || // _\n code === 46 || // .\n code === 36 // $\n );\n}\n\ninterface CellComponent { colAbs: boolean; col: number; rowAbs: boolean; row: number }\n\nfunction parseCellComponent(word: string): CellComponent | null {\n const m = /^(\\$?)([A-Za-z]{1,3})(\\$?)(\\d+)$/.exec(word);\n if (!m) return null;\n const col = columnNumber(m[2]!);\n const row = parseInt(m[4]!, 10);\n if (col > EXCEL_MAX_COLUMNS || row < 1 || row > EXCEL_MAX_ROWS) return null;\n return { colAbs: m[1] === '$', col, rowAbs: m[3] === '$', row };\n}\n\nfunction parseColComponent(word: string): { abs: boolean; col: number } | null {\n const m = /^(\\$?)([A-Za-z]{1,3})$/.exec(word);\n if (!m) return null;\n const col = columnNumber(m[2]!);\n return col > EXCEL_MAX_COLUMNS ? null : { abs: m[1] === '$', col };\n}\n\nfunction parseRowComponent(word: string): { abs: boolean; row: number } | null {\n const m = /^(\\$?)(\\d+)$/.exec(word);\n if (!m) return null;\n const row = parseInt(m[2]!, 10);\n return row < 1 || row > EXCEL_MAX_ROWS ? null : { abs: m[1] === '$', row };\n}\n\n/** Offsets an index unless it is absolute; null when it leaves the sheet. */\nfunction move(index: number, delta: number, abs: boolean, max: number): number | null {\n if (abs || delta === 0) return index;\n const moved = index + delta;\n return moved < 1 || moved > max ? null : moved;\n}\n\n/**\n * Translates every relative reference in `formula` by (`dRow`, `dCol`).\n *\n * @param formula Formula text without the leading '='.\n * @param dRow Rows to move relative row components by (may be negative).\n * @param dCol Columns to move relative column components by.\n */\nexport function translateFormulaRefs(\n formula: string,\n dRow: number,\n dCol: number,\n): FormulaTranslateResult {\n if (dRow === 0 && dCol === 0) return { text: formula, hasRefError: false };\n\n const n = formula.length;\n let out = '';\n let flushed = 0;\n let hasRefError = false;\n let i = 0;\n\n const replace = (start: number, text: string): void => {\n if (text.length === i - start && formula.startsWith(text, start)) return;\n out += formula.slice(flushed, start) + text;\n flushed = i;\n };\n\n const readWord = (): string => {\n let j = i;\n while (j < n && isWordChar(formula.charCodeAt(j))) j++;\n const w = formula.slice(i, j);\n i = j;\n return w;\n };\n\n const readQuoted = (): string => {\n let j = i + 1;\n while (j < n) {\n if (formula[j] === \"'\") {\n if (formula[j + 1] === \"'\") { j += 2; continue; }\n j++;\n break;\n }\n j++;\n }\n const q = formula.slice(i, j);\n i = j;\n return q;\n };\n\n const emitCell = (c: CellComponent, row: number, col: number): string =>\n `${c.colAbs ? '$' : ''}${columnLetter(col)}${c.rowAbs ? '$' : ''}${row}`;\n\n /**\n * Consumes one reference construct starting at `i` and rewrites it.\n *\n * `rewrite: false` consumes it without touching it — used for the reference\n * after a 3-D sheet span, which must be passed through. Consuming rather than\n * skipping matters: leaving `A1` for the main loop would translate it as if it\n * stood alone.\n */\n const consumeRef = (refStart: number, rewrite = true): void => {\n const first = readWord();\n const firstCell = parseCellComponent(first);\n const firstCol = firstCell ? null : parseColComponent(first);\n const firstRow = firstCell || firstCol ? null : parseRowComponent(first);\n if (!firstCell && !firstCol && !firstRow) return; // a name, not a reference\n\n let secondCell: CellComponent | null = null;\n let secondCol: { abs: boolean; col: number } | null = null;\n let secondRow: { abs: boolean; row: number } | null = null;\n let isRange = false;\n\n if (formula[i] === ':' && i + 1 < n && isWordChar(formula.charCodeAt(i + 1))) {\n const save = i;\n i++; // ':'\n const w = readWord();\n if (firstCell) secondCell = parseCellComponent(w);\n else if (firstCol) secondCol = parseColComponent(w);\n else if (firstRow) secondRow = parseRowComponent(w);\n if (secondCell || secondCol || secondRow) isRange = true;\n else i = save; // not a range — leave ':' to the main loop\n }\n\n // A single word followed by '(' is a function name, not a reference.\n if (!isRange && formula[i] === '(') return;\n if (!rewrite) {\n if (formula[i] === '#') i++; // consume a spill marker too\n return;\n }\n\n const dead = (): void => {\n if (formula[i] === '#') i++; // a spill marker on a dead anchor is meaningless\n replace(refStart, '#REF!');\n hasRefError = true;\n };\n\n if (isRange) {\n if (firstCell && secondCell) {\n const r1 = move(firstCell.row, dRow, firstCell.rowAbs, EXCEL_MAX_ROWS);\n const c1 = move(firstCell.col, dCol, firstCell.colAbs, EXCEL_MAX_COLUMNS);\n const r2 = move(secondCell.row, dRow, secondCell.rowAbs, EXCEL_MAX_ROWS);\n const c2 = move(secondCell.col, dCol, secondCell.colAbs, EXCEL_MAX_COLUMNS);\n if (r1 === null || c1 === null || r2 === null || c2 === null) { dead(); return; }\n replace(refStart, `${emitCell(firstCell, r1, c1)}:${emitCell(secondCell, r2, c2)}`);\n return;\n }\n if (firstCol && secondCol) {\n const c1 = move(firstCol.col, dCol, firstCol.abs, EXCEL_MAX_COLUMNS);\n const c2 = move(secondCol.col, dCol, secondCol.abs, EXCEL_MAX_COLUMNS);\n if (c1 === null || c2 === null) { dead(); return; }\n replace(refStart, `${firstCol.abs ? '$' : ''}${columnLetter(c1)}:${secondCol.abs ? '$' : ''}${columnLetter(c2)}`);\n return;\n }\n if (firstRow && secondRow) {\n const r1 = move(firstRow.row, dRow, firstRow.abs, EXCEL_MAX_ROWS);\n const r2 = move(secondRow.row, dRow, secondRow.abs, EXCEL_MAX_ROWS);\n if (r1 === null || r2 === null) { dead(); return; }\n replace(refStart, `${firstRow.abs ? '$' : ''}${r1}:${secondRow.abs ? '$' : ''}${r2}`);\n return;\n }\n return;\n }\n\n if (!firstCell) return; // a bare column or row on its own is not a reference\n const row = move(firstCell.row, dRow, firstCell.rowAbs, EXCEL_MAX_ROWS);\n const col = move(firstCell.col, dCol, firstCell.colAbs, EXCEL_MAX_COLUMNS);\n if (row === null || col === null) { dead(); return; }\n replace(refStart, emitCell(firstCell, row, col));\n };\n\n while (i < n) {\n const ch = formula[i]!;\n\n if (ch === '\"') { // string literal — verbatim\n let j = i + 1;\n while (j < n) {\n if (formula[j] === '\"') {\n if (formula[j + 1] === '\"') { j += 2; continue; }\n j++;\n break;\n }\n j++;\n }\n i = j;\n continue;\n }\n\n if (ch === \"'\") { // quoted sheet name\n readQuoted();\n if (formula[i] === '!') {\n i++;\n consumeRef(i);\n }\n continue;\n }\n\n if (isWordChar(formula.charCodeAt(i))) {\n const start = i;\n const word = readWord();\n\n if (formula[i] === '!') { // Sheet1!A1 — or 3-D, handled below\n i++;\n consumeRef(i);\n continue;\n }\n if (formula[i] === ':') {\n // `word:word!` is a 3-D reference; leave it alone.\n const save = i;\n i++;\n const w2 = i < n && isWordChar(formula.charCodeAt(i)) ? readWord() : '';\n if (w2 && formula[i] === '!') {\n i++;\n consumeRef(i, false); // pass the whole 3-D reference through untouched\n continue;\n }\n i = save;\n }\n if (formula[i] === '[') { // structured table reference — verbatim\n let depth = 0;\n let j = i;\n while (j < n) {\n if (formula[j] === '[') depth++;\n else if (formula[j] === ']' && --depth === 0) { j++; break; }\n j++;\n }\n i = j;\n continue;\n }\n\n i = start;\n void word;\n consumeRef(start);\n continue;\n }\n\n i++;\n }\n\n return { text: out + formula.slice(flushed), hasRefError };\n}\n","/**\n * Represents a rectangular range of cells for bulk operations.\n * Port of TVE.PureDocs.Excel.Range (C#)\n */\nimport type { Worksheet } from './worksheet.js';\nimport { CellStyle } from '../style/cell-style.js';\nimport { ExcelColor } from '../style/excel-color.js';\nimport { ExcelBorderStyle } from '../style/excel-border.js';\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\nimport {\n parseRangeRef,\n parseCellRef,\n cellRefFromRowCol,\n EXCEL_MAX_ROWS,\n EXCEL_MAX_COLUMNS,\n} from './cell-reference.js';\nimport type { CellValue } from './cell.js';\n\nexport class Range {\n readonly #sheet: Worksheet;\n readonly #startRow: number;\n readonly #startColumn: number;\n readonly #endRow: number;\n readonly #endColumn: number;\n readonly #address: string;\n\n constructor(sheet: Worksheet, rangeReference: string) {\n this.#sheet = sheet;\n this.#address = rangeReference.toUpperCase();\n const { startRow, startColumn, endRow, endColumn } = parseRangeRef(rangeReference);\n this.#startRow = startRow;\n this.#startColumn = startColumn;\n this.#endRow = endRow;\n this.#endColumn = endColumn;\n }\n\n /** The range address e.g. \"A1:B10\". */\n get address(): string { return this.#address; }\n\n /** Number of rows in the range. */\n get rowCount(): number { return this.#endRow - this.#startRow + 1; }\n\n /** Number of columns in the range. */\n get columnCount(): number { return this.#endColumn - this.#startColumn + 1; }\n\n // ── Value bulk operations ──────────────────────────────────────────────────\n\n /**\n * Sets values from a 2D array.\n * Values that exceed the range boundary are silently ignored.\n */\n setValues(values: CellValue[][]): void {\n for (let r = 0; r < values.length && this.#startRow + r <= this.#endRow; r++) {\n const rowValues = values[r]!;\n for (let c = 0; c < rowValues.length && this.#startColumn + c <= this.#endColumn; c++) {\n const cell = this.#sheet.getCell(this.#startRow + r, this.#startColumn + c);\n const val = rowValues[c]!;\n cell.setValue(val as never);\n }\n }\n }\n\n /**\n * Gets all cell values as a 2D array (row-major order).\n */\n getValues(): CellValue[][] {\n // Allocate the dense grid, then fill only the cells that exist: an empty or\n // sparse range costs its area in array slots but no per-cell lookups.\n const rowCount = this.rowCount;\n const columnCount = this.columnCount;\n const result: CellValue[][] = new Array(rowCount);\n for (let r = 0; r < rowCount; r++) result[r] = new Array(columnCount).fill(null);\n\n const startRow = this.#startRow;\n const startColumn = this.#startColumn;\n this.#sheet.forEachCellIn(startRow, startColumn, this.#endRow, this.#endColumn,\n (cell, row, column) => {\n result[row - startRow]![column - startColumn] = cell.getValue();\n });\n return result;\n }\n\n /** Clears all cells in the range (values only, preserves style). */\n clear(): void {\n this.#forEachExisting(cell => cell.clear());\n }\n\n /** Clears values AND styles of all cells in the range. */\n clearAll(): void {\n this.#forEachExisting(cell => cell.clearAll());\n }\n\n /**\n * Moves the whole range so its top-left cell lands on `destTopLeft`,\n * carrying values, formulas, styles and spill anchors. The vacated cells\n * are cleared and the destination block is fully replaced (empty source\n * cells clear their destination). Overlapping source/destination is safe.\n * Formula text is NOT adjusted for the new position.\n *\n * @example\n * ws.getRange('A1:B3').moveTo('D1');\n */\n moveTo(destTopLeft: string): void {\n const dest = parseCellRef(destTopLeft.replace(/\\$/g, '').toUpperCase());\n const deltaRow = dest.row - this.#startRow;\n const deltaCol = dest.column - this.#startColumn;\n if (deltaRow === 0 && deltaCol === 0) return;\n if (this.#endRow + deltaRow > EXCEL_MAX_ROWS || this.#endColumn + deltaCol > EXCEL_MAX_COLUMNS) {\n throw new RangeError('Destination extends past the sheet limits.');\n }\n\n // Iterate away from the destination so an overlapping move never reads a\n // cell that was already overwritten.\n const rowOrder = deltaRow > 0 ? { from: this.#endRow, to: this.#startRow, step: -1 }\n : { from: this.#startRow, to: this.#endRow, step: 1 };\n const colOrder = deltaCol > 0 ? { from: this.#endColumn, to: this.#startColumn, step: -1 }\n : { from: this.#startColumn, to: this.#endColumn, step: 1 };\n\n for (let r = rowOrder.from; deltaRow > 0 ? r >= rowOrder.to : r <= rowOrder.to; r += rowOrder.step) {\n for (let c = colOrder.from; deltaCol > 0 ? c >= colOrder.to : c <= colOrder.to; c += colOrder.step) {\n this.#sheet.moveCellRC(r, c, r + deltaRow, c + deltaCol);\n }\n }\n }\n\n /**\n * Auto-fits all columns in the range. Measures every column in one sparse\n * sweep rather than re-scanning the sheet per column.\n */\n autoFit(): void {\n this.#sheet.autoFitColumns(this.#startColumn, this.#endColumn);\n }\n\n // ── Style bulk operations ──────────────────────────────────────────────────\n\n /** Applies a CellStyle to all cells in the range. Returns this for chaining. */\n setStyle(style: CellStyle): this {\n this.#forEach(cell => { cell.style = style; });\n return this;\n }\n\n /**\n * Applies style changes to all cells in the range.\n * @example range.applyStyle(s => s.setBold(true).setBackgroundColor(ExcelColor.lightGray))\n */\n applyStyle(action: (style: CellStyle) => void): this {\n this.#forEach(cell => cell.applyStyle(action));\n return this;\n }\n\n setBold(bold = true): this {\n this.#forEach(cell => cell.setBold(bold));\n return this;\n }\n\n setFontSize(size: number): this {\n this.#forEach(cell => cell.setFontSize(size));\n return this;\n }\n\n setFontColor(color: ExcelColor | string): this {\n this.#forEach(cell => cell.setFontColor(color as ExcelColor));\n return this;\n }\n\n setFontName(name: string): this {\n this.#forEach(cell => cell.setFontName(name));\n return this;\n }\n\n setBackgroundColor(color: ExcelColor | string): this {\n this.#forEach(cell => cell.setBackgroundColor(color as ExcelColor));\n return this;\n }\n\n setAllBorders(style: ExcelBorderStyle, color?: ExcelColor): this {\n this.#forEach(cell => cell.setAllBorders(style, color));\n return this;\n }\n\n setHorizontalAlignment(alignment: ExcelHorizontalAlignment): this {\n this.#forEach(cell => cell.setHorizontalAlignment(alignment));\n return this;\n }\n\n setVerticalAlignment(alignment: ExcelVerticalAlignment): this {\n this.#forEach(cell => cell.setVerticalAlignment(alignment));\n return this;\n }\n\n setWrapText(wrap = true): this {\n this.#forEach(cell => cell.setWrapText(wrap));\n return this;\n }\n\n setNumberFormat(format: ExcelNumberFormat): this;\n setNumberFormat(formatCode: string): this;\n setNumberFormat(formatOrCode: ExcelNumberFormat | string): this {\n this.#forEach(cell => cell.setNumberFormat(formatOrCode as ExcelNumberFormat));\n return this;\n }\n\n // ── Private helper ─────────────────────────────────────────────────────────\n\n #forEach(action: (cell: ReturnType<Worksheet['getCell']>) => void): void {\n for (let r = this.#startRow; r <= this.#endRow; r++) {\n for (let c = this.#startColumn; c <= this.#endColumn; c++) {\n action(this.#sheet.getCell(r, c));\n }\n }\n }\n\n /**\n * Like #forEach but only visits cells that already exist — used by the\n * clearing operations so they never materialise empty cells, and so the cost\n * tracks the populated cells rather than the area of the range.\n */\n #forEachExisting(action: (cell: NonNullable<ReturnType<Worksheet['tryGetCell']>>) => void): void {\n this.#sheet.forEachCellIn(\n this.#startRow, this.#startColumn, this.#endRow, this.#endColumn,\n cell => action(cell),\n );\n }\n}\n","/**\n * Represents a worksheet in an Excel workbook.\n * Port of TVE.PureDocs.Excel.Worksheet (C#)\n *\n * Key differences from C#:\n * - All public methods camelCase\n * - XML parsed/serialised directly — no OpenXml SDK\n * - No CalcChain yet (added later via @devmm/puredocs-excel-formula)\n */\nimport { Cell, CellData, readCellValue, buildCellXml, type SheetVersion } from './cell.js';\nimport { SharedStringManager } from './shared-string-manager.js';\nimport { StyleManager } from '../style/style-manager.js';\nimport { CellStyle } from '../style/cell-style.js';\nimport { ExcelColor } from '../style/excel-color.js';\nimport { ExcelBorderStyle } from '../style/excel-border.js';\nimport { ExcelHorizontalAlignment, ExcelVerticalAlignment } from '../style/excel-alignment.js';\nimport { ExcelNumberFormat } from '../style/excel-number-format.js';\nimport {\n parseCellRef,\n cellRefFromRowCol,\n columnLetter,\n parseRangeRef,\n EXCEL_MAX_ROWS,\n EXCEL_MAX_COLUMNS,\n} from './cell-reference.js';\nimport { shiftIndex, shiftSpan, shiftRangeRef, shiftSqref, type RefShift } from './ref-shift.js';\nimport { shiftFormulaRefs } from './formula-ref-shift.js';\nimport { translateFormulaRefs } from './formula-ref-translate.js';\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\nimport { REL_TYPES } from '../io/xml-builder.js';\nimport { type DrawingProvider } from '../io/drawing-part.js';\nimport {\n parseTailElements,\n type PreservedTailElement,\n type Relationship,\n} from '../io/preserved-parts.js';\nimport { Range } from './range.js';\n\n// Internal row representation\ninterface RowData {\n rowIndex: number;\n height?: number;\n customHeight?: boolean;\n hidden?: boolean;\n cells: Map<string, CellData>; // ref → CellData\n}\n\n// Internal column definition. `width` is absent when the column has no\n// explicit width (e.g. a hidden column at the sheet-default width).\ninterface ColDef {\n min: number;\n max: number;\n width?: number;\n customWidth: boolean;\n hidden?: boolean;\n}\n\n// Merge cell reference\ninterface MergeCell {\n ref: string; // e.g. \"A1:B2\"\n}\n\n// Freeze pane settings\ninterface PaneSettings {\n row: number; // rows to freeze\n column: number; // columns to freeze\n}\n\n// Auto filter\ninterface AutoFilter {\n ref: string;\n}\n\n// Data validation\ninterface DataValidation {\n sqref: string;\n formula: string;\n}\n\nexport type SheetVisibility = 'visible' | 'hidden' | 'veryHidden';\n\n/**\n * What users may still do on a protected sheet. Named from the user's point of\n * view — the same way Excel's \"Protect Sheet\" dialog lists its checkboxes —\n * because the underlying OOXML attributes are inverted (`formatCells=\"1\"` means\n * formatting is *blocked*), which is a reliable source of bugs.\n *\n * Defaults match Excel: selecting cells stays allowed, everything else does not.\n */\nexport interface SheetProtection {\n allowSelectLockedCells: boolean;\n allowSelectUnlockedCells: boolean;\n allowFormatCells: boolean;\n allowFormatColumns: boolean;\n allowFormatRows: boolean;\n allowInsertRows: boolean;\n allowInsertColumns: boolean;\n allowInsertHyperlinks: boolean;\n allowDeleteRows: boolean;\n allowDeleteColumns: boolean;\n allowSort: boolean;\n allowAutoFilter: boolean;\n allowPivotTables: boolean;\n allowEditObjects: boolean;\n allowEditScenarios: boolean;\n}\n\nconst PROTECTION_DEFAULTS: SheetProtection = {\n allowSelectLockedCells: true,\n allowSelectUnlockedCells: true,\n allowFormatCells: false,\n allowFormatColumns: false,\n allowFormatRows: false,\n allowInsertRows: false,\n allowInsertColumns: false,\n allowInsertHyperlinks: false,\n allowDeleteRows: false,\n allowDeleteColumns: false,\n allowSort: false,\n allowAutoFilter: false,\n allowPivotTables: false,\n allowEditObjects: false,\n allowEditScenarios: false,\n};\n\n/** `SheetProtection` key → OOXML attribute name. The value is negated on write. */\nconst PROTECTION_ATTRS: ReadonlyArray<[keyof SheetProtection, string]> = [\n ['allowSelectLockedCells', 'selectLockedCells'],\n ['allowSelectUnlockedCells', 'selectUnlockedCells'],\n ['allowFormatCells', 'formatCells'],\n ['allowFormatColumns', 'formatColumns'],\n ['allowFormatRows', 'formatRows'],\n ['allowInsertRows', 'insertRows'],\n ['allowInsertColumns', 'insertColumns'],\n ['allowInsertHyperlinks', 'insertHyperlinks'],\n ['allowDeleteRows', 'deleteRows'],\n ['allowDeleteColumns', 'deleteColumns'],\n ['allowSort', 'sort'],\n ['allowAutoFilter', 'autoFilter'],\n ['allowPivotTables', 'pivotTables'],\n ['allowEditObjects', 'objects'],\n ['allowEditScenarios', 'scenarios'],\n];\n\n/** A hyperlink attached to a cell or range. */\nexport interface Hyperlink {\n /** The cell or range the link covers, e.g. \"A1\" or \"A1:B2\". */\n readonly ref: string;\n /** External target, e.g. \"https://example.com\" or \"mailto:a@b.c\". */\n readonly target?: string;\n /** In-workbook destination, e.g. \"Sheet2!A1\" or a defined name. */\n readonly location?: string;\n /** Text to show instead of the cell's own value. */\n readonly display?: string;\n /** Hover tooltip. */\n readonly tooltip?: string;\n}\n\n/** A classic cell comment (a \"note\" in current Excel versions). */\nexport interface CellComment {\n /** The cell the comment is attached to, e.g. \"B4\". */\n readonly ref: string;\n readonly text: string;\n readonly author: string;\n}\n\n/** Outcome of a structural edit (insert/delete rows or columns). */\nexport interface StructuralEditResult {\n /**\n * References (post-shift, on this sheet) of formula cells that now contain\n * `#REF!` because something they pointed at was deleted.\n */\n readonly refErrors: readonly string[];\n}\n\nexport class Worksheet {\n readonly #sharedStrings: SharedStringManager;\n readonly #styles: StyleManager;\n\n #name: string;\n #rows: Map<number, RowData> = new Map();\n #cols: ColDef[] = [];\n #mergeCells: MergeCell[] = [];\n #pane?: PaneSettings;\n #autoFilter?: AutoFilter;\n #dataValidations: DataValidation[] = [];\n #visibility: SheetVisibility = 'visible';\n #drawings: DrawingProvider[] = [];\n #protection?: SheetProtection;\n /**\n * Password/hash attributes of a protection element read from a file, kept\n * verbatim so a protected sheet round-trips with its password intact. This\n * library never creates them: see {@link protect}.\n */\n #protectionCredentials = '';\n /** Hyperlinks keyed by their normalised ref, in insertion order. */\n #hyperlinks = new Map<string, Hyperlink>();\n /** Comments keyed by their normalised cell ref, in insertion order. */\n #comments = new Map<string, CellComment>();\n /**\n * True once the comment set has been modified through the API. Until then a\n * sheet loaded from a file keeps its original comments and VML parts verbatim,\n * so untouched files round-trip byte-for-byte; from then on this sheet owns\n * them and regenerates both. See {@link setComment}.\n */\n #commentsDirty = false;\n /** Hyperlink ref → relationship id, awaiting resolution against the rels part. */\n #pendingHyperlinkRels = new Map<string, string>();\n\n // Round-trip state captured when this sheet was loaded from a file: the\n // relationship-bearing leaf elements of the worksheet part, and the sheet's\n // original relationships. Re-emitted on save so drawings, images and legacy\n // comment anchors survive open→save. See io/preserved-parts.ts.\n #preservedTail: PreservedTailElement[] = [];\n #preservedRels: Relationship[] = [];\n\n /**\n * Mutation counter for this sheet, shared with every {@link Cell} view it\n * hands out (a Cell writes directly into the stored CellData). Everything\n * derived from the sheet's contents — the used-range memo, the cached\n * worksheet XML — is keyed on it, so every mutator must bump it. The test\n * `worksheet-version.test.ts` walks the public surface to keep that true.\n */\n readonly #version: SheetVersion = { v: 0 };\n /** Memoised {@link usedBounds}, valid while `#version.v` is unchanged. */\n #usedBoundsMemo?: { at: number; value: { rowCount: number; columnCount: number } };\n /** Memoised {@link buildXml} output, valid while `#version.v` is unchanged. */\n #xmlMemo?: { at: number; xml: string };\n\n /** @internal Current mutation count — see {@link #version}. */\n get version(): number { return this.#version.v; }\n\n /** Records a change to this sheet's contents or layout. */\n #touch(): void { this.#version.v++; }\n\n /** @internal */\n constructor(name: string, sharedStrings: SharedStringManager, styles: StyleManager) {\n this.#name = name;\n this.#sharedStrings = sharedStrings;\n this.#styles = styles;\n }\n\n // ── Identity ───────────────────────────────────────────────────────────────\n\n get name(): string { return this.#name; }\n set name(value: string) {\n if (!value) throw new Error('Worksheet name cannot be empty.');\n this.#name = value;\n }\n\n // ── Cell access ────────────────────────────────────────────────────────────\n\n /**\n * Gets (or creates) a cell by reference string (e.g. \"A1\") or 1-based row/col.\n * Creates the row/cell if it doesn't exist.\n */\n getCell(reference: string): Cell;\n getCell(row: number, column: number): Cell;\n getCell(refOrRow: string | number, column?: number): Cell {\n // The numeric overload already knows the row; only the string overload has\n // to parse one out of the reference.\n let ref: string;\n let row: number;\n if (typeof refOrRow === 'string') {\n ref = normalizeRefFast(refOrRow);\n row = parseCellRef(ref).row;\n } else {\n ref = cellRefFromRowCol(refOrRow, column!);\n row = refOrRow;\n }\n\n const rowData = this.#getOrCreateRow(row);\n let cellData = rowData.cells.get(ref);\n if (!cellData) {\n // Creating storage for a cell extends the used range even before anything\n // is written into it, so this counts as a mutation.\n this.#touch();\n cellData = { reference: ref, styleIndex: 0 };\n rowData.cells.set(ref, cellData);\n }\n return new Cell(cellData, this.#sharedStrings, this.#styles, this.#version);\n }\n\n /**\n * Returns a Cell if it exists, or null if the row/cell has not been created.\n * Does NOT create a new cell (read-only access).\n */\n tryGetCell(reference: string): Cell | null;\n tryGetCell(row: number, column: number): Cell | null;\n tryGetCell(refOrRow: string | number, column?: number): Cell | null {\n // Look the row up before building the reference string: on a sparse sheet\n // most numeric probes miss, and then no string has to be built at all.\n let rowData: RowData | undefined;\n let ref: string;\n if (typeof refOrRow === 'string') {\n ref = normalizeRefFast(refOrRow);\n rowData = this.#rows.get(parseCellRef(ref).row);\n if (!rowData) return null;\n } else {\n rowData = this.#rows.get(refOrRow);\n if (!rowData) return null;\n ref = cellRefFromRowCol(refOrRow, column!);\n }\n\n const cellData = rowData.cells.get(ref);\n if (!cellData) return null;\n return new Cell(cellData, this.#sharedStrings, this.#styles, this.#version);\n }\n\n /** Shorthand indexer — sheet.cell(\"A1\") or sheet.cell(1, 1). */\n cell(reference: string): Cell;\n cell(row: number, column: number): Cell;\n cell(refOrRow: string | number, column?: number): Cell {\n return typeof refOrRow === 'string'\n ? this.getCell(refOrRow)\n : this.getCell(refOrRow, column!);\n }\n\n /** Gets a Range object for bulk operations. */\n getRange(rangeReference: string): Range {\n if (!rangeReference) throw new Error('Range reference cannot be empty.');\n return new Range(this, rangeReference);\n }\n\n /**\n * The stored record for a cell, without creating it — the read paths below\n * work on this directly instead of wrapping it in a {@link Cell}. Formula\n * evaluation reads far more cells than it writes, and one wrapper per read is\n * pure garbage.\n */\n #findCellData(reference: string): CellData | undefined {\n const ref = normalizeRefFast(reference);\n return this.#rows.get(parseCellRef(ref).row)?.cells.get(ref);\n }\n\n /** Gets the raw value of a cell (for formula evaluation). */\n getCellValue(reference: string): unknown {\n const cd = this.#findCellData(reference);\n return cd ? readCellValue(cd, this.#sharedStrings, this.#styles) : null;\n }\n\n /**\n * Value of a cell addressed by 1-based row/column. The reference-string\n * overload has to build (and the callee re-parse) a string per cell; a range\n * read walking a rectangle already knows the coordinates, and on a real\n * workbook that is tens of millions of strings per recalculation.\n */\n getCellValueAt(row: number, column: number): unknown {\n const rowData = this.#rows.get(row);\n if (!rowData) return null;\n const cd = rowData.cells.get(cellRefFromRowCol(row, column));\n return cd ? readCellValue(cd, this.#sharedStrings, this.#styles) : null;\n }\n\n /** Formula text (without leading '=') of a cell, or null if it has none. */\n getCellFormula(reference: string): string | null {\n return this.#findCellData(reference)?.formula ?? null;\n }\n\n /** Spill range (e.g. \"A1:A3\") of a dynamic-array anchor, or null. Supports A1#. */\n getSpillRange(reference: string): string | null {\n return this.#findCellData(reference)?.arrayRef ?? null;\n }\n\n /**\n * Iterates the populated rows of the sheet in ascending row order, yielding\n * each row's 1-based index and its cells (left to right). Rows and cells\n * that were never written are skipped, so a sparse sheet iterates in\n * O(populated cells) regardless of its bounds.\n *\n * @example\n * for (const { rowIndex, cells } of ws.rows()) {\n * for (const cell of cells) console.log(rowIndex, cell.reference, cell.getValue());\n * }\n */\n *rows(): IterableIterator<{ rowIndex: number; cells: Cell[] }> {\n const populated = [...this.#rows.values()]\n .filter(row => row.cells.size > 0)\n .sort((a, b) => a.rowIndex - b.rowIndex);\n\n for (const row of populated) {\n const cells = [...row.cells.values()]\n .map(cd => ({ cd, col: columnFromRef(cd.reference, refSplit(cd.reference)) }))\n .sort((a, b) => a.col - b.col)\n .map(({ cd }) => new Cell(cd, this.#sharedStrings, this.#styles, this.#version));\n yield { rowIndex: row.rowIndex, cells };\n }\n }\n\n /**\n * Iterates every populated cell of the sheet in row-major order. Sparse\n * counterpart to scanning {@link usedBounds} with {@link tryGetCell}.\n *\n * @example\n * for (const cell of ws.cells()) console.log(cell.reference, cell.getValue());\n */\n *cells(): IterableIterator<Cell> {\n for (const { cells } of this.rows()) yield* cells;\n }\n\n /**\n * @internal Visits the populated cells inside a rectangle, passing the\n * coordinates it already knows so the callback never has to parse a\n * reference. Backs the Range operations that must not create cells; probing\n * every coordinate would cost O(area) even on an empty sheet.\n */\n forEachCellIn(\n startRow: number,\n startColumn: number,\n endRow: number,\n endColumn: number,\n action: (cell: Cell, row: number, column: number) => void,\n ): void {\n const visit = (row: RowData): void => {\n for (const cd of row.cells.values()) {\n const col = columnFromRef(cd.reference, refSplit(cd.reference));\n if (col < startColumn || col > endColumn) continue;\n action(new Cell(cd, this.#sharedStrings, this.#styles, this.#version), row.rowIndex, col);\n }\n };\n\n // Walk whichever is smaller: the rows the rectangle spans, or the rows the\n // sheet actually has.\n if (endRow - startRow + 1 <= this.#rows.size) {\n for (let r = startRow; r <= endRow; r++) {\n const row = this.#rows.get(r);\n if (row) visit(row);\n }\n return;\n }\n for (const row of this.#rows.values()) {\n if (row.rowIndex >= startRow && row.rowIndex <= endRow) visit(row);\n }\n }\n\n /**\n * @internal Moves a cell by coordinates, skipping the reference parsing that\n * the public {@link moveCell} has to do. Used by bulk range moves.\n */\n moveCellRC(fromRow: number, fromColumn: number, toRow: number, toColumn: number): void {\n this.#touch();\n if (fromRow === toRow && fromColumn === toColumn) return;\n const fromRef = cellRefFromRowCol(fromRow, fromColumn);\n const toRef = cellRefFromRowCol(toRow, toColumn);\n\n const src = this.#takeCellDataAt(fromRow, fromRef);\n if (!src) {\n this.#takeCellDataAt(toRow, toRef);\n return;\n }\n const moved: CellData = { ...src, reference: toRef };\n if (moved.arrayRef) {\n moved.arrayRef = translateRangeRef(moved.arrayRef, toRow - fromRow, toColumn - fromColumn);\n }\n this.#getOrCreateRow(toRow).cells.set(toRef, moved);\n }\n\n /**\n * Returns the 1-based extent of populated cells (largest row and column that\n * contain data). Returns zeros for an empty sheet. Useful for snapshotting a\n * sheet into a dense 2D array — though {@link rows} and {@link cells} are\n * cheaper when a dense shape is not actually required.\n */\n get usedBounds(): { rowCount: number; columnCount: number } {\n // Memoised: computing this walks every populated cell, and formula\n // evaluation asks for it on every whole-column reference (`SUM(A:A)`), which\n // would make one such formula cost a full sheet scan.\n const memo = this.#usedBoundsMemo;\n if (memo && memo.at === this.#version.v) return memo.value;\n\n const value = this.#computeUsedBounds();\n this.#usedBoundsMemo = { at: this.#version.v, value };\n return value;\n }\n\n /**\n * The extent, computed without touching the memo.\n *\n * Internal callers must use this. A mutator bumps the version once, at its\n * start, and then does its work; if it read the memoised getter part-way\n * through, the half-finished extent would be cached against the *new* version\n * and served as current for the rest of that version's life. That is precisely\n * how `insertColumns` came to report the extent it had before the insert —\n * caught by the round-trip fuzz test, not by any of the hand-written ones.\n */\n #computeUsedBounds(): { rowCount: number; columnCount: number } {\n let rowCount = 0;\n let columnCount = 0;\n for (const row of this.#rows.values()) {\n if (row.cells.size === 0) continue;\n if (row.rowIndex > rowCount) rowCount = row.rowIndex;\n for (const ref of row.cells.keys()) {\n const col = columnFromRef(ref, refSplit(ref));\n if (col > columnCount) columnCount = col;\n }\n }\n return { rowCount, columnCount };\n }\n\n // ── Layout ─────────────────────────────────────────────────────────────────\n\n /** Sets the width of a column (1-based index). */\n setColumnWidth(columnIndex: number, width: number): void {\n this.#touch();\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\n if (width <= 0) throw new RangeError('Width must be > 0.');\n\n const def = this.#splitColSpan(columnIndex)\n ?? this.#insertColDef({ min: columnIndex, max: columnIndex, customWidth: false });\n def.width = width;\n def.customWidth = true;\n }\n\n /**\n * Removes the explicit width of a column so it falls back to the sheet\n * default. Counterpart to {@link setColumnWidth}; afterwards\n * {@link getColumnWidth} returns `undefined`. A hidden column stays hidden.\n */\n resetColumnWidth(columnIndex: number): void {\n this.#touch();\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\n const def = this.#splitColSpan(columnIndex);\n if (!def) return;\n def.width = undefined;\n def.customWidth = false;\n this.#pruneColDefs();\n }\n\n /**\n * Shows or hides a column (1-based index). Hidden columns round-trip to the\n * file as `<col hidden=\"1\">` and keep any explicit width.\n */\n setColumnHidden(columnIndex: number, hidden = true): void {\n this.#touch();\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\n const def = this.#splitColSpan(columnIndex);\n if (def) {\n def.hidden = hidden;\n this.#pruneColDefs();\n } else if (hidden) {\n this.#insertColDef({ min: columnIndex, max: columnIndex, customWidth: false, hidden: true });\n }\n }\n\n /** True if the given 1-based column is hidden. */\n isColumnHidden(columnIndex: number): boolean {\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\n return this.#findColDef(columnIndex)?.hidden === true;\n }\n\n /**\n * Returns the explicit width of a column (1-based index), or `undefined` when\n * the column uses the sheet default. Counterpart to {@link setColumnWidth};\n * widths parsed from an existing file are visible here too, so column layout\n * can be round-tripped.\n */\n getColumnWidth(columnIndex: number): number | undefined {\n if (columnIndex < 1) throw new RangeError('Column index must be >= 1.');\n return this.#findColDef(columnIndex)?.width;\n }\n\n /** Auto-fits column width based on content (approximate). */\n autoFitColumn(columnIndex: number): void {\n this.#touch();\n this.autoFitColumns(columnIndex, columnIndex);\n }\n\n /**\n * Auto-fits an inclusive span of columns (1-based) in a single pass over the\n * populated cells, instead of re-scanning the sheet once per column.\n */\n autoFitColumns(firstColumn: number, lastColumn: number): void {\n this.#touch();\n if (firstColumn < 1) throw new RangeError('Column index must be >= 1.');\n if (lastColumn < firstColumn) return;\n\n const maxLen = new Map<number, number>();\n this.forEachCellIn(1, firstColumn, EXCEL_MAX_ROWS, lastColumn, (cell, _row, column) => {\n const len = cell.getText().length;\n if (len > (maxLen.get(column) ?? 0)) maxLen.set(column, len);\n });\n\n for (let col = firstColumn; col <= lastColumn; col++) {\n // Approximate: character width * 1.2 + 2 padding, minimum 8, capped at 255\n const len = Math.max(maxLen.get(col) ?? 0, 8);\n this.setColumnWidth(col, Math.min(len * 1.2 + 2, 255));\n }\n }\n\n /** Sets the height of a row (1-based index). */\n setRowHeight(rowIndex: number, height: number): void {\n this.#touch();\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\n if (height <= 0) throw new RangeError('Height must be > 0.');\n const row = this.#getOrCreateRow(rowIndex);\n row.height = height;\n row.customHeight = true;\n }\n\n /**\n * Returns the explicit height of a row (1-based index), or `undefined` when\n * the row uses the sheet default. Counterpart to {@link setRowHeight}.\n */\n getRowHeight(rowIndex: number): number | undefined {\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\n return this.#rows.get(rowIndex)?.height;\n }\n\n /**\n * Removes the explicit height of a row so it falls back to the sheet\n * default. Counterpart to {@link setRowHeight}; afterwards\n * {@link getRowHeight} returns `undefined`. A hidden row stays hidden.\n */\n resetRowHeight(rowIndex: number): void {\n this.#touch();\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\n const row = this.#rows.get(rowIndex);\n if (!row) return;\n row.height = undefined;\n row.customHeight = undefined;\n if (row.cells.size === 0 && !row.hidden) this.#rows.delete(rowIndex);\n }\n\n /** Shows or hides a row (1-based index). Hidden rows affect SUBTOTAL(101-111). */\n setRowHidden(rowIndex: number, hidden = true): void {\n this.#touch();\n if (rowIndex < 1) throw new RangeError('Row index must be >= 1.');\n this.#getOrCreateRow(rowIndex).hidden = hidden;\n }\n\n /** True if the given 1-based row is hidden. */\n isRowHidden(rowIndex: number): boolean {\n return this.#rows.get(rowIndex)?.hidden === true;\n }\n\n /**\n * The 1-based indices of every hidden row, ascending. Sparse counterpart to\n * probing {@link isRowHidden} across {@link usedBounds}.\n */\n get hiddenRows(): readonly number[] {\n const result: number[] = [];\n for (const row of this.#rows.values()) {\n if (row.hidden) result.push(row.rowIndex);\n }\n return result.sort((a, b) => a - b);\n }\n\n /**\n * The 1-based indices of every hidden column, ascending. Counterpart to\n * {@link isColumnHidden}, in the same spirit as {@link hiddenRows}.\n */\n get hiddenColumns(): readonly number[] {\n const result: number[] = [];\n for (const def of this.#cols) {\n if (!def.hidden) continue;\n for (let c = def.min; c <= def.max; c++) result.push(c);\n }\n return result.sort((a, b) => a - b);\n }\n\n // ── Structural editing ─────────────────────────────────────────────────────\n\n /**\n * Inserts `count` empty rows starting at row `at` (1-based). Everything at\n * or below `at` moves down: cell values, formulas (references are rewritten\n * the way Excel does), styles, row heights, hidden flags, merges,\n * autofilter and data-validation ranges.\n *\n * Frozen panes are a view property and stay put. Drawing/chart anchors\n * preserved from a loaded file are opaque XML and do NOT shift — images\n * keep their absolute position (known limitation).\n *\n * When formulas on OTHER sheets reference this sheet, use the\n * Workbook-level counterpart so they are rewritten too, or call\n * `applyExternalShift` on each sheet yourself. If a RecalcEngine is\n * attached, notify it afterwards (e.g. `engine.onRowsInserted(...)`).\n *\n * @example\n * ws.insertRows(3, 2); // pushes row 3 and below down by two rows\n */\n insertRows(at: number, count = 1): StructuralEditResult {\n this.#touch();\n return this.#applyStructural('row', 'insert', at, count);\n }\n\n /**\n * Deletes `count` rows starting at row `at` (1-based). Rows below move up;\n * formulas referencing the deleted band get `#REF!` (fully inside) or\n * shrink (partially inside), exactly like Excel. See {@link insertRows}\n * for the shifting rules and known limitations.\n */\n deleteRows(at: number, count = 1): StructuralEditResult {\n this.#touch();\n return this.#applyStructural('row', 'delete', at, count);\n }\n\n /**\n * Inserts `count` empty columns starting at column `at` (1-based).\n * Column-level counterpart to {@link insertRows}; widths and hidden flags\n * shift with the columns.\n */\n insertColumns(at: number, count = 1): StructuralEditResult {\n this.#touch();\n return this.#applyStructural('col', 'insert', at, count);\n }\n\n /**\n * Deletes `count` columns starting at column `at` (1-based).\n * Column-level counterpart to {@link deleteRows}.\n */\n deleteColumns(at: number, count = 1): StructuralEditResult {\n this.#touch();\n return this.#applyStructural('col', 'delete', at, count);\n }\n\n /**\n * @internal Rewrites formulas on THIS sheet after a structural edit on a\n * DIFFERENT sheet (named by `shift.sheetName`), so qualified references\n * like `'Data'!A5` stay correct. Cell positions here do not change.\n */\n applyExternalShift(shift: RefShift): StructuralEditResult {\n this.#touch();\n return { refErrors: this.#rewriteFormulas(shift) };\n }\n\n /**\n * Moves a cell's full contents — value, formula, style and spill anchor —\n * to another cell, overwriting the destination and clearing the source.\n * A missing source clears the destination. This is a literal move: formula\n * text is NOT adjusted for the new position.\n *\n * @example\n * ws.moveCell('A1', 'C5');\n */\n moveCell(from: string, to: string): void {\n this.#touch();\n const fromRef = normalizeRef(from);\n const toRef = normalizeRef(to);\n if (fromRef === toRef) return;\n\n const src = this.#takeCellData(fromRef);\n if (!src) {\n this.#deleteCellData(toRef);\n return;\n }\n\n const fromPos = parseCellRef(fromRef);\n const toPos = parseCellRef(toRef);\n const moved: CellData = { ...src, reference: toRef };\n if (moved.arrayRef) {\n moved.arrayRef = translateRangeRef(\n moved.arrayRef,\n toPos.row - fromPos.row,\n toPos.column - fromPos.column,\n );\n }\n this.#getOrCreateRow(toPos.row).cells.set(toRef, moved);\n }\n\n /**\n * Copies a cell's value, formula and style to another cell, overwriting the\n * destination and leaving the source untouched. A missing source clears the\n * destination. This is a literal copy: formula references are NOT adjusted,\n * and the spill anchor (`arrayRef`) is not copied — a recalc engine\n * re-establishes it.\n *\n * @example\n * ws.copyCell('A1', 'C5');\n */\n copyCell(from: string, to: string): void {\n this.#touch();\n const fromRef = normalizeRef(from);\n const toRef = normalizeRef(to);\n if (fromRef === toRef) return;\n\n const srcRow = this.#rows.get(parseCellRef(fromRef).row);\n const src = srcRow?.cells.get(fromRef);\n if (!src) {\n this.#deleteCellData(toRef);\n return;\n }\n\n const toPos = parseCellRef(toRef);\n const copied: CellData = { ...src, reference: toRef, arrayRef: undefined };\n this.#getOrCreateRow(toPos.row).cells.set(toRef, copied);\n }\n\n /** Removes and returns a cell's data record, pruning an emptied bare row. */\n #takeCellData(ref: string): CellData | undefined {\n return this.#takeCellDataAt(parseCellRef(ref).row, ref);\n }\n\n #takeCellDataAt(row: number, ref: string): CellData | undefined {\n const rowData = this.#rows.get(row);\n const data = rowData?.cells.get(ref);\n if (rowData && data) {\n rowData.cells.delete(ref);\n if (rowData.cells.size === 0 && !rowData.hidden && rowData.height === undefined) {\n this.#rows.delete(row);\n }\n }\n return data;\n }\n\n #deleteCellData(ref: string): void {\n this.#takeCellData(ref);\n }\n\n #applyStructural(dim: 'row' | 'col', kind: 'insert' | 'delete', at: number, count: number): StructuralEditResult {\n const what = dim === 'row' ? 'Row' : 'Column';\n if (!Number.isInteger(at) || at < 1) throw new RangeError(`${what} index must be an integer >= 1.`);\n if (!Number.isInteger(count) || count < 1) throw new RangeError('Count must be an integer >= 1.');\n\n const shift: RefShift = { dim, kind, at, count, sheetName: this.#name };\n\n if (kind === 'insert') {\n // Only the axis being shifted matters, and the row extent needs no cell\n // scan at all — usedBounds would parse every reference on the sheet.\n const limit = dim === 'row' ? EXCEL_MAX_ROWS : EXCEL_MAX_COLUMNS;\n const used = dim === 'row' ? this.#maxPopulatedRow() : this.#computeUsedBounds().columnCount;\n if (used >= at && used + count > limit) {\n throw new RangeError(`Insert would push populated cells past the sheet limit of ${limit}.`);\n }\n }\n\n this.#shiftRowsAndCells(shift);\n const refErrors = this.#rewriteFormulas(shift);\n this.#shiftMerges(shift);\n this.#shiftAutoFilter(shift);\n this.#shiftValidations(shift);\n this.#shiftHyperlinks(shift);\n this.#shiftComments(shift);\n if (dim === 'col') this.#shiftColDefs(shift);\n\n return { refErrors };\n }\n\n /**\n * Re-keys the row map / per-row cell maps and shifts every cell's spill range.\n *\n * Rows and columns before the shift boundary keep their keys, their reference\n * strings and their identity, so an edit near the end of a sheet costs\n * proportionally little rather than rebuilding the whole model. Spill ranges\n * are the one thing that must be visited everywhere, since a range belonging\n * to an unmoved anchor can still span the boundary — but that pass is a bare\n * property test per cell.\n */\n #shiftRowsAndCells(shift: RefShift): void {\n if (shift.dim === 'row') this.#shiftRows(shift);\n else this.#shiftColumns(shift);\n }\n\n #shiftRows(shift: RefShift): void {\n const moved: RowData[] = [];\n\n for (const row of this.#rows.values()) {\n if (row.rowIndex < shift.at) {\n // Untouched by the edit — only a spill range may still need widening.\n this.#shiftSpillRanges(row, shift);\n continue;\n }\n const shifted = shiftIndex(row.rowIndex, shift);\n this.#rows.delete(row.rowIndex);\n if (shifted === null) continue; // row is inside the deleted band\n row.rowIndex = shifted;\n moved.push(row);\n }\n\n // Re-key the moved rows' cells: on a row shift the column letters are\n // unchanged, so the new reference is the old letters plus the new row.\n for (const row of moved) {\n const suffix = String(row.rowIndex);\n const newCells = new Map<string, CellData>();\n for (const cd of row.cells.values()) {\n const ref = cd.reference.slice(0, refSplit(cd.reference)) + suffix;\n cd.reference = ref;\n if (cd.arrayRef) cd.arrayRef = shiftRangeRef(cd.arrayRef, shift) ?? undefined;\n newCells.set(ref, cd);\n }\n row.cells = newCells;\n this.#rows.set(row.rowIndex, row);\n }\n }\n\n #shiftColumns(shift: RefShift): void {\n for (const row of this.#rows.values()) {\n // Collect the affected cells first: mutating the map while iterating it\n // would revisit re-keyed entries.\n let affected: CellData[] | undefined;\n for (const cd of row.cells.values()) {\n const ref = cd.reference;\n if (columnFromRef(ref, refSplit(ref)) < shift.at) {\n this.#shiftSpillRange(cd, shift);\n continue;\n }\n (affected ??= []).push(cd);\n }\n if (!affected) continue;\n\n for (const cd of affected) row.cells.delete(cd.reference);\n for (const cd of affected) {\n const split = refSplit(cd.reference);\n const shifted = shiftIndex(columnFromRef(cd.reference, split), shift);\n if (shifted === null) continue; // cell is inside the deleted band\n const ref = columnLetter(shifted) + cd.reference.slice(split);\n cd.reference = ref;\n this.#shiftSpillRange(cd, shift);\n row.cells.set(ref, cd);\n }\n }\n }\n\n /** Largest 1-based row index holding a cell, or 0. O(rows), no ref parsing. */\n #maxPopulatedRow(): number {\n let max = 0;\n for (const row of this.#rows.values()) {\n if (row.cells.size > 0 && row.rowIndex > max) max = row.rowIndex;\n }\n return max;\n }\n\n #shiftSpillRanges(row: RowData, shift: RefShift): void {\n for (const cd of row.cells.values()) this.#shiftSpillRange(cd, shift);\n }\n\n #shiftSpillRange(cd: CellData, shift: RefShift): void {\n if (cd.arrayRef) cd.arrayRef = shiftRangeRef(cd.arrayRef, shift) ?? undefined;\n }\n\n /** Rewrites every formula on the sheet; returns refs that now hold #REF!. */\n #rewriteFormulas(shift: RefShift): string[] {\n const refErrors: string[] = [];\n for (const row of this.#rows.values()) {\n for (const cd of row.cells.values()) {\n if (!cd.formula) continue;\n const result = shiftFormulaRefs(cd.formula, shift, this.#name);\n if (result.changed) cd.formula = result.text;\n if (result.hasRefError) refErrors.push(cd.reference);\n }\n }\n return refErrors;\n }\n\n #shiftMerges(shift: RefShift): void {\n this.#mergeCells = this.#mergeCells.flatMap(m => {\n const ref = shiftRangeRef(m.ref, shift);\n if (!ref) return [];\n const [a, b] = ref.split(':');\n if (!b || a === b) return []; // collapsed to a single cell — no longer a merge\n return [{ ref }];\n });\n }\n\n #shiftAutoFilter(shift: RefShift): void {\n if (!this.#autoFilter) return;\n const ref = shiftRangeRef(this.#autoFilter.ref, shift);\n this.#autoFilter = ref ? { ref } : undefined;\n }\n\n #shiftValidations(shift: RefShift): void {\n this.#dataValidations = this.#dataValidations.flatMap(dv => {\n const sqref = shiftSqref(dv.sqref, shift);\n if (!sqref) return [];\n const formula = shiftFormulaRefs(dv.formula, shift, this.#name).text;\n return [{ sqref, formula }];\n });\n }\n\n #shiftHyperlinks(shift: RefShift): void {\n const moved = new Map<string, Hyperlink>();\n for (const link of this.#hyperlinks.values()) {\n const ref = shiftRangeRef(link.ref, shift);\n if (!ref) continue; // the cells it covered are gone\n moved.set(ref, { ...link, ref });\n }\n this.#hyperlinks = moved;\n }\n\n #shiftComments(shift: RefShift): void {\n const moved = new Map<string, CellComment>();\n let changed = false;\n for (const comment of this.#comments.values()) {\n const ref = shiftRangeRef(comment.ref, shift);\n if (!ref) { changed = true; continue; } // the cell is gone\n if (ref !== comment.ref) changed = true;\n moved.set(ref, { ...comment, ref });\n }\n this.#comments = moved;\n // Moved anchors mean the preserved VML no longer describes reality, so this\n // sheet has to take over writing them.\n if (changed) this.#commentsDirty = true;\n }\n\n #shiftColDefs(shift: RefShift): void {\n this.#cols = this.#cols.flatMap(c => {\n const span = shiftSpan(c.min, c.max, shift);\n return span ? [{ ...c, min: span.start, max: span.end }] : [];\n });\n }\n\n /** Merges cells in the given range (e.g. \"A1:B2\"). */\n mergeCells(rangeReference: string): void {\n this.#touch();\n if (!rangeReference) throw new Error('Range reference cannot be empty.');\n this.#mergeCells.push({ ref: rangeReference });\n }\n\n /** Removes a merge for the given range reference. */\n unmergeCells(rangeReference: string): void {\n this.#touch();\n this.#mergeCells = this.#mergeCells.filter(m => m.ref !== rangeReference);\n }\n\n /**\n * All merged ranges on this sheet, in the order they were added (or parsed).\n * Includes merges read from an existing file, so callers never need to track\n * their own copy of the list.\n */\n get merges(): readonly string[] {\n return this.#mergeCells.map(m => m.ref);\n }\n\n /**\n * Freezes rows and/or columns.\n * @param row Number of rows to freeze (0 = none)\n * @param column Number of columns to freeze (0 = none)\n */\n freezePanes(row: number, column: number): void {\n this.#touch();\n if (row < 0) throw new RangeError('Row must be >= 0.');\n if (column < 0) throw new RangeError('Column must be >= 0.');\n this.#pane = (row === 0 && column === 0) ? undefined : { row, column };\n }\n\n /** Sets auto-filter on the given range. */\n setAutoFilter(rangeReference: string): void {\n this.#touch();\n this.#autoFilter = { ref: rangeReference };\n }\n\n /**\n * Adds a dropdown data validation to a cell range.\n * @param cellRange Range to apply (e.g. \"F2:F1000\")\n * @param listFormula Formula for the dropdown list (e.g. \"'Sheet2'!$A$1:$A$10\")\n */\n addDropdownValidation(cellRange: string, listFormula: string): void {\n this.#touch();\n this.#dataValidations.push({ sqref: cellRange, formula: listFormula });\n }\n\n /** Sets the visibility state of this worksheet. */\n setVisibility(state: SheetVisibility): void {\n this.#touch();\n this.#visibility = state;\n }\n\n get visibility(): SheetVisibility { return this.#visibility; }\n\n // ── Sheet protection ───────────────────────────────────────────────────────\n\n /**\n * Turns on sheet protection, optionally relaxing individual permissions.\n * Cells are locked by default in Excel, so protecting a sheet makes all of\n * them read-only; clear a cell style's `locked` flag to leave a cell editable.\n *\n * Excel's sheet protection is a UI guard, **not** security: the contents stay\n * readable to anything that opens the file. This library therefore never\n * creates a protection password. A password read from an existing file is\n * preserved so the sheet round-trips unchanged.\n *\n * @example\n * ws.protect(); // lock everything\n * ws.protect({ allowSort: true, allowAutoFilter: true });\n */\n protect(options?: Partial<SheetProtection>): void {\n this.#touch();\n this.#protection = { ...PROTECTION_DEFAULTS, ...options };\n }\n\n /** Turns off sheet protection, discarding any password read from a file. */\n unprotect(): void {\n this.#touch();\n this.#protection = undefined;\n this.#protectionCredentials = '';\n }\n\n /** True when this sheet is protected. */\n get isProtected(): boolean { return this.#protection !== undefined; }\n\n /** The active permissions, or `undefined` when the sheet is not protected. */\n get protection(): Readonly<SheetProtection> | undefined {\n return this.#protection ? { ...this.#protection } : undefined;\n }\n\n // ── Hyperlinks ─────────────────────────────────────────────────────────────\n\n /**\n * Attaches a hyperlink to a cell or range. Give `target` for an external\n * destination or `location` for one inside the workbook; passing both keeps\n * the external target and uses the location as its fragment, which is how\n * Excel links to an anchor within a document.\n *\n * A cell's displayed text still comes from its own value — set that\n * separately; `display` only overrides what Excel shows in the edit bar.\n *\n * @example\n * ws.getCell('A1').setValue('Anthropic');\n * ws.setHyperlink('A1', { target: 'https://anthropic.com', tooltip: 'Open site' });\n * ws.setHyperlink('B1', { location: \"'Sheet2'!A1\" });\n */\n setHyperlink(\n ref: string,\n link: { target?: string; location?: string; display?: string; tooltip?: string },\n ): void {\n if (!link.target && !link.location) {\n throw new Error('A hyperlink needs a target (external) or a location (in-workbook).');\n }\n this.#touch();\n const normalized = normalizeRangeRef(ref);\n this.#hyperlinks.set(normalized, { ref: normalized, ...link });\n }\n\n /** The hyperlink covering exactly this ref, or undefined. */\n getHyperlink(ref: string): Hyperlink | undefined {\n return this.#hyperlinks.get(normalizeRangeRef(ref));\n }\n\n /** Removes the hyperlink on this ref. Returns true if one was there. */\n removeHyperlink(ref: string): boolean {\n this.#touch();\n return this.#hyperlinks.delete(normalizeRangeRef(ref));\n }\n\n /** Every hyperlink on the sheet, including ones read from a file. */\n get hyperlinks(): readonly Hyperlink[] {\n return [...this.#hyperlinks.values()];\n }\n\n // ── Comments (notes) ───────────────────────────────────────────────────────\n\n /**\n * Attaches a comment (a \"note\" in current Excel versions) to a cell,\n * replacing any comment already there.\n *\n * Note that writing comments makes this sheet regenerate its comment and\n * legacy-drawing parts on save. If the file was opened with other legacy\n * drawing content on the same sheet — form controls, for instance — that\n * content is not reproduced. Reading comments has no such effect.\n *\n * @example\n * ws.setComment('B4', 'Check this figure', { author: 'Bill' });\n */\n setComment(ref: string, text: string, options?: { author?: string }): void {\n this.#touch();\n const normalized = normalizeRef(ref);\n this.#comments.set(normalized, {\n ref: normalized,\n text,\n author: options?.author ?? '',\n });\n this.#commentsDirty = true;\n }\n\n /** The comment on a cell, or undefined. */\n getComment(ref: string): CellComment | undefined {\n return this.#comments.get(normalizeRef(ref));\n }\n\n /** Removes the comment on a cell. Returns true if one was there. */\n removeComment(ref: string): boolean {\n this.#touch();\n const removed = this.#comments.delete(normalizeRef(ref));\n if (removed) this.#commentsDirty = true;\n return removed;\n }\n\n /** Every comment on the sheet, including ones read from a file. */\n get comments(): readonly CellComment[] {\n return [...this.#comments.values()];\n }\n\n /** @internal True when this sheet must write its own comment parts. */\n get ownsCommentParts(): boolean {\n return this.#commentsDirty && this.#comments.size > 0;\n }\n\n /**\n * @internal True when the sheet took over its comment parts and any preserved\n * originals must be dropped — including the case where every comment was\n * deleted and nothing replaces them.\n */\n get commentPartsReplaced(): boolean { return this.#commentsDirty; }\n\n // ── Drawings (charts, images …) ──────────────────────────────────────────────\n\n /**\n * Attaches a drawing provider (e.g. a chart) to this worksheet.\n * Satellite packages such as `@devmm/puredocs-excel-charts` call this; the core\n * save pipeline turns registered providers into valid OOXML drawing/chart parts.\n */\n addDrawingProvider(provider: DrawingProvider): void {\n this.#touch();\n this.#drawings.push(provider);\n }\n\n /**\n * Detaches every drawing from this worksheet — both providers added in memory\n * and any drawing preserved from the file the workbook was opened from.\n *\n * Call before re-adding charts when exporting the same in-memory workbook\n * repeatedly, otherwise each export appends another copy; call on its own to\n * deliberately drop a chart that came from the source file.\n */\n clearDrawings(): void {\n this.#touch();\n this.#drawings = [];\n this.#preservedTail = this.#preservedTail.filter(t => t.tag !== 'drawing');\n }\n\n /** True when this worksheet has at least one drawing to serialise. */\n get hasDrawings(): boolean { return this.#drawings.length > 0; }\n\n /** @internal — drawing providers, consumed by the save pipeline. */\n get drawingProviders(): readonly DrawingProvider[] { return this.#drawings; }\n\n // ── Round-trip preservation (internal) ───────────────────────────────────────\n\n /**\n * @internal Relationships carried over from the source file, minus any whose\n * leaf element is no longer emitted (a drawing replaced by live providers, or\n * cleared outright). The save pipeline writes these into the sheet's rels.\n */\n get preservedRelationships(): readonly Relationship[] {\n const liveIds = new Set(this.#activeTail().map(t => t.relId));\n return this.#preservedRels.filter(r => {\n // The comments part is referenced by no worksheet element at all — only\n // its VML sibling is, through <legacyDrawing> — so it has to be retained\n // explicitly, or saving would prune the part and leave the notes' shapes\n // pointing at nothing.\n if (r.type === REL_TYPES.comments) {\n return !this.commentPartsReplaced && this.#comments.size > 0;\n }\n return liveIds.has(r.id);\n });\n }\n\n /**\n * @internal Package paths of relationships that were preserved at load time\n * but are no longer referenced — a drawing replaced by live providers, or one\n * cleared outright. The save pipeline prunes these parts so the output has no\n * orphans.\n */\n get droppedPreservedTargets(): readonly string[] {\n const liveIds = new Set(this.#activeTail().map(t => t.relId));\n return this.#preservedRels\n .filter(r => !liveIds.has(r.id) && r.resolved !== undefined)\n .map(r => r.resolved!);\n }\n\n /**\n * @internal Relationship id for a drawing built from live providers. Chosen to\n * clear every preserved id so the two sets cannot collide.\n */\n get drawingRelId(): string {\n return this.generatedRels().drawing ?? `rId${this.#relIdBase() + 1}`;\n }\n\n /** Highest numeric preserved relationship id, so generated ids clear them all. */\n #relIdBase(): number {\n let max = 0;\n for (const r of this.#preservedRels) {\n const n = RID_PATTERN.exec(r.id);\n if (n) max = Math.max(max, parseInt(n[1]!, 10));\n }\n return max;\n }\n\n /**\n * @internal Relationship ids for the parts this sheet generates itself.\n *\n * Derived purely from the model so the worksheet XML and the sheet's rels part\n * — which are written by different code — cannot disagree about an id. Order is\n * fixed: drawing, then external hyperlinks in insertion order, then the\n * comments part and its legacy VML drawing.\n */\n generatedRels(): {\n drawing?: string;\n hyperlinks: Map<string, string>;\n comments?: string;\n vmlDrawing?: string;\n } {\n let next = this.#relIdBase();\n const result: {\n drawing?: string;\n hyperlinks: Map<string, string>;\n comments?: string;\n vmlDrawing?: string;\n } = { hyperlinks: new Map() };\n\n if (this.hasDrawings) result.drawing = `rId${++next}`;\n for (const link of this.#hyperlinks.values()) {\n // Only external destinations need a relationship; in-workbook links carry\n // their destination inline as `location`.\n if (link.target) result.hyperlinks.set(link.ref, `rId${++next}`);\n }\n if (this.ownsCommentParts) {\n result.comments = `rId${++next}`;\n result.vmlDrawing = `rId${++next}`;\n }\n return result;\n }\n\n /**\n * Preserved leaf elements that will actually be emitted. A sheet may only have\n * one `<drawing>`, so live providers suppress a preserved one — every consumer\n * (serialisation, relationships, pruning) must agree on that, hence one helper.\n */\n #activeTail(): PreservedTailElement[] {\n return this.#preservedTail.filter(t => {\n if (t.tag === 'drawing') return !this.hasDrawings;\n // Once this sheet writes its own comment VML, the preserved legacyDrawing\n // would be a second one — and a sheet may only carry one.\n if (t.tag === 'legacyDrawing') return !this.commentPartsReplaced;\n return true;\n });\n }\n\n /** @internal Captures round-trip state from the source package. */\n loadPreservedState(worksheetXml: string, relationships: readonly Relationship[]): void {\n this.#touch();\n // Hyperlink relationships are consumed into the model, so they must not also\n // be re-emitted verbatim — that would duplicate them with new ids.\n this.#preservedRels = relationships.filter(r => r.type !== REL_TYPES.hyperlink);\n\n // Only keep leaf elements whose relationship actually resolved — a dangling\n // r:id would make Excel treat the file as corrupt.\n const known = new Set(this.#preservedRels.map(r => r.id));\n this.#preservedTail = parseTailElements(worksheetXml).filter(t => known.has(t.relId));\n\n // Resolve each hyperlink's r:id to the external target it points at.\n const byId = new Map(relationships.map(r => [r.id, r]));\n for (const [ref, relId] of this.#pendingHyperlinkRels) {\n const rel = byId.get(relId);\n const link = this.#hyperlinks.get(ref);\n if (!rel || !link) continue;\n this.#hyperlinks.set(ref, { ...link, target: rel.target });\n }\n this.#pendingHyperlinkRels.clear();\n\n // A hyperlink with neither a resolved target nor a location points nowhere.\n for (const [ref, link] of [...this.#hyperlinks]) {\n if (!link.target && !link.location) this.#hyperlinks.delete(ref);\n }\n }\n\n /**\n * @internal Package paths of the comment parts this sheet read at load time.\n * The save pipeline drops them from the preserved set once the sheet takes\n * ownership, so they are not written twice.\n */\n commentPartPaths(): string[] {\n const paths: string[] = [];\n for (const rel of this.#preservedRels) {\n if (!rel.resolved) continue;\n if (rel.type === REL_TYPES.comments || rel.type === REL_TYPES.vmlDrawing) {\n paths.push(rel.resolved);\n }\n }\n return paths;\n }\n\n /**\n * @internal The relationship pointing at this sheet's comments part, if the\n * sheet was loaded from a file that had one.\n */\n commentsPartPath(): string | undefined {\n return this.#preservedRels.find(r => r.type === REL_TYPES.comments)?.resolved;\n }\n\n // ── XML serialisation ──────────────────────────────────────────────────────\n\n /** Builds the xl/worksheets/sheetN.xml string. */\n buildXml(): string {\n // Reused while the sheet is unchanged. A save rebuilds the whole package, so\n // an editor autosaving after a one-cell edit was re-serialising every sheet\n // in the workbook; this makes it re-serialise the one that changed.\n //\n // Safe because this method is a pure function of the sheet's own state:\n // everything below reads only this sheet's fields, and cell XML carries\n // *indices* into the shared string and style tables, so changes over there\n // cannot alter it. The mutation counter it keys on covers every public\n // mutator (see worksheet-version.test.ts).\n const memo = this.#xmlMemo;\n if (memo && memo.at === this.#version.v) return memo.xml;\n\n const rels = this.generatedRels();\n const sheetViewXml = this.#buildSheetViewXml();\n const colsXml = this.#buildColsXml();\n const sheetDataXml = this.#buildSheetDataXml();\n const protectionXml = this.#buildSheetProtectionXml();\n const filterXml = this.#autoFilter ? `<autoFilter ref=\"${this.#autoFilter.ref}\"/>` : '';\n const mergeXml = this.#buildMergeCellsXml();\n const validXml = this.#buildDataValidationsXml();\n const linksXml = this.#buildHyperlinksXml(rels.hyperlinks);\n const tailXml = this.#buildTailXml(rels);\n\n // Child order follows the CT_Worksheet sequence; Excel rejects a worksheet\n // whose children are out of order.\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\n <sheetViews>${sheetViewXml}</sheetViews>\n${colsXml}${sheetDataXml}${protectionXml}${filterXml}${mergeXml}${validXml}${linksXml}${tailXml}\n</worksheet>`;\n this.#xmlMemo = { at: this.#version.v, xml };\n return xml;\n }\n\n /**\n * The relationship-bearing leaf elements, in schema order: `drawing`,\n * `legacyDrawing`, `legacyDrawingHF`, `picture`. A sheet may hold only one of\n * each, so generated content replaces the preserved element of the same tag —\n * live drawing providers replace a preserved `<drawing>`, and comments this\n * sheet now owns replace a preserved `<legacyDrawing>`.\n */\n #buildTailXml(rels: ReturnType<Worksheet['generatedRels']>): string {\n const preserved = this.#activeTail();\n const byTag = (tag: string): string =>\n preserved.filter(t => t.tag === tag).map(t => t.xml).join('');\n\n const drawing = rels.drawing\n ? `<drawing r:id=\"${rels.drawing}\"/>`\n : byTag('drawing');\n const legacy = rels.vmlDrawing\n ? `<legacyDrawing r:id=\"${rels.vmlDrawing}\"/>`\n : byTag('legacyDrawing');\n\n return drawing + legacy + byTag('legacyDrawingHF') + byTag('picture');\n }\n\n #buildSheetProtectionXml(): string {\n if (!this.#protection) return '';\n let attrs = ' sheet=\"1\"';\n for (const [key, attr] of PROTECTION_ATTRS) {\n // The OOXML attribute states what is *blocked*, so it is the negation of\n // the permission, and it is only written when it differs from the default.\n const blocked = !this.#protection[key];\n const defaultBlocked = !PROTECTION_DEFAULTS[key];\n if (blocked !== defaultBlocked) attrs += ` ${attr}=\"${blocked ? 1 : 0}\"`;\n }\n return `<sheetProtection${this.#protectionCredentials}${attrs}/>`;\n }\n\n #buildHyperlinksXml(relIds: ReadonlyMap<string, string>): string {\n if (this.#hyperlinks.size === 0) return '';\n const inner = [...this.#hyperlinks.values()].map(link => {\n const relId = relIds.get(link.ref);\n const parts = [`ref=\"${link.ref}\"`];\n if (relId) parts.push(`r:id=\"${relId}\"`);\n if (link.location) parts.push(`location=\"${escXmlAttr(link.location)}\"`);\n if (link.display) parts.push(`display=\"${escXmlAttr(link.display)}\"`);\n if (link.tooltip) parts.push(`tooltip=\"${escXmlAttr(link.tooltip)}\"`);\n return `<hyperlink ${parts.join(' ')}/>`;\n }).join('');\n return `<hyperlinks>${inner}</hyperlinks>`;\n }\n\n /**\n * Materialises the formula of every shared-formula instance cell.\n *\n * Excel writes a fill-down once: the group's master carries the text, the rest\n * carry `<f t=\"shared\" si=\"n\"/>` and are understood to hold the master's\n * formula with its relative references moved by the offset between the cells.\n * Read literally — the way this used to be read — an instance cell has no\n * formula at all, and the next save turns it into the constant that happened to\n * be cached in `<v>`. On a real workbook that is tens of thousands of formulas\n * quietly replaced by numbers.\n *\n * Each cell ends up owning its own text, so nothing downstream (evaluation,\n * structural edits, serialisation) needs to know the group ever existed.\n */\n #resolveSharedFormulas(\n masters: ReadonlyMap<number, { formula: string; ref: string }>,\n instances: readonly CellData[],\n ): void {\n if (instances.length === 0) return;\n\n for (const cd of instances) {\n const master = masters.get(cd.sharedIndex!);\n // An instance whose master is missing is a broken file; leaving the cell\n // formula-less keeps its cached value rather than inventing a formula.\n if (!master) continue;\n\n const from = parseCellRef(master.ref);\n const to = parseCellRef(cd.reference);\n cd.formula = translateFormulaRefs(\n master.formula,\n to.row - from.row,\n to.column - from.column,\n ).text;\n }\n }\n\n /** Parses xl/worksheets/sheetN.xml and loads cells into memory. */\n loadFromXml(xml: string): void {\n this.#touch();\n this.#rows.clear();\n this.#cols = [];\n this.#mergeCells = [];\n this.#pane = undefined;\n this.#autoFilter = undefined;\n this.#dataValidations = [];\n this.#protection = undefined;\n this.#protectionCredentials = '';\n this.#hyperlinks.clear();\n this.#pendingHyperlinkRels.clear();\n\n const root = parseXml(xml);\n\n // Columns\n for (const colEl of getElementsByTagName(root, 'col')) {\n const widthAttr = getAttr(colEl, 'width');\n this.#cols.push({\n min: parseInt(getAttr(colEl, 'min') ?? '1', 10),\n max: parseInt(getAttr(colEl, 'max') ?? '1', 10),\n width: widthAttr !== undefined ? parseFloat(widthAttr) : undefined,\n customWidth: getAttr(colEl, 'customWidth') === '1',\n hidden: getAttr(colEl, 'hidden') === '1',\n });\n }\n\n // Sheet data (rows and cells). Shared formulas are collected as we go and\n // resolved once every row has been read — see #resolveSharedFormulas.\n const sharedMasters = new Map<number, { formula: string; ref: string }>();\n const sharedInstances: CellData[] = [];\n\n for (const rowEl of getElementsByTagName(root, 'row')) {\n const rowIndex = parseInt(getAttr(rowEl, 'r') ?? '0', 10);\n if (rowIndex < 1) continue;\n\n const rowData: RowData = { rowIndex, cells: new Map() };\n\n const ht = getAttr(rowEl, 'ht');\n if (ht) { rowData.height = parseFloat(ht); rowData.customHeight = true; }\n if (getAttr(rowEl, 'hidden') === '1') rowData.hidden = true;\n\n for (const cellEl of rowEl.children) {\n const tag = cellEl.tagName.replace(/^.*:/, '');\n if (tag !== 'c') continue;\n const ref = getAttr(cellEl, 'r');\n if (!ref) continue;\n const cellData = Cell.fromXmlElement(\n { attributes: cellEl.attributes, children: cellEl.children as Parameters<typeof Cell.fromXmlElement>[0]['children'] },\n ref.toUpperCase(),\n );\n rowData.cells.set(ref.toUpperCase(), cellData);\n\n // Shared-formula bookkeeping. The master of a group holds the only copy\n // of the text; its instances hold `si` and nothing else, so they have to\n // wait until the whole sheet is read (the master is normally first, but\n // nothing in the format guarantees it).\n if (cellData.sharedIndex !== undefined) {\n if (cellData.formula !== undefined) {\n sharedMasters.set(cellData.sharedIndex, { formula: cellData.formula, ref: cellData.reference });\n } else {\n sharedInstances.push(cellData);\n }\n }\n }\n\n this.#rows.set(rowIndex, rowData);\n }\n\n this.#resolveSharedFormulas(sharedMasters, sharedInstances);\n\n // Merge cells\n for (const mcEl of getElementsByTagName(root, 'mergeCell')) {\n const ref = getAttr(mcEl, 'ref');\n if (ref) this.#mergeCells.push({ ref });\n }\n\n // Auto filter\n const afEls = getElementsByTagName(root, 'autoFilter');\n if (afEls.length > 0) {\n const ref = getAttr(afEls[0]!, 'ref');\n if (ref) this.#autoFilter = { ref };\n }\n\n // Freeze pane\n for (const paneEl of getElementsByTagName(root, 'pane')) {\n const state = getAttr(paneEl, 'state');\n if (state === 'frozen' || state === 'frozenSplit') {\n this.#pane = {\n row: parseInt(getAttr(paneEl, 'ySplit') ?? '0', 10),\n column: parseInt(getAttr(paneEl, 'xSplit') ?? '0', 10),\n };\n }\n }\n\n // Data validations\n for (const dvEl of getElementsByTagName(root, 'dataValidation')) {\n const sqref = getAttr(dvEl, 'sqref') ?? '';\n const f1Els = getElementsByTagName(dvEl, 'formula1');\n const formula = f1Els[0]?.textContent ?? '';\n if (sqref && formula) this.#dataValidations.push({ sqref, formula });\n }\n\n // Sheet protection\n const protEl = getElementsByTagName(root, 'sheetProtection')[0];\n if (protEl && getAttr(protEl, 'sheet') === '1') {\n const protection = { ...PROTECTION_DEFAULTS };\n for (const [key, attr] of PROTECTION_ATTRS) {\n const raw = getAttr(protEl, attr);\n // The attribute says what is blocked; absent means the schema default.\n if (raw !== undefined) protection[key] = raw !== '1';\n }\n this.#protection = protection;\n\n // Carry any password/hash attributes through untouched.\n let credentials = '';\n for (const attr of ['password', 'algorithmName', 'hashValue', 'saltValue', 'spinCount']) {\n const raw = getAttr(protEl, attr);\n if (raw !== undefined) credentials += ` ${attr}=\"${escXmlAttr(raw)}\"`;\n }\n this.#protectionCredentials = credentials;\n }\n\n // Hyperlinks. External targets live in the sheet's rels part, so the r:id is\n // held for loadPreservedState to resolve.\n for (const hlEl of getElementsByTagName(root, 'hyperlink')) {\n const ref = getAttr(hlEl, 'ref');\n if (!ref) continue;\n const normalized = normalizeRangeRef(ref);\n this.#hyperlinks.set(normalized, {\n ref: normalized,\n location: getAttr(hlEl, 'location'),\n display: getAttr(hlEl, 'display'),\n tooltip: getAttr(hlEl, 'tooltip'),\n });\n const relId = getAttr(hlEl, 'r:id') ?? getAttr(hlEl, 'id');\n if (relId) this.#pendingHyperlinkRels.set(normalized, relId);\n }\n }\n\n /** @internal Parses an `xl/comments*.xml` part into this sheet's comments. */\n loadCommentsXml(xml: string): void {\n this.#touch();\n const root = parseXml(xml);\n const authors = getElementsByTagName(root, 'author').map(a => a.textContent);\n\n for (const cEl of getElementsByTagName(root, 'comment')) {\n const ref = getAttr(cEl, 'ref');\n if (!ref) continue;\n const authorId = parseInt(getAttr(cEl, 'authorId') ?? '0', 10);\n // The text is rich text: concatenate the runs, ignoring their formatting.\n const text = getElementsByTagName(cEl, 't').map(t => t.textContent).join('');\n const normalized = normalizeRef(ref);\n this.#comments.set(normalized, {\n ref: normalized,\n text,\n author: authors[authorId] ?? '',\n });\n }\n // Loading is not a modification: the original parts stay authoritative.\n this.#commentsDirty = false;\n }\n\n /** @internal The comments part content, when this sheet owns it. */\n buildCommentsXml(): string {\n const authors = [...new Set([...this.#comments.values()].map(c => c.author))];\n const authorsXml = authors.map(a => `<author>${escXml(a)}</author>`).join('');\n const listXml = [...this.#comments.values()].map(c =>\n `<comment ref=\"${c.ref}\" authorId=\"${authors.indexOf(c.author)}\"><text><r><t xml:space=\"preserve\">${escXml(c.text)}</t></r></text></comment>`,\n ).join('');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><authors>${authorsXml}</authors><commentList>${listXml}</commentList></comments>`;\n }\n\n /**\n * @internal The legacy VML drawing that positions the comment boxes. Excel\n * needs it to draw the note indicator and popup; the comments part alone\n * carries only the text.\n */\n buildCommentsVml(): string {\n const shapes = [...this.#comments.values()].map((c, idx) => {\n const { row, column } = parseCellRef(c.ref);\n // Anchor: from/to (column, columnOffset, row, rowOffset) in 0-based cells.\n const anchor = `${column}, 15, ${row - 1}, 10, ${column + 2}, 15, ${row + 3}, 4`;\n return `<v:shape id=\"_x0000_s${1025 + idx}\" type=\"#_x0000_t202\" style=\"position:absolute;margin-left:60pt;margin-top:5pt;width:108pt;height:60pt;z-index:${idx + 1};visibility:hidden\" fillcolor=\"#ffffe1\" o:insetmode=\"auto\">`\n + `<v:fill color2=\"#ffffe1\"/><v:shadow on=\"t\" color=\"black\" obscured=\"t\"/><v:path o:connecttype=\"none\"/>`\n + `<v:textbox style=\"mso-direction-alt:auto\"><div style=\"text-align:left\"/></v:textbox>`\n + `<x:ClientData ObjectType=\"Note\"><x:MoveWithCells/><x:SizeWithCells/>`\n + `<x:Anchor>${anchor}</x:Anchor><x:AutoFill>False</x:AutoFill>`\n + `<x:Row>${row - 1}</x:Row><x:Column>${column - 1}</x:Column></x:ClientData></v:shape>`;\n }).join('');\n\n return `<xml xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\">`\n + `<o:shapelayout v:ext=\"edit\"><o:idmap v:ext=\"edit\" data=\"1\"/></o:shapelayout>`\n + `<v:shapetype id=\"_x0000_t202\" coordsize=\"21600,21600\" o:spt=\"202\" path=\"m,l,21600r21600,l21600,xe\">`\n + `<v:stroke joinstyle=\"miter\"/><v:path gradientshapeok=\"t\" o:connecttype=\"rect\"/></v:shapetype>`\n + `${shapes}</xml>`;\n }\n\n // ── Private XML builders ───────────────────────────────────────────────────\n\n #buildColsXml(): string {\n if (this.#cols.length === 0) return '';\n const inner = this.#cols\n .map(c => {\n const width = c.width !== undefined\n ? ` width=\"${c.width.toFixed(2)}\" customWidth=\"${c.customWidth ? 1 : 0}\"`\n : '';\n const hidden = c.hidden ? ' hidden=\"1\"' : '';\n return `<col min=\"${c.min}\" max=\"${c.max}\"${width}${hidden}/>`;\n })\n .join('');\n return `<cols>${inner}</cols>`;\n }\n\n #buildSheetDataXml(): string {\n const sortedRows = [...this.#rows.values()].sort((a, b) => a.rowIndex - b.rowIndex);\n if (sortedRows.length === 0) return '<sheetData/>';\n\n const rowsXml = sortedRows.map(row => {\n const ht = row.height !== undefined && row.customHeight\n ? ` ht=\"${row.height}\" customHeight=\"1\"`\n : '';\n const hidden = row.hidden ? ' hidden=\"1\"' : '';\n\n // Decorate-sort-undecorate: parsing inside the comparator would re-parse\n // each reference O(log n) times.\n const sortedCells = [...row.cells.values()]\n .map(cd => ({ cd, col: columnFromRef(cd.reference, refSplit(cd.reference)) }))\n .sort((a, b) => a.col - b.col);\n\n const cellsXml = sortedCells\n .map(({ cd }) => buildCellXml(cd))\n .filter(Boolean)\n .join('');\n\n if (!cellsXml && !ht && !hidden) return '';\n return `<row r=\"${row.rowIndex}\"${ht}${hidden}>${cellsXml}</row>`;\n }).filter(Boolean).join('');\n\n return `<sheetData>${rowsXml}</sheetData>`;\n }\n\n #buildMergeCellsXml(): string {\n if (this.#mergeCells.length === 0) return '';\n const inner = this.#mergeCells.map(m => `<mergeCell ref=\"${m.ref}\"/>`).join('');\n return `<mergeCells count=\"${this.#mergeCells.length}\">${inner}</mergeCells>`;\n }\n\n #buildDataValidationsXml(): string {\n if (this.#dataValidations.length === 0) return '';\n const inner = this.#dataValidations\n .map(dv =>\n `<dataValidation type=\"list\" allowBlank=\"1\" showInputMessage=\"1\" showErrorMessage=\"1\" sqref=\"${dv.sqref}\"><formula1>${escXml(dv.formula)}</formula1></dataValidation>`,\n )\n .join('');\n return `<dataValidations count=\"${this.#dataValidations.length}\">${inner}</dataValidations>`;\n }\n\n #buildSheetViewXml(): string {\n if (!this.#pane) return '<sheetView workbookViewId=\"0\"/>';\n\n const { row, column } = this.#pane;\n const topLeftRow = row > 0 ? row + 1 : 1;\n const topLeftCol = column > 0 ? column + 1 : 1;\n const topLeft = cellRefFromRowCol(topLeftRow, topLeftCol);\n\n const activePane = row > 0 && column > 0 ? 'bottomRight'\n : row > 0 ? 'bottomLeft' : 'topRight';\n\n const xSplit = column > 0 ? ` xSplit=\"${column}\"` : '';\n const ySplit = row > 0 ? ` ySplit=\"${row}\"` : '';\n\n return `<sheetView workbookViewId=\"0\"><pane${xSplit}${ySplit} topLeftCell=\"${topLeft}\" activePane=\"${activePane}\" state=\"frozen\"/></sheetView>`;\n }\n\n /**\n * Returns the single-column ColDef covering `columnIndex`, splitting a wider\n * span into up to three pieces so the other columns keep their width/hidden\n * state. Returns undefined when no definition covers the column.\n */\n #splitColSpan(columnIndex: number): ColDef | undefined {\n const idx = this.#findColDefIndex(columnIndex);\n if (idx === -1) return undefined;\n const span = this.#cols[idx]!;\n if (span.min === span.max) return span;\n\n const pieces: ColDef[] = [];\n if (span.min < columnIndex) pieces.push({ ...span, max: columnIndex - 1 });\n const target: ColDef = { ...span, min: columnIndex, max: columnIndex };\n pieces.push(target);\n if (span.max > columnIndex) pieces.push({ ...span, min: columnIndex + 1 });\n this.#cols.splice(idx, 1, ...pieces);\n return target;\n }\n\n /**\n * Inserts a definition keeping `#cols` sorted by `min`. Binary insertion,\n * because re-sorting the whole array per call makes setting widths for every\n * column of a wide sheet quadratic.\n */\n #insertColDef(def: ColDef): ColDef {\n let lo = 0;\n let hi = this.#cols.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (this.#cols[mid]!.min < def.min) lo = mid + 1;\n else hi = mid;\n }\n this.#cols.splice(lo, 0, def);\n return def;\n }\n\n /** Index of the definition covering `columnIndex`, or -1. Binary search. */\n #findColDefIndex(columnIndex: number): number {\n let lo = 0;\n let hi = this.#cols.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const c = this.#cols[mid]!;\n if (columnIndex < c.min) hi = mid - 1;\n else if (columnIndex > c.max) lo = mid + 1;\n else return mid;\n }\n return -1;\n }\n\n #findColDef(columnIndex: number): ColDef | undefined {\n const idx = this.#findColDefIndex(columnIndex);\n return idx === -1 ? undefined : this.#cols[idx];\n }\n\n /** Drops definitions that no longer carry any information. */\n #pruneColDefs(): void {\n this.#cols = this.#cols.filter(c => c.width !== undefined || c.customWidth || c.hidden);\n }\n\n #getOrCreateRow(rowIndex: number): RowData {\n let row = this.#rows.get(rowIndex);\n if (!row) {\n row = { rowIndex, cells: new Map() };\n this.#rows.set(rowIndex, row);\n }\n return row;\n }\n}\n\nconst RID_PATTERN = /^rId(\\d+)$/;\n\nfunction escXml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/** Escapes text for use inside a double-quoted XML attribute. */\nfunction escXmlAttr(s: string): string {\n return escXml(s).replace(/\"/g, '&quot;');\n}\n\nfunction normalizeRef(ref: string): string {\n const normalized = normalizeRefFast(ref);\n parseCellRef(normalized); // validates\n return normalized;\n}\n\n/** Normalises a single cell ref or an \"A1:B2\" range ref, validating both ends. */\nfunction normalizeRangeRef(ref: string): string {\n const normalized = normalizeRefFast(ref);\n const colon = normalized.indexOf(':');\n if (colon === -1) {\n parseCellRef(normalized);\n return normalized;\n }\n parseCellRef(normalized.slice(0, colon));\n parseCellRef(normalized.slice(colon + 1));\n return normalized;\n}\n\n/**\n * Uppercases a reference and strips `$`, skipping both passes when the input is\n * already in canonical form — which is the overwhelmingly common case, and this\n * runs on every cell access.\n */\nfunction normalizeRefFast(ref: string): string {\n return ref.indexOf('$') === -1 ? upperFast(ref) : ref.replace(/\\$/g, '').toUpperCase();\n}\n\nfunction upperFast(s: string): string {\n for (let i = 0; i < s.length; i++) {\n const code = s.charCodeAt(i);\n if (code >= 97 && code <= 122) return s.toUpperCase();\n }\n return s;\n}\n\n/**\n * Number of leading column letters in a canonical A1 reference — i.e. the index\n * where the row digits start. Lets the hot paths slice a reference apart without\n * parsing it into numbers and formatting it back.\n */\nfunction refSplit(ref: string): number {\n let i = 0;\n while (i < ref.length) {\n const code = ref.charCodeAt(i);\n if (code < 65 || code > 90) break;\n i++;\n }\n return i;\n}\n\n/** Column number from the letters of a canonical A1 reference (no validation). */\nfunction columnFromRef(ref: string, split: number): number {\n let col = 0;\n for (let i = 0; i < split; i++) col = col * 26 + (ref.charCodeAt(i) - 64);\n return col;\n}\n\n/** Translates an \"A1\" / \"A1:B3\" ref by a row/column delta, or drops it when out of bounds. */\nfunction translateRangeRef(ref: string, deltaRow: number, deltaCol: number): string | undefined {\n const parts = ref.split(':').map(p => {\n const { row, column } = parseCellRef(p);\n const r = row + deltaRow;\n const c = column + deltaCol;\n if (r < 1 || c < 1 || r > EXCEL_MAX_ROWS || c > EXCEL_MAX_COLUMNS) return null;\n return cellRefFromRowCol(r, c);\n });\n if (parts.some(p => p === null)) return undefined;\n return parts.join(':');\n}\n","/**\n * Defined names (named ranges) for a workbook.\n *\n * A defined name maps an identifier (e.g. \"TaxRate\", \"SalesData\") to a\n * refers-to expression (e.g. \"Sheet1!$A$1\", \"Sheet1!$A$1:$B$10\", \"0.2*100\").\n * Names may be workbook-global or scoped to a single worksheet.\n *\n * This module only models and stores the data (and serialises it to OOXML).\n * Resolution/evaluation of the refers-to expression is the responsibility of\n * the formula engine (@devmm/puredocs-excel-formula), which reads names through\n * Workbook.getDefinedName().\n */\n\n/** A single defined name. */\nexport interface DefinedName {\n /** The name identifier. Case-insensitive when resolved. */\n readonly name: string;\n /** The refers-to expression, WITHOUT a leading '='. */\n readonly refersTo: string;\n /**\n * Worksheet name this name is scoped to, or undefined for a workbook-global\n * name. Excel resolves a sheet-scoped name ahead of a global name of the\n * same identifier when a formula on that sheet references it.\n */\n readonly scope?: string;\n}\n\n/**\n * In-memory store for a workbook's defined names, with Excel scoping semantics.\n * Kept separate from Workbook so the storage rules live in one place.\n */\nexport class DefinedNameManager {\n readonly #names: DefinedName[] = [];\n\n /** All defined names, in insertion order. */\n get all(): readonly DefinedName[] {\n return this.#names;\n }\n\n get size(): number {\n return this.#names.length;\n }\n\n /**\n * Adds or replaces a defined name. A name is uniquely identified by the pair\n * (identifier, scope): the same identifier may exist once globally and once\n * per worksheet. The leading '=' of refersTo is stripped.\n */\n define(name: string, refersTo: string, scope?: string): void {\n if (!name) throw new Error('Defined name cannot be empty.');\n if (!refersTo) throw new Error('Defined name refersTo cannot be empty.');\n const cleaned = refersTo.startsWith('=') ? refersTo.slice(1) : refersTo;\n\n const idx = this.#indexOf(name, scope);\n const entry: DefinedName = { name, refersTo: cleaned, scope };\n if (idx >= 0) this.#names[idx] = entry;\n else this.#names.push(entry);\n }\n\n /** Removes a defined name by identifier and scope. Returns true if removed. */\n remove(name: string, scope?: string): boolean {\n const idx = this.#indexOf(name, scope);\n if (idx < 0) return false;\n this.#names.splice(idx, 1);\n return true;\n }\n\n /**\n * Resolves a name to its refers-to expression following Excel scoping:\n * a name scoped to `sheetName` takes precedence over the workbook-global\n * name of the same identifier. Returns undefined if no name matches.\n */\n resolve(name: string, sheetName?: string): string | undefined {\n const key = name.toUpperCase();\n if (sheetName) {\n const local = this.#names.find(\n n => n.name.toUpperCase() === key && n.scope?.toUpperCase() === sheetName.toUpperCase(),\n );\n if (local) return local.refersTo;\n }\n const global = this.#names.find(n => n.name.toUpperCase() === key && n.scope === undefined);\n return global?.refersTo;\n }\n\n #indexOf(name: string, scope?: string): number {\n const key = name.toUpperCase();\n const scopeKey = scope?.toUpperCase();\n return this.#names.findIndex(\n n => n.name.toUpperCase() === key && (n.scope?.toUpperCase()) === scopeKey,\n );\n }\n}\n","/**\n * Main entry point for the @devmm/puredocs-excel library.\n * Port of TVE.PureDocs.Excel.Workbook (C#)\n *\n * Key differences from C#:\n * - All factory methods are async (file I/O)\n * - saveAsBuffer() returns Uint8Array instead of MemoryStream\n * - saveToFile() is Node.js only\n * - No IDisposable — call close() or use Symbol.dispose\n * - WorksheetCollection replaced by a simple managed array\n */\nimport { unzipXlsx, readXmlEntry, requireXmlEntry } from '../io/zip-reader.js';\nimport {\n zipXlsxCached,\n zipXlsxCachedAsync,\n createDeflateCache,\n type DeflateCache,\n type ZipInput,\n} from '../io/zip-writer.js';\nimport {\n buildContentTypes,\n ROOT_RELS,\n buildWorkbookRels,\n buildWorkbookXml,\n buildSharedStringsXml,\n DEFAULT_STYLES_XML,\n EMPTY_WORKSHEET_XML,\n type SheetMeta,\n type DefinedNameMeta,\n} from '../io/ooxml-templates.js';\nimport { parseXml, getElementsByTagName, getAttr } from '../io/xml-parser.js';\nimport { REL_TYPES, CONTENT_TYPES, escapeXml } from '../io/xml-builder.js';\nimport {\n buildDrawingXml,\n buildRelsXml,\n WORKSHEET_DRAWING_REL_ID,\n} from '../io/drawing-part.js';\nimport {\n collectPreservedParts,\n collectSubtree,\n parseContentTypes,\n parseRelationships,\n type ContentTypeDeclarations,\n type Relationship,\n} from '../io/preserved-parts.js';\nimport { SharedStringManager } from './shared-string-manager.js';\nimport { StyleManager } from '../style/style-manager.js';\nimport { Worksheet, type StructuralEditResult } from './worksheet.js';\nimport { type RefShift } from './ref-shift.js';\nimport { shiftFormulaRefs } from './formula-ref-shift.js';\nimport { DefinedNameManager, type DefinedName } from './defined-name.js';\n\ninterface SheetEntry {\n worksheet: Worksheet;\n sheetId: number;\n relId: string; // e.g. \"rId1\"\n}\n\nexport class Workbook {\n readonly #sharedStrings: SharedStringManager;\n readonly #styles: StyleManager;\n readonly #sheets: SheetEntry[] = [];\n readonly #definedNames = new DefinedNameManager();\n #closed = false;\n\n /**\n * The calculation order Excel stored in `xl/calcChain.xml`, in file order, or\n * undefined when the source had no such part. Read-only to consumers: it is a\n * record of what the source file said, not a live view of the model.\n */\n #calcChain?: Array<{ sheet: string; ref: string }>;\n /**\n * Fingerprint of the sheet set taken right after the calc chain was parsed.\n * The chain is only written back out when this still matches — see\n * {@link #calcChainStillValid}.\n */\n #calcChainFingerprint?: string;\n\n /**\n * Compressed form of each package part from the last save. Compression is where\n * a save spends its time, and an autosave changes one part, so the rest are\n * reused verbatim. Keyed on content, so a part rebuilt identically still hits.\n */\n readonly #deflateCache: DeflateCache = createDeflateCache();\n\n /** Parts carried over verbatim from the file this workbook was opened from. */\n #preservedParts: Map<string, Uint8Array> = new Map();\n #preservedContentTypes?: ContentTypeDeclarations;\n /** Preserved targets whose referring worksheet has been removed. */\n readonly #orphanedTargets: string[] = [];\n\n private constructor(\n sharedStrings: SharedStringManager,\n styles: StyleManager,\n ) {\n this.#sharedStrings = sharedStrings;\n this.#styles = styles;\n }\n\n // ── Factory methods ────────────────────────────────────────────────────────\n\n /**\n * Creates a new empty workbook.\n * Mirrors Workbook.Create() in C#.\n */\n static create(): Workbook {\n const ss = new SharedStringManager();\n const sm = new StyleManager();\n return new Workbook(ss, sm);\n }\n\n /**\n * Opens an existing workbook from a binary buffer (ArrayBuffer or Uint8Array).\n * Works in both browser and Node.js.\n * Mirrors Workbook.Open(stream) in C#.\n */\n static fromBuffer(buffer: ArrayBuffer | Uint8Array): Workbook {\n const entries = unzipXlsx(buffer);\n const ss = new SharedStringManager();\n const sm = new StyleManager();\n const wb = new Workbook(ss, sm);\n\n // Load shared strings\n const ssXml = readXmlEntry(entries, 'xl/sharedStrings.xml');\n if (ssXml) ss.loadFromXml(ssXml);\n\n // Load styles\n const stylesXml = readXmlEntry(entries, 'xl/styles.xml');\n if (stylesXml) sm.loadFromXml(stylesXml);\n\n // Parse workbook.xml to get sheet names and relationship IDs\n const wbXml = requireXmlEntry(entries, 'xl/workbook.xml');\n const wbRoot = parseXml(wbXml);\n\n for (const sheetEl of getElementsByTagName(wbRoot, 'sheet')) {\n const name = getAttr(sheetEl, 'name') ?? 'Sheet';\n const sheetId = parseInt(getAttr(sheetEl, 'sheetId') ?? '1', 10);\n const relId = getAttr(sheetEl, 'r:id') ?? getAttr(sheetEl, 'id') ?? `rId${sheetId}`;\n const state = getAttr(sheetEl, 'state') as Worksheet['visibility'] | undefined;\n\n // Find worksheet XML path from workbook rels\n const relXml = readXmlEntry(entries, 'xl/_rels/workbook.xml.rels') ?? '';\n const wsPath = resolveWorksheetPath(relXml, relId);\n const wsXml = wsPath ? (readXmlEntry(entries, wsPath) ?? EMPTY_WORKSHEET_XML) : EMPTY_WORKSHEET_XML;\n\n const ws = new Worksheet(name, ss, sm);\n if (state) ws.setVisibility(state);\n ws.loadFromXml(wsXml);\n\n // Round-trip state: the sheet's own relationships (drawings, images,\n // legacy comment anchors) and the leaf elements referencing them.\n if (wsPath) {\n const dir = wsPath.slice(0, wsPath.lastIndexOf('/'));\n const file = wsPath.slice(wsPath.lastIndexOf('/') + 1);\n const wsRelsXml = readXmlEntry(entries, `${dir}/_rels/${file}.rels`);\n if (wsRelsXml) {\n ws.loadPreservedState(wsXml, parseRelationships(wsRelsXml, wsPath));\n\n // Comments live in their own part; read them so getComment() works on\n // a loaded file. The part stays preserved until the sheet's comments\n // are modified, at which point the sheet regenerates it.\n const commentsPath = ws.commentsPartPath();\n if (commentsPath) {\n const commentsXml = readXmlEntry(entries, commentsPath);\n if (commentsXml) ws.loadCommentsXml(commentsXml);\n }\n }\n }\n\n wb.#sheets.push({ worksheet: ws, sheetId, relId });\n }\n\n // Excel's stored calculation order. Parsed (rather than passed through) for\n // two reasons: consumers want to read it, and passing it through while\n // anything about the sheet set changed would leave entries pointing at the\n // wrong sheet or at cells that no longer hold formulas.\n const calcChainXml = readXmlEntry(entries, CALC_CHAIN_PATH);\n if (calcChainXml) {\n wb.#calcChain = parseCalcChain(calcChainXml, wb.#sheets);\n wb.#calcChainFingerprint = wb.#sheetFingerprint();\n }\n\n // Parts core never parses (drawings, images, themes, pivot caches, docProps)\n // are carried over verbatim so open→save does not silently drop them.\n wb.#preservedParts = collectPreservedParts(entries);\n const ctXml = readXmlEntry(entries, '[Content_Types].xml');\n if (ctXml) wb.#preservedContentTypes = parseContentTypes(ctXml);\n\n // Defined names (named ranges). Parsed after sheets so localSheetId can be\n // mapped to a worksheet name by document-order index.\n for (const dn of getElementsByTagName(wbRoot, 'definedName')) {\n const name = getAttr(dn, 'name');\n if (!name) continue;\n const refersTo = dn.textContent.trim();\n if (!refersTo) continue;\n const localSheetId = getAttr(dn, 'localSheetId');\n let scope: string | undefined;\n if (localSheetId !== undefined) {\n const idx = parseInt(localSheetId, 10);\n scope = wb.#sheets[idx]?.worksheet.name;\n }\n wb.#definedNames.define(name, refersTo, scope);\n }\n\n return wb;\n }\n\n /**\n * Opens an existing workbook from a file path (Node.js only).\n * Mirrors Workbook.Open(filePath) in C#.\n */\n static async fromFile(filePath: string): Promise<Workbook> {\n // Dynamic import so the library doesn't break in browser environments\n const fs = await import('node:fs/promises');\n const buffer = await fs.readFile(filePath);\n return Workbook.fromBuffer(buffer);\n }\n\n // ── Worksheet management ───────────────────────────────────────────────────\n\n /**\n * Collection of worksheets (read-only array view).\n * Access by index: workbook.worksheets[0]\n * Access by name: workbook.worksheets.find(s => s.name === 'Sheet1')\n */\n get worksheets(): readonly Worksheet[] {\n return this.#sheets.map(e => e.worksheet);\n }\n\n /**\n * Adds a new worksheet with the given name and returns it.\n * Mirrors workbook.AddWorksheet(name) in C#.\n */\n addWorksheet(name: string): Worksheet {\n this.#assertOpen();\n if (!name) throw new Error('Worksheet name cannot be empty.');\n if (this.#sheets.some(e => e.worksheet.name === name)) {\n throw new Error(`Worksheet \"${name}\" already exists.`);\n }\n\n // One past the highest id in use, not the sheet count: ids are preserved\n // across open→save, so a file with ids 1,5,17 must not hand out 4 (free) or\n // 1 (taken) for a fourth sheet.\n const sheetId = this.#sheets.reduce((max, e) => Math.max(max, e.sheetId), 0) + 1;\n const relId = `rId${this.#sheets.length + 1}`;\n const ws = new Worksheet(name, this.#sharedStrings, this.#styles);\n this.#sheets.push({ worksheet: ws, sheetId, relId });\n return ws;\n }\n\n /**\n * Removes the worksheet with the given name, along with any defined names\n * scoped to it. Throws if the sheet does not exist or is the last remaining\n * one — a workbook must always keep at least one sheet.\n *\n * Sheet ids and relationship ids are re-derived from document order on save,\n * so the remaining sheets stay consistent after a removal.\n */\n removeWorksheet(name: string): void {\n this.#assertOpen();\n const idx = this.#sheets.findIndex(e => e.worksheet.name === name);\n if (idx < 0) throw new Error(`Worksheet \"${name}\" not found.`);\n if (this.#sheets.length === 1) {\n throw new Error('Cannot remove the last worksheet; a workbook must have at least one.');\n }\n\n // The sheet's preserved parts (drawing, images …) lose their only referrer\n // once it is gone. Record them now — after the splice nothing else knows\n // they existed, and they would ship as orphans.\n const removed = this.#sheets[idx]!.worksheet;\n for (const rel of removed.preservedRelationships) {\n if (rel.resolved) this.#orphanedTargets.push(rel.resolved);\n }\n\n this.#sheets.splice(idx, 1);\n\n // Drop names scoped to the removed sheet — they would otherwise serialise\n // with a localSheetId pointing at an unrelated worksheet.\n // Snapshot first: `all` exposes the live backing array.\n for (const dn of [...this.#definedNames.all]) {\n if (dn.scope === name) this.#definedNames.remove(dn.name, dn.scope);\n }\n }\n\n /**\n * Returns a worksheet by name. Throws if not found.\n */\n getWorksheet(name: string): Worksheet {\n const entry = this.#sheets.find(e => e.worksheet.name === name);\n if (!entry) throw new Error(`Worksheet \"${name}\" not found.`);\n return entry.worksheet;\n }\n\n // ── Structural editing (workbook-wide) ───────────────────────────────────────\n\n /**\n * Inserts rows on one sheet and keeps the whole workbook consistent:\n * formulas on OTHER sheets that reference the edited sheet, and defined\n * names, are rewritten too. Prefer this over `Worksheet.insertRows` in a\n * multi-sheet workbook.\n *\n * @returns The edited sheet's result; `refErrors` additionally includes\n * sheet-qualified refs (e.g. `\"Other!B2\"`) for affected formula\n * cells on other sheets.\n */\n insertRows(sheetName: string, at: number, count = 1): StructuralEditResult {\n return this.#structuralEdit(sheetName, 'row', 'insert', at, count);\n }\n\n /** Workbook-wide counterpart to `Worksheet.deleteRows`. See {@link insertRows}. */\n deleteRows(sheetName: string, at: number, count = 1): StructuralEditResult {\n return this.#structuralEdit(sheetName, 'row', 'delete', at, count);\n }\n\n /** Workbook-wide counterpart to `Worksheet.insertColumns`. See {@link insertRows}. */\n insertColumns(sheetName: string, at: number, count = 1): StructuralEditResult {\n return this.#structuralEdit(sheetName, 'col', 'insert', at, count);\n }\n\n /** Workbook-wide counterpart to `Worksheet.deleteColumns`. See {@link insertRows}. */\n deleteColumns(sheetName: string, at: number, count = 1): StructuralEditResult {\n return this.#structuralEdit(sheetName, 'col', 'delete', at, count);\n }\n\n #structuralEdit(\n sheetName: string,\n dim: 'row' | 'col',\n kind: 'insert' | 'delete',\n at: number,\n count: number,\n ): StructuralEditResult {\n this.#assertOpen();\n const target = this.getWorksheet(sheetName);\n\n const result = dim === 'row'\n ? (kind === 'insert' ? target.insertRows(at, count) : target.deleteRows(at, count))\n : (kind === 'insert' ? target.insertColumns(at, count) : target.deleteColumns(at, count));\n\n const shift: RefShift = { dim, kind, at, count, sheetName: target.name };\n const refErrors = [...result.refErrors];\n\n for (const ws of this.worksheets) {\n if (ws === target) continue;\n const external = ws.applyExternalShift(shift);\n for (const ref of external.refErrors) refErrors.push(`${ws.name}!${ref}`);\n }\n\n // Defined names: refers-to expressions are sheet-qualified formulas.\n for (const dn of [...this.#definedNames.all]) {\n const rewritten = shiftFormulaRefs(dn.refersTo, shift, dn.scope ?? '');\n if (rewritten.changed) this.#definedNames.define(dn.name, rewritten.text, dn.scope);\n }\n\n return { refErrors };\n }\n\n // ── Defined names (named ranges) ─────────────────────────────────────────────\n\n /**\n * Defines (or replaces) a named range.\n *\n * @param name The name identifier (case-insensitive when resolved).\n * @param refersTo The refers-to expression, e.g. \"Sheet1!$A$1:$B$10\". A\n * leading '=' is optional and stripped.\n * @param options `scope` restricts the name to a single worksheet; omit for\n * a workbook-global name.\n */\n defineName(name: string, refersTo: string, options?: { scope?: string }): void {\n this.#assertOpen();\n const scope = options?.scope;\n if (scope !== undefined && !this.#sheets.some(e => e.worksheet.name === scope)) {\n throw new Error(`Cannot scope defined name \"${name}\" to unknown worksheet \"${scope}\".`);\n }\n this.#definedNames.define(name, refersTo, scope);\n }\n\n /**\n * Resolves a defined name to its refers-to expression (without leading '=').\n * Follows Excel scoping: a name scoped to `sheetName` wins over the global\n * name of the same identifier. Returns undefined if no name matches.\n *\n * This is the seam the formula engine calls to resolve NamedRangeNode.\n */\n getDefinedName(name: string, sheetName?: string): string | undefined {\n return this.#definedNames.resolve(name, sheetName);\n }\n\n /** Removes a defined name. Returns true if a matching name was removed. */\n removeName(name: string, scope?: string): boolean {\n this.#assertOpen();\n return this.#definedNames.remove(name, scope);\n }\n\n /** All defined names in the workbook, in insertion order. */\n get definedNames(): readonly DefinedName[] {\n return this.#definedNames.all;\n }\n\n // ── Serialisation ──────────────────────────────────────────────────────────\n\n /**\n * Serialises the workbook to a Uint8Array (xlsx binary).\n * Mirrors workbook.SaveAs(stream) in C#.\n * Works in browser and Node.js.\n */\n saveAsBuffer(): Uint8Array {\n this.#assertOpen();\n const entries = this.#buildZipEntries();\n return zipXlsxCached(entries, this.#deflateCache);\n }\n\n /**\n * Same output as {@link saveAsBuffer}, without blocking the calling thread on\n * compression — for an editor that autosaves, this is the difference between a\n * visible stall on every save and none.\n *\n * The XML for sheets that have not changed since the last save is reused, so a\n * save after a one-cell edit re-serialises one sheet rather than all of them.\n * That reuse applies to the synchronous path too; only the compression differs.\n */\n async saveAsBufferAsync(): Promise<Uint8Array> {\n this.#assertOpen();\n const entries = this.#buildZipEntries();\n return zipXlsxCachedAsync(entries, this.#deflateCache);\n }\n\n /**\n * Saves the workbook to a file (Node.js only).\n * Mirrors workbook.SaveAs(filePath) in C#.\n */\n async saveToFile(filePath: string): Promise<void> {\n this.#assertOpen();\n // Already async, so there is no reason to compress on the caller's thread.\n const buffer = await this.saveAsBufferAsync();\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(filePath, buffer);\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────────────\n\n /** Releases resources. The workbook should not be used after this call. */\n close(): void { this.#closed = true; }\n\n /** Symbol.dispose support for `using` keyword (TypeScript 5.2+). */\n [Symbol.dispose](): void { this.close(); }\n\n // ── Calculation order ──────────────────────────────────────────────────────\n\n /**\n * The calculation order Excel recorded for this workbook, oldest-first as\n * stored in `xl/calcChain.xml`, or an empty array when the source file had\n * none (a freshly created workbook, or one saved by a tool that omits it).\n *\n * Excel has already done the topological sort that produced this order, so\n * evaluating in it avoids repeating that work. Treat it as a hint, not a\n * guarantee: it reflects the file as opened, and edits made since are not\n * reflected here.\n */\n get calcChain(): readonly { readonly sheet: string; readonly ref: string }[] {\n return this.#calcChain ?? EMPTY_CALC_CHAIN;\n }\n\n /**\n * Identity of the sheet set: names, durable ids and per-sheet mutation counts.\n * The calc chain is a statement about exactly this set — which cells hold\n * formulas, on which sheet, under which id — so any change to it invalidates\n * the chain wholesale.\n */\n #sheetFingerprint(): string {\n return this.#sheets\n .map(e => `${e.sheetId}:${e.worksheet.name}:${e.worksheet.version}`)\n .join('|');\n }\n\n /**\n * Whether the parsed calc chain may be written back out.\n *\n * Deliberately conservative: any edit at all (a value, a formula, a sheet\n * added or removed) and the chain is dropped instead of patched. An absent\n * calcChain is a documented no-op — Excel rebuilds it on open — whereas a\n * chain that disagrees with the sheets is the failure mode this whole change\n * exists to remove. Rebuilding a correct chain would mean redoing Excel's\n * dependency analysis, which belongs in the formula package, not here.\n */\n #calcChainStillValid(): boolean {\n return (\n this.#calcChain !== undefined &&\n this.#calcChain.length > 0 &&\n this.#calcChainFingerprint === this.#sheetFingerprint()\n );\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n #assertOpen(): void {\n if (this.#closed) throw new Error('Workbook has been closed.');\n }\n\n /**\n * Copies preserved source parts into the output, minus those that are now\n * orphaned. A part is dropped when the only relationship pointing at it has\n * gone (a drawing replaced by live providers, a sheet removed, an explicit\n * `clearDrawings()`) and nothing else still reaches it.\n *\n * @returns the set of paths written, so later steps can avoid colliding with\n * them when naming newly generated parts.\n */\n #seedPreservedParts(entries: ZipInput): Set<string> {\n if (this.#preservedParts.size === 0) return new Set();\n\n // Everything still reachable from a live worksheet relationship.\n const retained = new Set<string>();\n for (const { worksheet } of this.#sheets) {\n for (const rel of worksheet.preservedRelationships) {\n if (rel.resolved) {\n for (const p of collectSubtree(this.#preservedParts, rel.resolved)) retained.add(p);\n }\n }\n }\n\n // Candidates for removal: targets of relationships that went away — but\n // only if nothing retained still reaches them (an image may be shared).\n const candidates = [\n ...this.#sheets.flatMap(e => [...e.worksheet.droppedPreservedTargets]),\n ...this.#orphanedTargets,\n ];\n\n const dropped = new Set<string>();\n for (const target of candidates) {\n for (const p of collectSubtree(this.#preservedParts, target)) {\n if (!retained.has(p)) dropped.add(p);\n }\n }\n\n const written = new Set<string>();\n for (const [path, bytes] of this.#preservedParts) {\n if (dropped.has(path)) continue;\n entries.set(path, bytes);\n written.add(path);\n }\n return written;\n }\n\n /**\n * Content-type declarations for preserved parts. `<Default>` entries are kept\n * wholesale — they are extension-scoped and are what types binary parts such\n * as images — while `<Override>` entries are filtered to parts that survived.\n */\n #preservedContentTypeDeclarations(preservedPaths: ReadonlySet<string>): {\n defaults: Array<{ extension: string; contentType: string }>;\n overrides: Array<{ partName: string; contentType: string }>;\n } {\n const ct = this.#preservedContentTypes;\n if (!ct) return { defaults: [], overrides: [] };\n\n const defaults = [...ct.defaults]\n // 'rels' and 'xml' are already declared by the generated template.\n .filter(([ext]) => ext !== 'rels' && ext !== 'xml')\n .map(([extension, contentType]) => ({ extension, contentType }));\n\n const overrides = [...ct.overrides]\n .filter(([partName]) => preservedPaths.has(partName.replace(/^\\//, '')))\n .map(([partName, contentType]) => ({ partName, contentType }));\n\n return { defaults, overrides };\n }\n\n #buildZipEntries(): ZipInput {\n const entries: ZipInput = new Map();\n\n const sheetCount = this.#sheets.length;\n\n // Parts from the source file that core does not model are laid down first,\n // so anything written below deliberately overrides them.\n const preservedPaths = this.#seedPreservedParts(entries);\n\n // _rels/.rels\n entries.set('_rels/.rels', ROOT_RELS);\n\n // Build sheet metadata for workbook.xml.\n //\n // `rId` IS re-derived from document order, because the parts and rels below\n // are written as sheet{i+1}.xml / rId{i+1} and any gap (after\n // removeWorksheet, or a source file with non-sequential rels) would dangle.\n //\n // `sheetId` is NOT: it is a durable identifier, independent of part naming,\n // that other parts of the package reference — calcChain addresses sheets by\n // it. Renumbering it silently repointed every calcChain entry at a different\n // sheet. New sheets get max+1 (see addWorksheet), so ids stay unique.\n const sheetMetas: SheetMeta[] = this.#sheets.map((e, i) => ({\n name: e.worksheet.name,\n sheetId: e.sheetId,\n relationshipId: `rId${i + 1}`,\n state: e.worksheet.visibility !== 'visible' ? e.worksheet.visibility : undefined,\n }));\n\n // Defined names → workbook.xml <definedNames>. Map sheet-scope name to its\n // 0-based document-order index (localSheetId).\n const definedNameMetas: DefinedNameMeta[] = this.#definedNames.all.map(dn => {\n let localSheetId: number | undefined;\n if (dn.scope !== undefined) {\n const idx = this.#sheets.findIndex(e => e.worksheet.name === dn.scope);\n if (idx >= 0) localSheetId = idx;\n }\n return { name: dn.name, refersTo: dn.refersTo, localSheetId };\n });\n\n // xl/workbook.xml\n entries.set('xl/workbook.xml', buildWorkbookXml(sheetMetas, definedNameMetas));\n\n // xl/calcChain.xml — Excel's stored calculation order, rewritten with the\n // (preserved) sheet ids so its `i` attributes still resolve. Dropped, rather\n // than passed through, as soon as anything about the sheets changed: an\n // absent chain makes Excel rebuild one, a wrong chain makes it calculate the\n // wrong cells. The relationship below is what makes Excel read it at all.\n const keepCalcChain = this.#calcChainStillValid();\n if (keepCalcChain) {\n const idBySheet = new Map(this.#sheets.map(e => [e.worksheet.name, e.sheetId]));\n entries.set(CALC_CHAIN_PATH, buildCalcChainXml(this.#calcChain!, idBySheet));\n } else {\n // The seeded copy from the source file has to go too, along with the\n // content-type override that declares it.\n entries.delete(CALC_CHAIN_PATH);\n preservedPaths.delete(CALC_CHAIN_PATH);\n }\n\n // xl/_rels/workbook.xml.rels\n entries.set('xl/_rels/workbook.xml.rels', buildWorkbookRels(sheetCount, keepCalcChain));\n\n // xl/styles.xml\n entries.set('xl/styles.xml', this.#styles.buildStylesXml());\n\n // xl/sharedStrings.xml\n entries.set('xl/sharedStrings.xml', this.#sharedStrings.buildXml());\n\n // xl/worksheets/sheetN.xml\n for (let i = 0; i < this.#sheets.length; i++) {\n entries.set(`xl/worksheets/sheet${i + 1}.xml`, this.#sheets[i]!.worksheet.buildXml());\n }\n\n // Drawings & their dependent parts (charts, images …).\n // Each worksheet with providers gets ONE drawing part aggregating all anchors;\n // every provider contributes one dependent part referenced from the drawing rels.\n const extraOverrides: Array<{ partName: string; contentType: string }> = [];\n const extraDefaults: Array<{ extension: string; contentType: string }> = [];\n\n // Declared explicitly rather than relying on the source's own override: a\n // part Excel cannot type is a part Excel refuses to open.\n if (keepCalcChain) {\n extraOverrides.push({ partName: `/${CALC_CHAIN_PATH}`, contentType: CONTENT_TYPES.calcChain });\n }\n let drawingCounter = 0;\n let partCounter = 0;\n let commentsCounter = 0;\n\n for (let i = 0; i < this.#sheets.length; i++) {\n const ws = this.#sheets[i]!.worksheet;\n\n // Relationships carried over from the source file — the sheet's preserved\n // drawing, images, legacy comment anchors. Written verbatim; their targets\n // are relative to the worksheets folder, which is where this sheet lands\n // regardless of how it was renumbered.\n // Targets are decoded when parsed, so they must be re-escaped here.\n const sheetRels: string[] = ws.preservedRelationships.map(\n r => ` <Relationship Id=\"${r.id}\" Type=\"${r.type}\" Target=\"${escapeXml(r.target)}\"${\n r.external ? ' TargetMode=\"External\"' : ''\n }/>`,\n );\n\n const generated = ws.generatedRels();\n\n // External hyperlinks: one relationship each, with TargetMode=\"External\".\n for (const link of ws.hyperlinks) {\n const relId = generated.hyperlinks.get(link.ref);\n if (!relId || !link.target) continue;\n sheetRels.push(\n ` <Relationship Id=\"${relId}\" Type=\"${REL_TYPES.hyperlink}\" Target=\"${escapeXml(link.target)}\" TargetMode=\"External\"/>`,\n );\n }\n\n // Comments the sheet owns: the comments part plus the legacy VML drawing\n // that positions the note boxes.\n if (generated.comments && generated.vmlDrawing) {\n do { commentsCounter++; } while (\n preservedPaths.has(`xl/comments${commentsCounter}.xml`)\n || preservedPaths.has(`xl/drawings/vmlDrawing${commentsCounter}.vml`)\n );\n const commentsPath = `xl/comments${commentsCounter}.xml`;\n const vmlPath = `xl/drawings/vmlDrawing${commentsCounter}.vml`;\n\n entries.set(commentsPath, ws.buildCommentsXml());\n entries.set(vmlPath, ws.buildCommentsVml());\n extraOverrides.push({ partName: `/${commentsPath}`, contentType: CONTENT_TYPES.comments });\n if (!extraDefaults.some(d => d.extension === 'vml')) {\n extraDefaults.push({ extension: 'vml', contentType: CONTENT_TYPES.vmlDrawing });\n }\n\n sheetRels.push(\n ` <Relationship Id=\"${generated.comments}\" Type=\"${REL_TYPES.comments}\" Target=\"../comments${commentsCounter}.xml\"/>`,\n ` <Relationship Id=\"${generated.vmlDrawing}\" Type=\"${REL_TYPES.vmlDrawing}\" Target=\"../drawings/vmlDrawing${commentsCounter}.vml\"/>`,\n );\n }\n\n if (ws.hasDrawings) {\n // Skip any name a preserved part already occupies.\n do { drawingCounter++; } while (preservedPaths.has(`xl/drawings/drawing${drawingCounter}.xml`));\n const drawingPath = `xl/drawings/drawing${drawingCounter}.xml`;\n const anchors: string[] = [];\n const drawingRels: string[] = [];\n\n ws.drawingProviders.forEach((provider, idx) => {\n const relId = `rId${idx + 1}`;\n anchors.push(provider.buildAnchorXml(relId));\n\n let part = provider.buildPart(++partCounter);\n while (preservedPaths.has(part.path)) part = provider.buildPart(++partCounter);\n\n entries.set(part.path, part.content);\n extraOverrides.push({ partName: `/${part.path}`, contentType: part.contentType });\n\n // Rel target is relative to xl/drawings/ (all parts live under xl/).\n const target = `../${part.path.slice('xl/'.length)}`;\n drawingRels.push(\n ` <Relationship Id=\"${relId}\" Type=\"${part.relType}\" Target=\"${target}\"/>`,\n );\n });\n\n // xl/drawings/drawingN.xml + its rels\n entries.set(drawingPath, buildDrawingXml(anchors.join('')));\n entries.set(`xl/drawings/_rels/drawing${drawingCounter}.xml.rels`, buildRelsXml(drawingRels));\n extraOverrides.push({ partName: `/${drawingPath}`, contentType: CONTENT_TYPES.drawing });\n\n sheetRels.push(\n ` <Relationship Id=\"${ws.drawingRelId}\" Type=\"${REL_TYPES.drawing}\" Target=\"../drawings/drawing${drawingCounter}.xml\"/>`,\n );\n }\n\n if (sheetRels.length > 0) {\n entries.set(`xl/worksheets/_rels/sheet${i + 1}.xml.rels`, buildRelsXml(sheetRels));\n }\n }\n\n // [Content_Types].xml — written last so every generated and preserved part\n // is declared.\n const preservedCt = this.#preservedContentTypeDeclarations(preservedPaths);\n entries.set(\n '[Content_Types].xml',\n buildContentTypes(\n sheetCount,\n [...preservedCt.overrides, ...extraOverrides],\n [...preservedCt.defaults, ...extraDefaults],\n ),\n );\n\n return entries;\n }\n}\n\nconst CALC_CHAIN_PATH = 'xl/calcChain.xml';\nconst EMPTY_CALC_CHAIN: readonly { readonly sheet: string; readonly ref: string }[] = [];\n\n/**\n * Parses `xl/calcChain.xml` into sheet-name/reference pairs, in file order.\n *\n * Two details of the format matter and both bite:\n *\n * - `i` holds a **sheetId**, not a position. It is resolved against the ids read\n * from workbook.xml, which is why those ids must survive a save.\n * - `i` is **inherited**: real files omit it on every entry after the first for\n * the same sheet, so a parser that treats a missing `i` as \"unknown\" loses\n * most of the chain. The last seen value carries forward.\n *\n * Entries whose sheet id is not in the workbook are dropped — they cannot be\n * resolved, and inventing a sheet for them is how a chain starts lying.\n */\nfunction parseCalcChain(\n xml: string,\n sheets: ReadonlyArray<{ worksheet: Worksheet; sheetId: number }>,\n): Array<{ sheet: string; ref: string }> {\n const nameById = new Map(sheets.map(e => [e.sheetId, e.worksheet.name]));\n const out: Array<{ sheet: string; ref: string }> = [];\n let currentId: number | undefined;\n\n try {\n const root = parseXml(xml);\n for (const el of getElementsByTagName(root, 'c')) {\n const ref = getAttr(el, 'r');\n if (!ref) continue;\n const iAttr = getAttr(el, 'i');\n if (iAttr !== undefined) {\n const parsed = parseInt(iAttr, 10);\n if (!Number.isNaN(parsed)) currentId = parsed;\n }\n if (currentId === undefined) continue;\n const sheet = nameById.get(currentId);\n if (sheet === undefined) continue;\n out.push({ sheet, ref: ref.toUpperCase() });\n }\n } catch {\n return [];\n }\n return out;\n}\n\n/**\n * Serialises a calculation order back to `xl/calcChain.xml`.\n *\n * `i` is written on every entry rather than relying on inheritance: the file is\n * a few bytes larger and impossible to misread. Entries for sheets that are gone\n * are skipped — the caller only reaches here when the sheet set is unchanged, so\n * this is a belt-and-braces filter rather than the main guard.\n */\nfunction buildCalcChainXml(\n chain: ReadonlyArray<{ sheet: string; ref: string }>,\n idBySheet: ReadonlyMap<string, number>,\n): string {\n const cells: string[] = [];\n for (const { sheet, ref } of chain) {\n const id = idBySheet.get(sheet);\n if (id === undefined) continue;\n cells.push(`<c r=\"${ref}\" i=\"${id}\"/>`);\n }\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<calcChain xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">${cells.join('')}</calcChain>`;\n}\n\n/**\n * Resolves the worksheet file path from workbook.xml.rels by relationship ID.\n * Returns path relative to xl/ e.g. \"xl/worksheets/sheet1.xml\".\n */\nfunction resolveWorksheetPath(relsXml: string, relId: string): string | undefined {\n if (!relsXml) return undefined;\n try {\n const root = parseXml(relsXml);\n for (const el of getElementsByTagName(root, 'Relationship')) {\n if (getAttr(el, 'Id') === relId) {\n const target = getAttr(el, 'Target') ?? '';\n // Target is relative to xl/, so \"worksheets/sheet1.xml\" → \"xl/worksheets/sheet1.xml\"\n return target.startsWith('xl/') ? target : `xl/${target}`;\n }\n }\n } catch {\n // Ignore parse errors\n }\n return undefined;\n}\n"]}