@devmm/puredocs-excel 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -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/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/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":["xml","ExcelUnderline","ExcelVerticalAlignRun","ExcelPatternType","ExcelBorderStyle","ExcelHorizontalAlignment","ExcelVerticalAlignment","ExcelReadingOrder","code","_sharedStrings","_styles","escXml"],"mappings":"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","file":"index.js","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): 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 for (const { partName, contentType } of extraOverrides) {\r\n overrides.push(` <Override PartName=\"${partName}\" 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 <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","/**\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","/**\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 { 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 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 // ── 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 { WORKSHEET_DRAWING_REL_ID, type DrawingProvider } from '../io/drawing-part.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 /** @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 /** 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 /** 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 * 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 /** 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 // ── 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 schema.\r\n const drawingXml = this.hasDrawings ? `<drawing r:id=\"${WORKSHEET_DRAWING_REL_ID}\"/>` : '';\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}${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 { 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 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 wb.#sheets.push({ worksheet: ws, sheetId, relId });\r\n }\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 * 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 #buildZipEntries(): ZipInput {\r\n const entries = new Map<string, string>();\r\n\r\n const sheetCount = this.#sheets.length;\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 const sheetMetas: SheetMeta[] = this.#sheets.map(e => ({\r\n name: e.worksheet.name,\r\n sheetId: e.sheetId,\r\n relationshipId: e.relId,\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 if (!ws.hasDrawings) continue;\r\n\r\n drawingCounter++;\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 partCounter++;\r\n const part = provider.buildPart(partCounter);\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 // xl/worksheets/_rels/sheetN.xml.rels → the drawing part\r\n entries.set(\r\n `xl/worksheets/_rels/sheet${i + 1}.xml.rels`,\r\n buildRelsXml([\r\n ` <Relationship Id=\"${WORKSHEET_DRAWING_REL_ID}\" Type=\"${REL_TYPES.drawing}\" Target=\"../drawings/drawing${drawingCounter}.xml\"/>`,\r\n ]),\r\n );\r\n }\r\n\r\n // [Content_Types].xml — written last so drawing/chart overrides are included.\r\n entries.set('[Content_Types].xml', buildContentTypes(sheetCount, extraOverrides));\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-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":["xml","ExcelUnderline","ExcelVerticalAlignRun","ExcelPatternType","ExcelBorderStyle","ExcelHorizontalAlignment","ExcelVerticalAlignment","ExcelReadingOrder","code","_sharedStrings","_styles","escXml"],"mappings":"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","file":"index.js","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"]}