@office-open/xlsx 0.10.15 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -18
- package/dist/index.d.mts +2898 -408
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +11652 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -28
- package/dist/chart.d.mts +0 -1
- package/dist/chart.mjs +0 -2
- package/dist/comments-CUChd469.mjs +0 -1776
- package/dist/comments-CUChd469.mjs.map +0 -1
- package/dist/context-eqnGd7of.mjs +0 -4106
- package/dist/context-eqnGd7of.mjs.map +0 -1
- package/dist/drawingml.d.mts +0 -1
- package/dist/drawingml.mjs +0 -2
- package/dist/file-CaB6L83w.d.mts +0 -589
- package/dist/file-CaB6L83w.d.mts.map +0 -1
- package/dist/generate-CSB0G2BY.mjs +0 -842
- package/dist/generate-CSB0G2BY.mjs.map +0 -1
- package/dist/generate.d.mts +0 -10
- package/dist/generate.d.mts.map +0 -1
- package/dist/generate.mjs +0 -2
- package/dist/parse.d.mts +0 -27
- package/dist/parse.d.mts.map +0 -1
- package/dist/parse.mjs +0 -316
- package/dist/parse.mjs.map +0 -1
- package/dist/patch.d.mts +0 -29
- package/dist/patch.d.mts.map +0 -1
- package/dist/patch.mjs +0 -460
- package/dist/patch.mjs.map +0 -1
- package/dist/smartart.d.mts +0 -1
- package/dist/smartart.mjs +0 -2
- package/dist/worksheet-CY6qn25N.d.mts +0 -1448
- package/dist/worksheet-CY6qn25N.d.mts.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/util/index.ts"],"sourcesContent":["/**\n * Convert a 1-based column number to Excel column letter(s).\n * 1 → \"A\", 26 → \"Z\", 27 → \"AA\", 28 → \"AB\"\n */\nexport function columnToLetter(col: number): string {\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/**\n * Convert a JavaScript Date to an Excel serial number.\n * Excel epoch: January 1, 1900 = 1 (with the 1900 leap year bug).\n */\nexport function dateToSerialNumber(date: Date): number {\n // Excel treats 1900 as a leap year (bug inherited from Lotus 1-2-3).\n // The epoch is effectively December 30, 1899 = 0.\n const epoch = new Date(1899, 11, 30);\n const msPerDay = 86400000;\n const diff = date.getTime() - epoch.getTime();\n return diff / msPerDay;\n}\n"],"mappings":";;;;;;;;;;;AAIA,SAAgB,eAAe,KAAqB;CAClD,IAAI,SAAS;CACb,IAAI,IAAI;CACR,OAAO,IAAI,GAAG;EACZ,MAAM,aAAa,IAAI,KAAK;EAC5B,SAAS,OAAO,aAAa,KAAK,SAAS,IAAI;EAC/C,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE;CAC7B;CACA,OAAO;AACT;;;;;AAMA,SAAgB,mBAAmB,MAAoB;CAGrD,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,EAAE;CAGnC,QADa,KAAK,QAAQ,IAAI,MAAM,QAAQ,KAC9B;AAChB"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["R_NS","R_NS","encoder","buildWorksheetXml","XLSX_CONTENT_TYPE_RESOLVER","createThemeXml","buildWorksheetXml","R_NS","createThemeXml"],"sources":["../src/parts/styles/parse.ts","../src/parts/shared-strings.ts","../src/parts/styles/styles.ts","../src/parts/styles/descriptor.ts","../src/parts/worksheet/types.ts","../src/parts/auto-filter.ts","../src/parts/pivot-table/parse.ts","../src/parts/worksheet/parse.ts","../src/parts/worksheet/sheet-data.ts","../src/parts/worksheet/descriptor.ts","../src/util/index.ts","../src/parts/pivot/pivot-utils.ts","../src/parts/pivot-table/stringify.ts","../src/parts/worksheet/stringify.ts","../src/parts/calc-chain.ts","../src/parts/chartsheet.ts","../src/parts/comments.ts","../src/parts/drawing/types.ts","../src/parts/drawing/parse.ts","../src/parts/drawing/stringify.ts","../src/parts/drawing/descriptor.ts","../src/parts/external-link.ts","../src/parts/connection.ts","../src/parts/query-table.ts","../src/parts/metadata.ts","../src/parts/pivot-table/descriptor.ts","../src/parts/pivot-cache.ts","../src/parts/table.ts","../src/parts/workbook/stringify.ts","../src/parts/workbook/descriptor.ts","../src/parts/dialogsheet.ts","../src/parts/xml-mapping.ts","../src/shared/formula-lint.ts","../src/parts/revision-log/parse.ts","../src/parts/revision-log/stringify.ts","../src/parts/revision-log/revision-headers.ts","../src/parts/revision-log/users.ts","../src/parts/revision-log/descriptor.ts","../src/parts/vol-types.ts","../src/context.ts","../src/parse.ts","../src/patch.ts","../src/compiler.ts","../src/stream.ts","../src/generate.ts"],"sourcesContent":["/**\n * Styles — parse helpers for xl/styles.xml sub-elements.\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport { attr, attrNum, findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type {\n AlignmentOptions,\n BorderOptions,\n BorderSideOptions,\n CellProtectionOptions,\n CellFillOptions,\n FontOptions,\n CellGradientStopOptions,\n} from \"./types\";\n\nexport function parseFont(el: XmlElement): FontOptions {\n const result: Partial<FontOptions> = {};\n // CT_BooleanProperty children (b/i/strike/…) default val to true, so an\n // explicit val=\"0\" is a real \"off\" statement — keep it as false rather than\n // collapsing to the attribute-absent default.\n const boolProp = (prop: XmlElement): boolean | undefined => parseOnOff(attr(prop, \"val\")) ?? true;\n for (const child of el.elements ?? []) {\n switch (child.name) {\n case \"b\":\n result.bold = boolProp(child);\n break;\n case \"i\":\n result.italic = boolProp(child);\n break;\n case \"u\":\n // ST_UnderlineValues: \"none\" is the only off spelling; every other\n // value (or the omitted default) means some underline is on.\n result.underline = attr(child, \"val\") !== \"none\";\n break;\n case \"strike\":\n result.strike = boolProp(child);\n break;\n case \"outline\":\n result.outline = boolProp(child);\n break;\n case \"shadow\":\n result.shadow = boolProp(child);\n break;\n case \"condense\":\n result.condense = boolProp(child);\n break;\n case \"extend\":\n result.extend = boolProp(child);\n break;\n case \"sz\":\n result.size = attrNum(child, \"val\");\n break;\n case \"color\":\n result.color = parseColorHex(child);\n readThemeColor(child, result);\n const indexed = attrNum(child, \"indexed\");\n if (indexed !== undefined) result.colorIndexed = indexed;\n if (parseOnOff(attr(child, \"auto\"))) result.autoColor = true;\n break;\n case \"name\":\n result.font = attr(child, \"val\") ?? undefined;\n break;\n case \"charset\":\n result.charset = attrNum(child, \"val\");\n break;\n case \"family\":\n result.family = attrNum(child, \"val\");\n break;\n case \"vertAlign\":\n result.vertAlign = (attr(child, \"val\") as FontOptions[\"vertAlign\"]) ?? undefined;\n break;\n case \"scheme\":\n result.scheme = (attr(child, \"val\") as FontOptions[\"scheme\"]) ?? undefined;\n break;\n }\n }\n return result as FontOptions;\n}\n\nexport function parseFill(el: XmlElement): CellFillOptions {\n const patternFill = findChild(el, \"patternFill\");\n if (patternFill) {\n const result: CellFillOptions = {};\n const patternType = attr(patternFill, \"patternType\");\n if (patternType) result.patternType = patternType as CellFillOptions[\"patternType\"];\n const fg = findChild(patternFill, \"fgColor\");\n if (fg) {\n result.color = parseColorHex(fg);\n readThemeColor(fg, result);\n const indexed = attrNum(fg, \"indexed\");\n if (indexed !== undefined) result.colorIndexed = indexed;\n if (parseOnOff(attr(fg, \"auto\"))) result.fgAutoColor = true;\n }\n const bg = findChild(patternFill, \"bgColor\");\n if (bg) {\n result.bgColor = parseColorHex(bg);\n const bgTheme = attrNum(bg, \"theme\");\n if (bgTheme !== undefined) result.bgThemeColor = bgTheme;\n const bgTint = attrNum(bg, \"tint\");\n if (bgTint !== undefined) result.bgTint = bgTint;\n const bgIndexed = attrNum(bg, \"indexed\");\n if (bgIndexed !== undefined) result.bgColorIndexed = bgIndexed;\n if (parseOnOff(attr(bg, \"auto\"))) result.bgAutoColor = true;\n }\n return result;\n }\n\n const gradientFill = findChild(el, \"gradientFill\");\n if (gradientFill) {\n const result: CellFillOptions = { type: \"gradient\" };\n const gType = attr(gradientFill, \"type\");\n if (gType) result.gradientType = gType as CellFillOptions[\"gradientType\"];\n const degree = attrNum(gradientFill, \"degree\");\n if (degree !== undefined) result.gradientDegree = degree;\n const left = attrNum(gradientFill, \"left\");\n if (left !== undefined) result.gradientLeft = left;\n const right = attrNum(gradientFill, \"right\");\n if (right !== undefined) result.gradientRight = right;\n const top = attrNum(gradientFill, \"top\");\n if (top !== undefined) result.gradientTop = top;\n const bottom = attrNum(gradientFill, \"bottom\");\n if (bottom !== undefined) result.gradientBottom = bottom;\n const stops: CellGradientStopOptions[] = [];\n for (const s of gradientFill.elements ?? []) {\n if (s.name !== \"stop\") continue;\n const pos = attrNum(s, \"position\");\n const color = findChild(s, \"color\");\n if (pos !== undefined && color) {\n stops.push({ position: pos, color: parseColorHex(color) ?? \"\" });\n }\n }\n if (stops.length > 0) result.stops = stops;\n return result;\n }\n\n return {};\n}\n\nexport function parseBorder(el: XmlElement): BorderSideOptions {\n const result: BorderSideOptions = {};\n if (parseOnOff(attr(el, \"diagonalUp\"))) result.diagonalUp = true;\n if (parseOnOff(attr(el, \"diagonalDown\"))) result.diagonalDown = true;\n\n for (const side of [\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"diagonal\",\n \"start\",\n \"end\",\n \"vertical\",\n \"horizontal\",\n ] as const) {\n const sideEl = findChild(el, side);\n if (sideEl) {\n // Presence-preserving: an empty <left/> stays as left: {} so stringify\n // re-emits it; Excel always writes the five cell sides, dxf adds\n // vertical/horizontal — both round-trip byte-identically.\n const opts: BorderOptions = {};\n const style = attr(sideEl, \"style\");\n if (style) opts.style = style as BorderOptions[\"style\"];\n const color = findChild(sideEl, \"color\");\n if (color) {\n opts.color = parseColorHex(color);\n readThemeColor(color, opts);\n if (parseOnOff(attr(color, \"auto\"))) opts.autoColor = true;\n const indexed = attrNum(color, \"indexed\");\n if (indexed !== undefined) opts.colorIndexed = indexed;\n }\n result[side] = opts;\n }\n }\n\n return result;\n}\n\nexport function parseAlignment(el: XmlElement): AlignmentOptions {\n const result: AlignmentOptions = {};\n const h = attr(el, \"horizontal\");\n if (h) result.horizontal = h as AlignmentOptions[\"horizontal\"];\n const v = attr(el, \"vertical\");\n if (v) result.vertical = v as AlignmentOptions[\"vertical\"];\n if (parseOnOff(attr(el, \"wrapText\"))) result.wrapText = true;\n const rotation = attrNum(el, \"textRotation\");\n if (rotation !== undefined) result.textRotation = rotation;\n const indent = attrNum(el, \"indent\");\n if (indent !== undefined) result.indent = indent;\n const relativeIndent = attrNum(el, \"relativeIndent\");\n if (relativeIndent !== undefined) result.relativeIndent = relativeIndent;\n if (parseOnOff(attr(el, \"justifyLastLine\"))) result.justifyLastLine = true;\n if (parseOnOff(attr(el, \"shrinkToFit\"))) result.shrinkToFit = true;\n const readingOrder = attrNum(el, \"readingOrder\");\n if (readingOrder !== undefined) result.readingOrder = readingOrder;\n return result;\n}\n\nexport function parseProtection(el: XmlElement): CellProtectionOptions {\n const result: Partial<CellProtectionOptions> = {};\n const locked = attr(el, \"locked\");\n if (locked !== undefined) result.locked = parseOnOff(locked) ?? true;\n const hidden = attr(el, \"hidden\");\n if (hidden !== undefined) result.hidden = parseOnOff(hidden) ?? true;\n return result as CellProtectionOptions;\n}\n\n/**\n * Read an sml color element's `@rgb`, stripping the alpha prefix when present\n * (FF000000 → 000000). Shared by all xlsx color-attr parse sites.\n */\nexport function parseColorHex(el: XmlElement): string | undefined {\n const rgb = attr(el, \"rgb\");\n if (rgb) {\n // Strip alpha prefix if present (FF000000 → 000000)\n return rgb.length === 8 ? rgb.slice(2) : rgb;\n }\n return undefined;\n}\n\n/**\n * Read an sml color element's theme channels (`@theme`/`@tint`) onto a target\n * object. Called wherever a color element carries a palette reference instead\n * of an explicit RGB (fonts, fills, border sides).\n */\nexport function readThemeColor(\n el: XmlElement,\n target: { themeColor?: number; tint?: number },\n): void {\n const theme = attrNum(el, \"theme\");\n if (theme !== undefined) target.themeColor = theme;\n const tint = attrNum(el, \"tint\");\n if (tint !== undefined) target.tint = tint;\n}\n","/**\n * Shared Strings Table — generates xl/sharedStrings.xml.\n *\n * XLSX stores repeated string values in a central table to reduce file size.\n * Cells reference strings by index into this table.\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { escapeXml, findChild, attr, attrNum, textOf } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport { parseColorHex } from \"./styles/parse\";\nimport type {\n RichTextOptions,\n RichTextRunOptions,\n RichTextRunPropertiesOptions,\n} from \"./worksheet\";\n\n/** String or rich text entry in the SST. */\ntype SstEntry = string | RichTextOptions;\n\n/**\n * Serialize a CT_Rst text element. Excel requires xml:space=\"preserve\" on a\n * `<t>` whose text has leading or trailing whitespace — without it the whole\n * part is rejected on open. The attribute is derived from the text itself, so\n * parse needs no field for it.\n */\nexport function tElement(text: string): string {\n const open = /^\\s|\\s$/.test(text) ? '<t xml:space=\"preserve\">' : \"<t>\";\n return `${open}${escapeXml(text)}</t>`;\n}\n\n/**\n * Build rich text run properties XML (CT_RPrElt).\n * Exported for reuse by Comments and other components.\n */\nexport function buildRPrXml(\n pr: NonNullable<RichTextOptions[\"runs\"]>[number][\"properties\"],\n): string {\n if (!pr) return \"\";\n const parts: string[] = [];\n if (pr.font) parts.push(`<rFont val=\"${escapeXml(pr.font)}\"/>`);\n if (pr.charset !== undefined) parts.push(`<charset val=\"${pr.charset}\"/>`);\n if (pr.family !== undefined) parts.push(`<family val=\"${pr.family}\"/>`);\n if (pr.bold) parts.push(\"<b/>\");\n if (pr.italic) parts.push(\"<i/>\");\n if (pr.strike) parts.push(\"<strike/>\");\n if (pr.outline) parts.push(\"<outline/>\");\n if (pr.shadow) parts.push(\"<shadow/>\");\n if (pr.condense) parts.push(\"<condense/>\");\n if (pr.extend) parts.push(\"<extend/>\");\n if (pr.color) {\n // parseRPr encodes the non-rgb channels in the same string: a short bare\n // number (≤3 digits) is the legacy palette index, \"theme:N\" a theme slot.\n // Longer digit strings are hex colors (\"008000\" is green, not index\n // 8000). They must go back to their own attributes — rgb accepts only 8\n // hex chars (AARRGGBB), and rgb=\"81\" makes Excel refuse the whole package.\n if (/^\\d{1,3}$/.test(pr.color)) {\n parts.push(`<color indexed=\"${Number(pr.color)}\"/>`);\n } else if (pr.color.startsWith(\"theme:\")) {\n parts.push(`<color theme=\"${escapeXml(pr.color.slice(6))}\"/>`);\n } else {\n // ST_UnsignedIntHex requires 8 hex chars (AARRGGBB).\n // Auto-prefix FF (fully opaque) when user provides 6-char RGB.\n const rgb = pr.color.length === 6 ? `FF${pr.color}` : pr.color;\n parts.push(`<color rgb=\"${escapeXml(rgb)}\"/>`);\n }\n }\n if (pr.size !== undefined) parts.push(`<sz val=\"${pr.size}\"/>`);\n // val=\"none\" is explicit: a bare <u/> means underline single, so omitting\n // the attribute would flip none → single on parse.\n if (pr.underline) parts.push(`<u val=\"${pr.underline}\"/>`);\n if (pr.vertAlign) parts.push(`<vertAlign val=\"${pr.vertAlign}\"/>`);\n if (pr.scheme) parts.push(`<scheme val=\"${pr.scheme}\"/>`);\n return parts.length > 0 ? `<rPr>${parts.join(\"\")}</rPr>` : \"\";\n}\n\n/** Build a CT_Rst XML string from RichTextOptions. */\nexport function buildRstXml(rst: RichTextOptions): string {\n const parts: string[] = [];\n if (rst.runs && rst.runs.length > 0) {\n for (const run of rst.runs) {\n const rPr = buildRPrXml(run.properties);\n parts.push(`<r>${rPr}${tElement(run.text)}</r>`);\n }\n } else if (rst.text !== undefined) {\n parts.push(tElement(rst.text));\n }\n // rPh (phonetics)\n if (rst.phonetics) {\n for (const ph of rst.phonetics) {\n parts.push(`<rPh sb=\"${ph.startByte}\" eb=\"${ph.endByte}\">${tElement(ph.text)}</rPh>`);\n }\n }\n if (rst.phoneticProperties) {\n const pp = rst.phoneticProperties;\n const attrs: string[] = [`fontId=\"${pp.fontId}\"`];\n if (pp.type) attrs.push(`type=\"${pp.type}\"`);\n if (pp.alignment) attrs.push(`alignment=\"${pp.alignment}\"`);\n parts.push(`<phoneticPr ${attrs.join(\" \")}/>`);\n }\n return parts.join(\"\");\n}\n\nexport class SharedStrings {\n private entries: SstEntry[] = [];\n /** Dedup map for plain strings only. */\n private indexMap = new Map<string, number>();\n /**\n * Identity dedup map for rich text — round-tripped cells hold the same\n * entry object the loaded table already contains, so registering them must\n * resolve back to the original index instead of appending a duplicate si.\n */\n private richIndexMap = new Map<RichTextOptions, number>();\n\n /**\n * Register a plain string and return its index.\n * Returns existing index if the string is already registered.\n */\n public register(s: string): number {\n const existing = this.indexMap.get(s);\n if (existing !== undefined) return existing;\n\n const idx = this.entries.length;\n this.entries.push(s);\n this.indexMap.set(s, idx);\n return idx;\n }\n\n /**\n * Register a rich text entry and return its index. The same object\n * (identity) resolves to its existing index; distinct objects are appended.\n */\n public registerRich(rst: RichTextOptions): number {\n const existing = this.richIndexMap.get(rst);\n if (existing !== undefined) return existing;\n\n const idx = this.entries.length;\n this.entries.push(rst);\n this.richIndexMap.set(rst, idx);\n return idx;\n }\n\n /**\n * Bulk-load parsed template entries, preserving their original indices so\n * existing cell references stay valid. Plain strings populate the dedup map\n * (first occurrence wins); rich-text entries populate the identity map.\n *\n * Used by patch and by generate() for a parsed workbook, so cells keep\n * pointing at the source table instead of re-registering flattened text.\n */\n public loadEntries(entries: SharedStringsDocOptions[\"entries\"]): void {\n for (const entry of entries) {\n const idx = this.entries.length;\n this.entries.push(entry);\n if (typeof entry === \"string\") {\n if (!this.indexMap.has(entry)) this.indexMap.set(entry, idx);\n } else if (!this.richIndexMap.has(entry)) {\n this.richIndexMap.set(entry, idx);\n }\n }\n }\n\n public get count(): number {\n return this.entries.length;\n }\n\n /** Return a serializable snapshot for the descriptor. */\n public toDescriptorOptions(): { entries: SstEntry[] } {\n return { entries: this.entries };\n }\n\n /** Serialize to xl/sharedStrings.xml content (without XML declaration). */\n public serialize(): string {\n return serializeSstEntries(this.entries);\n }\n}\n\n/** Serialize entry list to the <sst> part body shared by both emit paths. */\nfunction serializeSstEntries(entries: (string | RichTextOptions)[]): string {\n const p: string[] = [\n '<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"',\n ` count=\"${entries.length}\" uniqueCount=\"${entries.length}\">`,\n ];\n for (const entry of entries) {\n if (typeof entry === \"string\") {\n p.push(`<si>${tElement(entry)}</si>`);\n } else {\n // Rich text (CT_Rst)\n p.push(`<si>${buildRstXml(entry)}</si>`);\n }\n }\n p.push(\"</sst>\");\n return p.join(\"\");\n}\n\n// ── Descriptor Types ──\n\n/** Serializable snapshot of the shared string table. uniqueCount is not\n * stored — it always equals entries.length and is derived at emit time. */\nexport interface SharedStringsDocOptions {\n /** All entries (plain strings and rich text), in registration order. */\n entries: (string | RichTextOptions)[];\n}\n\n// ── Descriptor ──\n\nexport const sharedStringsDesc: CustomDescriptor<SharedStringsDocOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.entries.length === 0) return undefined;\n return serializeSstEntries(opts.entries);\n },\n\n parse(el, _ctx) {\n const entries: (string | RichTextOptions)[] = [];\n\n for (const si of el.elements ?? []) {\n if (si.name !== \"si\") continue;\n\n // Simple: <si><t>text</t></si> — phonetic children may still trail\n // (CT_Rst allows t + rPh* + phoneticPr without any r runs), in which\n // case the entry stays a RichTextOptions to carry them.\n const t = findChild(si, \"t\");\n const hasPhonetic = (si.elements ?? []).some(\n (e) => e.name === \"rPh\" || e.name === \"phoneticPr\",\n );\n if (t && !hasPhonetic) {\n entries.push(textOf(t) ?? \"\");\n continue;\n }\n\n // Rich text: <si><r>...</r>...</si>\n const runs: RichTextRunOptions[] = [];\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findChild(r, \"t\");\n if (rt) {\n const rPrEl = findChild(r, \"rPr\");\n const run: RichTextRunOptions = { text: textOf(rt) ?? \"\" };\n if (rPrEl) run.properties = parseRPr(rPrEl);\n runs.push(run);\n }\n }\n\n // Phonetics: <rPh sb=\"...\" eb=\"...\"><t>...</t></rPh> + trailing phoneticPr\n const phonetics: { startByte: number; endByte: number; text: string }[] = [];\n let phoneticProperties: RichTextOptions[\"phoneticProperties\"];\n for (const rPh of si.elements ?? []) {\n if (rPh.name === \"rPh\") {\n const sb = attrNum(rPh, \"sb\") ?? 0;\n const eb = attrNum(rPh, \"eb\") ?? 0;\n const rPhT = findChild(rPh, \"t\");\n phonetics.push({ startByte: sb, endByte: eb, text: rPhT ? (textOf(rPhT) ?? \"\") : \"\" });\n } else if (rPh.name === \"phoneticPr\") {\n const fontId = attrNum(rPh, \"fontId\");\n if (fontId !== undefined) {\n const pp: NonNullable<RichTextOptions[\"phoneticProperties\"]> = { fontId };\n const type = attr(rPh, \"type\");\n if (type) pp.type = type as NonNullable<RichTextOptions[\"phoneticProperties\"]>[\"type\"];\n const align = attr(rPh, \"alignment\");\n if (align)\n pp.alignment = align as NonNullable<\n RichTextOptions[\"phoneticProperties\"]\n >[\"alignment\"];\n phoneticProperties = pp;\n }\n }\n }\n\n if (runs.length > 0) {\n const entry: RichTextOptions = { runs };\n if (phonetics.length > 0) entry.phonetics = phonetics;\n if (phoneticProperties) entry.phoneticProperties = phoneticProperties;\n entries.push(entry);\n } else if (t) {\n // Plain text with trailing phonetics — text + rPh*/phoneticPr.\n const entry: RichTextOptions = { text: textOf(t) ?? \"\" };\n if (phonetics.length > 0) entry.phonetics = phonetics;\n if (phoneticProperties) entry.phoneticProperties = phoneticProperties;\n entries.push(entry);\n }\n }\n\n return { entries };\n },\n};\n\n/** Parse CT_RPrElt (run properties inside shared strings r element). */\nexport function parseRPr(el: XmlElement): RichTextRunPropertiesOptions {\n const result: RichTextRunPropertiesOptions = {};\n for (const child of el.elements ?? []) {\n switch (child.name) {\n case \"rFont\":\n result.font = attr(child, \"val\") ?? undefined;\n break;\n case \"charset\":\n result.charset = attrNum(child, \"val\");\n break;\n case \"family\":\n result.family = attrNum(child, \"val\");\n break;\n case \"b\":\n result.bold = parseOnOff(attr(child, \"val\")) ?? true;\n break;\n case \"i\":\n result.italic = parseOnOff(attr(child, \"val\")) ?? true;\n break;\n case \"strike\":\n result.strike = true;\n break;\n case \"outline\":\n result.outline = true;\n break;\n case \"shadow\":\n result.shadow = true;\n break;\n case \"condense\":\n result.condense = true;\n break;\n case \"extend\":\n result.extend = true;\n break;\n case \"color\": {\n const rgb = parseColorHex(child);\n if (rgb) {\n result.color = rgb;\n } else {\n const indexed = attrNum(child, \"indexed\");\n if (indexed !== undefined) result.color = String(indexed);\n else {\n const theme = attr(child, \"theme\");\n if (theme !== undefined) result.color = `theme:${theme}`;\n }\n }\n break;\n }\n case \"sz\":\n result.size = attrNum(child, \"val\");\n break;\n case \"u\": {\n const uVal = attr(child, \"val\");\n result.underline =\n (uVal as RichTextRunPropertiesOptions[\"underline\"] | undefined) ?? \"single\";\n break;\n }\n case \"vertAlign\":\n result.vertAlign = attr(child, \"val\") as\n | RichTextRunPropertiesOptions[\"vertAlign\"]\n | undefined;\n break;\n case \"scheme\":\n result.scheme = attr(child, \"val\") as RichTextRunPropertiesOptions[\"scheme\"] | undefined;\n break;\n }\n }\n return result;\n}\n","/**\n * Styles — the xl/styles.xml accumulator.\n *\n * XLSX uses an index-based style system: cells reference style entries\n * via the `s` attribute, which is an index into `cellXfs`. This class\n * registers and deduplicates fonts, fills, borders, numFmts, and cellXfs,\n * then serializes the lot via {@link Styles.serialize}.\n *\n * @module\n */\nimport { attrs, escapeXml } from \"@office-open/xml\";\n\nimport type {\n AlignmentOptions,\n BorderOptions,\n BorderSideOptions,\n CellProtectionOptions,\n CellStyleXfOptions,\n ColorsOptions,\n CustomCellStyleOptions,\n CustomTableStyleOptions,\n DxfOptions,\n CellFillOptions,\n FontOptions,\n IndexedXfEntry,\n NumFmtEntry,\n StyleExtensionOptions,\n StyleOptions,\n StylesState,\n} from \"./types\";\n\n// ── Style key helpers for deduplication ──\n\nfunction fontKey(f: FontOptions): string {\n return `b${f.bold ? 1 : 0}i${f.italic ? 1 : 0}u${f.underline ? 1 : 0}s${f.strike ? 1 : 0}z${f.size ?? 0}c${f.color ?? \"\"}tc${f.themeColor ?? \"\"}ti${f.tint ?? \"\"}ix${f.colorIndexed ?? \"\"}a${f.autoColor ? 1 : 0}n${f.font ?? \"\"}cs${f.charset ?? \"\"}fm${f.family ?? \"\"}co${f.condense ? 1 : 0}ex${f.extend ? 1 : 0}va${f.vertAlign ?? \"\"}sc${f.scheme ?? \"\"}sh${f.shadow ? 1 : 0}ol${f.outline ? 1 : 0}`;\n}\n\nfunction fillKey(f: CellFillOptions): string {\n return `t${f.type ?? \"\"}c${f.color ?? \"\"}tc${f.themeColor ?? \"\"}ti${f.tint ?? \"\"}ix${f.colorIndexed ?? \"\"}fa${f.fgAutoColor ? 1 : 0}p${f.patternType ?? \"\"}bg${f.bgColor ?? \"\"}bgtc${f.bgThemeColor ?? \"\"}bgti${f.bgTint ?? \"\"}bgix${f.bgColorIndexed ?? \"\"}bga${f.bgAutoColor ? 1 : 0}g${f.stops?.map((s) => `${s.position}_${s.color}`).join(\"|\") ?? \"\"}`;\n}\n\nfunction borderKey(b: BorderSideOptions): string {\n // Existence bit: an empty <vertical/> (side: {}) must not dedup against a\n // border without that side — adopted tables rebuild keys from raw entries.\n const sk = (o?: BorderOptions) =>\n `${o ? 1 : 0}_${o?.style ?? \"\"}_${o?.color ?? \"\"}_${o?.themeColor ?? \"\"}_${o?.tint ?? \"\"}_${o?.colorIndexed ?? \"\"}_${o?.autoColor ? 1 : 0}`;\n return `t${sk(b.top)}b${sk(b.bottom)}l${sk(b.left)}r${sk(b.right)}d${sk(b.diagonal)}du${b.diagonalUp ? 1 : 0}dd${b.diagonalDown ? 1 : 0}st${sk(b.start)}en${sk(b.end)}v${sk(b.vertical)}h${sk(b.horizontal)}`;\n}\n\n// ── Built-in number format IDs ──\n\nconst BUILTIN_NUMFMTS: Record<string, number> = {\n General: 0,\n \"0\": 1,\n \"0.00\": 2,\n \"#,##0\": 3,\n \"#,##0.00\": 4,\n \"0%\": 9,\n \"0.00%\": 10,\n \"0.00E+00\": 11,\n \"mm-dd-yy\": 14,\n \"d-mmm-yy\": 15,\n \"d-mmm\": 16,\n \"mmm-yy\": 17,\n \"h:mm AM/PM\": 18,\n \"h:mm:ss AM/PM\": 19,\n \"h:mm\": 20,\n \"h:mm:ss\": 21,\n \"m/d/yy h:mm\": 22,\n \"#,##0 ;(#,##0)\": 37,\n \"#,##0 ;[Red](#,##0)\": 38,\n \"#,##0.00;(#,##0.00)\": 39,\n \"#,##0.00;[Red](#,##0.00)\": 40,\n \"mm:ss\": 45,\n \"[h]:mm:ss\": 46,\n \"mmss.0\": 47,\n \"##0.0E+0\": 48,\n \"@\": 49,\n};\n\n/** Reverse lookup: built-in number format id → format code. */\nconst BUILTIN_NUMFMT_BY_ID = new Map<number, string>(\n Object.entries(BUILTIN_NUMFMTS).map(([code, id]) => [id, code]),\n);\n\n/**\n * Format code for a built-in number format id (0-49/164+ reserved range),\n * or undefined for custom ids — those live in the parsed `<numFmts>` table.\n */\nexport function builtinNumFmtCode(id: number): string | undefined {\n return BUILTIN_NUMFMT_BY_ID.get(id);\n}\n\n/**\n * Internal cellStyleXfs storage — font/fill/border/numFmt indices after\n * re-registration against the accumulator, plus the verbatim CT_Xf flags.\n */\ninterface CellStyleXfEntry {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n alignment?: AlignmentOptions;\n protection?: CellProtectionOptions;\n quotePrefix?: boolean;\n pivotButton?: boolean;\n applyNumberFormat?: boolean;\n applyFont?: boolean;\n applyFill?: boolean;\n applyBorder?: boolean;\n applyAlignment?: boolean;\n applyProtection?: boolean;\n}\n\nexport class Styles {\n private fonts: FontOptions[] = [\n { size: 11, font: \"Calibri\" }, // default font (index 0)\n ];\n private fontKeys = new Map<string, number>();\n\n private fills: CellFillOptions[] = [\n { patternType: \"none\" }, // default fill (index 0)\n { patternType: \"gray125\" }, // required fill (index 1)\n ];\n private fillKeys = new Map<string, number>();\n\n private borders: BorderSideOptions[] = [\n {}, // default empty border (index 0)\n ];\n private borderKeys = new Map<string, number>();\n\n private customNumFmts = new Map<string, number>();\n private nextCustomNumFmtId = 164; // custom numFmts start at 164\n\n private cellXfs: Array<{\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n /** cellStyleXfs reference from an adopted source xf; 0 = standalone. */\n xfId?: number;\n alignment?: AlignmentOptions;\n quotePrefix?: boolean;\n pivotButton?: boolean;\n applyProtection?: boolean;\n protection?: CellProtectionOptions;\n /** Explicit apply* flags from an adopted source xf; undefined = derive. */\n applyFont?: boolean;\n applyFill?: boolean;\n applyBorder?: boolean;\n applyNumberFormat?: boolean;\n applyAlignment?: boolean;\n }> = [\n { fontId: 0, fillId: 0, borderId: 0, numFmtId: 0 }, // default xf (index 0)\n ];\n private cellXfKeys = new Map<string, number>();\n\n /** Named cell-style templates (cellStyleXfs); index 0 is the Normal style. */\n private cellStyleXfs: CellStyleXfEntry[] = [\n { fontId: 0, fillId: 0, borderId: 0, numFmtId: 0 }, // Normal (index 0)\n ];\n\n private dxfs: DxfOptions[] = [];\n\n private colors?: ColorsOptions;\n private tableStyles?: CustomTableStyleOptions[];\n /** Custom cell styles (CT_CellStyles) */\n private customCellStyles?: CustomCellStyleOptions[];\n /** Style sheet extensions (CT_ExtensionList) */\n private styleExtensions?: StyleExtensionOptions[];\n /**\n * True once a parsed source table was adopted — switches optional\n * containers (dxfs, tableStyles) from the fresh-file convention (always\n * written, even empty) to emitting only what the source declared.\n */\n private roundTrip = false;\n /** True once setDxfs() ran — an explicit empty `<dxfs/>` still serializes. */\n private dxfsDeclared = false;\n /** True once an adopted table declared a (possibly empty) numFmts section. */\n private numFmtsDeclared = false;\n\n public constructor() {\n // Pre-register default font/fill/border keys. These arrays are seeded\n // inline above, so index 0/1 always exist.\n this.fontKeys.set(fontKey(this.fonts[0]!), 0);\n this.fillKeys.set(fillKey(this.fills[0]!), 0);\n this.fillKeys.set(fillKey(this.fills[1]!), 1);\n this.borderKeys.set(borderKey(this.borders[0]!), 0);\n this.cellXfKeys.set(this.cellXfKey(this.cellXfs[0]!), 0);\n }\n\n /**\n * Register a style and return its index (for the cell `s` attribute).\n * Deduplicates across fonts, fills, borders, numFmts, and cellXfs.\n */\n public register(opts: StyleOptions): number {\n const fontId = this.registerFont(opts.font);\n const fillId = this.registerFill(opts.fill);\n const borderId = this.registerBorder(opts.border);\n const numFmtId = this.registerNumFmt(opts.numFmt);\n\n const xf = {\n fontId,\n fillId,\n borderId,\n numFmtId,\n alignment: opts.alignment,\n quotePrefix: opts.quotePrefix,\n pivotButton: opts.pivotButton,\n applyProtection: opts.applyProtection,\n protection: opts.protection,\n };\n\n const key = this.cellXfKey(xf);\n const existing = this.cellXfKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.cellXfs.length;\n this.cellXfs.push(xf);\n this.cellXfKeys.set(key, idx);\n return idx;\n }\n\n /**\n * Register a differential format and return its index (dxfId).\n * Used by conditional formatting rules.\n */\n public registerDxf(opts: DxfOptions): number {\n const idx = this.dxfs.length;\n this.dxfs.push(opts);\n return idx;\n }\n\n /**\n * Set the dxf list from parsed options. `[]` (the source declared an empty\n * `<dxfs/>` container) is distinct from never setting it (fresh document).\n */\n public setDxfs(list: DxfOptions[]): void {\n this.dxfs = [...list];\n this.dxfsDeclared = true;\n }\n\n /**\n * Set color palette (indexed colors and MRU colors).\n */\n public setColors(opts: ColorsOptions): void {\n this.colors = opts;\n }\n\n public setTableStyles(styles: CustomTableStyleOptions[]): void {\n this.tableStyles = styles;\n }\n\n public setExtensions(extensions: StyleExtensionOptions[]): void {\n this.styleExtensions = extensions;\n }\n\n public setCustomCellStyles(styles: CustomCellStyleOptions[]): void {\n this.customCellStyles = styles;\n }\n\n /**\n * Set named cell-style templates (cellStyleXfs). Each entry's font/fill/\n * border/numFmt definitions are re-registered (deduplicated) so indices track\n * the rebuilt tables. Entries keep source order, keeping cellStyle.xfId\n * references stable (oldIndex === newIndex). Alignment/protection and the\n * applyXxx flags are preserved verbatim for named-style fidelity.\n */\n public setCellStyleXfs(entries: CellStyleXfOptions[]): void {\n this.cellStyleXfs = entries.map((entry) => ({\n fontId: this.registerFont(entry.font),\n fillId: this.registerFill(entry.fill),\n borderId: this.registerBorder(entry.border),\n numFmtId: this.registerNumFmt(entry.numFmt),\n alignment: entry.alignment,\n protection: entry.protection,\n quotePrefix: entry.quotePrefix,\n pivotButton: entry.pivotButton,\n applyNumberFormat: entry.applyNumberFormat,\n applyFont: entry.applyFont,\n applyFill: entry.applyFill,\n applyBorder: entry.applyBorder,\n applyAlignment: entry.applyAlignment,\n applyProtection: entry.applyProtection,\n }));\n }\n\n /**\n * Expose internal state for descriptor-based XML generation.\n * The descriptor reads this snapshot to produce xl/styles.xml.\n */\n public toDescriptorOptions(): StylesState {\n return {\n customNumFmts: new Map(this.customNumFmts),\n fonts: [...this.fonts],\n fills: [...this.fills],\n borders: [...this.borders],\n cellXfs: [...this.cellXfs],\n dxfs: [...this.dxfs],\n colors: this.colors,\n tableStyles: this.tableStyles,\n customCellStyles: this.customCellStyles,\n styleExtensions: this.styleExtensions,\n };\n }\n\n private registerFont(opts?: FontOptions): number {\n if (!opts) return 0;\n const key = fontKey(opts);\n const existing = this.fontKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.fonts.length;\n this.fonts.push(opts);\n this.fontKeys.set(key, idx);\n return idx;\n }\n\n private registerFill(opts?: CellFillOptions): number {\n if (!opts) return 0;\n const key = fillKey(opts);\n const existing = this.fillKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.fills.length;\n this.fills.push(opts);\n this.fillKeys.set(key, idx);\n return idx;\n }\n\n private registerBorder(opts?: BorderSideOptions): number {\n if (!opts) return 0;\n const key = borderKey(opts);\n const existing = this.borderKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.borders.length;\n this.borders.push(opts);\n this.borderKeys.set(key, idx);\n return idx;\n }\n\n private registerNumFmt(fmt?: string): number {\n if (!fmt) return 0;\n const builtin = BUILTIN_NUMFMTS[fmt];\n if (builtin !== undefined) return builtin;\n\n const existing = this.customNumFmts.get(fmt);\n if (existing !== undefined) return existing;\n\n const id = this.nextCustomNumFmtId++;\n this.customNumFmts.set(fmt, id);\n return id;\n }\n\n private cellXfKey(xf: {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n xfId?: number;\n alignment?: AlignmentOptions;\n quotePrefix?: boolean;\n pivotButton?: boolean;\n applyProtection?: boolean;\n protection?: CellProtectionOptions;\n }): string {\n const a = xf.alignment;\n const ak = a\n ? `h${a.horizontal ?? \"\"}v${a.vertical ?? \"\"}w${a.wrapText ? 1 : 0}r${a.textRotation ?? \"\"}i${a.indent ?? \"\"}ri${a.relativeIndent ?? \"\"}jl${a.justifyLastLine ? 1 : 0}st${a.shrinkToFit ? 1 : 0}ro${a.readingOrder ?? \"\"}`\n : \"\";\n const pr = xf.protection;\n const pk = pr ? `l${pr.locked ?? \"\"}h${pr.hidden ?? \"\"}` : \"\";\n return `${xf.fontId}|${xf.fillId}|${xf.borderId}|${xf.numFmtId}|x${xf.xfId ?? \"\"}|${ak}|qp${xf.quotePrefix ? 1 : 0}|pb${xf.pivotButton ? 1 : 0}|${pk}`;\n }\n\n /**\n * Adopt a parsed source style table wholesale, replacing the fresh-file\n * defaults (the SDK's Stylesheet model: the table is a unit, cells carry\n * its indices). Fonts/fills/borders/cellXfs keep their source order, so raw\n * cell indices resolve exactly as they did in the source file; styles\n * registered afterwards dedup against the adopted entries and extend the\n * index space at the end.\n */\n public adopt(table: {\n fonts?: FontOptions[];\n fills?: CellFillOptions[];\n borders?: BorderSideOptions[];\n cellXfs?: IndexedXfEntry[];\n numFmts?: NumFmtEntry[];\n }): void {\n this.roundTrip = true;\n this.fonts = table.fonts ? [...table.fonts] : [this.fonts[0]!];\n this.fontKeys = new Map(this.fonts.map((f, i) => [fontKey(f), i]));\n this.fills = table.fills\n ? [...table.fills]\n : [{ patternType: \"none\" }, { patternType: \"gray125\" }];\n this.fillKeys = new Map(this.fills.map((f, i) => [fillKey(f), i]));\n this.borders = table.borders ? [...table.borders] : [{}];\n this.borderKeys = new Map(this.borders.map((b, i) => [borderKey(b), i]));\n this.cellXfs = (table.cellXfs ?? [{ fontId: 0, fillId: 0, borderId: 0, numFmtId: 0 }]).map(\n (e) => ({\n fontId: e.fontId ?? 0,\n fillId: e.fillId ?? 0,\n borderId: e.borderId ?? 0,\n numFmtId: e.numFmtId ?? 0,\n xfId: e.xfId,\n alignment: e.alignment,\n quotePrefix: e.quotePrefix,\n pivotButton: e.pivotButton,\n applyProtection: e.applyProtection,\n protection: e.protection,\n applyFont: e.applyFont,\n applyFill: e.applyFill,\n applyBorder: e.applyBorder,\n applyNumberFormat: e.applyNumberFormat,\n applyAlignment: e.applyAlignment,\n }),\n );\n this.cellXfKeys = new Map(this.cellXfs.map((xf, i) => [this.cellXfKey(xf), i]));\n if (table.numFmts) {\n this.numFmtsDeclared = true;\n this.customNumFmts = new Map(table.numFmts.map((e) => [e.formatCode, e.numFmtId]));\n for (const id of this.customNumFmts.values()) {\n if (id >= this.nextCustomNumFmtId) this.nextCustomNumFmtId = id + 1;\n }\n }\n }\n\n // ── XML generation ──\n\n /**\n * Zero-allocation fast path: directly concatenate XML string.\n * Bypasses the intermediate object tree entirely.\n */\n /** Serialize to xl/styles.xml content (without XML declaration). */\n public serialize(): string {\n const p: string[] = [\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n\n // numFmts\n if (this.customNumFmts.size > 0) {\n p.push(`<numFmts count=\"${this.customNumFmts.size}\">`);\n for (const [fmt, id] of this.customNumFmts) {\n p.push(`<numFmt numFmtId=\"${id}\" formatCode=\"${escapeXml(fmt)}\"/>`);\n }\n p.push(\"</numFmts>\");\n } else if (this.numFmtsDeclared) {\n p.push('<numFmts count=\"0\"/>');\n }\n\n // fonts (empty = adopted empty table; XSD-required sections are only\n // omitted when the source's styles.xml carried nothing at all)\n if (this.fonts.length > 0) {\n p.push(`<fonts count=\"${this.fonts.length}\">`);\n for (const f of this.fonts) {\n p.push(`<font>${this.fontXmlStr(f)}</font>`);\n }\n p.push(\"</fonts>\");\n }\n\n // fills\n if (this.fills.length > 0) {\n p.push(`<fills count=\"${this.fills.length}\">`);\n for (const f of this.fills) {\n if (f.type === \"gradient\" && f.stops && f.stops.length > 0) {\n const gfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (f.gradientType && f.gradientType !== \"linear\") gfAttrs.type = f.gradientType;\n if (f.gradientDegree !== undefined) gfAttrs.degree = f.gradientDegree;\n if (f.gradientLeft !== undefined) gfAttrs.left = f.gradientLeft;\n if (f.gradientRight !== undefined) gfAttrs.right = f.gradientRight;\n if (f.gradientTop !== undefined) gfAttrs.top = f.gradientTop;\n if (f.gradientBottom !== undefined) gfAttrs.bottom = f.gradientBottom;\n const stopParts = f.stops\n .map((s) => `<stop position=\"${s.position}\"><color rgb=\"FF${s.color}\"/></stop>`)\n .join(\"\");\n p.push(`<fill><gradientFill${attrs(gfAttrs)}>${stopParts}</gradientFill></fill>`);\n } else {\n const patternAttrs = attrs({ patternType: f.patternType ?? \"solid\" });\n const fgChannel =\n f.themeColor !== undefined\n ? `theme=\"${f.themeColor}\"`\n : f.colorIndexed !== undefined\n ? `indexed=\"${f.colorIndexed}\"`\n : f.color\n ? `rgb=\"FF${f.color}\"`\n : f.fgAutoColor\n ? 'auto=\"1\"'\n : \"\";\n const fgTint = f.tint !== undefined ? ` tint=\"${f.tint}\"` : \"\";\n const fgColor = fgChannel ? `<fgColor ${fgChannel}${fgTint}/>` : \"\";\n const bgChannel =\n f.bgThemeColor !== undefined\n ? `theme=\"${f.bgThemeColor}\"`\n : f.bgColorIndexed !== undefined\n ? `indexed=\"${f.bgColorIndexed}\"`\n : f.bgColor\n ? `rgb=\"FF${f.bgColor}\"`\n : f.bgAutoColor\n ? 'auto=\"1\"'\n : \"\";\n const bgTint = f.bgTint !== undefined ? ` tint=\"${f.bgTint}\"` : \"\";\n const bgColor = bgChannel ? `<bgColor ${bgChannel}${bgTint}/>` : \"\";\n const colorContent = fgColor + bgColor;\n p.push(\n colorContent\n ? `<fill><patternFill${patternAttrs}>${colorContent}</patternFill></fill>`\n : `<fill><patternFill${patternAttrs}/></fill>`,\n );\n }\n }\n p.push(\"</fills>\");\n }\n\n // borders\n if (this.borders.length > 0) {\n p.push(`<borders count=\"${this.borders.length}\">`);\n for (const b of this.borders) {\n const bAttrs: string[] = [];\n if (b.diagonalUp) bAttrs.push('diagonalUp=\"1\"');\n if (b.diagonalDown) bAttrs.push('diagonalDown=\"1\"');\n const bAttr = bAttrs.length ? ` ${bAttrs.join(\" \")}` : \"\";\n p.push(`<border${bAttr}>${this.borderXmlStr(b)}</border>`);\n }\n p.push(\"</borders>\");\n }\n\n // cellStyleXfs — named-style templates; applyXxx preserved verbatim (not derived)\n if (this.cellStyleXfs.length > 0) {\n p.push(`<cellStyleXfs count=\"${this.cellStyleXfs.length}\">`);\n for (const xf of this.cellStyleXfs) {\n const xAttrs: Record<string, string | number | boolean | undefined> = {\n numFmtId: xf.numFmtId,\n fontId: xf.fontId,\n fillId: xf.fillId,\n borderId: xf.borderId,\n };\n if (xf.applyNumberFormat) xAttrs.applyNumberFormat = 1;\n if (xf.applyFont) xAttrs.applyFont = 1;\n if (xf.applyFill) xAttrs.applyFill = 1;\n if (xf.applyBorder) xAttrs.applyBorder = 1;\n if (xf.applyAlignment) xAttrs.applyAlignment = 1;\n if (xf.applyProtection) xAttrs.applyProtection = 1;\n if (xf.quotePrefix) xAttrs.quotePrefix = 1;\n if (xf.pivotButton) xAttrs.pivotButton = 1;\n const alignStr = xf.alignment ? this.alignmentXmlStr(xf.alignment) : \"\";\n const protStr = xf.protection ? this.protectionXmlStr(xf.protection) : \"\";\n const inner = alignStr + protStr;\n p.push(inner ? `<xf${attrs(xAttrs)}>${inner}</xf>` : `<xf${attrs(xAttrs)}/>`);\n }\n p.push(\"</cellStyleXfs>\");\n }\n\n // cellXfs\n if (this.cellXfs.length > 0) {\n p.push(`<cellXfs count=\"${this.cellXfs.length}\">`);\n for (const xf of this.cellXfs) {\n const xAttrs: Record<string, string | number | boolean | undefined> = {\n numFmtId: xf.numFmtId,\n fontId: xf.fontId,\n fillId: xf.fillId,\n borderId: xf.borderId,\n xfId: xf.xfId ?? 0,\n };\n // Adopted xfs carry their source apply* flags verbatim; freshly\n // registered ones derive them from non-zero component ids.\n const applyFont = xf.applyFont ?? (xf.fontId > 0 || undefined);\n const applyFill = xf.applyFill ?? (xf.fillId > 0 || undefined);\n const applyBorder = xf.applyBorder ?? (xf.borderId > 0 || undefined);\n const applyNumberFormat = xf.applyNumberFormat ?? (xf.numFmtId > 0 || undefined);\n const applyAlignment = xf.applyAlignment ?? (xf.alignment ? true : undefined);\n if (applyFont) xAttrs.applyFont = 1;\n if (applyFill) xAttrs.applyFill = 1;\n if (applyBorder) xAttrs.applyBorder = 1;\n if (applyNumberFormat) xAttrs.applyNumberFormat = 1;\n if (applyAlignment) xAttrs.applyAlignment = 1;\n if (xf.quotePrefix) xAttrs.quotePrefix = 1;\n if (xf.pivotButton) xAttrs.pivotButton = 1;\n if (xf.applyProtection) xAttrs.applyProtection = 1;\n if (xf.protection) xAttrs.applyProtection = xAttrs.applyProtection ?? 1;\n\n const alignStr = xf.alignment ? this.alignmentXmlStr(xf.alignment) : \"\";\n const protStr = xf.protection ? this.protectionXmlStr(xf.protection) : \"\";\n const inner = alignStr + protStr;\n p.push(inner ? `<xf${attrs(xAttrs)}>${inner}</xf>` : `<xf${attrs(xAttrs)}/>`);\n }\n p.push(\"</cellXfs>\");\n }\n\n // cellStyles — undefined = fresh document (emit the implicit Normal);\n // [] = adopted empty list (emit the empty container verbatim)\n if (this.customCellStyles !== undefined) {\n if (this.customCellStyles.length === 0) {\n p.push('<cellStyles count=\"0\"/>');\n } else {\n // Normal (builtinId=0) is the implicit default; only auto-add it when\n // the caller's list doesn't already include it, so a parsed list\n // containing Normal round-trips instead of producing a duplicate.\n // Some sources omit builtinId — fall back to the name.\n const hasNormal = this.customCellStyles.some(\n (cs) => cs.builtinId === 0 || cs.name === \"Normal\",\n );\n const csAttrs: string[] = [`count=\"${this.customCellStyles.length + (hasNormal ? 0 : 1)}\"`];\n const csParts: string[] = [`<cellStyles ${csAttrs.join(\" \")}>`];\n if (!hasNormal) csParts.push('<cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>');\n for (const cs of this.customCellStyles) {\n const attrs: string[] = [`name=\"${escapeXml(cs.name)}\"`, `xfId=\"${cs.xfId}\"`];\n if (cs.builtinId !== undefined) attrs.push(`builtinId=\"${cs.builtinId}\"`);\n if (cs.customBuiltin) attrs.push('customBuiltin=\"1\"');\n if (cs.iLevel !== undefined) attrs.push(`iLevel=\"${cs.iLevel}\"`);\n if (cs.hidden) attrs.push('hidden=\"1\"');\n csParts.push(`<cellStyle ${attrs.join(\" \")}/>`);\n }\n csParts.push(\"</cellStyles>\");\n p.push(csParts.join(\"\"));\n }\n } else if (!this.roundTrip) {\n p.push(\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>',\n );\n }\n\n // dxfs\n if (this.dxfs.length > 0) {\n p.push(`<dxfs count=\"${this.dxfs.length}\">`);\n for (const dxf of this.dxfs) {\n const dParts: string[] = [];\n // CT_Dxf sequence: font, numFmt, fill, alignment, border, protection.\n if (dxf.font) dParts.push(`<font>${this.fontXmlStr(dxf.font)}</font>`);\n if (dxf.numFmt) {\n const nf = typeof dxf.numFmt === \"string\" ? { formatCode: dxf.numFmt } : dxf.numFmt;\n // CT_NumFmt requires numFmtId; resolve from the built-in table and\n // fall back to the custom range when the code is not built-in.\n const numFmtId = nf.numFmtId ?? BUILTIN_NUMFMTS[nf.formatCode] ?? 164;\n dParts.push(`<numFmt numFmtId=\"${numFmtId}\" formatCode=\"${escapeXml(nf.formatCode)}\"/>`);\n }\n if (dxf.fill) {\n const f = dxf.fill;\n // Excel's dxf fill convention: the visible tint color carries on\n // bgColor (often with no patternType). Round-trips keep both color\n // elements as written; a fresh color-only fill (no bg channel) falls\n // back to bgColor so conditional formatting keeps showing the color.\n const patAttrs = f.patternType !== undefined ? attrs({ patternType: f.patternType }) : \"\";\n const hasBg =\n f.bgColor !== undefined ||\n f.bgColorIndexed !== undefined ||\n f.bgThemeColor !== undefined ||\n f.bgAutoColor !== undefined;\n // With a bg channel present the color field is the parsed fgColor;\n // alone it is the fresh-authoring color that lands on bgColor.\n const fgChannel =\n f.themeColor !== undefined\n ? `theme=\"${f.themeColor}\"`\n : f.colorIndexed !== undefined\n ? `indexed=\"${f.colorIndexed}\"`\n : f.color && hasBg\n ? `rgb=\"FF${f.color}\"`\n : f.fgAutoColor\n ? 'auto=\"1\"'\n : \"\";\n const fgTint = f.tint !== undefined ? ` tint=\"${f.tint}\"` : \"\";\n const fgContent = fgChannel ? `<fgColor ${fgChannel}${fgTint}/>` : \"\";\n const bgChannel =\n f.bgThemeColor !== undefined\n ? `theme=\"${f.bgThemeColor}\"`\n : f.bgColorIndexed !== undefined\n ? `indexed=\"${f.bgColorIndexed}\"`\n : f.bgColor\n ? `rgb=\"FF${f.bgColor}\"`\n : f.bgAutoColor\n ? 'auto=\"1\"'\n : f.color && !hasBg\n ? `rgb=\"FF${f.color}\"`\n : \"\";\n const bgTint = f.bgTint !== undefined ? ` tint=\"${f.bgTint}\"` : \"\";\n const bgContent = bgChannel ? `<bgColor ${bgChannel}${bgTint}/>` : \"\";\n const fillContent = fgContent + bgContent;\n dParts.push(\n fillContent\n ? `<fill><patternFill${patAttrs}>${fillContent}</patternFill></fill>`\n : `<fill><patternFill${patAttrs}/></fill>`,\n );\n }\n if (dxf.alignment) dParts.push(this.alignmentXmlStr(dxf.alignment));\n // dxf borders carry only the sides the source wrote — no padding\n if (dxf.border) dParts.push(`<border>${this.borderXmlStr(dxf.border, false)}</border>`);\n if (dxf.protection) dParts.push(this.protectionXmlStr(dxf.protection));\n if (dParts.length > 0) {\n p.push(`<dxf>${dParts.join(\"\")}</dxf>`);\n } else {\n p.push(\"<dxf/>\");\n }\n }\n p.push(\"</dxfs>\");\n } else if (this.dxfsDeclared || !this.roundTrip) {\n // Excel's fresh-file convention (and sources declaring an empty\n // container) write it; a round-trip source that omitted the section\n // keeps it omitted.\n p.push('<dxfs count=\"0\"/>');\n }\n // tableStyles (CT_TableStyles)\n if (this.tableStyles && this.tableStyles.length > 0) {\n const tsParts: string[] = [\n `<tableStyles count=\"${this.tableStyles.length}\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\">`,\n ];\n for (const ts of this.tableStyles) {\n const tsAttrs: string[] = [`name=\"${escapeXml(ts.name)}\"`];\n if (ts.pivot) tsAttrs.push('pivot=\"1\"');\n if (ts.table === false) tsAttrs.push('table=\"0\"');\n if (ts.elements && ts.elements.length > 0) {\n tsParts.push(`<tableStyle ${tsAttrs.join(\" \")}>`);\n for (const el of ts.elements) {\n const elAttrs: string[] = [`type=\"${el.type}\"`];\n if (el.dxfId !== undefined) elAttrs.push(`dxfId=\"${el.dxfId}\"`);\n tsParts.push(`<tableStyleElement ${elAttrs.join(\" \")}/>`);\n }\n tsParts.push(\"</tableStyle>\");\n } else {\n tsParts.push(`<tableStyle ${tsAttrs.join(\" \")}/>`);\n }\n }\n tsParts.push(\"</tableStyles>\");\n p.push(tsParts.join(\"\"));\n } else if (this.tableStyles !== undefined || !this.roundTrip) {\n // Fresh files (and sources declaring an empty container) write the\n // defaults; a round-trip source without the section omits it.\n p.push(\n '<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>',\n );\n }\n\n // colors (optional color palette)\n if (this.colors) {\n const c = this.colors;\n const colorParts: string[] = [\"<colors>\"];\n if (c.indexedColors && c.indexedColors.length > 0) {\n colorParts.push(\"<indexedColors>\");\n for (const ic of c.indexedColors) {\n colorParts.push(`<rgbColor rgb=\"${ic.rgb}\"/>`);\n }\n colorParts.push(\"</indexedColors>\");\n }\n if (c.mruColors && c.mruColors.length > 0) {\n colorParts.push(\"<mruColors>\");\n for (const mc of c.mruColors) {\n colorParts.push(`<color rgb=\"FF${mc}\"/>`);\n }\n colorParts.push(\"</mruColors>\");\n }\n colorParts.push(\"</colors>\");\n p.push(colorParts.join(\"\"));\n }\n\n // extLst — style sheet extensions\n if (this.styleExtensions && this.styleExtensions.length > 0) {\n const extParts: string[] = [\"<extLst>\"];\n for (const ext of this.styleExtensions) {\n const ns = Object.entries(ext.namespaces ?? {})\n .map(([name, value]) => ` ${name}=\"${value}\"`)\n .join(\"\");\n if (ext.content) {\n extParts.push(`<ext uri=\"${ext.uri}\"${ns}>${ext.content}</ext>`);\n } else {\n extParts.push(`<ext uri=\"${ext.uri}\"${ns}/>`);\n }\n }\n extParts.push(\"</extLst>\");\n p.push(extParts.join(\"\"));\n }\n\n p.push(\"</styleSheet>\");\n return p.join(\"\");\n }\n\n private fontXmlStr(f: FontOptions): string {\n const parts: string[] = [];\n // CT_BooleanProperty val defaults to true — an explicit false round-trips\n // as val=\"0\", an absent flag emits nothing.\n const flag = (name: string, on: boolean | undefined): void => {\n if (on === undefined) return;\n parts.push(on ? `<${name}/>` : `<${name} val=\"0\"/>`);\n };\n // x:font child order follows Excel's writer (and the Open XML SDK particle):\n // b, i, strike, condense, extend, outline, shadow, u, vertAlign, sz, color,\n // name, family, charset, scheme — the literal ISO sequence (name/charset/\n // family leading) matches no real-world file\n flag(\"b\", f.bold);\n flag(\"i\", f.italic);\n flag(\"strike\", f.strike);\n flag(\"condense\", f.condense);\n flag(\"extend\", f.extend);\n flag(\"outline\", f.outline);\n flag(\"shadow\", f.shadow);\n if (f.underline !== undefined) parts.push(f.underline ? \"<u/>\" : '<u val=\"none\"/>');\n if (f.vertAlign) parts.push(`<vertAlign val=\"${f.vertAlign}\"/>`);\n if (f.size) parts.push(`<sz val=\"${f.size}\"/>`);\n if (f.autoColor) parts.push('<color auto=\"1\"/>');\n else if (f.themeColor !== undefined)\n parts.push(\n `<color theme=\"${f.themeColor}\"${f.tint !== undefined ? ` tint=\"${f.tint}\"` : \"\"}/>`,\n );\n else if (f.colorIndexed !== undefined) parts.push(`<color indexed=\"${f.colorIndexed}\"/>`);\n else if (f.color) parts.push(`<color rgb=\"FF${f.color}\"/>`);\n if (f.font) parts.push(`<name val=\"${escapeXml(f.font)}\"/>`);\n if (f.family !== undefined) parts.push(`<family val=\"${f.family}\"/>`);\n if (f.charset !== undefined) parts.push(`<charset val=\"${f.charset}\"/>`);\n if (f.scheme) parts.push(`<scheme val=\"${f.scheme}\"/>`);\n return parts.join(\"\");\n }\n\n /**\n * Serialize a border. `allSides` pads the five cell sides Excel always\n * writes (cellXfs context); dxf borders carry only the sides present.\n */\n private borderXmlStr(b: BorderSideOptions, allSides = true): string {\n const parts: string[] = [];\n const sideColorXmlStr = (side: BorderOptions): string => {\n if (side.autoColor) return '<color auto=\"1\"/>';\n if (side.themeColor !== undefined)\n return `<color theme=\"${side.themeColor}\"${side.tint !== undefined ? ` tint=\"${side.tint}\"` : \"\"}/>`;\n if (side.colorIndexed !== undefined) return `<color indexed=\"${side.colorIndexed}\"/>`;\n if (side.color) return `<color rgb=\"FF${side.color}\"/>`;\n return \"\";\n };\n const renderSide = (name: string, opts: BorderOptions | undefined, required: boolean) => {\n if (opts?.style && opts.style !== \"none\") {\n parts.push(`<${name} style=\"${opts.style}\">${sideColorXmlStr(opts)}</${name}>`);\n } else if (opts || required) {\n parts.push(`<${name}/>`);\n }\n };\n const cellSides = [\"left\", \"right\", \"top\", \"bottom\", \"diagonal\"] as const;\n for (const side of cellSides) {\n renderSide(side, b[side] as BorderOptions | undefined, allSides);\n }\n // vertical/horizontal/start/end: cell-range or RTL sides, only when present\n renderSide(\"vertical\", b.vertical, false);\n renderSide(\"horizontal\", b.horizontal, false);\n // start/end not in transitional XSD — only emit when present\n renderSide(\"start\", b.start, false);\n renderSide(\"end\", b.end, false);\n return parts.join(\"\");\n }\n\n private alignmentXmlStr(a: AlignmentOptions): string {\n const aAttrs: Record<string, string | number | boolean | undefined> = {};\n if (a.horizontal) aAttrs.horizontal = a.horizontal;\n if (a.vertical) aAttrs.vertical = a.vertical;\n if (a.wrapText) aAttrs.wrapText = 1;\n if (a.textRotation !== undefined) aAttrs.textRotation = a.textRotation;\n if (a.indent !== undefined) aAttrs.indent = a.indent;\n if (a.relativeIndent !== undefined) aAttrs.relativeIndent = a.relativeIndent;\n if (a.justifyLastLine) aAttrs.justifyLastLine = 1;\n if (a.shrinkToFit) aAttrs.shrinkToFit = 1;\n if (a.readingOrder !== undefined) aAttrs.readingOrder = a.readingOrder;\n return `<alignment${attrs(aAttrs)}/>`;\n }\n\n private protectionXmlStr(pr: CellProtectionOptions): string {\n const prAttrs: Record<string, string | number | boolean | undefined> = {};\n if (pr.locked !== undefined) prAttrs.locked = pr.locked ? 1 : 0;\n if (pr.hidden !== undefined) prAttrs.hidden = pr.hidden ? 1 : 0;\n return `<protection${attrs(prAttrs)}/>`;\n }\n}\n","/**\n * Styles — descriptor for xl/styles.xml (stringify delegates to\n * {@link Styles.serialize}; parse rebuilds the structured tables).\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor, WriteContext } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, findChild, stringifyElement } from \"@office-open/xml\";\n\nimport {\n parseAlignment,\n parseBorder,\n parseColorHex,\n parseFill,\n parseFont,\n parseProtection,\n} from \"./parse\";\nimport type {\n CellStyleXfOptions,\n ColorsOptions,\n CustomCellStyleOptions,\n CustomTableStyleOptions,\n DxfOptions,\n CellFillOptions,\n FontOptions,\n IndexedColorOptions,\n IndexedXfEntry,\n NumFmtEntry,\n BorderSideOptions,\n StyleExtensionOptions,\n StylesDocOptions,\n StylesParseResult,\n TableStyleElementOptions,\n TableStyleElementType,\n TableStylesInfo,\n} from \"./types\";\n\n// ── Descriptor ──\n\nexport const stylesDesc: CustomDescriptor<StylesDocOptions, WriteContext, StylesParseResult> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return opts.styles.serialize();\n },\n\n parse(el, _ctx) {\n const result: StylesParseResult = {};\n\n // numFmtById / fonts / fills / borders are hoisted so the cellStyleXfs\n // section can resolve index references into font/fill/border/numFmt defs.\n const numFmtById = new Map<number, string>();\n const fonts: FontOptions[] = [];\n const fills: CellFillOptions[] = [];\n const borders: BorderSideOptions[] = [];\n\n // numFmts\n const numFmtsEl = findChild(el, \"numFmts\");\n if (numFmtsEl) {\n const entries: NumFmtEntry[] = [];\n for (const nf of numFmtsEl.elements ?? []) {\n if (nf.name !== \"numFmt\") continue;\n const id = attrNum(nf, \"numFmtId\");\n const code = attr(nf, \"formatCode\");\n if (id !== undefined && code) {\n numFmtById.set(id, code);\n entries.push({ numFmtId: id, formatCode: code });\n }\n }\n result.numFmts = entries;\n }\n\n // fonts\n const fontsEl = findChild(el, \"fonts\");\n if (fontsEl) {\n for (const f of fontsEl.elements ?? []) {\n if (f.name !== \"font\") continue;\n fonts.push(parseFont(f));\n }\n result.fonts = fonts;\n }\n\n // fills\n const fillsEl = findChild(el, \"fills\");\n if (fillsEl) {\n for (const f of fillsEl.elements ?? []) {\n if (f.name !== \"fill\") continue;\n fills.push(parseFill(f));\n }\n result.fills = fills;\n }\n\n // borders\n const bordersEl = findChild(el, \"borders\");\n if (bordersEl) {\n for (const b of bordersEl.elements ?? []) {\n if (b.name !== \"border\") continue;\n borders.push(parseBorder(b));\n }\n result.borders = borders;\n }\n\n // cellStyleXfs — resolve indices into font/fill/border/numFmt definitions.\n // nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\" to numbers, so the\n // boolean applyXxx/quotePrefix/pivotButton checks use String() coercion.\n const cellStyleXfsEl = findChild(el, \"cellStyleXfs\");\n if (cellStyleXfsEl) {\n const xfs: CellStyleXfOptions[] = [];\n for (const xf of cellStyleXfsEl.elements ?? []) {\n if (xf.name !== \"xf\") continue;\n const entry: CellStyleXfOptions = {};\n const fontId = attrNum(xf, \"fontId\");\n const fillId = attrNum(xf, \"fillId\");\n const borderId = attrNum(xf, \"borderId\");\n const numFmtId = attrNum(xf, \"numFmtId\");\n if (fontId !== undefined && fontId < fonts.length) entry.font = fonts[fontId];\n if (fillId !== undefined && fillId < fills.length) entry.fill = fills[fillId];\n if (borderId !== undefined && borderId < borders.length) entry.border = borders[borderId];\n if (numFmtId !== undefined) {\n const code = numFmtById.get(numFmtId);\n if (code !== undefined) entry.numFmt = code;\n }\n const alignmentEl = findChild(xf, \"alignment\");\n if (alignmentEl) entry.alignment = parseAlignment(alignmentEl);\n const protectionEl = findChild(xf, \"protection\");\n if (protectionEl) entry.protection = parseProtection(protectionEl);\n if (parseOnOff(attr(xf, \"applyNumberFormat\"))) entry.applyNumberFormat = true;\n if (parseOnOff(attr(xf, \"applyFont\"))) entry.applyFont = true;\n if (parseOnOff(attr(xf, \"applyFill\"))) entry.applyFill = true;\n if (parseOnOff(attr(xf, \"applyBorder\"))) entry.applyBorder = true;\n if (parseOnOff(attr(xf, \"applyAlignment\"))) entry.applyAlignment = true;\n if (parseOnOff(attr(xf, \"applyProtection\"))) entry.applyProtection = true;\n if (parseOnOff(attr(xf, \"quotePrefix\"))) entry.quotePrefix = true;\n if (parseOnOff(attr(xf, \"pivotButton\"))) entry.pivotButton = true;\n xfs.push(entry);\n }\n result.cellStyleXfs = xfs;\n }\n\n // cellXfs\n const cellXfsEl = findChild(el, \"cellXfs\");\n if (cellXfsEl) {\n const xfs: IndexedXfEntry[] = [];\n for (const xf of cellXfsEl.elements ?? []) {\n if (xf.name !== \"xf\") continue;\n const fontId = attrNum(xf, \"fontId\") ?? 0;\n const fillId = attrNum(xf, \"fillId\") ?? 0;\n const borderId = attrNum(xf, \"borderId\") ?? 0;\n const numFmtId = attrNum(xf, \"numFmtId\") ?? 0;\n\n const alignmentEl = findChild(xf, \"alignment\");\n const alignment = alignmentEl ? parseAlignment(alignmentEl) : undefined;\n\n const protectionEl = findChild(xf, \"protection\");\n const protection = protectionEl ? parseProtection(protectionEl) : undefined;\n\n const style: IndexedXfEntry = {};\n if (fontId > 0) style.fontId = fontId;\n if (fillId > 0) style.fillId = fillId;\n if (borderId > 0) style.borderId = borderId;\n if (numFmtId > 0) style.numFmtId = numFmtId;\n const xfId = attrNum(xf, \"xfId\");\n if (xfId !== undefined && xfId > 0) style.xfId = xfId;\n if (alignment) style.alignment = alignment;\n if (protection) style.protection = protection;\n // nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\" to numbers\n if (parseOnOff(attr(xf, \"quotePrefix\"))) style.quotePrefix = true;\n if (parseOnOff(attr(xf, \"pivotButton\"))) style.pivotButton = true;\n // apply* flags preserved verbatim — presence distinguishes a source\n // that wrote them from one that omitted them\n if (parseOnOff(attr(xf, \"applyFont\"))) style.applyFont = true;\n if (parseOnOff(attr(xf, \"applyFill\"))) style.applyFill = true;\n if (parseOnOff(attr(xf, \"applyBorder\"))) style.applyBorder = true;\n if (parseOnOff(attr(xf, \"applyNumberFormat\"))) style.applyNumberFormat = true;\n if (parseOnOff(attr(xf, \"applyAlignment\"))) style.applyAlignment = true;\n if (parseOnOff(attr(xf, \"applyProtection\"))) style.applyProtection = true;\n\n xfs.push(style);\n }\n result.cellXfs = xfs;\n }\n\n // cellStyles\n const cellStylesEl = findChild(el, \"cellStyles\");\n if (cellStylesEl) {\n const styles: CustomCellStyleOptions[] = [];\n for (const cs of cellStylesEl.elements ?? []) {\n if (cs.name !== \"cellStyle\") continue;\n const style: Partial<CustomCellStyleOptions> = {};\n if (attr(cs, \"name\")) style.name = attr(cs, \"name\");\n const xfId = attrNum(cs, \"xfId\");\n if (xfId !== undefined) style.xfId = xfId;\n const builtinId = attrNum(cs, \"builtinId\");\n if (builtinId !== undefined) style.builtinId = builtinId;\n if (parseOnOff(attr(cs, \"customBuiltin\"))) style.customBuiltin = true;\n if (parseOnOff(attr(cs, \"hidden\"))) style.hidden = true;\n const iLevel = attrNum(cs, \"iLevel\");\n if (iLevel !== undefined) style.iLevel = iLevel;\n styles.push(style as CustomCellStyleOptions);\n }\n result.customCellStyles = styles;\n }\n\n // dxfs\n const dxfsEl = findChild(el, \"dxfs\");\n if (dxfsEl) {\n const dxfs: DxfOptions[] = [];\n for (const dxf of dxfsEl.elements ?? []) {\n if (dxf.name !== \"dxf\") continue;\n const d: DxfOptions = {};\n const fontEl = findChild(dxf, \"font\");\n if (fontEl) d.font = parseFont(fontEl);\n const fillEl = findChild(dxf, \"fill\");\n if (fillEl) d.fill = parseFill(fillEl);\n const borderEl = findChild(dxf, \"border\");\n if (borderEl) d.border = parseBorder(borderEl);\n const numFmtEl = findChild(dxf, \"numFmt\");\n if (numFmtEl && attr(numFmtEl, \"formatCode\")) {\n const nf: { numFmtId?: number; formatCode: string } = {\n formatCode: attr(numFmtEl, \"formatCode\")!,\n };\n const numFmtId = attrNum(numFmtEl, \"numFmtId\");\n if (numFmtId !== undefined) nf.numFmtId = numFmtId;\n d.numFmt = nf;\n }\n const alignmentEl = findChild(dxf, \"alignment\");\n if (alignmentEl) d.alignment = parseAlignment(alignmentEl);\n const protectionEl = findChild(dxf, \"protection\");\n if (protectionEl) d.protection = parseProtection(protectionEl);\n dxfs.push(d);\n }\n result.dxfs = dxfs;\n }\n\n // tableStyles\n const tableStylesEl = findChild(el, \"tableStyles\");\n if (tableStylesEl?.attributes) {\n const ts: TableStylesInfo = {};\n if (attr(tableStylesEl, \"count\") !== undefined)\n ts.count = attrNum(tableStylesEl, \"count\") ?? 0;\n if (attr(tableStylesEl, \"defaultTableStyle\"))\n ts.defaultTableStyle = attr(tableStylesEl, \"defaultTableStyle\");\n if (attr(tableStylesEl, \"defaultPivotStyle\"))\n ts.defaultPivotStyle = attr(tableStylesEl, \"defaultPivotStyle\");\n const customStyles: CustomTableStyleOptions[] = [];\n for (const tse of tableStylesEl.elements ?? []) {\n if (tse.name !== \"tableStyle\") continue;\n const style: Partial<CustomTableStyleOptions> = {};\n if (attr(tse, \"name\")) style.name = attr(tse, \"name\");\n if (parseOnOff(attr(tse, \"pivot\"))) style.pivot = true;\n const elements: TableStyleElementOptions[] = [];\n for (const tsee of tse.elements ?? []) {\n if (tsee.name !== \"tableStyleElement\") continue;\n const elOpts: Partial<TableStyleElementOptions> = {};\n if (attr(tsee, \"type\")) elOpts.type = attr(tsee, \"type\") as TableStyleElementType;\n const dxfId = attrNum(tsee, \"dxfId\");\n if (dxfId !== undefined) elOpts.dxfId = dxfId;\n elements.push(elOpts as TableStyleElementOptions);\n }\n if (elements.length > 0) style.elements = elements;\n customStyles.push(style as CustomTableStyleOptions);\n }\n if (customStyles.length > 0) ts.tableStyles = customStyles;\n result.tableStylesInfo = ts;\n }\n\n // colors\n const colorsEl = findChild(el, \"colors\");\n if (colorsEl) {\n const colors: ColorsOptions = {};\n const icEl = findChild(colorsEl, \"indexedColors\");\n if (icEl) {\n const indexed: IndexedColorOptions[] = [];\n for (const rgb of icEl.elements ?? []) {\n if (rgb.name === \"rgbColor\" && attr(rgb, \"rgb\")) {\n indexed.push({ rgb: attr(rgb, \"rgb\")! });\n }\n }\n colors.indexedColors = indexed;\n }\n const mruEl = findChild(colorsEl, \"mruColors\");\n if (mruEl) {\n const mru: string[] = [];\n for (const c of mruEl.elements ?? []) {\n if (c.name === \"color\") {\n const hex = parseColorHex(c);\n if (hex) mru.push(hex);\n }\n }\n colors.mruColors = mru;\n }\n result.colors = colors;\n }\n\n // styleExtensions (extLst)\n const extLstEl = findChild(el, \"extLst\");\n if (extLstEl) {\n const exts: StyleExtensionOptions[] = [];\n for (const ext of extLstEl.elements ?? []) {\n if (ext.name !== \"ext\") continue;\n const uri = attr(ext, \"uri\");\n if (uri) {\n // Reconstruct the inner XML of the <ext> element verbatim — each\n // child serializes itself (stringify() writes the children OF the\n // element it is given, so passing the child returns \"\").\n const content = (ext.elements ?? []).map((e) => stringifyElement(e)).join(\"\");\n const namespaces: Record<string, string> = {};\n for (const [name, value] of Object.entries(ext.attributes ?? {})) {\n if (name.startsWith(\"xmlns:\") && typeof value === \"string\") namespaces[name] = value;\n }\n exts.push({\n uri,\n ...(Object.keys(namespaces).length > 0 ? { namespaces } : {}),\n ...(content ? { content } : {}),\n });\n }\n }\n result.styleExtensions = exts;\n }\n\n return result;\n },\n};\n","/**\n * Worksheet — option types for xl/worksheets/sheet{n}.xml.\n *\n * @module\n */\nimport type {\n BasePictureOptions,\n ChartSpaceOptions,\n DataType,\n NonVisualDrawingPropertiesOptions,\n PositiveUniversalMeasure,\n UniversalMeasure,\n} from \"@office-open/core\";\nimport type { ArgbHexColor, Base64, HexColor } from \"@office-open/core\";\nimport type {\n BlackWhiteMode,\n BlipEffectsOptions,\n GraphicFrameLockingOptions,\n PictureLockingOptions,\n ShapePropertiesOptions,\n SourceRectangleOptions,\n TextHyperlinkOptions,\n} from \"@office-open/core/drawing\";\n\nimport type {\n ConnectorOptions,\n DrawingAnchorOptions,\n GroupOptions,\n ShapeOptions,\n} from \"../drawing\";\nimport type { PivotTableOptions } from \"../pivot\";\nimport type { PivotAreaOptions } from \"../pivot/pivot-utils\";\nimport type { QueryTableOptions } from \"../query-table\";\nimport type { SharedStrings } from \"../shared-strings\";\nimport type { Styles, StyleOptions } from \"../styles\";\nimport type { TableOptions } from \"../table\";\nimport type { SingleXmlCellOptions } from \"../xml-mapping\";\n\n// ── Option interfaces ──\n\nexport interface ColumnOptions {\n min: number;\n max: number;\n width?: number;\n hidden?: boolean;\n customWidth?: boolean;\n outlineLevel?: number;\n collapsed?: boolean;\n /** Best-fit column width (CT_Col `@bestFit`) */\n bestFit?: boolean;\n /** Phonetic text for CJK (CT_Col `@phonetic`) */\n phonetic?: boolean;\n}\n\nexport interface RowOptions {\n cells?: CellOptions[];\n height?: number | UniversalMeasure;\n hidden?: boolean;\n rowNumber?: number;\n /** Spans for the row, e.g. \"1:15\" (CT_Row `@spans`) */\n spans?: string;\n /** Custom format applied (CT_Row `@customFormat`) */\n customFormat?: boolean;\n /** Thick top border (CT_Row `@thickTop`) */\n thickTop?: boolean;\n /** Thick bottom border (CT_Row `@thickBot`) */\n thickBot?: boolean;\n /** Phonetic text (CT_Row `@ph`) */\n phonetic?: boolean;\n /** Row outline level for grouping (CT_Row `@outlineLevel`, 0-7) */\n outlineLevel?: number;\n /** Collapsed outline state (CT_Row `@collapsed`) */\n collapsed?: boolean;\n /**\n * Row style: either style options (resolved to an index at compile time) or,\n * as a round-trip fallback, the raw styles.xml cellXfs index (CT_Row `@s`).\n */\n style?: StyleOptions | number;\n}\n\n/** Rich text run properties (CT_RPrElt). */\n/**\n * Rich-text run color — the single string parse emits and stringify decodes:\n * 6-digit RGB (alpha auto-prefixed), 8-digit ARGB verbatim, a legacy palette\n * index (\"10\"), or a \"theme:N\" slot reference.\n */\nexport type RichTextColor = string;\n\nexport interface RichTextRunPropertiesOptions {\n /** Font name (CT_FontName → rFont) */\n font?: string;\n /** Character set (CT_IntProperty) */\n charset?: number;\n /** Font family (CT_IntProperty) */\n family?: number;\n bold?: boolean;\n italic?: boolean;\n /** Strikethrough */\n strike?: boolean;\n outline?: boolean;\n shadow?: boolean;\n condense?: boolean;\n extend?: boolean;\n /**\n * Font color: 6-digit RGB (\"FF0000\", FF alpha auto-prefixed on emit),\n * 8-digit ARGB verbatim, a bare palette index (\"10\" → indexed), or\n * \"theme:N\" — the same string parse produces.\n */\n color?: RichTextColor;\n /** Font size in points */\n size?: number;\n /** Underline type */\n underline?: \"single\" | \"double\" | \"singleAccounting\" | \"doubleAccounting\" | \"none\";\n /** Vertical alignment */\n vertAlign?: \"superscript\" | \"subscript\" | \"baseline\";\n /** Font scheme */\n scheme?: \"major\" | \"minor\" | \"none\";\n}\n\n/** A single rich text run (CT_RElt). */\nexport interface RichTextRunOptions {\n /** Run properties (optional = inherits from parent) */\n properties?: RichTextRunPropertiesOptions;\n /** Run text content */\n text: string;\n}\n\n/** Phonetics run for CJK (CT_PhoneticRun → rPh). */\nexport interface PhoneticRunOptions {\n /** Start byte offset in base text (CT_PhoneticRun `@sb`) */\n startByte: number;\n /** End byte offset in base text (CT_PhoneticRun `@eb`) */\n endByte: number;\n /** Phonetic text */\n text: string;\n}\n\n/** Rich text content (CT_Rst). Either plain text or rich runs. */\nexport interface RichTextOptions {\n /** Plain text (mutually exclusive with runs) */\n text?: string;\n /** Rich text runs (mutually exclusive with text) */\n runs?: RichTextRunOptions[];\n /** Phonetic runs for CJK (CT_PhoneticRun) */\n phonetics?: PhoneticRunOptions[];\n /** Phonetic font/alignment settings (CT_PhoneticPr, si-level trailing element) */\n phoneticProperties?: PhoneticPropertiesOptions;\n}\n\nexport interface CellOptions {\n value?: string | number | boolean | Date | RichTextOptions | null;\n reference?: string;\n /**\n * Cell style: either style options (resolved to an index at compile time)\n * or, as a round-trip fallback, the raw styles.xml cellXfs index carried\n * from a source workbook whose style table could not be resolved.\n */\n style?: StyleOptions | number;\n /**\n * Formula options. When set, value becomes the cached result. A bare string\n * is shorthand for `{ formula: \"...\" }`.\n */\n formula?: string | FormulaOptions;\n /** Cell metadata block id, 1-based index into metadata.cellMetadata (CT_Cell `@cm`) */\n cellMetadataId?: number;\n /** Value metadata block id, 1-based index into metadata.valueMetadata (CT_Cell `@vm`) */\n valueMetadataId?: number;\n /**\n * Error value (CT_Cell `t=\"e\"`) — an Excel error literal like `#N/A` or\n * `#DIV/0!`. Emitted as `t=\"e\"` instead of registering into the shared\n * string table, matching the source cell type.\n */\n error?: string;\n}\n\n/** Cell formula type (maps to ST_CellFormulaType). */\nexport const FormulaType = {\n NORMAL: \"normal\",\n ARRAY: \"array\",\n SHARED: \"shared\",\n} as const;\n\nexport type FormulaType = (typeof FormulaType)[keyof typeof FormulaType];\n\n/** Options for a cell formula (maps to CT_CellFormula). */\nexport interface FormulaOptions {\n /** Formula expression, e.g. \"SUM(A1:B1)\" */\n formula: string;\n /** Formula type (default: \"normal\") */\n type?: FormulaType;\n /** Reference range for array/shared formulas, e.g. \"C1:C10\" */\n reference?: string;\n /** Shared formula group index (required for shared formulas) */\n sharedIndex?: number;\n /** Always calculate array (CT_CellFormula `@aca`) */\n aca?: boolean;\n /** 2-D data table (CT_CellFormula `@dt2D`) */\n dt2D?: boolean;\n /** Data table row (CT_CellFormula `@dtr`) */\n dtr?: boolean;\n /** Delete input cell 1 (CT_CellFormula `@del1`) */\n del1?: boolean;\n /** Delete input cell 2 (CT_CellFormula `@del2`) */\n del2?: boolean;\n /** Input cell 1 reference (CT_CellFormula `@r1`) */\n inputCell1?: string;\n /** Input cell 2 reference (CT_CellFormula `@r2`) */\n inputCell2?: string;\n /** Calculate cell (CT_CellFormula `@ca`) */\n calculateCell?: boolean;\n /** Array formula context (CT_CellFormula `@bx`) */\n arrayContext?: boolean;\n}\n\n/** Input cell for a what-if scenario (maps to CT_InputCells). */\nexport interface ScenarioCellOptions {\n /** Cell reference, e.g. \"B2\" (CT_InputCells `@r`) */\n reference: string;\n /** Cell value for this scenario */\n val: string | number;\n /** Whether the value is deleted */\n deleted?: boolean;\n /** Whether undone (CT_InputCells `@undone`) */\n undone?: boolean;\n}\n\n/** A single what-if scenario (maps to CT_Scenario). */\nexport interface ScenarioDefinition {\n /** Scenario name */\n name: string;\n /** Input cells with their values for this scenario */\n inputCells: ScenarioCellOptions[];\n /** Sort/order count */\n count?: number;\n /** Creator user name */\n user?: string;\n comment?: string;\n /** Whether the scenario is hidden */\n hidden?: boolean;\n /** Whether the scenario is locked */\n locked?: boolean;\n}\n\n/** Scenarios for what-if analysis (maps to CT_Scenarios). */\nexport interface ScenarioOptions {\n /** Named scenarios */\n scenarios: ScenarioDefinition[];\n /** Current scenario index (0-based) */\n current?: number;\n /** Show scenario index (0-based) */\n show?: number;\n}\n\nexport interface MergeCellOptions {\n /** Merged range reference, e.g. \"A1:D1\" (CT_MergeCell `ref` attribute) */\n ref: string;\n}\n\nexport interface SheetProtectionOptions {\n /**\n * Plain-text password — legacy Excel hash is computed automatically on\n * stringify. Authoring-only: not carried back by parse (the source stores a\n * hash; re-hashing it would corrupt it). Use the algorithmName quadruplet\n * below for round-trip.\n */\n password?: string;\n /** Modern encryption: algorithm name (e.g. \"SHA-512\") */\n algorithmName?: string;\n /** Modern encryption: base64-encoded hash value */\n hashValue?: Base64;\n /** Modern encryption: base64-encoded salt value */\n saltValue?: Base64;\n /** Modern encryption: spin count for hash iteration */\n spinCount?: number;\n /** Set true to enable sheet protection (required for protection flags to take effect) */\n sheet?: boolean;\n objects?: boolean;\n scenarios?: boolean;\n formatCells?: boolean;\n formatColumns?: boolean;\n formatRows?: boolean;\n insertColumns?: boolean;\n insertRows?: boolean;\n insertHyperlinks?: boolean;\n deleteColumns?: boolean;\n deleteRows?: boolean;\n selectLockedCells?: boolean;\n sort?: boolean;\n autoFilter?: boolean;\n pivotTables?: boolean;\n selectUnlockedCells?: boolean;\n}\n\n/** A named protected range within a sheet (CT_ProtectedRange) */\nexport interface ProtectedRangeOptions {\n /** Range reference (required), e.g. \"A1:C10\" */\n sqref: string;\n /** Range name (required) */\n name: string;\n /**\n * Plain-text password — legacy hash computed automatically on stringify.\n * Authoring-only: not carried back by parse (see SheetProtectionOptions).\n */\n password?: string;\n /** Modern encryption: algorithm name */\n algorithmName?: string;\n /** Modern encryption: base64-encoded hash value */\n hashValue?: Base64;\n /** Modern encryption: base64-encoded salt value */\n saltValue?: Base64;\n /** Modern encryption: spin count */\n spinCount?: number;\n /** Security descriptor (SID string, emitted as the attribute form) */\n securityDescriptor?: string;\n}\n\nexport interface FreezePaneOptions {\n /** Row split position (1-based, freezes rows above) */\n row?: number;\n /** Column split position (1-based, freezes columns to the left) */\n col?: number;\n /** Split panes without freezing (CT_Pane `@state=\"split\"`); default is frozen */\n split?: boolean;\n /**\n * Top-left cell of the scrollable pane (CT_Pane `@topLeftCell`); defaults to\n * the cell just past the split. Round-trip keeps a scrolled position.\n */\n topLeftCell?: string;\n /** Active pane (CT_Pane `@activePane`); defaults to the pane past the split */\n activePane?: \"bottomRight\" | \"topRight\" | \"bottomLeft\" | \"topLeft\";\n}\n\n/**\n * Picture anchored to a worksheet cell. Extends BasePictureOptions (binary\n * data + cNvPr) with the spreadsheet-drawing anchor DrawingAnchorOptions\n * (1-based from/to cell corners, anchor type, extent).\n */\nexport interface PictureOptions extends Omit<BasePictureOptions, \"type\">, DrawingAnchorOptions {\n /** Image format of the `data` bytes; wmf/emf are Windows metafiles. */\n type: \"png\" | \"jpg\" | \"wmf\" | \"emf\";\n /** Round-tripped pic/spPr (rotation/flip/bwMode/fill beyond position). */\n spPr?: ShapePropertiesOptions;\n /** Blip crop (a:srcRect); an empty object round-trips the bare marker. */\n sourceRectangle?: SourceRectangleOptions;\n /** Black/white mode (spPr/@bwMode); absent = attribute omitted. */\n blackWhiteMode?: BlackWhiteMode;\n /**\n * Relative-resize hint (cNvPicPr/@preferRelativeResize). Absent = attribute\n * omitted (defaults true); explicit true/false round-trips the attribute.\n */\n preferRelativeResize?: boolean;\n /** Image adjustment effects carried inside a:blip (a:lum, a:duotone, …). */\n blipEffects?: BlipEffectsOptions;\n /** Local-DPI display hint (a14:useLocalDpi in the a:blip extension list). */\n useLocalDpi?: boolean;\n /**\n * Verbatim a:blip `a:extLst` inner XML for extensions beyond useLocalDpi\n * (a14 imgProps artistic effects, …). Round-trip only; subsumes\n * {@link useLocalDpi} when the source list carries both.\n */\n blipExt?: string;\n /** Picture locks (cNvPicPr/a:picLocks); absent = empty cNvPicPr. */\n locking?: PictureLockingOptions;\n /**\n * Click hyperlink on the picture itself (a:hlinkClick inside xdr:cNvPr) —\n * jump to a URL when the picture is clicked.\n */\n hyperlink?: TextHyperlinkOptions;\n /**\n * Document-order position inside the drawing part (z-order when objects\n * overlap). Round-trip only; fresh authoring uses insertion order.\n */\n zOrder?: number;\n /** Original cNvPr id (round-trip only). */\n shapeId?: number;\n}\n\n/**\n * Chart anchored to a worksheet. `title` stays the chart title (c:title);\n * the graphicFrame's cNvPr `@title` is too weak to justify a name clash, so\n * only name/description/hidden flow through to the drawing's cNvPr.\n */\nexport interface WorksheetChartOptions\n extends\n ChartSpaceOptions,\n DrawingAnchorOptions,\n Omit<NonVisualDrawingPropertiesOptions, \"title\"> {\n /** Frame locks (cNvGraphicFramePr/a:graphicFrameLocks); absent = empty. */\n frameLocks?: GraphicFrameLockingOptions;\n /**\n * Click hyperlink on the chart frame itself (a:hlinkClick inside xdr:cNvPr).\n */\n hyperlink?: TextHyperlinkOptions;\n /** Document-order position inside the drawing part (round-trip only). */\n zOrder?: number;\n /** Original cNvPr id (round-trip only). */\n shapeId?: number;\n /** Macro reference (CT_GraphicFrame/@macro); empty string round-trips. */\n macro?: string;\n}\n\n/**\n * SmartArt anchored in the sheet. The four diagram parts travel as passthrough\n * parts; their package-absolute paths (as resolved from the source drawing\n * rels) wire the frame to them — passthrough paths never move, so they stay\n * valid verbatim.\n */\nexport interface WorksheetSmartArtOptions\n extends DrawingAnchorOptions, NonVisualDrawingPropertiesOptions {\n /** Diagram data part (dgm:relIds @r:dm, e.g. \"xl/diagrams/data1.xml\"). */\n dataPath: string;\n /** Diagram layout part (dgm:relIds @r:lo). */\n layoutPath: string;\n /** Diagram quick style part (dgm:relIds @r:qs). */\n quickStylePath: string;\n /** Diagram colors part (dgm:relIds @r:cs). */\n colorsPath: string;\n /** Frame locks (cNvGraphicFramePr/a:graphicFrameLocks); absent = empty. */\n frameLocks?: GraphicFrameLockingOptions;\n /** Document-order position inside the drawing part (round-trip only). */\n zOrder?: number;\n /** Original cNvPr id (round-trip only). */\n shapeId?: number;\n /** Macro reference (CT_GraphicFrame/@macro); empty string round-trips. */\n macro?: string;\n}\n\nexport interface SheetViewOptions {\n showGridLines?: boolean;\n showRowColHeaders?: boolean;\n showZeros?: boolean;\n zoomScale?: number;\n tabSelected?: boolean;\n rightToLeft?: boolean;\n /** Window protection (CT_SheetView `@windowProtection`) */\n windowProtection?: boolean;\n /** Show formulas instead of values (CT_SheetView `@showFormulas`) */\n showFormulas?: boolean;\n /** Show ruler (CT_SheetView `@showRuler`) */\n showRuler?: boolean;\n /** Show outline symbols (CT_SheetView `@showOutlineSymbols`) */\n showOutlineSymbols?: boolean;\n /** Default grid color (CT_SheetView `@defaultGridColor`) */\n defaultGridColor?: boolean;\n /** Show white space (CT_SheetView `@showWhiteSpace`) */\n showWhiteSpace?: boolean;\n /** View type (CT_SheetView `@view`) */\n view?: \"normal\" | \"pageBreakPreview\" | \"pageLayout\";\n /** Top-left visible cell (CT_SheetView `@topLeftCell`); round-trip only meaningful when scrolled */\n topLeftCell?: string;\n /** Tab color ID (CT_SheetView `@colorId`) */\n colorId?: number;\n /** Zoom scale for normal view (CT_SheetView `@zoomScaleNormal`) */\n zoomScaleNormal?: number;\n /** Zoom scale for sheet layout view (CT_SheetView `@zoomScaleSheetLayoutView`) */\n zoomScaleSheetLayoutView?: number;\n /** Zoom scale for page layout view (CT_SheetView `@zoomScalePageLayoutView`) */\n zoomScalePageLayoutView?: number;\n}\n\nexport interface HyperlinkOptions {\n /** Cell reference, e.g. \"A1\" */\n cell: string;\n /** External target URL (CT_Hyperlink `@r:id`) */\n url?: string;\n /** Internal target, e.g. \"Data!A1\" (CT_Hyperlink `@location`; independent of url) */\n location?: string;\n /** Tooltip text */\n tooltip?: string;\n /** Display text */\n display?: string;\n}\n\nexport interface HeaderFooterOptions {\n oddHeader?: string;\n oddFooter?: string;\n evenHeader?: string;\n evenFooter?: string;\n firstHeader?: string;\n firstFooter?: string;\n differentOddEven?: boolean;\n differentFirst?: boolean;\n /** Scale header/footer with document (CT_HeaderFooter `@scaleWithDoc`) */\n scaleWithDoc?: boolean;\n /** Align with page margins (CT_HeaderFooter `@alignWithMargins`) */\n alignWithMargins?: boolean;\n}\n\n/** Print orientation (ST_Orientation): \"default\" keeps the printer's own setting. */\nexport type PageOrientation = \"default\" | \"portrait\" | \"landscape\";\n\nexport interface PageSetupOptions {\n paperSize?: number;\n orientation?: PageOrientation;\n scale?: number;\n fitToWidth?: number;\n fitToHeight?: number;\n /** Page sequencing when printing wide sheets: down then over, or across then down. */\n pageOrder?: \"downThenOver\" | \"overThenDown\";\n useFirstPageNumber?: boolean;\n firstPageNumber?: number;\n /** Paper height (CT_PageSetup `@paperHeight`; a bare number means millimeters) */\n paperHeight?: number | PositiveUniversalMeasure;\n /** Paper width (CT_PageSetup `@paperWidth`; a bare number means millimeters) */\n paperWidth?: number | PositiveUniversalMeasure;\n /** Use printer defaults (CT_PageSetup `@usePrinterDefaults`, XSD default true — only false is emitted) */\n usePrinterDefaults?: boolean;\n /** Black and white printing (CT_PageSetup `@blackAndWhite`) */\n blackAndWhite?: boolean;\n /** Draft quality printing (CT_PageSetup `@draft`) */\n draft?: boolean;\n /** Print cell comments mode (CT_PageSetup `@cellComments`) */\n cellComments?: \"none\" | \"asDisplayed\" | \"atEnd\";\n /** Print error display mode (CT_PageSetup `@errors`) */\n errors?: \"displayed\" | \"blank\" | \"dash\" | \"NA\";\n /** Horizontal print DPI (CT_PageSetup `@horizontalDpi`) */\n horizontalDpi?: number;\n /** Vertical print DPI (CT_PageSetup `@verticalDpi`) */\n verticalDpi?: number;\n /** Number of copies to print (CT_PageSetup `@copies`) */\n copies?: number;\n /** Auto page breaks (CT_PageSetUpPr `@autoPageBreaks`) */\n autoPageBreaks?: boolean;\n /** Fit to page (CT_PageSetUpPr `@fitToPage`) */\n fitToPage?: boolean;\n /**\n * Relationship id to the printer settings binary part (CT_PageSetup\n * `@r:id`). Round-trip only: the referenced .bin part is not re-emitted,\n * so the id is not resolvable in a freshly generated workbook.\n */\n printerSettingsRId?: string;\n}\n\nexport interface TabColorOptions {\n /** Hex ARGB color string with alpha, e.g. \"FF4472C4\" (passed through verbatim) */\n rgb?: ArgbHexColor;\n /** Theme color index (0-based) */\n theme?: number;\n /** Tint value (-1.0 to 1.0) */\n tint?: number;\n /** Indexed color (CT_Color `@indexed`) */\n indexed?: number;\n}\n\n/** Cell corner marker (CT_Marker): 0-based column/row plus EMU offsets. */\n/**\n * Note anchor corner (CT_Marker). Mirrors the XML verbatim: 0-based col/row,\n * offsets in EMU — unlike DrawingAnchorOptions, which is 1-based for\n * authoring convenience. Same concept, two bases; the XML is 0-based either way.\n */\nexport interface AnchorMarkerOptions {\n /** 0-based column index */\n col: number;\n /** Offset within the column, in EMU (default: 0) */\n colOff?: number;\n /** 0-based row index */\n row: number;\n /** Offset within the row, in EMU (default: 0) */\n rowOff?: number;\n}\n\n/**\n * Object anchor (CT_ObjectAnchor) — the anchor inside commentPr, objectPr,\n * and controlPr alike. Mirrors the XML verbatim: 0-based markers\n * (CT_Marker), offsets in EMU.\n */\nexport interface ObjectAnchorOptions {\n /** Move with cells (default: false) */\n moveWithCells?: boolean;\n /** Size with cells (default: false) */\n sizeWithCells?: boolean;\n /** Anchor start corner (xdr:from, CT_Marker) */\n from: AnchorMarkerOptions;\n /** Anchor end corner (xdr:to, CT_Marker) */\n to: AnchorMarkerOptions;\n}\n\n/**\n * Comment property (CT_CommentPr). Parsed but never re-emitted: commentPr\n * beside the sheet's VML note drawing makes Excel refuse to open the file\n * (rival property systems; Excel reads note properties from the shape's\n * x:ClientData). Fields survive parse for inspection; stringify drops them.\n */\nexport interface CommentPropertiesOptions {\n locked?: boolean;\n defaultSize?: boolean;\n print?: boolean;\n disabled?: boolean;\n autoFill?: boolean;\n autoLine?: boolean;\n altText?: string;\n /** Text horizontal alignment */\n textHAlign?: \"left\" | \"center\" | \"right\" | \"justify\" | \"distributed\";\n /** Text vertical alignment */\n textVAlign?: \"top\" | \"center\" | \"bottom\" | \"justify\" | \"distributed\";\n lockText?: boolean;\n /** Justify last line */\n justLastX?: boolean;\n autoScale?: boolean;\n /** Object anchor position */\n anchor?: ObjectAnchorOptions;\n}\n\nexport interface CommentOptions {\n /** Cell reference, e.g. \"A1\" */\n cell: string;\n /** Author name */\n author: string;\n /** Comment text (plain string or rich text) */\n text: string | RichTextOptions;\n /** Comment properties (CT_CommentPr) — parsed but never re-emitted (see CommentPropertiesOptions) */\n commentPr?: CommentPropertiesOptions;\n /**\n * Note shape anchor (x:Anchor in the VML part): from/to cell corners,\n * 0-based. Absent → the default 2×2-cell offset anchored at the comment's\n * cell.\n */\n anchor?: NoteAnchorOptions;\n /** Whether the note is pinned visible. Default false (hidden until hover). */\n visible?: boolean;\n /** Note shape size in points. Absent → 108 × 59.25 pt. */\n size?: { width: number; height: number };\n}\n\n/**\n * Note shape anchor (VML x:Anchor): two cell corners with offsets.\n *\n * Offsets are EMU in the public API (converted to/from the pixel values the\n * VML part stores at 96 DPI — exact both ways since px × 9525 = EMU).\n */\nexport interface NoteAnchorOptions {\n /** Anchor start corner */\n from: AnchorMarkerOptions;\n /** Anchor end corner */\n to: AnchorMarkerOptions;\n}\n\n/** What cell input is validated against (ST_DataValidationType): \"whole\" whole number, \"textLength\" character count, \"list\" values from formula1, \"custom\" formula must be true. */\nexport type DataValidationType =\n | \"none\"\n | \"whole\"\n | \"decimal\"\n | \"list\"\n | \"date\"\n | \"time\"\n | \"textLength\"\n | \"custom\";\n/** Comparison applied between formula1 (and formula2 for between/notBetween) and the cell value. */\nexport type DataValidationOperator =\n | \"between\"\n | \"notBetween\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\";\n\nexport interface DataValidationOptions {\n /** Cell range, e.g. \"A1:A10\" */\n sqref: string;\n type?: DataValidationType;\n operator?: DataValidationOperator;\n formula1?: string;\n formula2?: string;\n allowBlank?: boolean;\n showErrorMessage?: boolean;\n errorTitle?: string;\n error?: string;\n showInputMessage?: boolean;\n promptTitle?: string;\n prompt?: string;\n /** Error style (CT_DataValidation `@errorStyle`) */\n errorStyle?: \"stop\" | \"warning\" | \"information\";\n /** IME mode (CT_DataValidation `@imeMode`) */\n imeMode?:\n | \"noControl\"\n | \"on\"\n | \"off\"\n | \"disabled\"\n | \"hiragana\"\n | \"fullKatakana\"\n | \"halfKatakana\"\n | \"fullAlpha\"\n | \"halfAlpha\"\n | \"fullHangul\"\n | \"halfHangul\";\n /** Show drop-down (CT_DataValidation `@showDropDown` — note inverted semantics in OOXML) */\n showDropDown?: boolean;\n}\n\n/** Conditional-format rule kind (ST_CfType): \"cellIs\" value comparison (see operator), \"expression\" formula trigger, \"top10\" ranked values, \"containsText\" substring match. */\nexport type ConditionalFormatType =\n | \"cellIs\"\n | \"containsText\"\n | \"expression\"\n | \"top10\"\n | \"aboveAverage\"\n | \"colorScale\"\n | \"dataBar\"\n | \"iconSet\";\n/** Comparison for the \"cellIs\" rule, between formula1 and the cell value. */\nexport type ConditionalFormatOperator =\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThanOrEqual\"\n | \"greaterThan\"\n | \"between\"\n | \"notBetween\"\n | \"containsText\"\n | \"notContains\"\n | \"beginsWith\"\n | \"endsWith\";\n\n/** Conditional format value object type (ST_CfvoType) */\nexport type CfvoType = \"num\" | \"percent\" | \"max\" | \"min\" | \"formula\" | \"percentile\";\n\n/** Conditional format value object */\nexport interface CfvoOptions {\n type: CfvoType;\n val?: string | number;\n /** Greater than or equal (default: true) */\n gte?: boolean;\n}\n\n/** Icon set type (ST_IconSetType) */\nexport type IconSetType =\n | \"3Arrows\"\n | \"3ArrowsGray\"\n | \"3Flags\"\n | \"3TrafficLights1\"\n | \"3TrafficLights2\"\n | \"3Signs\"\n | \"3Symbols\"\n | \"3Symbols2\"\n | \"4Arrows\"\n | \"4ArrowsGray\"\n | \"4RedToBlack\"\n | \"4Rating\"\n | \"4TrafficLights\"\n | \"5Arrows\"\n | \"5ArrowsGray\"\n | \"5Rating\"\n | \"5Quarters\";\n\n/**\n * One CT_Color channel set for conditional-formatting colors. A color picks\n * exactly one channel (rgb, theme, or indexed); tint qualifies a theme slot.\n */\nexport interface CfColorOptions {\n /** RGB hex without alpha, e.g. \"FF0000\" */\n rgb?: HexColor;\n /** Theme palette slot (CT_Color @theme) */\n theme?: number;\n /** Tint applied to the theme slot */\n tint?: number;\n /** Legacy palette index */\n indexed?: number;\n}\n\n/** Color scale rule configuration */\nexport interface ColorScaleOptions {\n /** Conditional format values (minimum 2, typically 2 or 3) */\n cfvo: CfvoOptions[];\n /** Colors for each value (same count as cfvo) */\n colors: CfColorOptions[];\n}\n\n/** Data bar rule configuration */\nexport interface DataBarOptions {\n /** Minimum and maximum value objects (exactly 2) */\n cfvo: [CfvoOptions, CfvoOptions];\n /** Bar color */\n color: CfColorOptions;\n /** Minimum bar length as percentage (default: 10) */\n minLength?: number;\n /** Maximum bar length as percentage (default: 90) */\n maxLength?: number;\n /** Whether to show cell values (default: true) */\n showValue?: boolean;\n}\n\n/** Icon set rule configuration */\nexport interface IconSetOptions {\n /** Conditional format values (minimum 2) */\n cfvo: CfvoOptions[];\n /** Icon set type (default: \"3TrafficLights1\") */\n iconSet?: IconSetType;\n /** Whether to show cell values (default: true) */\n showValue?: boolean;\n /** Whether values are percentages (default: true) */\n percent?: boolean;\n /** Whether to reverse icon order (default: false) */\n reverse?: boolean;\n}\n\nexport interface ConditionalFormatRule {\n type: ConditionalFormatType;\n operator?: ConditionalFormatOperator;\n /** Formula(s) — up to 3 */\n formulas?: string[];\n priority?: number;\n /** Reference to a dxf (differential format) in the styles table */\n dxfId?: number;\n /** Color scale configuration (when type is \"colorScale\") */\n colorScale?: ColorScaleOptions;\n /** Data bar configuration (when type is \"dataBar\") */\n dataBar?: DataBarOptions;\n /** Icon set configuration (when type is \"iconSet\") */\n iconSet?: IconSetOptions;\n /** Stop if true — skip remaining rules (CT_CfRule `@stopIfTrue`) */\n stopIfTrue?: boolean;\n /** Time period for date-based highlighting (CT_CfRule `@timePeriod`) */\n timePeriod?:\n | \"today\"\n | \"yesterday\"\n | \"tomorrow\"\n | \"last7Days\"\n | \"thisMonth\"\n | \"lastMonth\"\n | \"nextMonth\"\n | \"thisWeek\"\n | \"lastWeek\"\n | \"nextWeek\";\n /** Rank for top/bottom rules (CT_CfRule `@rank`) */\n rank?: number;\n /** Bottom N instead of top N for top10 rules (CT_CfRule `@bottom`) */\n bottom?: boolean;\n /** Percent instead of item count for top10 rules (CT_CfRule `@percent`) */\n percent?: boolean;\n /** Search text for containsText/notContains/beginsWith/endsWith rules (CT_CfRule `@text`) */\n text?: string;\n /** Equal average flag (CT_CfRule `@equalAverage`) */\n equalAverage?: boolean;\n /** Above average flag (CT_CfRule `@aboveAverage`, default true for aboveAverage rules) */\n aboveAverage?: boolean;\n /** Standard deviations for above-average rules (CT_CfRule `@stdDev`) */\n stdDev?: number;\n}\n\nexport interface ConditionalFormatOptions {\n /** Cell range, e.g. \"A1:A10\" */\n sqref: string;\n /** Applies to a PivotTable view rather than the grid (CT_ConditionalFormatting `@pivot`) */\n pivot?: boolean;\n rules: ConditionalFormatRule[];\n}\n\nexport interface Top10FilterOptions {\n top?: boolean;\n percent?: boolean;\n val: number;\n /** Filter value (CT_Top10 `@filterVal`) */\n filterVal?: number;\n}\n\n/** Custom filter comparison operator (ST_FilterOperator). */\nexport type CustomFilterOperator =\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"lessThan\"\n | \"lessThanOrEqual\";\n\n/** A single custom filter entry (CT_CustomFilter). */\nexport interface CustomFilterEntry {\n operator?: CustomFilterOperator;\n val: string;\n}\n\n/** Custom filters container (CT_CustomFilters): @and + customFilter entries. */\nexport interface CustomFiltersOptions {\n /** AND the entries instead of OR (CT_CustomFilters `@and`) */\n and?: boolean;\n entries: CustomFilterEntry[];\n}\n\nexport interface SortCondition {\n /** Cell reference for the sort column, e.g. \"B1\" */\n ref: string;\n descending?: boolean;\n /** Sort by (CT_SortCondition `@sortBy`) */\n sortBy?: \"value\" | \"cellColor\" | \"fontColor\" | \"icon\";\n /** Custom sort list (CT_SortCondition `@customList`) */\n customList?: string;\n /** Differential format id for cell/font-color sorts (CT_SortCondition `@dxfId`) */\n dxfId?: number;\n /** Icon set for icon sorts (CT_SortCondition `@iconSet`, default \"3Arrows\") */\n iconSet?: IconSetType;\n /** Icon index within the set (CT_SortCondition `@iconId`) */\n iconId?: number;\n}\n\n/** Sort state (CT_SortState) — sort conditions nested in their XSD container. */\nexport interface SortStateOptions {\n /** Sort range, e.g. \"A1:D10\" (CT_SortState `@ref`, required) */\n ref: string;\n /** Column sort mode (CT_SortState `@columnSort`) */\n columnSort?: boolean;\n /** Case sensitive sorting (CT_SortState `@caseSensitive`) */\n caseSensitive?: boolean;\n /** Sort method (CT_SortState `@sortMethod`) */\n sortMethod?: \"pinYin\" | \"stroke\" | \"none\";\n /** Sort conditions, one per sort level (CT_SortState `sortCondition` children) */\n conditions: SortCondition[];\n}\n\nexport interface AutoFilterOptions {\n /** Range, e.g. \"A1:D10\" */\n ref: string;\n /** Filter columns, one per filtered column (CT_FilterColumn) */\n columns?: FilterColumnOptions[];\n /** Sort state (CT_SortState child; `ref` typically spans the filter range) */\n sortState?: SortStateOptions;\n}\n\n/**\n * Filter column (CT_FilterColumn): column id plus exactly one filter variant\n * (the XSD content model is a choice among the six filter kinds below).\n */\nexport interface FilterColumnOptions {\n /** Column ID (CT_FilterColumn `@colId`) */\n colId: number;\n /** Hide auto-filter button (CT_FilterColumn `@hiddenButton`) */\n hiddenButton?: boolean;\n /** Show filter button (CT_FilterColumn `@showButton`) */\n showButton?: boolean;\n /** Top-N filter (CT_Top10) */\n top10?: Top10FilterOptions;\n /** Custom comparison filters (CT_CustomFilters) */\n customFilters?: CustomFiltersOptions;\n /** Value / date filters (CT_Filters) */\n filters?: FilterItemsOptions;\n /** Color filter (CT_ColorFilter) */\n colorFilter?: ColorFilterOptions;\n /** Icon filter (CT_IconFilter) */\n iconFilter?: IconFilterOptions;\n /** Dynamic filter (CT_DynamicFilter) */\n dynamicFilter?: DynamicFilterOptions;\n}\n\n/** Color filter (CT_ColorFilter) */\nexport interface ColorFilterOptions {\n /** Differential format id (used when no direct color is set) */\n dxfId?: number;\n /** Filter by cell color (CT_ColorFilter `@cellColor`) */\n cellColor?: boolean;\n}\n\n/** Icon filter (CT_IconFilter) */\nexport interface IconFilterOptions {\n /** Icon set name (CT_IconFilter `@iconSet`, ST_IconSetType — required) */\n iconSet: IconSetType;\n /** Icon ID within set (CT_IconFilter `@iconId`) */\n iconId?: number;\n}\n\n/** Filter items (CT_Filters) */\nexport interface FilterItemsOptions {\n /** Blank filter (CT_Filters `@blank`) */\n blank?: boolean;\n /** Calendar type (CT_Filters `@calendarType`, ST_CalendarType) */\n calendarType?:\n | \"gregorian\"\n | \"gregorianUs\"\n | \"gregorianMeFrench\"\n | \"gregorianArabic\"\n | \"hijri\"\n | \"hebrew\"\n | \"taiwan\"\n | \"japan\"\n | \"thai\"\n | \"korea\"\n | \"saka\"\n | \"gregorianXlitEnglish\"\n | \"gregorianXlitFrench\"\n | \"none\";\n /** Filter values (CT_Filters `filter` children) */\n values?: string[];\n /** Date group filters (CT_Filters `dateGroupItem` children) */\n dateGroupItems?: DateGroupFilterOptions[];\n}\n\n/** Dynamic filter (CT_DynamicFilter) */\nexport interface DynamicFilterOptions {\n /** Dynamic filter type (CT_DynamicFilter `@type`) */\n type:\n | \"null\"\n | \"aboveAverage\"\n | \"belowAverage\"\n | \"tomorrow\"\n | \"today\"\n | \"yesterday\"\n | \"nextWeek\"\n | \"thisWeek\"\n | \"lastWeek\"\n | \"nextMonth\"\n | \"thisMonth\"\n | \"lastMonth\"\n | \"nextQuarter\"\n | \"thisQuarter\"\n | \"lastQuarter\"\n | \"nextYear\"\n | \"thisYear\"\n | \"lastYear\"\n | \"yearToDate\"\n | \"Q1\"\n | \"Q2\"\n | \"Q3\"\n | \"Q4\"\n | \"M1\"\n | \"M2\"\n | \"M3\"\n | \"M4\"\n | \"M5\"\n | \"M6\"\n | \"M7\"\n | \"M8\"\n | \"M9\"\n | \"M10\"\n | \"M11\"\n | \"M12\";\n /** Filter value (CT_DynamicFilter `@val`) */\n val?: number;\n /** Maximum value (CT_DynamicFilter `@maxVal`) */\n maxVal?: number;\n /** Value ISO date string (CT_DynamicFilter `@valIso`) */\n valIso?: string;\n /** Max value ISO date string (CT_DynamicFilter `@maxValIso`) */\n maxValIso?: string;\n}\n\n/** Date group filter item (CT_DateGroupItem) */\nexport interface DateGroupFilterOptions {\n /** Date grouping level (CT_DateGroupItem `@dateTimeGrouping`) */\n dateTimeGrouping: \"year\" | \"month\" | \"day\" | \"hour\" | \"minute\" | \"second\";\n /** Year (CT_DateGroupItem `@year`) */\n year?: number;\n /** Month (1-12, CT_DateGroupItem `@month`) */\n month?: number;\n /** Day (1-31, CT_DateGroupItem `@day`) */\n day?: number;\n /** Hour (0-23, CT_DateGroupItem `@hour`) */\n hour?: number;\n /** Minute (0-59, CT_DateGroupItem `@minute`) */\n minute?: number;\n /** Second (0-59, CT_DateGroupItem `@second`) */\n second?: number;\n}\n\n/** Print options (CT_PrintOptions) */\nexport interface PrintOptions {\n /** Center horizontally on page */\n horizontalCentered?: boolean;\n /** Center vertically on page */\n verticalCentered?: boolean;\n /** Print row/column headings */\n headings?: boolean;\n /** Print grid lines */\n gridLines?: boolean;\n /** Grid lines set flag */\n gridLinesSet?: boolean;\n}\n\n/** Sheet format properties (CT_SheetFormatPr) */\nexport interface SheetFormatPropertiesOptions {\n /** Base column width (CT_SheetFormatPr `@baseColWidth`) */\n baseColWidth?: number;\n /** Default column width (CT_SheetFormatPr `@defaultColWidth`) */\n defaultColWidth?: number;\n defaultRowHeight?: number;\n /** Zero height rows hidden (CT_SheetFormatPr `@zeroHeight`) */\n zeroHeight?: boolean;\n /** Thick top borders (CT_SheetFormatPr `@thickTop`) */\n thickTop?: boolean;\n /** Thick bottom borders (CT_SheetFormatPr `@thickBottom`) */\n thickBottom?: boolean;\n /** Outline level row (CT_SheetFormatPr `@outlineLevelRow`) */\n outlineLevelRow?: number;\n /** Outline level column (CT_SheetFormatPr `@outlineLevelCol`) */\n outlineLevelCol?: number;\n}\n\n/** Sheet properties extended options (CT_SheetPr attributes) */\nexport interface SheetPropertiesOptions {\n /** VBA code name (CT_SheetPr `@codeName`) */\n codeName?: string;\n /** Sync horizontal scroll (CT_SheetPr `@syncHorizontal`) */\n syncHorizontal?: boolean;\n /** Sync vertical scroll (CT_SheetPr `@syncVertical`) */\n syncVertical?: boolean;\n /** Sync reference (CT_SheetPr `@syncRef`) */\n syncRef?: string;\n /** Transition evaluation mode (CT_SheetPr `@transitionEvaluation`) */\n transitionEvaluation?: boolean;\n /** Transition entry mode (CT_SheetPr `@transitionEntry`) */\n transitionEntry?: boolean;\n /** Published to server (CT_SheetPr `@published`, XSD default true — only false is emitted) */\n published?: boolean;\n /** Filter mode (CT_SheetPr `@filterMode`) */\n filterMode?: boolean;\n /** Enable format conditions calculation (CT_SheetPr `@enableFormatConditionsCalculation`, XSD default true — only false is emitted) */\n enableFormatConditionsCalculation?: boolean;\n /** Outline apply styles (CT_OutlinePr `@applyStyles`) */\n outlineApplyStyles?: boolean;\n /** Outline show symbols (CT_OutlinePr `@showOutlineSymbols`) */\n outlineShowSymbols?: boolean;\n /** Outline summary rows below detail (CT_OutlinePr `@summaryBelow`) */\n outlineSummaryBelow?: boolean;\n /** Outline summary columns right of detail (CT_OutlinePr `@summaryRight`) */\n outlineSummaryRight?: boolean;\n}\n\n/** An ignored error entry — suppresses specific Excel error checks for a range. */\nexport interface IgnoredErrorOptions {\n /** Cell range, e.g. \"A1:A10\" (required) */\n sqref: string;\n evalError?: boolean;\n twoDigitTextYear?: boolean;\n numberStoredAsText?: boolean;\n formula?: boolean;\n formulaRange?: boolean;\n unlockedFormula?: boolean;\n emptyCellReference?: boolean;\n listDataValidation?: boolean;\n calculatedColumn?: boolean;\n}\n\n/** Phonetic properties for CJK text (CT_PhoneticPr) */\nexport interface PhoneticPropertiesOptions {\n /** Font ID from the styles table (required) */\n fontId: number;\n /** Phonetic type (default: \"fullwidthKatakana\") */\n type?: \"fullwidthKatakana\" | \"halfwidthKatakana\" | \"Hiragana\" | \"noConversion\";\n /** Alignment (default: \"left\") */\n alignment?: \"noControl\" | \"left\" | \"center\" | \"distributed\";\n}\n\n/** Background image for a worksheet */\nexport interface SheetBackgroundImageOptions {\n data: DataType;\n /** Image format of the `data` bytes. */\n type: \"png\" | \"jpg\";\n}\n\n/** Page break entry (CT_Break) */\nexport interface PageBreakOptions {\n /** Row or column ID (1-based) */\n id: number;\n /** Min value (CT_Break `@min`) */\n min?: number;\n /** Max value (CT_Break `@max`) */\n max?: number;\n /** Manual break (CT_Break `@man`) */\n manual?: boolean;\n /** Pivot break (CT_Break `@pt`) */\n pivot?: boolean;\n}\n\n/** Selection in sheet view (CT_Selection) */\nexport interface SelectionOptions {\n /** Pane (CT_Selection `@pane`) */\n pane?: \"bottomRight\" | \"topRight\" | \"bottomLeft\" | \"topLeft\";\n /** Active cell (CT_Selection `@activeCell`) */\n activeCell?: string;\n /** Active cell index (CT_Selection `@activeCellId`) */\n activeCellId?: number;\n /** Selected range (CT_Selection `@sqref`) */\n sqref?: string;\n}\n\n/** Pivot selection in sheet view (CT_PivotSelection) */\nexport interface PivotSelectionOptions {\n /** Pane (CT_PivotSelection `@pane`, default \"topLeft\") */\n pane?: \"bottomRight\" | \"topRight\" | \"bottomLeft\" | \"topLeft\";\n /** Show header (default false) */\n showHeader?: boolean;\n /** Label selection (default false) */\n label?: boolean;\n /** Data selection (default false) */\n data?: boolean;\n /** Extendable (default false) */\n extendable?: boolean;\n /** Selection count (default 0) */\n count?: number;\n axis?: \"axisRow\" | \"axisCol\" | \"axisPage\" | \"axisValues\";\n /** Dimension (default 0) */\n dimension?: number;\n /** Start (default 0) */\n start?: number;\n /** Min (default 0) */\n min?: number;\n /** Max (default 0) */\n max?: number;\n /** Active row (default 0) */\n activeRow?: number;\n /** Active column (default 0) */\n activeCol?: number;\n /** Previous row (default 0) */\n previousRow?: number;\n /** Previous column (default 0) */\n previousCol?: number;\n /** Click count (default 0) */\n click?: number;\n /**\n * Relationship id (r:id, OLAP pivot selection part). Round-trip only: the\n * referenced part is not re-emitted, so the id is not resolvable in a\n * freshly generated workbook.\n */\n rId?: string;\n /** Pivot area (required child) */\n pivotArea?: PivotAreaOptions;\n}\n\n/** Smart tag property (CT_CellSmartTagPr) */\nexport interface CellSmartTagPropertyOptions {\n /** Property key (required) */\n key: string;\n /** Property value (required) */\n val: string;\n}\n\n/** Smart tag on a cell (CT_CellSmartTag) */\nexport interface CellSmartTagOptions {\n /** Smart tag type index (required) */\n type: number;\n /** Deleted (default false) */\n deleted?: boolean;\n /** XML-based (default false) */\n xmlBased?: boolean;\n properties?: CellSmartTagPropertyOptions[];\n}\n\n/** Cell smart tags (CT_CellSmartTags) */\nexport interface CellSmartTagsOptions {\n /** Cell reference (required) */\n reference: string;\n smartTags: CellSmartTagOptions[];\n}\n\n/** Custom sheet view (CT_CustomSheetView) */\nexport interface CustomSheetViewOptions {\n /** GUID identifier (required, CT_CustomSheetView `@guid`) */\n guid: string;\n /** Zoom scale (CT_CustomSheetView `@scale`) */\n scale?: number;\n /** Show page breaks (CT_CustomSheetView `@showPageBreaks`) */\n showPageBreaks?: boolean;\n /** Show formulas (CT_CustomSheetView `@showFormulas`) */\n showFormulas?: boolean;\n /** Show grid lines (CT_CustomSheetView `@showGridLines`) */\n showGridLines?: boolean;\n /** Show row/column headers (CT_CustomSheetView `@showRowCol`) */\n showRowColHeaders?: boolean;\n /** Show outline symbols (CT_CustomSheetView `@outlineSymbols`) */\n outlineSymbols?: boolean;\n /** Show zero values (CT_CustomSheetView `@zeroValues`) */\n zeroValues?: boolean;\n /** Fit to page (CT_CustomSheetView `@fitToPage`) */\n fitToPage?: boolean;\n /** Print area (CT_CustomSheetView `@printArea`) */\n printArea?: boolean;\n /** Filter applied (CT_CustomSheetView `@filter`) */\n filter?: boolean;\n /** Show auto filter (CT_CustomSheetView `@showAutoFilter`) */\n showAutoFilter?: boolean;\n /** Hidden rows (CT_CustomSheetView `@hiddenRows`) */\n hiddenRows?: boolean;\n /** Hidden columns (CT_CustomSheetView `@hiddenColumns`) */\n hiddenColumns?: boolean;\n /** Sheet state (CT_CustomSheetView `@state`) */\n state?: \"visible\" | \"hidden\" | \"veryHidden\";\n /** Filter unique (CT_CustomSheetView `@filterUnique`) */\n filterUnique?: boolean;\n /** View type (CT_CustomSheetView `@view`) */\n view?: \"normal\" | \"pageBreakPreview\" | \"pageLayout\";\n}\n\n/** Cell watch entry (CT_CellWatch) */\nexport interface CellWatchOptions {\n /** Cell reference, e.g. \"A1\" (CT_CellWatch `@r`) */\n reference: string;\n}\n\n/** Data consolidation (CT_DataConsolidate) */\nexport interface DataConsolidateOptions {\n /** Consolidation function (CT_DataConsolidate `@function`) */\n function?:\n | \"average\"\n | \"count\"\n | \"countNumbers\"\n | \"max\"\n | \"min\"\n | \"product\"\n | \"standardDeviation\"\n | \"standardDeviationPopulation\"\n | \"sum\"\n | \"variance\"\n | \"variancePopulation\";\n /** Use top row labels (CT_DataConsolidate `@topLabels`) */\n topLabels?: boolean;\n /** Use left column labels (CT_DataConsolidate `@leftLabels`) */\n leftLabels?: boolean;\n /** Use start labels (CT_DataConsolidate `@startLabels`) */\n startLabels?: boolean;\n /** Link to source data (CT_DataConsolidate `@link`) */\n link?: boolean;\n /** Source data references */\n refs?: string[];\n}\n\n/**\n * Drawing in header/footer (CT_DrawingHF). The 18 counters are XML attribute\n * names verbatim: l/c/r = section (left/center/right), h/f = header vs footer,\n * o/e/f = page flavor (odd/even/first); each holds the 1-based picture number\n * in that slot (`lho` = 2nd picture, left header, odd pages).\n */\nexport interface DrawingHfOptions {\n /**\n * Relationship ID for the drawing. Round-trip only: carried from the parsed\n * package's rels; a freshly generated workbook has no matching relationship\n * until an embedding API exists.\n */\n rId: string;\n /** Picture number, left header odd pages (`@lho`) */\n lho?: number;\n /** Picture number, left header even pages (`@lhe`) */\n lhe?: number;\n /** Picture number, left header first page (`@lhf`) */\n lhf?: number;\n /** Picture number, center header odd pages (`@cho`) */\n cho?: number;\n /** Picture number, center header even pages (`@che`) */\n che?: number;\n /** Picture number, center header first page (`@chf`) */\n chf?: number;\n /** Picture number, right header odd pages (`@rho`) */\n rho?: number;\n /** Picture number, right header even pages (`@rhe`) */\n rhe?: number;\n /** Picture number, right header first page (`@rhf`) */\n rhf?: number;\n /** Picture number, left footer odd pages (`@lfo`) */\n lfo?: number;\n /** Picture number, left footer even pages (`@lfe`) */\n lfe?: number;\n /** Picture number, left footer first page (`@lff`) */\n lff?: number;\n /** Picture number, center footer odd pages (`@cfo`) */\n cfo?: number;\n /** Picture number, center footer even pages (`@cfe`) */\n cfe?: number;\n /** Picture number, center footer first page (`@cff`) */\n cff?: number;\n /** Picture number, right footer odd pages (`@rfo`) */\n rfo?: number;\n /** Picture number, right footer even pages (`@rfe`) */\n rfe?: number;\n /** Picture number, right footer first page (`@rff`) */\n rff?: number;\n}\n\n/** One worksheet (xl/worksheets/sheetN.xml) — cells, dimensions, and sheet-level parts. */\nexport interface WorksheetOptions {\n name?: string;\n /** Workbook sheet id (CT_Sheet `@sheetId`) — unique but not necessarily sequential. */\n sheetId?: number;\n /** Visibility (CT_Sheet `@state`) */\n state?: \"visible\" | \"hidden\" | \"veryHidden\";\n rows?: RowOptions[];\n columns?: ColumnOptions[];\n mergeCells?: MergeCellOptions[];\n freezePanes?: FreezePaneOptions;\n protection?: SheetProtectionOptions;\n /** Named protected ranges within this sheet */\n protectedRanges?: ProtectedRangeOptions[];\n /** What-if scenarios */\n scenarios?: ScenarioOptions;\n /** Auto-filter configuration */\n autoFilter?: string | AutoFilterOptions;\n /** Sheet-level sort state (CT_Worksheet `sortState` — sorting without a filter) */\n sortState?: SortStateOptions;\n images?: PictureOptions[];\n charts?: WorksheetChartOptions[];\n /** Anchored SmartArt frames (xdr:graphicFrame with dgm:relIds). */\n smartArts?: WorksheetSmartArtOptions[];\n /** Anchored shapes (xdr:sp): geometry + optional text body. */\n shapes?: ShapeOptions[];\n /** Anchored connectors (xdr:cxnSp): line/arrow geometry. */\n connectors?: ConnectorOptions[];\n /** Anchored groups (xdr:grpSp): group transform + nested children. */\n groups?: GroupOptions[];\n dataValidations?: DataValidationOptions[];\n /** Disable data validation prompts (CT_DataValidations `@disablePrompts`) */\n dataValidationsDisablePrompts?: boolean;\n conditionalFormats?: ConditionalFormatOptions[];\n hyperlinks?: HyperlinkOptions[];\n comments?: CommentOptions[];\n headerFooter?: HeaderFooterOptions;\n pageSetup?: PageSetupOptions;\n tabColor?: TabColorOptions;\n sheetView?: SheetViewOptions;\n pivotTables?: PivotTableOptions[];\n /** Tables (list objects) for this worksheet */\n tables?: TableOptions[];\n /** Ignored errors — suppress specific Excel error checks for cell ranges */\n ignoredErrors?: IgnoredErrorOptions[];\n /** Phonetic properties for CJK text */\n phoneticPr?: PhoneticPropertiesOptions;\n /** Background image for the worksheet */\n backgroundImage?: SheetBackgroundImageOptions;\n /** Print options (CT_PrintOptions) */\n printOptions?: PrintOptions;\n /** Sheet format properties (CT_SheetFormatPr) */\n sheetFormatPr?: SheetFormatPropertiesOptions;\n /** Sheet extended properties (CT_SheetPr attributes) */\n sheetPr?: SheetPropertiesOptions;\n /** Row page breaks (CT_PageBreaks) */\n rowBreaks?: PageBreakOptions[];\n /** Column page breaks (CT_PageBreaks) */\n colBreaks?: PageBreakOptions[];\n /** Custom sheet views (CT_CustomSheetViews) */\n customSheetViews?: CustomSheetViewOptions[];\n /** Cell watches (CT_CellWatches) */\n cellWatches?: CellWatchOptions[];\n /** Data consolidation (CT_DataConsolidate) */\n dataConsolidate?: DataConsolidateOptions;\n /** Drawing in header/footer (CT_DrawingHF) */\n drawingHF?: DrawingHfOptions;\n /**\n * Legacy drawing for header/footer r:id (CT_LegacyDrawingHF). Round-trip\n * only: the referenced VML part is not re-emitted by the compiler.\n */\n legacyDrawingHF?: string;\n /**\n * Drawing reference r:id (CT_Worksheet `<drawing>`). Round-trip only: drawing\n * parts the bridge cannot map onto options (e.g. OLE shape representations)\n * pass through verbatim; fresh worksheets derive the reference from\n * images/charts/shapes.\n */\n drawingRid?: string;\n /**\n * Legacy drawing reference r:id (CT_Worksheet `<legacyDrawing>`). Round-trip\n * only, same passthrough semantics as {@link drawingRid}.\n */\n legacyDrawingRid?: string;\n /** Selections in sheet view (CT_Selection — one per pane, max 4) */\n selection?: SelectionOptions[];\n /** Pivot selection in sheet view (CT_PivotSelection) */\n pivotSelection?: PivotSelectionOptions;\n /** Cell smart tags (CT_SmartTags) */\n smartTags?: CellSmartTagsOptions[];\n /** Query tables on this sheet (xl/queryTables/queryTableN.xml) */\n queryTables?: QueryTableOptions[];\n /** Single-cell XML tables on this sheet (xl/tables/tableSingleCellsN.xml) */\n singleXmlCells?: SingleXmlCellOptions[];\n /** Sheet calc properties (CT_SheetCalcPr) */\n sheetCalcPr?: SheetCalculationPropertiesOptions;\n /** Extension list (extLst) */\n ext?: string;\n /** Control objects (CT_Controls) */\n controls?: ControlOptions[];\n /** Custom sheet properties (CT_CustomProperties) */\n customProperties?: CustomSheetPropertyOptions[];\n /** OLE objects (CT_OleObjects) */\n oleObjects?: OleObjectOptions[];\n /** Web publish items (CT_WebPublishItems) */\n webPublishItems?: WebPublishItemOptions[];\n /** Page margins in inches (CT_PageMargins) */\n pageMargins?: PageMarginsOptions;\n /** Cell range dimension (CT_Dimension ref); auto-computed when omitted */\n dimension?: string;\n}\n\n/** Page margins in inches (CT_PageMargins). Numbers are inches; strings are UniversalMeasure. */\nexport interface PageMarginsOptions {\n left?: number | UniversalMeasure;\n right?: number | UniversalMeasure;\n top?: number | UniversalMeasure;\n bottom?: number | UniversalMeasure;\n header?: number | UniversalMeasure;\n footer?: number | UniversalMeasure;\n}\n\n/** Sheet calc properties (CT_SheetCalcPr) */\nexport interface SheetCalculationPropertiesOptions {\n /** Full calc on load (CT_SheetCalcPr `@fullCalcOnLoad`) */\n fullCalcOnLoad?: boolean;\n}\n\n/** Form control object (CT_Control) */\nexport interface ControlOptions {\n /** Shape ID (CT_Control `@shapeId`) */\n shapeId: number;\n /**\n * Control r:id (CT_ControlPr `@r:id`). Round-trip only: the control's VML\n * and binary parts are not re-emitted, so the id is not resolvable in a\n * freshly generated workbook.\n */\n rId: string;\n /** Control name (CT_ControlPr `@name`) */\n name?: string;\n /** Locked (CT_ControlPr `@locked`) */\n locked?: boolean;\n /** UI-locked (CT_ControlPr `@uiObject`) */\n uiObject?: boolean;\n /** Recalc always (CT_ControlPr `@recalcAlways`) */\n recalcAlways?: boolean;\n /** Linked cell (CT_ControlPr `@linkedCell`) */\n linkedCell?: string;\n /** List fill range (CT_ControlPr `@listFillRange`) */\n listFillRange?: string;\n /** Control formula (CT_ControlPr `@cf`) */\n formula?: string;\n /** Use the default icon size (CT_ControlPr `@defaultSize`; default true). */\n defaultSize?: boolean;\n /** Auto line (CT_ControlPr `@autoLine`; default true). */\n autoLine?: boolean;\n /** Auto picture (CT_ControlPr `@autoPict`; default true). */\n autoPict?: boolean;\n /**\n * Relationship ID of the icon image (controlPr `@r:id`). Round-trip only:\n * the icon part is not re-emitted by the compiler.\n */\n iconRid?: string;\n /** Cell anchor inside controlPr (from/to corners, 0-based). */\n anchor?: ObjectAnchorOptions;\n /**\n * Source wrapped the control in mc:AlternateContent (Excel 2010+ form:\n * Choice carries the full element, Fallback the bare one). Re-emit the\n * wrapper only when the source had it.\n */\n alternateContent?: boolean;\n}\n\n/** Custom property (CT_CustomProperty) */\nexport interface CustomSheetPropertyOptions {\n /** Property name */\n name: string;\n /**\n * Relationship ID to the binary property part. Round-trip only: the part\n * is not re-emitted by the compiler.\n */\n rId: string;\n}\n\n/** OLE object (CT_OleObject) */\nexport interface OleObjectOptions {\n /** Program ID (CT_OleObject `@progId`) */\n progId?: string;\n /** Display aspect (CT_OleObject `@dvAspect`) */\n dvAspect?: \"DVASPECT_CONTENT\" | \"DVASPECT_ICON\";\n /** Linked source (CT_OleObject `@link`) */\n link?: string;\n /** OLE update mode (CT_OleObject `@oleUpdate`) */\n oleUpdate?: \"OLEUPDATE_ALWAYS\" | \"OLEUPDATE_ONCALL\";\n /** Auto load (CT_OleObject `@autoLoad`) */\n autoLoad?: boolean;\n /** Shape ID (CT_OleObject `@shapeId`) */\n shapeId: number;\n /**\n * Relationship ID (CT_OleObject `@r:id`). Round-trip only: the embedded\n * object part is not re-emitted, so the id is not resolvable in a freshly\n * generated workbook.\n */\n rId?: string;\n /** Object properties (CT_ObjectPr) */\n objectPr?: OleObjectPropertiesOptions;\n /**\n * Source wrapped the oleObject in mc:AlternateContent (Excel 2010+ form:\n * Choice carries the full element, Fallback the bare one). Re-emit the\n * wrapper only when the source had it.\n */\n alternateContent?: boolean;\n}\n\n/** OLE object properties (CT_ObjectPr) */\nexport interface OleObjectPropertiesOptions {\n locked?: boolean;\n defaultSize?: boolean;\n print?: boolean;\n disabled?: boolean;\n uiObject?: boolean;\n autoFill?: boolean;\n autoLine?: boolean;\n /** Auto picture */\n autoPict?: boolean;\n macro?: string;\n altText?: string;\n dde?: boolean;\n /**\n * Relationship ID of the icon image (objectPr `@r:id`). Round-trip only:\n * the icon part is not re-emitted by the compiler.\n */\n iconRid?: string;\n /** Cell anchor inside objectPr (from/to corners, 0-based). */\n anchor?: ObjectAnchorOptions;\n}\n\n/** Web publish item (CT_WebPublishItem) */\nexport interface WebPublishItemOptions {\n /** Item ID */\n id: number;\n /** HTML div ID */\n divId: string;\n sourceType:\n | \"sheet\"\n | \"printArea\"\n | \"autoFilter\"\n | \"range\"\n | \"chart\"\n | \"pivotTable\"\n | \"query\"\n | \"label\";\n /** Source cell reference */\n sourceRef?: string;\n /** Source object name */\n sourceObject?: string;\n /** Destination file path */\n destinationFile: string;\n title?: string;\n autoRepublish?: boolean;\n}\n\n// ── Worksheet XML builder context ──\n\n/** Minimal context needed by buildWorksheetXml. */\nexport interface WorksheetContext {\n sharedStrings?: SharedStrings;\n styles?: Styles;\n}\n","/**\n * AutoFilter shared stringify/parse helpers.\n *\n * CT_AutoFilter is the same content model in both worksheet (CT_Worksheet) and\n * table (CT_Table), so the XML round-trip lives here once and both consumers\n * delegate to it.\n *\n * Reference: OOXML transitional, sml.xsd, CT_AutoFilter / CT_FilterColumn /\n * CT_Filters / CT_SortState.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { attrs, attr, attrNum, escapeXml, findChild, selfCloseElement } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type {\n AutoFilterOptions,\n ColorFilterOptions,\n CustomFiltersOptions,\n DateGroupFilterOptions,\n DynamicFilterOptions,\n FilterColumnOptions,\n FilterItemsOptions,\n IconFilterOptions,\n SortCondition,\n SortStateOptions,\n Top10FilterOptions,\n} from \"./worksheet\";\n\nfunction stringifyFilterColumn(fc: FilterColumnOptions): string {\n const fcAttrs: Record<string, string | number | boolean | undefined> = { colId: fc.colId };\n if (fc.hiddenButton) fcAttrs.hiddenButton = 1;\n if (fc.showButton === false) fcAttrs.showButton = 0;\n\n let inner: string;\n if (fc.top10) {\n const t10Attrs: Record<string, string | number | boolean | undefined> = { val: fc.top10.val };\n if (fc.top10.top === false) t10Attrs.top = 0;\n if (fc.top10.percent) t10Attrs.percent = 1;\n if (fc.top10.filterVal !== undefined) t10Attrs.filterVal = fc.top10.filterVal;\n inner = `<top10${attrs(t10Attrs)}/>`;\n } else if (fc.customFilters) {\n const cfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (fc.customFilters.and) cfAttrs.and = 1;\n const entries = fc.customFilters.entries\n .map((e) => {\n const eAttrs: Record<string, string | number | boolean | undefined> = { val: e.val };\n if (e.operator) eAttrs.operator = e.operator;\n return selfCloseElement(\"customFilter\", attrs(eAttrs));\n })\n .join(\"\");\n inner = `<customFilters${attrs(cfAttrs)}>${entries}</customFilters>`;\n } else if (fc.filters) {\n const filtersAttrs: Record<string, string | number | boolean | undefined> = {};\n if (fc.filters.blank) filtersAttrs.blank = 1;\n if (fc.filters.calendarType) filtersAttrs.calendarType = fc.filters.calendarType;\n const valParts = (fc.filters.values ?? []).map((v) => `<filter val=\"${escapeXml(v)}\"/>`);\n const dgParts = (fc.filters.dateGroupItems ?? []).map((dg) => {\n const dgAttrs: Record<string, string | number | boolean | undefined> = {\n dateTimeGrouping: dg.dateTimeGrouping,\n };\n if (dg.year !== undefined) dgAttrs.year = dg.year;\n if (dg.month !== undefined) dgAttrs.month = dg.month;\n if (dg.day !== undefined) dgAttrs.day = dg.day;\n if (dg.hour !== undefined) dgAttrs.hour = dg.hour;\n if (dg.minute !== undefined) dgAttrs.minute = dg.minute;\n if (dg.second !== undefined) dgAttrs.second = dg.second;\n return `<dateGroupItem${attrs(dgAttrs)}/>`;\n });\n inner = `<filters${attrs(filtersAttrs)}>${valParts.join(\"\")}${dgParts.join(\"\")}</filters>`;\n } else if (fc.colorFilter) {\n const cfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (fc.colorFilter.dxfId !== undefined) cfAttrs.dxfId = fc.colorFilter.dxfId;\n if (fc.colorFilter.cellColor === false) cfAttrs.cellColor = 0;\n inner = `<colorFilter${attrs(cfAttrs)}/>`;\n } else if (fc.iconFilter) {\n const ifAttrs: Record<string, string | number | boolean | undefined> = {\n iconSet: fc.iconFilter.iconSet,\n };\n if (fc.iconFilter.iconId !== undefined) ifAttrs.iconId = fc.iconFilter.iconId;\n inner = `<iconFilter${attrs(ifAttrs)}/>`;\n } else if (fc.dynamicFilter) {\n const df = fc.dynamicFilter;\n const dfAttrs: Record<string, string | number | boolean | undefined> = { type: df.type };\n if (df.val !== undefined) dfAttrs.val = df.val;\n if (df.maxVal !== undefined) dfAttrs.maxVal = df.maxVal;\n if (df.valIso !== undefined) dfAttrs.valIso = df.valIso;\n if (df.maxValIso !== undefined) dfAttrs.maxValIso = df.maxValIso;\n inner = `<dynamicFilter${attrs(dfAttrs)}/>`;\n } else {\n inner = \"\";\n }\n\n if (inner) return `<filterColumn${attrs(fcAttrs)}>${inner}</filterColumn>`;\n return selfCloseElement(\"filterColumn\", attrs(fcAttrs));\n}\n\n/**\n * Stringify a CT_SortState element. Shared by the autoFilter child and the\n * worksheet-level `sortState` sibling — one content model, one serializer.\n */\nexport function stringifySortStateXml(ss: SortStateOptions): string {\n const ssAttrs: Record<string, string | number | boolean | undefined> = { ref: ss.ref };\n if (ss.columnSort) ssAttrs.columnSort = 1;\n if (ss.caseSensitive) ssAttrs.caseSensitive = 1;\n if (ss.sortMethod && ss.sortMethod !== \"none\") ssAttrs.sortMethod = ss.sortMethod;\n const sortParts = ss.conditions.map((sc) => {\n const scAttrs: Record<string, string | number | boolean | undefined> = { ref: sc.ref };\n if (sc.descending) scAttrs.descending = 1;\n if (sc.sortBy && sc.sortBy !== \"value\") scAttrs.sortBy = sc.sortBy;\n if (sc.customList) scAttrs.customList = sc.customList;\n if (sc.dxfId !== undefined) scAttrs.dxfId = sc.dxfId;\n if (sc.iconSet && sc.iconSet !== \"3Arrows\") scAttrs.iconSet = sc.iconSet;\n if (sc.iconId !== undefined) scAttrs.iconId = sc.iconId;\n return selfCloseElement(\"sortCondition\", attrs(scAttrs));\n });\n return `<sortState${attrs(ssAttrs)}>${sortParts.join(\"\")}</sortState>`;\n}\n\n/** Parse a CT_SortState element. */\nexport function parseSortStateEl(el: XmlElement): SortStateOptions {\n const ss: SortStateOptions = { ref: attr(el, \"ref\") ?? \"\", conditions: [] };\n if (parseOnOff(attr(el, \"columnSort\"))) ss.columnSort = true;\n if (parseOnOff(attr(el, \"caseSensitive\"))) ss.caseSensitive = true;\n const sm = attr(el, \"sortMethod\");\n if (sm) ss.sortMethod = sm as SortStateOptions[\"sortMethod\"];\n for (const sc of el.elements ?? []) {\n if (sc.name !== \"sortCondition\") continue;\n const cond: SortCondition = { ref: attr(sc, \"ref\") ?? \"\" };\n if (parseOnOff(attr(sc, \"descending\"))) cond.descending = true;\n const sb = attr(sc, \"sortBy\");\n if (sb) cond.sortBy = sb as SortCondition[\"sortBy\"];\n const cl = attr(sc, \"customList\");\n if (cl) cond.customList = cl;\n const dxfId = attrNum(sc, \"dxfId\");\n if (dxfId !== undefined) cond.dxfId = dxfId;\n const is = attr(sc, \"iconSet\");\n if (is) cond.iconSet = is as SortCondition[\"iconSet\"];\n const ii = attrNum(sc, \"iconId\");\n if (ii !== undefined) cond.iconId = ii;\n ss.conditions.push(cond);\n }\n return ss;\n}\n\n/**\n * Stringify an autoFilter value (shorthand ref string or structured options)\n * into its `<autoFilter>` element. Returns \"\" for undefined so callers can push\n * unconditionally.\n */\nexport function stringifyAutoFilter(af: string | AutoFilterOptions | undefined): string {\n if (af === undefined) return \"\";\n if (typeof af === \"string\") {\n return selfCloseElement(\"autoFilter\", attrs({ ref: af }));\n }\n const inner: string[] = [];\n for (const fc of af.columns ?? []) {\n inner.push(stringifyFilterColumn(fc));\n }\n if (af.sortState) {\n inner.push(stringifySortStateXml(af.sortState));\n }\n if (inner.length > 0) {\n return `<autoFilter ref=\"${escapeXml(af.ref)}\">${inner.join(\"\")}</autoFilter>`;\n }\n return selfCloseElement(\"autoFilter\", attrs({ ref: af.ref }));\n}\n\n/** Parse a CT_Filters element (filter values + dateGroupItem children). */\nfunction parseFiltersEl(fc: XmlElement): FilterItemsOptions {\n const fi: FilterItemsOptions = {};\n if (parseOnOff(attr(fc, \"blank\"))) fi.blank = true;\n const cal = attr(fc, \"calendarType\");\n if (cal) fi.calendarType = cal as FilterItemsOptions[\"calendarType\"];\n const values: string[] = [];\n const dateGroupItems: DateGroupFilterOptions[] = [];\n for (const f of fc.elements ?? []) {\n if (f.name === \"filter\") {\n const v = attr(f, \"val\");\n if (v !== undefined) values.push(v);\n } else if (f.name === \"dateGroupItem\") {\n const dg: DateGroupFilterOptions = {\n dateTimeGrouping: attr(f, \"dateTimeGrouping\") as DateGroupFilterOptions[\"dateTimeGrouping\"],\n };\n const y = attrNum(f, \"year\");\n if (y !== undefined) dg.year = y;\n const mo = attrNum(f, \"month\");\n if (mo !== undefined) dg.month = mo;\n const d = attrNum(f, \"day\");\n if (d !== undefined) dg.day = d;\n const h = attrNum(f, \"hour\");\n if (h !== undefined) dg.hour = h;\n const mi = attrNum(f, \"minute\");\n if (mi !== undefined) dg.minute = mi;\n const s = attrNum(f, \"second\");\n if (s !== undefined) dg.second = s;\n dateGroupItems.push(dg);\n }\n }\n if (values.length > 0) fi.values = values;\n if (dateGroupItems.length > 0) fi.dateGroupItems = dateGroupItems;\n return fi;\n}\n\n/**\n * Parse an `<autoFilter>` element. Ref-only filters round-trip as the shorthand\n * string (matches the generate API); structured object only when filter columns\n * or sort state exist. nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\"\n * to numbers, so boolean checks use String() coercion.\n */\nexport function parseAutoFilter(afEl: XmlElement): string | AutoFilterOptions {\n const af: AutoFilterOptions = { ref: attr(afEl, \"ref\") ?? \"\" };\n for (const child of afEl.elements ?? []) {\n if (child.name === \"filterColumn\") {\n const fc: FilterColumnOptions = { colId: attrNum(child, \"colId\") ?? 0 };\n if (parseOnOff(attr(child, \"hiddenButton\"))) fc.hiddenButton = true;\n if (String(attr(child, \"showButton\")) === \"0\") fc.showButton = false;\n for (const el of child.elements ?? []) {\n if (el.name === \"top10\") {\n const t: Top10FilterOptions = { val: attrNum(el, \"val\") ?? 0 };\n if (String(attr(el, \"top\")) === \"0\") t.top = false;\n if (parseOnOff(attr(el, \"percent\"))) t.percent = true;\n const fv = attrNum(el, \"filterVal\");\n if (fv !== undefined) t.filterVal = fv;\n fc.top10 = t;\n } else if (el.name === \"customFilters\") {\n const cf: CustomFiltersOptions = { entries: [] };\n if (parseOnOff(attr(el, \"and\"))) cf.and = true;\n for (const entry of el.elements ?? []) {\n if (entry.name !== \"customFilter\") continue;\n const op = attr(entry, \"operator\");\n const v = attr(entry, \"val\");\n cf.entries.push({\n ...(op\n ? { operator: op as CustomFiltersOptions[\"entries\"][number][\"operator\"] }\n : {}),\n val: v ?? \"\",\n });\n }\n fc.customFilters = cf;\n } else if (el.name === \"filters\") {\n fc.filters = parseFiltersEl(el);\n } else if (el.name === \"colorFilter\") {\n const colorFilter: ColorFilterOptions = {};\n const dxfId = attrNum(el, \"dxfId\");\n if (dxfId !== undefined) colorFilter.dxfId = dxfId;\n if (String(attr(el, \"cellColor\")) === \"0\") colorFilter.cellColor = false;\n fc.colorFilter = colorFilter;\n } else if (el.name === \"iconFilter\") {\n // @iconSet is ST_IconSetType (a string enum), not a number.\n const iconFilter: IconFilterOptions = {\n iconSet: (attr(el, \"iconSet\") ?? \"3Arrows\") as IconFilterOptions[\"iconSet\"],\n };\n const iconId = attrNum(el, \"iconId\");\n if (iconId !== undefined) iconFilter.iconId = iconId;\n fc.iconFilter = iconFilter;\n } else if (el.name === \"dynamicFilter\") {\n const df: DynamicFilterOptions = {\n type: attr(el, \"type\") as DynamicFilterOptions[\"type\"],\n };\n const v = attrNum(el, \"val\");\n if (v !== undefined) df.val = v;\n const mv = attrNum(el, \"maxVal\");\n if (mv !== undefined) df.maxVal = mv;\n const vi = attr(el, \"valIso\");\n if (vi) df.valIso = vi;\n const mvi = attr(el, \"maxValIso\");\n if (mvi) df.maxValIso = mvi;\n fc.dynamicFilter = df;\n }\n }\n (af.columns ??= []).push(fc);\n } else if (child.name === \"sortState\") {\n af.sortState = parseSortStateEl(child);\n }\n }\n const hasFilters = af.columns !== undefined || af.sortState !== undefined;\n return hasFilters ? af : af.ref;\n}\n\n/** Locate and parse an autoFilter child under a parent element. */\nexport function findAndParseAutoFilter(parent: XmlElement): string | AutoFilterOptions | undefined {\n const afEl = findChild(parent, \"autoFilter\");\n return afEl ? parseAutoFilter(afEl) : undefined;\n}\n","/**\n * PivotTable — parse helpers.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { attr, attrNum, findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type { PivotAreaOptions, PivotAreaReferenceOptions } from \"../pivot/pivot-utils\";\n\nexport function parsePivotArea(el: XmlElement): Partial<PivotAreaOptions> {\n const result: Partial<PivotAreaOptions> = {};\n const field = attrNum(el, \"field\");\n if (field !== undefined) result.field = field;\n const typeVal = attr(el, \"type\");\n if (typeVal) result.type = typeVal as PivotAreaOptions[\"type\"];\n if (String(attr(el, \"dataOnly\")) === \"0\") result.dataOnly = false;\n if (parseOnOff(attr(el, \"labelOnly\"))) result.labelOnly = true;\n if (parseOnOff(attr(el, \"grandRow\"))) result.grandRow = true;\n if (parseOnOff(attr(el, \"grandCol\"))) result.grandCol = true;\n if (parseOnOff(attr(el, \"cacheIndex\"))) result.cacheIndex = true;\n if (String(attr(el, \"outline\")) === \"0\") result.outline = false;\n if (attr(el, \"offset\")) result.offset = attr(el, \"offset\");\n if (parseOnOff(attr(el, \"collapsedLevelsAreSubtotals\")))\n result.collapsedLevelsAreSubtotals = true;\n const axisVal = attr(el, \"axis\");\n if (axisVal) result.axis = axisVal as PivotAreaOptions[\"axis\"];\n const fp = attrNum(el, \"fieldPosition\");\n if (fp !== undefined) result.fieldPosition = fp;\n const refsEl = findChild(el, \"references\");\n if (refsEl) {\n const refs: Partial<PivotAreaReferenceOptions>[] = [];\n for (const rEl of refsEl.elements ?? []) {\n if (rEl.name !== \"reference\") continue;\n const ref: Partial<PivotAreaReferenceOptions> = {};\n const rField = attrNum(rEl, \"field\");\n if (rField !== undefined) ref.field = rField;\n const rCount = attrNum(rEl, \"count\");\n if (rCount !== undefined) ref.count = rCount;\n if (String(attr(rEl, \"selected\")) === \"0\") ref.selected = false;\n if (parseOnOff(attr(rEl, \"byPosition\"))) ref.byPosition = true;\n if (parseOnOff(attr(rEl, \"relative\"))) ref.relative = true;\n if (parseOnOff(attr(rEl, \"defaultSubtotal\"))) ref.defaultSubtotal = true;\n if (parseOnOff(attr(rEl, \"sumSubtotal\"))) ref.sumSubtotal = true;\n if (parseOnOff(attr(rEl, \"avgSubtotal\"))) ref.avgSubtotal = true;\n if (parseOnOff(attr(rEl, \"countASubtotal\"))) ref.countASubtotal = true;\n if (parseOnOff(attr(rEl, \"maxSubtotal\"))) ref.maxSubtotal = true;\n if (parseOnOff(attr(rEl, \"minSubtotal\"))) ref.minSubtotal = true;\n const xArr: number[] = [];\n for (const xEl of rEl.elements ?? []) {\n if (xEl.name === \"x\") {\n const v = attrNum(xEl, \"v\");\n if (v !== undefined) xArr.push(v);\n }\n }\n if (xArr.length > 0) ref.x = xArr;\n refs.push(ref);\n }\n result.references = refs;\n }\n return result;\n}\n","/**\n * Worksheet — parse helpers shared by the descriptor.\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport { attr, attrNum } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type { CfColorOptions, CfvoOptions, CfvoType, PageBreakOptions } from \"./types\";\n\n/**\n * Parse a conditional-formatting `<color>` (CT_Color). Every channel is an\n * alternative — rgb hex, a theme slot (with optional tint), or a legacy\n * palette index. Returns undefined when the element carries none of them.\n */\nexport function parseCfColor(el: XmlElement): CfColorOptions | undefined {\n const result: CfColorOptions = {};\n const rgb = attr(el, \"rgb\");\n if (rgb) result.rgb = rgb.length === 8 ? rgb.slice(2) : rgb;\n const theme = attrNum(el, \"theme\");\n if (theme !== undefined) {\n result.theme = theme;\n const tint = attrNum(el, \"tint\");\n if (tint !== undefined) result.tint = tint;\n }\n const indexed = attrNum(el, \"indexed\");\n if (indexed !== undefined) result.indexed = indexed;\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/** Parse a CT_PageBreak (w:rowBreaks / w:colBreaks) into break entries. */\nexport function parsePageBreaks(el: XmlElement): PageBreakOptions[] {\n const breaks: PageBreakOptions[] = [];\n for (const brkEl of el.elements ?? []) {\n if (brkEl.name !== \"brk\") continue;\n const id = attrNum(brkEl, \"id\");\n if (id === undefined) continue;\n const b: PageBreakOptions = { id };\n const min = attrNum(brkEl, \"min\");\n if (min !== undefined) b.min = min;\n const max = attrNum(brkEl, \"max\");\n if (max !== undefined) b.max = max;\n if (parseOnOff(attr(brkEl, \"man\"))) b.manual = true;\n if (parseOnOff(attr(brkEl, \"pt\"))) b.pivot = true;\n breaks.push(b);\n }\n return breaks;\n}\n\nexport function parseCfvo(el: XmlElement): CfvoOptions {\n const result: CfvoOptions = { type: (attr(el, \"type\") ?? \"num\") as CfvoType };\n const val = attr(el, \"val\");\n if (val !== undefined) result.val = isNaN(Number(val)) ? val : Number(val);\n if (String(attr(el, \"gte\")) === \"0\") result.gte = false;\n return result;\n}\n","/**\n * sheetData row scanner — the single parse implementation for worksheet rows.\n *\n * `parseWorkbook` requests `deferElements: [\"sheetData\"]` when reading\n * worksheet parts, so the XML parser captures the container's inner XML\n * verbatim (`Element.raw`) instead of materializing millions of row/cell\n * nodes (~1.75 GB of allocations on a 100k×20 sheet). This scanner walks\n * that string directly into RowOptions. Semantics are field-for-field\n * identical to the former Element-tree walk it replaced.\n *\n * @module\n */\n\nimport { unescapeXml } from \"@office-open/xml\";\n\nimport type { CellOptions, FormulaOptions, RichTextOptions, RowOptions } from \"./types\";\n\n// ── Tag scanning primitives ──\n\n/** Index of the next `<name` whose following char is a tag boundary, or -1. */\nfunction indexOfTag(src: string, name: string, from: number, limit: number): number {\n const open = `<${name}`;\n const nameLen = name.length;\n let p = from;\n for (;;) {\n const idx = src.indexOf(open, p);\n if (idx === -1 || idx >= limit) return -1;\n const after = src.charCodeAt(idx + 1 + nameLen);\n if (\n after === 0x20 ||\n after === 0x09 ||\n after === 0x0a ||\n after === 0x0d ||\n after === 0x2f ||\n after === 0x3e\n ) {\n return idx;\n }\n p = idx + 1 + nameLen;\n }\n}\n\n/**\n * Index of the tag's closing `>`, honoring quoted attribute values (a quoted\n * `>` is not a tag end), or -1.\n */\nfunction findTagEnd(src: string, from: number): number {\n let i = from;\n const len = src.length;\n while (i < len) {\n const c = src.charCodeAt(i);\n if (c === 0x22) {\n const close = src.indexOf('\"', i + 1);\n if (close === -1) return -1;\n i = close + 1;\n continue;\n }\n if (c === 0x3e) return i;\n i++;\n }\n return -1;\n}\n\n/** Visit `name=\"value\"` pairs inside a tag (from = after tag name, to = before `>`/`/>`). */\nfunction scanAttrs(\n src: string,\n from: number,\n to: number,\n visit: (name: string, value: string) => void,\n): void {\n let i = from;\n while (i < to) {\n while (i < to) {\n const c = src.charCodeAt(i);\n if (c !== 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) break;\n i++;\n }\n if (i >= to) return;\n const nameStart = i;\n while (i < to && src.charCodeAt(i) !== 0x3d) i++;\n if (i >= to) return;\n const name = src.slice(nameStart, i);\n i++; // '='\n while (i < to) {\n const c = src.charCodeAt(i);\n if (c !== 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) break;\n i++;\n }\n const quote = src.charCodeAt(i);\n if (quote !== 0x22 && quote !== 0x27) return;\n i++;\n const valueStart = i;\n while (i < to && src.charCodeAt(i) !== quote) i++;\n visit(name, unescapeXml(src.slice(valueStart, i)));\n i++;\n }\n}\n\n/** parseOnOff truthiness for on/off attribute values (\"1\"/\"true\"/\"on\"). */\nfunction isOn(value: string): boolean {\n const lower = value.length <= 5 ? value.toLowerCase() : value;\n return lower === \"1\" || lower === \"true\" || lower === \"on\";\n}\n\n/**\n * Text content of a leaf element's inner XML slice, matching the Element-tree\n * `textOf` semantics: text is unescaped and CDATA sections are skipped\n * (text nodes only). Self-closing / empty content yields \"\".\n */\nfunction textContent(src: string, from: number, to: number): string {\n if (to <= from) return \"\";\n let text = src.slice(from, to);\n // CDATA would appear verbatim in the slice; textOf ignores cdata nodes.\n if (text.indexOf(\"<![CDATA[\") !== -1) {\n text = text.replace(/<!\\[CDATA\\[.*?\\]\\]>/gs, \"\");\n }\n return unescapeXml(text);\n}\n\n/** Inner span of the first `<t>` that is a direct child of an `<is>` slice. */\nfunction inlineStringText(src: string, from: number, to: number): string | undefined {\n let q = from;\n while (q < to) {\n const lt = src.indexOf(\"<\", q);\n if (lt === -1 || lt >= to) break;\n const tEnd = findTagEnd(src, lt + 1);\n if (tEnd === -1 || tEnd >= to) break;\n const afterLt = lt + 1;\n let nameEnd = afterLt;\n while (nameEnd < tEnd) {\n const c = src.charCodeAt(nameEnd);\n if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d || c === 0x2f) break;\n nameEnd++;\n }\n const name = src.slice(afterLt, nameEnd);\n if (name === \"t\") {\n if (src.charCodeAt(tEnd - 1) === 0x2f) return \"\";\n const close = src.indexOf(\"</t>\", tEnd + 1);\n return close === -1 ? \"\" : textContent(src, tEnd + 1, close);\n }\n if (name === \"r\") {\n // Rich-text run: its <t> is nested, not a direct child — skip the run.\n const close = src.indexOf(\"</r>\", tEnd + 1);\n if (close === -1) break;\n q = close + 4;\n continue;\n }\n q = tEnd + 1;\n }\n return undefined;\n}\n\n// ── Row scanner ──\n\n/**\n * Scan `sheetData` inner XML into RowOptions. Cell/row styles stay as raw\n * cellXfs indices (the SDK's StyleIndex model) — the style table travels\n * alongside on WorkbookOptions and the compiler adopts it wholesale, so the\n * indices resolve exactly as they did in the source file.\n */\nexport function parseSheetDataRows(\n raw: string,\n strings: (string | RichTextOptions)[],\n): RowOptions[] {\n const rows: RowOptions[] = [];\n const len = raw.length;\n let pos = 0;\n\n for (;;) {\n const rowOpen = indexOfTag(raw, \"row\", pos, len);\n if (rowOpen === -1) break;\n const tagEnd = findTagEnd(raw, rowOpen + 4);\n if (tagEnd === -1) break;\n const selfClosing = raw.charCodeAt(tagEnd - 1) === 0x2f;\n const attrEnd = selfClosing ? tagEnd - 1 : tagEnd;\n\n const row: RowOptions = {};\n let rowClose = tagEnd;\n let rowStyleIdx: number | undefined;\n scanAttrs(raw, rowOpen + 4, attrEnd, (name, value) => {\n switch (name) {\n case \"r\": {\n const n = Number(value);\n if (!isNaN(n)) row.rowNumber = n;\n break;\n }\n case \"ht\": {\n const n = Number(value);\n if (!isNaN(n)) row.height = n;\n break;\n }\n case \"hidden\":\n if (isOn(value)) row.hidden = true;\n break;\n case \"spans\":\n row.spans = value;\n break;\n case \"customFormat\":\n if (isOn(value)) row.customFormat = true;\n break;\n case \"thickTop\":\n if (isOn(value)) row.thickTop = true;\n break;\n case \"thickBot\":\n if (isOn(value)) row.thickBot = true;\n break;\n case \"ph\":\n if (isOn(value)) row.phonetic = true;\n break;\n case \"outlineLevel\": {\n const n = Number(value);\n if (!isNaN(n)) row.outlineLevel = n;\n break;\n }\n case \"collapsed\":\n if (isOn(value)) row.collapsed = true;\n break;\n case \"s\": {\n const n = Number(value);\n if (!isNaN(n)) rowStyleIdx = n;\n break;\n }\n }\n });\n if (rowStyleIdx !== undefined) {\n row.style = rowStyleIdx;\n }\n\n const cells: CellOptions[] = [];\n if (!selfClosing) {\n rowClose = raw.indexOf(\"</row>\", tagEnd + 1);\n if (rowClose === -1) break;\n let cp = tagEnd + 1;\n for (;;) {\n const cellOpen = indexOfTag(raw, \"c\", cp, rowClose);\n if (cellOpen === -1) break;\n const cellTagEnd = findTagEnd(raw, cellOpen + 2);\n if (cellTagEnd === -1) break;\n const cellSelfClosing = raw.charCodeAt(cellTagEnd - 1) === 0x2f;\n const cell: CellOptions = {};\n let type: string | undefined;\n let styleIdx: number | undefined;\n\n // Inline attribute scan for the five cell attributes (r/t/s/cm/vm).\n // scanAttrs + closure costs one closure allocation and one name-string\n // slice per attribute on a 2M-cell sheet; dispatching on name length +\n // first char keeps the hot attributes allocation-free (other names are\n // skipped, same as the switch default they replace).\n let ap = cellOpen + 2;\n const attrLimit = cellSelfClosing ? cellTagEnd - 1 : cellTagEnd;\n while (ap < attrLimit) {\n while (ap < attrLimit) {\n const c = raw.charCodeAt(ap);\n if (c !== 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) break;\n ap++;\n }\n if (ap >= attrLimit) break;\n const aNameStart = ap;\n while (ap < attrLimit && raw.charCodeAt(ap) !== 0x3d) ap++;\n if (ap >= attrLimit) break;\n const aNameLen = ap - aNameStart;\n ap++; // '='\n while (ap < attrLimit) {\n const c = raw.charCodeAt(ap);\n if (c !== 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) break;\n ap++;\n }\n const aQuote = raw.charCodeAt(ap);\n if (aQuote !== 0x22 && aQuote !== 0x27) break;\n ap++;\n const aValueStart = ap;\n while (ap < attrLimit && raw.charCodeAt(ap) !== aQuote) ap++;\n const aFirst = raw.charCodeAt(aNameStart);\n if (aNameLen === 1) {\n if (aFirst === 0x72 /* r */) {\n cell.reference = unescapeXml(raw.slice(aValueStart, ap));\n } else if (aFirst === 0x74 /* t */) {\n type = unescapeXml(raw.slice(aValueStart, ap));\n } else if (aFirst === 0x73 /* s */) {\n const n = Number(unescapeXml(raw.slice(aValueStart, ap)));\n if (!isNaN(n)) styleIdx = n;\n }\n } else if (aNameLen === 2 && aFirst === 0x63 /* cm */) {\n const n = Number(unescapeXml(raw.slice(aValueStart, ap)));\n if (!isNaN(n)) cell.cellMetadataId = n;\n } else if (aNameLen === 2 && aFirst === 0x76 /* vm */) {\n const n = Number(unescapeXml(raw.slice(aValueStart, ap)));\n if (!isNaN(n)) cell.valueMetadataId = n;\n }\n ap++;\n }\n\n if (styleIdx !== undefined) {\n cell.style = styleIdx;\n }\n\n let cellEnd = cellTagEnd + 1;\n if (!cellSelfClosing) {\n const cellClose = raw.indexOf(\"</c>\", cellTagEnd + 1);\n if (cellClose === -1) break;\n cellEnd = cellClose + 4;\n let vText: string | undefined;\n let vNum: number | undefined;\n let inlineText: string | undefined;\n let hasInline = false;\n let formula: FormulaOptions | undefined;\n\n let p = cellTagEnd + 1;\n while (p < cellClose) {\n const lt = raw.indexOf(\"<\", p);\n if (lt === -1 || lt >= cellClose) break;\n const tEnd = findTagEnd(raw, lt + 1);\n if (tEnd === -1) break;\n let nameEnd = lt + 2;\n while (nameEnd < tEnd) {\n const c = raw.charCodeAt(nameEnd);\n if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d || c === 0x2f) break;\n nameEnd++;\n }\n // Dispatch on tag-name length + first char: v/is/f cover the\n // children of virtually every cell, so the common path never\n // allocates a name string.\n const nameLen = nameEnd - (lt + 1);\n const first = raw.charCodeAt(lt + 1);\n if (nameLen === 1 && first === 0x76 /* v */) {\n if (raw.charCodeAt(tEnd - 1) === 0x2f) {\n if (vText === undefined) vText = \"\";\n } else {\n const close = raw.indexOf(\"</v>\", tEnd + 1);\n if (close === -1) break;\n if (vText === undefined && vNum === undefined) {\n // Fast path: pure-digit <v> content (about half the cells in\n // data-heavy sheets) parses straight from char codes — no\n // slice, no entity scan, no Number() re-scan. Up to 15\n // digits is always exact in float64 (same bound as\n // nativeTypeValue); anything else takes the string path.\n const vStart = tEnd + 1;\n const vLen = close - vStart;\n let n = 0;\n let allDigits = vLen > 0 && vLen <= 15;\n if (allDigits) {\n for (let q = vStart; q < close; q++) {\n const d = raw.charCodeAt(q) - 0x30;\n if (d < 0 || d > 9) {\n allDigits = false;\n break;\n }\n n = n * 10 + d;\n }\n }\n if (allDigits) vNum = n;\n else vText = textContent(raw, vStart, close);\n }\n p = close + 4;\n continue;\n }\n } else if (nameLen === 2 && first === 0x69 /* is */) {\n hasInline = true;\n const close = raw.indexOf(\"</is>\", tEnd + 1);\n const isEnd = close === -1 ? cellClose : close;\n if (inlineText === undefined) inlineText = inlineStringText(raw, tEnd + 1, isEnd);\n if (close === -1) break;\n p = close + 5;\n continue;\n } else if (nameLen === 1 && first === 0x66 /* f */) {\n const fSelfClosing = raw.charCodeAt(tEnd - 1) === 0x2f;\n const f: FormulaOptions = { formula: \"\" };\n scanAttrs(raw, nameEnd, fSelfClosing ? tEnd - 1 : tEnd, (n3, v3) => {\n switch (n3) {\n case \"t\":\n if (v3 !== \"normal\") f.type = v3 as FormulaOptions[\"type\"];\n break;\n case \"ref\":\n f.reference = v3;\n break;\n case \"si\": {\n const n = Number(v3);\n if (!isNaN(n)) f.sharedIndex = n;\n break;\n }\n case \"aca\":\n if (isOn(v3)) f.aca = true;\n break;\n case \"ca\":\n if (isOn(v3)) f.calculateCell = true;\n break;\n case \"bx\":\n if (isOn(v3)) f.arrayContext = true;\n break;\n }\n });\n if (fSelfClosing) {\n p = tEnd + 1;\n } else {\n const close = raw.indexOf(\"</f>\", tEnd + 1);\n if (close === -1) break;\n f.formula = textContent(raw, tEnd + 1, close);\n p = close + 4;\n }\n if (formula === undefined) formula = f;\n continue;\n }\n p = tEnd + 1;\n }\n\n // Cell value — resolution order matches the former tree walk.\n if (type === \"s\" && (vText !== undefined || vNum !== undefined)) {\n const idx = vNum !== undefined ? vNum : parseInt(vText!, 10);\n cell.value = strings[idx] ?? \"\";\n } else if (type === \"b\" && (vText !== undefined || vNum !== undefined)) {\n cell.value = vNum !== undefined ? vNum === 1 : vText === \"1\";\n } else if (type === \"e\" && (vText !== undefined || vNum !== undefined)) {\n cell.error = vNum !== undefined ? String(vNum) : vText!;\n } else if (type === \"inlineStr\" && hasInline) {\n cell.value = inlineText ?? \"\";\n } else if (vNum !== undefined) {\n cell.value = vNum;\n } else if (vText !== undefined) {\n const num = Number(vText);\n cell.value = isNaN(num) ? vText : num;\n }\n if (formula !== undefined) cell.formula = formula;\n }\n\n cells.push(cell);\n cp = cellEnd;\n }\n }\n\n row.cells = cells;\n rows.push(row);\n pos = selfClosing ? tagEnd + 1 : rowClose + 6;\n }\n\n return rows;\n}\n","/**\n * Worksheet — descriptor for xl/worksheets/sheet{n}.xml.\n *\n * stringify() intentionally throws: the compiler calls stringifyWorksheet()\n * directly (it needs the SharedStrings/Styles accumulators). This descriptor\n * exists for the read path only.\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport { xsdConsolidateFunction } from \"@office-open/core\";\nimport type { PositiveUniversalMeasure } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, attrMeasure, attrNum, findChild, stringify, textOf } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\n\nimport type { XlsxReadContext } from \"../../context\";\nimport { parseAutoFilter, parseSortStateEl } from \"../auto-filter\";\nimport { parsePivotArea } from \"../pivot-table/parse\";\nimport { parseCfColor, parseCfvo, parsePageBreaks } from \"./parse\";\nimport { parseSheetDataRows } from \"./sheet-data\";\nimport type {\n CellSmartTagsOptions,\n CellWatchOptions,\n CfColorOptions,\n CfvoOptions,\n ColumnOptions,\n ConditionalFormatOperator,\n ConditionalFormatOptions,\n ConditionalFormatRule,\n ConditionalFormatType,\n ControlOptions,\n AnchorMarkerOptions,\n ObjectAnchorOptions,\n CustomSheetPropertyOptions,\n CustomSheetViewOptions,\n DataConsolidateOptions,\n DataValidationOperator,\n DataValidationOptions,\n DataValidationType,\n DrawingHfOptions,\n FreezePaneOptions,\n HeaderFooterOptions,\n HyperlinkOptions,\n IconSetOptions,\n IconSetType,\n IgnoredErrorOptions,\n MergeCellOptions,\n OleObjectOptions,\n OleObjectPropertiesOptions,\n PageMarginsOptions,\n PageOrientation,\n PageSetupOptions,\n PhoneticPropertiesOptions,\n PivotSelectionOptions,\n RichTextOptions,\n PrintOptions,\n ProtectedRangeOptions,\n ScenarioCellOptions,\n ScenarioDefinition,\n ScenarioOptions,\n SelectionOptions,\n SheetCalculationPropertiesOptions,\n SheetFormatPropertiesOptions,\n SheetPropertiesOptions,\n SheetProtectionOptions,\n SheetViewOptions,\n TabColorOptions,\n WebPublishItemOptions,\n WorksheetOptions,\n} from \"./types\";\n\nconst DRAWING_HF_OFFSET_KEYS = [\n \"lho\",\n \"lhe\",\n \"lhf\",\n \"cho\",\n \"che\",\n \"chf\",\n \"rho\",\n \"rhe\",\n \"rhf\",\n \"lfo\",\n \"lfe\",\n \"lff\",\n \"cfo\",\n \"cfe\",\n \"cff\",\n \"rfo\",\n \"rfe\",\n \"rff\",\n] as const satisfies readonly (keyof DrawingHfOptions)[];\n\nexport const worksheetDesc: CustomDescriptor<WorksheetOptions> = {\n kind: \"custom\",\n\n /**\n * NOT intended for direct use by the compiler.\n * The compiler calls `stringifyWorksheet(opts, ctx)` instead, which has\n * access to the SharedStrings and Styles accumulators.\n * This method exists to satisfy the CustomDescriptor interface for the read path.\n */\n stringify(_opts, _ctx) {\n throw new Error(\n \"Use stringifyWorksheet(opts, ctx) for the write path. worksheetDesc.stringify() is not supported.\",\n );\n },\n\n parse(el, ctx) {\n const result: Partial<WorksheetOptions> = {};\n let pageSetUpPrCache: Partial<PageSetupOptions> | undefined;\n\n // Resolve shared strings from context (XlsxReadContext). Rich-text\n // entries arrive as RichTextOptions objects and flow into cell.value.\n const strings: (string | RichTextOptions)[] =\n ctx && \"sharedStrings\" in ctx ? (ctx as XlsxReadContext).sharedStrings : [];\n\n // Sheet properties\n const sheetPrEl = findChild(el, \"sheetPr\");\n if (sheetPrEl) {\n const sp: SheetPropertiesOptions = {};\n if (attr(sheetPrEl, \"codeName\")) sp.codeName = attr(sheetPrEl, \"codeName\");\n if (parseOnOff(attr(sheetPrEl, \"syncHorizontal\"))) sp.syncHorizontal = true;\n if (parseOnOff(attr(sheetPrEl, \"syncVertical\"))) sp.syncVertical = true;\n if (attr(sheetPrEl, \"syncRef\")) sp.syncRef = attr(sheetPrEl, \"syncRef\");\n if (parseOnOff(attr(sheetPrEl, \"transitionEvaluation\"))) sp.transitionEvaluation = true;\n if (parseOnOff(attr(sheetPrEl, \"transitionEntry\"))) sp.transitionEntry = true;\n // XSD defaults true — only the explicit \"0\" carries information back.\n if (String(attr(sheetPrEl, \"published\")) === \"0\") sp.published = false;\n if (parseOnOff(attr(sheetPrEl, \"filterMode\"))) sp.filterMode = true;\n if (String(attr(sheetPrEl, \"enableFormatConditionsCalculation\")) === \"0\")\n sp.enableFormatConditionsCalculation = false;\n\n const outlinePr = findChild(sheetPrEl, \"outlinePr\");\n if (outlinePr) {\n if (parseOnOff(attr(outlinePr, \"applyStyles\"))) sp.outlineApplyStyles = true;\n if (String(attr(outlinePr, \"showOutlineSymbols\")) === \"0\") sp.outlineShowSymbols = false;\n if (String(attr(outlinePr, \"summaryBelow\")) === \"0\") sp.outlineSummaryBelow = false;\n if (String(attr(outlinePr, \"summaryRight\")) === \"0\") sp.outlineSummaryRight = false;\n }\n\n // pageSetUpPr (inside sheetPr) — stash on result.pageSetup; merged into\n // the <pageSetup> parse below, which owns result.pageSetup.\n const pageSetUpPr = findChild(sheetPrEl, \"pageSetUpPr\");\n if (pageSetUpPr) {\n const psup: Partial<PageSetupOptions> = {};\n // Present-as-written: autoPageBreaks defaults true, so an explicit \"0\"\n // carries information and must survive the round-trip.\n if (attr(pageSetUpPr, \"fitToPage\") !== undefined)\n psup.fitToPage = parseOnOff(attr(pageSetUpPr, \"fitToPage\")) ?? false;\n if (attr(pageSetUpPr, \"autoPageBreaks\") !== undefined)\n psup.autoPageBreaks = parseOnOff(attr(pageSetUpPr, \"autoPageBreaks\")) ?? true;\n if (Object.keys(psup).length > 0) pageSetUpPrCache = psup;\n }\n if (Object.keys(sp).length > 0) result.sheetPr = sp;\n\n // Tab color\n const tabColorEl = findChild(sheetPrEl, \"tabColor\");\n if (tabColorEl) {\n const tc: TabColorOptions = {};\n if (attr(tabColorEl, \"rgb\")) tc.rgb = attr(tabColorEl, \"rgb\");\n if (attrNum(tabColorEl, \"theme\") !== undefined) tc.theme = attrNum(tabColorEl, \"theme\");\n if (attrNum(tabColorEl, \"tint\") !== undefined) tc.tint = attrNum(tabColorEl, \"tint\");\n if (attrNum(tabColorEl, \"indexed\") !== undefined)\n tc.indexed = attrNum(tabColorEl, \"indexed\");\n result.tabColor = tc;\n }\n }\n\n // Sheet views\n const sheetViewsEl = findChild(el, \"sheetViews\");\n if (sheetViewsEl) {\n const svEl = findChild(sheetViewsEl, \"sheetView\");\n if (svEl) {\n const sv: SheetViewOptions = {};\n if (String(attr(svEl, \"showGridLines\")) === \"0\") sv.showGridLines = false;\n if (String(attr(svEl, \"showRowColHeaders\")) === \"0\") sv.showRowColHeaders = false;\n if (String(attr(svEl, \"showZeros\")) === \"0\") sv.showZeros = false;\n const zs = attrNum(svEl, \"zoomScale\");\n if (zs !== undefined) sv.zoomScale = zs;\n if (attr(svEl, \"tabSelected\") !== undefined)\n sv.tabSelected = parseOnOff(attr(svEl, \"tabSelected\")) ?? true;\n if (parseOnOff(attr(svEl, \"rightToLeft\"))) sv.rightToLeft = true;\n if (parseOnOff(attr(svEl, \"windowProtection\"))) sv.windowProtection = true;\n if (parseOnOff(attr(svEl, \"showFormulas\"))) sv.showFormulas = true;\n if (String(attr(svEl, \"showRuler\")) === \"0\") sv.showRuler = false;\n if (String(attr(svEl, \"showOutlineSymbols\")) === \"0\") sv.showOutlineSymbols = false;\n if (String(attr(svEl, \"defaultGridColor\")) === \"0\") sv.defaultGridColor = false;\n if (String(attr(svEl, \"showWhiteSpace\")) === \"0\") sv.showWhiteSpace = false;\n const viewVal = attr(svEl, \"view\");\n if (viewVal) sv.view = viewVal as SheetViewOptions[\"view\"];\n const topLeftCell = attr(svEl, \"topLeftCell\");\n if (topLeftCell) sv.topLeftCell = topLeftCell;\n const colorId = attrNum(svEl, \"colorId\");\n if (colorId !== undefined) sv.colorId = colorId;\n const zsn = attrNum(svEl, \"zoomScaleNormal\");\n if (zsn !== undefined) sv.zoomScaleNormal = zsn;\n const zssl = attrNum(svEl, \"zoomScaleSheetLayoutView\");\n if (zssl !== undefined) sv.zoomScaleSheetLayoutView = zssl;\n const zspl = attrNum(svEl, \"zoomScalePageLayoutView\");\n if (zspl !== undefined) sv.zoomScalePageLayoutView = zspl;\n result.sheetView = sv;\n\n // Freeze/split pane — CT_Pane (any state; frozen is the authoring default)\n const paneEl = findChild(svEl, \"pane\");\n if (paneEl) {\n const fp: FreezePaneOptions = {};\n const ys = attrNum(paneEl, \"ySplit\");\n if (ys && ys > 0) fp.row = ys;\n const xs = attrNum(paneEl, \"xSplit\");\n if (xs && xs > 0) fp.col = xs;\n if (attr(paneEl, \"state\") === \"split\") fp.split = true;\n const paneTopLeft = attr(paneEl, \"topLeftCell\");\n if (paneTopLeft) fp.topLeftCell = paneTopLeft;\n const activePane = attr(paneEl, \"activePane\");\n if (activePane) fp.activePane = activePane as FreezePaneOptions[\"activePane\"];\n if (Object.keys(fp).length > 0) result.freezePanes = fp;\n }\n\n // Selections (CT_Selection — one per pane)\n const selections: SelectionOptions[] = [];\n for (const selEl of svEl.elements ?? []) {\n if (selEl.name !== \"selection\") continue;\n const sel: SelectionOptions = {};\n const pane = attr(selEl, \"pane\");\n if (pane) sel.pane = pane as SelectionOptions[\"pane\"];\n const activeCell = attr(selEl, \"activeCell\");\n if (activeCell) sel.activeCell = activeCell;\n const acId = attrNum(selEl, \"activeCellId\");\n if (acId !== undefined) sel.activeCellId = acId;\n const sqref = attr(selEl, \"sqref\");\n if (sqref) sel.sqref = sqref;\n selections.push(sel);\n }\n if (selections.length > 0) result.selection = selections;\n\n // Pivot selection (CT_PivotSelection)\n const psEl = findChild(svEl, \"pivotSelection\");\n if (psEl) {\n const ps: Partial<PivotSelectionOptions> = {};\n const pane = attr(psEl, \"pane\");\n if (pane) ps.pane = pane as PivotSelectionOptions[\"pane\"];\n if (parseOnOff(attr(psEl, \"showHeader\"))) ps.showHeader = true;\n if (parseOnOff(attr(psEl, \"label\"))) ps.label = true;\n if (parseOnOff(attr(psEl, \"data\"))) ps.data = true;\n if (parseOnOff(attr(psEl, \"extendable\"))) ps.extendable = true;\n const count = attrNum(psEl, \"count\");\n if (count !== undefined) ps.count = count;\n const axis = attr(psEl, \"axis\");\n if (axis) ps.axis = axis as PivotSelectionOptions[\"axis\"];\n for (const key of [\n \"dimension\",\n \"start\",\n \"min\",\n \"max\",\n \"activeRow\",\n \"activeCol\",\n \"previousRow\",\n \"previousCol\",\n \"click\",\n ] as const) {\n const v = attrNum(psEl, key);\n if (v !== undefined) ps[key] = v;\n }\n const rId = attr(psEl, \"r:id\");\n if (rId) ps.rId = rId;\n const paEl = findChild(psEl, \"pivotArea\");\n if (paEl) ps.pivotArea = parsePivotArea(paEl) as PivotSelectionOptions[\"pivotArea\"];\n result.pivotSelection = ps as PivotSelectionOptions;\n }\n }\n }\n\n // Sheet format properties\n const sfpEl = findChild(el, \"sheetFormatPr\");\n if (sfpEl) {\n const sfp: SheetFormatPropertiesOptions = {};\n const bcw = attrNum(sfpEl, \"baseColWidth\");\n if (bcw !== undefined) sfp.baseColWidth = bcw;\n const dcw = attrNum(sfpEl, \"defaultColWidth\");\n if (dcw !== undefined) sfp.defaultColWidth = dcw;\n const drh = attrNum(sfpEl, \"defaultRowHeight\");\n if (drh !== undefined) sfp.defaultRowHeight = drh;\n if (parseOnOff(attr(sfpEl, \"zeroHeight\"))) sfp.zeroHeight = true;\n if (parseOnOff(attr(sfpEl, \"thickTop\"))) sfp.thickTop = true;\n if (parseOnOff(attr(sfpEl, \"thickBottom\"))) sfp.thickBottom = true;\n const olr = attrNum(sfpEl, \"outlineLevelRow\");\n if (olr !== undefined) sfp.outlineLevelRow = olr;\n const olc = attrNum(sfpEl, \"outlineLevelCol\");\n if (olc !== undefined) sfp.outlineLevelCol = olc;\n result.sheetFormatPr = sfp;\n }\n\n // Dimension\n const dimensionEl = findChild(el, \"dimension\");\n if (dimensionEl) {\n const ref = attr(dimensionEl, \"ref\");\n if (ref) result.dimension = ref;\n }\n\n // Page margins\n const pageMarginsEl = findChild(el, \"pageMargins\");\n if (pageMarginsEl) {\n const pm: PageMarginsOptions = {};\n const pmL = attrNum(pageMarginsEl, \"left\");\n if (pmL !== undefined) pm.left = pmL;\n const pmR = attrNum(pageMarginsEl, \"right\");\n if (pmR !== undefined) pm.right = pmR;\n const pmT = attrNum(pageMarginsEl, \"top\");\n if (pmT !== undefined) pm.top = pmT;\n const pmB = attrNum(pageMarginsEl, \"bottom\");\n if (pmB !== undefined) pm.bottom = pmB;\n const pmH = attrNum(pageMarginsEl, \"header\");\n if (pmH !== undefined) pm.header = pmH;\n const pmF = attrNum(pageMarginsEl, \"footer\");\n if (pmF !== undefined) pm.footer = pmF;\n result.pageMargins = pm;\n }\n\n // Columns\n const colsEl = findChild(el, \"cols\");\n if (colsEl) {\n const columns: ColumnOptions[] = [];\n for (const colEl of colsEl.elements ?? []) {\n if (colEl.name !== \"col\") continue;\n const col: ColumnOptions = {\n min: attrNum(colEl, \"min\") ?? 0,\n max: attrNum(colEl, \"max\") ?? 0,\n };\n const w = attrNum(colEl, \"width\");\n if (w !== undefined) col.width = w;\n if (parseOnOff(attr(colEl, \"hidden\"))) col.hidden = true;\n if (parseOnOff(attr(colEl, \"customWidth\"))) col.customWidth = true;\n const ol = attrNum(colEl, \"outlineLevel\");\n if (ol !== undefined) col.outlineLevel = ol;\n if (parseOnOff(attr(colEl, \"collapsed\"))) col.collapsed = true;\n if (parseOnOff(attr(colEl, \"bestFit\"))) col.bestFit = true;\n if (parseOnOff(attr(colEl, \"phonetic\"))) col.phonetic = true;\n columns.push(col);\n }\n if (columns.length > 0) result.columns = columns;\n }\n\n // Sheet protection\n const protEl = findChild(el, \"sheetProtection\");\n if (protEl?.attributes) {\n result.protection = parseSheetProtectionEl(protEl);\n }\n\n // Protected ranges\n const prEl = findChild(el, \"protectedRanges\");\n if (prEl) {\n const ranges: ProtectedRangeOptions[] = [];\n for (const rEl of prEl.elements ?? []) {\n if (rEl.name !== \"protectedRange\") continue;\n const r: ProtectedRangeOptions = {\n sqref: attr(rEl, \"sqref\") ?? \"\",\n name: attr(rEl, \"name\") ?? \"\",\n };\n // @password (legacy hash) not read back — see parseSheetProtectionEl note.\n if (attr(rEl, \"algorithmName\")) r.algorithmName = attr(rEl, \"algorithmName\");\n if (attr(rEl, \"hashValue\")) r.hashValue = attr(rEl, \"hashValue\");\n if (attr(rEl, \"saltValue\")) r.saltValue = attr(rEl, \"saltValue\");\n const spinCount = attrNum(rEl, \"spinCount\");\n if (spinCount !== undefined) r.spinCount = spinCount;\n const sdAttr = attr(rEl, \"securityDescriptor\");\n if (sdAttr !== undefined) r.securityDescriptor = sdAttr;\n const sdEl = findChild(rEl, \"securityDescriptor\");\n if (sdEl) r.securityDescriptor = textOf(sdEl) ?? undefined;\n ranges.push(r);\n }\n if (ranges.length > 0) result.protectedRanges = ranges;\n }\n\n // Auto filter (CT_AutoFilter is shared with table — logic in auto-filter.ts)\n const afEl = findChild(el, \"autoFilter\");\n if (afEl) {\n result.autoFilter = parseAutoFilter(afEl);\n }\n\n // Sheet-level sort state (after autoFilter per XSD sequence)\n const ssEl = findChild(el, \"sortState\");\n if (ssEl) {\n result.sortState = parseSortStateEl(ssEl);\n }\n\n // Merge cells\n const mcEl = findChild(el, \"mergeCells\");\n if (mcEl) {\n const merges: MergeCellOptions[] = [];\n for (const mEl of mcEl.elements ?? []) {\n if (mEl.name !== \"mergeCell\") continue;\n const ref = attr(mEl, \"ref\") ?? \"\";\n if (ref) merges.push({ ref });\n }\n if (merges.length > 0) result.mergeCells = merges;\n }\n\n // Conditional formatting\n const cfEls = el.elements?.filter((e) => e.name === \"conditionalFormatting\") ?? [];\n if (cfEls.length > 0) {\n const cfs: ConditionalFormatOptions[] = [];\n for (const cfEl of cfEls) {\n const sqref = attr(cfEl, \"sqref\") ?? \"\";\n const pivot = parseOnOff(attr(cfEl, \"pivot\")) ?? false;\n const rules: ConditionalFormatRule[] = [];\n for (const ruleEl of cfEl.elements ?? []) {\n if (ruleEl.name !== \"cfRule\") continue;\n const rule: ConditionalFormatRule = {\n type: attr(ruleEl, \"type\") as ConditionalFormatType,\n priority: attrNum(ruleEl, \"priority\") ?? 1,\n };\n const opVal = attr(ruleEl, \"operator\");\n if (opVal) rule.operator = opVal as ConditionalFormatOperator;\n const dxfId = attrNum(ruleEl, \"dxfId\");\n if (dxfId !== undefined) rule.dxfId = dxfId;\n if (parseOnOff(attr(ruleEl, \"stopIfTrue\"))) rule.stopIfTrue = true;\n const tpVal = attr(ruleEl, \"timePeriod\");\n if (tpVal) rule.timePeriod = tpVal as ConditionalFormatRule[\"timePeriod\"];\n const rank = attrNum(ruleEl, \"rank\");\n if (rank !== undefined) rule.rank = rank;\n if (parseOnOff(attr(ruleEl, \"bottom\"))) rule.bottom = true;\n if (parseOnOff(attr(ruleEl, \"percent\"))) rule.percent = true;\n const textVal = attr(ruleEl, \"text\");\n if (textVal) rule.text = textVal;\n if (parseOnOff(attr(ruleEl, \"equalAverage\"))) rule.equalAverage = true;\n if (String(attr(ruleEl, \"aboveAverage\")) === \"0\") rule.aboveAverage = false;\n const stdDev = attrNum(ruleEl, \"stdDev\");\n if (stdDev !== undefined) rule.stdDev = stdDev;\n\n // Color scale\n const csEl = findChild(ruleEl, \"colorScale\");\n if (csEl) {\n const cfvo: CfvoOptions[] = [];\n const colors: CfColorOptions[] = [];\n for (const child of csEl.elements ?? []) {\n if (child.name === \"cfvo\") cfvo.push(parseCfvo(child));\n if (child.name === \"color\") {\n const c = parseCfColor(child);\n if (c) colors.push(c);\n }\n }\n rule.colorScale = { cfvo, colors };\n }\n\n // Data bar\n const dbEl = findChild(ruleEl, \"dataBar\");\n if (dbEl) {\n const cfvo: CfvoOptions[] = [];\n let color: CfColorOptions | undefined;\n for (const child of dbEl.elements ?? []) {\n if (child.name === \"cfvo\") cfvo.push(parseCfvo(child));\n if (child.name === \"color\") color = parseCfColor(child) ?? { indexed: 0 };\n }\n rule.dataBar = {\n cfvo: cfvo as [CfvoOptions, CfvoOptions],\n color: color ?? { indexed: 0 },\n };\n }\n\n // Icon set\n const isEl = findChild(ruleEl, \"iconSet\");\n if (isEl) {\n const cfvo: CfvoOptions[] = [];\n for (const child of isEl.elements ?? []) {\n if (child.name === \"cfvo\") cfvo.push(parseCfvo(child));\n }\n const iconSet: IconSetOptions = { cfvo };\n const isVal = attr(isEl, \"iconSet\");\n if (isVal) iconSet.iconSet = isVal as IconSetType;\n if (String(attr(isEl, \"showValue\")) === \"0\") iconSet.showValue = false;\n if (String(attr(isEl, \"percent\")) === \"0\") iconSet.percent = false;\n if (parseOnOff(attr(isEl, \"reverse\"))) iconSet.reverse = true;\n rule.iconSet = iconSet;\n }\n\n // Formulas\n const formulas: string[] = [];\n for (const child of ruleEl.elements ?? []) {\n if (child.name === \"formula\") formulas.push(textOf(child) ?? \"\");\n }\n if (formulas.length > 0) rule.formulas = formulas;\n\n rules.push(rule);\n }\n cfs.push(pivot ? { sqref, pivot, rules } : { sqref, rules });\n }\n result.conditionalFormats = cfs;\n }\n\n // Data validations\n const dvEl = findChild(el, \"dataValidations\");\n if (dvEl) {\n const dvs: DataValidationOptions[] = [];\n for (const dEl of dvEl.elements ?? []) {\n if (dEl.name !== \"dataValidation\") continue;\n const dv: DataValidationOptions = { sqref: attr(dEl, \"sqref\") ?? \"\" };\n const typeVal = attr(dEl, \"type\");\n if (typeVal) dv.type = typeVal as DataValidationType;\n const opVal = attr(dEl, \"operator\");\n if (opVal) dv.operator = opVal as DataValidationOperator;\n if (parseOnOff(attr(dEl, \"allowBlank\"))) dv.allowBlank = true;\n if (parseOnOff(attr(dEl, \"showErrorMessage\"))) dv.showErrorMessage = true;\n if (parseOnOff(attr(dEl, \"showInputMessage\"))) dv.showInputMessage = true;\n if (attr(dEl, \"errorTitle\")) dv.errorTitle = attr(dEl, \"errorTitle\");\n if (attr(dEl, \"error\")) dv.error = attr(dEl, \"error\");\n if (attr(dEl, \"promptTitle\")) dv.promptTitle = attr(dEl, \"promptTitle\");\n if (attr(dEl, \"prompt\")) dv.prompt = attr(dEl, \"prompt\");\n const esVal = attr(dEl, \"errorStyle\");\n if (esVal) dv.errorStyle = esVal as DataValidationOptions[\"errorStyle\"];\n const imVal = attr(dEl, \"imeMode\");\n if (imVal) dv.imeMode = imVal as DataValidationOptions[\"imeMode\"];\n if (parseOnOff(attr(dEl, \"showDropDown\"))) dv.showDropDown = true;\n\n const f1El = findChild(dEl, \"formula1\");\n if (f1El) dv.formula1 = textOf(f1El);\n const f2El = findChild(dEl, \"formula2\");\n if (f2El) dv.formula2 = textOf(f2El);\n\n dvs.push(dv);\n }\n result.dataValidations = dvs;\n }\n\n // Hyperlinks\n const hlEl = findChild(el, \"hyperlinks\");\n if (hlEl) {\n const hyperlinks: HyperlinkOptions[] = [];\n for (const hEl of hlEl.elements ?? []) {\n if (hEl.name !== \"hyperlink\") continue;\n const rId = hEl.attributes?.[\"r:id\"] as string | undefined;\n const hl: HyperlinkOptions = { cell: attr(hEl, \"ref\") ?? \"\" };\n // r:id starts as the raw relationship id; the parse pipeline resolves\n // it to the real target URL afterwards.\n if (rId) hl.url = rId;\n const location = attr(hEl, \"location\");\n if (location) hl.location = location;\n if (attr(hEl, \"tooltip\")) hl.tooltip = attr(hEl, \"tooltip\");\n if (attr(hEl, \"display\")) hl.display = attr(hEl, \"display\");\n hyperlinks.push(hl);\n }\n result.hyperlinks = hyperlinks;\n }\n\n // Print options\n const poEl = findChild(el, \"printOptions\");\n if (poEl) {\n const po: PrintOptions = {};\n if (parseOnOff(attr(poEl, \"horizontalCentered\"))) po.horizontalCentered = true;\n if (parseOnOff(attr(poEl, \"verticalCentered\"))) po.verticalCentered = true;\n if (parseOnOff(attr(poEl, \"headings\"))) po.headings = true;\n if (parseOnOff(attr(poEl, \"gridLines\"))) po.gridLines = true;\n if (String(attr(poEl, \"gridLinesSet\")) === \"0\") po.gridLinesSet = false;\n result.printOptions = po;\n }\n\n // Page setup\n const psEl = findChild(el, \"pageSetup\");\n if (psEl) {\n result.pageSetup = parsePageSetupEl(psEl, pageSetUpPrCache);\n } else if (pageSetUpPrCache) {\n result.pageSetup = pageSetUpPrCache;\n }\n\n // Header/footer\n const hfEl = findChild(el, \"headerFooter\");\n if (hfEl) {\n result.headerFooter = parseHeaderFooterEl(hfEl);\n }\n\n // Ignored errors\n const ieEl = findChild(el, \"ignoredErrors\");\n if (ieEl) {\n const errors: IgnoredErrorOptions[] = [];\n for (const eEl of ieEl.elements ?? []) {\n if (eEl.name !== \"ignoredError\") continue;\n const ie: IgnoredErrorOptions = { sqref: attr(eEl, \"sqref\") ?? \"\" };\n if (parseOnOff(attr(eEl, \"evalError\"))) ie.evalError = true;\n if (parseOnOff(attr(eEl, \"twoDigitTextYear\"))) ie.twoDigitTextYear = true;\n if (parseOnOff(attr(eEl, \"numberStoredAsText\"))) ie.numberStoredAsText = true;\n if (parseOnOff(attr(eEl, \"formula\"))) ie.formula = true;\n if (parseOnOff(attr(eEl, \"formulaRange\"))) ie.formulaRange = true;\n if (parseOnOff(attr(eEl, \"unlockedFormula\"))) ie.unlockedFormula = true;\n if (parseOnOff(attr(eEl, \"emptyCellReference\"))) ie.emptyCellReference = true;\n if (parseOnOff(attr(eEl, \"listDataValidation\"))) ie.listDataValidation = true;\n if (parseOnOff(attr(eEl, \"calculatedColumn\"))) ie.calculatedColumn = true;\n errors.push(ie);\n }\n result.ignoredErrors = errors;\n }\n\n // Cell smart tags (CT_SmartTags)\n const smartTagsEl = findChild(el, \"smartTags\");\n if (smartTagsEl) {\n const entries: CellSmartTagsOptions[] = [];\n for (const cstEl of smartTagsEl.elements ?? []) {\n if (cstEl.name !== \"cellSmartTags\") continue;\n const cst: CellSmartTagsOptions = {\n reference: attr(cstEl, \"r\") ?? \"\",\n smartTags: [],\n };\n for (const stEl of cstEl.elements ?? []) {\n if (stEl.name !== \"cellSmartTag\") continue;\n const st: {\n type: number;\n deleted?: boolean;\n xmlBased?: boolean;\n properties?: { key: string; val: string }[];\n } = {\n type: attrNum(stEl, \"type\") ?? 0,\n };\n if (parseOnOff(attr(stEl, \"deleted\"))) st.deleted = true;\n if (parseOnOff(attr(stEl, \"xmlBased\"))) st.xmlBased = true;\n const prEls = stEl.elements?.filter((e) => e.name === \"cellSmartTagPr\") ?? [];\n if (prEls.length > 0) {\n st.properties = prEls.map((prEl) => ({\n key: attr(prEl, \"key\") ?? \"\",\n val: attr(prEl, \"val\") ?? \"\",\n }));\n }\n cst.smartTags.push(st);\n }\n entries.push(cst);\n }\n if (entries.length > 0) result.smartTags = entries;\n }\n\n // Phonetic properties\n const ppEl = findChild(el, \"phoneticPr\");\n if (ppEl) {\n const pp: PhoneticPropertiesOptions = { fontId: attrNum(ppEl, \"fontId\") ?? 0 };\n const ppType = attr(ppEl, \"type\");\n if (ppType) pp.type = ppType as PhoneticPropertiesOptions[\"type\"];\n const ppAlign = attr(ppEl, \"alignment\");\n if (ppAlign) pp.alignment = ppAlign as PhoneticPropertiesOptions[\"alignment\"];\n result.phoneticPr = pp;\n }\n\n // Sheet calc properties\n const scEl = findChild(el, \"sheetCalcPr\");\n if (scEl) {\n const sc: SheetCalculationPropertiesOptions = {};\n if (parseOnOff(attr(scEl, \"fullCalcOnLoad\"))) sc.fullCalcOnLoad = true;\n result.sheetCalcPr = sc;\n }\n\n // Sheet data (rows and cells) — parsed by the dedicated sheetData scanner.\n // The archive read path defers sheetData (Element.raw, children never\n // materialized); a hand-built or non-deferred tree normalizes through\n // stringify first, so there is exactly one row parsing implementation.\n const sheetDataEl = findChild(el, \"sheetData\");\n if (sheetDataEl) {\n const rows = parseSheetDataRows(sheetDataEl.raw ?? stringify(sheetDataEl), strings);\n if (rows.length > 0) result.rows = rows;\n }\n\n // Row breaks (CT_PageBreak — after sheetData per XSD sequence)\n const rowBreaksEl = findChild(el, \"rowBreaks\");\n if (rowBreaksEl) {\n const breaks = parsePageBreaks(rowBreaksEl);\n if (breaks.length > 0) result.rowBreaks = breaks;\n }\n\n // Column breaks (CT_PageBreak)\n const colBreaksEl = findChild(el, \"colBreaks\");\n if (colBreaksEl) {\n const breaks = parsePageBreaks(colBreaksEl);\n if (breaks.length > 0) result.colBreaks = breaks;\n }\n\n // Custom properties (CT_CustomProperties — customPr name + r:id)\n const customPropsEl = findChild(el, \"customProperties\");\n if (customPropsEl) {\n const props: CustomSheetPropertyOptions[] = [];\n for (const cpEl of customPropsEl.elements ?? []) {\n if (cpEl.name !== \"customPr\") continue;\n const name = attr(cpEl, \"name\");\n const rId = cpEl.attributes?.[\"r:id\"] as string | undefined;\n if (name !== undefined && rId !== undefined) props.push({ name, rId });\n }\n if (props.length > 0) result.customProperties = props;\n }\n\n // Cell watches (CT_CellWatches — cellWatch @r)\n const cellWatchesEl = findChild(el, \"cellWatches\");\n if (cellWatchesEl) {\n const watches: CellWatchOptions[] = [];\n for (const cwEl of cellWatchesEl.elements ?? []) {\n if (cwEl.name !== \"cellWatch\") continue;\n const r = attr(cwEl, \"r\");\n if (r) watches.push({ reference: r });\n }\n if (watches.length > 0) result.cellWatches = watches;\n }\n\n // Legacy drawing header/footer (CT_LegacyDrawing @r:id)\n const legacyHFEl = findChild(el, \"legacyDrawingHF\");\n if (legacyHFEl) {\n const rId = legacyHFEl.attributes?.[\"r:id\"] as string | undefined;\n if (rId) result.legacyDrawingHF = rId;\n }\n\n // Round-trip drawing/legacyDrawing references: the referenced part may\n // pass through verbatim (anchors the bridge does not map onto options),\n // so keep the original reference id to re-emit the element.\n const drawingRefEl = findChild(el, \"drawing\");\n if (drawingRefEl) {\n const rId = drawingRefEl.attributes?.[\"r:id\"] as string | undefined;\n if (rId) result.drawingRid = rId;\n }\n const legacyRefEl = findChild(el, \"legacyDrawing\");\n if (legacyRefEl) {\n const rId = legacyRefEl.attributes?.[\"r:id\"] as string | undefined;\n if (rId) result.legacyDrawingRid = rId;\n }\n\n // Data consolidation (CT_DataConsolidate — function/labels/link + dataRefs)\n const dcEl = findChild(el, \"dataConsolidate\");\n if (dcEl) {\n const dc: DataConsolidateOptions = {};\n const fn = attr(dcEl, \"function\");\n if (fn) dc.function = xsdConsolidateFunction.from(fn) as DataConsolidateOptions[\"function\"];\n if (parseOnOff(attr(dcEl, \"topLabels\"))) dc.topLabels = true;\n if (parseOnOff(attr(dcEl, \"leftLabels\"))) dc.leftLabels = true;\n if (parseOnOff(attr(dcEl, \"startLabels\"))) dc.startLabels = true;\n if (parseOnOff(attr(dcEl, \"link\"))) dc.link = true;\n const refsEl = findChild(dcEl, \"dataRefs\");\n if (refsEl) {\n const refs: string[] = [];\n for (const refEl of refsEl.elements ?? []) {\n if (refEl.name !== \"dataRef\") continue;\n const r = attr(refEl, \"ref\");\n if (r) refs.push(r);\n }\n if (refs.length > 0) dc.refs = refs;\n }\n if (Object.keys(dc).length > 0) result.dataConsolidate = dc;\n }\n\n // What-if scenarios (CT_Scenarios — current/show + scenario/inputCells)\n const scenariosEl = findChild(el, \"scenarios\");\n if (scenariosEl) {\n const scenarios: ScenarioDefinition[] = [];\n for (const scEl of scenariosEl.elements ?? []) {\n if (scEl.name !== \"scenario\") continue;\n const name = attr(scEl, \"name\");\n if (name === undefined) continue;\n const scenario: ScenarioDefinition = { name, inputCells: [] };\n const count = attrNum(scEl, \"count\");\n if (count !== undefined) scenario.count = count;\n const user = attr(scEl, \"user\");\n if (user !== undefined) scenario.user = user;\n const comment = attr(scEl, \"comment\");\n if (comment !== undefined) scenario.comment = comment;\n if (parseOnOff(attr(scEl, \"hidden\"))) scenario.hidden = true;\n if (parseOnOff(attr(scEl, \"locked\"))) scenario.locked = true;\n for (const icEl of scEl.elements ?? []) {\n if (icEl.name !== \"inputCells\") continue;\n const r = attr(icEl, \"r\");\n const valRaw = attr(icEl, \"val\");\n if (r === undefined || valRaw === undefined) continue;\n const num = Number(valRaw);\n const cell: ScenarioCellOptions = {\n reference: r,\n val: String(num) === valRaw ? num : valRaw,\n };\n if (parseOnOff(attr(icEl, \"deleted\"))) cell.deleted = true;\n if (parseOnOff(attr(icEl, \"undone\"))) cell.undone = true;\n scenario.inputCells.push(cell);\n }\n scenarios.push(scenario);\n }\n if (scenarios.length > 0) {\n const so: ScenarioOptions = { scenarios };\n const current = attrNum(scenariosEl, \"current\");\n if (current !== undefined) so.current = current;\n const show = attrNum(scenariosEl, \"show\");\n if (show !== undefined) so.show = show;\n result.scenarios = so;\n }\n }\n\n // Custom sheet views (CT_CustomSheetViews — attribute bag per saved view)\n const csvListEl = findChild(el, \"customSheetViews\");\n if (csvListEl) {\n const views: CustomSheetViewOptions[] = [];\n for (const vEl of csvListEl.elements ?? []) {\n if (vEl.name !== \"customSheetView\") continue;\n const guid = attr(vEl, \"guid\");\n if (guid === undefined) continue;\n const view: CustomSheetViewOptions = { guid };\n const scale = attrNum(vEl, \"scale\");\n if (scale !== undefined) view.scale = scale;\n if (parseOnOff(attr(vEl, \"showPageBreaks\"))) view.showPageBreaks = true;\n if (parseOnOff(attr(vEl, \"showFormulas\"))) view.showFormulas = true;\n if (String(attr(vEl, \"showGridLines\")) === \"0\") view.showGridLines = false;\n if (String(attr(vEl, \"showRowCol\")) === \"0\") view.showRowColHeaders = false;\n if (String(attr(vEl, \"outlineSymbols\")) === \"0\") view.outlineSymbols = false;\n if (String(attr(vEl, \"zeroValues\")) === \"0\") view.zeroValues = false;\n if (parseOnOff(attr(vEl, \"fitToPage\"))) view.fitToPage = true;\n if (parseOnOff(attr(vEl, \"printArea\"))) view.printArea = true;\n if (parseOnOff(attr(vEl, \"filter\"))) view.filter = true;\n if (parseOnOff(attr(vEl, \"showAutoFilter\"))) view.showAutoFilter = true;\n if (parseOnOff(attr(vEl, \"hiddenRows\"))) view.hiddenRows = true;\n if (parseOnOff(attr(vEl, \"hiddenColumns\"))) view.hiddenColumns = true;\n const state = attr(vEl, \"state\");\n if (state !== undefined) view.state = state as CustomSheetViewOptions[\"state\"];\n if (parseOnOff(attr(vEl, \"filterUnique\"))) view.filterUnique = true;\n const viewType = attr(vEl, \"view\");\n if (viewType !== undefined) view.view = viewType as CustomSheetViewOptions[\"view\"];\n views.push(view);\n }\n if (views.length > 0) result.customSheetViews = views;\n }\n\n /**\n * Unwrap mc:AlternateContent around an oleObject/control: the mc:Choice leg\n * carries the full element, mc:Fallback the bare one. Returns the element\n * found in either the Choice or directly (unwrapped legacy form), plus\n * whether a wrapper was present.\n */\n function unwrapAlternateContent(\n el: Element,\n innerTag: string,\n ): { element: Element | undefined; wrapped: boolean } {\n if (el.name !== \"mc:AlternateContent\") {\n return { element: el.name === innerTag ? el : undefined, wrapped: false };\n }\n const choice = (el.elements ?? []).find((c) => c.name === \"mc:Choice\");\n const inner = (choice?.elements ?? []).find((c) => c.name === innerTag);\n return { element: inner, wrapped: inner !== undefined };\n }\n\n /** Read the anchor element inside objectPr/controlPr (from/to CT_Marker corners). */\n function readEmbeddedAnchor(anchorEl: Element): ObjectAnchorOptions | undefined {\n const fromEl = findChild(anchorEl, \"from\");\n const toEl = findChild(anchorEl, \"to\");\n if (!fromEl || !toEl) return undefined;\n // col/colOff/row/rowOff are xdr-prefixed child elements (CT_Marker), not attrs.\n const markerNum = (m: Element, tag: string): number | undefined => {\n const child = findChild(m, tag);\n const n = child === undefined ? undefined : Number(textOf(child));\n return n === undefined || Number.isNaN(n) ? undefined : n;\n };\n const marker = (m: Element): AnchorMarkerOptions | undefined => {\n const col = markerNum(m, \"xdr:col\");\n const row = markerNum(m, \"xdr:row\");\n if (col === undefined || row === undefined) return undefined;\n return {\n col,\n row,\n ...(markerNum(m, \"xdr:colOff\") !== undefined\n ? { colOff: markerNum(m, \"xdr:colOff\")! }\n : {}),\n ...(markerNum(m, \"xdr:rowOff\") !== undefined\n ? { rowOff: markerNum(m, \"xdr:rowOff\")! }\n : {}),\n };\n };\n const from = marker(fromEl);\n const to = marker(toEl);\n if (!from || !to) return undefined;\n return {\n from,\n to,\n ...(parseOnOff(attr(anchorEl, \"moveWithCells\")) ? { moveWithCells: true } : {}),\n ...(parseOnOff(attr(anchorEl, \"sizeWithCells\")) ? { sizeWithCells: true } : {}),\n };\n }\n\n // OLE objects (CT_OleObjects — oleObject attrs + optional objectPr child)\n const oleObjsEl = findChild(el, \"oleObjects\");\n if (oleObjsEl) {\n const oleObjects: OleObjectOptions[] = [];\n for (const rawEl of oleObjsEl.elements ?? []) {\n // Excel 2010+ wraps each oleObject in mc:AlternateContent: the Choice\n // carries the full element (objectPr + anchor), the Fallback the bare\n // one. Parse the Choice leg and remember the wrapper for re-emission.\n const unwrapped = unwrapAlternateContent(rawEl, \"oleObject\");\n const ooEl = unwrapped.element;\n if (!ooEl) continue;\n const shapeId = attrNum(ooEl, \"shapeId\");\n if (shapeId === undefined) continue;\n const oo: OleObjectOptions = { shapeId };\n if (unwrapped.wrapped) oo.alternateContent = true;\n const progId = attr(ooEl, \"progId\");\n if (progId !== undefined) oo.progId = progId;\n const dvAspect = attr(ooEl, \"dvAspect\");\n if (dvAspect !== undefined) oo.dvAspect = dvAspect as OleObjectOptions[\"dvAspect\"];\n const link = attr(ooEl, \"link\");\n if (link !== undefined) oo.link = link;\n const oleUpdate = attr(ooEl, \"oleUpdate\");\n if (oleUpdate !== undefined) oo.oleUpdate = oleUpdate as OleObjectOptions[\"oleUpdate\"];\n if (parseOnOff(attr(ooEl, \"autoLoad\"))) oo.autoLoad = true;\n const ooRid = attr(ooEl, \"r:id\");\n if (ooRid !== undefined) oo.rId = ooRid;\n const oprEl = findChild(ooEl, \"objectPr\");\n if (oprEl) {\n const opr: OleObjectPropertiesOptions = {};\n if (String(attr(oprEl, \"locked\")) === \"0\") opr.locked = false;\n if (String(attr(oprEl, \"defaultSize\")) === \"0\") opr.defaultSize = false;\n if (String(attr(oprEl, \"print\")) === \"0\") opr.print = false;\n if (parseOnOff(attr(oprEl, \"disabled\"))) opr.disabled = true;\n if (parseOnOff(attr(oprEl, \"uiObject\"))) opr.uiObject = true;\n if (String(attr(oprEl, \"autoFill\")) === \"0\") opr.autoFill = false;\n if (String(attr(oprEl, \"autoLine\")) === \"0\") opr.autoLine = false;\n if (String(attr(oprEl, \"autoPict\")) === \"0\") opr.autoPict = false;\n const macro = attr(oprEl, \"macro\");\n if (macro !== undefined) opr.macro = macro;\n const altText = attr(oprEl, \"altText\");\n if (altText !== undefined) opr.altText = altText;\n if (parseOnOff(attr(oprEl, \"dde\"))) opr.dde = true;\n const oprRid = attr(oprEl, \"r:id\");\n if (oprRid !== undefined) opr.iconRid = oprRid;\n const anchorEl = findChild(oprEl, \"anchor\");\n if (anchorEl) {\n const anchor = readEmbeddedAnchor(anchorEl);\n if (anchor) opr.anchor = anchor;\n }\n if (Object.keys(opr).length > 0) oo.objectPr = opr;\n }\n oleObjects.push(oo);\n }\n if (oleObjects.length > 0) result.oleObjects = oleObjects;\n }\n\n // Controls (CT_Controls — control attrs + optional controlPr child)\n const controlsEl = findChild(el, \"controls\");\n if (controlsEl) {\n const controls: ControlOptions[] = [];\n for (const rawEl of controlsEl.elements ?? []) {\n // Same mc:AlternateContent wrapper as oleObjects (Excel 2010+ form).\n const unwrapped = unwrapAlternateContent(rawEl, \"control\");\n const cEl = unwrapped.element;\n if (!cEl) continue;\n const shapeId = attrNum(cEl, \"shapeId\");\n const cRid = attr(cEl, \"r:id\");\n if (shapeId === undefined || cRid === undefined) continue;\n const c: ControlOptions = { shapeId, rId: cRid };\n if (unwrapped.wrapped) c.alternateContent = true;\n const name = attr(cEl, \"name\");\n if (name !== undefined) c.name = name;\n const prEl = findChild(cEl, \"controlPr\");\n if (prEl) {\n if (String(attr(prEl, \"locked\")) === \"0\") c.locked = false;\n if (parseOnOff(attr(prEl, \"uiObject\"))) c.uiObject = true;\n if (parseOnOff(attr(prEl, \"recalcAlways\"))) c.recalcAlways = true;\n const linkedCell = attr(prEl, \"linkedCell\");\n if (linkedCell !== undefined) c.linkedCell = linkedCell;\n const listFillRange = attr(prEl, \"listFillRange\");\n if (listFillRange !== undefined) c.listFillRange = listFillRange;\n const cf = attr(prEl, \"cf\");\n if (cf !== undefined) c.formula = cf;\n if (String(attr(prEl, \"defaultSize\")) === \"0\") c.defaultSize = false;\n if (String(attr(prEl, \"autoLine\")) === \"0\") c.autoLine = false;\n if (String(attr(prEl, \"autoPict\")) === \"0\") c.autoPict = false;\n const prRid = attr(prEl, \"r:id\");\n if (prRid !== undefined) c.iconRid = prRid;\n const anchorEl = findChild(prEl, \"anchor\");\n if (anchorEl) {\n const anchor = readEmbeddedAnchor(anchorEl);\n if (anchor) c.anchor = anchor;\n }\n }\n controls.push(c);\n }\n if (controls.length > 0) result.controls = controls;\n }\n\n // Web publish items (CT_WebPublishItems — attribute bag per item)\n const wpEl = findChild(el, \"webPublishItems\");\n if (wpEl) {\n const items: WebPublishItemOptions[] = [];\n for (const wpiEl of wpEl.elements ?? []) {\n if (wpiEl.name !== \"webPublishItem\") continue;\n const id = attrNum(wpiEl, \"id\");\n const divId = attr(wpiEl, \"divId\");\n const sourceType = attr(wpiEl, \"sourceType\");\n const destinationFile = attr(wpiEl, \"destinationFile\");\n if (\n id === undefined ||\n divId === undefined ||\n sourceType === undefined ||\n destinationFile === undefined\n )\n continue;\n const wpi: WebPublishItemOptions = {\n id,\n divId,\n sourceType: sourceType as WebPublishItemOptions[\"sourceType\"],\n destinationFile,\n };\n const sourceRef = attr(wpiEl, \"sourceRef\");\n if (sourceRef !== undefined) wpi.sourceRef = sourceRef;\n const sourceObject = attr(wpiEl, \"sourceObject\");\n if (sourceObject !== undefined) wpi.sourceObject = sourceObject;\n const title = attr(wpiEl, \"title\");\n if (title !== undefined) wpi.title = title;\n if (parseOnOff(attr(wpiEl, \"autoRepublish\"))) wpi.autoRepublish = true;\n items.push(wpi);\n }\n if (items.length > 0) result.webPublishItems = items;\n }\n\n // Drawing in header/footer (CT_DrawingHF — r:id + 18 header/footer offsets)\n const drawingHfEl = findChild(el, \"drawingHF\");\n if (drawingHfEl) {\n const rId = attr(drawingHfEl, \"r:id\");\n if (rId !== undefined) {\n const dhf: DrawingHfOptions = { rId };\n for (const key of DRAWING_HF_OFFSET_KEYS) {\n const v = attrNum(drawingHfEl, key);\n if (v !== undefined) dhf[key] = v;\n }\n result.drawingHF = dhf;\n }\n }\n\n // Extension list (CT_ExtensionList — verbatim inner XML, open-ended content)\n const extLstEl = findChild(el, \"extLst\");\n if (extLstEl) {\n const inner = stringify(extLstEl);\n if (inner) result.ext = inner;\n }\n\n return result as WorksheetOptions;\n },\n};\n\n// ── Shared page-setup parse helpers (worksheet / dialogsheet / chartsheet) ──\n\n/**\n * Parse a CT_PageSetup element. `pageSetUpPrCache` carries the sheetPr-level\n * CT_PageSetUpPr flags (fitToPage/autoPageBreaks) parsed earlier so they merge\n * into the same PageSetupOptions object.\n */\nexport function parsePageSetupEl(\n el: Element,\n pageSetUpPrCache?: Partial<PageSetupOptions>,\n): PageSetupOptions {\n const ps: PageSetupOptions = {};\n const pz = attrNum(el, \"paperSize\");\n if (pz !== undefined) ps.paperSize = pz;\n const ph = attrMeasure(el, \"paperHeight\");\n if (ph !== undefined) ps.paperHeight = ph as number | PositiveUniversalMeasure;\n const pw = attrMeasure(el, \"paperWidth\");\n if (pw !== undefined) ps.paperWidth = pw as number | PositiveUniversalMeasure;\n const orientVal = attr(el, \"orientation\");\n if (orientVal) ps.orientation = orientVal as PageOrientation;\n const sc = attrNum(el, \"scale\");\n if (sc !== undefined) ps.scale = sc;\n const ftw = attrNum(el, \"fitToWidth\");\n if (ftw !== undefined) ps.fitToWidth = ftw;\n const fth = attrNum(el, \"fitToHeight\");\n if (fth !== undefined) ps.fitToHeight = fth;\n const pageOrderVal = attr(el, \"pageOrder\");\n if (pageOrderVal) ps.pageOrder = pageOrderVal as PageSetupOptions[\"pageOrder\"];\n if (parseOnOff(attr(el, \"useFirstPageNumber\"))) ps.useFirstPageNumber = true;\n const fpn = attrNum(el, \"firstPageNumber\");\n if (fpn !== undefined) ps.firstPageNumber = fpn;\n // XSD default true — only the explicit \"0\" carries information back.\n if (String(attr(el, \"usePrinterDefaults\")) === \"0\") ps.usePrinterDefaults = false;\n if (parseOnOff(attr(el, \"blackAndWhite\"))) ps.blackAndWhite = true;\n if (parseOnOff(attr(el, \"draft\"))) ps.draft = true;\n const cc = attr(el, \"cellComments\");\n if (cc) ps.cellComments = cc as PageSetupOptions[\"cellComments\"];\n const err = attr(el, \"errors\");\n if (err) ps.errors = err as PageSetupOptions[\"errors\"];\n const hdpi = attrNum(el, \"horizontalDpi\");\n if (hdpi !== undefined) ps.horizontalDpi = hdpi;\n const vdpi = attrNum(el, \"verticalDpi\");\n if (vdpi !== undefined) ps.verticalDpi = vdpi;\n const copies = attrNum(el, \"copies\");\n if (copies !== undefined) ps.copies = copies;\n const psRid = attr(el, \"r:id\");\n if (psRid) ps.printerSettingsRId = psRid;\n if (pageSetUpPrCache) Object.assign(ps, pageSetUpPrCache);\n return ps;\n}\n\n/** Parse a CT_HeaderFooter element. */\nexport function parseHeaderFooterEl(el: Element): HeaderFooterOptions {\n const hf: HeaderFooterOptions = {};\n if (parseOnOff(attr(el, \"differentOddEven\"))) hf.differentOddEven = true;\n if (parseOnOff(attr(el, \"differentFirst\"))) hf.differentFirst = true;\n if (String(attr(el, \"scaleWithDoc\")) === \"0\") hf.scaleWithDoc = false;\n if (String(attr(el, \"alignWithMargins\")) === \"0\") hf.alignWithMargins = false;\n const oh = findChild(el, \"oddHeader\");\n if (oh) hf.oddHeader = textOf(oh);\n const of2 = findChild(el, \"oddFooter\");\n if (of2) hf.oddFooter = textOf(of2);\n const eh = findChild(el, \"evenHeader\");\n if (eh) hf.evenHeader = textOf(eh);\n const ef = findChild(el, \"evenFooter\");\n if (ef) hf.evenFooter = textOf(ef);\n const fh = findChild(el, \"firstHeader\");\n if (fh) hf.firstHeader = textOf(fh);\n const ff = findChild(el, \"firstFooter\");\n if (ff) hf.firstFooter = textOf(ff);\n return hf;\n}\n\n/** Parse a CT_SheetProtection element. */\nexport function parseSheetProtectionEl(el: Element): SheetProtectionOptions {\n const prot: SheetProtectionOptions = {};\n // NOTE: @password (legacy hash) is deliberately not read back — the\n // password field is plaintext authoring input and stringify hashes it,\n // so carrying the hash would double-hash on round-trip. The modern\n // algorithmName/hashValue/saltValue/spinCount quadruplet round-trips as-is.\n if (attr(el, \"algorithmName\")) prot.algorithmName = attr(el, \"algorithmName\");\n if (attr(el, \"hashValue\")) prot.hashValue = attr(el, \"hashValue\");\n if (attr(el, \"saltValue\")) prot.saltValue = attr(el, \"saltValue\");\n const spin = attrNum(el, \"spinCount\");\n if (spin !== undefined) prot.spinCount = spin;\n if (parseOnOff(attr(el, \"sheet\"))) prot.sheet = true;\n if (parseOnOff(attr(el, \"objects\"))) prot.objects = true;\n if (parseOnOff(attr(el, \"scenarios\"))) prot.scenarios = true;\n if (String(attr(el, \"formatCells\")) === \"0\") prot.formatCells = false;\n if (String(attr(el, \"formatColumns\")) === \"0\") prot.formatColumns = false;\n if (String(attr(el, \"formatRows\")) === \"0\") prot.formatRows = false;\n if (String(attr(el, \"insertColumns\")) === \"0\") prot.insertColumns = false;\n if (String(attr(el, \"insertRows\")) === \"0\") prot.insertRows = false;\n if (String(attr(el, \"insertHyperlinks\")) === \"0\") prot.insertHyperlinks = false;\n if (String(attr(el, \"deleteColumns\")) === \"0\") prot.deleteColumns = false;\n if (String(attr(el, \"deleteRows\")) === \"0\") prot.deleteRows = false;\n if (parseOnOff(attr(el, \"selectLockedCells\"))) prot.selectLockedCells = true;\n if (String(attr(el, \"sort\")) === \"0\") prot.sort = false;\n if (String(attr(el, \"autoFilter\")) === \"0\") prot.autoFilter = false;\n if (String(attr(el, \"pivotTables\")) === \"0\") prot.pivotTables = false;\n if (parseOnOff(attr(el, \"selectUnlockedCells\"))) prot.selectUnlockedCells = true;\n return prot;\n}\n","/**\n * Convert a 1-based column number to Excel column letter(s).\n * 1 → \"A\", 26 → \"Z\", 27 → \"AA\", 28 → \"AB\"\n *\n * Memoized: sheet building calls this per cell (millions of times over a few\n * dozen distinct columns) — the cache turns each hit into an array read.\n */\nconst COLUMN_LETTERS: string[] = [];\n\nexport function columnToLetter(col: number): string {\n const cached = COLUMN_LETTERS[col];\n if (cached !== undefined) return cached;\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n COLUMN_LETTERS[col] = result;\n return result;\n}\n\n/**\n * Convert Excel column letter(s) to a 1-based column number.\n * \"A\" → 1, \"Z\" → 26, \"AA\" → 27\n */\nexport function letterToColumn(letters: string): number {\n let col = 0;\n for (let i = 0; i < letters.length; i++) col = col * 26 + (letters.charCodeAt(i) - 64);\n return col;\n}\n\n/**\n * Convert a JavaScript Date to an Excel serial number.\n * Excel epoch: January 1, 1900 = 1 (with the 1900 leap year bug).\n */\nexport function dateToSerialNumber(date: Date): number {\n // Excel treats 1900 as a leap year (bug inherited from Lotus 1-2-3).\n // The epoch is effectively December 30, 1899 = 0, fixed in UTC so the\n // serial does not shift with the host timezone.\n const epochMs = Date.UTC(1899, 11, 30);\n return (date.getTime() - epochMs) / 86400000;\n}\n\n/**\n * Legacy 16-bit XOR password hash used by xlsx sheet/workbook protection\n * (the pre-Agile encryption hash). Shared by worksheet and workbook parts.\n */\nexport function hashPassword(password: string): string {\n let hash = 0;\n for (let i = 0; i < password.length; i++) {\n const c = password.charCodeAt(i);\n hash = ((hash >> 14) & 1) + ((hash << 1) & 0x7fff);\n hash ^= c;\n hash = hash & 0x4000 ? hash ^ 0x1 : hash;\n }\n hash = ((hash >> 14) & 1) + ((hash << 1) & 0x7fff);\n hash = ((hash >> 14) & 1) + ((hash << 1) & 0x7fff);\n hash ^= password.length;\n return hash.toString(16).toUpperCase().padStart(4, \"0\");\n}\n","/**\n * Pivot table utility types and helper functions.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { attr, attrNum, escapeXml } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\n\n/** Aggregation function for data fields (maps to ST_DataConsolidateFunction). */\nexport const ConsolidateFunction = {\n SUM: \"sum\",\n COUNT: \"count\",\n AVERAGE: \"average\",\n MAX: \"max\",\n MIN: \"min\",\n PRODUCT: \"product\",\n COUNT_NUMS: \"countNumbers\",\n STD_DEV: \"standardDeviation\",\n STD_DEV_P: \"standardDeviationPopulation\",\n VAR: \"variance\",\n VAR_P: \"variancePopulation\",\n} as const;\n\nexport type ConsolidateFunction = (typeof ConsolidateFunction)[keyof typeof ConsolidateFunction];\n\n/** A data field definition for pivot table aggregation. */\nexport interface PivotDataField {\n /** Source column name to aggregate */\n field: string;\n /** Aggregation function (default: \"sum\") */\n summarize?: ConsolidateFunction;\n /** Custom name for the data field (default: \"Sum of {field}\") */\n name?: string;\n /** Show data as (CT_DataField `@showDataAs`, ST_ShowDataAs) */\n showDataAs?:\n | \"normal\"\n | \"difference\"\n | \"percent\"\n | \"percentDiff\"\n | \"runTotal\"\n | \"percentOfRow\"\n | \"percentOfCol\"\n | \"percentOfTotal\"\n | \"index\";\n /** Base field index for \"show data as\" calculations */\n baseField?: number;\n /** Base item index for \"show data as\" calculations */\n baseItem?: number;\n /** Sort by tuple items (CT_Tuples in sortByTuple) */\n sortByTupleItems?: number[];\n}\n\n/** Per-field overrides for pivotField XML attributes (CT_PivotField). */\nexport interface PivotFieldOverrideOptions {\n /** Field name to match (required) */\n field: string;\n /** All drilled (CT_PivotField `@allDrilled`) */\n allDrilled?: boolean;\n /** Auto show (CT_PivotField `@autoShow`) */\n autoShow?: boolean;\n /** Count subtotal (CT_PivotField `@countSubtotal`) */\n countSubtotal?: boolean;\n /** Average subtotal (CT_PivotField `@avgSubtotal`) */\n avgSubtotal?: boolean;\n /** CountA subtotal (CT_PivotField `@countASubtotal`) */\n countASubtotal?: boolean;\n /** Max subtotal (CT_PivotField `@maxSubtotal`) */\n maxSubtotal?: boolean;\n /** Min subtotal (CT_PivotField `@minSubtotal`) */\n minSubtotal?: boolean;\n /** Sum subtotal (CT_PivotField `@sumSubtotal`) */\n sumSubtotal?: boolean;\n /** Data source sort (CT_PivotField `@dataSourceSort`) */\n dataSourceSort?: boolean;\n /** Default attribute drill state (CT_PivotField `@defaultAttributeDrillState`) */\n defaultAttributeDrillState?: boolean;\n /** Hidden level (CT_PivotField `@hiddenLevel`) */\n hiddenLevel?: boolean;\n /** Hide new items (CT_PivotField `@hideNewItems`) */\n hideNewItems?: boolean;\n /** Insert blank row (CT_PivotField `@insertBlankRow`) */\n insertBlankRow?: boolean;\n /** Insert page break (CT_PivotField `@insertPageBreak`) */\n insertPageBreak?: boolean;\n /** Item page count (CT_PivotField `@itemPageCount`) */\n itemPageCount?: boolean;\n /** Measure filter (CT_PivotField `@measureFilter`) */\n measureFilter?: boolean;\n /** Non auto sort default (CT_PivotField `@nonAutoSortDefault`) */\n nonAutoSortDefault?: boolean;\n /** Product subtotal (CT_PivotField `@productSubtotal`) */\n productSubtotal?: boolean;\n /** Rank by (CT_PivotField `@rankBy`) */\n rankBy?: number;\n /** Server field (CT_PivotField `@serverField`) */\n serverField?: boolean;\n /** Show drop downs (CT_PivotField `@showDropDowns`) */\n showDropDowns?: boolean;\n /** Show property as caption (CT_PivotField `@showPropAsCaption`) */\n showPropAsCaption?: boolean;\n /** Show property cell (CT_PivotField `@showPropCell`) */\n showPropCell?: boolean;\n /** Show property tip (CT_PivotField `@showPropTip`) */\n showPropTip?: boolean;\n /** StdDevP subtotal (CT_PivotField `@stdDevPSubtotal`) */\n stdDevPSubtotal?: boolean;\n /** StdDev subtotal (CT_PivotField `@stdDevSubtotal`) */\n stdDevSubtotal?: boolean;\n /** Subtotal caption (CT_PivotField `@subtotalCaption`) */\n subtotalCaption?: string;\n /** Top auto show (CT_PivotField `@topAutoShow`) */\n topAutoShow?: boolean;\n /** Unique member property (CT_PivotField `@uniqueMemberProperty`) */\n uniqueMemberProperty?: boolean;\n /** VarP subtotal (CT_PivotField `@varPSubtotal`) */\n varPSubtotal?: boolean;\n /** Var subtotal (CT_PivotField `@varSubtotal`) */\n varSubtotal?: boolean;\n /** Show detail for default item (CT_Item `@sd`) */\n defaultItemSd?: boolean;\n}\n\n/** Pivot filter type (ST_PivotFilterType) */\nexport const PivotFilterType = {\n UNKNOWN: \"unknown\",\n COUNT: \"count\",\n PERCENT: \"percent\",\n SUM: \"sum\",\n CAPTION_EQUAL: \"captionEqual\",\n CAPTION_NOT_EQUAL: \"captionNotEqual\",\n CAPTION_BEGINS_WITH: \"captionBeginsWith\",\n CAPTION_NOT_BEGINS_WITH: \"captionNotBeginsWith\",\n CAPTION_ENDS_WITH: \"captionEndsWith\",\n CAPTION_NOT_ENDS_WITH: \"captionNotEndsWith\",\n CAPTION_CONTAINS: \"captionContains\",\n CAPTION_NOT_CONTAINS: \"captionNotContains\",\n CAPTION_GREATER_THAN: \"captionGreaterThan\",\n CAPTION_GREATER_THAN_OR_EQUAL: \"captionGreaterThanOrEqual\",\n CAPTION_LESS_THAN: \"captionLessThan\",\n CAPTION_LESS_THAN_OR_EQUAL: \"captionLessThanOrEqual\",\n CAPTION_BETWEEN: \"captionBetween\",\n CAPTION_NOT_BETWEEN: \"captionNotBetween\",\n VALUE_EQUAL: \"valueEqual\",\n VALUE_NOT_EQUAL: \"valueNotEqual\",\n VALUE_GREATER_THAN: \"valueGreaterThan\",\n VALUE_GREATER_THAN_OR_EQUAL: \"valueGreaterThanOrEqual\",\n VALUE_LESS_THAN: \"valueLessThan\",\n VALUE_LESS_THAN_OR_EQUAL: \"valueLessThanOrEqual\",\n VALUE_BETWEEN: \"valueBetween\",\n VALUE_NOT_BETWEEN: \"valueNotBetween\",\n DATE_EQUAL: \"dateEqual\",\n DATE_NOT_EQUAL: \"dateNotEqual\",\n DATE_OLDER_THAN: \"dateOlderThan\",\n DATE_OLDER_THAN_OR_EQUAL: \"dateOlderThanOrEqual\",\n DATE_NEWER_THAN: \"dateNewerThan\",\n DATE_NEWER_THAN_OR_EQUAL: \"dateNewerThanOrEqual\",\n DATE_BETWEEN: \"dateBetween\",\n DATE_NOT_BETWEEN: \"dateNotBetween\",\n TOMORROW: \"tomorrow\",\n TODAY: \"today\",\n YESTERDAY: \"yesterday\",\n NEXT_WEEK: \"nextWeek\",\n THIS_WEEK: \"thisWeek\",\n LAST_WEEK: \"lastWeek\",\n NEXT_MONTH: \"nextMonth\",\n THIS_MONTH: \"thisMonth\",\n LAST_MONTH: \"lastMonth\",\n NEXT_QUARTER: \"nextQuarter\",\n THIS_QUARTER: \"thisQuarter\",\n LAST_QUARTER: \"lastQuarter\",\n NEXT_YEAR: \"nextYear\",\n THIS_YEAR: \"thisYear\",\n LAST_YEAR: \"lastYear\",\n YEAR_TO_DATE: \"yearToDate\",\n Q1: \"Q1\",\n Q2: \"Q2\",\n Q3: \"Q3\",\n Q4: \"Q4\",\n M1: \"M1\",\n M2: \"M2\",\n M3: \"M3\",\n M4: \"M4\",\n M5: \"M5\",\n M6: \"M6\",\n M7: \"M7\",\n M8: \"M8\",\n M9: \"M9\",\n M10: \"M10\",\n M11: \"M11\",\n M12: \"M12\",\n} as const;\n\nexport type PivotFilterType = (typeof PivotFilterType)[keyof typeof PivotFilterType];\n\n/** A single pivot filter (CT_PivotFilter) */\nexport interface PivotFilterOptions {\n /** Field index to filter on (required) */\n fld: number;\n /** Filter type (required) */\n type: PivotFilterType;\n /** Filter ID — unique within this pivot table; omit for auto (list index) */\n id?: number;\n /** Measure field index for OLAP filters */\n mpFld?: number;\n /** Evaluation order */\n evalOrder?: number;\n /** Measure hierarchy */\n iMeasureHier?: number;\n /** Measure field */\n iMeasureFld?: number;\n /** Filter name */\n name?: string;\n /** Filter description */\n description?: string;\n /** First string value for caption/date filters */\n stringValue1?: string;\n /** Second string value for between filters */\n stringValue2?: string;\n}\n\n/** Page/report filter field (CT_PageField). */\nexport interface PivotPageFieldOptions {\n /** Field name to use as a page filter (CT_PageField `@fld`) */\n field: string;\n /** Caption override (CT_PageField `@cap`) */\n caption?: string;\n /** Selected item index (CT_PageField `@item`) */\n item?: number;\n}\n\n/** Options for a single pivot table on a worksheet. */\nexport interface PivotTableOptions {\n /** Pivot table name (default: \"PivotTable{N}\") */\n name?: string;\n /** Source data range, e.g. \"A1:D11\" — must be on the same or a different sheet */\n source: string;\n /** Source sheet name (default: current sheet) */\n sourceSheet?: string;\n /** Target cell for the pivot table output (default: \"A3\") */\n location?: string;\n /** Field names to use as row labels */\n rows: string[];\n /** Field names to use as column labels */\n columns?: string[];\n /** Data fields with aggregation settings */\n data: PivotDataField[];\n /** Pivot style name (default: \"PivotStyleLight16\") */\n style?: string;\n /** Pivot filters (CT_PivotFilters) */\n filters?: PivotFilterOptions[];\n /** Page/report filter fields (CT_PivotTableDefinition → pageFields) */\n pages?: PivotPageFieldOptions[];\n /** Data fields on rows instead of columns (CT_PivotTableDefinition `@dataOnRows`) */\n dataOnRows?: boolean;\n /** Grand total caption text */\n grandTotalCaption?: string;\n /** Error caption text */\n errorCaption?: string;\n /** Show error messages */\n showError?: boolean;\n /** Missing caption text */\n missingCaption?: string;\n /** Show missing items */\n showMissing?: boolean;\n /** Custom page style name */\n pageStyle?: string;\n /** Custom pivot table style name */\n pivotTableStyle?: string;\n /** Tag string */\n tag?: string;\n /** Show items with no data */\n showItems?: boolean;\n /** Edit data in-place */\n editData?: boolean;\n disableFieldList?: boolean;\n /** Show calculated members */\n showCalcMbrs?: boolean;\n visualTotals?: boolean;\n /** Show multiple labels */\n showMultipleLabel?: boolean;\n showDataDropDown?: boolean;\n /** Show drill indicators */\n showDrill?: boolean;\n /** Print drill indicators */\n printDrill?: boolean;\n showMemberPropertyTips?: boolean;\n showDataTips?: boolean;\n /** Enable layout wizard */\n enableWizard?: boolean;\n /** Enable drill-down */\n enableDrill?: boolean;\n enableFieldProperties?: boolean;\n /** Number of page fields per row/column */\n pageWrap?: number;\n /** Page layout over then down */\n pageOverThenDown?: boolean;\n subtotalHiddenItems?: boolean;\n fieldPrintTitles?: boolean;\n /** Merge item labels */\n mergeItem?: boolean;\n showDropZones?: boolean;\n showEmptyRow?: boolean;\n /** Show empty column */\n showEmptyCol?: boolean;\n showHeaders?: boolean;\n /** Published to server */\n published?: boolean;\n gridDropZones?: boolean;\n multipleFieldFilters?: boolean;\n rowHeaderCaption?: string;\n /** Column header caption */\n colHeaderCaption?: string;\n /** Sort field list ascending */\n fieldListSortAscending?: boolean;\n /** MDX subqueries enabled */\n mdxSubqueries?: boolean;\n customListSort?: boolean;\n /** Asterisk totals (CT_PivotTableDefinition `@asteriskTotals`) */\n asteriskTotals?: boolean;\n /** Data position (CT_PivotTableDefinition `@dataPosition`) */\n dataPosition?: number;\n /** Immersive (CT_PivotTableDefinition `@immersive`) */\n immersive?: boolean;\n /** Vacated style (CT_PivotTableDefinition `@vacatedStyle`) */\n vacatedStyle?: string;\n /** Calculated items (CT_CalculatedItems) */\n calculatedItems?: CalculatedItemOptions[];\n /** Calculated members (CT_CalculatedMembers) */\n calculatedMembers?: CalculatedMemberOptions[];\n /** Pivot hierarchies (CT_PivotHierarchies) */\n pivotHierarchies?: PivotHierarchyOptions[];\n /** Conditional formats (CT_ConditionalFormats for pivot) */\n pivotConditionalFormats?: PivotConditionalFormatOptions[];\n /** Chart formats (CT_ChartFormats) */\n chartFormats?: ChartFormatOptions[];\n /** Chart format applied (CT_PivotTableDefinition `@chartFormat`) */\n chartFormat?: boolean;\n /** Preserve formatting on refresh (CT_PivotTableDefinition `@preserveFormatting`, default true) */\n preserveFormatting?: boolean;\n /** Auto sort scope (CT_AutoSortScope) */\n autoSortScope?: PivotAreaOptions;\n /** Member properties per field (CT_MemberProperties → mps/mp) */\n memberProperties?: MemberPropertyOptions[];\n /** Pivot format areas (CT_Formats → format) */\n formats?: PivotFormatOptions[];\n /** Row hierarchy usage (CT_RowHierarchiesUsage) */\n rowHierarchiesUsage?: HierarchyUsageOptions[];\n /** Column hierarchy usage (CT_ColHierarchiesUsage) */\n colHierarchiesUsage?: HierarchyUsageOptions[];\n /** Location column page count (CT_Location `@colPageCount`) */\n locationColPageCount?: number;\n /** Location row page count (CT_Location `@rowPageCount`) */\n locationRowPageCount?: number;\n /** Per-field overrides for pivotField (CT_PivotField attributes) */\n fieldOverrides?: PivotFieldOverrideOptions[];\n}\n\n/** Pivot format (CT_Format). */\nexport interface PivotFormatOptions {\n /** Action type (default: \"formatting\") */\n action?: \"formatting\" | \"drill\" | \"formula\" | \"blank\" | \"subtotal\" | \"report\";\n /** Differential format index */\n dxfId?: number;\n pivotArea: PivotAreaOptions;\n}\n\n/** Calculated item in a pivot table (CT_CalculatedItem) */\nexport interface CalculatedItemOptions {\n /** Field index */\n field?: number;\n formula?: string;\n /** Pivot area reference */\n pivotArea?: PivotAreaOptions;\n}\n\n/** Calculated member in a pivot table (CT_CalculatedMember) */\nexport interface CalculatedMemberOptions {\n /** Name (required) */\n name: string;\n /** MDX expression (required) */\n mdx: string;\n memberName?: string;\n hierarchy?: string;\n /** Parent member */\n parent?: string;\n /** Solve order (default: 0) */\n solveOrder?: number;\n /** Is a set (default: false) */\n set?: boolean;\n}\n\n/** Pivot hierarchy (CT_PivotHierarchy) */\nexport interface PivotHierarchyOptions {\n /** Outline mode (default: false) */\n outline?: boolean;\n /** Allow multiple item selection (default: false) */\n multipleItemSelectionAllowed?: boolean;\n /** Subtotal on top (default: false) */\n subtotalTop?: boolean;\n /** Show in field list (default: true) */\n showInFieldList?: boolean;\n /** Drag to row (default: true) */\n dragToRow?: boolean;\n /** Drag to column (default: true) */\n dragToCol?: boolean;\n /** Drag to page (default: true) */\n dragToPage?: boolean;\n /** Drag to data (default: false) */\n dragToData?: boolean;\n /** Drag off (default: true) */\n dragOff?: boolean;\n /** Include new items in filter (default: false) */\n includeNewItemsInFilter?: boolean;\n caption?: string;\n members?: MemberOptions[];\n /** Member properties (CT_MemberProperties → mps/mp) */\n memberProperties?: MemberPropertyOptions[];\n}\n\n/** Member in pivot hierarchy (CT_Member) */\nexport interface MemberOptions {\n /** Member name (required) */\n name: string;\n /** Level (CT_Member `@level`) */\n level?: number;\n}\n\n/** Member property (CT_MemberProperty) */\nexport interface MemberPropertyOptions {\n /** Field index */\n field: number;\n /** Property name */\n name?: string;\n showCell?: boolean;\n showTip?: boolean;\n /** Show as caption (CT_MemberProperty `@showAsCaption`) */\n showAsCaption?: boolean;\n /** Name length (CT_MemberProperty `@nameLen`) */\n nameLen?: number;\n /** Property position (CT_MemberProperty `@pPos`) */\n pPos?: number;\n /** Property length (CT_MemberProperty `@pLen`) */\n pLen?: number;\n}\n\n/** Pivot area for conditional formats, chart formats, etc. (CT_PivotArea) */\nexport interface PivotAreaOptions {\n /** Field index */\n field?: number;\n /** Area type (default: \"normal\") */\n type?: \"none\" | \"normal\" | \"data\" | \"all\" | \"origin\" | \"button\" | \"topEnd\" | \"topRight\";\n /** Data only (default: true) */\n dataOnly?: boolean;\n /** Label only (default: false) */\n labelOnly?: boolean;\n /** Grand row (default: false) */\n grandRow?: boolean;\n /** Grand column (default: false) */\n grandCol?: boolean;\n /** Cache index (default: false) */\n cacheIndex?: boolean;\n /** Outline (default: true) */\n outline?: boolean;\n /** Offset reference */\n offset?: string;\n /** Collapsed levels are subtotals (default: false) */\n collapsedLevelsAreSubtotals?: boolean;\n axis?: \"axisRow\" | \"axisCol\" | \"axisPage\" | \"axisValues\";\n fieldPosition?: number;\n references?: PivotAreaReferenceOptions[];\n}\n\n/** Pivot area reference (CT_PivotAreaReference) */\nexport interface PivotAreaReferenceOptions {\n /** Field index */\n field?: number;\n count?: number;\n /** Selected (default: true) */\n selected?: boolean;\n /** By position (default: false) */\n byPosition?: boolean;\n /** Relative (default: false) */\n relative?: boolean;\n defaultSubtotal?: boolean;\n sumSubtotal?: boolean;\n countASubtotal?: boolean;\n /** Average subtotal */\n avgSubtotal?: boolean;\n maxSubtotal?: boolean;\n minSubtotal?: boolean;\n /** Count subtotal (CT_Reference `@countSubtotal`) */\n countSubtotal?: boolean;\n /** Product subtotal (CT_Reference `@productSubtotal`) */\n productSubtotal?: boolean;\n /** StdDevP subtotal (CT_Reference `@stdDevPSubtotal`) */\n stdDevPSubtotal?: boolean;\n /** StdDev subtotal (CT_Reference `@stdDevSubtotal`) */\n stdDevSubtotal?: boolean;\n /** VarP subtotal (CT_Reference `@varPSubtotal`) */\n varPSubtotal?: boolean;\n /** Var subtotal (CT_Reference `@varSubtotal`) */\n varSubtotal?: boolean;\n /** X indices */\n x?: number[];\n}\n\n/** Pivot conditional format (CT_ConditionalFormat for pivot) */\nexport interface PivotConditionalFormatOptions {\n /** Scope (default: \"selection\") */\n scope?: \"selection\" | \"data\" | \"field\";\n /** Type (default: \"none\") */\n type?: \"none\" | \"all\" | \"row\" | \"column\";\n /** Priority (required) */\n priority: number;\n pivotAreas?: PivotAreaOptions[];\n}\n\n/** Chart format for pivot table (CT_ChartFormat) */\nexport interface ChartFormatOptions {\n /** Chart index (required) */\n chart: number;\n /** Format index (required) */\n format: number;\n /** Is series (default: false) */\n series?: boolean;\n pivotArea?: PivotAreaOptions;\n}\n\n/** Cache hierarchy for OLAP pivot caches (CT_CacheHierarchy) */\nexport interface CacheHierarchyOptions {\n /** Unique name (required) */\n uniqueName: string;\n caption?: string;\n /** Is measure (default: false) */\n measure?: boolean;\n /** Is set (default: false) */\n set?: boolean;\n /** Parent set index */\n parentSet?: number;\n /** Icon set (default: 0) */\n iconSet?: number;\n /** Is attribute (default: false) */\n attribute?: boolean;\n /** Is time dimension (default: false) */\n time?: boolean;\n /** Key attribute (default: false) */\n keyAttribute?: boolean;\n defaultMemberUniqueName?: string;\n allUniqueName?: string;\n allCaption?: string;\n dimensionUniqueName?: string;\n displayFolder?: string;\n measureGroup?: string;\n /** Is measures (default: false) */\n measures?: boolean;\n /** Count (required) */\n count: number;\n /** One field (default: false) */\n oneField?: boolean;\n /** Hidden (default: false) */\n hidden?: boolean;\n /** Member value datatype (CT_CacheHierarchy `@memberValueDatatype`) */\n memberValueDatatype?: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"error\";\n /** Unbalanced (CT_CacheHierarchy `@unbalanced`) */\n unbalanced?: boolean;\n /** Unbalanced group (CT_CacheHierarchy `@unbalancedGroup`) */\n unbalancedGroup?: boolean;\n /** Group levels (CT_GroupLevels) */\n groupLevels?: GroupLevelOptions[];\n /** Fields usage (CT_FieldsUsage) */\n fieldsUsage?: FieldUsageOptions[];\n}\n\n/** KPI definition for pivot cache (CT_PCDKPI) */\nexport interface KpiOptions {\n /** Unique name (required) */\n uniqueName: string;\n caption?: string;\n displayFolder?: string;\n measureGroup?: string;\n parent?: string;\n /** Value expression (required) */\n value: string;\n /** Goal expression */\n goal?: string;\n /** Status expression */\n status?: string;\n /** Trend expression */\n trend?: string;\n /** Weight expression */\n weight?: string;\n /** Time expression */\n time?: string;\n}\n\n/** Measure group (CT_MeasureGroup) */\nexport interface MeasureGroupOptions {\n /** Name (required) */\n name: string;\n /** Caption (required) */\n caption: string;\n}\n\n/** Set definition (CT_Set) */\nexport interface SetOptions {\n count?: number;\n /** Max rank (required) */\n maxRank: number;\n /** Set definition MDX (required) */\n setDefinition: string;\n /** Sort type (default: \"none\") */\n sortType?:\n | \"none\"\n | \"ascending\"\n | \"descending\"\n | \"ascendingAlpha\"\n | \"descendingAlpha\"\n | \"ascendingNatural\"\n | \"descendingNatural\";\n /** Query failed (default: false) */\n queryFailed?: boolean;\n /** Sort/filter tuples (CT_Set `@tpls` → CT_Tuples) */\n tpls?: TupleOptions[];\n /** Sort-by tuples (CT_Set `@sortByTuple` → CT_Tuples) */\n sortByTuple?: TupleOptions[];\n}\n\n/** Server format (CT_ServerFormat) */\nexport interface ServerFormatOptions {\n culture?: string;\n /** Format string */\n format?: string;\n}\n\n/** Field group for pivot cache (CT_FieldGroup) */\nexport interface FieldGroupOptions {\n /** Parent field index */\n parent?: number;\n /** Base field index */\n base?: number;\n /** Range properties */\n rangePr?: RangePropertiesOptions;\n /** Discrete properties */\n discretePr?: number[];\n /** Group items names */\n groupItems?: string[];\n}\n\n/** Range properties for field grouping (CT_RangePr) */\nexport interface RangePropertiesOptions {\n /** Auto start (default: true) */\n autoStart?: boolean;\n /** Auto end (default: true) */\n autoEnd?: boolean;\n /** Group by (default: \"range\") */\n groupBy?: \"range\" | \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"months\" | \"quarters\" | \"years\";\n /** Start number */\n startNum?: number;\n /** End number */\n endNum?: number;\n /** Start date ISO string */\n startDate?: string;\n /** End date ISO string */\n endDate?: string;\n /** Group interval (default: 1) */\n groupInterval?: number;\n}\n\n/** Pivot dimension (CT_PivotDimension) */\nexport interface PivotDimensionOptions {\n /** Is measure (default: false) */\n measure?: boolean;\n /** Name (required) */\n name: string;\n /** Unique name (required) */\n uniqueName: string;\n /** Caption (required) */\n caption: string;\n}\n\n/** Range set for consolidation source (CT_RangeSet) */\nexport interface RangeSetOptions {\n /** Index for page field 1 (CT_RangeSet `@i1`) */\n pageFieldIndex1?: number;\n /** Index for page field 2 (CT_RangeSet `@i2`) */\n pageFieldIndex2?: number;\n /** Index for page field 3 (CT_RangeSet `@i3`) */\n pageFieldIndex3?: number;\n /** Index for page field 4 (CT_RangeSet `@i4`) */\n pageFieldIndex4?: number;\n /** Cell reference */\n ref?: string;\n /** Named range */\n name?: string;\n /** Sheet name */\n sheet?: string;\n /** Relationship ID to external workbook */\n rId?: string;\n}\n\n/** Page item for consolidation (CT_PageItem) */\nexport interface ConsolidationPageItemOptions {\n /** Page item name */\n name: string;\n}\n\n/** Page for consolidation (CT_PCDSCPage) */\nexport interface ConsolidationPageOptions {\n /** Page items */\n items?: ConsolidationPageItemOptions[];\n}\n\n/** Consolidation source (CT_Consolidation) */\nexport interface ConsolidationOptions {\n /** Auto page (default: true) */\n autoPage?: boolean;\n /** Pages (max 4) */\n pages?: ConsolidationPageOptions[];\n /** Range sets (required) */\n rangeSets: RangeSetOptions[];\n}\n\n/** Tuple cache entry (CT_PCDSDTCEntries choice: m/n/e/s) */\nexport interface TupleCacheEntryOptions {\n /** Entry type */\n type: \"m\" | \"n\" | \"e\" | \"s\";\n /** Value (required for n/s, optional for e) */\n value?: number | string;\n /** Member-property count/caption index (CT_Number `@cp`) — OLAP caches only */\n captionIndex?: number;\n /** Property index (CT_Number `@in`) — OLAP caches only */\n propertyIndex?: number;\n /** Underline flag (CT_Number `@un`) */\n underline?: boolean;\n}\n\n/** Deleted field (CT_DeletedField) */\nexport interface DeletedFieldOptions {\n /** Field name */\n name: string;\n}\n\n/** Group member (CT_GroupMember) */\nexport interface GroupMemberOptions {\n /** Unique name (required) */\n uniqueName: string;\n /** Is group */\n group?: boolean;\n}\n\n/** Level group (CT_LevelGroup) */\nexport interface LevelGroupOptions {\n /** Name (required) */\n name: string;\n /** Unique name (required) */\n uniqueName: string;\n /** Caption (required) */\n caption: string;\n uniqueParent?: string;\n /** Group ID */\n id?: number;\n members: GroupMemberOptions[];\n}\n\n/** Group level (CT_GroupLevel) */\nexport interface GroupLevelOptions {\n /** Unique name (required) */\n uniqueName: string;\n /** Caption (required) */\n caption: string;\n /** User-defined */\n user?: boolean;\n customRollUp?: boolean;\n groups?: LevelGroupOptions[];\n}\n\n/** Field usage (CT_FieldUsage) */\nexport interface FieldUsageOptions {\n /** Field index */\n value: number;\n}\n\n/** Hierarchy usage (CT_HierarchyUsage) */\nexport interface HierarchyUsageOptions {\n /** Hierarchy usage value (required) */\n hierarchyUsage: number;\n}\n\n/** Query cache entry (CT_Query) */\nexport interface QueryCacheEntryOptions {\n /** MDX query string (required) */\n mdx: string;\n /** Tuples */\n tpls?: TupleOptions[];\n}\n\n/** Tuple (CT_Tuple) */\nexport interface TupleOptions {\n /** Tuple items (field indices) */\n items?: number[];\n}\n\n/** Member property map (CT_X, used as mpMap child) */\nexport interface MpMapOptions {\n /** Field index */\n x: number;\n}\n\n/** Measure dimension map (CT_MeasureDimensionMap) */\nexport interface MeasureDimensionMapOptions {\n /** Measure group index */\n measureGroup?: number;\n /** Dimension index */\n dimension?: number;\n}\n\n/** OLAP properties (CT_OlapPr — pivot cache definition and connection share it) */\nexport interface OLAPPropertiesOptions {\n /** Use the local cube connection (CT_OlapPr `@local`, boolean) */\n local?: boolean;\n /** Local cube connection string (CT_OlapPr `@localConnection`) */\n localConnection?: string;\n /** Send locale info to OLAP server */\n sendLocale?: boolean;\n /** Row dimensions */\n rowDrillCount?: number;\n /** Local refresh (CT_OlapPr `@localRefresh`) */\n localRefresh?: boolean;\n /** Use server fill formatting */\n serverFill?: boolean;\n /** Use server number formatting */\n serverNumberFormat?: boolean;\n /** Use server font formatting */\n serverFont?: boolean;\n /** Use server font color */\n serverFontColor?: boolean;\n}\n\n/** Stringify CT_OlapPr attributes (shared by pivot cache definition + connection). */\nexport function stringifyOlapPr(ol: OLAPPropertiesOptions): string {\n const attrs: string[] = [];\n if (ol.local !== undefined) attrs.push(` local=\"${ol.local ? 1 : 0}\"`);\n if (ol.localConnection) attrs.push(` localConnection=\"${escapeXml(ol.localConnection)}\"`);\n if (ol.sendLocale) attrs.push(' sendLocale=\"1\"');\n if (ol.rowDrillCount !== undefined) attrs.push(` rowDrillCount=\"${ol.rowDrillCount}\"`);\n if (ol.localRefresh) attrs.push(' localRefresh=\"1\"');\n if (ol.serverFill === false) attrs.push(' serverFill=\"0\"');\n if (ol.serverNumberFormat === false) attrs.push(' serverNumberFormat=\"0\"');\n if (ol.serverFont === false) attrs.push(' serverFont=\"0\"');\n if (ol.serverFontColor === false) attrs.push(' serverFontColor=\"0\"');\n return attrs.length > 0 ? `<olapPr${attrs.join(\"\")}/>` : \"\";\n}\n\n/** Parse a CT_OlapPr element. */\nexport function parseOlapPr(el: Element | undefined): OLAPPropertiesOptions | undefined {\n if (!el) return undefined;\n const ol: OLAPPropertiesOptions = {};\n if (attr(el, \"local\") !== undefined) ol.local = parseOnOff(attr(el, \"local\")) ?? false;\n if (attr(el, \"localConnection\")) ol.localConnection = attr(el, \"localConnection\");\n if (parseOnOff(attr(el, \"sendLocale\"))) ol.sendLocale = true;\n const rdc = attrNum(el, \"rowDrillCount\");\n if (rdc !== undefined) ol.rowDrillCount = rdc;\n if (parseOnOff(attr(el, \"localRefresh\"))) ol.localRefresh = true;\n if (String(attr(el, \"serverFill\")) === \"0\") ol.serverFill = false;\n if (String(attr(el, \"serverNumberFormat\")) === \"0\") ol.serverNumberFormat = false;\n if (String(attr(el, \"serverFont\")) === \"0\") ol.serverFont = false;\n if (String(attr(el, \"serverFontColor\")) === \"0\") ol.serverFontColor = false;\n return Object.keys(ol).length > 0 ? ol : undefined;\n}\n\n/** Parsed source data for pivot cache generation. */\nexport interface PivotSourceData {\n fieldNames: string[];\n records: (string | number | null | Date)[][];\n}\n\n/**\n * Extract unique values from source data for a given field index.\n */\nexport function collectUniqueValues(\n records: (string | number | null | Date)[][],\n fieldIdx: number,\n): (string | number | null | Date)[] {\n const seen = new Set<string>();\n const result: (string | number | null | Date)[] = [];\n for (const row of records) {\n const val = row[fieldIdx];\n const key = val instanceof Date ? val.toISOString() : String(val);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(val ?? null);\n }\n }\n return result;\n}\n\n/**\n * Check if a field is numeric (all non-empty values are numbers).\n */\nexport function isNumericField(\n records: (string | number | null | Date)[][],\n fieldIdx: number,\n): boolean {\n for (const row of records) {\n const val = row[fieldIdx];\n if (typeof val === \"string\" && val !== \"\") return false;\n }\n return true;\n}\n\n/**\n * Aggregate values using the specified function.\n */\nexport function aggregate(values: number[], func: ConsolidateFunction): number {\n if (values.length === 0) return 0;\n switch (func) {\n case \"sum\":\n return values.reduce((a, b) => a + b, 0);\n case \"count\":\n case \"countNumbers\":\n return values.length;\n case \"average\":\n return values.reduce((a, b) => a + b, 0) / values.length;\n case \"max\":\n // Two-arg reduce: Math.max is associative, so Math.max(a,b,c) ===\n // Math.max(Math.max(a,b),c) for all values incl. NaN/Infinity — fully\n // equivalent to Math.max(...values) without spreading onto the stack.\n return values.reduce((a, b) => Math.max(a, b));\n case \"min\":\n return values.reduce((a, b) => Math.min(a, b));\n case \"product\":\n return values.reduce((a, b) => a * b, 1);\n case \"variance\":\n return sampleVariance(values);\n case \"variancePopulation\":\n return populationVariance(values);\n case \"standardDeviation\":\n return Math.sqrt(sampleVariance(values));\n case \"standardDeviationPopulation\":\n return Math.sqrt(populationVariance(values));\n default:\n return values.reduce((a, b) => a + b, 0);\n }\n}\n\nfunction populationVariance(values: number[]): number {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n return values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / values.length;\n}\n\nfunction sampleVariance(values: number[]): number {\n if (values.length < 2) return 0;\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n return values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / (values.length - 1);\n}\n\n// ── PivotCacheDefinition types (extracted from pivot-cache-definition-xml) ──\n\nexport interface CacheFieldExtraAttrs {\n /** Database field (CT_CacheField `@databaseField`) */\n databaseField?: boolean;\n /** Level (CT_CacheField `@level`) */\n level?: number;\n /** Mapping count (CT_CacheField `@mappingCount`) */\n mappingCount?: number;\n /** Member property field (CT_CacheField `@memberPropertyField`) */\n memberPropertyField?: number;\n /** Property name (CT_CacheField `@propertyName`) */\n propertyName?: string;\n /** Server field (CT_CacheField `@serverField`) */\n serverField?: boolean;\n /** Unique list (CT_CacheField `@uniqueList`) */\n uniqueList?: boolean;\n /** SQL data type (CT_CacheField `@sqlType`) */\n sqlType?: number;\n /** Shared items contains mixed types (CT_SharedItems `@containsMixedTypes`) */\n containsMixedTypes?: boolean;\n /** Shared items contains non-date (CT_SharedItems `@containsNonDate`) */\n containsNonDate?: boolean;\n /** Shared items long text (CT_SharedItems `@longText`) */\n longText?: boolean;\n /** Shared items max date (CT_SharedItems `@maxDate`) */\n maxDate?: string;\n /** Shared items min date (CT_SharedItems `@minDate`) */\n minDate?: string;\n}\n\nexport interface PivotCacheDefinitionOptions {\n /** Cache is invalid (CT_PivotCacheDefinition `@invalid`) */\n invalid?: boolean;\n /** Save data with cache (CT_PivotCacheDefinition `@saveData`) */\n saveData?: boolean;\n /** Optimize memory usage (CT_PivotCacheDefinition `@optimizeMemory`) */\n optimizeMemory?: boolean;\n /** Enable refresh (CT_PivotCacheDefinition `@enableRefresh`) */\n enableRefresh?: boolean;\n /** User who last refreshed */\n refreshedBy?: string;\n /** Date of last refresh (decimal) */\n refreshedDate?: number;\n /** Date of last refresh (ISO 8601) */\n refreshedDateIso?: string;\n /** Background query (CT_PivotCacheDefinition `@backgroundQuery`) */\n backgroundQuery?: boolean;\n missingItemsLimit?: number;\n upgradeOnRefresh?: boolean;\n supportSubquery?: boolean;\n supportAdvancedDrill?: boolean;\n /** Refresh cache when the workbook opens (CT_PivotCacheDefinition `@refreshOnLoad`) */\n refreshOnLoad?: boolean;\n /** Tuple cache is stored (CT_PivotCacheDefinition `@tupleCache`) */\n tupleCache?: boolean;\n /** Cache hierarchies (CT_CacheHierarchies) */\n cacheHierarchies?: CacheHierarchyOptions[];\n /** KPIs (CT_PCDKPIs) */\n kpis?: KpiOptions[];\n /** Measure groups (CT_MeasureGroups) */\n measureGroups?: MeasureGroupOptions[];\n /** Dimensions (CT_Dimensions) */\n dimensions?: PivotDimensionOptions[];\n /** Sets (CT_Sets in tupleCache) */\n sets?: SetOptions[];\n /** Server formats (CT_ServerFormats) */\n serverFormats?: ServerFormatOptions[];\n /** Field groups per field index (CT_FieldGroup inside cacheField) */\n fieldGroups?: ReadonlyMap<number, FieldGroupOptions>;\n /** Consolidation source (alternative to worksheetSource) */\n consolidation?: ConsolidationOptions;\n /** Tuple cache entries (CT_PCDSDTCEntries) */\n entries?: TupleCacheEntryOptions[];\n /** Query cache (CT_QueryCache in tupleCache) */\n queryCache?: QueryCacheEntryOptions[];\n /** Member property map per cache field (mpMap) */\n mpMaps?: MpMapOptions[];\n /** Measure dimension maps (CT_MeasureDimensionMaps) */\n measureDimensionMaps?: MeasureDimensionMapOptions[];\n /** Per-field cache field overrides (mapped by field index) */\n cacheFieldOverrides?: ReadonlyMap<number, CacheFieldExtraAttrs>;\n /** OLAP properties (CT_OlapPr) */\n olapPr?: OLAPPropertiesOptions;\n}\n","/**\n * PivotTable — stringify implementation and helpers.\n *\n * @module\n */\n\nimport { xsdConsolidateFunction } from \"@office-open/core\";\nimport { attrs, escapeXml } from \"@office-open/xml\";\nimport { columnToLetter, letterToColumn } from \"@util/index\";\n\nimport { collectUniqueValues } from \"../pivot/pivot-utils\";\nimport type {\n PivotAreaOptions,\n PivotAreaReferenceOptions,\n PivotDataField,\n PivotFieldOverrideOptions,\n PivotHierarchyOptions,\n PivotSourceData,\n PivotTableOptions,\n} from \"../pivot/pivot-utils\";\n\n// ── Stringify implementation ──\n\nexport function stringifyPivotTable(\n o: PivotTableOptions,\n sd: PivotSourceData,\n cacheId: number,\n): string {\n const fields = sd.fieldNames;\n const rowFieldNames = o.rows;\n const colFieldNames = o.columns ?? [];\n const dataFields = o.data;\n const style = o.style ?? \"PivotStyleLight16\";\n const location = o.location ?? \"A3\";\n const name = o.name ?? \"PivotTable1\";\n\n const rowFieldIndices = rowFieldNames.map((n) => fields.indexOf(n));\n const colFieldIndices = colFieldNames.map((n) => fields.indexOf(n));\n const dataFieldIndices = dataFields.map((df) => fields.indexOf(df.field));\n const pageFields = o.pages ?? [];\n const pageFieldIndices = pageFields.map((p) => fields.indexOf(p.field));\n\n const pivotFieldsXml = buildPivotFields(\n o,\n sd,\n rowFieldIndices,\n colFieldIndices,\n dataFieldIndices,\n pageFieldIndices,\n );\n const pageFieldsXml = buildPageFields(o, pageFieldIndices);\n const rowFieldsXml = buildRowFields(rowFieldIndices);\n const rowItemsXml = buildRowItems(sd, rowFieldIndices);\n const colFieldsXml = buildColFields(colFieldIndices);\n const colItemsXml = buildColItems(sd, colFieldIndices, dataFields);\n const dataFieldsXml = buildDataFields(dataFields, dataFieldIndices);\n\n const locationRef = computeLocationRef(\n sd,\n location,\n rowFieldIndices,\n colFieldIndices,\n dataFields,\n );\n\n const p: string[] = [];\n const defAttrs: string[] = [\n `name=\"${escapeXml(name)}\"`,\n `cacheId=\"${cacheId}\"`,\n 'dataCaption=\"Values\"',\n 'updatedVersion=\"6\"',\n 'minRefreshableVersion=\"3\"',\n 'createdVersion=\"6\"',\n 'applyNumberFormats=\"0\"',\n 'applyBorderFormats=\"0\"',\n 'applyFontFormats=\"0\"',\n 'applyPatternFormats=\"0\"',\n 'applyAlignmentFormats=\"0\"',\n 'applyWidthHeightFormats=\"1\"',\n 'autoFormatId=\"0\"',\n 'useAutoFormatting=\"1\"',\n 'itemPrintTitles=\"1\"',\n 'indent=\"0\"',\n 'outline=\"1\"',\n 'outlineData=\"1\"',\n 'compact=\"1\"',\n 'compactData=\"1\"',\n 'rowGrandTotals=\"1\"',\n 'colGrandTotals=\"1\"',\n ];\n if (o.dataOnRows) defAttrs.push('dataOnRows=\"1\"');\n if (o.grandTotalCaption) defAttrs.push(`grandTotalCaption=\"${escapeXml(o.grandTotalCaption)}\"`);\n if (o.errorCaption) defAttrs.push(`errorCaption=\"${escapeXml(o.errorCaption)}\"`);\n if (o.showError) defAttrs.push('showError=\"1\"');\n if (o.missingCaption) defAttrs.push(`missingCaption=\"${escapeXml(o.missingCaption)}\"`);\n if (o.showMissing === false) defAttrs.push('showMissing=\"0\"');\n if (o.pageStyle) defAttrs.push(`pageStyle=\"${escapeXml(o.pageStyle)}\"`);\n if (o.pivotTableStyle) defAttrs.push(`pivotTableStyle=\"${escapeXml(o.pivotTableStyle)}\"`);\n if (o.tag) defAttrs.push(`tag=\"${escapeXml(o.tag)}\"`);\n if (o.showItems === false) defAttrs.push('showItems=\"0\"');\n if (o.editData) defAttrs.push('editData=\"1\"');\n if (o.disableFieldList) defAttrs.push('disableFieldList=\"1\"');\n if (o.showCalcMbrs === false) defAttrs.push('showCalcMbrs=\"0\"');\n if (o.visualTotals) defAttrs.push('visualTotals=\"1\"');\n if (o.showMultipleLabel === false) defAttrs.push('showMultipleLabel=\"0\"');\n if (o.showDataDropDown === false) defAttrs.push('showDataDropDown=\"0\"');\n if (o.showDrill === false) defAttrs.push('showDrill=\"0\"');\n if (o.printDrill) defAttrs.push('printDrill=\"1\"');\n if (o.showMemberPropertyTips) defAttrs.push('showMemberPropertyTips=\"1\"');\n if (o.showDataTips === false) defAttrs.push('showDataTips=\"0\"');\n if (o.enableWizard === false) defAttrs.push('enableWizard=\"0\"');\n if (o.enableDrill === false) defAttrs.push('enableDrill=\"0\"');\n if (o.enableFieldProperties === false) defAttrs.push('enableFieldProperties=\"0\"');\n if (o.pageWrap !== undefined) defAttrs.push(`pageWrap=\"${o.pageWrap}\"`);\n if (o.pageOverThenDown) defAttrs.push('pageOverThenDown=\"1\"');\n if (o.subtotalHiddenItems) defAttrs.push('subtotalHiddenItems=\"1\"');\n if (o.fieldPrintTitles) defAttrs.push('fieldPrintTitles=\"1\"');\n if (o.mergeItem) defAttrs.push('mergeItem=\"1\"');\n if (o.showDropZones === false) defAttrs.push('showDropZones=\"0\"');\n if (o.showEmptyRow) defAttrs.push('showEmptyRow=\"1\"');\n if (o.showEmptyCol) defAttrs.push('showEmptyCol=\"1\"');\n if (o.showHeaders === false) defAttrs.push('showHeaders=\"0\"');\n if (o.published) defAttrs.push('published=\"1\"');\n if (o.gridDropZones === false) defAttrs.push('gridDropZones=\"0\"');\n if (o.multipleFieldFilters === false) defAttrs.push('multipleFieldFilters=\"0\"');\n if (o.rowHeaderCaption) defAttrs.push(`rowHeaderCaption=\"${escapeXml(o.rowHeaderCaption)}\"`);\n if (o.colHeaderCaption) defAttrs.push(`colHeaderCaption=\"${escapeXml(o.colHeaderCaption)}\"`);\n if (o.fieldListSortAscending) defAttrs.push('fieldListSortAscending=\"1\"');\n if (o.mdxSubqueries) defAttrs.push('mdxSubqueries=\"1\"');\n if (o.customListSort === false) defAttrs.push('customListSort=\"0\"');\n if (o.asteriskTotals) defAttrs.push('asteriskTotals=\"1\"');\n if (o.dataPosition !== undefined) defAttrs.push(`dataPosition=\"${o.dataPosition}\"`);\n if (o.immersive) defAttrs.push('immersive=\"1\"');\n if (o.vacatedStyle) defAttrs.push(`vacatedStyle=\"${escapeXml(o.vacatedStyle)}\"`);\n if (o.chartFormat) defAttrs.push('chartFormat=\"1\"');\n if (o.preserveFormatting === false) defAttrs.push('preserveFormatting=\"0\"');\n\n p.push(\n `<pivotTableDefinition xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ${defAttrs.join(\" \")}>`,\n );\n\n // location\n const locAttrs: string[] = [\n `ref=\"${escapeXml(locationRef)}\"`,\n `firstHeaderRow=\"1\"`,\n `firstDataRow=\"${colFieldIndices.length + 1}\"`,\n `firstDataCol=\"${rowFieldIndices.length}\"`,\n ];\n if (o.locationColPageCount !== undefined)\n locAttrs.push(`colPageCount=\"${o.locationColPageCount}\"`);\n if (o.locationRowPageCount !== undefined)\n locAttrs.push(`rowPageCount=\"${o.locationRowPageCount}\"`);\n p.push(`<location ${locAttrs.join(\" \")}/>`);\n\n p.push(pivotFieldsXml);\n p.push(rowFieldsXml);\n p.push(rowItemsXml);\n if (colFieldIndices.length > 0) p.push(colFieldsXml);\n p.push(colItemsXml);\n if (pageFieldIndices.length > 0) p.push(pageFieldsXml);\n if (dataFields.length > 0) p.push(dataFieldsXml);\n\n // formats\n if (o.formats && o.formats.length > 0) {\n const fmtParts: string[] = [`<formats count=\"${o.formats.length}\">`];\n for (const fmt of o.formats) {\n const fmtAttrs: string[] = [];\n if (fmt.action && fmt.action !== \"formatting\") fmtAttrs.push(`action=\"${fmt.action}\"`);\n if (fmt.dxfId !== undefined) fmtAttrs.push(`dxfId=\"${fmt.dxfId}\"`);\n fmtParts.push(\n `<format${fmtAttrs.length ? \" \" + fmtAttrs.join(\" \") : \"\"}>${buildPivotAreaXml(fmt.pivotArea)}</format>`,\n );\n }\n fmtParts.push(\"</formats>\");\n p.push(fmtParts.join(\"\"));\n }\n\n // pivot conditionalFormats (CT_ConditionalFormats)\n if (o.pivotConditionalFormats && o.pivotConditionalFormats.length > 0) {\n const pcParts: string[] = [`<conditionalFormats count=\"${o.pivotConditionalFormats.length}\">`];\n for (const cf of o.pivotConditionalFormats) {\n const cfAttrs: string[] = [`priority=\"${cf.priority}\"`];\n if (cf.scope && cf.scope !== \"selection\") cfAttrs.push(`scope=\"${cf.scope}\"`);\n if (cf.type && cf.type !== \"none\") cfAttrs.push(`type=\"${cf.type}\"`);\n const areasXml = cf.pivotAreas?.length\n ? `<pivotAreas count=\"${cf.pivotAreas.length}\">${cf.pivotAreas.map((a) => buildPivotAreaXml(a)).join(\"\")}</pivotAreas>`\n : '<pivotAreas count=\"0\"/>';\n pcParts.push(`<conditionalFormat ${cfAttrs.join(\" \")}>${areasXml}</conditionalFormat>`);\n }\n pcParts.push(\"</conditionalFormats>\");\n p.push(pcParts.join(\"\"));\n }\n\n // chartFormats\n if (o.chartFormats && o.chartFormats.length > 0) {\n const cfParts: string[] = [`<chartFormats count=\"${o.chartFormats.length}\">`];\n for (const cf of o.chartFormats) {\n const cfAttrs: string[] = [`chart=\"${cf.chart}\"`, `format=\"${cf.format}\"`];\n if (cf.series) cfAttrs.push('series=\"1\"');\n const areaXml = cf.pivotArea ? buildPivotAreaXml(cf.pivotArea) : \"\";\n cfParts.push(`<chartFormat ${cfAttrs.join(\" \")}>${areaXml}</chartFormat>`);\n }\n cfParts.push(\"</chartFormats>\");\n p.push(cfParts.join(\"\"));\n }\n\n // pivotHierarchies\n if (o.pivotHierarchies && o.pivotHierarchies.length > 0) {\n p.push(buildPivotHierarchies(o.pivotHierarchies));\n }\n\n // pivotTableStyleInfo\n p.push(\n `<pivotTableStyleInfo name=\"${escapeXml(style)}\" showRowHeaders=\"1\" showColHeaders=\"1\" showRowStripes=\"0\" showColStripes=\"0\" showLastColumn=\"1\"/>`,\n );\n\n // filters\n if (o.filters && o.filters.length > 0) {\n const fParts: string[] = [`<filters count=\"${o.filters.length}\">`];\n // @id only needs to be unique within the filter list — the loop index is\n // a stable default for fresh documents.\n let filterIdx = -1;\n for (const f of o.filters) {\n filterIdx++;\n const fAttrs: Record<string, string | number | boolean | undefined> = {\n fld: f.fld,\n type: f.type,\n id: f.id ?? filterIdx,\n };\n if (f.mpFld !== undefined) fAttrs.mpFld = f.mpFld;\n if (f.evalOrder !== undefined) fAttrs.evalOrder = f.evalOrder;\n if (f.iMeasureHier !== undefined) fAttrs.iMeasureHier = f.iMeasureHier;\n if (f.iMeasureFld !== undefined) fAttrs.iMeasureFld = f.iMeasureFld;\n if (f.name) fAttrs.name = f.name;\n if (f.description) fAttrs.description = f.description;\n if (f.stringValue1) fAttrs.stringValue1 = f.stringValue1;\n if (f.stringValue2) fAttrs.stringValue2 = f.stringValue2;\n fParts.push(`<filter${attrs(fAttrs)}><autoFilter></autoFilter></filter>`);\n }\n fParts.push(\"</filters>\");\n p.push(fParts.join(\"\"));\n }\n\n // rowHierarchiesUsage\n if (o.rowHierarchiesUsage && o.rowHierarchiesUsage.length > 0) {\n const rhu = o.rowHierarchiesUsage;\n p.push(\n `<rowHierarchiesUsage count=\"${rhu.length}\">${rhu.map((h) => `<rowHierarchyUsage hierarchyUsage=\"${h.hierarchyUsage}\"/>`).join(\"\")}</rowHierarchiesUsage>`,\n );\n }\n\n // colHierarchiesUsage\n if (o.colHierarchiesUsage && o.colHierarchiesUsage.length > 0) {\n const chu = o.colHierarchiesUsage;\n p.push(\n `<colHierarchiesUsage count=\"${chu.length}\">${chu.map((h) => `<colHierarchyUsage hierarchyUsage=\"${h.hierarchyUsage}\"/>`).join(\"\")}</colHierarchiesUsage>`,\n );\n }\n\n p.push(\"</pivotTableDefinition>\");\n return p.join(\"\");\n}\n\n// ── Stringify helpers ──\n\nfunction buildFieldOverrideAttrs(fo: PivotFieldOverrideOptions): string {\n const a: string[] = [];\n if (fo.allDrilled) a.push('allDrilled=\"1\"');\n if (fo.autoShow) a.push('autoShow=\"1\"');\n if (fo.countSubtotal) a.push('countSubtotal=\"1\"');\n if (fo.avgSubtotal) a.push('avgSubtotal=\"1\"');\n if (fo.countASubtotal) a.push('countASubtotal=\"1\"');\n if (fo.maxSubtotal) a.push('maxSubtotal=\"1\"');\n if (fo.minSubtotal) a.push('minSubtotal=\"1\"');\n if (fo.sumSubtotal) a.push('sumSubtotal=\"1\"');\n if (fo.dataSourceSort) a.push('dataSourceSort=\"1\"');\n if (fo.defaultAttributeDrillState) a.push('defaultAttributeDrillState=\"1\"');\n if (fo.hiddenLevel) a.push('hiddenLevel=\"1\"');\n if (fo.hideNewItems) a.push('hideNewItems=\"1\"');\n if (fo.insertBlankRow) a.push('insertBlankRow=\"1\"');\n if (fo.insertPageBreak) a.push('insertPageBreak=\"1\"');\n if (fo.itemPageCount) a.push('itemPageCount=\"1\"');\n if (fo.measureFilter) a.push('measureFilter=\"1\"');\n if (fo.nonAutoSortDefault) a.push('nonAutoSortDefault=\"1\"');\n if (fo.productSubtotal) a.push('productSubtotal=\"1\"');\n if (fo.rankBy !== undefined) a.push(`rankBy=\"${fo.rankBy}\"`);\n if (fo.serverField) a.push('serverField=\"1\"');\n if (fo.showDropDowns) a.push('showDropDowns=\"1\"');\n if (fo.showPropAsCaption) a.push('showPropAsCaption=\"1\"');\n if (fo.showPropCell) a.push('showPropCell=\"1\"');\n if (fo.showPropTip) a.push('showPropTip=\"1\"');\n if (fo.stdDevPSubtotal) a.push('stdDevPSubtotal=\"1\"');\n if (fo.stdDevSubtotal) a.push('stdDevSubtotal=\"1\"');\n if (fo.subtotalCaption) a.push(`subtotalCaption=\"${escapeXml(fo.subtotalCaption)}\"`);\n if (fo.topAutoShow) a.push('topAutoShow=\"1\"');\n if (fo.uniqueMemberProperty) a.push('uniqueMemberProperty=\"1\"');\n if (fo.varPSubtotal) a.push('varPSubtotal=\"1\"');\n if (fo.varSubtotal) a.push('varSubtotal=\"1\"');\n return a.join(\" \");\n}\n\nfunction buildPivotFields(\n o: PivotTableOptions,\n sd: PivotSourceData,\n rowIndices: number[],\n colIndices: number[],\n dataIndices: number[],\n pageIndices: number[],\n): string {\n const fieldNames = sd.fieldNames;\n const parts: string[] = [`<pivotFields count=\"${fieldNames.length}\">`];\n\n for (let i = 0; i < fieldNames.length; i++) {\n const isRow = rowIndices.includes(i);\n const isCol = colIndices.includes(i);\n const isData = dataIndices.includes(i);\n const isPage = pageIndices.includes(i);\n const override = o.fieldOverrides?.find((fo) => fo.field === fieldNames[i]);\n const extraAttrs = override ? buildFieldOverrideAttrs(override) : \"\";\n\n if (isData) {\n const dataFieldIdx = dataIndices.indexOf(i);\n const df = o.data[dataFieldIdx];\n const dfAttrs: string[] = ['dataField=\"1\"', 'showAll=\"0\"'];\n if (extraAttrs) dfAttrs.push(extraAttrs);\n if (df?.showDataAs) dfAttrs.push(`showDataAs=\"${df.showDataAs}\"`);\n if (df?.baseField !== undefined) dfAttrs.push(`baseField=\"${df.baseField}\"`);\n if (df?.baseItem !== undefined) dfAttrs.push(`baseItem=\"${df.baseItem}\"`);\n if (o.autoSortScope) {\n parts.push(\n `<pivotField ${dfAttrs.join(\" \")}><autoSortScope>${buildPivotAreaXml(o.autoSortScope)}</autoSortScope></pivotField>`,\n );\n } else {\n parts.push(`<pivotField ${dfAttrs.join(\" \")}/>`);\n }\n } else if (isRow) {\n const uniqueVals = collectUniqueValues(sd.records, i);\n const rAttrs = extraAttrs\n ? ` axis=\"axisRow\" showAll=\"0\" ${extraAttrs}`\n : ' axis=\"axisRow\" showAll=\"0\"';\n parts.push(`<pivotField${rAttrs}>`);\n parts.push(`<items count=\"${uniqueVals.length + 1}\">`);\n for (let j = 0; j < uniqueVals.length; j++) parts.push(`<item x=\"${j}\"/>`);\n parts.push(`<item t=\"default\"${override?.defaultItemSd === false ? ' sd=\"0\"' : \"\"}/>`);\n parts.push(\"</items></pivotField>\");\n } else if (isCol) {\n const uniqueVals = collectUniqueValues(sd.records, i);\n const cAttrs = extraAttrs\n ? ` axis=\"axisCol\" showAll=\"0\" ${extraAttrs}`\n : ' axis=\"axisCol\" showAll=\"0\"';\n parts.push(`<pivotField${cAttrs}>`);\n parts.push(`<items count=\"${uniqueVals.length + 1}\">`);\n for (let j = 0; j < uniqueVals.length; j++) parts.push(`<item x=\"${j}\"/>`);\n parts.push(`<item t=\"default\"${override?.defaultItemSd === false ? ' sd=\"0\"' : \"\"}/>`);\n parts.push(\"</items></pivotField>\");\n } else if (isPage) {\n const uniqueVals = collectUniqueValues(sd.records, i);\n const pAttrs = extraAttrs\n ? ` axis=\"axisPage\" showAll=\"0\" ${extraAttrs}`\n : ' axis=\"axisPage\" showAll=\"0\"';\n parts.push(`<pivotField${pAttrs}>`);\n parts.push(`<items count=\"${uniqueVals.length + 1}\">`);\n for (let j = 0; j < uniqueVals.length; j++) parts.push(`<item x=\"${j}\"/>`);\n parts.push(`<item t=\"default\"${override?.defaultItemSd === false ? ' sd=\"0\"' : \"\"}/>`);\n parts.push(\"</items></pivotField>\");\n } else {\n const nAttrs = extraAttrs ? ` showAll=\"0\" ${extraAttrs}` : ' showAll=\"0\"';\n parts.push(`<pivotField${nAttrs}/>`);\n }\n }\n\n parts.push(\"</pivotFields>\");\n return parts.join(\"\");\n}\n\nfunction buildPageFields(o: PivotTableOptions, pageIndices: number[]): string {\n if (pageIndices.length === 0) return \"\";\n const parts: string[] = [`<pageFields count=\"${pageIndices.length}\">`];\n const pageFields = o.pages ?? [];\n for (let i = 0; i < pageIndices.length; i++) {\n const cap = pageFields[i]?.caption;\n const capAttr = cap ? ` cap=\"${escapeXml(cap)}\"` : \"\";\n const item = pageFields[i]?.item;\n const itemAttr = item !== undefined ? ` item=\"${item}\"` : \"\";\n parts.push(`<pageField fld=\"${pageIndices[i]}\" hier=\"${i}\"${capAttr}${itemAttr}/>`);\n }\n parts.push(\"</pageFields>\");\n return parts.join(\"\");\n}\n\nfunction buildRowFields(rowIndices: number[]): string {\n if (rowIndices.length === 0) return '<rowFields count=\"0\"/>';\n const parts: string[] = [`<rowFields count=\"${rowIndices.length}\">`];\n for (const idx of rowIndices) parts.push(`<field x=\"${idx}\"/>`);\n parts.push(\"</rowFields>\");\n return parts.join(\"\");\n}\n\nfunction buildRowItems(sd: PivotSourceData, rowIndices: number[]): string {\n if (rowIndices.length === 0) return '<rowItems count=\"1\"><i/></rowItems>';\n\n const allUniqueCounts: number[] = [];\n for (const idx of rowIndices) {\n allUniqueCounts.push(collectUniqueValues(sd.records, idx).length);\n }\n\n if (rowIndices.length === 1) {\n const count = allUniqueCounts[0] ?? 0;\n const parts: string[] = [`<rowItems count=\"${count + 1}\">`];\n for (let i = 0; i < count; i++) parts.push(`<i><x v=\"${i}\"/></i>`);\n parts.push(`<i t=\"grand\"><x/></i>`);\n parts.push(\"</rowItems>\");\n return parts.join(\"\");\n }\n\n const combos = cartesianOfCounts(allUniqueCounts);\n const rowItems: string[] = [];\n for (const combo of combos) {\n rowItems.push(`<i>${combo.map((v) => `<x v=\"${v}\"/>`).join(\"\")}</i>`);\n }\n rowItems.push(`<i t=\"grand\">${rowIndices.map(() => \"<x/>\").join(\"\")}</i>`);\n return `<rowItems count=\"${rowItems.length}\">${rowItems.join(\"\")}</rowItems>`;\n}\n\nfunction buildColFields(colIndices: number[]): string {\n if (colIndices.length === 0) return '<colFields count=\"0\"/>';\n const parts: string[] = [`<colFields count=\"${colIndices.length}\">`];\n for (const idx of colIndices) parts.push(`<field x=\"${idx}\"/>`);\n parts.push(\"</colFields>\");\n return parts.join(\"\");\n}\n\nfunction buildColItems(\n sd: PivotSourceData,\n colIndices: number[],\n dataFields: PivotDataField[],\n): string {\n if (colIndices.length > 0) {\n const allUniqueCounts: number[] = [];\n for (const idx of colIndices) {\n allUniqueCounts.push(collectUniqueValues(sd.records, idx).length);\n }\n const combos = cartesianOfCounts(allUniqueCounts);\n const items: string[] = [];\n for (const combo of combos) {\n items.push(`<i>${combo.map((v) => `<x v=\"${v}\"/>`).join(\"\")}</i>`);\n }\n items.push(`<i t=\"grand\">${colIndices.map(() => \"<x/>\").join(\"\")}</i>`);\n return `<colItems count=\"${items.length}\">${items.join(\"\")}</colItems>`;\n }\n if (dataFields.length > 1) {\n const items = dataFields.map((_, i) => `<i><x v=\"${i}\"/></i>`);\n return `<colItems count=\"${items.length}\">${items.join(\"\")}</colItems>`;\n }\n return '<colItems count=\"1\"><i/></colItems>';\n}\n\nfunction buildDataFields(dataFields: PivotDataField[], dataFieldIndices: number[]): string {\n if (dataFields.length === 0) return '<dataFields count=\"0\"/>';\n const parts: string[] = [`<dataFields count=\"${dataFields.length}\">`];\n for (const [i, df] of dataFields.entries()) {\n const subtotal = df.summarize ?? \"sum\";\n const name = df.name ?? `${subtotal === \"sum\" ? \"Sum\" : subtotal} of ${df.field}`;\n const dfAttrs: string[] = [\n `name=\"${escapeXml(name)}\"`,\n `fld=\"${dataFieldIndices[i] ?? 0}\"`,\n `subtotal=\"${xsdConsolidateFunction.to(subtotal)}\"`,\n ];\n if (df.showDataAs) dfAttrs.push(`showDataAs=\"${df.showDataAs}\"`);\n if (df.baseField !== undefined) dfAttrs.push(`baseField=\"${df.baseField}\"`);\n if (df.baseItem !== undefined) dfAttrs.push(`baseItem=\"${df.baseItem}\"`);\n parts.push(`<dataField ${dfAttrs.join(\" \")}/>`);\n }\n parts.push(\"</dataFields>\");\n return parts.join(\"\");\n}\n\nfunction computeLocationRef(\n sd: PivotSourceData,\n location: string,\n rowFieldIndices: number[],\n colFieldIndices: number[],\n dataFields: PivotDataField[],\n): string {\n const startCell = location.split(\":\")[0] ?? location;\n const match = startCell.match(/^([A-Z]+)(\\d+)$/);\n if (!match) return location;\n const startCol = match[1] ?? \"\";\n const startRow = parseInt(match[2] ?? \"0\", 10);\n\n let rowCount = 1;\n const rowFieldIndex0 = rowFieldIndices[0];\n if (rowFieldIndex0 !== undefined) {\n rowCount += collectUniqueValues(sd.records, rowFieldIndex0).length;\n }\n rowCount += 1;\n\n let colCount = Math.max(rowFieldIndices.length, 1);\n const colFieldIndex0 = colFieldIndices[0];\n if (colFieldIndex0 !== undefined) {\n colCount += collectUniqueValues(sd.records, colFieldIndex0).length;\n } else if (dataFields.length > 1) {\n colCount += dataFields.length - 1;\n }\n colCount += 1;\n\n const endCol = columnToLetter(letterToColumn(startCol) + colCount - 1);\n const endRow = startRow + rowCount - 1;\n return `${startCol}${startRow}:${endCol}${endRow}`;\n}\n\nfunction buildPivotHierarchies(hierarchies: PivotHierarchyOptions[]): string {\n const parts: string[] = [`<pivotHierarchies count=\"${hierarchies.length}\">`];\n for (const h of hierarchies) {\n const hAttrs: string[] = [];\n if (h.outline) hAttrs.push('outline=\"1\"');\n if (h.multipleItemSelectionAllowed) hAttrs.push('multipleItemSelectionAllowed=\"1\"');\n if (h.subtotalTop) hAttrs.push('subtotalTop=\"1\"');\n if (h.showInFieldList === false) hAttrs.push('showInFieldList=\"0\"');\n if (h.dragToRow === false) hAttrs.push('dragToRow=\"0\"');\n if (h.dragToCol === false) hAttrs.push('dragToCol=\"0\"');\n if (h.dragToPage === false) hAttrs.push('dragToPage=\"0\"');\n if (h.dragToData) hAttrs.push('dragToData=\"1\"');\n if (h.dragOff === false) hAttrs.push('dragOff=\"0\"');\n if (h.includeNewItemsInFilter) hAttrs.push('includeNewItemsInFilter=\"1\"');\n if (h.caption) hAttrs.push(`caption=\"${escapeXml(h.caption)}\"`);\n const inner =\n (h.memberProperties\n ? `<mps count=\"${h.memberProperties.length}\">${h.memberProperties\n .map((mp) => {\n const mpAttrs: string[] = [`field=\"${mp.field}\"`];\n if (mp.name !== undefined) mpAttrs.push(`name=\"${escapeXml(mp.name)}\"`);\n if (mp.showCell) mpAttrs.push('showCell=\"1\"');\n if (mp.showTip) mpAttrs.push('showTip=\"1\"');\n if (mp.showAsCaption) mpAttrs.push('showAsCaption=\"1\"');\n if (mp.nameLen !== undefined) mpAttrs.push(`nameLen=\"${mp.nameLen}\"`);\n if (mp.pPos !== undefined) mpAttrs.push(`pPos=\"${mp.pPos}\"`);\n if (mp.pLen !== undefined) mpAttrs.push(`pLen=\"${mp.pLen}\"`);\n return `<mp ${mpAttrs.join(\" \")}/>`;\n })\n .join(\"\")}</mps>`\n : \"\") +\n (h.members\n ? `<members count=\"${h.members.length}\">${h.members.map((m) => `<member name=\"${escapeXml(m.name)}\"${m.level !== undefined ? ` level=\"${m.level}\"` : \"\"}/>`).join(\"\")}</members>`\n : \"\");\n if (inner) {\n parts.push(`<pivotHierarchy ${hAttrs.join(\" \")}>${inner}</pivotHierarchy>`);\n } else {\n parts.push(`<pivotHierarchy ${hAttrs.join(\" \")}/>`);\n }\n }\n parts.push(\"</pivotHierarchies>\");\n return parts.join(\"\");\n}\n\nexport function buildPivotAreaXml(area: PivotAreaOptions): string {\n const aAttrs: string[] = [];\n if (area.field !== undefined) aAttrs.push(`field=\"${area.field}\"`);\n if (area.type) aAttrs.push(`type=\"${area.type}\"`);\n if (area.dataOnly === false) aAttrs.push('dataOnly=\"0\"');\n if (area.labelOnly) aAttrs.push('labelOnly=\"1\"');\n if (area.grandRow) aAttrs.push('grandRow=\"1\"');\n if (area.grandCol) aAttrs.push('grandCol=\"1\"');\n if (area.cacheIndex) aAttrs.push('cacheIndex=\"1\"');\n if (area.outline === false) aAttrs.push('outline=\"0\"');\n if (area.offset) aAttrs.push(`offset=\"${escapeXml(area.offset)}\"`);\n if (area.collapsedLevelsAreSubtotals) aAttrs.push('collapsedLevelsAreSubtotals=\"1\"');\n if (area.axis) aAttrs.push(`axis=\"${area.axis}\"`);\n if (area.fieldPosition !== undefined) aAttrs.push(`fieldPosition=\"${area.fieldPosition}\"`);\n const refsXml = area.references ? buildPivotAreaReferences(area.references) : \"\";\n if (refsXml) return `<pivotArea ${aAttrs.join(\" \")}>${refsXml}</pivotArea>`;\n return `<pivotArea ${aAttrs.join(\" \")}/>`;\n}\n\nfunction buildPivotAreaReferences(refs: PivotAreaReferenceOptions[]): string {\n const parts: string[] = [`<references count=\"${refs.length}\">`];\n for (const ref of refs) {\n const rAttrs: string[] = [];\n if (ref.field !== undefined) rAttrs.push(`field=\"${ref.field}\"`);\n if (ref.count !== undefined) rAttrs.push(`count=\"${ref.count}\"`);\n if (ref.selected === false) rAttrs.push('selected=\"0\"');\n if (ref.byPosition) rAttrs.push('byPosition=\"1\"');\n if (ref.relative) rAttrs.push('relative=\"1\"');\n if (ref.defaultSubtotal) rAttrs.push('defaultSubtotal=\"1\"');\n if (ref.sumSubtotal) rAttrs.push('sumSubtotal=\"1\"');\n if (ref.avgSubtotal) rAttrs.push('avgSubtotal=\"1\"');\n if (ref.countASubtotal) rAttrs.push('countASubtotal=\"1\"');\n if (ref.maxSubtotal) rAttrs.push('maxSubtotal=\"1\"');\n if (ref.minSubtotal) rAttrs.push('minSubtotal=\"1\"');\n const xXml = ref.x ? ref.x.map((v) => `<x v=\"${v}\"/>`).join(\"\") : \"\";\n if (xXml) {\n parts.push(`<reference ${rAttrs.join(\" \")}>${xXml}</reference>`);\n } else {\n parts.push(`<reference ${rAttrs.join(\" \")}/>`);\n }\n }\n parts.push(\"</references>\");\n return parts.join(\"\");\n}\n\nfunction cartesianOfCounts(counts: number[]): number[][] {\n if (counts.length === 0) return [[]];\n let result: number[][] = [[]];\n for (const count of counts) {\n const next: number[][] = [];\n for (const prefix of result) {\n for (let i = 0; i < count; i++) next.push([...prefix, i]);\n }\n result = next;\n }\n return result;\n}\n","/**\n * Worksheet — stringify implementation for xl/worksheets/sheet{n}.xml.\n *\n * Zero-allocation fast path: directly concatenates XML string, bypassing\n * the intermediate object tree entirely.\n *\n * @module\n */\nimport { convertToInch, convertToPt, derivePasswordHash } from \"@office-open/core\";\nimport { xsdConsolidateFunction } from \"@office-open/core\";\nimport { attrs, escapeXml, selfCloseElement } from \"@office-open/xml\";\nimport { columnToLetter, dateToSerialNumber, hashPassword } from \"@util/index\";\n\nimport { stringifyAutoFilter, stringifySortStateXml } from \"../auto-filter\";\nimport { buildPivotAreaXml } from \"../pivot-table/stringify\";\nimport { buildRstXml, tElement } from \"../shared-strings\";\nimport type { SharedStrings } from \"../shared-strings\";\nimport type { Styles } from \"../styles\";\nimport { FormulaType } from \"./types\";\nimport type { AnchorMarkerOptions, ObjectAnchorOptions } from \"./types\";\nimport type {\n CellOptions,\n CfColorOptions,\n CfvoOptions,\n FormulaOptions,\n HeaderFooterOptions,\n PageSetupOptions,\n PivotSelectionOptions,\n PrintOptions,\n RowOptions,\n SelectionOptions,\n SheetProtectionOptions,\n SheetViewOptions,\n WorksheetContext,\n WorksheetOptions,\n} from \"./types\";\n\n/**\n * Build the complete worksheet XML string.\n *\n * Zero-allocation fast path: directly concatenates XML string,\n * bypassing the intermediate object tree entirely.\n */\nexport function stringifyWorksheet(opts: WorksheetOptions, ctx: WorksheetContext): string {\n const sharedStrings = ctx.sharedStrings;\n const styles = ctx.styles;\n\n const rows = opts.rows ?? [];\n const columns = opts.columns ?? [];\n const mergeCells = opts.mergeCells ?? [];\n const protectedRanges = opts.protectedRanges ?? [];\n const ignoredErrors = opts.ignoredErrors ?? [];\n const rowBreaks = opts.rowBreaks ?? [];\n const colBreaks = opts.colBreaks ?? [];\n const customSheetViews = opts.customSheetViews ?? [];\n const cellWatches = opts.cellWatches ?? [];\n const controls = opts.controls ?? [];\n const customProperties = opts.customProperties ?? [];\n const oleObjects = opts.oleObjects ?? [];\n const webPublishItems = opts.webPublishItems ?? [];\n\n const p: string[] = [\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"' +\n ' xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"' +\n ' mc:Ignorable=\"x14ac xr xr2 xr3\"' +\n ' xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\"' +\n ' xmlns:xr=\"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"' +\n ' xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"' +\n ' xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\">',\n ];\n\n // Sheet properties (tabColor, outlinePr go here)\n const hasTabColor = !!opts.tabColor;\n const hasOutline = columns.some((c) => c.outlineLevel !== undefined);\n const sp = opts.sheetPr;\n const hasSheetPrAttrs =\n sp &&\n (sp.codeName ||\n sp.syncHorizontal ||\n sp.syncVertical ||\n sp.syncRef ||\n sp.transitionEvaluation ||\n sp.transitionEntry ||\n sp.published !== undefined ||\n sp.filterMode ||\n sp.enableFormatConditionsCalculation !== undefined);\n const hasPageSetUpPr =\n !!opts.pageSetup?.fitToWidth ||\n !!opts.pageSetup?.fitToHeight ||\n opts.pageSetup?.fitToPage !== undefined ||\n opts.pageSetup?.autoPageBreaks !== undefined;\n if (hasTabColor || hasOutline || hasSheetPrAttrs || hasPageSetUpPr) {\n const prParts: string[] = [];\n const prAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sp?.codeName) prAttrs.codeName = sp.codeName;\n if (sp?.syncHorizontal) prAttrs.syncHorizontal = 1;\n if (sp?.syncVertical) prAttrs.syncVertical = 1;\n if (sp?.syncRef) prAttrs.syncRef = sp.syncRef;\n if (sp?.transitionEvaluation) prAttrs.transitionEvaluation = 1;\n if (sp?.transitionEntry) prAttrs.transitionEntry = 1;\n // XSD defaults true — emit only the explicit-false form (0).\n if (sp?.published === false) prAttrs.published = 0;\n if (sp?.filterMode) prAttrs.filterMode = 1;\n if (sp?.enableFormatConditionsCalculation === false)\n prAttrs.enableFormatConditionsCalculation = 0;\n if (opts.tabColor) {\n const tc = opts.tabColor;\n const tcAttrs: Record<string, string | number | boolean | undefined> = {};\n if (tc.rgb) tcAttrs.rgb = tc.rgb;\n if (tc.theme !== undefined) tcAttrs.theme = tc.theme;\n if (tc.tint !== undefined) tcAttrs.tint = tc.tint;\n if (tc.indexed !== undefined) tcAttrs.indexed = tc.indexed;\n prParts.push(`<tabColor${attrs(tcAttrs)}/>`);\n }\n if (hasOutline) {\n const outAttrs: Record<string, string | number | boolean | undefined> = {\n summaryBelow: 1,\n summaryRight: 1,\n };\n if (sp?.outlineSummaryBelow === false) outAttrs.summaryBelow = 0;\n if (sp?.outlineSummaryRight === false) outAttrs.summaryRight = 0;\n if (sp?.outlineApplyStyles) outAttrs.applyStyles = 1;\n if (sp?.outlineShowSymbols === false) outAttrs.showOutlineSymbols = 0;\n prParts.push(`<outlinePr${attrs(outAttrs)}/>`);\n }\n // pageSetUpPr (inside sheetPr when any of its attributes is requested).\n // fitToPage alone is meaningful: files parsed with fitToWidth/fitToHeight\n // at their XSD defaults (1/1, attributes omitted) must re-emit the flag.\n if (hasPageSetUpPr) {\n const psupAttrs: Record<string, string | number | boolean | undefined> = {};\n if (opts.pageSetup?.fitToWidth || opts.pageSetup?.fitToHeight || opts.pageSetup?.fitToPage)\n psupAttrs.fitToPage = 1;\n // autoPageBreaks defaults true — emit as written, explicit 0 included.\n if (opts.pageSetup?.autoPageBreaks !== undefined)\n psupAttrs.autoPageBreaks = opts.pageSetup.autoPageBreaks ? 1 : 0;\n prParts.push(`<pageSetUpPr${attrs(psupAttrs)}/>`);\n }\n const prAttrStr = Object.keys(prAttrs).length > 0 ? attrs(prAttrs) : \"\";\n p.push(`<sheetPr${prAttrStr}>${prParts.join(\"\")}</sheetPr>`);\n }\n\n // Dimension — defines the used range of the sheet\n const maxRow = rows.length;\n let maxCol = 0;\n for (const row of rows) {\n if (row.cells && row.cells.length > maxCol) maxCol = row.cells.length;\n }\n if (opts.dimension) {\n p.push(`<dimension ref=\"${opts.dimension}\"/>`);\n } else if (maxRow > 0 && maxCol > 0) {\n const dimRef = `A1:${defaultCellRef(maxRow, maxCol)}`;\n p.push(`<dimension ref=\"${dimRef}\"/>`);\n }\n\n // Sheet views\n if (opts.freezePanes) {\n const fp = opts.freezePanes;\n const ySplit = fp.row ? fp.row : 0;\n const xSplit = fp.col ? fp.col : 0;\n const topRow = fp.row ? fp.row + 1 : 1;\n const leftCol = fp.col ? fp.col + 1 : 1;\n const topLeftCell = fp.topLeftCell ?? defaultCellRef(topRow, leftCol);\n const activePane =\n fp.activePane ??\n (ySplit > 0 && xSplit > 0 ? \"bottomRight\" : ySplit > 0 ? \"bottomLeft\" : \"topRight\");\n const state = fp.split ? \"split\" : \"frozen\";\n const svAttrs = buildSheetViewAttrs(opts.sheetView);\n const selections = (opts.selection ?? []).map(buildSelectionXml).join(\"\");\n p.push(\n `<sheetViews><sheetView${svAttrs}>`,\n `<pane ySplit=\"${ySplit}\" xSplit=\"${xSplit}\" topLeftCell=\"${topLeftCell}\" activePane=\"${activePane}\" state=\"${state}\"/>`,\n selections,\n opts.pivotSelection ? buildPivotSelectionXml(opts.pivotSelection) : \"\",\n \"</sheetView></sheetViews>\",\n );\n } else {\n const svAttrs = buildSheetViewAttrs(opts.sheetView);\n const selections = (opts.selection ?? []).map(buildSelectionXml).join(\"\");\n const innerXml =\n selections + (opts.pivotSelection ? buildPivotSelectionXml(opts.pivotSelection) : \"\");\n if (innerXml) {\n p.push(`<sheetViews><sheetView${svAttrs}>${innerXml}</sheetView></sheetViews>`);\n } else {\n p.push(`<sheetViews><sheetView${svAttrs}/></sheetViews>`);\n }\n }\n\n // Sheet format — default row height\n if (opts.sheetFormatPr) {\n const sfp = opts.sheetFormatPr;\n const sfpAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sfp.baseColWidth !== undefined) sfpAttrs.baseColWidth = sfp.baseColWidth;\n if (sfp.defaultColWidth !== undefined) sfpAttrs.defaultColWidth = sfp.defaultColWidth;\n sfpAttrs.defaultRowHeight = sfp.defaultRowHeight ?? 15;\n if (sfp.zeroHeight) sfpAttrs.zeroHeight = 1;\n if (sfp.thickTop) sfpAttrs.thickTop = 1;\n if (sfp.thickBottom) sfpAttrs.thickBottom = 1;\n if (sfp.outlineLevelRow !== undefined) sfpAttrs.outlineLevelRow = sfp.outlineLevelRow;\n if (sfp.outlineLevelCol !== undefined) sfpAttrs.outlineLevelCol = sfp.outlineLevelCol;\n p.push(`<sheetFormatPr${attrs(sfpAttrs)}/>`);\n } else {\n p.push('<sheetFormatPr baseColWidth=\"10\" defaultRowHeight=\"15\"/>');\n }\n\n // Column definitions\n if (columns.length > 0) {\n p.push(\"<cols>\");\n for (const col of columns) {\n const colAttrs: Record<string, string | number | boolean | undefined> = {\n min: col.min,\n max: col.max,\n };\n if (col.width !== undefined) {\n colAttrs.width = col.width;\n colAttrs.customWidth = 1;\n }\n // A column can carry customWidth=\"1\" without a width (parse fills it);\n // preserve the explicit flag so round-trip does not drop the attribute.\n if (col.customWidth) colAttrs.customWidth = 1;\n if (col.hidden) {\n colAttrs.hidden = 1;\n }\n if (col.outlineLevel !== undefined) {\n colAttrs.outlineLevel = col.outlineLevel;\n }\n if (col.collapsed) {\n colAttrs.collapsed = 1;\n }\n if (col.bestFit) {\n colAttrs.bestFit = 1;\n }\n if (col.phonetic) {\n colAttrs.phonetic = 1;\n }\n p.push(selfCloseElement(\"col\", attrs(colAttrs)));\n }\n p.push(\"</cols>\");\n }\n\n // Sheet data (rows + cells) — the hot path, shared with the streaming writer.\n p.push(\"<sheetData>\");\n appendSheetDataRows(rows, p, sharedStrings, styles);\n p.push(\"</sheetData>\");\n\n // Sheet calc properties (after sheetData per XSD sequence)\n if (opts.sheetCalcPr) {\n const scAttrs: string[] = [];\n if (opts.sheetCalcPr.fullCalcOnLoad) scAttrs.push('fullCalcOnLoad=\"1\"');\n p.push(`<sheetCalcPr${scAttrs.length ? \" \" + scAttrs.join(\" \") : \"\"}/>`);\n }\n\n // Sheet protection (after sheetData, before protectedRanges per XSD sequence)\n if (opts.protection) {\n p.push(stringifySheetProtectionXml(opts.protection));\n }\n\n // Protected ranges (after sheetProtection per XSD sequence)\n if (protectedRanges.length > 0) {\n const prParts: string[] = [\"<protectedRanges>\"];\n for (const pr of protectedRanges) {\n const prAttrs: Record<string, string | number | boolean | undefined> = {\n name: pr.name,\n sqref: pr.sqref,\n };\n if (pr.password) prAttrs.password = hashPassword(pr.password);\n // Auto-derive modern hash when password provided without explicit hashValue\n let prDerived: ReturnType<typeof derivePasswordHash> | undefined;\n if (pr.password !== undefined && pr.hashValue === undefined) {\n prDerived = derivePasswordHash(pr.password);\n }\n prAttrs.algorithmName = pr.algorithmName ?? prDerived?.algorithmName;\n prAttrs.hashValue = pr.hashValue ?? prDerived?.hashValue;\n prAttrs.saltValue = pr.saltValue ?? prDerived?.saltValue;\n if (pr.spinCount !== undefined) prAttrs.spinCount = pr.spinCount;\n else if (prDerived) prAttrs.spinCount = prDerived.spinCount;\n if (pr.securityDescriptor) prAttrs.securityDescriptor = pr.securityDescriptor;\n const hasSecurityDescriptor = !!pr.securityDescriptor;\n if (hasSecurityDescriptor) {\n prParts.push(\n `<protectedRange${attrs(prAttrs)}><securityDescriptor>${escapeXml(pr.securityDescriptor!)}</securityDescriptor></protectedRange>`,\n );\n } else {\n prParts.push(selfCloseElement(\"protectedRange\", attrs(prAttrs)));\n }\n }\n prParts.push(\"</protectedRanges>\");\n p.push(prParts.join(\"\"));\n }\n\n // Scenarios (what-if analysis)\n if (opts.scenarios) {\n const scParts: string[] = [\"<scenarios\"];\n const scAttrs: Record<string, string | number> = {};\n if (opts.scenarios.current !== undefined) scAttrs.current = opts.scenarios.current;\n if (opts.scenarios.show !== undefined) scAttrs.show = opts.scenarios.show;\n scParts[0] = `<scenarios${attrs(scAttrs)}>`;\n\n for (const scenario of opts.scenarios.scenarios) {\n const sAttrs: Record<string, string | number | boolean | undefined> = {\n name: scenario.name,\n };\n if (scenario.count !== undefined) sAttrs.count = scenario.count;\n if (scenario.user) sAttrs.user = scenario.user;\n if (scenario.comment) sAttrs.comment = scenario.comment;\n if (scenario.hidden) sAttrs.hidden = true;\n if (scenario.locked) sAttrs.locked = true;\n\n const sParts: string[] = [`<scenario${attrs(sAttrs)}>`];\n for (const cell of scenario.inputCells) {\n const icAttrs: Record<string, string | number | boolean | undefined> = {\n r: cell.reference,\n val: String(cell.val),\n };\n if (cell.deleted) icAttrs.deleted = true;\n if (cell.undone) icAttrs.undone = true;\n sParts.push(`<inputCells${attrs(icAttrs)}/>`);\n }\n sParts.push(\"</scenario>\");\n scParts.push(sParts.join(\"\"));\n }\n scParts.push(\"</scenarios>\");\n p.push(scParts.join(\"\"));\n }\n\n // Auto filter (CT_AutoFilter is shared with table — logic in auto-filter.ts)\n if (opts.autoFilter) {\n p.push(stringifyAutoFilter(opts.autoFilter));\n }\n\n // Sheet-level sort state (after autoFilter per XSD sequence)\n if (opts.sortState) {\n p.push(stringifySortStateXml(opts.sortState));\n }\n\n // Data consolidation\n if (opts.dataConsolidate) {\n const dc = opts.dataConsolidate;\n const dcAttrs: Record<string, string | number | boolean | undefined> = {};\n if (dc.function && dc.function !== \"sum\")\n dcAttrs.function = xsdConsolidateFunction.to(dc.function);\n if (dc.topLabels) dcAttrs.topLabels = 1;\n if (dc.leftLabels) dcAttrs.leftLabels = 1;\n if (dc.startLabels) dcAttrs.startLabels = 1;\n if (dc.link) dcAttrs.link = 1;\n const refsInner = dc.refs?.map((r) => `<dataRef ref=\"${escapeXml(r)}\"/>`).join(\"\") ?? \"\";\n const refsXml = refsInner ? `<dataRefs>${refsInner}</dataRefs>` : \"\";\n if (refsXml || Object.keys(dcAttrs).length > 0) {\n p.push(`<dataConsolidate${attrs(dcAttrs)}>${refsXml}</dataConsolidate>`);\n }\n }\n\n // Custom sheet views (after dataConsolidate per XSD sequence)\n if (customSheetViews.length > 0) {\n p.push(\"<customSheetViews>\");\n for (const csv of customSheetViews) {\n const csvAttrs: Record<string, string | number | boolean | undefined> = { guid: csv.guid };\n if (csv.scale !== undefined) csvAttrs.scale = csv.scale;\n if (csv.showPageBreaks) csvAttrs.showPageBreaks = 1;\n if (csv.showFormulas) csvAttrs.showFormulas = 1;\n if (csv.showGridLines === false) csvAttrs.showGridLines = 0;\n if (csv.showRowColHeaders === false) csvAttrs.showRowCol = 0;\n if (csv.outlineSymbols === false) csvAttrs.outlineSymbols = 0;\n if (csv.zeroValues === false) csvAttrs.zeroValues = 0;\n if (csv.fitToPage) csvAttrs.fitToPage = 1;\n if (csv.printArea) csvAttrs.printArea = 1;\n if (csv.filter) csvAttrs.filter = 1;\n if (csv.showAutoFilter) csvAttrs.showAutoFilter = 1;\n if (csv.hiddenRows) csvAttrs.hiddenRows = 1;\n if (csv.hiddenColumns) csvAttrs.hiddenColumns = 1;\n if (csv.state && csv.state !== \"visible\") csvAttrs.state = csv.state;\n if (csv.filterUnique) csvAttrs.filterUnique = 1;\n if (csv.view && csv.view !== \"normal\") csvAttrs.view = csv.view;\n p.push(`<customSheetView${attrs(csvAttrs)}/>`);\n }\n p.push(\"</customSheetViews>\");\n }\n\n // Merge cells\n if (mergeCells.length > 0) {\n p.push(`<mergeCells count=\"${mergeCells.length}\">`);\n for (const mc of mergeCells) {\n p.push(selfCloseElement(\"mergeCell\", attrs({ ref: mc.ref })));\n }\n p.push(\"</mergeCells>\");\n }\n\n // Phonetic properties (after mergeCells per XSD sequence)\n if (opts.phoneticPr) {\n const pp = opts.phoneticPr;\n const ppAttrs: Record<string, string | number> = { fontId: pp.fontId };\n if (pp.type && pp.type !== \"fullwidthKatakana\") ppAttrs.type = pp.type;\n if (pp.alignment && pp.alignment !== \"left\") ppAttrs.alignment = pp.alignment;\n p.push(selfCloseElement(\"phoneticPr\", attrs(ppAttrs)));\n }\n\n // Conditional formatting\n const conditionalFormats = opts.conditionalFormats ?? [];\n if (conditionalFormats.length > 0) {\n for (const cf of conditionalFormats) {\n const cfAttrs = cf.pivot ? ` sqref=\"${cf.sqref}\" pivot=\"1\"` : ` sqref=\"${cf.sqref}\"`;\n p.push(`<conditionalFormatting${cfAttrs}>`);\n for (const [ri, rule] of cf.rules.entries()) {\n const ruleAttrs: Record<string, string | number | boolean | undefined> = {\n type: rule.type,\n priority: rule.priority ?? ri + 1,\n };\n if (rule.operator) ruleAttrs.operator = rule.operator;\n if (rule.dxfId !== undefined) ruleAttrs.dxfId = rule.dxfId;\n if (rule.stopIfTrue) ruleAttrs.stopIfTrue = 1;\n if (rule.timePeriod) ruleAttrs.timePeriod = rule.timePeriod;\n if (rule.rank !== undefined) ruleAttrs.rank = rule.rank;\n if (rule.bottom) ruleAttrs.bottom = 1;\n if (rule.percent) ruleAttrs.percent = 1;\n if (rule.text !== undefined) ruleAttrs.text = rule.text;\n if (rule.equalAverage) ruleAttrs.equalAverage = 1;\n if (rule.aboveAverage === false) ruleAttrs.aboveAverage = 0;\n if (rule.stdDev !== undefined) ruleAttrs.stdDev = rule.stdDev;\n\n const formulaXml = rule.formulas\n ?.map((formula) => `<formula>${escapeXml(formula)}</formula>`)\n .join(\"\");\n\n // Color scale\n if (rule.type === \"colorScale\" && rule.colorScale) {\n const cs = rule.colorScale;\n const inner: string[] = [];\n for (const v of cs.cfvo) {\n inner.push(buildCfvoXml(v));\n }\n for (const c of cs.colors) {\n inner.push(buildCfColorXml(c));\n }\n p.push(\n `<cfRule${attrs(ruleAttrs)}>${formulaXml ?? \"\"}<colorScale>${inner.join(\"\")}</colorScale></cfRule>`,\n );\n }\n // Data bar\n else if (rule.type === \"dataBar\" && rule.dataBar) {\n const db = rule.dataBar;\n const inner: string[] = [];\n for (const v of db.cfvo) {\n inner.push(buildCfvoXml(v));\n }\n inner.push(buildCfColorXml(db.color));\n const dbAttrs: Record<string, string | number | boolean | undefined> = {};\n if (db.minLength !== undefined && db.minLength !== 10) dbAttrs.minLength = db.minLength;\n if (db.maxLength !== undefined && db.maxLength !== 90) dbAttrs.maxLength = db.maxLength;\n if (db.showValue === false) dbAttrs.showValue = 0;\n const attrStr = Object.keys(dbAttrs).length > 0 ? attrs(dbAttrs) : \"\";\n p.push(\n `<cfRule${attrs(ruleAttrs)}>${formulaXml ?? \"\"}<dataBar${attrStr}>${inner.join(\"\")}</dataBar></cfRule>`,\n );\n }\n // Icon set\n else if (rule.type === \"iconSet\" && rule.iconSet) {\n const is = rule.iconSet;\n const inner: string[] = [];\n for (const v of is.cfvo) {\n inner.push(buildCfvoXml(v));\n }\n const isAttrs: Record<string, string | number | boolean | undefined> = {};\n if (is.iconSet !== undefined && is.iconSet !== \"3TrafficLights1\")\n isAttrs.iconSet = is.iconSet;\n if (is.showValue === false) isAttrs.showValue = 0;\n if (is.percent === false) isAttrs.percent = 0;\n if (is.reverse) isAttrs.reverse = 1;\n const attrStr = Object.keys(isAttrs).length > 0 ? attrs(isAttrs) : \"\";\n p.push(\n `<cfRule${attrs(ruleAttrs)}>${formulaXml ?? \"\"}<iconSet${attrStr}>${inner.join(\"\")}</iconSet></cfRule>`,\n );\n }\n // Standard rules (cellIs, containsText, expression, top10, aboveAverage)\n else {\n if (formulaXml) {\n p.push(`<cfRule${attrs(ruleAttrs)}>${formulaXml}</cfRule>`);\n } else {\n p.push(selfCloseElement(\"cfRule\", attrs(ruleAttrs)));\n }\n }\n }\n p.push(\"</conditionalFormatting>\");\n }\n }\n\n // Data validations\n const dataValidations = opts.dataValidations ?? [];\n if (dataValidations.length > 0) {\n const dvContainerAttrs: Record<string, string | number | boolean | undefined> = {\n count: dataValidations.length,\n };\n if (opts.dataValidationsDisablePrompts) dvContainerAttrs.disablePrompts = 1;\n p.push(`<dataValidations${attrs(dvContainerAttrs)}>`);\n for (const dv of dataValidations) {\n const dvAttrs: Record<string, string | number | boolean | undefined> = { sqref: dv.sqref };\n if (dv.type && dv.type !== \"none\") dvAttrs.type = dv.type;\n if (dv.operator) dvAttrs.operator = dv.operator;\n if (dv.allowBlank) dvAttrs.allowBlank = 1;\n if (dv.showErrorMessage) dvAttrs.showErrorMessage = 1;\n if (dv.showInputMessage) dvAttrs.showInputMessage = 1;\n if (dv.errorTitle) dvAttrs.errorTitle = dv.errorTitle;\n if (dv.error) dvAttrs.error = dv.error;\n if (dv.promptTitle) dvAttrs.promptTitle = dv.promptTitle;\n if (dv.prompt) dvAttrs.prompt = dv.prompt;\n if (dv.errorStyle) dvAttrs.errorStyle = dv.errorStyle;\n if (dv.imeMode) dvAttrs.imeMode = dv.imeMode;\n if (dv.showDropDown) dvAttrs.showDropDown = 1;\n const inner: string[] = [];\n if (dv.formula1 !== undefined) inner.push(`<formula1>${escapeXml(dv.formula1)}</formula1>`);\n if (dv.formula2 !== undefined) inner.push(`<formula2>${escapeXml(dv.formula2)}</formula2>`);\n if (inner.length > 0) {\n p.push(`<dataValidation${attrs(dvAttrs)}>`, ...inner, \"</dataValidation>\");\n } else {\n p.push(selfCloseElement(\"dataValidation\", attrs(dvAttrs)));\n }\n }\n p.push(\"</dataValidations>\");\n }\n\n // Hyperlinks — r:id numbering must match worksheet rels order (compiler handles rels)\n const hyperlinks = opts.hyperlinks ?? [];\n if (hyperlinks.length > 0) {\n p.push(\"<hyperlinks>\");\n let hlIdx = 0;\n for (const hl of hyperlinks) {\n const hlAttrs: Record<string, string | number | boolean | undefined> = { ref: hl.cell };\n // CT_Hyperlink's @r:id and @location are independent optional attrs —\n // an external workbook plus an internal jump target is a legal pair.\n if (hl.url !== undefined) {\n hlIdx++;\n hlAttrs[\"r:id\"] = `rId${hlIdx}`;\n }\n if (hl.location !== undefined) {\n hlAttrs.location = hl.location;\n }\n if (hl.tooltip) hlAttrs.tooltip = hl.tooltip;\n if (hl.display) hlAttrs.display = hl.display;\n p.push(selfCloseElement(\"hyperlink\", attrs(hlAttrs)));\n }\n p.push(\"</hyperlinks>\");\n }\n\n // Print options\n if (opts.printOptions) {\n p.push(stringifyPrintOptionsXml(opts.printOptions));\n }\n\n if (opts.pageMargins) {\n const pm = opts.pageMargins;\n p.push(\n `<pageMargins${attrs({\n left: convertToInch(pm.left ?? 0.75),\n right: convertToInch(pm.right ?? 0.75),\n top: convertToInch(pm.top ?? 1),\n bottom: convertToInch(pm.bottom ?? 1),\n header: convertToInch(pm.header ?? 0.5),\n footer: convertToInch(pm.footer ?? 0.5),\n })}/>`,\n );\n } else {\n p.push('<pageMargins left=\"0.75\" right=\"0.75\" top=\"1\" bottom=\"1\" header=\"0.5\" footer=\"0.5\"/>');\n }\n\n // Page setup — fitToPage/autoPageBreaks are pageSetUpPr fields stashed on\n // the same object (emitted inside sheetPr above); alone they must not\n // conjure a <pageSetup> the source never had.\n if (\n opts.pageSetup &&\n Object.keys(opts.pageSetup).some((k) => k !== \"fitToPage\" && k !== \"autoPageBreaks\")\n ) {\n p.push(stringifyPageSetupXml(opts.pageSetup));\n }\n\n // Header/footer\n if (opts.headerFooter) {\n const hfXml = stringifyHeaderFooterXml(opts.headerFooter);\n if (hfXml) p.push(hfXml);\n }\n\n // Row breaks (after headerFooter per XSD sequence)\n if (rowBreaks.length > 0) {\n let manualCount = 0;\n const brkParts = rowBreaks.map((b) => {\n const bAttrs: Record<string, string | number | boolean | undefined> = { id: b.id };\n if (b.min !== undefined) bAttrs.min = b.min;\n if (b.max !== undefined) bAttrs.max = b.max;\n if (b.manual) {\n bAttrs.man = 1;\n manualCount++;\n }\n if (b.pivot) bAttrs.pt = 1;\n return `<brk${attrs(bAttrs)}/>`;\n });\n p.push(\n `<rowBreaks count=\"${rowBreaks.length}\" manualBreakCount=\"${manualCount}\">${brkParts.join(\"\")}</rowBreaks>`,\n );\n }\n\n // Column breaks\n if (colBreaks.length > 0) {\n let manualCount = 0;\n const brkParts = colBreaks.map((b) => {\n const bAttrs: Record<string, string | number | boolean | undefined> = { id: b.id };\n if (b.min !== undefined) bAttrs.min = b.min;\n if (b.max !== undefined) bAttrs.max = b.max;\n if (b.manual) {\n bAttrs.man = 1;\n manualCount++;\n }\n if (b.pivot) bAttrs.pt = 1;\n return `<brk${attrs(bAttrs)}/>`;\n });\n p.push(\n `<colBreaks count=\"${colBreaks.length}\" manualBreakCount=\"${manualCount}\">${brkParts.join(\"\")}</colBreaks>`,\n );\n }\n\n // Custom properties (CT_CustomProperties, after colBreaks per XSD sequence)\n if (customProperties.length > 0) {\n const cpParts: string[] = [\"<customProperties>\"];\n for (const cp of customProperties) {\n cpParts.push(`<customPr name=\"${escapeXml(cp.name)}\" r:id=\"${escapeXml(cp.rId)}\"/>`);\n }\n cpParts.push(\"</customProperties>\");\n p.push(cpParts.join(\"\"));\n }\n\n // Cell watches\n if (cellWatches.length > 0) {\n p.push(\"<cellWatches>\");\n for (const cw of cellWatches) {\n p.push(`<cellWatch r=\"${escapeXml(cw.reference)}\"/>`);\n }\n p.push(\"</cellWatches>\");\n }\n\n // Ignored errors (after cellWatches per XSD sequence)\n if (ignoredErrors.length > 0) {\n const ieParts: string[] = [\"<ignoredErrors>\"];\n for (const ie of ignoredErrors) {\n const ieAttrs: Record<string, string | number | boolean | undefined> = {\n sqref: ie.sqref,\n };\n if (ie.evalError) ieAttrs.evalError = 1;\n if (ie.twoDigitTextYear) ieAttrs.twoDigitTextYear = 1;\n if (ie.numberStoredAsText) ieAttrs.numberStoredAsText = 1;\n if (ie.formula) ieAttrs.formula = 1;\n if (ie.formulaRange) ieAttrs.formulaRange = 1;\n if (ie.unlockedFormula) ieAttrs.unlockedFormula = 1;\n if (ie.emptyCellReference) ieAttrs.emptyCellReference = 1;\n if (ie.listDataValidation) ieAttrs.listDataValidation = 1;\n if (ie.calculatedColumn) ieAttrs.calculatedColumn = 1;\n ieParts.push(selfCloseElement(\"ignoredError\", attrs(ieAttrs)));\n }\n ieParts.push(\"</ignoredErrors>\");\n p.push(ieParts.join(\"\"));\n }\n\n // Cell smart tags (after ignoredErrors per XSD sequence)\n if (opts.smartTags && opts.smartTags.length > 0) {\n const stParts: string[] = [\"<smartTags>\"];\n for (const cst of opts.smartTags) {\n stParts.push(`<cellSmartTags r=\"${escapeXml(cst.reference)}\">`);\n for (const st of cst.smartTags) {\n const stAttrs: string[] = [`type=\"${st.type}\"`];\n if (st.deleted) stAttrs.push('deleted=\"1\"');\n if (st.xmlBased) stAttrs.push('xmlBased=\"1\"');\n const prXml = st.properties\n ? st.properties\n .map(\n (pr) => `<cellSmartTagPr key=\"${escapeXml(pr.key)}\" val=\"${escapeXml(pr.val)}\"/>`,\n )\n .join(\"\")\n : \"\";\n stParts.push(\n prXml\n ? `<cellSmartTag ${stAttrs.join(\" \")}>${prXml}</cellSmartTag>`\n : `<cellSmartTag ${stAttrs.join(\" \")}/>`,\n );\n }\n stParts.push(\"</cellSmartTags>\");\n }\n stParts.push(\"</smartTags>\");\n p.push(stParts.join(\"\"));\n }\n\n // Drawing / legacy drawing / table parts placeholders — the compiler owns\n // these parts' relationships; it replaces the markers it needs and strips\n // the rest, so the sheet-level order lives here in one place.\n p.push(\"<!--DRAWING-->\");\n p.push(\"<!--LEGACY_DRAWING-->\");\n\n // Legacy drawing in header/footer\n if (opts.legacyDrawingHF) {\n p.push(`<legacyDrawingHF r:id=\"${escapeXml(opts.legacyDrawingHF)}\"/>`);\n }\n\n // Drawing in header/footer (after legacyDrawingHF per XSD sequence)\n if (opts.drawingHF) {\n const dhf = opts.drawingHF;\n const dhfAttrs: Record<string, string | number | boolean | undefined> = { \"r:id\": dhf.rId };\n if (dhf.lho !== undefined) dhfAttrs.lho = dhf.lho;\n if (dhf.lhe !== undefined) dhfAttrs.lhe = dhf.lhe;\n if (dhf.lhf !== undefined) dhfAttrs.lhf = dhf.lhf;\n if (dhf.cho !== undefined) dhfAttrs.cho = dhf.cho;\n if (dhf.che !== undefined) dhfAttrs.che = dhf.che;\n if (dhf.chf !== undefined) dhfAttrs.chf = dhf.chf;\n if (dhf.rho !== undefined) dhfAttrs.rho = dhf.rho;\n if (dhf.rhe !== undefined) dhfAttrs.rhe = dhf.rhe;\n if (dhf.rhf !== undefined) dhfAttrs.rhf = dhf.rhf;\n if (dhf.lfo !== undefined) dhfAttrs.lfo = dhf.lfo;\n if (dhf.lfe !== undefined) dhfAttrs.lfe = dhf.lfe;\n if (dhf.lff !== undefined) dhfAttrs.lff = dhf.lff;\n if (dhf.cfo !== undefined) dhfAttrs.cfo = dhf.cfo;\n if (dhf.cfe !== undefined) dhfAttrs.cfe = dhf.cfe;\n if (dhf.cff !== undefined) dhfAttrs.cff = dhf.cff;\n if (dhf.rfo !== undefined) dhfAttrs.rfo = dhf.rfo;\n if (dhf.rfe !== undefined) dhfAttrs.rfe = dhf.rfe;\n if (dhf.rff !== undefined) dhfAttrs.rff = dhf.rff;\n p.push(selfCloseElement(\"drawingHF\", attrs(dhfAttrs)));\n }\n\n // Background picture placeholder — compiler replaces with <picture r:id=\"rIdN\"/>\n if (opts.backgroundImage) {\n p.push(\"<!--BACKGROUND_PICTURE-->\");\n }\n\n /** CT_Marker corner inside an objectPr/controlPr anchor. */\n function anchorMarkerXml(tag: string, m: AnchorMarkerOptions): string {\n return (\n `<${tag}><xdr:col>${m.col}</xdr:col><xdr:colOff>${m.colOff ?? 0}</xdr:colOff>` +\n `<xdr:row>${m.row}</xdr:row><xdr:rowOff>${m.rowOff ?? 0}</xdr:rowOff></${tag}>`\n );\n }\n\n /** anchor element inside objectPr/controlPr (from/to corners, 0-based). */\n function embeddedAnchorXml(anchor: ObjectAnchorOptions): string {\n // The worksheet root does not declare xdr:, so the anchor declares it\n // locally — the marker children (xdr:col…) stay well-formed.\n const XDR_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\n const attrs = [\n `xmlns:xdr=\"${XDR_NS}\"`,\n ...(anchor.moveWithCells ? ['moveWithCells=\"1\"'] : []),\n ...(anchor.sizeWithCells ? ['sizeWithCells=\"1\"'] : []),\n ].join(\" \");\n return `<anchor ${attrs}>${anchorMarkerXml(\"from\", anchor.from)}${anchorMarkerXml(\"to\", anchor.to)}</anchor>`;\n }\n\n /**\n * mc:AlternateContent wrapper (Excel 2010+ form for worksheet OLE objects and\n * ActiveX controls): the Choice carries the full element, the Fallback the\n * bare one for older readers. Namespace declarations stay local so the\n * wrapper works regardless of what the worksheet root declares.\n */\n function wrapAlternateContent(\n choiceXml: string,\n fallbackXml: string,\n wrapped: boolean | undefined,\n ): string {\n if (!wrapped) return choiceXml;\n const AC_NS = \"http://schemas.openxmlformats.org/markup-compatibility/2006\";\n const X14_NS = \"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\";\n return (\n `<mc:AlternateContent xmlns:mc=\"${AC_NS}\">` +\n `<mc:Choice xmlns:x14=\"${X14_NS}\" Requires=\"x14\">${choiceXml}</mc:Choice>` +\n `<mc:Fallback>${fallbackXml}</mc:Fallback>` +\n `</mc:AlternateContent>`\n );\n }\n\n // OLE objects (CT_OleObjects, after picture per XSD sequence)\n if (oleObjects.length > 0) {\n const oleParts: string[] = [\"<oleObjects>\"];\n for (const ole of oleObjects) {\n const oleAttrs: string[] = [`shapeId=\"${ole.shapeId}\"`];\n if (ole.progId) oleAttrs.push(`progId=\"${escapeXml(ole.progId)}\"`);\n if (ole.dvAspect && ole.dvAspect !== \"DVASPECT_CONTENT\")\n oleAttrs.push(`dvAspect=\"${ole.dvAspect}\"`);\n if (ole.link) oleAttrs.push(`link=\"${escapeXml(ole.link)}\"`);\n if (ole.oleUpdate) oleAttrs.push(`oleUpdate=\"${ole.oleUpdate}\"`);\n if (ole.autoLoad) oleAttrs.push('autoLoad=\"1\"');\n if (ole.rId) oleAttrs.push(`r:id=\"${escapeXml(ole.rId)}\"`);\n // objectPr (CT_ObjectPr, optional child)\n let innerXml: string;\n if (ole.objectPr) {\n const opr = ole.objectPr;\n const oprAttrs: string[] = [];\n if (opr.locked === false) oprAttrs.push('locked=\"0\"');\n if (opr.defaultSize === false) oprAttrs.push('defaultSize=\"0\"');\n if (opr.print === false) oprAttrs.push('print=\"0\"');\n if (opr.disabled) oprAttrs.push('disabled=\"1\"');\n if (opr.uiObject) oprAttrs.push('uiObject=\"1\"');\n if (opr.autoFill === false) oprAttrs.push('autoFill=\"0\"');\n if (opr.autoLine === false) oprAttrs.push('autoLine=\"0\"');\n if (opr.autoPict === false) oprAttrs.push('autoPict=\"0\"');\n if (opr.macro) oprAttrs.push(`macro=\"${escapeXml(opr.macro)}\"`);\n if (opr.altText) oprAttrs.push(`altText=\"${escapeXml(opr.altText)}\"`);\n if (opr.dde) oprAttrs.push('dde=\"1\"');\n if (opr.iconRid) oprAttrs.push(`r:id=\"${escapeXml(opr.iconRid)}\"`);\n const anchorXml = opr.anchor ? embeddedAnchorXml(opr.anchor) : \"\";\n innerXml = `<objectPr${oprAttrs.length ? \" \" + oprAttrs.join(\" \") : \"\"}>${anchorXml}</objectPr>`;\n } else {\n innerXml = \"\";\n }\n const full = innerXml\n ? `<oleObject ${oleAttrs.join(\" \")}>${innerXml}</oleObject>`\n : `<oleObject ${oleAttrs.join(\" \")}/>`;\n oleParts.push(\n wrapAlternateContent(full, `<oleObject ${oleAttrs.join(\" \")}/>`, ole.alternateContent),\n );\n }\n oleParts.push(\"</oleObjects>\");\n p.push(oleParts.join(\"\"));\n }\n\n // Controls (CT_Controls, after oleObjects per XSD sequence)\n if (controls.length > 0) {\n const ctrlParts: string[] = [\"<controls>\"];\n for (const c of controls) {\n const cAttrs: string[] = [`shapeId=\"${c.shapeId}\"`, `r:id=\"${escapeXml(c.rId)}\"`];\n if (c.name) cAttrs.push(`name=\"${escapeXml(c.name)}\"`);\n // controlPr (optional)\n const prAttrs: string[] = [];\n if (c.locked === false) prAttrs.push('locked=\"0\"');\n if (c.uiObject) prAttrs.push('uiObject=\"1\"');\n if (c.recalcAlways) prAttrs.push('recalcAlways=\"1\"');\n if (c.linkedCell) prAttrs.push(`linkedCell=\"${escapeXml(c.linkedCell)}\"`);\n if (c.listFillRange) prAttrs.push(`listFillRange=\"${escapeXml(c.listFillRange)}\"`);\n if (c.formula) prAttrs.push(`cf=\"${escapeXml(c.formula)}\"`);\n if (c.defaultSize === false) prAttrs.push('defaultSize=\"0\"');\n if (c.autoLine === false) prAttrs.push('autoLine=\"0\"');\n if (c.autoPict === false) prAttrs.push('autoPict=\"0\"');\n if (c.iconRid) prAttrs.push(`r:id=\"${escapeXml(c.iconRid)}\"`);\n const anchorXml = c.anchor ? embeddedAnchorXml(c.anchor) : \"\";\n const full =\n prAttrs.length > 0 || anchorXml\n ? `<control ${cAttrs.join(\" \")}><controlPr${prAttrs.length ? \" \" + prAttrs.join(\" \") : \"\"}>${anchorXml}</controlPr></control>`\n : `<control ${cAttrs.join(\" \")}/>`;\n ctrlParts.push(\n wrapAlternateContent(full, `<control ${cAttrs.join(\" \")}/>`, c.alternateContent),\n );\n }\n ctrlParts.push(\"</controls>\");\n p.push(ctrlParts.join(\"\"));\n }\n\n // Web publish items (CT_WebPublishItems, after controls per XSD sequence)\n if (webPublishItems.length > 0) {\n const wpParts: string[] = [`<webPublishItems count=\"${webPublishItems.length}\">`];\n for (const wpi of webPublishItems) {\n const wpiAttrs: string[] = [\n `id=\"${wpi.id}\"`,\n `divId=\"${escapeXml(wpi.divId)}\"`,\n `sourceType=\"${wpi.sourceType}\"`,\n `destinationFile=\"${escapeXml(wpi.destinationFile)}\"`,\n ];\n if (wpi.sourceRef) wpiAttrs.push(`sourceRef=\"${escapeXml(wpi.sourceRef)}\"`);\n if (wpi.sourceObject) wpiAttrs.push(`sourceObject=\"${escapeXml(wpi.sourceObject)}\"`);\n if (wpi.title) wpiAttrs.push(`title=\"${escapeXml(wpi.title)}\"`);\n if (wpi.autoRepublish) wpiAttrs.push('autoRepublish=\"1\"');\n wpParts.push(`<webPublishItem ${wpiAttrs.join(\" \")}/>`);\n }\n wpParts.push(\"</webPublishItems>\");\n p.push(wpParts.join(\"\"));\n }\n\n p.push(\"<!--TABLE_PARTS-->\");\n\n // Extension list (extLst, last per XSD sequence)\n if (opts.ext) {\n p.push(`<extLst>${opts.ext}</extLst>`);\n }\n\n p.push(\"</worksheet>\");\n return p.join(\"\");\n}\n\n// ── Stringify helpers ──\n\nfunction buildCfvoXml(cfvo: CfvoOptions): string {\n const a: Record<string, string | number | boolean | undefined> = { type: cfvo.type };\n if (cfvo.val !== undefined) a.val = cfvo.val;\n if (cfvo.gte === false) a.gte = 0;\n return `<cfvo${attrs(a)}/>`;\n}\n\n/** Serialize a CT_Color by its channel — rgb is the only one with a fixed width. */\nfunction buildCfColorXml(color: CfColorOptions): string {\n if (color.rgb !== undefined) return `<color rgb=\"FF${color.rgb}\"/>`;\n const a: Record<string, string | number | undefined> = {};\n if (color.theme !== undefined) {\n a.theme = color.theme;\n if (color.tint !== undefined) a.tint = color.tint;\n }\n if (color.indexed !== undefined) a.indexed = color.indexed;\n return `<color${attrs(a)}/>`;\n}\n\nfunction buildSheetViewAttrs(sv?: SheetViewOptions): string {\n const svMap: Record<string, string | number | boolean | undefined> = {\n workbookViewId: 0,\n };\n if (sv?.tabSelected !== undefined) svMap.tabSelected = sv.tabSelected ? 1 : 0;\n // Omit tabSelected otherwise: only the active sheet carries it (Excel uses\n // workbookView activeTab), so injecting it on every sheet marks all active.\n if (sv?.showGridLines === false) svMap.showGridLines = 0;\n if (sv?.showRowColHeaders === false) svMap.showRowColHeaders = 0;\n if (sv?.showZeros === false) svMap.showZeros = 0;\n if (sv?.zoomScale !== undefined) svMap.zoomScale = sv.zoomScale;\n if (sv?.rightToLeft) svMap.rightToLeft = 1;\n if (sv?.windowProtection) svMap.windowProtection = 1;\n if (sv?.showFormulas) svMap.showFormulas = 1;\n if (sv?.showRuler === false) svMap.showRuler = 0;\n if (sv?.showOutlineSymbols === false) svMap.showOutlineSymbols = 0;\n if (sv?.defaultGridColor === false) svMap.defaultGridColor = 0;\n if (sv?.showWhiteSpace === false) svMap.showWhiteSpace = 0;\n if (sv?.view) svMap.view = sv.view;\n if (sv?.topLeftCell) svMap.topLeftCell = sv.topLeftCell;\n if (sv?.colorId !== undefined) svMap.colorId = sv.colorId;\n if (sv?.zoomScaleNormal !== undefined) svMap.zoomScaleNormal = sv.zoomScaleNormal;\n if (sv?.zoomScaleSheetLayoutView !== undefined)\n svMap.zoomScaleSheetLayoutView = sv.zoomScaleSheetLayoutView;\n if (sv?.zoomScalePageLayoutView !== undefined)\n svMap.zoomScalePageLayoutView = sv.zoomScalePageLayoutView;\n return attrs(svMap);\n}\n\nfunction buildPivotSelectionXml(ps: PivotSelectionOptions): string {\n const psAttrs: string[] = [];\n if (ps.pane) psAttrs.push(`pane=\"${ps.pane}\"`);\n if (ps.showHeader) psAttrs.push('showHeader=\"1\"');\n if (ps.label) psAttrs.push('label=\"1\"');\n if (ps.data) psAttrs.push('data=\"1\"');\n if (ps.extendable) psAttrs.push('extendable=\"1\"');\n if (ps.count !== undefined) psAttrs.push(`count=\"${ps.count}\"`);\n if (ps.axis) psAttrs.push(`axis=\"${ps.axis}\"`);\n if (ps.dimension !== undefined) psAttrs.push(`dimension=\"${ps.dimension}\"`);\n if (ps.start !== undefined) psAttrs.push(`start=\"${ps.start}\"`);\n if (ps.min !== undefined) psAttrs.push(`min=\"${ps.min}\"`);\n if (ps.max !== undefined) psAttrs.push(`max=\"${ps.max}\"`);\n if (ps.activeRow !== undefined) psAttrs.push(`activeRow=\"${ps.activeRow}\"`);\n if (ps.activeCol !== undefined) psAttrs.push(`activeCol=\"${ps.activeCol}\"`);\n if (ps.previousRow !== undefined) psAttrs.push(`previousRow=\"${ps.previousRow}\"`);\n if (ps.previousCol !== undefined) psAttrs.push(`previousCol=\"${ps.previousCol}\"`);\n if (ps.click !== undefined) psAttrs.push(`click=\"${ps.click}\"`);\n if (ps.rId) psAttrs.push(`r:id=\"${escapeXml(ps.rId)}\"`);\n const areaXml = ps.pivotArea ? buildPivotAreaXml(ps.pivotArea) : \"\";\n const attrStr = psAttrs.join(\" \");\n return areaXml\n ? `<pivotSelection ${attrStr}>${areaXml}</pivotSelection>`\n : `<pivotSelection ${attrStr}/>`;\n}\n\nfunction buildSelectionXml(sel: SelectionOptions): string {\n const selAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sel.pane) selAttrs.pane = sel.pane;\n if (sel.activeCell) selAttrs.activeCell = sel.activeCell;\n if (sel.activeCellId !== undefined) selAttrs.activeCellId = sel.activeCellId;\n if (sel.sqref) selAttrs.sqref = sel.sqref;\n return `<selection${attrs(selAttrs)}/>`;\n}\n\nfunction buildFormulaString(cellFormula: string | FormulaOptions): string {\n const fOpts = typeof cellFormula === \"string\" ? { formula: cellFormula } : cellFormula;\n const fAttrs: Record<string, string | number | boolean | undefined> = {};\n if (fOpts.type && fOpts.type !== FormulaType.NORMAL) fAttrs.t = fOpts.type;\n if (fOpts.reference) fAttrs.ref = fOpts.reference;\n if (fOpts.sharedIndex !== undefined) fAttrs.si = fOpts.sharedIndex;\n if (fOpts.aca) fAttrs.aca = 1;\n if (fOpts.dt2D) fAttrs.dt2D = 1;\n if (fOpts.dtr) fAttrs.dtr = 1;\n if (fOpts.del1) fAttrs.del1 = 1;\n if (fOpts.del2) fAttrs.del2 = 1;\n if (fOpts.inputCell1) fAttrs.r1 = fOpts.inputCell1;\n if (fOpts.inputCell2) fAttrs.r2 = fOpts.inputCell2;\n if (fOpts.calculateCell) fAttrs.ca = 1;\n if (fOpts.arrayContext) fAttrs.bx = 1;\n\n const hasContent = fOpts.formula !== undefined && fOpts.formula !== \"\";\n\n if (hasContent) {\n return `<f${attrs(fAttrs)}>${escapeXml(fOpts.formula)}</f>`;\n }\n if (Object.keys(fAttrs).length > 0) {\n return selfCloseElement(\"f\", attrs(fAttrs));\n }\n return \"\";\n}\n\n/**\n * Serialize the sheetData rows into `out` (strings appended in order, caller\n * wraps with `<sheetData>`/`</sheetData>`). Shared by the full stringify and\n * the streaming writer so the row/cell serialization cannot drift — passing\n * `sharedStrings: undefined` switches string cells to `t=\"inlineStr\"`, the\n * constant-memory mode used when streaming. `startRowNumber` seeds the\n * implicit row numbering for callers streaming a slice of the full row list.\n */\nexport function appendSheetDataRows(\n rows: RowOptions[],\n out: string[],\n sharedStrings: SharedStrings | undefined,\n styles: Styles | undefined,\n startRowNumber = 1,\n): void {\n // Indexed loops (not `entries()` destructuring) — at 100k rows × 20 cells the\n // per-iteration [index, value] entry arrays were a dominant Scavenge source.\n for (let i = 0; i < rows.length; i++) {\n const rowOpts = rows[i]!;\n const rowNumber = rowOpts.rowNumber ?? startRowNumber + i;\n // Flat attribute assembly (no per-row Record + for-in) keeps young-gen\n // pressure near zero at 100k+ rows.\n let rowAttr = ` r=\"${rowNumber}\"`;\n if (rowOpts.height !== undefined) {\n rowAttr += ` ht=\"${convertToPt(rowOpts.height)}\" customHeight=\"1\"`;\n }\n if (rowOpts.hidden) rowAttr += ' hidden=\"1\"';\n if (rowOpts.spans) rowAttr += ` spans=\"${rowOpts.spans}\"`;\n let hasStyle = false;\n if (typeof rowOpts.style === \"number\") {\n // Round-trip fallback: emit the carried cellXfs index verbatim.\n rowAttr += ` s=\"${rowOpts.style}\"`;\n hasStyle = true;\n } else if (rowOpts.style !== undefined && styles) {\n rowAttr += ` s=\"${styles.register(rowOpts.style)}\"`;\n hasStyle = true;\n }\n // A row style only takes effect when customFormat flags it (Excel always\n // pairs @s with customFormat=\"1\").\n if (rowOpts.customFormat || hasStyle) rowAttr += ' customFormat=\"1\"';\n if (rowOpts.thickTop) rowAttr += ' thickTop=\"1\"';\n if (rowOpts.thickBot) rowAttr += ' thickBot=\"1\"';\n if (rowOpts.phonetic) rowAttr += ' ph=\"1\"';\n if (rowOpts.outlineLevel !== undefined) rowAttr += ` outlineLevel=\"${rowOpts.outlineLevel}\"`;\n if (rowOpts.collapsed) rowAttr += ' collapsed=\"1\"';\n\n const cells = rowOpts.cells;\n if (cells) {\n out.push(`<row${rowAttr}>`);\n for (let j = 0; j < cells.length; j++) {\n const cell = cells[j]!;\n const ref = cell.reference ?? defaultCellRef(rowNumber, j + 1);\n const cellStr = buildCellString(ref, cell, sharedStrings, styles);\n if (cellStr) out.push(cellStr);\n }\n out.push(\"</row>\");\n } else {\n out.push(`<row${rowAttr}/>`);\n }\n }\n}\n\n/**\n * Replace the first occurrence of a placeholder marker inside the sheet tail\n * region (between the sheetData close tag and `</worksheet>`). stringify emits\n * `<sheetData></sheetData>` even when empty, so the anchor always hits near the\n * end of the string, and cell text is XML-escaped so marker bytes cannot occur\n * inside the sheet body — scanning the small tail avoids walking a multi-MB\n * sheet both for hits and for misses. A missing marker returns the input\n * unchanged with zero copying.\n */\nexport function editSheetTailMarker(xml: string, marker: string, replacement: string): string {\n const tailStart = findSheetTailStart(xml);\n if (tailStart === -1) return xml;\n const tail = xml.slice(tailStart);\n const at = tail.indexOf(marker);\n if (at === -1) return xml;\n return xml.slice(0, tailStart) + tail.slice(0, at) + replacement + tail.slice(at + marker.length);\n}\n\nfunction findSheetTailStart(xml: string): number {\n // Backward search hits immediately: the close tag is near the string end.\n // The self-closing form only guards a future empty-sheet emission change.\n let at = xml.lastIndexOf(\"</sheetData>\");\n if (at === -1) at = xml.lastIndexOf(\"<sheetData/>\");\n return at;\n}\n\n/**\n * Strip the placeholder comments stringifyWorksheet emits for parts whose\n * relationships the compiler owns (drawing, legacyDrawing, tableParts,\n * background picture). The compiler replaces the ones it needs and strips the\n * rest; callers that write worksheet XML without the compiler (patch\n * append/replace) always strip.\n */\nexport function stripWorksheetPlaceholders(xml: string): string {\n let out = editSheetTailMarker(xml, \"<!--BACKGROUND_PICTURE-->\", \"\");\n out = editSheetTailMarker(out, \"<!--TABLE_PARTS-->\", \"\");\n out = editSheetTailMarker(out, \"<!--LEGACY_DRAWING-->\", \"\");\n return editSheetTailMarker(out, \"<!--DRAWING-->\", \"\");\n}\n\nfunction buildCellString(\n ref: string,\n cell: CellOptions,\n sharedStrings?: SharedStrings,\n styles?: Styles,\n): string {\n // Flat attribute assembly (r → s → t, matching the former Record insertion\n // order byte-for-byte). No per-cell Record + for-in enumeration — at 2M cells\n // the dynamic-shape objects were a dominant Scavenge source.\n const rAttr = ` r=\"${ref}\"`;\n let sAttr = \"\";\n if (typeof cell.style === \"number\") {\n // Round-trip fallback: emit the carried cellXfs index verbatim.\n sAttr = ` s=\"${cell.style}\"`;\n } else if (cell.style !== undefined && styles) {\n sAttr = ` s=\"${styles.register(cell.style)}\"`;\n }\n let mdAttr = \"\";\n if (cell.cellMetadataId !== undefined) mdAttr += ` cm=\"${cell.cellMetadataId}\"`;\n if (cell.valueMetadataId !== undefined) mdAttr += ` vm=\"${cell.valueMetadataId}\"`;\n\n const value = cell.value;\n\n // Error value (t=\"e\") — emitted verbatim, never routed into the SST.\n if (cell.error !== undefined) {\n const errorV = cell.formula\n ? `${buildFormulaString(cell.formula)}<v>${escapeXml(cell.error)}</v>`\n : `<v>${escapeXml(cell.error)}</v>`;\n return `<c${rAttr}${sAttr}${mdAttr} t=\"e\">${errorV}</c>`;\n }\n\n // Formula path — formula takes precedence; value is the cached result.\n if (cell.formula) {\n const fStr = buildFormulaString(cell.formula);\n if (value === null || value === undefined) {\n return `<c${rAttr}${sAttr}${mdAttr}>${fStr}</c>`;\n }\n let vStr = \"\";\n let tAttr = \"\";\n if (typeof value === \"number\") {\n vStr = `<v>${value}</v>`;\n } else if (typeof value === \"boolean\") {\n tAttr = ' t=\"b\"';\n vStr = `<v>${value ? 1 : 0}</v>`;\n } else if (typeof value === \"string\") {\n tAttr = ' t=\"str\"';\n vStr = `<v>${escapeXml(value)}</v>`;\n } else if (value instanceof Date) {\n vStr = `<v>${dateToSerialNumber(value)}</v>`;\n }\n if (vStr) {\n return `<c${rAttr}${sAttr}${mdAttr}${tAttr}>${fStr}${vStr}</c>`;\n }\n return `<c${rAttr}${sAttr}${mdAttr}>${fStr}</c>`;\n }\n\n if (value === null || value === undefined) {\n if (cell.reference !== undefined || cell.style !== undefined || mdAttr) {\n return `<c${rAttr}${sAttr}${mdAttr}/>`;\n }\n return \"\";\n }\n\n // Rich text value (RichTextOptions)\n if (typeof value === \"object\" && !(value instanceof Date)) {\n if (sharedStrings) {\n const idx = sharedStrings.registerRich(value);\n return `<c${rAttr}${sAttr}${mdAttr} t=\"s\"><v>${idx}</v></c>`;\n }\n return `<c${rAttr}${sAttr}${mdAttr} t=\"inlineStr\"><is>${buildRstXml(value)}</is></c>`;\n }\n\n if (typeof value === \"string\") {\n if (sharedStrings) {\n const idx = sharedStrings.register(value);\n return `<c${rAttr}${sAttr}${mdAttr} t=\"s\"><v>${idx}</v></c>`;\n }\n return `<c${rAttr}${sAttr}${mdAttr} t=\"inlineStr\"><is>${tElement(value)}</is></c>`;\n }\n\n if (typeof value === \"number\") {\n return `<c${rAttr}${sAttr}${mdAttr}><v>${value}</v></c>`;\n }\n\n if (typeof value === \"boolean\") {\n return `<c${rAttr}${sAttr}${mdAttr} t=\"b\"><v>${value ? 1 : 0}</v></c>`;\n }\n\n if (value instanceof Date) {\n const serial = dateToSerialNumber(value);\n return `<c${rAttr}${sAttr}${mdAttr}><v>${serial}</v></c>`;\n }\n\n return \"\";\n}\n\nfunction defaultCellRef(row: number, col: number): string {\n return columnToLetter(col) + row;\n}\n\n// ── Shared page-setup helpers (worksheet / dialogsheet / chartsheet) ──\n\n/** Stringify CT_PageSetup attributes (worksheet + dialogsheet pageSetup). */\nexport function stringifyPageSetupXml(ps: PageSetupOptions): string {\n const psAttrs: Record<string, string | number | boolean | undefined> = {};\n if (ps.paperSize !== undefined) psAttrs.paperSize = ps.paperSize;\n if (ps.orientation && ps.orientation !== \"default\") psAttrs.orientation = ps.orientation;\n if (ps.scale !== undefined) psAttrs.scale = ps.scale;\n if (ps.fitToWidth !== undefined) psAttrs.fitToWidth = ps.fitToWidth;\n if (ps.fitToHeight !== undefined) psAttrs.fitToHeight = ps.fitToHeight;\n if (ps.pageOrder && ps.pageOrder !== \"downThenOver\") psAttrs.pageOrder = ps.pageOrder;\n if (ps.useFirstPageNumber) psAttrs.useFirstPageNumber = 1;\n if (ps.firstPageNumber !== undefined) psAttrs.firstPageNumber = ps.firstPageNumber;\n // ST_PositiveUniversalMeasure requires a unit suffix; a bare number means mm.\n if (ps.paperHeight !== undefined)\n psAttrs.paperHeight =\n typeof ps.paperHeight === \"number\" ? `${ps.paperHeight}mm` : ps.paperHeight;\n if (ps.paperWidth !== undefined)\n psAttrs.paperWidth = typeof ps.paperWidth === \"number\" ? `${ps.paperWidth}mm` : ps.paperWidth;\n // XSD default true — emit only the explicit-false form (0).\n if (ps.usePrinterDefaults === false) psAttrs.usePrinterDefaults = 0;\n if (ps.blackAndWhite) psAttrs.blackAndWhite = 1;\n if (ps.draft) psAttrs.draft = 1;\n if (ps.cellComments && ps.cellComments !== \"none\") psAttrs.cellComments = ps.cellComments;\n if (ps.errors && ps.errors !== \"displayed\") psAttrs.errors = ps.errors;\n if (ps.horizontalDpi !== undefined) psAttrs.horizontalDpi = ps.horizontalDpi;\n if (ps.verticalDpi !== undefined) psAttrs.verticalDpi = ps.verticalDpi;\n if (ps.copies !== undefined) psAttrs.copies = ps.copies;\n if (ps.printerSettingsRId) psAttrs[\"r:id\"] = ps.printerSettingsRId;\n return selfCloseElement(\"pageSetup\", attrs(psAttrs));\n}\n\n/** Stringify a CT_PrintOptions element (worksheet + dialogsheet). */\nexport function stringifyPrintOptionsXml(po: PrintOptions): string {\n const poAttrs: Record<string, string | number | boolean | undefined> = {};\n if (po.horizontalCentered) poAttrs.horizontalCentered = 1;\n if (po.verticalCentered) poAttrs.verticalCentered = 1;\n if (po.headings) poAttrs.headings = 1;\n if (po.gridLines) poAttrs.gridLines = 1;\n if (po.gridLinesSet === false) poAttrs.gridLinesSet = 0;\n return selfCloseElement(\"printOptions\", attrs(poAttrs));\n}\n\n/** Stringify a CT_HeaderFooter element; undefined when it carries no content. */\nexport function stringifyHeaderFooterXml(hf: HeaderFooterOptions): string | undefined {\n const hfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (hf.differentOddEven) hfAttrs.differentOddEven = 1;\n if (hf.differentFirst) hfAttrs.differentFirst = 1;\n if (hf.scaleWithDoc === false) hfAttrs.scaleWithDoc = 0;\n if (hf.alignWithMargins === false) hfAttrs.alignWithMargins = 0;\n const inner: string[] = [];\n if (hf.oddHeader) inner.push(`<oddHeader>${escapeXml(hf.oddHeader)}</oddHeader>`);\n if (hf.oddFooter) inner.push(`<oddFooter>${escapeXml(hf.oddFooter)}</oddFooter>`);\n if (hf.evenHeader) inner.push(`<evenHeader>${escapeXml(hf.evenHeader)}</evenHeader>`);\n if (hf.evenFooter) inner.push(`<evenFooter>${escapeXml(hf.evenFooter)}</evenFooter>`);\n if (hf.firstHeader) inner.push(`<firstHeader>${escapeXml(hf.firstHeader)}</firstHeader>`);\n if (hf.firstFooter) inner.push(`<firstFooter>${escapeXml(hf.firstFooter)}</firstFooter>`);\n if (inner.length > 0) {\n return `<headerFooter${attrs(hfAttrs)}>${inner.join(\"\")}</headerFooter>`;\n }\n // Any explicit attribute (including scaleWithDoc/alignWithMargins = false)\n // keeps the element — dropping it would silently revert those to defaults.\n if (Object.keys(hfAttrs).length > 0) {\n return selfCloseElement(\"headerFooter\", attrs(hfAttrs));\n }\n return undefined;\n}\n\n/** Stringify a CT_SheetProtection element (worksheet + dialogsheet). */\nexport function stringifySheetProtectionXml(prot: SheetProtectionOptions): string {\n const protAttrs: Record<string, string | number | boolean | undefined> = {};\n if (prot.password) protAttrs.password = hashPassword(prot.password);\n // Auto-derive modern hash when password provided without explicit hashValue\n let derived: ReturnType<typeof derivePasswordHash> | undefined;\n if (prot.password !== undefined && prot.hashValue === undefined) {\n derived = derivePasswordHash(prot.password);\n }\n protAttrs.algorithmName = prot.algorithmName ?? derived?.algorithmName;\n protAttrs.hashValue = prot.hashValue ?? derived?.hashValue;\n protAttrs.saltValue = prot.saltValue ?? derived?.saltValue;\n if (prot.spinCount !== undefined) protAttrs.spinCount = prot.spinCount;\n else if (derived) protAttrs.spinCount = derived.spinCount;\n if (prot.sheet) protAttrs.sheet = 1;\n if (prot.objects) protAttrs.objects = 1;\n if (prot.scenarios) protAttrs.scenarios = 1;\n if (prot.formatCells === false) protAttrs.formatCells = 0;\n if (prot.formatColumns === false) protAttrs.formatColumns = 0;\n if (prot.formatRows === false) protAttrs.formatRows = 0;\n if (prot.insertColumns === false) protAttrs.insertColumns = 0;\n if (prot.insertRows === false) protAttrs.insertRows = 0;\n if (prot.insertHyperlinks === false) protAttrs.insertHyperlinks = 0;\n if (prot.deleteColumns === false) protAttrs.deleteColumns = 0;\n if (prot.deleteRows === false) protAttrs.deleteRows = 0;\n if (prot.selectLockedCells) protAttrs.selectLockedCells = 1;\n if (prot.sort === false) protAttrs.sort = 0;\n if (prot.autoFilter === false) protAttrs.autoFilter = 0;\n if (prot.pivotTables === false) protAttrs.pivotTables = 0;\n if (prot.selectUnlockedCells) protAttrs.selectUnlockedCells = 1;\n return selfCloseElement(\"sheetProtection\", attrs(protAttrs));\n}\n","/**\n * Calculation Chain types and descriptor.\n *\n * Reference: OOXML transitional, sml.xsd, CT_CalcChain / CT_CalcCell\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs } from \"@office-open/xml\";\n\n// ── Types ──\n\n/** One calc-chain entry (xl/calcChain.xml c:r — a formula cell in calc order). */\nexport interface CalcCell {\n /** Cell reference, e.g. \"A1\" */\n reference: string;\n /** Sheet index (1-based) */\n sheetIndex: number;\n /** Array formula */\n array?: boolean;\n /** Child chain — calculations farmed out to another thread (CT_CalcCell `@l`) */\n childChain?: boolean;\n}\n\nexport interface CalcChainOptions {\n cells: CalcCell[];\n}\n\n// ── Descriptor ──\n\nexport const calcChainDesc: CustomDescriptor<CalcChainOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const parts: string[] = [\n '<calcChain xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n for (const cell of opts.cells) {\n const cellAttrs: Record<string, string | number | boolean> = {\n r: cell.reference,\n i: cell.sheetIndex,\n };\n if (cell.array) cellAttrs.a = true;\n if (cell.childChain) cellAttrs.l = true;\n parts.push(`<c${attrs(cellAttrs)}/>`);\n }\n parts.push(\"</calcChain>\");\n return parts.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<CalcChainOptions> = {};\n const cells: CalcCell[] = [];\n for (const child of el.elements ?? []) {\n if (child.name !== \"c\") continue;\n const r = child.attributes?.[\"r\"];\n const i = child.attributes?.[\"i\"];\n if (r && i) {\n const cell: CalcCell = {\n reference: String(r),\n sheetIndex: Number(i),\n };\n if (child.attributes?.[\"a\"]) cell.array = true;\n if (parseOnOff(child.attributes?.[\"l\"])) cell.childChain = true;\n cells.push(cell);\n }\n }\n result.cells = cells;\n return result as CalcChainOptions;\n },\n};\n","/**\n * Chartsheet types and descriptor for SpreadsheetML documents.\n *\n * A chartsheet is a worksheet that contains only a chart (no cells).\n *\n * Reference: OOXML transitional, sml.xsd, CT_Chartsheet\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { derivePasswordHash } from \"@office-open/core\";\nimport type { PositiveUniversalMeasure } from \"@office-open/core\";\nimport { convertToInch } from \"@office-open/core\";\nimport type { ArgbHexColor, Base64 } from \"@office-open/core\";\nimport type { ChartSpaceOptions } from \"@office-open/core/chart\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { GraphicFrameLockingOptions } from \"@office-open/core/drawing\";\nimport { attrs, attr, attrMeasure, attrNum, escapeXml, findChild } from \"@office-open/xml\";\nimport { hashPassword } from \"@util/index\";\n\nimport { parseHeaderFooterEl } from \"./worksheet/descriptor\";\nimport { stringifyHeaderFooterXml } from \"./worksheet/stringify\";\nimport type { HeaderFooterOptions, PageMarginsOptions, PageOrientation } from \"./worksheet/types\";\n\n// ── Types ──\n\n/**\n * Chartsheet page setup (CT_CsPageSetup) — the chartsheet-specific variant of\n * pageSetup: paper size/orientation plus printer flags, no scale/fit fields.\n */\nexport interface ChartsheetPageSetup {\n /** Paper size (1=Letter, 9=A4, etc.) */\n paperSize?: number;\n /** Paper height (ST_PositiveUniversalMeasure) */\n paperHeight?: number | PositiveUniversalMeasure;\n /** Paper width (ST_PositiveUniversalMeasure) */\n paperWidth?: number | PositiveUniversalMeasure;\n firstPageNumber?: number;\n /** Orientation (ST_Orientation) */\n orientation?: PageOrientation;\n /** Use printer defaults (XSD default true — only false is emitted) */\n usePrinterDefaults?: boolean;\n /** Black and white printing */\n blackAndWhite?: boolean;\n /** Draft quality printing */\n draft?: boolean;\n /** Use firstPageNumber as the starting page number */\n useFirstPageNumber?: boolean;\n horizontalDpi?: number;\n verticalDpi?: number;\n /** Copies to print */\n copies?: number;\n /** Relationship ID for the printer settings part (CT_CsPageSetup `@r:id`) */\n printerSettingsRId?: string;\n}\n\nexport interface ChartsheetProtectionOptions {\n /**\n * Plain-text password — legacy Excel hash is computed automatically on\n * stringify. Authoring-only: not carried back by parse (see\n * SheetProtectionOptions); use the algorithmName quadruplet for round-trip.\n */\n password?: string;\n /** Modern encryption: algorithm name (e.g. \"SHA-512\") */\n algorithmName?: string;\n /** Modern encryption: base64-encoded hash value */\n hashValue?: Base64;\n /** Modern encryption: base64-encoded salt value */\n saltValue?: Base64;\n /** Modern encryption: spin count for hash iteration */\n spinCount?: number;\n /** Content is protected */\n content?: boolean;\n /** Objects are protected */\n objects?: boolean;\n}\n\n/** A chart sheet (xl/chartsheets/sheetN.xml) — a full-sheet chart with its own view state. */\nexport interface ChartsheetOptions {\n /** Sheet name */\n name?: string;\n /** Workbook sheet id (CT_Sheet `@sheetId`) — unique but not necessarily sequential. */\n sheetId?: number;\n /** Visibility (CT_Sheet `@state`) */\n state?: \"visible\" | \"hidden\" | \"veryHidden\";\n /** Tab color (hex ARGB, e.g. \"FF4472C4\") */\n tabColor?: ArgbHexColor;\n pageMargins?: PageMarginsOptions;\n pageSetup?: ChartsheetPageSetup;\n headerFooter?: HeaderFooterOptions;\n sheetProtection?: ChartsheetProtectionOptions;\n /** Published to server (CT_ChartsheetPr `@published`, XSD default true — only false is emitted) */\n published?: boolean;\n /** VBA code name (CT_ChartsheetPr `@codeName`) */\n codeName?: string;\n /** Zoom to fit (CT_ChartsheetView `@zoomToFit`) */\n zoomToFit?: boolean;\n /** Sheet selected state (CT_ChartsheetView `@tabSelected`, XSD default false). */\n tabSelected?: boolean;\n /** Window zoom percent (CT_ChartsheetView `@zoomScale`, default 100). */\n zoomScale?: number;\n /** Chart definition — the shared chart-space model, same shape as a worksheet chart. */\n chart?: ChartSpaceOptions;\n /** Macro reference on the chart's graphicFrame (CT_GraphicFrame/@macro). */\n macro?: string;\n /** Frame locks on the chart's graphicFrame (a:graphicFrameLocks). */\n frameLocks?: GraphicFrameLockingOptions;\n /** Chart anchor X in EMU (xdr:absoluteAnchor/xdr:pos @x) — fresh sheets anchor at origin. */\n absoluteX?: number;\n /** Chart anchor Y in EMU (xdr:absoluteAnchor/xdr:pos @y). */\n absoluteY?: number;\n /**\n * Chart width in EMU (xdr:ext @cx) — the rendered chart size on the sheet;\n * fresh sheets use the full-page default.\n */\n extentCx?: number;\n /** Chart height in EMU (xdr:ext @cy). */\n extentCy?: number;\n /** Chart frame shape id (xdr:cNvPr @id) — unique within the drawing part. */\n shapeId?: number;\n}\n\n// ── Descriptor Types ──\n\nexport interface ChartsheetDescriptorOptions extends ChartsheetOptions {\n /** Relationship ID for the drawing (set by compiler) */\n drawingRId: string;\n}\n\n// ── Descriptor ──\n\nexport const chartsheetDesc: CustomDescriptor<ChartsheetDescriptorOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<chartsheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ];\n\n // sheetPr (optional)\n if (opts.tabColor || opts.published !== undefined || opts.codeName) {\n const prAttrs: string[] = [];\n if (opts.tabColor) prAttrs.push(`<tabColor${attrs({ rgb: opts.tabColor })}/>`);\n const spAttrs: string[] = [];\n // XSD default true — emit only the explicit-false form (0).\n if (opts.published === false) spAttrs.push(' published=\"0\"');\n if (opts.codeName) spAttrs.push(` codeName=\"${escapeXml(opts.codeName)}\"`);\n p.push(`<sheetPr${spAttrs.join(\"\")}>${prAttrs.join(\"\")}</sheetPr>`);\n }\n\n // sheetViews (required)\n const svAttrs: string[] = [];\n // XSD default false — only the explicit true carries information.\n if (opts.tabSelected) svAttrs.push('tabSelected=\"1\"');\n if (opts.zoomScale !== undefined) svAttrs.push(`zoomScale=\"${opts.zoomScale}\"`);\n if (opts.zoomToFit) svAttrs.push('zoomToFit=\"1\"');\n svAttrs.push('workbookViewId=\"0\"');\n p.push(`<sheetViews><sheetView ${svAttrs.join(\" \")}/></sheetViews>`);\n\n // sheetProtection (optional) — CT_ChartsheetProtection\n if (opts.sheetProtection) {\n const sp = opts.sheetProtection;\n const spAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sp.password) spAttrs.password = hashPassword(sp.password);\n let derived: ReturnType<typeof derivePasswordHash> | undefined;\n if (sp.password !== undefined && sp.hashValue === undefined) {\n derived = derivePasswordHash(sp.password);\n }\n spAttrs.algorithmName = sp.algorithmName ?? derived?.algorithmName;\n spAttrs.hashValue = sp.hashValue ?? derived?.hashValue;\n spAttrs.saltValue = sp.saltValue ?? derived?.saltValue;\n if (sp.spinCount !== undefined) spAttrs.spinCount = sp.spinCount;\n else if (derived) spAttrs.spinCount = derived.spinCount;\n if (sp.content) spAttrs.content = 1;\n if (sp.objects) spAttrs.objects = 1;\n if (Object.keys(spAttrs).length > 0) {\n p.push(`<sheetProtection${attrs(spAttrs)}/>`);\n }\n }\n\n // pageMargins (optional)\n if (opts.pageMargins) {\n const pm = opts.pageMargins;\n p.push(\n `<pageMargins${attrs({\n left: convertToInch(pm.left ?? 0.7),\n right: convertToInch(pm.right ?? 0.7),\n top: convertToInch(pm.top ?? 0.75),\n bottom: convertToInch(pm.bottom ?? 0.75),\n header: convertToInch(pm.header ?? 0.3),\n footer: convertToInch(pm.footer ?? 0.3),\n })}/>`,\n );\n }\n\n // pageSetup (optional) — CT_CsPageSetup\n if (opts.pageSetup) {\n const ps = opts.pageSetup;\n const psAttrs: Record<string, string | number | boolean | undefined> = {};\n if (ps.paperSize !== undefined) psAttrs.paperSize = ps.paperSize;\n // ST_PositiveUniversalMeasure requires a unit suffix; a bare number means mm.\n if (ps.paperHeight !== undefined)\n psAttrs.paperHeight =\n typeof ps.paperHeight === \"number\" ? `${ps.paperHeight}mm` : ps.paperHeight;\n if (ps.paperWidth !== undefined)\n psAttrs.paperWidth =\n typeof ps.paperWidth === \"number\" ? `${ps.paperWidth}mm` : ps.paperWidth;\n if (ps.firstPageNumber !== undefined) psAttrs.firstPageNumber = ps.firstPageNumber;\n if (ps.orientation && ps.orientation !== \"default\") psAttrs.orientation = ps.orientation;\n // XSD default true — emit only the explicit-false form (0).\n if (ps.usePrinterDefaults === false) psAttrs.usePrinterDefaults = 0;\n if (ps.blackAndWhite) psAttrs.blackAndWhite = 1;\n if (ps.draft) psAttrs.draft = 1;\n if (ps.useFirstPageNumber) psAttrs.useFirstPageNumber = 1;\n if (ps.horizontalDpi !== undefined) psAttrs.horizontalDpi = ps.horizontalDpi;\n if (ps.verticalDpi !== undefined) psAttrs.verticalDpi = ps.verticalDpi;\n if (ps.copies !== undefined) psAttrs.copies = ps.copies;\n if (ps.printerSettingsRId) psAttrs[\"r:id\"] = ps.printerSettingsRId;\n p.push(`<pageSetup${attrs(psAttrs)}/>`);\n }\n\n // headerFooter (optional) — CT_HeaderFooter, shared with worksheet\n if (opts.headerFooter) {\n const hfXml = stringifyHeaderFooterXml(opts.headerFooter);\n if (hfXml) p.push(hfXml);\n }\n\n // drawing (required)\n p.push(`<drawing r:id=\"${escapeXml(opts.drawingRId)}\"/>`);\n\n p.push(\"</chartsheet>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<ChartsheetDescriptorOptions> = {};\n\n // nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\" to numbers, so\n // boolean attribute checks use String() coercion.\n // sheetPr\n const sheetPr = findChild(el, \"sheetPr\");\n if (sheetPr) {\n // XSD default true — only the explicit \"0\" carries information back.\n if (String(attr(sheetPr, \"published\")) === \"0\") result.published = false;\n if (attr(sheetPr, \"codeName\")) result.codeName = attr(sheetPr, \"codeName\");\n const tabColor = findChild(sheetPr, \"tabColor\");\n if (tabColor) {\n const rgb = attr(tabColor, \"rgb\");\n if (rgb) result.tabColor = String(rgb);\n }\n }\n\n // sheetViews\n const sheetViews = findChild(el, \"sheetViews\");\n if (sheetViews) {\n const sv = findChild(sheetViews, \"sheetView\");\n if (sv) {\n // XSD default false — only the explicit \"1\" carries information back.\n if (parseOnOff(attr(sv, \"tabSelected\"))) result.tabSelected = true;\n const zoomScale = attrNum(sv, \"zoomScale\");\n if (zoomScale !== undefined) result.zoomScale = zoomScale;\n if (parseOnOff(attr(sv, \"zoomToFit\"))) result.zoomToFit = true;\n }\n }\n\n // sheetProtection — CT_ChartsheetProtection\n const sheetProtectionEl = findChild(el, \"sheetProtection\");\n if (sheetProtectionEl) {\n const sp: Partial<ChartsheetProtectionOptions> = {};\n // @password (legacy hash) not read back — see parseSheetProtectionEl note.\n const an = attr(sheetProtectionEl, \"algorithmName\");\n if (an) sp.algorithmName = an;\n const hv = attr(sheetProtectionEl, \"hashValue\");\n if (hv) sp.hashValue = hv;\n const sv = attr(sheetProtectionEl, \"saltValue\");\n if (sv) sp.saltValue = sv;\n const sc = attrNum(sheetProtectionEl, \"spinCount\");\n if (sc !== undefined) sp.spinCount = sc;\n if (parseOnOff(attr(sheetProtectionEl, \"content\"))) sp.content = true;\n if (parseOnOff(attr(sheetProtectionEl, \"objects\"))) sp.objects = true;\n result.sheetProtection = sp;\n }\n\n // pageMargins\n const pageMarginsEl = findChild(el, \"pageMargins\");\n if (pageMarginsEl) {\n const pm: Partial<PageMarginsOptions> = {};\n const ml = attrNum(pageMarginsEl, \"left\");\n if (ml !== undefined) pm.left = ml;\n const mr = attrNum(pageMarginsEl, \"right\");\n if (mr !== undefined) pm.right = mr;\n const mt = attrNum(pageMarginsEl, \"top\");\n if (mt !== undefined) pm.top = mt;\n const mb = attrNum(pageMarginsEl, \"bottom\");\n if (mb !== undefined) pm.bottom = mb;\n const mh = attrNum(pageMarginsEl, \"header\");\n if (mh !== undefined) pm.header = mh;\n const mf = attrNum(pageMarginsEl, \"footer\");\n if (mf !== undefined) pm.footer = mf;\n result.pageMargins = pm;\n }\n\n // pageSetup — CT_CsPageSetup\n const pageSetupEl = findChild(el, \"pageSetup\");\n if (pageSetupEl) {\n const ps: Partial<ChartsheetPageSetup> = {};\n const pz = attrNum(pageSetupEl, \"paperSize\");\n if (pz !== undefined) ps.paperSize = pz;\n const ph = attrMeasure(pageSetupEl, \"paperHeight\");\n if (ph !== undefined) ps.paperHeight = ph as number | PositiveUniversalMeasure;\n const pw = attrMeasure(pageSetupEl, \"paperWidth\");\n if (pw !== undefined) ps.paperWidth = pw as number | PositiveUniversalMeasure;\n const fpn = attrNum(pageSetupEl, \"firstPageNumber\");\n if (fpn !== undefined) ps.firstPageNumber = fpn;\n const orient = attr(pageSetupEl, \"orientation\");\n if (orient) ps.orientation = orient as PageOrientation;\n // XSD default true — only the explicit \"0\" carries information back.\n if (String(attr(pageSetupEl, \"usePrinterDefaults\")) === \"0\") ps.usePrinterDefaults = false;\n if (parseOnOff(attr(pageSetupEl, \"blackAndWhite\"))) ps.blackAndWhite = true;\n if (parseOnOff(attr(pageSetupEl, \"draft\"))) ps.draft = true;\n if (parseOnOff(attr(pageSetupEl, \"useFirstPageNumber\"))) ps.useFirstPageNumber = true;\n const hdpi = attrNum(pageSetupEl, \"horizontalDpi\");\n if (hdpi !== undefined) ps.horizontalDpi = hdpi;\n const vdpi = attrNum(pageSetupEl, \"verticalDpi\");\n if (vdpi !== undefined) ps.verticalDpi = vdpi;\n const copies = attrNum(pageSetupEl, \"copies\");\n if (copies !== undefined) ps.copies = copies;\n const psRid = attr(pageSetupEl, \"r:id\");\n if (psRid) ps.printerSettingsRId = psRid;\n result.pageSetup = ps;\n }\n\n // headerFooter — CT_HeaderFooter, shared with worksheet\n const headerFooterEl = findChild(el, \"headerFooter\");\n if (headerFooterEl) {\n result.headerFooter = parseHeaderFooterEl(headerFooterEl);\n }\n\n return result as ChartsheetDescriptorOptions;\n },\n};\n","/**\n * Comments + VML notes descriptor for XLSX.\n *\n * Generates both xl/comments{n}.xml and xl/drawings/vmlDrawing{n}.vml\n * from the same CommentOptions array. Follows PPTX CustomDescriptor pattern.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { convertToEmu, convertToPt } from \"@office-open/core\";\nimport { parseVmlShape } from \"@office-open/core\";\nimport { stringifyVmlShape } from \"@office-open/core\";\nimport { stringifyVmlShapetype } from \"@office-open/core\";\nimport { stringifyVmlShapeLayout } from \"@office-open/core\";\nimport type { LengthUnit, UniversalMeasure, VmlShapeStyle } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { WriteContext } from \"@office-open/core/descriptor\";\nimport { findChild, attr, textOf } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\nimport { escapeXml } from \"@office-open/xml\";\n\nimport { letterToColumn } from \"../util/index\";\nimport { buildRstXml, parseRPr, tElement } from \"./shared-strings\";\nimport type {\n AnchorMarkerOptions,\n CommentOptions,\n CommentPropertiesOptions,\n NoteAnchorOptions,\n ObjectAnchorOptions,\n RichTextOptions,\n RichTextRunOptions,\n} from \"./worksheet\";\n\n// ── Comments descriptor (xl/comments{n}.xml) ──\n\nexport interface CommentsDocOptions {\n comments: CommentOptions[];\n}\n\nexport const commentsDesc: CustomDescriptor<CommentsDocOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.comments.length === 0) return undefined;\n const authors = collectAuthors(opts.comments);\n const p: string[] = [\n `<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\">`,\n `<authors>`,\n ];\n\n for (const author of authors) {\n p.push(`<author>${escapeXml(author)}</author>`);\n }\n\n p.push(\"</authors><commentList>\");\n\n for (const entry of opts.comments) {\n const authorId = authors.indexOf(entry.author);\n const textXml =\n typeof entry.text === \"string\" ? tElement(entry.text) : buildRstXml(entry.text);\n // commentPr is parsed but never re-emitted: Excel refuses to open a\n // third-party file carrying commentPr beside the VML note drawing this\n // compiler always writes (rival property systems — it reads the VML\n // shape's x:ClientData instead).\n p.push(\n `<comment ref=\"${entry.cell}\" authorId=\"${authorId}\"><text>${textXml}</text></comment>`,\n );\n }\n\n p.push(\"</commentList></comments>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const comments: CommentOptions[] = [];\n const authors: string[] = [];\n\n const authorsEl = findChild(el, \"authors\");\n if (authorsEl) {\n for (const a of authorsEl.elements ?? []) {\n if (a.name === \"author\") authors.push(textOf(a) ?? \"\");\n }\n }\n\n const listEl = findChild(el, \"commentList\");\n if (listEl) {\n for (const c of listEl.elements ?? []) {\n if (c.name !== \"comment\") continue;\n const ref = attr(c, \"ref\") ?? \"\";\n const authorId = Number(attr(c, \"authorId\") ?? 0);\n const textEl = findChild(c, \"text\");\n const text = textEl ? parseRst(textEl) : \"\";\n const commentPrEl = findChild(c, \"commentPr\");\n const comment: CommentOptions = {\n cell: ref,\n author: authors[authorId] ?? \"\",\n text,\n };\n if (commentPrEl) comment.commentPr = parseCommentPr(commentPrEl);\n comments.push(comment);\n }\n }\n\n return { comments } as CommentsDocOptions;\n },\n};\n\n// ── VML notes descriptor (xl/drawings/vmlDrawing{n}.vml) ──\n\n/** Per-note placement facts read from a vmlDrawing part (one per v:shape). */\nexport interface VmlNoteAnchor {\n /** 0-based row (x:Row). */\n row: number;\n /** 0-based column (x:Column). */\n column: number;\n /** Cell-corner anchor (x:Anchor) when present. */\n anchor?: NoteAnchorOptions;\n /** Whether the note shape is visible (style visibility ≠ hidden). */\n visible: boolean;\n /** Shape width in points when present in the style. */\n width?: number;\n /** Shape height in points when present in the style. */\n height?: number;\n}\n\nexport const vmlNotesDesc: CustomDescriptor<CommentsDocOptions, WriteContext, VmlNoteAnchor[]> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.comments.length === 0) return undefined;\n\n const p: string[] = [\n '<xml xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\">',\n stringifyVmlShapeLayout({ ext: \"edit\", idmap: { ext: \"edit\", data: \"1\" } }),\n stringifyVmlShapetype({\n id: \"_x0000_t202\",\n coordsize: \"21600,21600\",\n spt: 202,\n path: \"m,l,21600r21600,l21600,xe\",\n stroke: { joinstyle: \"miter\" },\n pathElement: { gradientshapeok: true, connecttype: \"rect\" },\n }),\n ];\n\n for (const [i, c] of opts.comments.entries()) {\n const { col, row } = cellRefToVmlCoords(c.cell);\n const anchor = c.anchor\n ? [\n c.anchor.from.col,\n Math.round(convertToEmu(c.anchor.from.colOff ?? 0) / 9525),\n c.anchor.from.row,\n Math.round(convertToEmu(c.anchor.from.rowOff ?? 0) / 9525),\n c.anchor.to.col,\n Math.round(convertToEmu(c.anchor.to.colOff ?? 0) / 9525),\n c.anchor.to.row,\n Math.round(convertToEmu(c.anchor.to.rowOff ?? 0) / 9525),\n ]\n : [col, 0, row, 0, col + 2, 0, row + 2, 0];\n const style = {\n position: \"absolute\",\n marginLeft: \"59.25pt\",\n marginTop: \"1.5pt\",\n width: `${c.size?.width ?? DEFAULT_NOTE_WIDTH}pt` as UniversalMeasure,\n height: `${c.size?.height ?? DEFAULT_NOTE_HEIGHT}pt` as UniversalMeasure,\n zIndex: 1,\n } as VmlShapeStyle;\n if (!c.visible) style.visibility = \"hidden\";\n p.push(\n stringifyVmlShape({\n id: `_x0000_s${1025 + i}`,\n type: \"#_x0000_t202\",\n style,\n fillcolor: \"infoBackground [80]\",\n strokecolor: \"none [81]\",\n insetmode: \"auto\",\n fill: { color2: \"infoBackground [80]\" },\n shadow: { color: \"none [81]\", obscured: true },\n pathElement: { connecttype: \"none\" },\n textbox: {\n style: { directionAlt: \"auto\" },\n content: '<div style=\"text-align:left\"></div>',\n },\n clientData: {\n objectType: \"Note\",\n MoveWithCells: \"\",\n SizeWithCells: \"\",\n Anchor: anchor.join(\", \"),\n AutoFill: false,\n Row: row,\n Column: col,\n },\n }),\n );\n }\n\n p.push(\"</xml>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const anchors: VmlNoteAnchor[] = [];\n for (const child of el.elements ?? []) {\n if (child.type !== \"element\" || child.name !== \"v:shape\") continue;\n const shape = parseVmlShape(child);\n const cd = shape.clientData;\n if (!cd || cd.objectType !== \"Note\" || cd.Row === undefined || cd.Column === undefined) {\n continue;\n }\n const note: VmlNoteAnchor = {\n row: cd.Row,\n column: cd.Column,\n visible: shape.style?.visibility !== \"hidden\",\n };\n const nums = (cd.Anchor ?? \"\")\n .split(/[,\\s]+/)\n .filter(Boolean)\n .map(Number);\n if (nums.length === 8 && nums.every((n) => !Number.isNaN(n))) {\n // VML stores pixel offsets; the public API carries EMU (px × 9525).\n note.anchor = {\n from: { col: nums[0]!, colOff: nums[1]! * 9525, row: nums[2]!, rowOff: nums[3]! * 9525 },\n to: { col: nums[4]!, colOff: nums[5]! * 9525, row: nums[6]!, rowOff: nums[7]! * 9525 },\n };\n }\n const width = lengthToPt(shape.style?.width);\n if (width !== undefined) note.width = width;\n const height = lengthToPt(shape.style?.height);\n if (height !== undefined) note.height = height;\n anchors.push(note);\n }\n return anchors;\n },\n};\n\n/** Coerce a style length (number or measure string) to points; non-measure tokens yield undefined. */\nfunction lengthToPt(value: LengthUnit | undefined): number | undefined {\n if (typeof value === \"number\") return value;\n if (typeof value !== \"string\" || !/^-?[\\d.]/.test(value)) return undefined;\n return convertToPt(value as UniversalMeasure);\n}\n\n/** Excel's default note shape size (points). */\nconst DEFAULT_NOTE_WIDTH = 108;\nconst DEFAULT_NOTE_HEIGHT = 59.25;\n\n/** Merge parsed VML note placement into comments by cell (column, row) pairing. */\nexport function mergeNoteAnchors(\n comments: CommentOptions[] | undefined,\n anchors: VmlNoteAnchor[],\n): void {\n if (!comments || anchors.length === 0) return;\n for (const note of anchors) {\n const comment = comments.find((c) => {\n const { col, row } = cellRefToVmlCoords(c.cell);\n return col === note.column && row === note.row;\n });\n if (!comment) continue;\n if (note.anchor !== undefined) comment.anchor = note.anchor;\n if (note.visible) comment.visible = true;\n if (note.width !== undefined || note.height !== undefined) {\n comment.size = {\n width: note.width ?? DEFAULT_NOTE_WIDTH,\n height: note.height ?? DEFAULT_NOTE_HEIGHT,\n };\n }\n }\n}\n\n// ── Helpers ──\n\nfunction collectAuthors(comments: CommentOptions[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const entry of comments) {\n if (!seen.has(entry.author)) {\n seen.add(entry.author);\n result.push(entry.author);\n }\n }\n return result.length > 0 ? result : [\"\"];\n}\n\n// ── Comment properties (CT_CommentPr) parse — stringify never emits it (see above) ──\n\nfunction parseCommentPr(el: XmlElement): CommentPropertiesOptions {\n const pr: CommentPropertiesOptions = {};\n const locked = attr(el, \"locked\");\n if (locked !== undefined) pr.locked = parseOnOff(locked) ?? false;\n const defaultSize = attr(el, \"defaultSize\");\n if (defaultSize !== undefined) pr.defaultSize = parseOnOff(defaultSize) ?? false;\n const print = attr(el, \"print\");\n if (print !== undefined) pr.print = parseOnOff(print) ?? false;\n const disabled = attr(el, \"disabled\");\n if (disabled !== undefined) pr.disabled = parseOnOff(disabled) ?? false;\n const autoFill = attr(el, \"autoFill\");\n if (autoFill !== undefined) pr.autoFill = parseOnOff(autoFill) ?? false;\n const autoLine = attr(el, \"autoLine\");\n if (autoLine !== undefined) pr.autoLine = parseOnOff(autoLine) ?? false;\n const altText = attr(el, \"altText\");\n if (altText !== undefined) pr.altText = altText;\n const textHAlign = attr(el, \"textHAlign\");\n if (textHAlign !== undefined)\n pr.textHAlign = textHAlign as CommentPropertiesOptions[\"textHAlign\"];\n const textVAlign = attr(el, \"textVAlign\");\n if (textVAlign !== undefined)\n pr.textVAlign = textVAlign as CommentPropertiesOptions[\"textVAlign\"];\n const lockText = attr(el, \"lockText\");\n if (lockText !== undefined) pr.lockText = parseOnOff(lockText) ?? false;\n const justLastX = attr(el, \"justLastX\");\n if (justLastX !== undefined) pr.justLastX = parseOnOff(justLastX) ?? false;\n const autoScale = attr(el, \"autoScale\");\n if (autoScale !== undefined) pr.autoScale = parseOnOff(autoScale) ?? false;\n const anchorEl = findChild(el, \"anchor\");\n if (anchorEl) {\n const anchor = parseAnchor(anchorEl);\n if (anchor) pr.anchor = anchor;\n }\n return pr;\n}\n\n// CT_ObjectAnchor's from/to are required in the XSD; a malformed element\n// missing either corner yields undefined (commentPr is parse-only, so an\n// unparseable anchor simply drops instead of failing the part).\nfunction parseAnchor(el: XmlElement): ObjectAnchorOptions | undefined {\n const from = findChild(el, \"xdr:from\");\n const to = findChild(el, \"xdr:to\");\n if (!from || !to) return undefined;\n return {\n moveWithCells: parseOnOff(attr(el, \"moveWithCells\")),\n sizeWithCells: parseOnOff(attr(el, \"sizeWithCells\")),\n from: parseMarker(from),\n to: parseMarker(to),\n };\n}\n\nfunction parseMarker(el: XmlElement): AnchorMarkerOptions {\n const num = (tag: string) => Number(textOf(findChild(el, tag)!) ?? 0);\n return {\n col: num(\"xdr:col\"),\n colOff: num(\"xdr:colOff\"),\n row: num(\"xdr:row\"),\n rowOff: num(\"xdr:rowOff\"),\n };\n}\n\n// VML anchors use 0-based column/row; cell refs are 1-based uppercase letters + digits.\nfunction cellRefToVmlCoords(ref: string): { col: number; row: number } {\n let i = 0;\n while (i < ref.length && ref.charCodeAt(i) >= 65 && ref.charCodeAt(i) <= 90) i++;\n return { col: letterToColumn(ref.slice(0, i)) - 1, row: parseInt(ref.slice(i), 10) - 1 };\n}\n\n/** Parse rich text element into a plain string or rich runs. */\nfunction parseRst(textEl: XmlElement): string | RichTextOptions {\n const runs: RichTextRunOptions[] = [];\n const parts: string[] = [];\n let hasRuns = false;\n for (const child of textEl.elements ?? []) {\n if (child.name === \"t\") {\n parts.push(textOf(child) ?? \"\");\n } else if (child.name === \"r\") {\n hasRuns = true;\n const t = findChild(child, \"t\");\n const run: RichTextRunOptions = { text: t ? (textOf(t) ?? \"\") : \"\" };\n const rPr = findChild(child, \"rPr\");\n if (rPr) run.properties = parseRPr(rPr);\n runs.push(run);\n }\n }\n if (hasRuns) return { runs };\n return parts.join(\"\");\n}\n","/**\n * XLSX Drawing — anchor object types.\n *\n * Option interfaces for spreadsheetDrawing anchors: images, charts, shapes,\n * connectors, groups, and content parts bound to worksheet cells.\n *\n * @module\n */\n\nimport type { BaseConnectorOptions, BaseGroupOptions, UniversalMeasure } from \"@office-open/core\";\nimport type {\n BlackWhiteMode,\n BlipEffectsOptions,\n GraphicFrameLockingOptions,\n GroupTransform2DOptions,\n NonVisualDrawingPropertiesOptions,\n PictureLockingOptions,\n ShapeLockingOptions,\n ShapePropertiesOptions,\n SourceRectangleOptions,\n TextBodyOptions,\n TextHyperlinkOptions,\n} from \"@office-open/core/drawing\";\nimport type { DefaultShapeStyleOptions } from \"@office-open/core/theme\";\n\n// ── Types (used by compiler) ──\n\n// ImageOptions/ChartAnchorOptions were removed: the compiler builds the same\n// Drawing*Options types the descriptor consumes, carrying the full anchor set.\n\n// ── Descriptor Types ──\n\n/** How a drawing is anchored to the worksheet (xdr:*Anchor element). */\nexport const ANCHOR_TYPES = {\n twoCell: \"twoCell\",\n oneCell: \"oneCell\",\n absolute: \"absolute\",\n} as const;\n/** How a drawing is anchored to the worksheet: \"twoCell\" from/to cell markers, \"oneCell\" from-marker plus size, \"absolute\" absolute EMU offset. */\nexport type AnchorType = (typeof ANCHOR_TYPES)[keyof typeof ANCHOR_TYPES];\n\n/** editAs behavior for twoCellAnchor (ST_EditAs). */\nexport const EDIT_AS_TYPES = {\n twoCell: \"twoCell\",\n oneCell: \"oneCell\",\n absolute: \"absolute\",\n} as const;\n/** How a twoCellAnchor tracks later row/column edits: \"twoCell\" move and resize, \"oneCell\" move only, \"absolute\" neither. */\nexport type EditAsType = (typeof EDIT_AS_TYPES)[keyof typeof EDIT_AS_TYPES];\n\n/**\n * Shared anchor fields for all anchored drawing objects. 1-based col/row for\n * authoring convenience (the XML marker is 0-based; the descriptor subtracts).\n * Note anchors (NoteAnchorOptions) mirror the XML's 0-based CT_Marker instead.\n */\nexport interface DrawingAnchorOptions {\n /** 1-based column (from marker) */\n col: number;\n /** Column offset in EMU (default 0) */\n colOffset?: number | UniversalMeasure;\n /** 1-based row (from marker) */\n row: number;\n /** Row offset in EMU (default 0) */\n rowOffset?: number | UniversalMeasure;\n /** To cell column (1-based) for twoCellAnchor. Defaults to col + 1. */\n toCol?: number;\n /** To cell row (1-based) for twoCellAnchor. Defaults to row + 1. */\n toRow?: number;\n /** To cell column offset in EMU. */\n toColOffset?: number | UniversalMeasure;\n /** To cell row offset in EMU. */\n toRowOffset?: number | UniversalMeasure;\n /** Anchor type (default \"twoCell\"). */\n anchorType?: AnchorType;\n /** editAs for twoCellAnchor (default \"oneCell\"). */\n editAs?: EditAsType;\n /** Absolute X in EMU (absoluteAnchor). */\n absoluteX?: number | UniversalMeasure;\n /** Absolute Y in EMU (absoluteAnchor). */\n absoluteY?: number | UniversalMeasure;\n /** Anchor extent width in EMU (oneCell/absoluteAnchor ext, default 400000). */\n extentCx?: number | UniversalMeasure;\n /** Anchor extent height in EMU (oneCell/absoluteAnchor ext, default 300000). */\n extentCy?: number | UniversalMeasure;\n /** Lock anchor with sheet (default true) */\n locksWithSheet?: boolean;\n /** Print with sheet (default true) */\n printsWithSheet?: boolean;\n /**\n * Document-order position of this anchor inside the drawing part — the\n * z-order when objects overlap. Round-trip only: stringify emits anchors\n * in this order; fresh authoring keeps the per-type bucket order.\n */\n zOrder?: number;\n /** Original cNvPr id (round-trip only; fresh output allocates ids). */\n shapeId?: number;\n}\n\n/** Pick the anchor fields defined on `source` (undefined ones stay absent). */\nexport function pickAnchorOptions<T extends DrawingAnchorOptions>(source: T): DrawingAnchorOptions {\n const picked: DrawingAnchorOptions = { col: source.col, row: source.row };\n const keys = [\n \"colOffset\",\n \"rowOffset\",\n \"toCol\",\n \"toRow\",\n \"toColOffset\",\n \"toRowOffset\",\n \"anchorType\",\n \"editAs\",\n \"absoluteX\",\n \"absoluteY\",\n \"extentCx\",\n \"extentCy\",\n \"locksWithSheet\",\n \"printsWithSheet\",\n ] as const;\n // Correlated union-key writes need this cast — TS cannot narrow the write\n // type from a `keys` element alone.\n const optional = picked as unknown as Record<(typeof keys)[number], unknown>;\n for (const key of keys) {\n if (source[key] !== undefined) optional[key] = source[key];\n }\n return picked;\n}\n\nexport interface DrawingPictureOptions\n extends DrawingAnchorOptions, NonVisualDrawingPropertiesOptions {\n /**\n * Relationship ID for the embedded image (a:blip @r:embed). Empty on a\n * linked-only picture, which carries {@link linkRId} alone.\n */\n rId: string;\n /**\n * Relationship ID for the linked source (a:blip @r:link) — an External\n * image relationship targeting the source URL. Absent when the picture is\n * purely embedded.\n */\n linkRId?: string;\n /**\n * Round-tripped pic/spPr — carries rotation/flip/bwMode/fill that the\n * position-only default emission would drop. When absent, stringify emits\n * the standard xfrm + rect geometry.\n */\n spPr?: ShapePropertiesOptions;\n /**\n * Click hyperlink on the object itself (a:hlinkClick inside xdr:cNvPr) —\n * jump to a URL when the object is clicked.\n */\n hyperlink?: TextHyperlinkOptions;\n /** Blip crop (a:srcRect); an empty object round-trips the bare marker. */\n sourceRectangle?: SourceRectangleOptions;\n /** Black/white mode (spPr/@bwMode); absent = attribute omitted. */\n blackWhiteMode?: BlackWhiteMode;\n /** Picture locks (cNvPicPr/a:picLocks); absent = empty cNvPicPr. */\n locking?: PictureLockingOptions;\n /**\n * Relative-resize hint (cNvPicPr/@preferRelativeResize). Absent = attribute\n * omitted (defaults true); explicit true/false round-trips the attribute.\n */\n preferRelativeResize?: boolean;\n /** Image adjustment effects carried inside a:blip (a:lum, a:duotone, …). */\n blipEffects?: BlipEffectsOptions;\n /** Local-DPI display hint (a14:useLocalDpi in the a:blip extension list). */\n useLocalDpi?: boolean;\n /**\n * Verbatim a:blip `a:extLst` inner XML for extensions beyond useLocalDpi\n * (a14 imgProps artistic effects, …). Round-trip only; subsumes\n * `useLocalDpi` when the source list carries both. Named blipExt to\n * avoid colliding with the inherited cNvPr `ext` channel.\n */\n blipExt?: string;\n}\n\nexport interface DrawingChartOptions\n extends DrawingAnchorOptions, NonVisualDrawingPropertiesOptions {\n /** Relationship ID for the chart */\n rId: string;\n /**\n * Click hyperlink on the object itself (a:hlinkClick inside xdr:cNvPr) —\n * jump to a URL when the object is clicked.\n */\n hyperlink?: TextHyperlinkOptions;\n /** Frame locks (cNvGraphicFramePr/a:graphicFrameLocks); absent = empty. */\n frameLocks?: GraphicFrameLockingOptions;\n /** Macro reference (CT_GraphicFrame/@macro); empty string round-trips. */\n macro?: string;\n}\n\n/**\n * Anchored SmartArt (xdr:graphicFrame whose graphicData carries dgm:relIds).\n * The four diagram parts (data/layout/quickStyle/colors) travel as passthrough\n * parts; these ids wire the frame to them in the drawing rels.\n */\nexport interface DrawingSmartArtOptions\n extends DrawingAnchorOptions, NonVisualDrawingPropertiesOptions {\n /** Diagram data part (dgm:relIds @r:dm). */\n dataRId: string;\n /** Diagram layout part (dgm:relIds @r:lo). */\n layoutRId: string;\n /** Diagram quick style part (dgm:relIds @r:qs). */\n quickStyleRId: string;\n /** Diagram colors part (dgm:relIds @r:cs). */\n colorsRId: string;\n /** Frame locks (cNvGraphicFramePr/a:graphicFrameLocks); absent = empty. */\n frameLocks?: GraphicFrameLockingOptions;\n /** Macro reference (CT_GraphicFrame/@macro); empty string round-trips. */\n macro?: string;\n}\n\n/** Anchored shape (xdr:sp): geometry + optional text body. */\nexport interface ShapeOptions extends DrawingAnchorOptions, NonVisualDrawingPropertiesOptions {\n /**\n * Click hyperlink on the object itself (a:hlinkClick inside xdr:cNvPr) —\n * jump to a URL when the object is clicked.\n */\n hyperlink?: TextHyperlinkOptions;\n /** Shape locks (cNvSpPr/a:spLocks, CT_ShapeLocking). */\n locking?: ShapeLockingOptions;\n /** Shape properties (a:CT_ShapeProperties). */\n spPr: ShapePropertiesOptions;\n /** Text body (a:CT_TextBody). */\n textBody?: TextBodyOptions;\n /** Theme style-matrix references (xdr:style, CT_ShapeStyle). */\n style?: DefaultShapeStyleOptions;\n /** macro attribute (CT_Shape). */\n macro?: string;\n /** textlink attribute (CT_Shape). */\n textlink?: string;\n /** Text-box flag (cNvSpPr/@txBox) — emitted only when the source had it. */\n textBox?: boolean;\n}\n\n/** Anchored connector (xdr:cxnSp): line/arrow geometry via spPr. */\nexport interface ConnectorOptions extends DrawingAnchorOptions, BaseConnectorOptions {\n /**\n * Click hyperlink on the object itself (a:hlinkClick inside xdr:cNvPr) —\n * jump to a URL when the object is clicked.\n */\n hyperlink?: TextHyperlinkOptions;\n /** Shape properties (a:CT_ShapeProperties, typically prstGeom=\"line\"). */\n spPr: ShapePropertiesOptions;\n /** Theme style-matrix references (xdr:style, CT_ShapeStyle). */\n style?: DefaultShapeStyleOptions;\n /** macro attribute (CT_Connector). */\n macro?: string;\n}\n\n/** Shape nested inside a group (no anchor — positioned via spPr.xfrm). */\nexport interface GroupShapeChildOptions extends NonVisualDrawingPropertiesOptions {\n /**\n * Click hyperlink on the object itself (a:hlinkClick inside xdr:cNvPr) —\n * jump to a URL when the object is clicked.\n */\n hyperlink?: TextHyperlinkOptions;\n spPr: ShapePropertiesOptions;\n textBody?: TextBodyOptions;\n /** Theme style-matrix references (xdr:style, CT_ShapeStyle). */\n style?: DefaultShapeStyleOptions;\n macro?: string;\n textlink?: string;\n /** Shape locks (cNvSpPr/a:spLocks, CT_ShapeLocking). */\n locking?: ShapeLockingOptions;\n /** Text-box flag (cNvSpPr/@txBox) — emitted only when the source had it. */\n textBox?: boolean;\n}\n\n/** Connector nested inside a group (no anchor). */\nexport interface GroupConnectorChildOptions extends BaseConnectorOptions {\n /**\n * Click hyperlink on the object itself (a:hlinkClick inside xdr:cNvPr) —\n * jump to a URL when the object is clicked.\n */\n hyperlink?: TextHyperlinkOptions;\n spPr: ShapePropertiesOptions;\n /** Theme style-matrix references (xdr:style, CT_ShapeStyle). */\n style?: DefaultShapeStyleOptions;\n macro?: string;\n}\n\n/** Anchored group (xdr:grpSp): group transform + nested shapes/connectors. */\nexport interface GroupOptions extends DrawingAnchorOptions, BaseGroupOptions {\n /**\n * Click hyperlink on the object itself (a:hlinkClick inside xdr:cNvPr) —\n * jump to a URL when the object is clicked.\n */\n hyperlink?: TextHyperlinkOptions;\n /** Group shape properties (a:CT_GroupShapeProperties: group xfrm + fill/ln). */\n grpSpPr: GroupTransform2DOptions;\n /** Nested shapes. */\n shapes?: GroupShapeChildOptions[];\n /** Nested connectors. */\n connectors?: GroupConnectorChildOptions[];\n}\n\n/** Anchored external content reference (xdr:contentPart, r:id only). */\nexport interface DrawingContentPartOptions extends DrawingAnchorOptions {\n /** Relationship ID for the external content. */\n rId: string;\n}\n\nexport interface DrawingOptions {\n images?: DrawingPictureOptions[];\n charts?: DrawingChartOptions[];\n smartArts?: DrawingSmartArtOptions[];\n shapes?: ShapeOptions[];\n connectors?: ConnectorOptions[];\n groups?: GroupOptions[];\n contentParts?: DrawingContentPartOptions[];\n}\n","/**\n * XLSX Drawing — parse helpers for spreadsheetDrawing anchors.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { UniversalMeasure } from \"@office-open/core\";\nimport type { ReadContext } from \"@office-open/core/descriptor\";\nimport type { BlackWhiteMode } from \"@office-open/core/drawing\";\nimport {\n blipDesc,\n connectorLockingDesc,\n graphicFrameLockingDesc,\n pictureLockingDesc,\n parseEndpointConnection,\n groupShapePropertiesDesc,\n parseNonVisualDrawingProperties,\n readHyperlink,\n shapeLockingDesc,\n shapePropertiesDesc,\n sourceRectangleDesc,\n textBodyDesc,\n} from \"@office-open/core/drawing\";\nimport type {\n ConnectorLockingOptions,\n EndpointConnectionOptions,\n NonVisualDrawingPropertiesOptions,\n TextHyperlinkOptions,\n} from \"@office-open/core/drawing\";\nimport { parseShapeStyle } from \"@office-open/core/theme\";\nimport { findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type {\n DrawingAnchorOptions,\n DrawingChartOptions,\n DrawingContentPartOptions,\n DrawingSmartArtOptions,\n ConnectorOptions,\n GroupOptions,\n DrawingPictureOptions,\n ShapeOptions,\n GroupConnectorChildOptions,\n GroupShapeChildOptions,\n} from \"./types\";\nimport { ANCHOR_TYPES } from \"./types\";\nimport type { EditAsType } from \"./types\";\n\n// ── Parse helpers ──\n\n/**\n * SpreadsheetDrawing child lookup tolerant of both namespace forms Office\n * writes: elements in the default namespace (our own output) and elements\n * carrying the xdr: prefix (most external files). The DrawingML (a:) and\n * chart (c:) children inside are always prefixed and go through findChild.\n */\nexport function findXdr(el: XmlElement, local: string): XmlElement | undefined {\n return findChild(el, local) ?? findChild(el, `xdr:${local}`);\n}\n\nfunction readNumChild(el: XmlElement, tag: string): number {\n const child = findXdr(el, tag);\n if (!child?.elements?.length) return 0;\n const n = Number(child.elements[0]?.text ?? \"\");\n return Number.isNaN(n) ? 0 : n;\n}\n\ninterface Marker {\n col: number;\n colOffset?: number | UniversalMeasure;\n row: number;\n rowOffset?: number | UniversalMeasure;\n}\n\nfunction readMarker(el: XmlElement): Marker {\n return {\n col: readNumChild(el, \"col\") + 1,\n colOffset: readNumChild(el, \"colOff\") || undefined,\n row: readNumChild(el, \"row\") + 1,\n rowOffset: readNumChild(el, \"rowOff\") || undefined,\n };\n}\n\n/** Populate anchor fields (col/row/extent/anchorType/editAs/locks) from an anchor element. */\nfunction readAnchorFields(anchor: XmlElement, name: string, result: DrawingAnchorOptions): void {\n result.col = 1;\n result.row = 1;\n\n const clientData = findXdr(anchor, \"clientData\");\n if (clientData?.attributes) {\n if (clientData.attributes[\"fLocksWithSheet\"] !== undefined) {\n result.locksWithSheet = parseOnOff(clientData.attributes[\"fLocksWithSheet\"]) ?? true;\n }\n if (clientData.attributes[\"fPrintsWithSheet\"] !== undefined) {\n result.printsWithSheet = parseOnOff(clientData.attributes[\"fPrintsWithSheet\"]) ?? true;\n }\n }\n\n const readExt = (el: XmlElement | undefined): void => {\n if (!el?.attributes) return;\n const cx = Number(el.attributes[\"cx\"]);\n const cy = Number(el.attributes[\"cy\"]);\n if (!Number.isNaN(cx)) result.extentCx = cx;\n if (!Number.isNaN(cy)) result.extentCy = cy;\n };\n\n if (name === \"absoluteAnchor\") {\n result.anchorType = ANCHOR_TYPES.absolute;\n const pos = findXdr(anchor, \"pos\");\n if (pos?.attributes) {\n const x = Number(pos.attributes[\"x\"]);\n const y = Number(pos.attributes[\"y\"]);\n if (!Number.isNaN(x)) result.absoluteX = x;\n if (!Number.isNaN(y)) result.absoluteY = y;\n }\n readExt(findXdr(anchor, \"ext\"));\n return;\n }\n\n const from = findXdr(anchor, \"from\");\n if (from) {\n const m = readMarker(from);\n result.col = m.col;\n result.row = m.row;\n if (m.colOffset !== undefined) result.colOffset = m.colOffset;\n if (m.rowOffset !== undefined) result.rowOffset = m.rowOffset;\n }\n\n if (name === \"oneCellAnchor\") {\n result.anchorType = ANCHOR_TYPES.oneCell;\n readExt(findXdr(anchor, \"ext\"));\n return;\n }\n\n // twoCellAnchor\n result.anchorType = ANCHOR_TYPES.twoCell;\n const to = findXdr(anchor, \"to\");\n if (to) {\n const m = readMarker(to);\n result.toCol = m.col;\n result.toRow = m.row;\n if (m.colOffset !== undefined) result.toColOffset = m.colOffset;\n if (m.rowOffset !== undefined) result.toRowOffset = m.rowOffset;\n }\n const editAs = anchor.attributes?.[\"editAs\"] as EditAsType | undefined;\n if (editAs) result.editAs = editAs;\n}\n\n/** Read cNvPr (a:CT_NonVisualDrawingProps) from a non-visual properties child. */\nfunction readCNvPr(\n parent: XmlElement,\n nonVisualTag: string,\n ctx: ReadContext,\n): Partial<NonVisualDrawingPropertiesOptions> & { hyperlink?: TextHyperlinkOptions } {\n const nonVisual = findXdr(parent, nonVisualTag);\n const cNvPr = nonVisual ? findXdr(nonVisual, \"cNvPr\") : undefined;\n const result: Partial<NonVisualDrawingPropertiesOptions> & {\n hyperlink?: TextHyperlinkOptions;\n } = parseNonVisualDrawingProperties(cNvPr);\n const hlinkClick = cNvPr ? findChild(cNvPr, \"a:hlinkClick\") : undefined;\n if (hlinkClick) result.hyperlink = readHyperlink(hlinkClick, ctx);\n return result;\n}\n\nexport function parseImageAnchor(\n anchor: XmlElement,\n pic: XmlElement,\n name: string,\n ctx: ReadContext,\n): DrawingPictureOptions {\n const refs = readPicRefs(pic);\n const result: DrawingPictureOptions = {\n col: 1,\n row: 1,\n rId: refs.embed ?? \"\",\n ...(refs.link ? { linkRId: refs.link } : {}),\n };\n Object.assign(result, readCNvPr(pic, \"nvPicPr\", ctx));\n\n // preferRelativeResize (defaults true) and the a:blip adjustment effects.\n const blipFill = findXdr(pic, \"blipFill\");\n const nvPicPr = findXdr(pic, \"nvPicPr\");\n const cNvPicPr = nvPicPr ? findXdr(nvPicPr, \"cNvPicPr\") : undefined;\n if (cNvPicPr?.attributes?.[\"preferRelativeResize\"] !== undefined) {\n result.preferRelativeResize =\n parseOnOff(String(cNvPicPr.attributes[\"preferRelativeResize\"])) ?? true;\n }\n if (cNvPicPr) {\n const locks = findChild(cNvPicPr, \"a:picLocks\");\n if (locks) result.locking = pictureLockingDesc.parse(locks, ctx);\n }\n const blip = blipFill ? findChild(blipFill, \"a:blip\") : undefined;\n if (blip) {\n const parsed = blipDesc.parse(blip, {} as never);\n if (parsed.blipEffects) result.blipEffects = parsed.blipEffects;\n if (parsed.useLocalDpi !== undefined) result.useLocalDpi = parsed.useLocalDpi;\n if (parsed.ext !== undefined) result.blipExt = parsed.ext;\n }\n const srcRect = blipFill ? findChild(blipFill, \"a:srcRect\") : undefined;\n if (srcRect) result.sourceRectangle = sourceRectangleDesc.parse(srcRect, ctx);\n\n // Full spPr (rotation/flip/fill) beyond the position-only default; @bwMode\n // is a container attribute the descriptor leaves to the caller.\n const spPrEl = findXdr(pic, \"spPr\");\n if (spPrEl) {\n result.spPr = shapePropertiesDesc.parse(spPrEl, ctx);\n const bwMode = spPrEl.attributes?.[\"bwMode\"];\n if (bwMode !== undefined) result.blackWhiteMode = bwMode as BlackWhiteMode;\n }\n\n // Actual image size (applies to all anchor types).\n const ext = readPicExtent(pic);\n if (ext.cx !== undefined) result.extentCx = ext.cx;\n if (ext.cy !== undefined) result.extentCy = ext.cy;\n\n readAnchorFields(anchor, name, result);\n return result;\n}\n\n/** Picture blip references: r:embed (local copy) and/or r:link (external source). */\nfunction readPicRefs(pic: XmlElement): { embed?: string; link?: string } {\n const blipFill = findXdr(pic, \"blipFill\") ?? pic;\n const attrs = findChild(blipFill, \"a:blip\")?.attributes;\n return {\n embed: attrs?.[\"r:embed\"] as string | undefined,\n link: attrs?.[\"r:link\"] as string | undefined,\n };\n}\n\n/** Picture extent from pic/spPr/a:xfrm/a:ext (actual image size in EMU). */\nfunction readPicExtent(pic: XmlElement): { cx?: number; cy?: number } {\n const spPr = findXdr(pic, \"spPr\");\n const xfrm = spPr ? findChild(spPr, \"a:xfrm\") : undefined;\n const ext = xfrm ? findChild(xfrm, \"a:ext\") : undefined;\n if (!ext?.attributes) return {};\n const cx = Number(ext.attributes[\"cx\"]);\n const cy = Number(ext.attributes[\"cy\"]);\n return {\n cx: Number.isNaN(cx) ? undefined : cx,\n cy: Number.isNaN(cy) ? undefined : cy,\n };\n}\n\nexport function parseChartAnchor(\n anchor: XmlElement,\n graphicFrame: XmlElement,\n name: string,\n ctx: ReadContext,\n): DrawingChartOptions | undefined {\n const graphicData = findChild(\n findChild(graphicFrame, \"a:graphic\") ?? graphicFrame,\n \"a:graphicData\",\n );\n const chartEl = graphicData ? findChild(graphicData, \"c:chart\") : undefined;\n const rId = chartEl?.attributes?.[\"r:id\"] as string | undefined;\n if (!rId) return undefined;\n\n const result = { col: 1, row: 1, rId } as DrawingChartOptions;\n Object.assign(result, readCNvPr(graphicFrame, \"nvGraphicFramePr\", ctx));\n const nvGraphicFramePr = findXdr(graphicFrame, \"nvGraphicFramePr\");\n const cNvGraphicFramePr = nvGraphicFramePr\n ? findXdr(nvGraphicFramePr, \"cNvGraphicFramePr\")\n : undefined;\n if (cNvGraphicFramePr) {\n const locks = findChild(cNvGraphicFramePr, \"a:graphicFrameLocks\");\n if (locks) result.frameLocks = graphicFrameLockingDesc.parse(locks, ctx);\n }\n if (graphicFrame.attributes?.[\"macro\"] !== undefined)\n result.macro = String(graphicFrame.attributes[\"macro\"]);\n\n readAnchorFields(anchor, name, result);\n return result;\n}\n\n/** Read an anchored SmartArt graphicFrame (graphicData > dgm:relIds). */\nexport function parseSmartArtAnchor(\n anchor: XmlElement,\n graphicFrame: XmlElement,\n name: string,\n ctx: ReadContext,\n): DrawingSmartArtOptions | undefined {\n const graphicData = findChild(\n findChild(graphicFrame, \"a:graphic\") ?? graphicFrame,\n \"a:graphicData\",\n );\n const relIds = graphicData ? findChild(graphicData, \"dgm:relIds\") : undefined;\n const dm = relIds?.attributes?.[\"r:dm\"] as string | undefined;\n const lo = relIds?.attributes?.[\"r:lo\"] as string | undefined;\n const qs = relIds?.attributes?.[\"r:qs\"] as string | undefined;\n const cs = relIds?.attributes?.[\"r:cs\"] as string | undefined;\n if (!dm || !lo || !qs || !cs) return undefined;\n\n const result = {\n col: 1,\n row: 1,\n dataRId: dm,\n layoutRId: lo,\n quickStyleRId: qs,\n colorsRId: cs,\n } as DrawingSmartArtOptions;\n Object.assign(result, readCNvPr(graphicFrame, \"nvGraphicFramePr\", ctx));\n const nvGraphicFramePr = findXdr(graphicFrame, \"nvGraphicFramePr\");\n const cNvGraphicFramePr = nvGraphicFramePr\n ? findXdr(nvGraphicFramePr, \"cNvGraphicFramePr\")\n : undefined;\n if (cNvGraphicFramePr) {\n const locks = findChild(cNvGraphicFramePr, \"a:graphicFrameLocks\");\n if (locks) result.frameLocks = graphicFrameLockingDesc.parse(locks, ctx);\n }\n if (graphicFrame.attributes?.[\"macro\"] !== undefined)\n result.macro = String(graphicFrame.attributes[\"macro\"]);\n\n readAnchorFields(anchor, name, result);\n return result;\n}\n\nexport function parseShapeAnchor(\n anchor: XmlElement,\n sp: XmlElement,\n name: string,\n ctx: ReadContext,\n): ShapeOptions {\n const result = { col: 1, row: 1, spPr: {} } as ShapeOptions;\n readAnchorFields(anchor, name, result);\n\n Object.assign(result, readCNvPr(sp, \"nvSpPr\", ctx));\n const nvSpPr = findXdr(sp, \"nvSpPr\");\n const cNvSpPr = nvSpPr ? findXdr(nvSpPr, \"cNvSpPr\") : undefined;\n if (cNvSpPr?.attributes?.[\"txBox\"] !== undefined)\n result.textBox = parseOnOff(String(cNvSpPr.attributes[\"txBox\"])) ?? true;\n const spLocks = cNvSpPr ? findChild(cNvSpPr, \"a:spLocks\") : undefined;\n if (spLocks) result.locking = shapeLockingDesc.parse(spLocks, ctx);\n\n const spPr = findXdr(sp, \"spPr\");\n if (spPr) result.spPr = shapePropertiesDesc.parse(spPr, ctx);\n\n const styleEl = findXdr(sp, \"style\");\n if (styleEl) {\n const style = parseShapeStyle(styleEl, ctx);\n if (style) result.style = style;\n }\n\n const txBody = findXdr(sp, \"txBody\");\n if (txBody) result.textBody = textBodyDesc.parse(txBody, ctx);\n\n if (sp.attributes?.[\"macro\"] !== undefined) result.macro = String(sp.attributes[\"macro\"]);\n if (sp.attributes?.[\"textlink\"] !== undefined)\n result.textlink = String(sp.attributes[\"textlink\"]);\n return result;\n}\n\n/** Read cNvCxnSpPr children (cxnSpLocks/stCxn/endCxn) onto a connector target. */\nfunction readConnectorNonVisual(\n target: {\n locking?: ConnectorLockingOptions;\n startConnection?: EndpointConnectionOptions;\n endConnection?: EndpointConnectionOptions;\n },\n cxnSp: XmlElement,\n ctx: ReadContext,\n): void {\n const nvCxnSpPr = findXdr(cxnSp, \"nvCxnSpPr\");\n if (!nvCxnSpPr) return;\n const cNvCxnSpPr = findXdr(nvCxnSpPr, \"cNvCxnSpPr\");\n if (!cNvCxnSpPr) return;\n const cxnSpLocks = findChild(cNvCxnSpPr, \"a:cxnSpLocks\");\n if (cxnSpLocks) {\n const locks = connectorLockingDesc.parse(cxnSpLocks, ctx);\n if (locks && Object.keys(locks).length > 0) target.locking = locks;\n }\n const stCxn = findChild(cNvCxnSpPr, \"a:stCxn\");\n if (stCxn) {\n const conn = parseEndpointConnection(stCxn);\n if (conn) target.startConnection = conn;\n }\n const endCxn = findChild(cNvCxnSpPr, \"a:endCxn\");\n if (endCxn) {\n const conn = parseEndpointConnection(endCxn);\n if (conn) target.endConnection = conn;\n }\n}\n\nexport function parseConnectorAnchor(\n anchor: XmlElement,\n cxnSp: XmlElement,\n name: string,\n ctx: ReadContext,\n): ConnectorOptions {\n const result = { col: 1, row: 1, spPr: {} } as ConnectorOptions;\n readAnchorFields(anchor, name, result);\n\n Object.assign(result, readCNvPr(cxnSp, \"nvCxnSpPr\", ctx));\n\n const spPr = findXdr(cxnSp, \"spPr\");\n if (spPr) result.spPr = shapePropertiesDesc.parse(spPr, ctx);\n\n if (cxnSp.attributes?.[\"macro\"] !== undefined) result.macro = String(cxnSp.attributes[\"macro\"]);\n\n readConnectorNonVisual(result, cxnSp, ctx);\n const topConnStyle = findXdr(cxnSp, \"style\");\n if (topConnStyle) {\n const style = parseShapeStyle(topConnStyle, ctx);\n if (style) result.style = style;\n }\n return result;\n}\n\nexport function parseGroupAnchor(\n anchor: XmlElement,\n grpSp: XmlElement,\n name: string,\n ctx: ReadContext,\n): GroupOptions {\n const result = { col: 1, row: 1, grpSpPr: {} } as GroupOptions;\n readAnchorFields(anchor, name, result);\n\n Object.assign(result, readCNvPr(grpSp, \"nvGrpSpPr\", ctx));\n\n const grpSpPrEl = findXdr(grpSp, \"grpSpPr\");\n if (grpSpPrEl) {\n result.grpSpPr = groupShapePropertiesDesc.parse(grpSpPrEl, ctx);\n }\n\n const shapes: GroupShapeChildOptions[] = [];\n const childConnectors: GroupConnectorChildOptions[] = [];\n for (const child of grpSp.elements ?? []) {\n // Group children appear in the default namespace (our own output) or with\n // the xdr: prefix (external files) — match by local name.\n const local = child.name?.startsWith(\"xdr:\") ? child.name.slice(4) : child.name;\n if (local === \"sp\") {\n const spPr = findXdr(child, \"spPr\");\n const childShape = {\n spPr: spPr ? shapePropertiesDesc.parse(spPr, ctx) : {},\n } as GroupShapeChildOptions;\n Object.assign(childShape, readCNvPr(child, \"nvSpPr\", ctx));\n const childNvSpPr = findXdr(child, \"nvSpPr\");\n const childCnVSpPr = childNvSpPr ? findXdr(childNvSpPr, \"cNvSpPr\") : undefined;\n if (childCnVSpPr?.attributes?.[\"txBox\"] !== undefined)\n childShape.textBox = parseOnOff(String(childCnVSpPr.attributes[\"txBox\"])) ?? true;\n const childSpLocks = childCnVSpPr ? findChild(childCnVSpPr, \"a:spLocks\") : undefined;\n if (childSpLocks) childShape.locking = shapeLockingDesc.parse(childSpLocks, ctx);\n const childStyle = findXdr(child, \"style\");\n if (childStyle) {\n const style = parseShapeStyle(childStyle, ctx);\n if (style) childShape.style = style;\n }\n const txBody = findXdr(child, \"txBody\");\n if (txBody) childShape.textBody = textBodyDesc.parse(txBody, ctx);\n if (child.attributes?.[\"macro\"] !== undefined)\n childShape.macro = String(child.attributes[\"macro\"]);\n if (child.attributes?.[\"textlink\"] !== undefined)\n childShape.textlink = String(child.attributes[\"textlink\"]);\n shapes.push(childShape);\n } else if (local === \"cxnSp\") {\n const spPr = findXdr(child, \"spPr\");\n const childConn = {\n spPr: spPr ? shapePropertiesDesc.parse(spPr, ctx) : {},\n } as GroupConnectorChildOptions;\n Object.assign(childConn, readCNvPr(child, \"nvCxnSpPr\", ctx));\n if (child.attributes?.[\"macro\"] !== undefined)\n childConn.macro = String(child.attributes[\"macro\"]);\n readConnectorNonVisual(childConn, child, ctx);\n const connStyle = findXdr(child, \"style\");\n if (connStyle) {\n const style = parseShapeStyle(connStyle, ctx);\n if (style) childConn.style = style;\n }\n childConnectors.push(childConn);\n }\n }\n if (shapes.length > 0) result.shapes = shapes;\n if (childConnectors.length > 0) result.connectors = childConnectors;\n return result;\n}\n\nexport function parseContentPartAnchor(\n anchor: XmlElement,\n contentPart: XmlElement,\n name: string,\n): DrawingContentPartOptions | undefined {\n const rId = contentPart.attributes?.[\"r:id\"] as string | undefined;\n if (!rId) return undefined;\n const result = { col: 1, row: 1, rId } as DrawingContentPartOptions;\n readAnchorFields(anchor, name, result);\n return result;\n}\n","/**\n * XLSX Drawing — stringify helpers for spreadsheetDrawing anchors.\n *\n * @module\n */\n\nimport { convertToEmu } from \"@office-open/core\";\nimport type { UniversalMeasure } from \"@office-open/core\";\nimport type { WriteContext } from \"@office-open/core/descriptor\";\nimport {\n buildHyperlinkElement,\n connectorLockingDesc,\n createSourceRectangle,\n graphicFrameLockingDesc,\n registerHyperlink,\n pictureLockingDesc,\n groupShapePropertiesDesc,\n shapeLockingDesc,\n shapePropertiesDesc,\n stringifyBlipEffects,\n stringifyEndpointConnection,\n stringifyNonVisualDrawingProperties,\n textBodyDesc,\n} from \"@office-open/core/drawing\";\nimport type {\n ConnectorLockingOptions,\n EndpointConnectionOptions,\n GraphicFrameLockingOptions,\n NonVisualDrawingPropertiesOptions,\n ShapeLockingOptions,\n ShapePropertiesOptions,\n TextBodyOptions,\n TextHyperlinkOptions,\n} from \"@office-open/core/drawing\";\nimport type { DefaultShapeStyleOptions } from \"@office-open/core/theme\";\nimport { stringifyShapeStyle } from \"@office-open/core/theme\";\nimport { escapeXml } from \"@office-open/xml\";\n\nimport type {\n DrawingAnchorOptions,\n DrawingContentPartOptions,\n ConnectorOptions,\n GroupOptions,\n DrawingPictureOptions,\n DrawingChartOptions,\n DrawingSmartArtOptions,\n ShapeOptions,\n} from \"./types\";\nimport { ANCHOR_TYPES } from \"./types\";\n\n// ── Constants ──\n\nexport const XDR_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nexport const A_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nexport const R_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nexport const C_URI = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\n/** graphicData uri for the diagram (SmartArt) payload. */\nexport const DGM_URI = \"http://schemas.openxmlformats.org/drawingml/2006/diagram\";\n\nexport const DEFAULT_EXTENT_CX = 400000;\nexport const DEFAULT_EXTENT_CY = 300000;\n\n// ── Stringify helpers ──\n\n/** Marker cell (0-based col/row + EMU offsets). */\nfunction markerXml(\n col: number,\n colOff: number | UniversalMeasure,\n row: number,\n rowOff: number | UniversalMeasure,\n): string {\n return `<xdr:col>${col - 1}</xdr:col><xdr:colOff>${convertToEmu(colOff)}</xdr:colOff><xdr:row>${row - 1}</xdr:row><xdr:rowOff>${convertToEmu(rowOff)}</xdr:rowOff>`;\n}\n\nexport function clientDataXml(obj: {\n locksWithSheet?: boolean;\n printsWithSheet?: boolean;\n}): string {\n // Both attributes default to 1 — emit them only when set explicitly, so a\n // source that wrote a bare <xdr:clientData/> round-trips as-is.\n const attrs: string[] = [];\n if (obj.locksWithSheet !== undefined)\n attrs.push(`fLocksWithSheet=\"${obj.locksWithSheet ? 1 : 0}\"`);\n if (obj.printsWithSheet !== undefined)\n attrs.push(`fPrintsWithSheet=\"${obj.printsWithSheet ? 1 : 0}\"`);\n return attrs.length ? `<xdr:clientData ${attrs.join(\" \")}/>` : \"<xdr:clientData/>\";\n}\n\n/** Wrap an anchored object in the appropriate xdr:*Anchor element. */\nexport function wrapAnchor(opts: DrawingAnchorOptions, inner: string): string {\n const anchorType = opts.anchorType ?? ANCHOR_TYPES.twoCell;\n const cx = convertToEmu(opts.extentCx ?? DEFAULT_EXTENT_CX);\n const cy = convertToEmu(opts.extentCy ?? DEFAULT_EXTENT_CY);\n\n if (anchorType === ANCHOR_TYPES.absolute) {\n const x = convertToEmu(opts.absoluteX ?? 0);\n const y = convertToEmu(opts.absoluteY ?? 0);\n return `<xdr:absoluteAnchor><xdr:pos x=\"${x}\" y=\"${y}\"/><xdr:ext cx=\"${cx}\" cy=\"${cy}\"/>${inner}</xdr:absoluteAnchor>`;\n }\n\n const from = markerXml(opts.col, opts.colOffset ?? 0, opts.row, opts.rowOffset ?? 0);\n\n if (anchorType === ANCHOR_TYPES.oneCell) {\n return `<xdr:oneCellAnchor><xdr:from>${from}</xdr:from><xdr:ext cx=\"${cx}\" cy=\"${cy}\"/>${inner}</xdr:oneCellAnchor>`;\n }\n\n // twoCell — editAs defaults to \"twoCell\" in the schema; emit the attribute\n // only when set explicitly so a source that omitted it round-trips as-is.\n const editAsAttr = opts.editAs === undefined ? \"\" : ` editAs=\"${opts.editAs}\"`;\n const to = markerXml(\n opts.toCol ?? opts.col + 1,\n opts.toColOffset ?? 0,\n opts.toRow ?? opts.row + 1,\n opts.toRowOffset ?? 0,\n );\n return `<xdr:twoCellAnchor${editAsAttr}><xdr:from>${from}</xdr:from><xdr:to>${to}</xdr:to>${inner}</xdr:twoCellAnchor>`;\n}\n\nfunction picXml(\n img: DrawingPictureOptions,\n id: number,\n cx: number,\n cy: number,\n ctx: WriteContext,\n): string {\n // Round-tripped spPr (rotation/flip/bwMode/fill) wins; fresh pictures get\n // the position-only standard form.\n const spPr =\n (img.spPr\n ? shapePropertiesDesc.stringify(img.spPr, ctx)\n : shapePropertiesDesc.stringify(\n { x: 0, y: 0, width: cx, height: cy, geometry: \"rect\" },\n ctx,\n )) ?? \"\";\n // preferRelativeResize defaults to true — emit the attribute only when the\n // source carried it explicitly.\n const prAttr =\n img.preferRelativeResize === undefined\n ? \"\"\n : ` preferRelativeResize=\"${img.preferRelativeResize ? 1 : 0}\"`;\n const locks = img.locking ? (pictureLockingDesc.stringify(img.locking, ctx) ?? \"\") : \"\";\n const cNvPicPr = locks\n ? `<xdr:cNvPicPr${prAttr}>${locks}</xdr:cNvPicPr>`\n : `<xdr:cNvPicPr${prAttr}/>`;\n const effects = img.blipEffects ? stringifyBlipEffects(img.blipEffects, ctx) : \"\";\n // The blip extension list: the verbatim channel subsumes useLocalDpi.\n const extLst = img.blipExt\n ? `<a:extLst>${img.blipExt}</a:extLst>`\n : img.useLocalDpi !== undefined\n ? `<a:extLst><a:ext uri=\"{28A0092B-C50C-407E-A947-70E740481C1C}\"><a14:useLocalDpi xmlns:a14=\"http://schemas.microsoft.com/office/drawing/2010/main\" val=\"${img.useLocalDpi ? 1 : 0}\"/></a:ext></a:extLst>`\n : \"\";\n // r:embed carries the embedded copy, r:link the external source — a\n // linked-only picture has no rId, a purely embedded one no linkRId.\n const blipAttrs: string[] = [];\n if (img.rId) blipAttrs.push(`r:embed=\"${img.rId}\"`);\n if (img.linkRId) blipAttrs.push(`r:link=\"${img.linkRId}\"`);\n const attrs = blipAttrs.join(\" \");\n const open = blipAttrs.length ? `<a:blip ${attrs}` : \"<a:blip\";\n const blipContent = effects + extLst;\n const blip = blipContent ? `${open}>${blipContent}</a:blip>` : `${open}/>`;\n const srcRect = img.sourceRectangle ? createSourceRectangle(img.sourceRectangle) : \"\";\n const bwModeAttr = img.blackWhiteMode ? ` bwMode=\"${img.blackWhiteMode}\"` : \"\";\n return (\n `<xdr:pic><xdr:nvPicPr>${stringifyNonVisualDrawingProperties(\"xdr:cNvPr\", id, img, `Picture ${id}`, hlinkClickXml(img.hyperlink, ctx))}${cNvPicPr}</xdr:nvPicPr>` +\n `<xdr:blipFill>${blip}${srcRect}<a:stretch><a:fillRect/></a:stretch></xdr:blipFill>` +\n `<xdr:spPr${bwModeAttr}>${spPr}</xdr:spPr></xdr:pic>`\n );\n}\n\nexport function stringifyImage(img: DrawingPictureOptions, id: number, ctx: WriteContext): string {\n const cx = convertToEmu(img.extentCx ?? DEFAULT_EXTENT_CX);\n const cy = convertToEmu(img.extentCy ?? DEFAULT_EXTENT_CY);\n const pic = picXml(img, id, cx, cy, ctx);\n return wrapAnchor(img, `${pic}${clientDataXml(img)}`);\n}\n\n/**\n * Build an xdr:graphicFrame hosting a chart reference. The xfrm extent is the\n * caller's choice: twoCell anchors carry 0×0 (position comes from the cell\n * markers), absolute anchors carry the real frame size.\n */\n/** a:hlinkClick inside cNvPr — registers the target and returns the element. */\nfunction hlinkClickXml(\n hyperlink: TextHyperlinkOptions | undefined,\n ctx: WriteContext | undefined,\n): string | undefined {\n if (!hyperlink || !ctx) return undefined;\n return buildHyperlinkElement(\"a:hlinkClick\", hyperlink, registerHyperlink(hyperlink, ctx));\n}\n\nexport function graphicFrameXml(\n id: number,\n cNvPr: NonVisualDrawingPropertiesOptions | undefined,\n name: string,\n rId: string,\n cx: number,\n cy: number,\n ctx?: WriteContext,\n extras: {\n frameLocks?: GraphicFrameLockingOptions;\n macro?: string;\n hyperlink?: TextHyperlinkOptions;\n } = {},\n): string {\n // Locks are optional in CT_NonVisualGraphicFrameProperties — emit them only\n // when the source carried them (a bare <xdr:cNvGraphicFramePr/> round-trips).\n // @macro round-trips even when empty (Word writes macro=\"\").\n // The locking descriptor consumes no context, so stringify works even when\n // the caller (chart path) passes no ctx.\n const locks = extras.frameLocks\n ? (graphicFrameLockingDesc.stringify(extras.frameLocks, ctx as WriteContext) ?? \"\")\n : \"\";\n const cNvGraphicFramePr = locks\n ? `<xdr:cNvGraphicFramePr>${locks}</xdr:cNvGraphicFramePr>`\n : \"<xdr:cNvGraphicFramePr/>\";\n const macroAttr = extras.macro === undefined ? \"\" : ` macro=\"${escapeXml(extras.macro)}\"`;\n return (\n `<xdr:graphicFrame${macroAttr}><xdr:nvGraphicFramePr>${stringifyNonVisualDrawingProperties(\"xdr:cNvPr\", id, cNvPr, name, hlinkClickXml(extras.hyperlink, ctx))}` +\n `${cNvGraphicFramePr}</xdr:nvGraphicFramePr>` +\n `<xdr:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></xdr:xfrm>` +\n `<a:graphic><a:graphicData uri=\"${C_URI}\">` +\n `<c:chart xmlns:c=\"http://schemas.openxmlformats.org/drawingml/2006/chart\" xmlns:r=\"${R_NS}\" r:id=\"${rId}\"/>` +\n `</a:graphicData></a:graphic></xdr:graphicFrame>`\n );\n}\n\nexport function stringifyChart(chart: DrawingChartOptions, id: number, ctx?: WriteContext): string {\n // Charts keep their historical default footprint (10 columns × 17 rows)\n // when no to corner is set; graphicFrame xfrm stays 0×0 for twoCellAnchor\n // because the position comes from the cell markers.\n const anchor = { toCol: chart.col + 9, toRow: chart.row + 16, ...chart };\n const clientData = clientDataXml(chart);\n const isTwoCell = (anchor.anchorType ?? ANCHOR_TYPES.twoCell) === ANCHOR_TYPES.twoCell;\n const cx = isTwoCell ? 0 : convertToEmu(anchor.extentCx ?? DEFAULT_EXTENT_CX);\n const cy = isTwoCell ? 0 : convertToEmu(anchor.extentCy ?? DEFAULT_EXTENT_CY);\n const frame = graphicFrameXml(id, chart, `Chart ${id}`, chart.rId, cx, cy, ctx, {\n frameLocks: chart.frameLocks,\n macro: chart.macro,\n hyperlink: chart.hyperlink,\n });\n return wrapAnchor(anchor, `${frame}${clientData}`);\n}\n\n/** Anchored SmartArt: a graphicFrame whose graphicData points at the four\n * diagram parts through dgm:relIds (same anchor footprint as a chart). */\nexport function stringifySmartArt(\n smartArt: DrawingSmartArtOptions,\n id: number,\n ctx?: WriteContext,\n): string {\n const anchor = { toCol: smartArt.col + 9, toRow: smartArt.row + 16, ...smartArt };\n const clientData = clientDataXml(smartArt);\n const isTwoCell = (anchor.anchorType ?? ANCHOR_TYPES.twoCell) === ANCHOR_TYPES.twoCell;\n const cx = isTwoCell ? 0 : convertToEmu(anchor.extentCx ?? DEFAULT_EXTENT_CX);\n const cy = isTwoCell ? 0 : convertToEmu(anchor.extentCy ?? DEFAULT_EXTENT_CY);\n // Same nv/xfrm scaffolding as graphicFrameXml, with dgm:relIds replacing\n // the c:chart payload.\n const locks = smartArt.frameLocks\n ? (graphicFrameLockingDesc.stringify(smartArt.frameLocks, ctx as WriteContext) ?? \"\")\n : \"\";\n const cNvGraphicFramePr = locks\n ? `<xdr:cNvGraphicFramePr>${locks}</xdr:cNvGraphicFramePr>`\n : \"<xdr:cNvGraphicFramePr/>\";\n const macroAttr = smartArt.macro === undefined ? \"\" : ` macro=\"${escapeXml(smartArt.macro)}\"`;\n const frame =\n `<xdr:graphicFrame${macroAttr}><xdr:nvGraphicFramePr>${stringifyNonVisualDrawingProperties(\"xdr:cNvPr\", id, smartArt, `SmartArt ${id}`)}` +\n `${cNvGraphicFramePr}</xdr:nvGraphicFramePr>` +\n `<xdr:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></xdr:xfrm>` +\n `<a:graphic><a:graphicData uri=\"${DGM_URI}\">` +\n `<dgm:relIds xmlns:dgm=\"http://schemas.openxmlformats.org/drawingml/2006/diagram\" r:dm=\"${smartArt.dataRId}\" r:lo=\"${smartArt.layoutRId}\" r:qs=\"${smartArt.quickStyleRId}\" r:cs=\"${smartArt.colorsRId}\"/>` +\n `</a:graphicData></a:graphic></xdr:graphicFrame>`;\n return wrapAnchor(anchor, `${frame}${clientData}`);\n}\n\n/** Build the inner xdr:sp content (nvSpPr + spPr + optional style/txBody). */\nfunction buildShapeContent(\n shape: NonVisualDrawingPropertiesOptions & {\n textBox?: boolean;\n hyperlink?: TextHyperlinkOptions;\n locking?: ShapeLockingOptions;\n },\n id: number,\n fallbackName: string,\n spPr: ShapePropertiesOptions,\n textBody: TextBodyOptions | undefined,\n ctx: WriteContext,\n attrs = \"\",\n style?: DefaultShapeStyleOptions,\n): string {\n const cNvPr = shape;\n const spPrXml = shapePropertiesDesc.stringify(spPr, ctx) ?? \"\";\n const styleXml = style ? stringifyShapeStyle(style, ctx, \"xdr:style\") : \"\";\n const txBodyXml = textBody\n ? `<xdr:txBody>${textBodyDesc.stringify(textBody, ctx)}</xdr:txBody>`\n : \"\";\n const txBoxAttr = shape.textBox === undefined ? \"\" : ` txBox=\"${shape.textBox ? 1 : 0}\"`;\n const locksXml = shape.locking ? (shapeLockingDesc.stringify(shape.locking, ctx) ?? \"\") : \"\";\n const cNvSpPr = locksXml\n ? `<xdr:cNvSpPr${txBoxAttr}>${locksXml}</xdr:cNvSpPr>`\n : `<xdr:cNvSpPr${txBoxAttr}/>`;\n return `<xdr:sp${attrs}><xdr:nvSpPr>${stringifyNonVisualDrawingProperties(\"xdr:cNvPr\", id, cNvPr, fallbackName, hlinkClickXml(shape.hyperlink, ctx))}${cNvSpPr}</xdr:nvSpPr><xdr:spPr>${spPrXml}</xdr:spPr>${styleXml}${txBodyXml}</xdr:sp>`;\n}\n\n/** Build the inner xdr:cxnSp content (nvCxnSpPr + spPr). */\nfunction buildConnectorContent(\n cNvPr: (NonVisualDrawingPropertiesOptions & { hyperlink?: TextHyperlinkOptions }) | undefined,\n id: number,\n fallbackName: string,\n spPr: ShapePropertiesOptions,\n ctx: WriteContext,\n attrs = \"\",\n connector?: {\n locking?: ConnectorLockingOptions;\n startConnection?: EndpointConnectionOptions;\n endConnection?: EndpointConnectionOptions;\n style?: DefaultShapeStyleOptions;\n },\n): string {\n const spPrXml = shapePropertiesDesc.stringify(spPr, ctx) ?? \"\";\n const styleXml = connector?.style ? stringifyShapeStyle(connector.style, ctx, \"xdr:style\") : \"\";\n const cNvCxnSpPrInner: string[] = [];\n if (connector?.locking) {\n const locks = connectorLockingDesc.stringify(connector.locking, ctx);\n if (locks) cNvCxnSpPrInner.push(locks);\n }\n if (connector?.startConnection) {\n cNvCxnSpPrInner.push(stringifyEndpointConnection(\"stCxn\", connector.startConnection));\n }\n if (connector?.endConnection) {\n cNvCxnSpPrInner.push(stringifyEndpointConnection(\"endCxn\", connector.endConnection));\n }\n const cNvCxnSpPr = cNvCxnSpPrInner.length\n ? `<xdr:cNvCxnSpPr>${cNvCxnSpPrInner.join(\"\")}</xdr:cNvCxnSpPr>`\n : \"<xdr:cNvCxnSpPr/>\";\n return `<xdr:cxnSp${attrs}><xdr:nvCxnSpPr>${stringifyNonVisualDrawingProperties(\"xdr:cNvPr\", id, cNvPr, fallbackName, hlinkClickXml(cNvPr?.hyperlink, ctx))}${cNvCxnSpPr}</xdr:nvCxnSpPr><xdr:spPr>${spPrXml}</xdr:spPr>${styleXml}</xdr:cxnSp>`;\n}\n\nexport function stringifyShape(shape: ShapeOptions, id: number, ctx: WriteContext): string {\n const xml = buildShapeContent(\n shape,\n id,\n `Shape ${id}`,\n shape.spPr,\n shape.textBody,\n ctx,\n macroTextlinkAttrs(shape),\n shape.style,\n );\n return wrapAnchor(shape, `${xml}${clientDataXml(shape)}`);\n}\n\nexport function stringifyConnector(conn: ConnectorOptions, id: number, ctx: WriteContext): string {\n const xml = buildConnectorContent(\n conn,\n id,\n `Connector ${id}`,\n conn.spPr,\n ctx,\n macroTextlinkAttrs(conn),\n conn,\n );\n return wrapAnchor(conn, `${xml}${clientDataXml(conn)}`);\n}\n\nexport function stringifyContentPart(cp: DrawingContentPartOptions): string {\n return wrapAnchor(cp, `<xdr:contentPart r:id=\"${cp.rId}\"/>${clientDataXml(cp)}`);\n}\n\n/** Build xdr:grpSp content and return the next available cNvPr id. */\nexport function buildGroup(\n grp: GroupOptions,\n id: number,\n ctx: WriteContext,\n): { xml: string; nextId: number } {\n const grpSpPrXml = groupShapePropertiesDesc.stringify(grp.grpSpPr, ctx) ?? \"\";\n let childId = id + 1;\n const children: string[] = [];\n for (const childShape of grp.shapes ?? []) {\n children.push(\n buildShapeContent(\n childShape,\n childId,\n `Shape ${childId}`,\n childShape.spPr,\n childShape.textBody,\n ctx,\n macroTextlinkAttrs(childShape),\n childShape.style,\n ),\n );\n childId++;\n }\n for (const childConn of grp.connectors ?? []) {\n children.push(\n buildConnectorContent(\n childConn,\n childId,\n `Connector ${childId}`,\n childConn.spPr,\n ctx,\n macroTextlinkAttrs(childConn),\n childConn,\n ),\n );\n childId++;\n }\n const xml =\n `<xdr:grpSp><xdr:nvGrpSpPr>${stringifyNonVisualDrawingProperties(\"xdr:cNvPr\", id, grp, `Group ${id}`, hlinkClickXml(grp.hyperlink, ctx))}<xdr:cNvGrpSpPr/></xdr:nvGrpSpPr>` +\n `<xdr:grpSpPr>${grpSpPrXml}</xdr:grpSpPr>${children.join(\"\")}</xdr:grpSp>`;\n return { xml, nextId: childId };\n}\n\n/** CT_Shape attribute string (macro/textlink) with leading space, or empty. */\nfunction macroTextlinkAttrs(shape: { macro?: string; textlink?: string }): string {\n const a: string[] = [];\n if (shape.macro !== undefined) a.push(`macro=\"${escapeXml(shape.macro)}\"`);\n if (shape.textlink !== undefined) a.push(`textlink=\"${escapeXml(shape.textlink)}\"`);\n return a.length ? \" \" + a.join(\" \") : \"\";\n}\n","/**\n * XLSX Drawing — anchor objects and descriptor.\n *\n * Generates xl/drawings/drawing{n}.xml using the spreadsheetDrawing\n * namespace for anchoring drawing objects (images, charts, shapes, groups,\n * connectors, content parts) to worksheet cells.\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport {\n parseChartAnchor,\n parseConnectorAnchor,\n parseContentPartAnchor,\n parseGroupAnchor,\n parseImageAnchor,\n parseShapeAnchor,\n parseSmartArtAnchor,\n findXdr,\n} from \"./parse\";\nimport {\n buildGroup,\n clientDataXml,\n stringifyChart,\n stringifyConnector,\n stringifyContentPart,\n stringifyImage,\n stringifyShape,\n stringifySmartArt,\n wrapAnchor,\n A_NS,\n R_NS,\n XDR_NS,\n} from \"./stringify\";\nimport type {\n DrawingChartOptions,\n DrawingContentPartOptions,\n DrawingSmartArtOptions,\n ConnectorOptions,\n GroupOptions,\n DrawingPictureOptions,\n DrawingOptions,\n ShapeOptions,\n} from \"./types\";\n\n// ── Descriptor ──\n\n/** Original cNvPr id of an anchored object (the anchor's first cNvPr is the object's own — its nv*Pr container precedes everything else). */\nfunction readAnchorShapeId(anchor: XmlElement): number | undefined {\n const firstCnvPr = (el: XmlElement): XmlElement | undefined => {\n for (const child of el.elements ?? []) {\n if ((child.name ?? \"\").endsWith(\"cNvPr\")) return child;\n const found = firstCnvPr(child);\n if (found) return found;\n }\n return undefined;\n };\n const cNvPr = firstCnvPr(anchor);\n if (!cNvPr) return undefined;\n const id = Number(cNvPr.attributes?.[\"id\"]);\n return Number.isNaN(id) ? undefined : id;\n}\n\nexport const drawingDesc: CustomDescriptor<DrawingOptions> = {\n kind: \"custom\",\n\n stringify(opts, ctx) {\n const images = opts.images ?? [];\n const charts = opts.charts ?? [];\n const smartArts = opts.smartArts ?? [];\n const shapes = opts.shapes ?? [];\n const connectors = opts.connectors ?? [];\n const groups = opts.groups ?? [];\n const contentParts = opts.contentParts ?? [];\n const total =\n images.length +\n charts.length +\n smartArts.length +\n shapes.length +\n connectors.length +\n groups.length +\n contentParts.length;\n if (total === 0) return undefined;\n\n // Anchors carry their document order from parse (the z-order when objects\n // overlap). Emit in that order; fresh options without one keep the\n // per-type bucket order (stable sort).\n interface Emission {\n order: number | undefined;\n shapeId: number | undefined;\n emit: (id: number) => string;\n }\n const emissions: Emission[] = [];\n for (const img of images)\n emissions.push({\n order: img.zOrder,\n shapeId: img.shapeId,\n emit: (id) => stringifyImage(img, id, ctx),\n });\n for (const chart of charts)\n emissions.push({\n order: chart.zOrder,\n shapeId: chart.shapeId,\n emit: (id) => stringifyChart(chart, id, ctx),\n });\n for (const smartArt of smartArts)\n emissions.push({\n order: smartArt.zOrder,\n shapeId: smartArt.shapeId,\n emit: (id) => stringifySmartArt(smartArt, id, ctx),\n });\n for (const shape of shapes)\n emissions.push({\n order: shape.zOrder,\n shapeId: shape.shapeId,\n emit: (id) => stringifyShape(shape, id, ctx),\n });\n for (const conn of connectors)\n emissions.push({\n order: conn.zOrder,\n shapeId: conn.shapeId,\n emit: (id) => stringifyConnector(conn, id, ctx),\n });\n for (const grp of groups)\n emissions.push({\n order: grp.zOrder,\n shapeId: grp.shapeId,\n emit: (id) => wrapAnchor(grp, `${buildGroup(grp, id, ctx).xml}${clientDataXml(grp)}`),\n });\n for (const cp of contentParts)\n emissions.push({\n order: cp.zOrder,\n shapeId: cp.shapeId,\n emit: () => stringifyContentPart(cp),\n });\n emissions.sort((a, b) => (a.order ?? Infinity) - (b.order ?? Infinity));\n\n // Ids: keep each object's original cNvPr id when present (round-trip);\n // allocate unused ones for the rest (fresh authoring).\n const usedIds = new Set<number>(\n emissions.map((e) => e.shapeId).filter((n): n is number => n !== undefined),\n );\n const p: string[] = [`<xdr:wsDr xmlns:xdr=\"${XDR_NS}\" xmlns:a=\"${A_NS}\" xmlns:r=\"${R_NS}\">`];\n let next = 1;\n for (const e of emissions) {\n const id =\n e.shapeId ??\n ((): number => {\n while (usedIds.has(next)) next++;\n usedIds.add(next);\n return next;\n })();\n p.push(e.emit(id));\n }\n\n p.push(\"</xdr:wsDr>\");\n return p.join(\"\");\n },\n\n parse(el, ctx) {\n const result: Partial<DrawingOptions> = {};\n const images: DrawingPictureOptions[] = [];\n const charts: DrawingChartOptions[] = [];\n const smartArts: DrawingSmartArtOptions[] = [];\n const shapes: ShapeOptions[] = [];\n const connectors: ConnectorOptions[] = [];\n const groups: GroupOptions[] = [];\n const contentParts: DrawingContentPartOptions[] = [];\n\n // Document order of the anchors is the z-order when objects overlap —\n // record it so stringify can re-emit them interleaved instead of grouped\n // per type bucket.\n let order = 0;\n const stamp = <T extends { zOrder?: number; shapeId?: number }>(\n obj: T,\n anchor: XmlElement,\n ): T => {\n obj.zOrder = order++;\n const shapeId = readAnchorShapeId(anchor);\n if (shapeId !== undefined) obj.shapeId = shapeId;\n return obj;\n };\n\n for (const anchor of el.elements ?? []) {\n // Office writes spreadsheetDrawing anchors in the default namespace or\n // with the xdr: prefix — normalize before dispatching.\n const rawName = anchor.name ?? \"\";\n const name = rawName.startsWith(\"xdr:\") ? rawName.slice(4) : rawName;\n if (name !== \"twoCellAnchor\" && name !== \"oneCellAnchor\" && name !== \"absoluteAnchor\") {\n continue;\n }\n\n const pic = findXdr(anchor, \"pic\");\n if (pic) {\n images.push(stamp(parseImageAnchor(anchor, pic, name, ctx), anchor));\n continue;\n }\n\n const graphicFrame = findXdr(anchor, \"graphicFrame\");\n if (graphicFrame) {\n const chart = parseChartAnchor(anchor, graphicFrame, name, ctx);\n if (chart) {\n charts.push(stamp(chart, anchor));\n continue;\n }\n const smartArt = parseSmartArtAnchor(anchor, graphicFrame, name, ctx);\n if (smartArt) {\n smartArts.push(stamp(smartArt, anchor));\n continue;\n }\n continue;\n }\n\n const sp = findXdr(anchor, \"sp\");\n if (sp) {\n shapes.push(stamp(parseShapeAnchor(anchor, sp, name, ctx), anchor));\n continue;\n }\n\n const cxnSp = findXdr(anchor, \"cxnSp\");\n if (cxnSp) {\n connectors.push(stamp(parseConnectorAnchor(anchor, cxnSp, name, ctx), anchor));\n continue;\n }\n\n const grpSp = findXdr(anchor, \"grpSp\");\n if (grpSp) {\n groups.push(stamp(parseGroupAnchor(anchor, grpSp, name, ctx), anchor));\n continue;\n }\n\n const contentPart = findXdr(anchor, \"contentPart\");\n if (contentPart) {\n const cp = parseContentPartAnchor(anchor, contentPart, name);\n if (cp) contentParts.push(stamp(cp, anchor));\n }\n }\n\n if (images.length > 0) result.images = images;\n if (charts.length > 0) result.charts = charts;\n if (smartArts.length > 0) result.smartArts = smartArts;\n if (shapes.length > 0) result.shapes = shapes;\n if (connectors.length > 0) result.connectors = connectors;\n if (groups.length > 0) result.groups = groups;\n if (contentParts.length > 0) result.contentParts = contentParts;\n return result as DrawingOptions;\n },\n};\n","/**\n * External Link types and descriptor for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd, CT_ExternalLink\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs, escapeXml, findChild } from \"@office-open/xml\";\n\n// ── Types ──\n\nexport interface ExternalDefinedNameOptions {\n name: string;\n refersTo?: string;\n sheetId?: number;\n}\n\nexport interface ExternalCellOptions {\n /** Cell reference, e.g. \"A1\" */\n reference: string;\n /**\n * Cell data type (CT_ExternalCell `@t`). ISO transitional reuses the full\n * ST_CellType, but an external link has no sharedStrings table to resolve\n * \"s\" against and CT_ExternalCell's only child is `<v>` (no `<is>` for\n * inlineStr) — the usable domain is the ECMA-376 1st edition set.\n */\n type?: \"b\" | \"n\" | \"e\" | \"str\";\n /** Cell value */\n value?: string;\n /** Value metadata index (CT_ExternalCell `@vm`) */\n valueMetadataIndex?: number;\n}\n\nexport interface ExternalBookOptions {\n /** Target path of the external workbook */\n target?: string;\n /** Sheet names from the external workbook */\n sheetNames?: string[];\n /** Defined names from the external workbook */\n definedNames?: ExternalDefinedNameOptions[];\n /** Cached sheet data from the external workbook */\n sheetDataSet?: ExternalSheetDataOptions[];\n}\n\nexport interface ExternalRowOptions {\n /** Row number (1-based) */\n rowNumber: number;\n cells?: ExternalCellOptions[];\n}\n\nexport interface ExternalSheetDataOptions {\n sheetId: number;\n refreshError?: boolean;\n rows?: ExternalRowOptions[];\n}\n\n/** An external workbook link (xl/externalLinks/externalLinkN.xml). */\nexport interface ExternalLinkOptions {\n /** External book configuration */\n externalBook?: ExternalBookOptions;\n /** Relationship ID for the external book (set by compiler) */\n bookRId?: string;\n /** DDE link configuration (CT_DdeLink) */\n ddeLink?: DdeLinkOptions;\n /** OLE link configuration (CT_OleLink) */\n oleLink?: OleLinkOptions;\n /** Relationship ID for the OLE link (set by compiler) */\n oleRId?: string;\n}\n\n/** One cached DDE value (CT_DdeValue — val element + type attribute). */\nexport interface DdeValueOptions {\n /** Value type (ST_DdeValueType, default \"n\") */\n type?: \"nil\" | \"b\" | \"n\" | \"e\" | \"str\";\n /** Value text (the val element) */\n value: string;\n}\n\n/** Cached DDE value grid (CT_DdeValues) */\nexport interface DdeValuesOptions {\n /** Row count of the cached grid (default 1) */\n rows?: number;\n /** Column count of the cached grid (default 1) */\n cols?: number;\n values: DdeValueOptions[];\n}\n\n/** One DDE item (CT_DdeItem) */\nexport interface DdeItemOptions {\n /** Item name (default \"0\") */\n name?: string;\n /** Item is an OLE link */\n ole?: boolean;\n /** Advise events on the item */\n advise?: boolean;\n /** Prefer picture representation */\n preferPic?: boolean;\n /** Cached values */\n values?: DdeValuesOptions;\n}\n\n/** DDE link (CT_DdeLink — ddeService/ddeTopic + items) */\nexport interface DdeLinkOptions {\n /** DDE service name */\n ddeService: string;\n ddeTopic: string;\n ddeItems?: DdeItemOptions[];\n}\n\nexport interface OleItemOptions {\n /** OLE item name (required) */\n name: string;\n /** Show as icon */\n icon?: boolean;\n /** Whether to advise events */\n advise?: boolean;\n /** Prefer picture representation */\n preferPic?: boolean;\n}\n\nexport interface OleLinkOptions {\n /** OLE program identifier (CT_OleLink `@progId`) */\n progId?: string;\n oleItems?: OleItemOptions[];\n}\n\n// ── Descriptor ──\n\nexport const externalLinkDesc: CustomDescriptor<ExternalLinkOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<externalLink xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ];\n\n if (opts.externalBook) {\n const book = opts.externalBook;\n const bookParts: string[] = [];\n\n if (book.sheetNames && book.sheetNames.length > 0) {\n bookParts.push(\"<sheetNames>\");\n for (const name of book.sheetNames) {\n bookParts.push(`<sheetName val=\"${escapeXml(name)}\"/>`);\n }\n bookParts.push(\"</sheetNames>\");\n }\n\n if (book.definedNames && book.definedNames.length > 0) {\n bookParts.push(\"<definedNames>\");\n for (const dn of book.definedNames) {\n const dnAttrs: Record<string, string | number | boolean | undefined> = { name: dn.name };\n if (dn.refersTo !== undefined) dnAttrs.refersTo = dn.refersTo;\n if (dn.sheetId !== undefined) dnAttrs.sheetId = dn.sheetId;\n bookParts.push(`<definedName${attrs(dnAttrs)}/>`);\n }\n bookParts.push(\"</definedNames>\");\n }\n\n if (book.sheetDataSet && book.sheetDataSet.length > 0) {\n bookParts.push(\"<sheetDataSet>\");\n for (const sd of book.sheetDataSet) {\n const sdAttrs: Record<string, string | number | boolean | undefined> = {\n sheetId: sd.sheetId,\n };\n if (sd.refreshError) sdAttrs.refreshError = 1;\n bookParts.push(`<sheetData${attrs(sdAttrs)}>`);\n\n if (sd.rows) {\n for (const row of sd.rows) {\n bookParts.push(`<row r=\"${row.rowNumber}\">`);\n if (row.cells) {\n for (const cell of row.cells) {\n const cellAttrs: Record<string, string | number | undefined> = {\n r: cell.reference,\n };\n if (cell.type !== undefined) cellAttrs.t = cell.type;\n if (cell.valueMetadataIndex !== undefined) cellAttrs.vm = cell.valueMetadataIndex;\n if (cell.value !== undefined) {\n bookParts.push(\n `<cell${attrs(cellAttrs)}><v>${escapeXml(cell.value)}</v></cell>`,\n );\n } else {\n bookParts.push(`<cell${attrs(cellAttrs)}/>`);\n }\n }\n }\n bookParts.push(\"</row>\");\n }\n }\n bookParts.push(\"</sheetData>\");\n }\n bookParts.push(\"</sheetDataSet>\");\n }\n\n const ridAttr = opts.bookRId ? ` r:id=\"${opts.bookRId}\"` : \"\";\n p.push(\n `<externalBook${ridAttr}${bookParts.length > 0 ? `>${bookParts.join(\"\")}</externalBook>` : \"/>\"}`,\n );\n }\n\n // ddeLink (CT_DdeLink — ddeService/ddeTopic + items with cached values)\n if (opts.ddeLink) {\n const dde = opts.ddeLink;\n const ddeParts: string[] = [];\n if (dde.ddeItems && dde.ddeItems.length > 0) {\n ddeParts.push(\"<ddeItems>\");\n for (const item of dde.ddeItems) {\n const itemAttrs: string[] = [];\n if (item.name !== undefined) itemAttrs.push(`name=\"${escapeXml(item.name)}\"`);\n if (item.ole) itemAttrs.push('ole=\"1\"');\n if (item.advise) itemAttrs.push('advise=\"1\"');\n if (item.preferPic) itemAttrs.push('preferPic=\"1\"');\n if (item.values) {\n const v = item.values;\n const valuesAttrs: string[] = [];\n if (v.rows !== undefined) valuesAttrs.push(`rows=\"${v.rows}\"`);\n if (v.cols !== undefined) valuesAttrs.push(`cols=\"${v.cols}\"`);\n const valueParts: string[] = [];\n for (const dv of v.values) {\n const valueAttrs = dv.type !== undefined ? ` t=\"${dv.type}\"` : \"\";\n valueParts.push(`<value${valueAttrs}><val>${escapeXml(dv.value)}</val></value>`);\n }\n ddeParts.push(\n `<ddeItem${itemAttrs.length > 0 ? \" \" + itemAttrs.join(\" \") : \"\"}><values${valuesAttrs.length > 0 ? \" \" + valuesAttrs.join(\" \") : \"\"}>${valueParts.join(\"\")}</values></ddeItem>`,\n );\n } else {\n ddeParts.push(`<ddeItem${itemAttrs.length > 0 ? \" \" + itemAttrs.join(\" \") : \"\"}/>`);\n }\n }\n ddeParts.push(\"</ddeItems>\");\n }\n p.push(\n `<ddeLink ddeService=\"${escapeXml(dde.ddeService)}\" ddeTopic=\"${escapeXml(dde.ddeTopic)}\"${ddeParts.length > 0 ? `>${ddeParts.join(\"\")}</ddeLink>` : \"/>\"}`,\n );\n }\n\n // oleLink (CT_OleLink)\n if (opts.oleLink) {\n const oleRId = opts.oleRId ? ` r:id=\"${escapeXml(opts.oleRId)}\"` : \"\";\n const progIdAttr = opts.oleLink.progId ? ` progId=\"${escapeXml(opts.oleLink.progId)}\"` : \"\";\n const oleChildren: string[] = [];\n if (opts.oleLink.oleItems && opts.oleLink.oleItems.length > 0) {\n const itemParts: string[] = [`<oleItems>`];\n for (const item of opts.oleLink.oleItems) {\n const itemAttrs: string[] = [`name=\"${escapeXml(item.name)}\"`];\n if (item.icon) itemAttrs.push('icon=\"1\"');\n if (item.advise) itemAttrs.push('advise=\"1\"');\n if (item.preferPic) itemAttrs.push('preferPic=\"1\"');\n itemParts.push(`<oleItem ${itemAttrs.join(\" \")}/>`);\n }\n itemParts.push(\"</oleItems>\");\n oleChildren.push(itemParts.join(\"\"));\n }\n if (oleChildren.length > 0) {\n p.push(`<oleLink${oleRId}${progIdAttr}>${oleChildren.join(\"\")}</oleLink>`);\n } else {\n p.push(`<oleLink${oleRId}${progIdAttr}/>`);\n }\n }\n\n p.push(\"</externalLink>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<ExternalLinkOptions> = {};\n\n const bookEl = findChild(el, \"externalBook\");\n if (bookEl) {\n const book: ExternalBookOptions = {};\n if (bookEl.attributes?.[\"r:id\"]) result.bookRId = String(bookEl.attributes[\"r:id\"]);\n\n // sheetNames\n const sheetNamesEl = findChild(bookEl, \"sheetNames\");\n if (sheetNamesEl) {\n const names: string[] = [];\n for (const child of sheetNamesEl.elements ?? []) {\n if (child.name === \"sheetName\" && child.attributes?.[\"val\"]) {\n names.push(String(child.attributes[\"val\"]));\n }\n }\n if (names.length > 0) book.sheetNames = names;\n }\n\n // definedNames\n const definedNamesEl = findChild(bookEl, \"definedNames\");\n if (definedNamesEl) {\n const dns: ExternalDefinedNameOptions[] = [];\n for (const child of definedNamesEl.elements ?? []) {\n if (child.name !== \"definedName\") continue;\n const dn: ExternalDefinedNameOptions = { name: String(child.attributes?.[\"name\"] ?? \"\") };\n if (child.attributes?.[\"refersTo\"]) dn.refersTo = String(child.attributes[\"refersTo\"]);\n if (child.attributes?.[\"sheetId\"] !== undefined)\n dn.sheetId = Number(child.attributes[\"sheetId\"]);\n dns.push(dn);\n }\n if (dns.length > 0) book.definedNames = dns;\n }\n\n // sheetDataSet\n const sheetDataSetEl = findChild(bookEl, \"sheetDataSet\");\n if (sheetDataSetEl) {\n const sds: ExternalSheetDataOptions[] = [];\n for (const sdChild of sheetDataSetEl.elements ?? []) {\n if (sdChild.name !== \"sheetData\") continue;\n const sd: ExternalSheetDataOptions = {\n sheetId: Number(sdChild.attributes?.[\"sheetId\"] ?? 0),\n };\n if (sdChild.attributes?.[\"refreshError\"]) sd.refreshError = true;\n\n const rows: ExternalRowOptions[] = [];\n for (const rowChild of sdChild.elements ?? []) {\n if (rowChild.name !== \"row\") continue;\n const row: ExternalRowOptions = {\n rowNumber: Number(rowChild.attributes?.[\"r\"] ?? 0),\n };\n\n const cells: ExternalCellOptions[] = [];\n for (const cellChild of rowChild.elements ?? []) {\n if (cellChild.name !== \"cell\") continue;\n const cell: ExternalCellOptions = {\n reference: String(cellChild.attributes?.[\"r\"] ?? \"\"),\n };\n if (cellChild.attributes?.[\"t\"])\n cell.type = String(cellChild.attributes[\"t\"]) as ExternalCellOptions[\"type\"];\n if (cellChild.attributes?.[\"vm\"] !== undefined)\n cell.valueMetadataIndex = Number(cellChild.attributes[\"vm\"]);\n const vEl = findChild(cellChild, \"v\");\n if (vEl && vEl.elements?.[0]?.text !== undefined) {\n cell.value = String(vEl.elements[0].text);\n }\n cells.push(cell);\n }\n if (cells.length > 0) row.cells = cells;\n rows.push(row);\n }\n if (rows.length > 0) sd.rows = rows;\n sds.push(sd);\n }\n if (sds.length > 0) book.sheetDataSet = sds;\n }\n\n result.externalBook = book;\n }\n\n // ddeLink\n const ddeEl = findChild(el, \"ddeLink\");\n if (ddeEl) {\n const dde: DdeLinkOptions = {\n ddeService: String(ddeEl.attributes?.[\"ddeService\"] ?? \"\"),\n ddeTopic: String(ddeEl.attributes?.[\"ddeTopic\"] ?? \"\"),\n };\n\n const ddeItemsEl = findChild(ddeEl, \"ddeItems\");\n if (ddeItemsEl) {\n const items: DdeItemOptions[] = [];\n for (const child of ddeItemsEl.elements ?? []) {\n if (child.name !== \"ddeItem\") continue;\n const item: DdeItemOptions = {};\n if (child.attributes?.[\"name\"] !== undefined)\n item.name = String(child.attributes[\"name\"]);\n if (child.attributes?.[\"ole\"]) item.ole = true;\n if (child.attributes?.[\"advise\"]) item.advise = true;\n if (child.attributes?.[\"preferPic\"]) item.preferPic = true;\n\n const valuesEl = findChild(child, \"values\");\n if (valuesEl) {\n const values: DdeValuesOptions = { values: [] };\n if (valuesEl.attributes?.[\"rows\"] !== undefined)\n values.rows = Number(valuesEl.attributes[\"rows\"]);\n if (valuesEl.attributes?.[\"cols\"] !== undefined)\n values.cols = Number(valuesEl.attributes[\"cols\"]);\n for (const valueChild of valuesEl.elements ?? []) {\n if (valueChild.name !== \"value\") continue;\n const valEl = findChild(valueChild, \"val\");\n const dv: DdeValueOptions = {\n value: valEl ? String(valEl.elements?.[0]?.text ?? \"\") : \"\",\n };\n if (valueChild.attributes?.[\"t\"])\n dv.type = valueChild.attributes[\"t\"] as DdeValueOptions[\"type\"];\n values.values.push(dv);\n }\n item.values = values;\n }\n items.push(item);\n }\n if (items.length > 0) dde.ddeItems = items;\n }\n\n result.ddeLink = dde;\n }\n\n // oleLink\n const oleEl = findChild(el, \"oleLink\");\n if (oleEl) {\n const ole: OleLinkOptions = {};\n if (oleEl.attributes?.[\"r:id\"]) result.oleRId = String(oleEl.attributes[\"r:id\"]);\n if (oleEl.attributes?.[\"progId\"]) ole.progId = String(oleEl.attributes[\"progId\"]);\n\n const oleItemsEl = findChild(oleEl, \"oleItems\");\n if (oleItemsEl) {\n const items: OleItemOptions[] = [];\n for (const child of oleItemsEl.elements ?? []) {\n if (child.name !== \"oleItem\") continue;\n const item: OleItemOptions = { name: String(child.attributes?.[\"name\"] ?? \"\") };\n if (child.attributes?.[\"icon\"]) item.icon = true;\n if (child.attributes?.[\"advise\"]) item.advise = true;\n if (child.attributes?.[\"preferPic\"]) item.preferPic = true;\n items.push(item);\n }\n if (items.length > 0) ole.oleItems = items;\n }\n\n result.oleLink = ole;\n }\n\n return result as ExternalLinkOptions;\n },\n};\n","/**\n * Connection types and descriptor for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd, CT_Connections\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, escapeXml, findChild } from \"@office-open/xml\";\n\nimport { parseOlapPr, stringifyOlapPr } from \"./pivot/pivot-utils\";\nimport type { OLAPPropertiesOptions } from \"./pivot/pivot-utils\";\n\n// ── Options ──\n\n/** Database (OLE DB) connection properties (CT_DbPr). */\nexport interface DatabasePropertiesOptions {\n /** OLE DB connection string (required) */\n connection: string;\n /** Command text */\n command?: string;\n /** Server command text (CT_DbPr `@serverCommand`) */\n serverCommand?: string;\n /** Command type: 1=cube, 2=SQL, 3=table (default 2) */\n commandType?: number;\n}\n\n/** One web-query table selection (CT_Tables choice: m/s/x). */\nexport type WebTableSelection = string | number | null;\n\n/** Web query properties (CT_WebPr). */\nexport interface WebPropertiesOptions {\n /** Source URL (CT_WebPr `@url`) */\n url?: string;\n /** XML source query (CT_WebPr `@xml`) */\n xml?: boolean;\n /** Source data included (CT_WebPr `@sourceData`) */\n sourceData?: boolean;\n /** Parse PRE tags into columns (CT_WebPr `@parsePre`) */\n parsePre?: boolean;\n /** Consecutive delimiters as one (CT_WebPr `@consecutive`) */\n consecutive?: boolean;\n /** First row contains headers (CT_WebPr `@firstRow`) */\n firstRow?: boolean;\n /** XL97 compatible (CT_WebPr `@xl97`) */\n xl97?: boolean;\n /** Dates as text (CT_WebPr `@textDates`) */\n textDates?: boolean;\n /** XL2000 compatible (CT_WebPr `@xl2000`) */\n xl2000?: boolean;\n /** POST request body (CT_WebPr `@post`) */\n post?: string;\n /** HTML tables only (CT_WebPr `@htmlTables`) */\n htmlTables?: boolean;\n /** HTML formatting (CT_WebPr `@htmlFormat`, ST_HtmlFmt) */\n htmlFormat?: \"none\" | \"rtf\" | \"all\";\n /** Edit page URL (CT_WebPr `@editPage`) */\n editPage?: string;\n /** Selected tables (CT_Tables: string name, number index, null = all/missing) */\n tables?: WebTableSelection[];\n}\n\n/** Text import field (CT_TextField). */\nexport interface ConnectionTextFieldOptions {\n /** Field data type (CT_TextField `@type`, ST_ExternalConnectionType) */\n type?: \"general\" | \"text\" | \"MDY\" | \"DMY\" | \"YMD\" | \"MYD\" | \"DYM\" | \"YDM\" | \"skip\" | \"EMD\";\n /** Field position (default 0) */\n position?: number;\n}\n\n/** Text import properties (CT_TextPr). */\nexport interface TextPropertiesOptions {\n /** Prompt for file name (default true) */\n prompt?: boolean;\n /** File type: \"mac\" | \"win\" | \"dos\" (default \"win\") */\n fileType?: \"mac\" | \"win\" | \"dos\";\n /** Code page (default 1252) */\n codePage?: number;\n characterSet?: string;\n /** First row to import (default 1) */\n firstRow?: number;\n /** Source file path */\n sourceFile?: string;\n /** Tab-delimited (default true) */\n delimited?: boolean;\n /** User-defined delimiter character (CT_TextPr `@delimiter`) */\n delimiter?: string;\n /** Decimal separator (default \".\") */\n decimal?: string;\n /** Thousands separator (default \",\") */\n thousands?: string;\n /** Tab delimiter (default true) */\n tab?: boolean;\n /** Space delimiter (default false) */\n space?: boolean;\n /** Comma delimiter (default false) */\n comma?: boolean;\n /** Semicolon delimiter (default false) */\n semicolon?: boolean;\n /** Consecutive delimiters as one (default false) */\n consecutive?: boolean;\n /** Text qualifier: \"doubleQuote\" | \"singleQuote\" | \"none\" */\n qualifier?: \"doubleQuote\" | \"singleQuote\" | \"none\";\n /** Field layout (CT_TextFields) */\n textFields?: ConnectionTextFieldOptions[];\n}\n\n/** Query parameter (CT_Parameter). */\nexport interface ParameterOptions {\n /** Parameter name */\n name?: string;\n /** SQL data type (default 0) */\n sqlType?: number;\n /** Parameter type: \"prompt\" | \"value\" | \"cell\" (default \"prompt\") */\n parameterType?: \"prompt\" | \"value\" | \"cell\";\n /** Refresh when the parameter value changes (default false) */\n refreshOnChange?: boolean;\n /** Prompt text */\n prompt?: string;\n /** Boolean value */\n boolean?: boolean;\n /** Numeric value */\n double?: number;\n /** Integer value */\n integer?: number;\n /** String value */\n string?: string;\n /** Cell reference for the value */\n cell?: string;\n}\n\n/** Workbook connection (CT_Connection). */\nexport interface ConnectionOptions {\n /** Unique connection ID (required) */\n id: number;\n /** Connection name */\n name?: string;\n /**\n * Source type code (ECMA 18.13.1; Excel-verified: 6 = text file source —\n * Office writes it for textPr connections. Excel rejects a type-2 dbPr\n * connection whose provider string it cannot resolve.)\n */\n type?: number;\n /** Version of the application that last refreshed the connection (required by XSD) */\n refreshedVersion: number;\n /** Minimum refreshable version (default 0) */\n minRefreshableVersion?: number;\n /** Refresh on load (default false) */\n refreshOnLoad?: boolean;\n /** Background refresh (default false) */\n backgroundRefresh?: boolean;\n /** Save data with the workbook (default false) */\n saveData?: boolean;\n /** Save password (default false) */\n savePassword?: boolean;\n /** Connection description */\n description?: string;\n /** Credentials method: \"integrated\" | \"none\" | \"stored\" | \"prompt\" (default \"integrated\") */\n credentials?: string;\n /** Refresh interval in minutes (default 0) */\n interval?: number;\n /** Keep connection alive (default false) */\n keepAlive?: boolean;\n /** Newly added connection (default false) */\n new?: boolean;\n /** Connection deleted (default false) */\n deleted?: boolean;\n /** Source file path (CT_Connection `@sourceFile`) */\n sourceFile?: string;\n /** ODC file path (CT_Connection `@odcFile`) */\n odcFile?: string;\n /** Only use the connection file (default false) */\n onlyUseConnectionFile?: boolean;\n /** Reconnection method (default 1) */\n reconnectionMethod?: number;\n /** Single sign-on ID (CT_Connection `@singleSignOnId`) */\n singleSignOnId?: string;\n /** Database properties (CT_DbPr) */\n dbPr?: DatabasePropertiesOptions;\n /** OLAP properties (CT_OlapPr) */\n olapPr?: OLAPPropertiesOptions;\n /** Web query properties (CT_WebPr) */\n webPr?: WebPropertiesOptions;\n /** Text import properties (CT_TextPr) */\n textPr?: TextPropertiesOptions;\n /** Parameters (CT_Parameters) */\n parameters?: ParameterOptions[];\n}\n\n/** Options for xl/connections.xml (CT_Connections). */\nexport interface ConnectionsOptions {\n /** Workbook connections */\n connections: ConnectionOptions[];\n}\n\n// ── Descriptor ──\n\n// ST_CredMethod (sml.xsd:412) — closed enumeration\nconst CRED_METHODS: ReadonlySet<string> = new Set([\"integrated\", \"none\", \"stored\", \"prompt\"]);\n\nexport const connectionsDesc: CustomDescriptor<ConnectionsOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<connections xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n for (const c of opts.connections) {\n const cAttrs: string[] = [`id=\"${c.id}\"`];\n if (c.sourceFile !== undefined) cAttrs.push(`sourceFile=\"${escapeXml(c.sourceFile)}\"`);\n if (c.odcFile !== undefined) cAttrs.push(`odcFile=\"${escapeXml(c.odcFile)}\"`);\n if (c.keepAlive) cAttrs.push('keepAlive=\"1\"');\n if (c.interval !== undefined) cAttrs.push(`interval=\"${c.interval}\"`);\n if (c.name !== undefined) cAttrs.push(`name=\"${escapeXml(c.name)}\"`);\n if (c.description !== undefined) cAttrs.push(`description=\"${escapeXml(c.description)}\"`);\n if (c.type !== undefined) cAttrs.push(`type=\"${c.type}\"`);\n if (c.reconnectionMethod !== undefined)\n cAttrs.push(`reconnectionMethod=\"${c.reconnectionMethod}\"`);\n cAttrs.push(`refreshedVersion=\"${c.refreshedVersion}\"`);\n if (c.minRefreshableVersion !== undefined)\n cAttrs.push(`minRefreshableVersion=\"${c.minRefreshableVersion}\"`);\n if (c.savePassword) cAttrs.push('savePassword=\"1\"');\n if (c.new) cAttrs.push('new=\"1\"');\n if (c.deleted) cAttrs.push('deleted=\"1\"');\n if (c.onlyUseConnectionFile) cAttrs.push('onlyUseConnectionFile=\"1\"');\n if (c.backgroundRefresh) cAttrs.push('background=\"1\"');\n if (c.refreshOnLoad) cAttrs.push('refreshOnLoad=\"1\"');\n if (c.saveData) cAttrs.push('saveData=\"1\"');\n // ST_CredMethod is a closed enum — an unknown value would fail validation\n if (c.credentials !== undefined && CRED_METHODS.has(c.credentials)) {\n cAttrs.push(`credentials=\"${c.credentials}\"`);\n }\n if (c.singleSignOnId !== undefined)\n cAttrs.push(`singleSignOnId=\"${escapeXml(c.singleSignOnId)}\"`);\n\n const inner: string[] = [];\n if (c.dbPr) {\n const dAttrs: string[] = [`connection=\"${escapeXml(c.dbPr.connection)}\"`];\n if (c.dbPr.command !== undefined) dAttrs.push(`command=\"${escapeXml(c.dbPr.command)}\"`);\n if (c.dbPr.serverCommand !== undefined)\n dAttrs.push(`serverCommand=\"${escapeXml(c.dbPr.serverCommand)}\"`);\n if (c.dbPr.commandType !== undefined) dAttrs.push(`commandType=\"${c.dbPr.commandType}\"`);\n inner.push(`<dbPr ${dAttrs.join(\" \")}/>`);\n }\n if (c.olapPr) inner.push(stringifyOlapPr(c.olapPr));\n if (c.webPr) {\n const w = c.webPr;\n const wAttrs: string[] = [];\n if (w.xml) wAttrs.push('xml=\"1\"');\n if (w.sourceData) wAttrs.push('sourceData=\"1\"');\n if (w.parsePre) wAttrs.push('parsePre=\"1\"');\n if (w.consecutive) wAttrs.push('consecutive=\"1\"');\n if (w.firstRow) wAttrs.push('firstRow=\"1\"');\n if (w.xl97) wAttrs.push('xl97=\"1\"');\n if (w.textDates) wAttrs.push('textDates=\"1\"');\n if (w.xl2000) wAttrs.push('xl2000=\"1\"');\n if (w.url !== undefined) wAttrs.push(`url=\"${escapeXml(w.url)}\"`);\n if (w.post !== undefined) wAttrs.push(`post=\"${escapeXml(w.post)}\"`);\n if (w.htmlTables) wAttrs.push('htmlTables=\"1\"');\n if (w.htmlFormat !== undefined) wAttrs.push(`htmlFormat=\"${escapeXml(w.htmlFormat)}\"`);\n if (w.editPage !== undefined) wAttrs.push(`editPage=\"${escapeXml(w.editPage)}\"`);\n const tablesXml =\n w.tables && w.tables.length > 0\n ? `<tables count=\"${w.tables.length}\">${w.tables\n .map((t) =>\n t === null\n ? \"<m/>\"\n : typeof t === \"number\"\n ? `<x v=\"${t}\"/>`\n : `<s v=\"${escapeXml(t)}\"/>`,\n )\n .join(\"\")}</tables>`\n : \"\";\n if (tablesXml) inner.push(`<webPr ${wAttrs.join(\" \")}>${tablesXml}</webPr>`);\n else inner.push(`<webPr ${wAttrs.join(\" \")}/>`);\n }\n if (c.textPr) {\n const t = c.textPr;\n const tAttrs: string[] = [];\n if (t.prompt === false) tAttrs.push('prompt=\"0\"');\n if (t.fileType !== undefined) tAttrs.push(`fileType=\"${t.fileType}\"`);\n if (t.codePage !== undefined) tAttrs.push(`codePage=\"${t.codePage}\"`);\n if (t.characterSet !== undefined)\n tAttrs.push(`characterSet=\"${escapeXml(t.characterSet)}\"`);\n if (t.firstRow !== undefined) tAttrs.push(`firstRow=\"${t.firstRow}\"`);\n if (t.sourceFile !== undefined) tAttrs.push(`sourceFile=\"${escapeXml(t.sourceFile)}\"`);\n if (t.delimited === false) tAttrs.push('delimited=\"0\"');\n if (t.delimiter !== undefined) tAttrs.push(`delimiter=\"${escapeXml(t.delimiter)}\"`);\n if (t.decimal !== undefined) tAttrs.push(`decimal=\"${escapeXml(t.decimal)}\"`);\n if (t.thousands !== undefined) tAttrs.push(`thousands=\"${escapeXml(t.thousands)}\"`);\n if (t.tab === false) tAttrs.push('tab=\"0\"');\n if (t.space) tAttrs.push('space=\"1\"');\n if (t.comma) tAttrs.push('comma=\"1\"');\n if (t.semicolon) tAttrs.push('semicolon=\"1\"');\n if (t.consecutive) tAttrs.push('consecutive=\"1\"');\n if (t.qualifier !== undefined) tAttrs.push(`qualifier=\"${t.qualifier}\"`);\n const fieldsXml =\n t.textFields && t.textFields.length > 0\n ? `<textFields count=\"${t.textFields.length}\">${t.textFields\n .map((f) => {\n const fAttrs: string[] = [];\n if (f.type !== undefined) fAttrs.push(`type=\"${escapeXml(f.type)}\"`);\n if (f.position !== undefined) fAttrs.push(`position=\"${f.position}\"`);\n return `<textField ${fAttrs.join(\" \")}/>`;\n })\n .join(\"\")}</textFields>`\n : \"\";\n if (fieldsXml) inner.push(`<textPr ${tAttrs.join(\" \")}>${fieldsXml}</textPr>`);\n else inner.push(`<textPr ${tAttrs.join(\" \")}/>`);\n }\n if (c.parameters && c.parameters.length > 0) {\n const pmParts: string[] = [`<parameters count=\"${c.parameters.length}\">`];\n for (const pm of c.parameters) {\n const pmAttrs: string[] = [];\n if (pm.name !== undefined) pmAttrs.push(`name=\"${escapeXml(pm.name)}\"`);\n if (pm.sqlType !== undefined) pmAttrs.push(`sqlType=\"${pm.sqlType}\"`);\n if (pm.parameterType !== undefined) pmAttrs.push(`parameterType=\"${pm.parameterType}\"`);\n if (pm.refreshOnChange) pmAttrs.push('refreshOnChange=\"1\"');\n if (pm.prompt !== undefined) pmAttrs.push(`prompt=\"${escapeXml(pm.prompt)}\"`);\n if (pm.boolean !== undefined) pmAttrs.push(`boolean=\"${pm.boolean ? 1 : 0}\"`);\n if (pm.double !== undefined) pmAttrs.push(`double=\"${pm.double}\"`);\n if (pm.integer !== undefined) pmAttrs.push(`integer=\"${pm.integer}\"`);\n if (pm.string !== undefined) pmAttrs.push(`string=\"${escapeXml(pm.string)}\"`);\n if (pm.cell !== undefined) pmAttrs.push(`cell=\"${escapeXml(pm.cell)}\"`);\n pmParts.push(`<parameter ${pmAttrs.join(\" \")}/>`);\n }\n pmParts.push(\"</parameters>\");\n inner.push(pmParts.join(\"\"));\n }\n\n if (inner.length > 0)\n p.push(`<connection ${cAttrs.join(\" \")}>${inner.join(\"\")}</connection>`);\n else p.push(`<connection ${cAttrs.join(\" \")}/>`);\n }\n p.push(\"</connections>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const connections: ConnectionOptions[] = [];\n for (const cEl of el.elements ?? []) {\n if (cEl.name !== \"connection\") continue;\n const c: Partial<ConnectionOptions> = { id: attrNum(cEl, \"id\") ?? 0 };\n if (attr(cEl, \"sourceFile\") !== undefined) c.sourceFile = attr(cEl, \"sourceFile\");\n if (attr(cEl, \"odcFile\") !== undefined) c.odcFile = attr(cEl, \"odcFile\");\n if (parseOnOff(attr(cEl, \"keepAlive\"))) c.keepAlive = true;\n const interval = attrNum(cEl, \"interval\");\n if (interval !== undefined) c.interval = interval;\n if (attr(cEl, \"name\") !== undefined) c.name = attr(cEl, \"name\");\n if (attr(cEl, \"description\") !== undefined) c.description = attr(cEl, \"description\");\n const type = attrNum(cEl, \"type\");\n if (type !== undefined) c.type = type;\n const rm = attrNum(cEl, \"reconnectionMethod\");\n if (rm !== undefined) c.reconnectionMethod = rm;\n const rv = attrNum(cEl, \"refreshedVersion\");\n if (rv !== undefined) c.refreshedVersion = rv;\n const mrv = attrNum(cEl, \"minRefreshableVersion\");\n if (mrv !== undefined) c.minRefreshableVersion = mrv;\n if (parseOnOff(attr(cEl, \"savePassword\"))) c.savePassword = true;\n if (parseOnOff(attr(cEl, \"new\"))) c.new = true;\n if (parseOnOff(attr(cEl, \"deleted\"))) c.deleted = true;\n if (parseOnOff(attr(cEl, \"onlyUseConnectionFile\"))) c.onlyUseConnectionFile = true;\n if (parseOnOff(attr(cEl, \"background\"))) c.backgroundRefresh = true;\n if (parseOnOff(attr(cEl, \"refreshOnLoad\"))) c.refreshOnLoad = true;\n if (parseOnOff(attr(cEl, \"saveData\"))) c.saveData = true;\n if (attr(cEl, \"credentials\") !== undefined) c.credentials = attr(cEl, \"credentials\");\n if (attr(cEl, \"singleSignOnId\") !== undefined) c.singleSignOnId = attr(cEl, \"singleSignOnId\");\n\n const dbEl = findChild(cEl, \"dbPr\");\n if (dbEl) {\n c.dbPr = {\n connection: attr(dbEl, \"connection\") ?? \"\",\n command: attr(dbEl, \"command\"),\n serverCommand: attr(dbEl, \"serverCommand\"),\n commandType: attrNum(dbEl, \"commandType\"),\n };\n }\n const olapEl = findChild(cEl, \"olapPr\");\n if (olapEl) {\n const ol = parseOlapPr(olapEl);\n if (ol) c.olapPr = ol;\n }\n const webEl = findChild(cEl, \"webPr\");\n if (webEl) {\n const w: Partial<WebPropertiesOptions> = {};\n if (parseOnOff(attr(webEl, \"xml\"))) w.xml = true;\n if (parseOnOff(attr(webEl, \"sourceData\"))) w.sourceData = true;\n if (parseOnOff(attr(webEl, \"parsePre\"))) w.parsePre = true;\n if (parseOnOff(attr(webEl, \"consecutive\"))) w.consecutive = true;\n if (parseOnOff(attr(webEl, \"firstRow\"))) w.firstRow = true;\n if (parseOnOff(attr(webEl, \"xl97\"))) w.xl97 = true;\n if (parseOnOff(attr(webEl, \"textDates\"))) w.textDates = true;\n if (parseOnOff(attr(webEl, \"xl2000\"))) w.xl2000 = true;\n if (attr(webEl, \"url\") !== undefined) w.url = attr(webEl, \"url\");\n if (attr(webEl, \"post\") !== undefined) w.post = attr(webEl, \"post\");\n if (parseOnOff(attr(webEl, \"htmlTables\"))) w.htmlTables = true;\n if (attr(webEl, \"htmlFormat\") !== undefined)\n w.htmlFormat = attr(webEl, \"htmlFormat\") as WebPropertiesOptions[\"htmlFormat\"];\n if (attr(webEl, \"editPage\") !== undefined) w.editPage = attr(webEl, \"editPage\");\n const tablesEl = findChild(webEl, \"tables\");\n if (tablesEl) {\n const tables: WebTableSelection[] = [];\n for (const tEl of tablesEl.elements ?? []) {\n if (tEl.name === \"m\") tables.push(null);\n else if (tEl.name === \"s\") tables.push(attr(tEl, \"v\") ?? \"\");\n else if (tEl.name === \"x\") tables.push(attrNum(tEl, \"v\") ?? 0);\n }\n if (tables.length > 0) w.tables = tables;\n }\n c.webPr = w as WebPropertiesOptions;\n }\n const textEl = findChild(cEl, \"textPr\");\n if (textEl) {\n const t: Partial<TextPropertiesOptions> = {};\n if (String(attr(textEl, \"prompt\")) === \"0\") t.prompt = false;\n const ft = attr(textEl, \"fileType\");\n if (ft !== undefined) t.fileType = ft as TextPropertiesOptions[\"fileType\"];\n const cp = attrNum(textEl, \"codePage\");\n if (cp !== undefined) t.codePage = cp;\n if (attr(textEl, \"characterSet\") !== undefined)\n t.characterSet = attr(textEl, \"characterSet\");\n const fr = attrNum(textEl, \"firstRow\");\n if (fr !== undefined) t.firstRow = fr;\n if (attr(textEl, \"sourceFile\") !== undefined) t.sourceFile = attr(textEl, \"sourceFile\");\n if (String(attr(textEl, \"delimited\")) === \"0\") t.delimited = false;\n if (attr(textEl, \"delimiter\") !== undefined) t.delimiter = attr(textEl, \"delimiter\");\n if (attr(textEl, \"decimal\") !== undefined) t.decimal = attr(textEl, \"decimal\");\n if (attr(textEl, \"thousands\") !== undefined) t.thousands = attr(textEl, \"thousands\");\n if (String(attr(textEl, \"tab\")) === \"0\") t.tab = false;\n if (parseOnOff(attr(textEl, \"space\"))) t.space = true;\n if (parseOnOff(attr(textEl, \"comma\"))) t.comma = true;\n if (parseOnOff(attr(textEl, \"semicolon\"))) t.semicolon = true;\n if (parseOnOff(attr(textEl, \"consecutive\"))) t.consecutive = true;\n const q = attr(textEl, \"qualifier\");\n if (q !== undefined) t.qualifier = q as TextPropertiesOptions[\"qualifier\"];\n const fieldsEl = findChild(textEl, \"textFields\");\n if (fieldsEl) {\n const fields: ConnectionTextFieldOptions[] = [];\n for (const fEl of fieldsEl.elements ?? []) {\n if (fEl.name !== \"textField\") continue;\n const f: ConnectionTextFieldOptions = {};\n if (attr(fEl, \"type\") !== undefined)\n f.type = attr(fEl, \"type\") as ConnectionTextFieldOptions[\"type\"];\n const pos = attrNum(fEl, \"position\");\n if (pos !== undefined) f.position = pos;\n fields.push(f);\n }\n if (fields.length > 0) t.textFields = fields;\n }\n c.textPr = t as TextPropertiesOptions;\n }\n const paramsEl = findChild(cEl, \"parameters\");\n if (paramsEl) {\n const params: ParameterOptions[] = [];\n for (const pmEl of paramsEl.elements ?? []) {\n if (pmEl.name !== \"parameter\") continue;\n const pm: ParameterOptions = {};\n if (attr(pmEl, \"name\") !== undefined) pm.name = attr(pmEl, \"name\");\n const st = attrNum(pmEl, \"sqlType\");\n if (st !== undefined) pm.sqlType = st;\n const pt = attr(pmEl, \"parameterType\");\n if (pt !== undefined) pm.parameterType = pt as ParameterOptions[\"parameterType\"];\n if (parseOnOff(attr(pmEl, \"refreshOnChange\"))) pm.refreshOnChange = true;\n if (attr(pmEl, \"prompt\") !== undefined) pm.prompt = attr(pmEl, \"prompt\");\n if (attr(pmEl, \"boolean\") !== undefined) pm.boolean = parseOnOff(attr(pmEl, \"boolean\"));\n const dbl = attrNum(pmEl, \"double\");\n if (dbl !== undefined) pm.double = dbl;\n const int = attrNum(pmEl, \"integer\");\n if (int !== undefined) pm.integer = int;\n if (attr(pmEl, \"string\") !== undefined) pm.string = attr(pmEl, \"string\");\n if (attr(pmEl, \"cell\") !== undefined) pm.cell = attr(pmEl, \"cell\");\n params.push(pm);\n }\n if (params.length > 0) c.parameters = params;\n }\n connections.push(c as ConnectionOptions);\n }\n return { connections };\n },\n};\n","/**\n * QueryTable types and descriptor for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd, CT_QueryTable\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, escapeXml, findChild } from \"@office-open/xml\";\n\n// ── Options ──\n\n/** Deleted query-table field (CT_DeletedField). */\nexport interface QueryTableDeletedFieldOptions {\n /** Field name that was deleted (required) */\n name: string;\n}\n\n/** Query-table field (CT_QueryTableField). */\nexport interface QueryTableFieldOptions {\n /** Field ID (required, unique within the query table) */\n id: number;\n /** Field name */\n name?: string;\n /** Bound to a table column (default true) */\n dataBound?: boolean;\n /** Field shows row numbers (default false) */\n rowNumbers?: boolean;\n /** Fill formulas (default false) */\n fillFormulas?: boolean;\n /** Clipped (default false) */\n clipped?: boolean;\n /** Owning table column id (default 0) */\n tableColumnId?: number;\n}\n\n/** Query-table refresh info (CT_QueryTableRefresh). */\nexport interface QueryTableRefreshOptions {\n /** Preserve sort/filter layout (default true) */\n preserveSortFilterLayout?: boolean;\n /** Field ID wrapped (default false) */\n fieldIdWrapped?: boolean;\n /** Headers in last refresh (default true) */\n headersInLastRefresh?: boolean;\n /** Minimum refresh version (default 0) */\n minimumVersion?: number;\n /** Next unique ID for new rows (default 1) */\n nextId?: number;\n /** Unbound columns inserted left (default 0) */\n unboundColumnsLeft?: number;\n /** Unbound columns appended right (default 0) */\n unboundColumnsRight?: number;\n /** Field layout after refresh (CT_QueryTableRefresh → queryTableFields) */\n queryTableFields?: QueryTableFieldOptions[];\n /** Deleted fields (CT_QueryTableDeletedFields) */\n deletedFields?: QueryTableDeletedFieldOptions[];\n}\n\n/** Options for xl/queryTables/queryTable{n}.xml (CT_QueryTable). */\nexport interface QueryTableOptions {\n /** Query table name (required by XSD) */\n name?: string;\n /** Headers row shown (default true) */\n headers?: boolean;\n /** Row numbers shown (default false) */\n rowNumbers?: boolean;\n /** Refresh disabled (default false) */\n disableRefresh?: boolean;\n /** Background refresh (default true) */\n backgroundRefresh?: boolean;\n /** First background refresh (default false) */\n firstBackgroundRefresh?: boolean;\n /** Refresh on load (default false) */\n refreshOnLoad?: boolean;\n /** Grow/shrink behavior: \"insertDelete\" | \"insertWhole\" | \"overwriteWhole\" (default \"insertDelete\") */\n growShrinkType?: \"insertDelete\" | \"insertWhole\" | \"overwriteWhole\";\n /** Fill formulas on refresh (default false) */\n fillFormulas?: boolean;\n /** Remove data on save (default false) */\n removeDataOnSave?: boolean;\n /** Edit disabled (default false) */\n disableEdit?: boolean;\n /** Preserve formatting (default true) */\n preserveFormatting?: boolean;\n /** Adjust column width on refresh (default false) */\n adjustColumnWidth?: boolean;\n /** Connection ID referencing the workbook connection */\n connectionId: number;\n /** Auto format applied */\n autoFormat?: boolean;\n /** Intermediate rows preserved (CT_QueryTable `@intermediate`) */\n intermediate?: boolean;\n /** Refresh info (CT_QueryTableRefresh) */\n queryTableRefresh?: QueryTableRefreshOptions;\n}\n\n// ── Descriptor ──\n\nexport const queryTableDesc: CustomDescriptor<QueryTableOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const attrs: string[] = [];\n if (opts.name !== undefined) attrs.push(`name=\"${escapeXml(opts.name)}\"`);\n if (opts.headers === false) attrs.push('headers=\"0\"');\n if (opts.rowNumbers) attrs.push('rowNumbers=\"1\"');\n if (opts.disableRefresh) attrs.push('disableRefresh=\"1\"');\n if (opts.backgroundRefresh === false) attrs.push('backgroundRefresh=\"0\"');\n if (opts.firstBackgroundRefresh) attrs.push('firstBackgroundRefresh=\"1\"');\n if (opts.refreshOnLoad) attrs.push('refreshOnLoad=\"1\"');\n if (opts.growShrinkType !== undefined) attrs.push(`growShrinkType=\"${opts.growShrinkType}\"`);\n if (opts.fillFormulas) attrs.push('fillFormulas=\"1\"');\n if (opts.removeDataOnSave) attrs.push('removeDataOnSave=\"1\"');\n if (opts.disableEdit) attrs.push('disableEdit=\"1\"');\n if (opts.preserveFormatting === false) attrs.push('preserveFormatting=\"0\"');\n if (opts.adjustColumnWidth) attrs.push('adjustColumnWidth=\"1\"');\n if (opts.autoFormat) attrs.push('autoFormat=\"1\"');\n if (opts.intermediate) attrs.push('intermediate=\"1\"');\n attrs.push(`connectionId=\"${opts.connectionId}\"`);\n\n let inner = \"\";\n const r = opts.queryTableRefresh;\n if (r) {\n const rAttrs: string[] = [];\n if (r.preserveSortFilterLayout === false) rAttrs.push('preserveSortFilterLayout=\"0\"');\n if (r.fieldIdWrapped) rAttrs.push('fieldIdWrapped=\"1\"');\n if (r.headersInLastRefresh === false) rAttrs.push('headersInLastRefresh=\"0\"');\n if (r.minimumVersion !== undefined) rAttrs.push(`minimumVersion=\"${r.minimumVersion}\"`);\n if (r.nextId !== undefined) rAttrs.push(`nextId=\"${r.nextId}\"`);\n if (r.unboundColumnsLeft !== undefined)\n rAttrs.push(`unboundColumnsLeft=\"${r.unboundColumnsLeft}\"`);\n if (r.unboundColumnsRight !== undefined)\n rAttrs.push(`unboundColumnsRight=\"${r.unboundColumnsRight}\"`);\n const rInner: string[] = [];\n if (r.queryTableFields && r.queryTableFields.length > 0) {\n const fParts: string[] = [`<queryTableFields count=\"${r.queryTableFields.length}\">`];\n for (const f of r.queryTableFields) {\n const fAttrs: string[] = [`id=\"${f.id}\"`];\n if (f.name !== undefined) fAttrs.push(`name=\"${escapeXml(f.name)}\"`);\n if (f.dataBound === false) fAttrs.push('dataBound=\"0\"');\n if (f.rowNumbers) fAttrs.push('rowNumbers=\"1\"');\n if (f.fillFormulas) fAttrs.push('fillFormulas=\"1\"');\n if (f.clipped) fAttrs.push('clipped=\"1\"');\n if (f.tableColumnId !== undefined) fAttrs.push(`tableColumnId=\"${f.tableColumnId}\"`);\n fParts.push(`<queryTableField ${fAttrs.join(\" \")}/>`);\n }\n fParts.push(\"</queryTableFields>\");\n rInner.push(fParts.join(\"\"));\n }\n if (r.deletedFields && r.deletedFields.length > 0) {\n const dParts: string[] = [`<queryTableDeletedFields count=\"${r.deletedFields.length}\">`];\n for (const d of r.deletedFields) {\n dParts.push(`<deletedField name=\"${escapeXml(d.name)}\"/>`);\n }\n dParts.push(\"</queryTableDeletedFields>\");\n rInner.push(dParts.join(\"\"));\n }\n if (rInner.length > 0)\n inner = `<queryTableRefresh ${rAttrs.join(\" \")}>${rInner.join(\"\")}</queryTableRefresh>`;\n else inner = `<queryTableRefresh ${rAttrs.join(\" \")}/>`;\n }\n\n return (\n `<queryTable xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ${attrs.join(\" \")}>` +\n `${inner}</queryTable>`\n );\n },\n\n parse(el, _ctx) {\n const result: Partial<QueryTableOptions> = {};\n if (attr(el, \"name\") !== undefined) result.name = attr(el, \"name\");\n if (String(attr(el, \"headers\")) === \"0\") result.headers = false;\n if (parseOnOff(attr(el, \"rowNumbers\"))) result.rowNumbers = true;\n if (parseOnOff(attr(el, \"disableRefresh\"))) result.disableRefresh = true;\n if (String(attr(el, \"backgroundRefresh\")) === \"0\") result.backgroundRefresh = false;\n if (parseOnOff(attr(el, \"firstBackgroundRefresh\"))) result.firstBackgroundRefresh = true;\n if (parseOnOff(attr(el, \"refreshOnLoad\"))) result.refreshOnLoad = true;\n const gst = attr(el, \"growShrinkType\");\n if (gst !== undefined) result.growShrinkType = gst as QueryTableOptions[\"growShrinkType\"];\n if (parseOnOff(attr(el, \"fillFormulas\"))) result.fillFormulas = true;\n if (parseOnOff(attr(el, \"removeDataOnSave\"))) result.removeDataOnSave = true;\n if (parseOnOff(attr(el, \"disableEdit\"))) result.disableEdit = true;\n if (String(attr(el, \"preserveFormatting\")) === \"0\") result.preserveFormatting = false;\n if (parseOnOff(attr(el, \"adjustColumnWidth\"))) result.adjustColumnWidth = true;\n if (parseOnOff(attr(el, \"autoFormat\"))) result.autoFormat = true;\n if (parseOnOff(attr(el, \"intermediate\"))) result.intermediate = true;\n const cid = attrNum(el, \"connectionId\");\n if (cid !== undefined) result.connectionId = cid;\n\n const rEl = findChild(el, \"queryTableRefresh\");\n if (rEl) {\n const r: Partial<QueryTableRefreshOptions> = {};\n if (String(attr(rEl, \"preserveSortFilterLayout\")) === \"0\") r.preserveSortFilterLayout = false;\n if (parseOnOff(attr(rEl, \"fieldIdWrapped\"))) r.fieldIdWrapped = true;\n if (String(attr(rEl, \"headersInLastRefresh\")) === \"0\") r.headersInLastRefresh = false;\n const mv = attrNum(rEl, \"minimumVersion\");\n if (mv !== undefined) r.minimumVersion = mv;\n const nid = attrNum(rEl, \"nextId\");\n if (nid !== undefined) r.nextId = nid;\n const ucl = attrNum(rEl, \"unboundColumnsLeft\");\n if (ucl !== undefined) r.unboundColumnsLeft = ucl;\n const ucr = attrNum(rEl, \"unboundColumnsRight\");\n if (ucr !== undefined) r.unboundColumnsRight = ucr;\n const fieldsEl = findChild(rEl, \"queryTableFields\");\n if (fieldsEl) {\n const fields: QueryTableFieldOptions[] = [];\n for (const fEl of fieldsEl.elements ?? []) {\n if (fEl.name !== \"queryTableField\") continue;\n const f: QueryTableFieldOptions = { id: attrNum(fEl, \"id\") ?? 0 };\n if (attr(fEl, \"name\") !== undefined) f.name = attr(fEl, \"name\");\n if (String(attr(fEl, \"dataBound\")) === \"0\") f.dataBound = false;\n if (parseOnOff(attr(fEl, \"rowNumbers\"))) f.rowNumbers = true;\n if (parseOnOff(attr(fEl, \"fillFormulas\"))) f.fillFormulas = true;\n if (parseOnOff(attr(fEl, \"clipped\"))) f.clipped = true;\n const tci = attrNum(fEl, \"tableColumnId\");\n if (tci !== undefined) f.tableColumnId = tci;\n fields.push(f);\n }\n if (fields.length > 0) r.queryTableFields = fields;\n }\n const delEl = findChild(rEl, \"queryTableDeletedFields\");\n if (delEl) {\n const deleted: QueryTableDeletedFieldOptions[] = [];\n for (const dEl of delEl.elements ?? []) {\n if (dEl.name !== \"deletedField\") continue;\n deleted.push({ name: attr(dEl, \"name\") ?? \"\" });\n }\n if (deleted.length > 0) r.deletedFields = deleted;\n }\n result.queryTableRefresh = r as QueryTableRefreshOptions;\n }\n return result as QueryTableOptions;\n },\n};\n","/**\n * Metadata part types and descriptor for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd, CT_Metadata\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { attr, attrNum, escapeXml, findChild, stringifyElement } from \"@office-open/xml\";\n\n// ── Options ──\n\n/** Metadata type declaration (CT_MetadataType). */\nexport interface MetadataTypeOptions {\n /** Type name (required) */\n name: string;\n /** Minimum supported version (required by XSD) */\n minSupportedVersion: number;\n /** Ghost row flag */\n ghostRow?: boolean;\n /** Ghost column flag */\n ghostCol?: boolean;\n /** Edit flag */\n edit?: boolean;\n /** Delete flag */\n delete?: boolean;\n /** Copy flag */\n copy?: boolean;\n pasteAll?: boolean;\n pasteFormulas?: boolean;\n pasteValues?: boolean;\n pasteFormats?: boolean;\n pasteComments?: boolean;\n pasteDataValidation?: boolean;\n pasteBorders?: boolean;\n /** Paste column widths */\n pasteColWidths?: boolean;\n pasteNumberFormats?: boolean;\n /** Merge cells */\n merge?: boolean;\n splitFirst?: boolean;\n splitAll?: boolean;\n /** Row/column shift */\n rowColShift?: boolean;\n clearAll?: boolean;\n clearFormats?: boolean;\n clearContents?: boolean;\n clearComments?: boolean;\n assign?: boolean;\n coerce?: boolean;\n adjust?: boolean;\n /** Cell metadata */\n cellMeta?: boolean;\n}\n\n/** Metadata string entry (CT_MetadataStrings → s, CT_XStringElement `@v`). */\nexport interface MetadataStringOptions {\n /** String value (required) */\n value: string;\n}\n\n/** Metadata string index reference (CT_MetadataStringIndex). */\nexport interface MetadataStringIndexOptions {\n /** Index into metadataStrings (`@x`, required) */\n index: number;\n /** Show string flag */\n show?: boolean;\n}\n\n/** MDX tuple (CT_MdxTuple, the t child of mdx). */\nexport interface MdxTupleOptions {\n /** Tuple count */\n count?: number;\n /** Culture (CT_MdxTuple `@ct`) */\n culture?: string;\n /** Style index (CT_MdxTuple `@si`) */\n styleIndex?: number;\n /** Format index (CT_MdxTuple `@fi`) */\n formatIndex?: number;\n /** Background color ARGB hex (CT_MdxTuple `@bc`) */\n backgroundColor?: string;\n /** Foreground color ARGB hex (CT_MdxTuple `@fc`) */\n foregroundColor?: string;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n bold?: boolean;\n /** Member name string indexes (n children) */\n stringIndexes?: MetadataStringIndexOptions[];\n}\n\n/** MDX set (CT_MdxSet, the ms child of mdx). */\nexport interface MdxSetOptions {\n /** Namespace count (required) */\n namespaceCount: number;\n /** Tuple count */\n count?: number;\n /**\n * Sort order (CT_MdxSet `@ord`, ST_MdxSetOrder, default \"u\"): u unsorted,\n * a ascending, d descending, aa alphabetical ascending, ad alphabetical\n * descending, na natural ascending, nd natural descending.\n */\n order?: \"u\" | \"a\" | \"d\" | \"aa\" | \"ad\" | \"na\" | \"nd\";\n /** Member name string indexes (n children) */\n stringIndexes?: MetadataStringIndexOptions[];\n}\n\n/** ST_MdxFunctionType — the MDX function discriminator on mdx `@f`. */\nexport type MdxFunctionType = \"m\" | \"v\" | \"s\" | \"c\" | \"r\" | \"p\" | \"k\";\n\n/** ST_MdxKPIProperty — the KPI property kind on k `@p`. */\nexport type MdxKpiProperty = \"v\" | \"g\" | \"s\" | \"t\" | \"w\" | \"m\";\n\n/** MDX member property (CT_MdxMemeberProp, the p child of mdx). */\nexport interface MdxMemberPropOptions {\n /** Index into metadataStrings for the member name (`@n`, required) */\n nameIndex: number;\n /** Name pair index (`@np`, required) */\n namePairIndex: number;\n}\n\n/** MDX KPI (CT_MdxKPI, the k child of mdx). */\nexport interface MdxKpiOptions {\n /** Index into metadataStrings for the member name (`@n`, required) */\n nameIndex: number;\n /** Name pair index (`@np`, required) */\n namePairIndex: number;\n /** KPI property kind (`@p`, required) */\n property: MdxKpiProperty;\n}\n\n/** MDX metadata entry (CT_Mdx). */\nexport interface MdxOptions {\n /** MDX function type (`@f`, required) */\n functionType: MdxFunctionType;\n /** Metadata string index (`@n`, required) */\n stringIndex: number;\n /** MDX tuple (t) */\n tuple?: MdxTupleOptions;\n /** MDX set (ms) */\n set?: MdxSetOptions;\n /** MDX member property (p) */\n memberProp?: MdxMemberPropOptions;\n /** MDX KPI (k) */\n kpi?: MdxKpiOptions;\n}\n\n/** Future metadata block (CT_FutureMetadataBlock). */\nexport interface FutureMetadataBlockOptions {\n /** Raw extension list preserved verbatim (extLst) */\n extLst?: string;\n}\n\n/** Future metadata (CT_FutureMetadata). */\nexport interface FutureMetadataOptions {\n /** Type name (required) */\n name: string;\n /** Blocks (bk) */\n blocks?: FutureMetadataBlockOptions[];\n}\n\n/** Metadata record (CT_MetadataRecord, the rc child of bk). */\nexport interface MetadataRecordOptions {\n /** Metadata type index (`@t`, required) */\n typeIndex: number;\n /** Metadata value index (`@v`, required) */\n valueIndex: number;\n}\n\n/** Metadata block (CT_MetadataBlock). */\nexport interface MetadataBlockOptions {\n /** Records (rc) */\n records?: MetadataRecordOptions[];\n}\n\n/** Options for xl/metadata.xml (CT_Metadata). */\nexport interface MetadataOptions {\n /** Metadata types */\n types?: MetadataTypeOptions[];\n /** Metadata strings */\n strings?: MetadataStringOptions[];\n /** MDX metadata */\n mdx?: MdxOptions[];\n /** Future metadata entries */\n futureMetadata?: FutureMetadataOptions[];\n /** Cell metadata blocks (cellMetadata) */\n cellMetadata?: MetadataBlockOptions[];\n /** Value metadata blocks (valueMetadata) */\n valueMetadata?: MetadataBlockOptions[];\n}\n\n// ── Descriptor ──\n\nconst METADATA_TYPE_BOOL_ATTRS = [\n \"ghostRow\",\n \"ghostCol\",\n \"edit\",\n \"delete\",\n \"copy\",\n \"pasteAll\",\n \"pasteFormulas\",\n \"pasteValues\",\n \"pasteFormats\",\n \"pasteComments\",\n \"pasteDataValidation\",\n \"pasteBorders\",\n \"pasteColWidths\",\n \"pasteNumberFormats\",\n \"merge\",\n \"splitFirst\",\n \"splitAll\",\n \"rowColShift\",\n \"clearAll\",\n \"clearFormats\",\n \"clearContents\",\n \"clearComments\",\n \"assign\",\n \"coerce\",\n \"adjust\",\n \"cellMeta\",\n] as const;\n\nexport const metadataDesc: CustomDescriptor<MetadataOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<metadata xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n\n if (opts.types && opts.types.length > 0) {\n p.push(`<metadataTypes count=\"${opts.types.length}\">`);\n for (const t of opts.types) {\n const attrs: string[] = [\n `name=\"${escapeXml(t.name)}\"`,\n `minSupportedVersion=\"${t.minSupportedVersion}\"`,\n ];\n for (const key of METADATA_TYPE_BOOL_ATTRS) {\n if (t[key]) attrs.push(`${key}=\"1\"`);\n }\n p.push(`<metadataType ${attrs.join(\" \")}/>`);\n }\n p.push(\"</metadataTypes>\");\n }\n\n if (opts.strings && opts.strings.length > 0) {\n p.push(`<metadataStrings count=\"${opts.strings.length}\">`);\n for (const s of opts.strings) p.push(`<s v=\"${escapeXml(s.value)}\"/>`);\n p.push(\"</metadataStrings>\");\n }\n\n if (opts.mdx && opts.mdx.length > 0) {\n p.push(`<mdxMetadata count=\"${opts.mdx.length}\">`);\n for (const m of opts.mdx) {\n const attrs: string[] = [`n=\"${m.stringIndex}\"`, `f=\"${m.functionType}\"`];\n let inner = \"\";\n if (m.tuple) {\n const t = m.tuple;\n const tAttrs: string[] = [];\n if (t.count !== undefined) tAttrs.push(`c=\"${t.count}\"`);\n if (t.culture !== undefined) tAttrs.push(`ct=\"${escapeXml(t.culture)}\"`);\n if (t.styleIndex !== undefined) tAttrs.push(`si=\"${t.styleIndex}\"`);\n if (t.formatIndex !== undefined) tAttrs.push(`fi=\"${t.formatIndex}\"`);\n if (t.backgroundColor !== undefined) tAttrs.push(`bc=\"${t.backgroundColor}\"`);\n if (t.foregroundColor !== undefined) tAttrs.push(`fc=\"${t.foregroundColor}\"`);\n if (t.italic) tAttrs.push('i=\"1\"');\n if (t.underline) tAttrs.push('u=\"1\"');\n if (t.strikethrough) tAttrs.push('st=\"1\"');\n if (t.bold) tAttrs.push('b=\"1\"');\n const idxXml = stringifyStringIndexes(t.stringIndexes);\n inner = idxXml ? `<t ${tAttrs.join(\" \")}>${idxXml}</t>` : `<t ${tAttrs.join(\" \")}/>`;\n } else if (m.set) {\n const s = m.set;\n const sAttrs: string[] = [`ns=\"${s.namespaceCount}\"`];\n if (s.count !== undefined) sAttrs.push(`c=\"${s.count}\"`);\n if (s.order !== undefined && s.order !== \"u\") sAttrs.push(`o=\"${escapeXml(s.order)}\"`);\n const idxXml = stringifyStringIndexes(s.stringIndexes);\n inner = idxXml ? `<ms ${sAttrs.join(\" \")}>${idxXml}</ms>` : `<ms ${sAttrs.join(\" \")}/>`;\n } else if (m.memberProp) {\n inner = `<p n=\"${m.memberProp.nameIndex}\" np=\"${m.memberProp.namePairIndex}\"/>`;\n } else if (m.kpi) {\n inner = `<k n=\"${m.kpi.nameIndex}\" np=\"${m.kpi.namePairIndex}\" p=\"${m.kpi.property}\"/>`;\n }\n p.push(`<mdx ${attrs.join(\" \")}>${inner}</mdx>`);\n }\n p.push(\"</mdxMetadata>\");\n }\n\n for (const fm of opts.futureMetadata ?? []) {\n const blocks = fm.blocks ?? [];\n if (blocks.length > 0) {\n p.push(`<futureMetadata name=\"${escapeXml(fm.name)}\" count=\"${blocks.length}\">`);\n for (const b of blocks) {\n if (b.extLst) p.push(`<bk>${b.extLst}</bk>`);\n else p.push(\"<bk/>\");\n }\n p.push(\"</futureMetadata>\");\n } else {\n p.push(`<futureMetadata name=\"${escapeXml(fm.name)}\"/>`);\n }\n }\n\n if (opts.cellMetadata && opts.cellMetadata.length > 0) {\n p.push(`<cellMetadata count=\"${opts.cellMetadata.length}\">`);\n for (const b of opts.cellMetadata) p.push(stringifyBlock(b));\n p.push(\"</cellMetadata>\");\n }\n\n if (opts.valueMetadata && opts.valueMetadata.length > 0) {\n p.push(`<valueMetadata count=\"${opts.valueMetadata.length}\">`);\n for (const b of opts.valueMetadata) p.push(stringifyBlock(b));\n p.push(\"</valueMetadata>\");\n }\n\n p.push(\"</metadata>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<MetadataOptions> = {};\n\n const typesEl = findChild(el, \"metadataTypes\");\n if (typesEl) {\n const types: MetadataTypeOptions[] = [];\n for (const tEl of typesEl.elements ?? []) {\n if (tEl.name !== \"metadataType\") continue;\n const t: Partial<MetadataTypeOptions> = { name: attr(tEl, \"name\") ?? \"\" };\n const msv = attrNum(tEl, \"minSupportedVersion\");\n if (msv !== undefined) t.minSupportedVersion = msv;\n for (const key of METADATA_TYPE_BOOL_ATTRS) {\n if (parseOnOff(attr(tEl, key))) t[key] = true;\n }\n types.push(t as MetadataTypeOptions);\n }\n result.types = types;\n }\n\n const stringsEl = findChild(el, \"metadataStrings\");\n if (stringsEl) {\n const strings: MetadataStringOptions[] = [];\n for (const sEl of stringsEl.elements ?? []) {\n if (sEl.name !== \"s\") continue;\n strings.push({ value: attr(sEl, \"v\") ?? \"\" });\n }\n result.strings = strings;\n }\n\n const mdxEl = findChild(el, \"mdxMetadata\");\n if (mdxEl) {\n const mdx: MdxOptions[] = [];\n for (const mEl of mdxEl.elements ?? []) {\n if (mEl.name !== \"mdx\") continue;\n const m: Partial<MdxOptions> = {\n stringIndex: attrNum(mEl, \"n\") ?? 0,\n functionType: (attr(mEl, \"f\") ?? \"m\") as MdxFunctionType,\n };\n const tEl = findChild(mEl, \"t\");\n if (tEl) {\n const t: Partial<MdxTupleOptions> = {};\n const c = attrNum(tEl, \"c\");\n if (c !== undefined) t.count = c;\n if (attr(tEl, \"ct\") !== undefined) t.culture = attr(tEl, \"ct\");\n const si = attrNum(tEl, \"si\");\n if (si !== undefined) t.styleIndex = si;\n const fi = attrNum(tEl, \"fi\");\n if (fi !== undefined) t.formatIndex = fi;\n if (attr(tEl, \"bc\") !== undefined) t.backgroundColor = attr(tEl, \"bc\");\n if (attr(tEl, \"fc\") !== undefined) t.foregroundColor = attr(tEl, \"fc\");\n if (parseOnOff(attr(tEl, \"i\"))) t.italic = true;\n if (parseOnOff(attr(tEl, \"u\"))) t.underline = true;\n if (parseOnOff(attr(tEl, \"st\"))) t.strikethrough = true;\n if (parseOnOff(attr(tEl, \"b\"))) t.bold = true;\n const idx = parseStringIndexes(tEl);\n if (idx) t.stringIndexes = idx;\n m.tuple = t as MdxTupleOptions;\n }\n const msEl = findChild(mEl, \"ms\");\n if (msEl) {\n const s: Partial<MdxSetOptions> = { namespaceCount: attrNum(msEl, \"ns\") ?? 0 };\n const c = attrNum(msEl, \"c\");\n if (c !== undefined) s.count = c;\n if (attr(msEl, \"o\") !== undefined) s.order = attr(msEl, \"o\") as MdxSetOptions[\"order\"];\n const idx = parseStringIndexes(msEl);\n if (idx) s.stringIndexes = idx;\n m.set = s as MdxSetOptions;\n }\n const pEl = findChild(mEl, \"p\");\n if (pEl) {\n m.memberProp = {\n nameIndex: attrNum(pEl, \"n\") ?? 0,\n namePairIndex: attrNum(pEl, \"np\") ?? 0,\n };\n }\n const kEl = findChild(mEl, \"k\");\n if (kEl) {\n m.kpi = {\n nameIndex: attrNum(kEl, \"n\") ?? 0,\n namePairIndex: attrNum(kEl, \"np\") ?? 0,\n property: (attr(kEl, \"p\") ?? \"v\") as MdxKpiProperty,\n };\n }\n mdx.push(m as MdxOptions);\n }\n result.mdx = mdx;\n }\n\n const future: FutureMetadataOptions[] = [];\n for (const fmEl of el.elements ?? []) {\n if (fmEl.name !== \"futureMetadata\") continue;\n const fm: FutureMetadataOptions = { name: attr(fmEl, \"name\") ?? \"\" };\n const blocks: FutureMetadataBlockOptions[] = [];\n for (const bEl of fmEl.elements ?? []) {\n if (bEl.name !== \"bk\") continue;\n const extEl = findChild(bEl, \"extLst\");\n blocks.push({ extLst: extEl ? stringifyElement(extEl) : undefined });\n }\n if (blocks.length > 0) fm.blocks = blocks;\n future.push(fm);\n }\n if (future.length > 0) result.futureMetadata = future;\n\n const cellEl = findChild(el, \"cellMetadata\");\n if (cellEl) result.cellMetadata = parseBlocks(cellEl);\n const valueEl = findChild(el, \"valueMetadata\");\n if (valueEl) result.valueMetadata = parseBlocks(valueEl);\n\n return result as MetadataOptions;\n },\n};\n\n// ── Helpers ──\n\nfunction stringifyStringIndexes(indexes: MetadataStringIndexOptions[] | undefined): string {\n if (!indexes || indexes.length === 0) return \"\";\n return indexes.map((i) => `<n x=\"${i.index}\"${i.show ? ' s=\"1\"' : \"\"}/>`).join(\"\");\n}\n\nfunction parseStringIndexes(parent: Element): MetadataStringIndexOptions[] | undefined {\n const out: MetadataStringIndexOptions[] = [];\n for (const nEl of parent.elements ?? []) {\n if (nEl.name !== \"n\") continue;\n const idx: MetadataStringIndexOptions = { index: attrNum(nEl, \"x\") ?? 0 };\n if (parseOnOff(attr(nEl, \"s\"))) idx.show = true;\n out.push(idx);\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction stringifyBlock(b: MetadataBlockOptions): string {\n const rc = (b.records ?? []).map((r) => `<rc t=\"${r.typeIndex}\" v=\"${r.valueIndex}\"/>`).join(\"\");\n return `<bk>${rc}</bk>`;\n}\n\nfunction parseBlocks(el: Element): MetadataBlockOptions[] {\n const blocks: MetadataBlockOptions[] = [];\n for (const bEl of el.elements ?? []) {\n if (bEl.name !== \"bk\") continue;\n const records: MetadataRecordOptions[] = [];\n for (const rcEl of bEl.elements ?? []) {\n if (rcEl.name !== \"rc\") continue;\n records.push({ typeIndex: attrNum(rcEl, \"t\") ?? 0, valueIndex: attrNum(rcEl, \"v\") ?? 0 });\n }\n blocks.push(records.length > 0 ? { records } : {});\n }\n return blocks;\n}\n","/**\n * PivotTable descriptor for XLSX — generates xl/pivotTables/pivotTable{N}.xml.\n *\n * Implements CT_pivotTableDefinition from sml.xsd.\n * Direct stringify/parse — no intermediate class.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor, WriteContext } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, findChild, textOf } from \"@office-open/xml\";\n\nimport type { PivotAreaOptions } from \"../pivot/pivot-utils\";\nimport { parsePivotArea } from \"./parse\";\nimport { stringifyPivotTable } from \"./stringify\";\nimport type {\n CalculatedItemParseResult,\n CalculatedMemberParseResult,\n ChartFormatParseResult,\n ConditionalFormatParseResult,\n DataFieldParseResult,\n HierarchyUsageParseResult,\n PageFieldParseResult,\n PivotFieldParseResult,\n PivotFilterParseResult,\n PivotFormatParseResult,\n PivotHierarchyParseResult,\n PivotTableDescriptorOptions,\n PivotTableParseResult,\n} from \"./types\";\n\n// ── Descriptor ──\n\nexport const pivotTableDesc: CustomDescriptor<\n PivotTableDescriptorOptions,\n WriteContext,\n PivotTableParseResult\n> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return stringifyPivotTable(opts.options, opts.sourceData, opts.cacheId);\n },\n\n parse(el, _ctx) {\n const result: Partial<PivotTableParseResult> = {};\n\n // Root element attributes\n if (attr(el, \"name\")) result.name = attr(el, \"name\");\n if (attr(el, \"cacheId\") !== undefined) result.cacheId = attrNum(el, \"cacheId\") ?? 0;\n if (parseOnOff(attr(el, \"dataOnRows\"))) result.dataOnRows = true;\n if (String(attr(el, \"showHeaders\")) === \"0\") result.showHeaders = false;\n if (parseOnOff(attr(el, \"showEmptyRow\"))) result.showEmptyRow = true;\n if (parseOnOff(attr(el, \"showEmptyCol\"))) result.showEmptyCol = true;\n if (attr(el, \"grandTotalCaption\")) result.grandTotalCaption = attr(el, \"grandTotalCaption\");\n if (attr(el, \"errorCaption\")) result.errorCaption = attr(el, \"errorCaption\");\n if (parseOnOff(attr(el, \"showError\"))) result.showError = true;\n if (attr(el, \"missingCaption\")) result.missingCaption = attr(el, \"missingCaption\");\n if (String(attr(el, \"showMissing\")) === \"0\") result.showMissing = false;\n if (attr(el, \"pageStyle\")) result.pageStyle = attr(el, \"pageStyle\");\n if (attr(el, \"pivotTableStyle\")) result.pivotTableStyle = attr(el, \"pivotTableStyle\");\n if (attr(el, \"tag\")) result.tag = attr(el, \"tag\");\n if (String(attr(el, \"showItems\")) === \"0\") result.showItems = false;\n if (parseOnOff(attr(el, \"editData\"))) result.editData = true;\n if (parseOnOff(attr(el, \"disableFieldList\"))) result.disableFieldList = true;\n if (String(attr(el, \"showCalcMbrs\")) === \"0\") result.showCalcMbrs = false;\n if (parseOnOff(attr(el, \"visualTotals\"))) result.visualTotals = true;\n if (String(attr(el, \"showMultipleLabel\")) === \"0\") result.showMultipleLabel = false;\n if (String(attr(el, \"showDataDropDown\")) === \"0\") result.showDataDropDown = false;\n if (String(attr(el, \"showDrill\")) === \"0\") result.showDrill = false;\n if (parseOnOff(attr(el, \"printDrill\"))) result.printDrill = true;\n if (parseOnOff(attr(el, \"showMemberPropertyTips\"))) result.showMemberPropertyTips = true;\n if (String(attr(el, \"showDataTips\")) === \"0\") result.showDataTips = false;\n if (String(attr(el, \"enableWizard\")) === \"0\") result.enableWizard = false;\n if (String(attr(el, \"enableDrill\")) === \"0\") result.enableDrill = false;\n if (String(attr(el, \"enableFieldProperties\")) === \"0\") result.enableFieldProperties = false;\n const pageWrap = attrNum(el, \"pageWrap\");\n if (pageWrap !== undefined) result.pageWrap = pageWrap;\n if (parseOnOff(attr(el, \"pageOverThenDown\"))) result.pageOverThenDown = true;\n if (parseOnOff(attr(el, \"subtotalHiddenItems\"))) result.subtotalHiddenItems = true;\n if (parseOnOff(attr(el, \"fieldPrintTitles\"))) result.fieldPrintTitles = true;\n if (parseOnOff(attr(el, \"mergeItem\"))) result.mergeItem = true;\n if (String(attr(el, \"showDropZones\")) === \"0\") result.showDropZones = false;\n if (parseOnOff(attr(el, \"published\"))) result.published = true;\n if (String(attr(el, \"gridDropZones\")) === \"0\") result.gridDropZones = false;\n if (String(attr(el, \"multipleFieldFilters\")) === \"0\") result.multipleFieldFilters = false;\n if (attr(el, \"rowHeaderCaption\")) result.rowHeaderCaption = attr(el, \"rowHeaderCaption\");\n if (attr(el, \"colHeaderCaption\")) result.colHeaderCaption = attr(el, \"colHeaderCaption\");\n if (parseOnOff(attr(el, \"fieldListSortAscending\"))) result.fieldListSortAscending = true;\n if (parseOnOff(attr(el, \"mdxSubqueries\"))) result.mdxSubqueries = true;\n if (String(attr(el, \"customListSort\")) === \"0\") result.customListSort = false;\n if (parseOnOff(attr(el, \"asteriskTotals\"))) result.asteriskTotals = true;\n const dataPosition = attrNum(el, \"dataPosition\");\n if (dataPosition !== undefined) result.dataPosition = dataPosition;\n if (parseOnOff(attr(el, \"immersive\"))) result.immersive = true;\n if (attr(el, \"vacatedStyle\")) result.vacatedStyle = attr(el, \"vacatedStyle\");\n if (parseOnOff(attr(el, \"chartFormat\"))) result.chartFormat = true;\n if (String(attr(el, \"preserveFormatting\")) === \"0\") result.preserveFormatting = false;\n else if (parseOnOff(attr(el, \"preserveFormatting\"))) result.preserveFormatting = true;\n if (attr(el, \"dataCaption\")) result.dataCaption = attr(el, \"dataCaption\");\n\n // Location — store ref as string, plus extended counts\n const locEl = findChild(el, \"location\");\n if (locEl) {\n if (attr(locEl, \"ref\")) result.location = attr(locEl, \"ref\");\n const rpc = attrNum(locEl, \"rowPageCount\");\n if (rpc !== undefined) result.locationRowPageCount = rpc;\n const cpc = attrNum(locEl, \"colPageCount\");\n if (cpc !== undefined) result.locationColPageCount = cpc;\n }\n\n // PivotFields\n const pfEl = findChild(el, \"pivotFields\");\n if (pfEl) {\n const fields: PivotFieldParseResult[] = [];\n for (const fEl of pfEl.elements ?? []) {\n if (fEl.name !== \"pivotField\") continue;\n const field: PivotFieldParseResult = {};\n const axis = attr(fEl, \"axis\");\n if (axis) field.axis = axis;\n if (String(attr(fEl, \"showAll\")) === \"0\") field.showAll = false;\n else if (parseOnOff(attr(fEl, \"showAll\"))) field.showAll = true;\n if (parseOnOff(attr(fEl, \"dataField\"))) field.dataField = true;\n if (attr(fEl, \"hierarchy\")) field.hierarchy = attr(fEl, \"hierarchy\");\n if (String(attr(fEl, \"dragToRow\")) === \"0\") field.dragToRow = false;\n if (String(attr(fEl, \"dragToCol\")) === \"0\") field.dragToCol = false;\n if (String(attr(fEl, \"dragToPage\")) === \"0\") field.dragToPage = false;\n if (parseOnOff(attr(fEl, \"dragToData\"))) field.dragToData = true;\n if (String(attr(fEl, \"dragOff\")) === \"0\") field.dragOff = false;\n if (String(attr(fEl, \"showDropDowns\")) === \"0\") field.showDropDowns = false;\n if (parseOnOff(attr(fEl, \"insertBlankRow\"))) field.insertBlankRow = true;\n if (parseOnOff(attr(fEl, \"showPropCell\"))) field.showPropCell = true;\n if (parseOnOff(attr(fEl, \"showPropTip\"))) field.showPropTip = true;\n if (parseOnOff(attr(fEl, \"showPropAsCaption\"))) field.showPropAsCaption = true;\n if (String(attr(fEl, \"compact\")) === \"0\") field.compact = false;\n if (parseOnOff(attr(fEl, \"outline\"))) field.outline = true;\n if (String(attr(fEl, \"subtotalTop\")) === \"0\") field.subtotalTop = false;\n if (parseOnOff(attr(fEl, \"includeNewItemsInFilter\"))) field.includeNewItemsInFilter = true;\n if (parseOnOff(attr(fEl, \"avgSubtotal\"))) field.avgSubtotal = true;\n if (parseOnOff(attr(fEl, \"countASubtotal\"))) field.countASubtotal = true;\n if (parseOnOff(attr(fEl, \"maxSubtotal\"))) field.maxSubtotal = true;\n if (parseOnOff(attr(fEl, \"minSubtotal\"))) field.minSubtotal = true;\n if (parseOnOff(attr(fEl, \"sumSubtotal\"))) field.sumSubtotal = true;\n fields.push(field);\n }\n result.pivotFields = fields;\n }\n\n // DataFields\n const dfEl = findChild(el, \"dataFields\");\n if (dfEl) {\n const dataFields: DataFieldParseResult[] = [];\n for (const dEl of dfEl.elements ?? []) {\n if (dEl.name !== \"dataField\") continue;\n const df: DataFieldParseResult = {};\n if (attr(dEl, \"name\")) df.name = attr(dEl, \"name\");\n const fld = attrNum(dEl, \"fld\");\n if (fld !== undefined) df.fld = fld;\n if (attr(dEl, \"subtotal\")) df.subtotal = attr(dEl, \"subtotal\");\n if (attr(dEl, \"showDataAs\")) df.showDataAs = attr(dEl, \"showDataAs\");\n const baseField = attrNum(dEl, \"baseField\");\n if (baseField !== undefined) df.baseField = baseField;\n const baseItem = attrNum(dEl, \"baseItem\");\n if (baseItem !== undefined) df.baseItem = baseItem;\n if (attr(dEl, \"numFmtId\")) df.numFmtId = attr(dEl, \"numFmtId\");\n dataFields.push(df);\n }\n result.dataFields = dataFields;\n }\n\n // Row fields\n const rowFieldsEl = findChild(el, \"rowFields\");\n if (rowFieldsEl) {\n const rowFields: number[] = [];\n for (const f of rowFieldsEl.elements ?? []) {\n if (f.name === \"field\") {\n const x = attrNum(f, \"x\");\n if (x !== undefined) rowFields.push(x);\n }\n }\n result.rowFields = rowFields;\n }\n\n // Col fields\n const colFieldsEl = findChild(el, \"colFields\");\n if (colFieldsEl) {\n const colFields: number[] = [];\n for (const f of colFieldsEl.elements ?? []) {\n if (f.name === \"field\") {\n const x = attrNum(f, \"x\");\n if (x !== undefined) colFields.push(x);\n }\n }\n result.colFields = colFields;\n }\n\n // Page fields\n const pageFieldsEl = findChild(el, \"pageFields\");\n if (pageFieldsEl) {\n const pageFields: PageFieldParseResult[] = [];\n for (const pf of pageFieldsEl.elements ?? []) {\n if (pf.name !== \"pageField\") continue;\n const pfResult: PageFieldParseResult = {};\n const fld = attrNum(pf, \"fld\");\n if (fld !== undefined) pfResult.fld = fld;\n const hier = attrNum(pf, \"hier\");\n if (hier !== undefined) pfResult.hier = hier;\n if (attr(pf, \"cap\")) pfResult.cap = attr(pf, \"cap\");\n const item = attrNum(pf, \"item\");\n if (item !== undefined) pfResult.item = item;\n pageFields.push(pfResult);\n }\n result.pageFields = pageFields;\n }\n\n // Formats\n const formatsEl = findChild(el, \"formats\");\n if (formatsEl) {\n const formats: PivotFormatParseResult[] = [];\n for (const fmtEl of formatsEl.elements ?? []) {\n if (fmtEl.name !== \"format\") continue;\n const fmt: PivotFormatParseResult = {};\n if (attr(fmtEl, \"action\")) fmt.action = attr(fmtEl, \"action\");\n const dxfId = attrNum(fmtEl, \"dxfId\");\n if (dxfId !== undefined) fmt.dxfId = dxfId;\n const paEl = findChild(fmtEl, \"pivotArea\");\n if (paEl) fmt.pivotArea = parsePivotArea(paEl);\n formats.push(fmt);\n }\n result.formats = formats;\n }\n\n // ConditionalFormats (pivot-specific CT_ConditionalFormats)\n const condFormatsEl = findChild(el, \"conditionalFormats\");\n if (condFormatsEl) {\n const condFormats: ConditionalFormatParseResult[] = [];\n for (const cfEl of condFormatsEl.elements ?? []) {\n if (cfEl.name !== \"conditionalFormat\") continue;\n const cf: ConditionalFormatParseResult = {};\n if (attr(cfEl, \"scope\")) cf.scope = attr(cfEl, \"scope\");\n if (attr(cfEl, \"type\")) cf.type = attr(cfEl, \"type\");\n const priority = attrNum(cfEl, \"priority\");\n if (priority !== undefined) cf.priority = priority;\n const areasEl = findChild(cfEl, \"pivotAreas\");\n if (areasEl) {\n const areas: Partial<PivotAreaOptions>[] = [];\n for (const aEl of areasEl.elements ?? []) {\n if (aEl.name !== \"pivotArea\") continue;\n areas.push(parsePivotArea(aEl));\n }\n cf.pivotAreas = areas;\n }\n condFormats.push(cf);\n }\n result.conditionalFormats = condFormats;\n }\n\n // ChartFormats\n const chartFormatsEl = findChild(el, \"chartFormats\");\n if (chartFormatsEl) {\n const chartFormats: ChartFormatParseResult[] = [];\n for (const cfEl of chartFormatsEl.elements ?? []) {\n if (cfEl.name !== \"chartFormat\") continue;\n const cf: ChartFormatParseResult = {};\n const chart = attrNum(cfEl, \"chart\");\n if (chart !== undefined) cf.chart = chart;\n const format = attrNum(cfEl, \"format\");\n if (format !== undefined) cf.format = format;\n if (parseOnOff(attr(cfEl, \"series\"))) cf.series = true;\n const paEl = findChild(cfEl, \"pivotArea\");\n if (paEl) cf.pivotArea = parsePivotArea(paEl);\n chartFormats.push(cf);\n }\n result.chartFormats = chartFormats;\n }\n\n // PivotHierarchies\n const hierarchiesEl = findChild(el, \"pivotHierarchies\");\n if (hierarchiesEl) {\n const hierarchies: PivotHierarchyParseResult[] = [];\n for (const hEl of hierarchiesEl.elements ?? []) {\n if (hEl.name !== \"pivotHierarchy\") continue;\n const h: PivotHierarchyParseResult = {};\n if (parseOnOff(attr(hEl, \"outline\"))) h.outline = true;\n if (parseOnOff(attr(hEl, \"multipleItemSelectionAllowed\")))\n h.multipleItemSelectionAllowed = true;\n if (parseOnOff(attr(hEl, \"subtotalTop\"))) h.subtotalTop = true;\n if (String(attr(hEl, \"showInFieldList\")) === \"0\") h.showInFieldList = false;\n if (String(attr(hEl, \"dragToRow\")) === \"0\") h.dragToRow = false;\n if (String(attr(hEl, \"dragToCol\")) === \"0\") h.dragToCol = false;\n if (String(attr(hEl, \"dragToPage\")) === \"0\") h.dragToPage = false;\n if (parseOnOff(attr(hEl, \"dragToData\"))) h.dragToData = true;\n if (String(attr(hEl, \"dragOff\")) === \"0\") h.dragOff = false;\n if (parseOnOff(attr(hEl, \"includeNewItemsInFilter\"))) h.includeNewItemsInFilter = true;\n if (attr(hEl, \"caption\")) h.caption = attr(hEl, \"caption\");\n hierarchies.push(h);\n }\n result.pivotHierarchies = hierarchies;\n }\n\n // Filters\n const filtersEl = findChild(el, \"filters\");\n if (filtersEl) {\n const filters: PivotFilterParseResult[] = [];\n for (const fEl of filtersEl.elements ?? []) {\n if (fEl.name !== \"filter\") continue;\n const f: PivotFilterParseResult = {};\n const fld = attrNum(fEl, \"fld\");\n if (fld !== undefined) f.fld = fld;\n if (attr(fEl, \"type\")) f.type = attr(fEl, \"type\");\n const id = attrNum(fEl, \"id\");\n if (id !== undefined) f.id = id;\n const mpFld = attrNum(fEl, \"mpFld\");\n if (mpFld !== undefined) f.mpFld = mpFld;\n const evalOrder = attrNum(fEl, \"evalOrder\");\n if (evalOrder !== undefined) f.evalOrder = evalOrder;\n const imh = attrNum(fEl, \"iMeasureHier\");\n if (imh !== undefined) f.iMeasureHier = imh;\n const imf = attrNum(fEl, \"iMeasureFld\");\n if (imf !== undefined) f.iMeasureFld = imf;\n if (attr(fEl, \"stringValue1\")) f.stringValue1 = attr(fEl, \"stringValue1\");\n if (attr(fEl, \"stringValue2\")) f.stringValue2 = attr(fEl, \"stringValue2\");\n filters.push(f);\n }\n result.filters = filters;\n }\n\n // RowHierarchiesUsage\n const rhuEl = findChild(el, \"rowHierarchiesUsage\");\n if (rhuEl) {\n const usage: HierarchyUsageParseResult[] = [];\n for (const u of rhuEl.elements ?? []) {\n if (u.name === \"rowHierarchyUsage\") {\n usage.push({ hierarchyUsage: attrNum(u, \"hierarchyUsage\") ?? 0 });\n }\n }\n result.rowHierarchiesUsage = usage;\n }\n\n // ColHierarchiesUsage\n const chuEl = findChild(el, \"colHierarchiesUsage\");\n if (chuEl) {\n const usage: HierarchyUsageParseResult[] = [];\n for (const u of chuEl.elements ?? []) {\n if (u.name === \"colHierarchyUsage\") {\n usage.push({ hierarchyUsage: attrNum(u, \"hierarchyUsage\") ?? 0 });\n }\n }\n result.colHierarchiesUsage = usage;\n }\n\n // CalculatedItems\n const ciEl = findChild(el, \"calculatedItems\");\n if (ciEl) {\n const items: CalculatedItemParseResult[] = [];\n for (const iEl of ciEl.elements ?? []) {\n if (iEl.name !== \"calculatedItem\") continue;\n const item: CalculatedItemParseResult = {};\n const field = attrNum(iEl, \"field\");\n if (field !== undefined) item.field = field;\n const formulaEl = findChild(iEl, \"formula\");\n if (formulaEl) item.formula = textOf(formulaEl);\n const paEl = findChild(iEl, \"pivotArea\");\n if (paEl) item.pivotArea = parsePivotArea(paEl);\n items.push(item);\n }\n result.calculatedItems = items;\n }\n\n // CalculatedMembers\n const cmEl = findChild(el, \"calculatedMembers\");\n if (cmEl) {\n const members: CalculatedMemberParseResult[] = [];\n for (const mEl of cmEl.elements ?? []) {\n if (mEl.name !== \"calculatedMember\") continue;\n const m: CalculatedMemberParseResult = {};\n if (attr(mEl, \"name\")) m.name = attr(mEl, \"name\");\n const mdxEl = findChild(mEl, \"mdx\");\n if (mdxEl) m.mdx = textOf(mdxEl) ?? \"\";\n if (attr(mEl, \"memberName\")) m.memberName = attr(mEl, \"memberName\");\n if (attr(mEl, \"hierarchy\")) m.hierarchy = attr(mEl, \"hierarchy\");\n if (attr(mEl, \"parent\")) m.parent = attr(mEl, \"parent\");\n const solveOrder = attrNum(mEl, \"solveOrder\");\n if (solveOrder !== undefined) m.solveOrder = solveOrder;\n if (parseOnOff(attr(mEl, \"set\"))) m.set = true;\n members.push(m);\n }\n result.calculatedMembers = members;\n }\n\n // Style from pivotTableStyleInfo/@name (the standard location)\n const styleInfoEl = findChild(el, \"pivotTableStyleInfo\");\n if (styleInfoEl) {\n const styleName = attr(styleInfoEl, \"name\");\n if (styleName) result.style = styleName;\n } else if (attr(el, \"styleName\")) {\n result.style = attr(el, \"styleName\");\n }\n\n return result as PivotTableParseResult;\n },\n};\n","/**\n * PivotCache descriptors for XLSX — generates xl/pivotCache/pivotCacheDefinition{N}.xml\n * and xl/pivotCache/pivotCacheRecords{N}.xml.\n *\n * Direct stringify/parse — no intermediate class.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor, WriteContext } from \"@office-open/core/descriptor\";\nimport { escapeXml, findChild, attr, attrNum } from \"@office-open/xml\";\n\nimport type { PivotCacheDefinitionOptions } from \"./pivot/pivot-utils\";\nimport type { PivotSourceData, TupleOptions } from \"./pivot/pivot-utils\";\nimport { collectUniqueValues, isNumericField, stringifyOlapPr } from \"./pivot/pivot-utils\";\n\n// ── Types ──\n\n/** One parsed cell from a pivotCacheRecords row (CT_Record). */\nexport type PivotCacheRecordEntry =\n | { type: \"string\"; v: number } // <x v=\"idx\"/> — shared-items index\n | { type: \"number\"; v: number } // <n v=\"num\"/>\n | { type: \"date\"; v: string } // <d v=\"date\"/>\n | { type: \"error\"; v: string } // <e v=\"#DIV/0!\"/> — cached error\n | { type: \"missing\" }; // <m/>\n\nexport interface PivotCacheRecordsDescriptorOptions {\n sourceData: PivotSourceData;\n /** Parsed records (from parse path) */\n records?: PivotCacheRecordEntry[][];\n}\n\nexport interface PivotCacheDefDescriptorOptions {\n sourceRef: string;\n sourceSheet: string;\n sourceData: PivotSourceData;\n recordsRid: string;\n cacheDefOpts?: PivotCacheDefinitionOptions;\n}\n\n/** Worksheet source (CT_WorksheetSource) parsed from a pivotCacheDefinition. */\nexport interface PivotCacheDefWorksheetSource {\n ref?: string;\n sheet?: string;\n}\n\n/** Cache field (CT_CacheField) parsed from a pivotCacheDefinition. */\nexport interface PivotCacheDefCacheField {\n name?: string;\n numFmtId?: number;\n sharedItems?: (string | number)[];\n}\n\n/** Structured output of {@link pivotCacheDefDesc}.parse — flat attributes + source + fields. */\nexport interface PivotCacheDefParseResult {\n invalid?: boolean;\n saveData?: boolean;\n optimizeMemory?: boolean;\n enableRefresh?: boolean;\n refreshedBy?: string;\n refreshedDate?: number;\n refreshedDateIso?: string;\n backgroundQuery?: boolean;\n missingItemsLimit?: number;\n upgradeOnRefresh?: boolean;\n supportSubquery?: boolean;\n supportAdvancedDrill?: boolean;\n refreshOnLoad?: boolean;\n tupleCache?: boolean;\n recordCount?: number;\n sourceType?: string;\n worksheetSource?: PivotCacheDefWorksheetSource;\n cacheFields?: PivotCacheDefCacheField[];\n}\n\n/** Structured output of {@link pivotCacheRecordsDesc}.parse. */\nexport interface PivotCacheRecordsParseResult {\n records: PivotCacheRecordEntry[][];\n}\n\n// ── Descriptors ──\n\nexport const pivotCacheDefDesc: CustomDescriptor<\n PivotCacheDefDescriptorOptions,\n WriteContext,\n PivotCacheDefParseResult\n> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return stringifyPivotCacheDef(\n opts.sourceRef,\n opts.sourceSheet,\n opts.sourceData,\n opts.recordsRid,\n opts.cacheDefOpts,\n );\n },\n\n parse(el, _ctx) {\n const result: Partial<PivotCacheDefParseResult> = {};\n\n // Root element attributes\n if (parseOnOff(attr(el, \"invalid\"))) result.invalid = true;\n if (String(attr(el, \"saveData\")) === \"0\") result.saveData = false;\n if (parseOnOff(attr(el, \"optimizeMemory\"))) result.optimizeMemory = true;\n if (String(attr(el, \"enableRefresh\")) === \"0\") result.enableRefresh = false;\n if (attr(el, \"refreshedBy\")) result.refreshedBy = attr(el, \"refreshedBy\");\n const rd = attrNum(el, \"refreshedDate\");\n if (rd !== undefined) result.refreshedDate = rd;\n if (attr(el, \"refreshedDateIso\")) result.refreshedDateIso = attr(el, \"refreshedDateIso\");\n if (parseOnOff(attr(el, \"backgroundQuery\"))) result.backgroundQuery = true;\n const mil = attrNum(el, \"missingItemsLimit\");\n if (mil !== undefined) result.missingItemsLimit = mil;\n if (parseOnOff(attr(el, \"upgradeOnRefresh\"))) result.upgradeOnRefresh = true;\n if (parseOnOff(attr(el, \"supportSubquery\"))) result.supportSubquery = true;\n if (parseOnOff(attr(el, \"supportAdvancedDrill\"))) result.supportAdvancedDrill = true;\n if (parseOnOff(attr(el, \"refreshOnLoad\"))) result.refreshOnLoad = true;\n if (parseOnOff(attr(el, \"tupleCache\"))) result.tupleCache = true;\n const recordCount = attrNum(el, \"recordCount\");\n if (recordCount !== undefined) result.recordCount = recordCount;\n\n const csEl = findChild(el, \"cacheSource\");\n if (csEl) {\n result.sourceType = attr(csEl, \"type\");\n const wssEl = findChild(csEl, \"worksheetSource\");\n if (wssEl) {\n const wss: PivotCacheDefWorksheetSource = {};\n if (attr(wssEl, \"ref\")) wss.ref = attr(wssEl, \"ref\");\n if (attr(wssEl, \"sheet\")) wss.sheet = attr(wssEl, \"sheet\");\n result.worksheetSource = wss;\n }\n }\n const cfEl = findChild(el, \"cacheFields\");\n if (cfEl) {\n const fields: PivotCacheDefCacheField[] = [];\n for (const fEl of cfEl.elements ?? []) {\n if (fEl.name !== \"cacheField\") continue;\n const field: PivotCacheDefCacheField = {};\n if (attr(fEl, \"name\")) field.name = attr(fEl, \"name\");\n if (attrNum(fEl, \"numFmtId\") !== undefined) field.numFmtId = attrNum(fEl, \"numFmtId\");\n const siEl = findChild(fEl, \"sharedItems\");\n if (siEl) {\n const items: (string | number)[] = [];\n for (const siChild of siEl.elements ?? []) {\n const v = attr(siChild, \"v\");\n if (v !== undefined) items.push(isNaN(Number(v)) ? v : Number(v));\n }\n field.sharedItems = items;\n }\n fields.push(field);\n }\n result.cacheFields = fields;\n }\n return result as PivotCacheDefParseResult;\n },\n};\n\nexport const pivotCacheRecordsDesc: CustomDescriptor<\n PivotCacheRecordsDescriptorOptions,\n WriteContext,\n PivotCacheRecordsParseResult\n> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return stringifyPivotCacheRecords(opts.sourceData);\n },\n\n parse(el, _ctx) {\n const records: PivotCacheRecordEntry[][] = [];\n for (const rEl of el.elements ?? []) {\n if (rEl.name !== \"r\") continue;\n const record: PivotCacheRecordEntry[] = [];\n for (const fEl of rEl.elements ?? []) {\n let entry: PivotCacheRecordEntry;\n if (fEl.name === \"x\") {\n entry = { type: \"string\", v: attrNum(fEl, \"v\") ?? 0 };\n } else if (fEl.name === \"n\") {\n const v = attr(fEl, \"v\");\n entry = { type: \"number\", v: v !== undefined ? Number(v) : 0 };\n } else if (fEl.name === \"d\") {\n entry = { type: \"date\", v: attr(fEl, \"v\") ?? \"\" };\n } else if (fEl.name === \"e\") {\n entry = { type: \"error\", v: attr(fEl, \"v\") ?? \"\" };\n } else if (fEl.name === \"m\") {\n entry = { type: \"missing\" };\n } else {\n continue; // skip unrecognized cell elements\n }\n record.push(entry);\n }\n records.push(record);\n }\n return { records };\n },\n};\n\n// ── Stringify: pivotCacheDefinition ──\n\nfunction stringifyPivotCacheDef(\n sourceRef: string,\n sourceSheet: string,\n sourceData: PivotSourceData,\n recordsRid: string,\n cacheDefOpts?: PivotCacheDefinitionOptions,\n): string {\n const p: string[] = [];\n const rootAttrs: string[] = [\n 'xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"',\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"',\n `r:id=\"${escapeXml(recordsRid)}\"`,\n `recordCount=\"${sourceData.records.length}\"`,\n 'createdVersion=\"6\"',\n 'refreshedVersion=\"6\"',\n 'minRefreshableVersion=\"3\"',\n ];\n\n if (cacheDefOpts) {\n const cd = cacheDefOpts;\n if (cd.invalid) rootAttrs.push('invalid=\"1\"');\n if (cd.saveData === false) rootAttrs.push('saveData=\"0\"');\n if (cd.optimizeMemory) rootAttrs.push('optimizeMemory=\"1\"');\n if (cd.enableRefresh === false) rootAttrs.push('enableRefresh=\"0\"');\n if (cd.refreshedBy) rootAttrs.push(`refreshedBy=\"${escapeXml(cd.refreshedBy)}\"`);\n if (cd.refreshedDate !== undefined) rootAttrs.push(`refreshedDate=\"${cd.refreshedDate}\"`);\n if (cd.refreshedDateIso) rootAttrs.push(`refreshedDateIso=\"${escapeXml(cd.refreshedDateIso)}\"`);\n if (cd.backgroundQuery) rootAttrs.push('backgroundQuery=\"1\"');\n if (cd.missingItemsLimit !== undefined)\n rootAttrs.push(`missingItemsLimit=\"${cd.missingItemsLimit}\"`);\n if (cd.upgradeOnRefresh) rootAttrs.push('upgradeOnRefresh=\"1\"');\n if (cd.supportSubquery) rootAttrs.push('supportSubquery=\"1\"');\n if (cd.supportAdvancedDrill) rootAttrs.push('supportAdvancedDrill=\"1\"');\n if (cd.refreshOnLoad) rootAttrs.push('refreshOnLoad=\"1\"');\n if (cd.tupleCache) rootAttrs.push('tupleCache=\"1\"');\n }\n\n p.push(`<pivotCacheDefinition ${rootAttrs.join(\" \")}>`);\n\n // cacheSource\n if (cacheDefOpts?.consolidation) {\n const con = cacheDefOpts.consolidation;\n const conParts: string[] = ['<cacheSource type=\"consolidation\"><consolidation'];\n if (con.autoPage === false) conParts.push(' autoPage=\"0\"');\n conParts.push(\">\");\n if (con.pages && con.pages.length > 0) {\n conParts.push(`<pages count=\"${con.pages.length}\">`);\n for (const pg of con.pages) {\n const pgItems = pg.items ?? [];\n conParts.push(`<page${pgItems.length ? ` count=\"${pgItems.length}\"` : \"\"}>`);\n for (const pi of pgItems) conParts.push(`<pageItem name=\"${escapeXml(pi.name)}\"/>`);\n conParts.push(\"</page>\");\n }\n conParts.push(\"</pages>\");\n }\n conParts.push(`<rangeSets count=\"${con.rangeSets.length}\">`);\n for (const rs of con.rangeSets) {\n const rsAttrs: string[] = [];\n if (rs.pageFieldIndex1 !== undefined) rsAttrs.push(`i1=\"${rs.pageFieldIndex1}\"`);\n if (rs.pageFieldIndex2 !== undefined) rsAttrs.push(`i2=\"${rs.pageFieldIndex2}\"`);\n if (rs.pageFieldIndex3 !== undefined) rsAttrs.push(`i3=\"${rs.pageFieldIndex3}\"`);\n if (rs.pageFieldIndex4 !== undefined) rsAttrs.push(`i4=\"${rs.pageFieldIndex4}\"`);\n if (rs.ref) rsAttrs.push(`ref=\"${escapeXml(rs.ref)}\"`);\n if (rs.name) rsAttrs.push(`name=\"${escapeXml(rs.name)}\"`);\n if (rs.sheet) rsAttrs.push(`sheet=\"${escapeXml(rs.sheet)}\"`);\n if (rs.rId) rsAttrs.push(`r:id=\"${escapeXml(rs.rId)}\"`);\n conParts.push(`<rangeSet ${rsAttrs.join(\" \")}/>`);\n }\n conParts.push(\"</rangeSets></consolidation></cacheSource>\");\n p.push(conParts.join(\"\"));\n } else {\n p.push(\n `<cacheSource type=\"worksheet\">` +\n `<worksheetSource ref=\"${escapeXml(sourceRef)}\" sheet=\"${escapeXml(sourceSheet)}\"/>` +\n `</cacheSource>`,\n );\n }\n\n // cacheFields\n const fieldNames = sourceData.fieldNames;\n p.push(`<cacheFields count=\"${fieldNames.length}\">`);\n\n for (let i = 0; i < fieldNames.length; i++) {\n const fieldName = fieldNames[i] ?? \"\";\n const numeric = isNumericField(sourceData.records, i);\n const uniqueVals = collectUniqueValues(sourceData.records, i);\n\n if (numeric) {\n let min = Infinity,\n max = -Infinity;\n for (const row of sourceData.records) {\n const v = row[i];\n if (typeof v === \"number\") {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n }\n if (!isFinite(min)) {\n min = 0;\n max = 0;\n }\n const allInteger = sourceData.records.every(\n (row) => typeof row[i] === \"number\" && Number.isInteger(row[i]),\n );\n\n const cfOverride = cacheDefOpts?.cacheFieldOverrides?.get(i);\n const cfExtraAttrs: string[] = [];\n const siExtraAttrs: string[] = [];\n if (cfOverride) {\n if (cfOverride.databaseField) cfExtraAttrs.push('databaseField=\"1\"');\n if (cfOverride.level !== undefined) cfExtraAttrs.push(`level=\"${cfOverride.level}\"`);\n if (cfOverride.mappingCount !== undefined)\n cfExtraAttrs.push(`mappingCount=\"${cfOverride.mappingCount}\"`);\n if (cfOverride.memberPropertyField !== undefined)\n cfExtraAttrs.push(`memberPropertyField=\"${cfOverride.memberPropertyField}\"`);\n if (cfOverride.propertyName)\n cfExtraAttrs.push(`propertyName=\"${escapeXml(cfOverride.propertyName)}\"`);\n if (cfOverride.serverField) cfExtraAttrs.push('serverField=\"1\"');\n if (cfOverride.uniqueList) cfExtraAttrs.push('uniqueList=\"1\"');\n if (cfOverride.sqlType !== undefined) cfExtraAttrs.push(`sqlType=\"${cfOverride.sqlType}\"`);\n if (cfOverride.containsMixedTypes) siExtraAttrs.push('containsMixedTypes=\"1\"');\n if (cfOverride.containsNonDate) siExtraAttrs.push('containsNonDate=\"1\"');\n if (cfOverride.longText) siExtraAttrs.push('longText=\"1\"');\n }\n\n p.push(\n `<cacheField name=\"${escapeXml(fieldName)}\" ${cfExtraAttrs.length ? cfExtraAttrs.join(\" \") + \" \" : \"\"}numFmtId=\"0\">` +\n `<sharedItems containsSemiMixedTypes=\"0\" containsString=\"0\"` +\n ` containsNumber=\"1\" containsInteger=\"${allInteger ? \"1\" : \"0\"}\"` +\n ` minValue=\"${min}\" maxValue=\"${max}\" count=\"${uniqueVals.length}\"${siExtraAttrs.length ? \" \" + siExtraAttrs.join(\" \") : \"\"}>`,\n );\n for (const v of uniqueVals) {\n if (v === null) p.push(\"<m/>\");\n else if (v instanceof Date) p.push(`<d v=\"${v.toISOString().replace(/\\.\\d{3}Z$/, \"Z\")}\"/>`);\n else p.push(`<n v=\"${v}\"/>`);\n }\n p.push(\"</sharedItems></cacheField>\");\n } else {\n let hasDate = false,\n hasMissing = false;\n for (const v of uniqueVals) {\n if (v instanceof Date) hasDate = true;\n if (v === null) hasMissing = true;\n }\n const siAttrs: string[] = [`count=\"${uniqueVals.length}\"`];\n if (hasDate) {\n siAttrs.push('containsDate=\"1\"');\n let minD: Date | undefined;\n let maxD: Date | undefined;\n for (const v of uniqueVals) {\n if (!(v instanceof Date)) continue;\n if (!minD || v < minD) minD = v;\n if (!maxD || v > maxD) maxD = v;\n }\n const iso = (d: Date) => d.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n if (minD) siAttrs.push(`minDate=\"${iso(minD)}\"`);\n if (maxD) siAttrs.push(`maxDate=\"${iso(maxD)}\"`);\n }\n if (hasMissing) siAttrs.push('containsBlank=\"1\"');\n\n const cfOverride = cacheDefOpts?.cacheFieldOverrides?.get(i);\n const cfExtraAttrs: string[] = [];\n if (cfOverride) {\n if (cfOverride.databaseField) cfExtraAttrs.push('databaseField=\"1\"');\n if (cfOverride.level !== undefined) cfExtraAttrs.push(`level=\"${cfOverride.level}\"`);\n if (cfOverride.mappingCount !== undefined)\n cfExtraAttrs.push(`mappingCount=\"${cfOverride.mappingCount}\"`);\n if (cfOverride.memberPropertyField !== undefined)\n cfExtraAttrs.push(`memberPropertyField=\"${cfOverride.memberPropertyField}\"`);\n if (cfOverride.propertyName)\n cfExtraAttrs.push(`propertyName=\"${escapeXml(cfOverride.propertyName)}\"`);\n if (cfOverride.serverField) cfExtraAttrs.push('serverField=\"1\"');\n if (cfOverride.uniqueList) cfExtraAttrs.push('uniqueList=\"1\"');\n if (cfOverride.sqlType !== undefined) cfExtraAttrs.push(`sqlType=\"${cfOverride.sqlType}\"`);\n if (cfOverride.containsMixedTypes) siAttrs.push('containsMixedTypes=\"1\"');\n if (cfOverride.containsNonDate) siAttrs.push('containsNonDate=\"1\"');\n if (cfOverride.longText) siAttrs.push('longText=\"1\"');\n }\n\n p.push(\n `<cacheField name=\"${escapeXml(fieldName)}\" ${cfExtraAttrs.length ? cfExtraAttrs.join(\" \") + \" \" : \"\"}numFmtId=\"0\"><sharedItems ${siAttrs.join(\" \")}>`,\n );\n\n for (const v of uniqueVals) {\n if (v === null) p.push(\"<m/>\");\n else if (v instanceof Date) p.push(`<d v=\"${v.toISOString().replace(/\\.\\d{3}Z$/, \"Z\")}\"/>`);\n else p.push(`<s v=\"${escapeXml(String(v))}\"/>`);\n }\n p.push(\"</sharedItems>\");\n\n // fieldGroup\n const fg = cacheDefOpts?.fieldGroups?.get(i);\n if (fg) {\n const fgParts: string[] = [\"<fieldGroup\"];\n if (fg.parent !== undefined) fgParts.push(` par=\"${fg.parent}\"`);\n if (fg.base !== undefined) fgParts.push(` base=\"${fg.base}\"`);\n fgParts.push(\">\");\n if (fg.rangePr) {\n const rp = fg.rangePr;\n const rpAttrs: string[] = [];\n if (rp.autoStart === false) rpAttrs.push('autoStart=\"0\"');\n if (rp.autoEnd === false) rpAttrs.push('autoEnd=\"0\"');\n if (rp.groupBy && rp.groupBy !== \"range\") rpAttrs.push(`groupBy=\"${rp.groupBy}\"`);\n if (rp.startNum !== undefined) rpAttrs.push(`startNum=\"${rp.startNum}\"`);\n if (rp.endNum !== undefined) rpAttrs.push(`endNum=\"${rp.endNum}\"`);\n if (rp.startDate) rpAttrs.push(`startDate=\"${escapeXml(rp.startDate)}\"`);\n if (rp.endDate) rpAttrs.push(`endDate=\"${escapeXml(rp.endDate)}\"`);\n if (rp.groupInterval !== undefined) rpAttrs.push(`groupInterval=\"${rp.groupInterval}\"`);\n fgParts.push(`<rangePr${rpAttrs.length ? \" \" + rpAttrs.join(\" \") : \"\"}/>`);\n }\n if (fg.discretePr && fg.discretePr.length > 0) {\n fgParts.push(`<discretePr count=\"${fg.discretePr.length}\">`);\n for (const idx of fg.discretePr) fgParts.push(`<x v=\"${idx}\"/>`);\n fgParts.push(\"</discretePr>\");\n }\n if (fg.groupItems && fg.groupItems.length > 0) {\n fgParts.push(`<groupItems count=\"${fg.groupItems.length}\">`);\n for (const gi of fg.groupItems) fgParts.push(`<s v=\"${escapeXml(gi)}\"/>`);\n fgParts.push(\"</groupItems>\");\n }\n fgParts.push(\"</fieldGroup>\");\n p.push(fgParts.join(\"\"));\n }\n\n p.push(\"</cacheField>\");\n }\n }\n p.push(\"</cacheFields>\");\n\n // mpMap\n if (cacheDefOpts?.mpMaps) {\n for (const mp of cacheDefOpts.mpMaps) p.push(`<mpMap x=\"${mp.x}\"/>`);\n }\n\n // olapPr\n const olapPrXml = cacheDefOpts?.olapPr ? stringifyOlapPr(cacheDefOpts.olapPr) : \"\";\n if (olapPrXml) p.push(olapPrXml);\n\n // cacheHierarchies\n if (cacheDefOpts?.cacheHierarchies && cacheDefOpts.cacheHierarchies.length > 0) {\n const chs = cacheDefOpts.cacheHierarchies;\n p.push(`<cacheHierarchies count=\"${chs.length}\">`);\n for (const ch of chs) {\n const chAttrs: string[] = [`uniqueName=\"${escapeXml(ch.uniqueName)}\"`, `count=\"${ch.count}\"`];\n if (ch.caption) chAttrs.push(`caption=\"${escapeXml(ch.caption)}\"`);\n if (ch.measure) chAttrs.push('measure=\"1\"');\n if (ch.set) chAttrs.push('set=\"1\"');\n if (ch.parentSet !== undefined) chAttrs.push(`parentSet=\"${ch.parentSet}\"`);\n if (ch.iconSet !== undefined && ch.iconSet !== 0) chAttrs.push(`iconSet=\"${ch.iconSet}\"`);\n if (ch.attribute) chAttrs.push('attribute=\"1\"');\n if (ch.time) chAttrs.push('time=\"1\"');\n if (ch.keyAttribute) chAttrs.push('keyAttribute=\"1\"');\n if (ch.defaultMemberUniqueName)\n chAttrs.push(`defaultMemberUniqueName=\"${escapeXml(ch.defaultMemberUniqueName)}\"`);\n if (ch.allUniqueName) chAttrs.push(`allUniqueName=\"${escapeXml(ch.allUniqueName)}\"`);\n if (ch.allCaption) chAttrs.push(`allCaption=\"${escapeXml(ch.allCaption)}\"`);\n if (ch.dimensionUniqueName)\n chAttrs.push(`dimensionUniqueName=\"${escapeXml(ch.dimensionUniqueName)}\"`);\n if (ch.displayFolder) chAttrs.push(`displayFolder=\"${escapeXml(ch.displayFolder)}\"`);\n if (ch.measureGroup) chAttrs.push(`measureGroup=\"${escapeXml(ch.measureGroup)}\"`);\n if (ch.measures) chAttrs.push('measures=\"1\"');\n if (ch.oneField) chAttrs.push('oneField=\"1\"');\n if (ch.hidden) chAttrs.push('hidden=\"1\"');\n if (ch.memberValueDatatype) chAttrs.push(`memberValueDatatype=\"${ch.memberValueDatatype}\"`);\n if (ch.unbalanced) chAttrs.push('unbalanced=\"1\"');\n if (ch.unbalancedGroup) chAttrs.push('unbalancedGroup=\"1\"');\n\n const hasGL = ch.groupLevels && ch.groupLevels.length > 0;\n const hasFU = ch.fieldsUsage && ch.fieldsUsage.length > 0;\n if (hasGL || hasFU) {\n p.push(`<cacheHierarchy ${chAttrs.join(\" \")}>`);\n if (hasFU) {\n const fuParts = [`<fieldsUsage count=\"${ch.fieldsUsage!.length}\">`];\n for (const fu of ch.fieldsUsage!) fuParts.push(`<fieldUsage v=\"${fu.value}\"/>`);\n fuParts.push(\"</fieldsUsage>\");\n p.push(fuParts.join(\"\"));\n }\n if (hasGL) {\n const glParts = [`<groupLevels count=\"${ch.groupLevels!.length}\">`];\n for (const gl of ch.groupLevels!) {\n const glAttrs = [\n `uniqueName=\"${escapeXml(gl.uniqueName)}\"`,\n `caption=\"${escapeXml(gl.caption)}\"`,\n ];\n if (gl.user) glAttrs.push('user=\"1\"');\n if (gl.customRollUp) glAttrs.push('customRollUp=\"1\"');\n if (gl.groups && gl.groups.length > 0) {\n glParts.push(`<groupLevel ${glAttrs.join(\" \")}><groups count=\"${gl.groups.length}\">`);\n for (const lg of gl.groups) {\n const lgAttrs = [\n `name=\"${escapeXml(lg.name)}\"`,\n `uniqueName=\"${escapeXml(lg.uniqueName)}\"`,\n `caption=\"${escapeXml(lg.caption)}\"`,\n ];\n if (lg.uniqueParent) lgAttrs.push(`uniqueParent=\"${escapeXml(lg.uniqueParent)}\"`);\n if (lg.id !== undefined) lgAttrs.push(`id=\"${lg.id}\"`);\n glParts.push(\n `<group ${lgAttrs.join(\" \")}><groupMembers count=\"${lg.members.length}\">`,\n );\n for (const gm of lg.members) {\n const gmAttrs = [`uniqueName=\"${escapeXml(gm.uniqueName)}\"`];\n if (gm.group) gmAttrs.push('group=\"1\"');\n glParts.push(`<groupMember ${gmAttrs.join(\" \")}/>`);\n }\n glParts.push(\"</groupMembers></group>\");\n }\n glParts.push(\"</groups></groupLevel>\");\n } else {\n glParts.push(`<groupLevel ${glAttrs.join(\" \")}/>`);\n }\n }\n glParts.push(\"</groupLevels>\");\n p.push(glParts.join(\"\"));\n }\n p.push(\"</cacheHierarchy>\");\n } else {\n p.push(`<cacheHierarchy ${chAttrs.join(\" \")}/>`);\n }\n }\n p.push(\"</cacheHierarchies>\");\n }\n\n // kpis\n if (cacheDefOpts?.kpis && cacheDefOpts.kpis.length > 0) {\n p.push(`<kpis count=\"${cacheDefOpts.kpis.length}\">`);\n for (const k of cacheDefOpts.kpis) {\n const kAttrs: string[] = [\n `uniqueName=\"${escapeXml(k.uniqueName)}\"`,\n `value=\"${escapeXml(k.value)}\"`,\n ];\n if (k.caption) kAttrs.push(`caption=\"${escapeXml(k.caption)}\"`);\n if (k.displayFolder) kAttrs.push(`displayFolder=\"${escapeXml(k.displayFolder)}\"`);\n if (k.measureGroup) kAttrs.push(`measureGroup=\"${escapeXml(k.measureGroup)}\"`);\n if (k.parent) kAttrs.push(`parent=\"${escapeXml(k.parent)}\"`);\n if (k.goal) kAttrs.push(`goal=\"${escapeXml(k.goal)}\"`);\n if (k.status) kAttrs.push(`status=\"${escapeXml(k.status)}\"`);\n if (k.trend) kAttrs.push(`trend=\"${escapeXml(k.trend)}\"`);\n if (k.weight) kAttrs.push(`weight=\"${escapeXml(k.weight)}\"`);\n if (k.time) kAttrs.push(`time=\"${escapeXml(k.time)}\"`);\n p.push(`<kpi ${kAttrs.join(\" \")}/>`);\n }\n p.push(\"</kpis>\");\n }\n\n // measureGroups\n if (cacheDefOpts?.measureGroups && cacheDefOpts.measureGroups.length > 0) {\n p.push(`<measureGroups count=\"${cacheDefOpts.measureGroups.length}\">`);\n for (const mg of cacheDefOpts.measureGroups) {\n p.push(`<measureGroup name=\"${escapeXml(mg.name)}\" caption=\"${escapeXml(mg.caption)}\"/>`);\n }\n p.push(\"</measureGroups>\");\n }\n\n // maps\n if (cacheDefOpts?.measureDimensionMaps && cacheDefOpts.measureDimensionMaps.length > 0) {\n p.push(`<maps count=\"${cacheDefOpts.measureDimensionMaps.length}\">`);\n for (const m of cacheDefOpts.measureDimensionMaps) {\n const mAttrs: string[] = [];\n if (m.measureGroup !== undefined) mAttrs.push(`measureGroup=\"${m.measureGroup}\"`);\n if (m.dimension !== undefined) mAttrs.push(`dimension=\"${m.dimension}\"`);\n p.push(`<map ${mAttrs.join(\" \")}/>`);\n }\n p.push(\"</maps>\");\n }\n\n // dimensions\n if (cacheDefOpts?.dimensions && cacheDefOpts.dimensions.length > 0) {\n p.push(`<dimensions count=\"${cacheDefOpts.dimensions.length}\">`);\n for (const d of cacheDefOpts.dimensions) {\n const dAttrs: string[] = [\n `name=\"${escapeXml(d.name)}\"`,\n `uniqueName=\"${escapeXml(d.uniqueName)}\"`,\n `caption=\"${escapeXml(d.caption)}\"`,\n ];\n if (d.measure) dAttrs.push('measure=\"1\"');\n p.push(`<dimension ${dAttrs.join(\" \")}/>`);\n }\n p.push(\"</dimensions>\");\n }\n\n // tupleCache\n const cd = cacheDefOpts;\n const hasEntries = cd?.entries && cd.entries.length > 0;\n const hasSets = cd?.sets && cd.sets.length > 0;\n const hasSF = cd?.serverFormats && cd.serverFormats.length > 0;\n const hasQC = cd?.queryCache && cd.queryCache.length > 0;\n if (hasEntries || hasSets || hasSF || hasQC) {\n p.push(\"<tupleCache>\");\n if (hasEntries) {\n const entParts: string[] = [`<entries count=\"${cd!.entries!.length}\">`];\n for (const ent of cd!.entries!) {\n const olapAttrs =\n (ent.captionIndex !== undefined ? ` cp=\"${ent.captionIndex}\"` : \"\") +\n (ent.propertyIndex !== undefined ? ` in=\"${ent.propertyIndex}\"` : \"\") +\n (ent.underline ? ' un=\"1\"' : \"\");\n if (ent.type === \"m\") entParts.push(`<m${olapAttrs}/>`);\n else if (ent.type === \"e\")\n entParts.push(`<e v=\"${escapeXml(String(ent.value ?? \"\"))}\"${olapAttrs}/>`);\n else if (ent.value !== undefined)\n entParts.push(`<${ent.type} v=\"${ent.value}\"${olapAttrs}/>`);\n }\n entParts.push(\"</entries>\");\n p.push(entParts.join(\"\"));\n }\n if (hasSets) {\n p.push(`<sets count=\"${cd!.sets!.length}\">`);\n for (const s of cd!.sets!) {\n const sAttrs: string[] = [\n `maxRank=\"${s.maxRank}\"`,\n `setDefinition=\"${escapeXml(s.setDefinition)}\"`,\n ];\n if (s.count !== undefined) sAttrs.push(`count=\"${s.count}\"`);\n if (s.sortType && s.sortType !== \"none\") sAttrs.push(`sortType=\"${s.sortType}\"`);\n if (s.queryFailed) sAttrs.push('queryFailed=\"1\"');\n const tplsXml = (tpls: TupleOptions[] | undefined) =>\n tpls && tpls.length > 0\n ? `<tpls count=\"${tpls.length}\">${tpls\n .map((tpl) =>\n tpl.items && tpl.items.length > 0\n ? `<tpl>${tpl.items.map((x) => `<x v=\"${x}\"/>`).join(\"\")}</tpl>`\n : \"<tpl/>\",\n )\n .join(\"\")}</tpls>`\n : \"\";\n const sortByXml =\n s.sortByTuple && s.sortByTuple.length > 0\n ? `<sortByTuple>${s.sortByTuple\n .map((tpl) =>\n tpl.items && tpl.items.length > 0\n ? `<tpl>${tpl.items.map((x) => `<x v=\"${x}\"/>`).join(\"\")}</tpl>`\n : \"<tpl/>\",\n )\n .join(\"\")}</sortByTuple>`\n : \"\";\n const inner = tplsXml(s.tpls) + sortByXml;\n if (inner) p.push(`<set ${sAttrs.join(\" \")}>${inner}</set>`);\n else p.push(`<set ${sAttrs.join(\" \")}/>`);\n }\n p.push(\"</sets>\");\n }\n if (hasSF) {\n p.push(`<serverFormats count=\"${cd!.serverFormats!.length}\">`);\n for (const sf of cd!.serverFormats!) {\n const sfAttrs: string[] = [];\n if (sf.culture) sfAttrs.push(`culture=\"${escapeXml(sf.culture)}\"`);\n if (sf.format) sfAttrs.push(`format=\"${escapeXml(sf.format)}\"`);\n p.push(`<serverFormat ${sfAttrs.join(\" \")}/>`);\n }\n p.push(\"</serverFormats>\");\n }\n if (hasQC) {\n p.push(`<queryCache count=\"${cd!.queryCache!.length}\">`);\n for (const q of cd!.queryCache!) {\n const qInner =\n q.tpls && q.tpls.length > 0\n ? `<tpls count=\"${q.tpls.length}\">${q.tpls.map((tpl: { items?: number[] }) => (tpl.items && tpl.items.length > 0 ? `<tpl>${tpl.items.map((x: number) => `<x v=\"${x}\"/>`).join(\"\")}</tpl>` : \"<tpl/>\")).join(\"\")}</tpls>`\n : \"\";\n if (qInner) p.push(`<query mdx=\"${escapeXml(q.mdx)}\">${qInner}</query>`);\n else p.push(`<query mdx=\"${escapeXml(q.mdx)}\"/>`);\n }\n p.push(\"</queryCache>\");\n }\n p.push(\"</tupleCache>\");\n }\n\n p.push(\"</pivotCacheDefinition>\");\n return p.join(\"\");\n}\n\n// ── Stringify: pivotCacheRecords ──\n\nfunction stringifyPivotCacheRecords(sourceData: PivotSourceData): string {\n const numericFields = sourceData.fieldNames.map((_, i) => isNumericField(sourceData.records, i));\n const fieldIndexMaps: Map<string, number>[] = sourceData.fieldNames.map((_, i) => {\n if (numericFields[i]) return new Map<string, number>();\n const unique = collectUniqueValues(sourceData.records, i);\n const map = new Map<string, number>();\n for (let j = 0; j < unique.length; j++) map.set(String(unique[j]), j);\n return map;\n });\n\n const p: string[] = [];\n p.push(\n `<pivotCacheRecords xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${sourceData.records.length}\">`,\n );\n\n for (const row of sourceData.records) {\n p.push(\"<r>\");\n for (let i = 0; i < row.length; i++) {\n const val = row[i];\n if (val === null) {\n p.push(\"<m/>\");\n } else if (val instanceof Date) {\n p.push(`<d v=\"${val.toISOString().replace(/\\.\\d{3}Z$/, \"Z\")}\"/>`);\n } else if (numericFields[i]) {\n p.push(`<n v=\"${val}\"/>`);\n } else {\n p.push(`<x v=\"${fieldIndexMaps[i]?.get(String(val)) ?? 0}\"/>`);\n }\n }\n p.push(\"</r>\");\n }\n\n p.push(\"</pivotCacheRecords>\");\n return p.join(\"\");\n}\n","/**\n * Table types and descriptor for SpreadsheetML documents.\n *\n * Implements CT_Table from sml.xsd (transitional schema).\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { xsdTotalsRowFunction } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport {\n findChild,\n attr,\n attrNum,\n attrs,\n textOf,\n escapeXml,\n stringifyElement,\n} from \"@office-open/xml\";\n\nimport { parseAutoFilter, stringifyAutoFilter } from \"./auto-filter\";\nimport type { AutoFilterOptions } from \"./worksheet\";\n\n// ── Totals row function (ST_TotalsRowFunction) ──\n\nexport const TotalsRowFunction = {\n NONE: \"none\",\n SUM: \"sum\",\n MIN: \"min\",\n MAX: \"max\",\n AVERAGE: \"average\",\n COUNT: \"count\",\n COUNT_NUMS: \"countNumbers\",\n STD_DEV: \"standardDeviation\",\n VAR: \"variance\",\n CUSTOM: \"custom\",\n} as const;\n\n/** Totals-row aggregate (ST_TotalsRowFunction). */\nexport type TotalsRowFunction = (typeof TotalsRowFunction)[keyof typeof TotalsRowFunction];\n\n// ── Table type (ST_TableType) ──\n\nexport const TableType = {\n WORKSHEET: \"worksheet\",\n XML: \"xml\",\n QUERY_TABLE: \"queryTable\",\n} as const;\n\n/** Table source kind (ST_TableType): \"worksheet\", \"xml\" external XML mapping, \"queryTable\" query result. */\nexport type TableType = (typeof TableType)[keyof typeof TableType];\n\n// ── Options interfaces ──\n\nexport interface TableStyleInfoOptions {\n /** Table style name, e.g. \"TableStyleMedium9\" */\n name?: string;\n showFirstColumn?: boolean;\n showLastColumn?: boolean;\n showRowStripes?: boolean;\n showColumnStripes?: boolean;\n}\n\nexport interface TableColumnOptions {\n /** Column name (used in header row) */\n name: string;\n totalsRowFunction?: TotalsRowFunction;\n /** Totals row label (used when totalsRowFunction is \"none\" or \"custom\") */\n totalsRowLabel?: string;\n calculatedColumnFormula?: string;\n /** Totals row formula (CT_TableColumn/totalsRowFormula, used when totalsRowFunction is \"custom\") */\n totalsRowFormula?: string;\n /** Whether totals row formula is array (CT_TableFormula `@array`) */\n totalsRowFormulaArray?: boolean;\n /** Whether calculated column formula is array (CT_TableFormula `@array`) */\n calculatedColumnFormulaArray?: boolean;\n /** Unique column name for structured references (CT_TableColumn `@uniqueName`) */\n uniqueName?: string;\n /** Query table field ID (CT_TableColumn `@queryTableFieldId`) */\n queryTableFieldId?: number;\n /** Header row differential format index */\n headerRowDxfId?: number;\n /** Data differential format index */\n dataDxfId?: number;\n /** Totals row differential format index */\n totalsRowDxfId?: number;\n /** Header row cell style name */\n headerRowCellStyle?: string;\n /** Data cell style name */\n dataCellStyle?: string;\n /** Totals row cell style name */\n totalsRowCellStyle?: string;\n /** XML mapping (CT_XmlColumnPr) — binds the column to an XML map */\n xmlColumnPr?: XmlColumnPrOptions;\n}\n\n/** XML column properties (CT_XmlColumnPr — table column bound to an XML map). */\nexport interface XmlColumnPrOptions {\n /** XML map id (required, indexes xl/xmlMaps.xml Map entries) */\n mapId: number;\n /** XPath expression (required) */\n xpath: string;\n /** Denormalized (default false) */\n denormalized?: boolean;\n /** XML schema data type (required, ST_XmlDataType) */\n xmlDataType: string;\n}\n\nexport interface TableOptions {\n /** Unique table id (1-based across the workbook); omit for auto-numbering */\n id?: number;\n /** Table name (used in structured references) */\n name?: string;\n /** Display name (required by XSD, defaults to name if not set) */\n displayName: string;\n /** Table comment (CT_Table `@comment`) */\n comment?: string;\n /** Data range, e.g. \"A1:D10\" */\n ref: string;\n /** Column definitions */\n columns: TableColumnOptions[];\n /** Number of header rows (default: 1) */\n headerRowCount?: number;\n /** Insert row allowed (CT_Table `@insertRow`) */\n insertRow?: boolean;\n /** Number of totals rows (default: 0) */\n totalsRowCount?: number;\n /** Whether to show totals row (default: true when totalsRowCount > 0) */\n totalsRowShown?: boolean;\n /** Table type (default: \"worksheet\") */\n tableType?: TableType;\n /** Table style */\n style?: TableStyleInfoOptions;\n /**\n * Raw inner XML of the table's trailing extLst (x14:table altText lives\n * here). Round-trip only.\n */\n ext?: string;\n /**\n * Table alternate-text (x14:table `@altText` inside the trailing extLst).\n * Structured counterpart of `ext` — emit builds the x14:table\n * extension from it when ext itself is absent.\n */\n altText?: string;\n /** Table alternate-text summary (x14:table `@altTextSummary`). */\n altTextSummary?: string;\n /** Auto-filter (ref shorthand or structured filter columns/sort state) */\n autoFilter?: string | AutoFilterOptions;\n /** Insert row shifts existing rows (CT_Table `@insertRowShift`) */\n insertRowShift?: boolean;\n /** Published to server (CT_Table `@published`) */\n published?: boolean;\n /** Header row differential format index */\n headerRowDxfId?: number;\n /** Data differential format index */\n dataDxfId?: number;\n /** Totals row differential format index */\n totalsRowDxfId?: number;\n /** Header row border differential format index */\n headerRowBorderDxfId?: number;\n /** Table border differential format index */\n tableBorderDxfId?: number;\n /** Totals row border differential format index */\n totalsRowBorderDxfId?: number;\n /** Header row cell style name */\n headerRowCellStyle?: string;\n /** Data cell style name */\n dataCellStyle?: string;\n /** Totals row cell style name */\n totalsRowCellStyle?: string;\n /** Query table connection ID (CT_Table `@connectionId`) */\n connectionId?: number;\n}\n\n// ── Descriptor ──\n\nexport const tableDesc: CustomDescriptor<TableOptions> = {\n kind: \"custom\",\n\n stringify(o, _ctx) {\n const p: string[] = [];\n\n // Root element with attributes\n const rootAttrs: Record<string, string | number | boolean | undefined> = {\n id: o.id,\n name: o.name ?? o.displayName,\n displayName: o.displayName,\n ref: o.ref,\n };\n if (o.comment) rootAttrs.comment = o.comment;\n if (o.tableType && o.tableType !== \"worksheet\") {\n rootAttrs.tableType = o.tableType;\n }\n if (o.headerRowCount !== undefined && o.headerRowCount !== 1) {\n rootAttrs.headerRowCount = o.headerRowCount;\n }\n if (o.insertRow) rootAttrs.insertRow = 1;\n if (o.totalsRowCount !== undefined && o.totalsRowCount > 0) {\n rootAttrs.totalsRowCount = o.totalsRowCount;\n }\n if (o.totalsRowShown === false) {\n rootAttrs.totalsRowShown = 0;\n }\n if (o.insertRowShift) rootAttrs.insertRowShift = 1;\n if (o.published) rootAttrs.published = 1;\n if (o.connectionId !== undefined) rootAttrs.connectionId = o.connectionId;\n if (o.headerRowDxfId !== undefined) rootAttrs.headerRowDxfId = o.headerRowDxfId;\n if (o.dataDxfId !== undefined) rootAttrs.dataDxfId = o.dataDxfId;\n if (o.totalsRowDxfId !== undefined) rootAttrs.totalsRowDxfId = o.totalsRowDxfId;\n if (o.headerRowBorderDxfId !== undefined)\n rootAttrs.headerRowBorderDxfId = o.headerRowBorderDxfId;\n if (o.tableBorderDxfId !== undefined) rootAttrs.tableBorderDxfId = o.tableBorderDxfId;\n if (o.totalsRowBorderDxfId !== undefined)\n rootAttrs.totalsRowBorderDxfId = o.totalsRowBorderDxfId;\n if (o.headerRowCellStyle) rootAttrs.headerRowCellStyle = o.headerRowCellStyle;\n if (o.dataCellStyle) rootAttrs.dataCellStyle = o.dataCellStyle;\n if (o.totalsRowCellStyle) rootAttrs.totalsRowCellStyle = o.totalsRowCellStyle;\n\n p.push(\n `<table xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"` +\n ` xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"` +\n ` mc:Ignorable=\"xr xr2\"` +\n ` xmlns:xr=\"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"` +\n ` xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"${attrs(rootAttrs)}>`,\n );\n\n // autoFilter (optional, before tableColumns per XSD sequence)\n if (o.autoFilter !== undefined) {\n p.push(stringifyAutoFilter(o.autoFilter));\n }\n\n // tableColumns (required)\n p.push(`<tableColumns count=\"${o.columns.length}\">`);\n for (const [i, col] of o.columns.entries()) {\n const colAttrs: Record<string, string | number | boolean | undefined> = {\n id: i + 1,\n name: col.name,\n };\n\n const inner: string[] = [];\n\n // calculatedColumnFormula\n if (col.calculatedColumnFormula !== undefined) {\n const fAttrs = col.calculatedColumnFormulaArray ? ' array=\"1\"' : \"\";\n inner.push(\n `<calculatedColumnFormula${fAttrs}>${escapeXml(col.calculatedColumnFormula)}</calculatedColumnFormula>`,\n );\n }\n\n // totalsRowFormula (when totalsRowFunction is \"custom\")\n if (col.totalsRowFormula !== undefined) {\n const fAttrs = col.totalsRowFormulaArray ? ' array=\"1\"' : \"\";\n inner.push(\n `<totalsRowFormula${fAttrs}>${escapeXml(col.totalsRowFormula)}</totalsRowFormula>`,\n );\n }\n\n if (col.totalsRowFunction !== undefined && col.totalsRowFunction !== TotalsRowFunction.NONE) {\n colAttrs.totalsRowFunction = xsdTotalsRowFunction.to(col.totalsRowFunction);\n }\n if (col.totalsRowLabel !== undefined) {\n colAttrs.totalsRowLabel = col.totalsRowLabel;\n }\n if (col.uniqueName) colAttrs.uniqueName = col.uniqueName;\n if (col.queryTableFieldId !== undefined) colAttrs.queryTableFieldId = col.queryTableFieldId;\n if (col.headerRowDxfId !== undefined) colAttrs.headerRowDxfId = col.headerRowDxfId;\n if (col.dataDxfId !== undefined) colAttrs.dataDxfId = col.dataDxfId;\n if (col.totalsRowDxfId !== undefined) colAttrs.totalsRowDxfId = col.totalsRowDxfId;\n if (col.headerRowCellStyle) colAttrs.headerRowCellStyle = col.headerRowCellStyle;\n if (col.dataCellStyle) colAttrs.dataCellStyle = col.dataCellStyle;\n if (col.totalsRowCellStyle) colAttrs.totalsRowCellStyle = col.totalsRowCellStyle;\n\n // x:xmlColumnPr @mapId is a required UInt32 — skip the whole element when\n // no usable map id exists (nothing to bind the column to)\n if (col.xmlColumnPr && typeof col.xmlColumnPr.mapId === \"number\") {\n const xp = col.xmlColumnPr;\n const xpAttrs = [`mapId=\"${xp.mapId}\"`, `xpath=\"${escapeXml(xp.xpath)}\"`];\n if (xp.denormalized) xpAttrs.push('denormalized=\"1\"');\n xpAttrs.push(`xmlDataType=\"${escapeXml(xp.xmlDataType)}\"`);\n inner.push(`<xmlColumnPr ${xpAttrs.join(\" \")}/>`);\n }\n\n if (inner.length > 0) {\n p.push(`<tableColumn${attrs(colAttrs)}>${inner.join(\"\")}</tableColumn>`);\n } else {\n p.push(`<tableColumn${attrs(colAttrs)}/>`);\n }\n }\n p.push(\"</tableColumns>\");\n\n // tableStyleInfo (optional)\n if (o.style) {\n const s = o.style;\n const styleAttrs: Record<string, string | number | boolean | undefined> = {};\n if (s.name !== undefined) styleAttrs.name = s.name;\n // Emit each flag only when explicitly set: the XSD defaults (false for\n // first/last/column stripes, true for row stripes) already cover an\n // omitted attr, and forcing \"1\" on undefined would flip a round-tripped\n // showRowStripes=\"0\" back on (parse drops the explicit false).\n if (s.showFirstColumn !== undefined) styleAttrs.showFirstColumn = s.showFirstColumn ? 1 : 0;\n if (s.showLastColumn !== undefined) styleAttrs.showLastColumn = s.showLastColumn ? 1 : 0;\n if (s.showRowStripes !== undefined) styleAttrs.showRowStripes = s.showRowStripes ? 1 : 0;\n if (s.showColumnStripes !== undefined)\n styleAttrs.showColumnStripes = s.showColumnStripes ? 1 : 0;\n p.push(`<tableStyleInfo${attrs(styleAttrs)}/>`);\n }\n\n if (o.ext) {\n p.push(`<extLst>${o.ext}</extLst>`);\n } else if (o.altText !== undefined || o.altTextSummary !== undefined) {\n // x14:table extension (uri + ns per the x14 schema); the raw ext channel\n // wins when both are present so a round-tripped source stays verbatim.\n const a: string[] = [];\n if (o.altText !== undefined) a.push(` altText=\"${escapeXml(o.altText)}\"`);\n if (o.altTextSummary !== undefined)\n a.push(` altTextSummary=\"${escapeXml(o.altTextSummary)}\"`);\n p.push(\n '<extLst><ext uri=\"{504A1905-F514-4f6f-8877-14C23A59335A}\" xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\">' +\n `<x14:table${a.join(\"\")}/></ext></extLst>`,\n );\n }\n\n p.push(\"</table>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<TableOptions> = {};\n\n // Root attributes. nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\"\n // to numbers, so boolean attribute checks use String() coercion.\n const id = attrNum(el, \"id\");\n if (id !== undefined) result.id = id;\n if (attr(el, \"name\")) result.name = attr(el, \"name\");\n if (attr(el, \"displayName\")) result.displayName = attr(el, \"displayName\");\n if (attr(el, \"comment\")) result.comment = attr(el, \"comment\");\n if (attr(el, \"ref\")) result.ref = attr(el, \"ref\");\n const headerRowCount = attrNum(el, \"headerRowCount\");\n if (headerRowCount !== undefined) result.headerRowCount = headerRowCount;\n if (parseOnOff(attr(el, \"insertRow\"))) result.insertRow = true;\n const totalsRowCount = attrNum(el, \"totalsRowCount\");\n if (totalsRowCount !== undefined) result.totalsRowCount = totalsRowCount;\n if (String(attr(el, \"totalsRowShown\")) === \"0\") result.totalsRowShown = false;\n if (attr(el, \"tableType\")) result.tableType = attr(el, \"tableType\") as TableType;\n if (parseOnOff(attr(el, \"insertRowShift\"))) result.insertRowShift = true;\n if (parseOnOff(attr(el, \"published\"))) result.published = true;\n const connectionId = attrNum(el, \"connectionId\");\n if (connectionId !== undefined) result.connectionId = connectionId;\n\n // Auto filter\n const afEl = findChild(el, \"autoFilter\");\n if (afEl) result.autoFilter = parseAutoFilter(afEl);\n\n // Table columns\n const colsEl = findChild(el, \"tableColumns\");\n if (colsEl) {\n const columns: TableColumnOptions[] = [];\n for (const colEl of colsEl.elements ?? []) {\n if (colEl.name !== \"tableColumn\") continue;\n // Column id is derived from position at stringify (i+1); not stored.\n const col: Partial<TableColumnOptions> = {};\n col.name = attr(colEl, \"name\") ?? \"\";\n if (attr(colEl, \"totalsRowFunction\"))\n col.totalsRowFunction = xsdTotalsRowFunction.from(\n attr(colEl, \"totalsRowFunction\") ?? \"\",\n ) as TotalsRowFunction;\n if (attr(colEl, \"totalsRowLabel\")) col.totalsRowLabel = attr(colEl, \"totalsRowLabel\");\n const ccfEl = findChild(colEl, \"calculatedColumnFormula\");\n if (ccfEl) {\n col.calculatedColumnFormula = textOf(ccfEl);\n if (parseOnOff(attr(ccfEl, \"array\"))) col.calculatedColumnFormulaArray = true;\n }\n const trfEl = findChild(colEl, \"totalsRowFormula\");\n if (trfEl) {\n col.totalsRowFormula = textOf(trfEl);\n if (parseOnOff(attr(trfEl, \"array\"))) col.totalsRowFormulaArray = true;\n }\n if (attr(colEl, \"uniqueName\")) col.uniqueName = attr(colEl, \"uniqueName\");\n const qtfId = attrNum(colEl, \"queryTableFieldId\");\n if (qtfId !== undefined) col.queryTableFieldId = qtfId;\n const hrDxfId = attrNum(colEl, \"headerRowDxfId\");\n if (hrDxfId !== undefined) col.headerRowDxfId = hrDxfId;\n const dDxfId = attrNum(colEl, \"dataDxfId\");\n if (dDxfId !== undefined) col.dataDxfId = dDxfId;\n const trDxfId = attrNum(colEl, \"totalsRowDxfId\");\n if (trDxfId !== undefined) col.totalsRowDxfId = trDxfId;\n if (attr(colEl, \"headerRowCellStyle\"))\n col.headerRowCellStyle = attr(colEl, \"headerRowCellStyle\");\n if (attr(colEl, \"dataCellStyle\")) col.dataCellStyle = attr(colEl, \"dataCellStyle\");\n if (attr(colEl, \"totalsRowCellStyle\"))\n col.totalsRowCellStyle = attr(colEl, \"totalsRowCellStyle\");\n const xcpEl = findChild(colEl, \"xmlColumnPr\");\n if (xcpEl) {\n col.xmlColumnPr = {\n mapId: attrNum(xcpEl, \"mapId\") ?? 0,\n xpath: attr(xcpEl, \"xpath\") ?? \"\",\n xmlDataType: attr(xcpEl, \"xmlDataType\") ?? \"\",\n };\n if (parseOnOff(attr(xcpEl, \"denormalized\"))) col.xmlColumnPr.denormalized = true;\n }\n columns.push(col as TableColumnOptions);\n }\n result.columns = columns;\n }\n\n // Table style info — keep explicit \"0\" flags (false) so they survive\n // round-trip instead of re-emitting as the XSD default.\n const siEl = findChild(el, \"tableStyleInfo\");\n if (siEl) {\n const style: Partial<TableStyleInfoOptions> = {};\n if (attr(siEl, \"name\")) style.name = attr(siEl, \"name\");\n const firstColumn = parseOnOff(attr(siEl, \"showFirstColumn\"));\n if (firstColumn !== undefined) style.showFirstColumn = firstColumn;\n const lastColumn = parseOnOff(attr(siEl, \"showLastColumn\"));\n if (lastColumn !== undefined) style.showLastColumn = lastColumn;\n const rowStripes = parseOnOff(attr(siEl, \"showRowStripes\"));\n if (rowStripes !== undefined) style.showRowStripes = rowStripes;\n const columnStripes = parseOnOff(attr(siEl, \"showColumnStripes\"));\n if (columnStripes !== undefined) style.showColumnStripes = columnStripes;\n result.style = style;\n }\n\n // Trailing extLst (x14:table) — verbatim round-trip\n const extLstEl = findChild(el, \"extLst\");\n if (extLstEl) {\n result.ext = (extLstEl.elements ?? []).map((e) => stringifyElement(e)).join(\"\");\n // The x14:table accessibility attributes also surface as structured\n // fields (the raw ext above still round-trips verbatim).\n for (const ext of extLstEl.elements ?? []) {\n for (const child of ext.elements ?? []) {\n if (child.name !== \"x14:table\") continue;\n const altText = attr(child, \"altText\");\n if (altText !== undefined) result.altText = altText;\n const altTextSummary = attr(child, \"altTextSummary\");\n if (altTextSummary !== undefined) result.altTextSummary = altTextSummary;\n }\n }\n }\n\n // Differential format IDs\n const hrDxfId = attrNum(el, \"headerRowDxfId\");\n if (hrDxfId !== undefined) result.headerRowDxfId = hrDxfId;\n const dDxfId = attrNum(el, \"dataDxfId\");\n if (dDxfId !== undefined) result.dataDxfId = dDxfId;\n const trDxfId = attrNum(el, \"totalsRowDxfId\");\n if (trDxfId !== undefined) result.totalsRowDxfId = trDxfId;\n const hrbDxfId = attrNum(el, \"headerRowBorderDxfId\");\n if (hrbDxfId !== undefined) result.headerRowBorderDxfId = hrbDxfId;\n const tbDxfId = attrNum(el, \"tableBorderDxfId\");\n if (tbDxfId !== undefined) result.tableBorderDxfId = tbDxfId;\n const trbDxfId = attrNum(el, \"totalsRowBorderDxfId\");\n if (trbDxfId !== undefined) result.totalsRowBorderDxfId = trbDxfId;\n if (attr(el, \"headerRowCellStyle\")) result.headerRowCellStyle = attr(el, \"headerRowCellStyle\");\n if (attr(el, \"dataCellStyle\")) result.dataCellStyle = attr(el, \"dataCellStyle\");\n if (attr(el, \"totalsRowCellStyle\")) result.totalsRowCellStyle = attr(el, \"totalsRowCellStyle\");\n\n return result as TableOptions;\n },\n};\n","/**\n * Workbook — stringify implementation and exported XML helpers.\n *\n * @module\n */\n\nimport { derivePasswordHash, xsdComments } from \"@office-open/core\";\nimport { escapeXml } from \"@office-open/xml\";\nimport { hashPassword } from \"@util/index\";\n\nimport type { TablePartReference, WorkbookDescriptorOptions } from \"./types\";\n\n// ── Stringify helpers ──\n\nexport function stringifyWorkbook(opts: WorkbookDescriptorOptions): string {\n const confAttr = opts.conformance ? ` conformance=\"${opts.conformance}\"` : \"\";\n const parts: string[] = [\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"' +\n ' xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"' +\n ' mc:Ignorable=\"x15 xr xr6 xr10 xr2\"' +\n ' xmlns:x15=\"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\"' +\n ' xmlns:xr=\"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"' +\n ' xmlns:xr6=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision6\"' +\n ' xmlns:xr10=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision10\"' +\n ` xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"${confAttr}>`,\n ];\n\n // File version (CT_Workbook first child). Fresh compiles emit Excel 2007\n // defaults; a round-tripped source carries its own version stamp through.\n const fv = opts.fileVersion;\n if (fv) {\n const fvAttrs: string[] = [];\n if (fv.appName) fvAttrs.push(`appName=\"${fv.appName}\"`);\n if (fv.lastEdited !== undefined) fvAttrs.push(`lastEdited=\"${fv.lastEdited}\"`);\n if (fv.lowestEdited !== undefined) fvAttrs.push(`lowestEdited=\"${fv.lowestEdited}\"`);\n if (fv.rupBuild !== undefined) fvAttrs.push(`rupBuild=\"${fv.rupBuild}\"`);\n parts.push(`<fileVersion ${fvAttrs.join(\" \")}/>`);\n } else {\n parts.push('<fileVersion appName=\"xl\" lastEdited=\"7\" lowestEdited=\"6\" rupBuild=\"29929\"/>');\n }\n\n // File sharing (after fileVersion, before workbookPr per XSD sequence)\n if (opts.fileSharing) {\n const fs = opts.fileSharing;\n const fsAttrs: string[] = [];\n if (fs.readOnlyRecommended) fsAttrs.push('readOnlyRecommended=\"1\"');\n if (fs.userName) fsAttrs.push(`userName=\"${escapeXml(fs.userName)}\"`);\n if (fs.reservationPassword) {\n fsAttrs.push(`reservationPassword=\"${escapeXml(fs.reservationPassword)}\"`);\n if (fs.hashValue === undefined) {\n const derived = derivePasswordHash(fs.reservationPassword);\n fsAttrs.push(`algorithmName=\"${escapeXml(derived.algorithmName)}\"`);\n fsAttrs.push(`hashValue=\"${escapeXml(derived.hashValue)}\"`);\n fsAttrs.push(`saltValue=\"${escapeXml(derived.saltValue)}\"`);\n fsAttrs.push(`spinCount=\"${derived.spinCount}\"`);\n }\n }\n if (fs.algorithmName) fsAttrs.push(`algorithmName=\"${escapeXml(fs.algorithmName)}\"`);\n if (fs.hashValue) fsAttrs.push(`hashValue=\"${escapeXml(fs.hashValue)}\"`);\n if (fs.saltValue) fsAttrs.push(`saltValue=\"${escapeXml(fs.saltValue)}\"`);\n if (fs.spinCount !== undefined) fsAttrs.push(`spinCount=\"${fs.spinCount}\"`);\n if (fsAttrs.length > 0) {\n parts.push(`<fileSharing ${fsAttrs.join(\" \")}/>`);\n }\n }\n\n // Workbook properties\n if (opts.workbookPr) {\n const wbPr = opts.workbookPr;\n const wbPrAttrs: string[] = [];\n if (wbPr.date1904) wbPrAttrs.push('date1904=\"1\"');\n if (wbPr.defaultThemeVersion !== undefined)\n wbPrAttrs.push(`defaultThemeVersion=\"${wbPr.defaultThemeVersion}\"`);\n if (wbPr.showObjects) wbPrAttrs.push(`showObjects=\"${escapeXml(wbPr.showObjects)}\"`);\n if (wbPr.hidePivotFieldList) wbPrAttrs.push('hidePivotFieldList=\"1\"');\n if (wbPr.allowRefreshQuery) wbPrAttrs.push('allowRefreshQuery=\"1\"');\n if (wbPr.filterPrivacy) wbPrAttrs.push('filterPrivacy=\"1\"');\n if (wbPr.backupFile) wbPrAttrs.push('backupFile=\"1\"');\n if (wbPr.codeName) wbPrAttrs.push(`codeName=\"${escapeXml(wbPr.codeName)}\"`);\n if (wbPr.showBorderUnselectedTables) wbPrAttrs.push('showBorderUnselectedTables=\"1\"');\n if (wbPr.promptedSolutions) wbPrAttrs.push('promptedSolutions=\"1\"');\n if (wbPr.showInkAnnotation === false) wbPrAttrs.push('showInkAnnotation=\"0\"');\n if (wbPr.saveExternalLinkValues === false) wbPrAttrs.push('saveExternalLinkValues=\"0\"');\n if (wbPr.updateLinks) wbPrAttrs.push(`updateLinks=\"${escapeXml(wbPr.updateLinks)}\"`);\n if (wbPr.showPivotChartFilter) wbPrAttrs.push('showPivotChartFilter=\"1\"');\n if (wbPr.publishItems) wbPrAttrs.push('publishItems=\"1\"');\n if (wbPr.checkCompatibility) wbPrAttrs.push('checkCompatibility=\"1\"');\n if (wbPr.autoCompressPictures === false) wbPrAttrs.push('autoCompressPictures=\"0\"');\n if (wbPr.refreshAllConnections) wbPrAttrs.push('refreshAllConnections=\"1\"');\n parts.push(`<workbookPr${wbPrAttrs.length > 0 ? ` ${wbPrAttrs.join(\" \")}` : \"\"}/>`);\n } else {\n parts.push(\"<workbookPr/>\");\n }\n\n // AbsPath rides in an mc:AlternateContent between workbookPr and bookViews\n if (opts.absPath !== undefined) {\n parts.push(\n '<mc:AlternateContent xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">' +\n `<mc:Choice Requires=\"x15\"><x15ac:absPath url=\"${escapeXml(opts.absPath)}\" xmlns:x15ac=\"http://schemas.microsoft.com/office/spreadsheetml/2010/11/ac\"/></mc:Choice>` +\n \"</mc:AlternateContent>\",\n );\n }\n\n // Coauthoring revision state (mc-ignorable, before bookViews)\n if (opts.revisionPtr) {\n const rp = opts.revisionPtr;\n const rpAttrs: string[] = [];\n if (rp.revisionIdLastSave !== undefined)\n rpAttrs.push(`revIDLastSave=\"${rp.revisionIdLastSave}\"`);\n if (rp.documentId !== undefined) rpAttrs.push(`documentId=\"${escapeXml(rp.documentId)}\"`);\n if (rp.coauthVersionLast !== undefined)\n rpAttrs.push(`xr6:coauthVersionLast=\"${rp.coauthVersionLast}\"`);\n if (rp.coauthVersionMax !== undefined)\n rpAttrs.push(`xr6:coauthVersionMax=\"${rp.coauthVersionMax}\"`);\n if (rp.uidLastSave !== undefined)\n rpAttrs.push(`xr10:uidLastSave=\"${escapeXml(rp.uidLastSave)}\"`);\n parts.push(`<xr:revisionPtr ${rpAttrs.join(\" \")}/>`);\n }\n\n // Workbook protection (after workbookPr, before bookViews per XSD sequence)\n if (opts.protection) {\n const prot = opts.protection;\n const protAttrs: string[] = [];\n if (prot.lockStructure) protAttrs.push('lockStructure=\"1\"');\n if (prot.lockWindows) protAttrs.push('lockWindows=\"1\"');\n if (prot.lockRevision) protAttrs.push('lockRevision=\"1\"');\n if (prot.workbookPassword) {\n protAttrs.push(`workbookPassword=\"${hashPassword(prot.workbookPassword)}\"`);\n if (prot.workbookHashValue === undefined) {\n const wbDerived = derivePasswordHash(prot.workbookPassword);\n protAttrs.push(`workbookAlgorithmName=\"${escapeXml(wbDerived.algorithmName)}\"`);\n protAttrs.push(`workbookHashValue=\"${escapeXml(wbDerived.hashValue)}\"`);\n protAttrs.push(`workbookSaltValue=\"${escapeXml(wbDerived.saltValue)}\"`);\n protAttrs.push(`workbookSpinCount=\"${wbDerived.spinCount}\"`);\n }\n }\n if (prot.workbookAlgorithmName)\n protAttrs.push(`workbookAlgorithmName=\"${escapeXml(prot.workbookAlgorithmName)}\"`);\n if (prot.workbookHashValue)\n protAttrs.push(`workbookHashValue=\"${escapeXml(prot.workbookHashValue)}\"`);\n if (prot.workbookSaltValue)\n protAttrs.push(`workbookSaltValue=\"${escapeXml(prot.workbookSaltValue)}\"`);\n if (prot.workbookSpinCount !== undefined)\n protAttrs.push(`workbookSpinCount=\"${prot.workbookSpinCount}\"`);\n if (prot.revisionsPassword) {\n protAttrs.push(`revisionsPassword=\"${hashPassword(prot.revisionsPassword)}\"`);\n if (prot.revisionsHashValue === undefined) {\n const revDerived = derivePasswordHash(prot.revisionsPassword);\n protAttrs.push(`revisionsAlgorithmName=\"${escapeXml(revDerived.algorithmName)}\"`);\n protAttrs.push(`revisionsHashValue=\"${escapeXml(revDerived.hashValue)}\"`);\n protAttrs.push(`revisionsSaltValue=\"${escapeXml(revDerived.saltValue)}\"`);\n protAttrs.push(`revisionsSpinCount=\"${revDerived.spinCount}\"`);\n }\n }\n if (prot.revisionsAlgorithmName)\n protAttrs.push(`revisionsAlgorithmName=\"${escapeXml(prot.revisionsAlgorithmName)}\"`);\n if (prot.revisionsHashValue)\n protAttrs.push(`revisionsHashValue=\"${escapeXml(prot.revisionsHashValue)}\"`);\n if (prot.revisionsSaltValue)\n protAttrs.push(`revisionsSaltValue=\"${escapeXml(prot.revisionsSaltValue)}\"`);\n if (prot.revisionsSpinCount !== undefined)\n protAttrs.push(`revisionsSpinCount=\"${prot.revisionsSpinCount}\"`);\n if (prot.workbookPasswordCharacterSet)\n protAttrs.push(\n `workbookPasswordCharacterSet=\"${escapeXml(prot.workbookPasswordCharacterSet)}\"`,\n );\n if (prot.revisionsPasswordCharacterSet)\n protAttrs.push(\n `revisionsPasswordCharacterSet=\"${escapeXml(prot.revisionsPasswordCharacterSet)}\"`,\n );\n if (protAttrs.length > 0) {\n parts.push(`<workbookProtection ${protAttrs.join(\" \")}/>`);\n }\n }\n\n // Book views\n if (opts.bookView) {\n const bv = opts.bookView;\n const bvAttrs: string[] = [];\n if (bv.xWindow !== undefined) bvAttrs.push(`xWindow=\"${bv.xWindow}\"`);\n else bvAttrs.push('xWindow=\"0\"');\n if (bv.yWindow !== undefined) bvAttrs.push(`yWindow=\"${bv.yWindow}\"`);\n else bvAttrs.push('yWindow=\"0\"');\n if (bv.windowWidth !== undefined) bvAttrs.push(`windowWidth=\"${bv.windowWidth}\"`);\n else bvAttrs.push('windowWidth=\"28800\"');\n if (bv.windowHeight !== undefined) bvAttrs.push(`windowHeight=\"${bv.windowHeight}\"`);\n else bvAttrs.push('windowHeight=\"12300\"');\n if (bv.activeTab !== undefined) bvAttrs.push(`activeTab=\"${bv.activeTab}\"`);\n if (bv.autoFilterDateGrouping === false) bvAttrs.push('autoFilterDateGrouping=\"0\"');\n if (bv.firstSheet !== undefined) bvAttrs.push(`firstSheet=\"${bv.firstSheet}\"`);\n if (bv.showHorizontalScroll === false) bvAttrs.push('showHorizontalScroll=\"0\"');\n if (bv.showSheetTabs === false) bvAttrs.push('showSheetTabs=\"0\"');\n if (bv.showVerticalScroll === false) bvAttrs.push('showVerticalScroll=\"0\"');\n if (bv.tabRatio !== undefined) bvAttrs.push(`tabRatio=\"${bv.tabRatio}\"`);\n if (bv.visibility && bv.visibility !== \"visible\") bvAttrs.push(`visibility=\"${bv.visibility}\"`);\n parts.push(`<bookViews><workbookView ${bvAttrs.join(\" \")}/></bookViews>`);\n } else {\n parts.push(\n '<bookViews><workbookView xWindow=\"0\" yWindow=\"0\" windowWidth=\"28800\" windowHeight=\"12300\"/></bookViews>',\n );\n }\n\n parts.push(\"<sheets>\");\n for (const s of opts.sheets) {\n const stateAttr = s.state && s.state !== \"visible\" ? ` state=\"${s.state}\"` : \"\";\n parts.push(\n `<sheet name=\"${escapeXml(s.name)}\" sheetId=\"${s.sheetId}\" r:id=\"${s.rId}\"${stateAttr}/>`,\n );\n }\n parts.push(\"</sheets>\");\n\n // Function groups (after sheets, before externalReferences per XSD)\n const functionGroups = opts.functionGroups ?? [];\n if (functionGroups.length > 0) {\n const fgParts: string[] = [`<functionGroups builtInGroupCount=\"16\">`];\n for (const name of functionGroups) {\n fgParts.push(`<functionGroup name=\"${escapeXml(name)}\"/>`);\n }\n fgParts.push(\"</functionGroups>\");\n parts.push(fgParts.join(\"\"));\n }\n\n // externalReferences placeholder — compiler injects the XML here if needed\n parts.push(\"<!--EXTERNAL_REFS-->\");\n\n // Defined names (after externalReferences, before calcPr per XSD sequence)\n if (opts.definedNames && opts.definedNames.length > 0) {\n const dnParts: string[] = [\"<definedNames>\"];\n for (const dn of opts.definedNames) {\n const dnAttrs: string[] = [`name=\"${escapeXml(dn.name)}\"`];\n if (dn.comment !== undefined) dnAttrs.push(`comment=\"${escapeXml(dn.comment)}\"`);\n if (dn.customMenu !== undefined) dnAttrs.push(`customMenu=\"${escapeXml(dn.customMenu)}\"`);\n if (dn.description !== undefined) dnAttrs.push(`description=\"${escapeXml(dn.description)}\"`);\n if (dn.help !== undefined) dnAttrs.push(`help=\"${escapeXml(dn.help)}\"`);\n if (dn.statusBar !== undefined) dnAttrs.push(`statusBar=\"${escapeXml(dn.statusBar)}\"`);\n if (dn.localSheetId !== undefined) dnAttrs.push(`localSheetId=\"${dn.localSheetId}\"`);\n if (dn.hidden) dnAttrs.push('hidden=\"1\"');\n if (dn.function) dnAttrs.push('function=\"1\"');\n if (dn.vbProcedure) dnAttrs.push('vbProcedure=\"1\"');\n if (dn.xlm) dnAttrs.push('xlm=\"1\"');\n if (dn.functionGroupId !== undefined) dnAttrs.push(`functionGroupId=\"${dn.functionGroupId}\"`);\n if (dn.shortcutKey !== undefined) dnAttrs.push(`shortcutKey=\"${escapeXml(dn.shortcutKey)}\"`);\n if (dn.publishToServer) dnAttrs.push('publishToServer=\"1\"');\n if (dn.workbookParameter) dnAttrs.push('workbookParameter=\"1\"');\n dnParts.push(`<definedName ${dnAttrs.join(\" \")}>${escapeXml(dn.value)}</definedName>`);\n }\n dnParts.push(\"</definedNames>\");\n parts.push(dnParts.join(\"\"));\n }\n\n // Calculation properties\n if (opts.calcPr) {\n const cp = opts.calcPr;\n const cpAttrs: string[] = [];\n cpAttrs.push(`calcId=\"${cp.calcId ?? 191029}\"`);\n if (cp.calcMode) cpAttrs.push(`calcMode=\"${escapeXml(cp.calcMode)}\"`);\n if (cp.fullCalcOnLoad) cpAttrs.push('fullCalcOnLoad=\"1\"');\n if (cp.calcOnSave === false) cpAttrs.push('calcOnSave=\"0\"');\n if (cp.forceFullCalc) cpAttrs.push('forceFullCalc=\"1\"');\n if (cp.concurrentCalc === false) cpAttrs.push('concurrentCalc=\"0\"');\n if (cp.concurrentManualCount !== undefined)\n cpAttrs.push(`concurrentManualCount=\"${cp.concurrentManualCount}\"`);\n if (cp.iterate) cpAttrs.push('iterate=\"1\"');\n if (cp.iterateCount !== undefined) cpAttrs.push(`iterateCount=\"${cp.iterateCount}\"`);\n if (cp.iterateDelta !== undefined) cpAttrs.push(`iterateDelta=\"${cp.iterateDelta}\"`);\n if (cp.refMode) cpAttrs.push(`refMode=\"${escapeXml(cp.refMode)}\"`);\n if (cp.fullPrecision === false) cpAttrs.push('fullPrecision=\"0\"');\n if (cp.calcCompleted) cpAttrs.push('calcCompleted=\"1\"');\n parts.push(`<calcPr ${cpAttrs.join(\" \")}/>`);\n } else {\n parts.push('<calcPr calcId=\"191029\" fullCalcOnLoad=\"1\"/>');\n }\n\n // OLE size (after calcPr, before customWorkbookViews per XSD sequence)\n if (opts.oleSize) {\n parts.push(`<oleSize ref=\"${escapeXml(opts.oleSize)}\"/>`);\n }\n\n // Custom workbook views (after calcPr, before pivotCaches per XSD)\n if (opts.customViews && opts.customViews.length > 0) {\n parts.push(\"<customWorkbookViews>\");\n for (const v of opts.customViews) {\n const vAttrs: string[] = [\n `name=\"${escapeXml(v.name)}\"`,\n `guid=\"${escapeXml(v.guid)}\"`,\n `windowWidth=\"${v.windowWidth}\"`,\n `windowHeight=\"${v.windowHeight}\"`,\n `activeSheetId=\"${v.activeSheetId}\"`,\n ];\n if (v.xWindow !== undefined) vAttrs.push(`xWindow=\"${v.xWindow}\"`);\n if (v.yWindow !== undefined) vAttrs.push(`yWindow=\"${v.yWindow}\"`);\n if (v.showFormulaBar === false) vAttrs.push('showFormulaBar=\"0\"');\n if (v.showStatusbar === false) vAttrs.push('showStatusbar=\"0\"');\n if (v.showHorizontalScroll === false) vAttrs.push('showHorizontalScroll=\"0\"');\n if (v.showVerticalScroll === false) vAttrs.push('showVerticalScroll=\"0\"');\n if (v.showSheetTabs === false) vAttrs.push('showSheetTabs=\"0\"');\n if (v.tabRatio !== undefined) vAttrs.push(`tabRatio=\"${v.tabRatio}\"`);\n if (v.showObjects) vAttrs.push(`showObjects=\"${v.showObjects}\"`);\n if (v.includeHiddenRowCol === false) vAttrs.push('includeHiddenRowCol=\"0\"');\n if (v.includePrintSettings === false) vAttrs.push('includePrintSettings=\"0\"');\n if (v.personalView) vAttrs.push('personalView=\"1\"');\n if (v.maximized) vAttrs.push('maximized=\"1\"');\n if (v.minimized) vAttrs.push('minimized=\"1\"');\n if (v.autoUpdate) vAttrs.push('autoUpdate=\"1\"');\n if (v.mergeInterval !== undefined) vAttrs.push(`mergeInterval=\"${v.mergeInterval}\"`);\n if (v.changesSavedWin) vAttrs.push('changesSavedWin=\"1\"');\n if (v.onlySync) vAttrs.push('onlySync=\"1\"');\n if (v.showComments) vAttrs.push(`showComments=\"${xsdComments.to(v.showComments)}\"`);\n parts.push(`<customWorkbookView ${vAttrs.join(\" \")}/>`);\n }\n parts.push(\"</customWorkbookViews>\");\n }\n\n const pivotCaches = opts.pivotCaches ?? [];\n if (pivotCaches.length > 0) {\n parts.push(\"<pivotCaches>\");\n for (const pc of pivotCaches) {\n parts.push(`<pivotCache cacheId=\"${pc.cacheId}\" r:id=\"${pc.rId}\"/>`);\n }\n parts.push(\"</pivotCaches>\");\n }\n\n // Smart tag properties (after pivotCaches, before smartTagTypes per XSD sequence)\n if (opts.smartTagPr) {\n const stp = opts.smartTagPr;\n const stpAttrs: string[] = [];\n if (stp.embed) stpAttrs.push('embed=\"1\"');\n if (stp.show && stp.show !== \"all\") stpAttrs.push(`show=\"${stp.show}\"`);\n if (stpAttrs.length > 0) {\n parts.push(`<smartTagPr ${stpAttrs.join(\" \")}/>`);\n }\n }\n\n // Smart tag types (after smartTagPr, before webPublishing per XSD sequence)\n if (opts.smartTagTypes && opts.smartTagTypes.length > 0) {\n const sttParts: string[] = [\"<smartTagTypes>\"];\n for (const stt of opts.smartTagTypes) {\n const sttAttrs: string[] = [];\n if (stt.namespaceUri) sttAttrs.push(`namespaceUri=\"${escapeXml(stt.namespaceUri)}\"`);\n if (stt.name) sttAttrs.push(`name=\"${escapeXml(stt.name)}\"`);\n if (stt.url) sttAttrs.push(`url=\"${escapeXml(stt.url)}\"`);\n sttParts.push(`<smartTagType ${sttAttrs.join(\" \")}/>`);\n }\n sttParts.push(\"</smartTagTypes>\");\n parts.push(sttParts.join(\"\"));\n }\n\n // Web publishing (after smartTagTypes, before fileRecoveryPr per XSD sequence)\n if (opts.webPublishing) {\n const wp = opts.webPublishing;\n const wpAttrs: string[] = [];\n if (wp.css === false) wpAttrs.push('css=\"0\"');\n if (wp.thicket === false) wpAttrs.push('thicket=\"0\"');\n if (wp.longFileNames === false) wpAttrs.push('longFileNames=\"0\"');\n if (wp.vml) wpAttrs.push('vml=\"1\"');\n if (wp.allowPng) wpAttrs.push('allowPng=\"1\"');\n if (wp.targetScreenSize && wp.targetScreenSize !== \"800x600\")\n wpAttrs.push(`targetScreenSize=\"${wp.targetScreenSize}\"`);\n if (wp.dpi !== undefined && wp.dpi !== 96) wpAttrs.push(`dpi=\"${wp.dpi}\"`);\n if (wp.codePage !== undefined) wpAttrs.push(`codePage=\"${wp.codePage}\"`);\n if (wp.characterSet) wpAttrs.push(`characterSet=\"${escapeXml(wp.characterSet)}\"`);\n parts.push(`<webPublishing ${wpAttrs.join(\" \")}/>`);\n }\n\n // File recovery properties (after webPublishing per XSD sequence)\n if (opts.fileRecoveryPr) {\n const frp = opts.fileRecoveryPr;\n const frpAttrs: string[] = [];\n if (frp.autoRecover === false) frpAttrs.push('autoRecover=\"0\"');\n if (frp.crashSave) frpAttrs.push('crashSave=\"1\"');\n if (frp.dataExtractLoad) frpAttrs.push('dataExtractLoad=\"1\"');\n if (frp.repairLoad) frpAttrs.push('repairLoad=\"1\"');\n if (frpAttrs.length > 0) {\n parts.push(`<fileRecoveryPr ${frpAttrs.join(\" \")}/>`);\n }\n }\n\n // Web publish objects (after fileRecoveryPr per XSD sequence)\n if (opts.webPublishObjects && opts.webPublishObjects.length > 0) {\n const wpoParts: string[] = [`<webPublishObjects count=\"${opts.webPublishObjects.length}\">`];\n for (const wpo of opts.webPublishObjects) {\n // CT_WebPublishObject attribute set — @id/@divId/@destinationFile are\n // required; there is no r:id on this element\n const wpoAttrs: string[] = [\n `id=\"${wpo.id}\"`,\n `divId=\"${escapeXml(wpo.divId)}\"`,\n `destinationFile=\"${escapeXml(wpo.destinationFile)}\"`,\n ];\n if (wpo.sourceObject) wpoAttrs.push(`sourceObject=\"${escapeXml(wpo.sourceObject)}\"`);\n if (wpo.title) wpoAttrs.push(`title=\"${escapeXml(wpo.title)}\"`);\n if (wpo.autoRepublish) wpoAttrs.push('autoRepublish=\"1\"');\n wpoParts.push(`<webPublishObject ${wpoAttrs.join(\" \")}/>`);\n }\n wpoParts.push(\"</webPublishObjects>\");\n parts.push(wpoParts.join(\"\"));\n }\n\n if (opts.extensions?.length) {\n const exts = opts.extensions\n .map((ext) => {\n const ns = Object.entries(ext.namespaces ?? {})\n .map(([name, value]) => ` ${name}=\"${escapeXml(value)}\"`)\n .join(\"\");\n return `<ext uri=\"${escapeXml(ext.uri)}\"${ns}>${ext.content ?? \"\"}</ext>`;\n })\n .join(\"\");\n parts.push(`<extLst>${exts}</extLst>`);\n }\n parts.push(\"</workbook>\");\n return parts.join(\"\");\n}\n\n// ── Exported helper functions ──\n\n/** Generate tableParts XML fragment for embedding in a worksheet. */\nexport function buildTablePartsXml(tableParts: TablePartReference[]): string {\n if (tableParts.length === 0) return \"\";\n const p: string[] = [`<tableParts count=\"${tableParts.length}\">`];\n for (const tp of tableParts) {\n p.push(`<tablePart r:id=\"${tp.rId}\"/>`);\n }\n p.push(\"</tableParts>\");\n return p.join(\"\");\n}\n\n/** Generate externalReferences XML fragment for embedding in the workbook. */\nexport function buildExternalReferencesXml(refs: { rId: string }[]): string {\n if (refs.length === 0) return \"\";\n const p: string[] = [\"<externalReferences>\"];\n for (const ref of refs) {\n p.push(`<externalReference r:id=\"${ref.rId}\"/>`);\n }\n p.push(\"</externalReferences>\");\n return p.join(\"\");\n}\n","/**\n * Workbook types and descriptor for SpreadsheetML documents.\n *\n * @module\n */\n\nimport { parseOnOff, xsdComments } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, findChild, stringifyElement } from \"@office-open/xml\";\n\nimport { stringifyWorkbook } from \"./stringify\";\nimport type {\n CalculationPropertiesOptions,\n CustomWorkbookViewOptions,\n DefinedNameOptions,\n FileRecoveryPropertiesOptions,\n FileSharingOptions,\n FileVersionOptions,\n PivotCacheReference,\n RevisionPtrOptions,\n SheetDefinition,\n SmartTagPropertiesOptions,\n SmartTagShow,\n SmartTagTypeOptions,\n WebPublishObjectOptions,\n WebPublishingOptions,\n WorkbookConformance,\n WorkbookDescriptorOptions,\n WorkbookExtensionOptions,\n WorkbookProtectionOptions,\n WorkbookPropertiesOptions,\n WorkbookViewOptions,\n} from \"./types\";\n\n// ── Descriptor ──\n\nexport const workbookDesc: CustomDescriptor<WorkbookDescriptorOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return stringifyWorkbook(opts);\n },\n\n parse(el, _ctx) {\n const result: Partial<WorkbookDescriptorOptions> = {};\n\n // File version (CT_Workbook first child) — Excel version stamp\n const fileVersionEl = findChild(el, \"fileVersion\");\n if (fileVersionEl) {\n const fv: FileVersionOptions = {};\n const appName = attr(fileVersionEl, \"appName\");\n if (appName) fv.appName = appName;\n const lastEdited = attrNum(fileVersionEl, \"lastEdited\");\n if (lastEdited !== undefined) fv.lastEdited = lastEdited;\n const lowestEdited = attrNum(fileVersionEl, \"lowestEdited\");\n if (lowestEdited !== undefined) fv.lowestEdited = lowestEdited;\n const rupBuild = attrNum(fileVersionEl, \"rupBuild\");\n if (rupBuild !== undefined) fv.rupBuild = rupBuild;\n result.fileVersion = fv;\n }\n\n // Sheets\n const sheetsEl = findChild(el, \"sheets\");\n if (sheetsEl) {\n const sheets: SheetDefinition[] = [];\n for (const s of sheetsEl.elements ?? []) {\n if (s.name !== \"sheet\") continue;\n const name = attr(s, \"name\") ?? \"\";\n const sheetId = attrNum(s, \"sheetId\") ?? 0;\n const rId = (s.attributes?.[\"r:id\"] as string | undefined) ?? \"\";\n const state = attr(s, \"state\") as SheetDefinition[\"state\"];\n sheets.push({ name, sheetId, rId, state });\n }\n result.sheets = sheets;\n }\n\n // Pivot caches\n const pivotCachesEl = findChild(el, \"pivotCaches\");\n if (pivotCachesEl) {\n const caches: PivotCacheReference[] = [];\n for (const pc of pivotCachesEl.elements ?? []) {\n if (pc.name !== \"pivotCache\") continue;\n caches.push({\n cacheId: attrNum(pc, \"cacheId\") ?? 0,\n rId: (pc.attributes?.[\"r:id\"] as string) ?? \"\",\n });\n }\n result.pivotCaches = caches;\n }\n\n // Workbook protection\n const protEl = findChild(el, \"workbookProtection\");\n if (protEl?.attributes) {\n const prot: WorkbookProtectionOptions = {};\n if (parseOnOff(attr(protEl, \"lockStructure\"))) prot.lockStructure = true;\n if (parseOnOff(attr(protEl, \"lockWindows\"))) prot.lockWindows = true;\n if (parseOnOff(attr(protEl, \"lockRevision\"))) prot.lockRevision = true;\n // @workbookPassword/@revisionsPassword (legacy hashes) not read back —\n // the password fields are plaintext authoring input and stringify hashes\n // them, so carrying the hash would double-hash on round-trip. The modern\n // algorithmName/hashValue/saltValue/spinCount quadruplets round-trip as-is.\n if (attr(protEl, \"workbookAlgorithmName\"))\n prot.workbookAlgorithmName = attr(protEl, \"workbookAlgorithmName\");\n if (attr(protEl, \"workbookHashValue\"))\n prot.workbookHashValue = attr(protEl, \"workbookHashValue\");\n if (attr(protEl, \"workbookSaltValue\"))\n prot.workbookSaltValue = attr(protEl, \"workbookSaltValue\");\n if (attr(protEl, \"workbookSpinCount\"))\n prot.workbookSpinCount = attrNum(protEl, \"workbookSpinCount\");\n if (attr(protEl, \"revisionsAlgorithmName\"))\n prot.revisionsAlgorithmName = attr(protEl, \"revisionsAlgorithmName\");\n if (attr(protEl, \"revisionsHashValue\"))\n prot.revisionsHashValue = attr(protEl, \"revisionsHashValue\");\n if (attr(protEl, \"revisionsSaltValue\"))\n prot.revisionsSaltValue = attr(protEl, \"revisionsSaltValue\");\n if (attr(protEl, \"revisionsSpinCount\"))\n prot.revisionsSpinCount = attrNum(protEl, \"revisionsSpinCount\");\n if (attr(protEl, \"workbookPasswordCharacterSet\"))\n prot.workbookPasswordCharacterSet = attr(protEl, \"workbookPasswordCharacterSet\");\n if (attr(protEl, \"revisionsPasswordCharacterSet\"))\n prot.revisionsPasswordCharacterSet = attr(protEl, \"revisionsPasswordCharacterSet\");\n result.protection = prot;\n }\n\n // Book views\n const bookViewsEl = findChild(el, \"bookViews\");\n if (bookViewsEl) {\n const bvEl = findChild(bookViewsEl, \"workbookView\");\n if (bvEl?.attributes) {\n const bv: WorkbookViewOptions = {};\n const xw = attrNum(bvEl, \"xWindow\");\n if (xw !== undefined) bv.xWindow = xw;\n const yw = attrNum(bvEl, \"yWindow\");\n if (yw !== undefined) bv.yWindow = yw;\n const ww = attrNum(bvEl, \"windowWidth\");\n if (ww !== undefined) bv.windowWidth = ww;\n const wh = attrNum(bvEl, \"windowHeight\");\n if (wh !== undefined) bv.windowHeight = wh;\n const at = attrNum(bvEl, \"activeTab\");\n if (at !== undefined) bv.activeTab = at;\n if (String(attr(bvEl, \"autoFilterDateGrouping\")) === \"0\") bv.autoFilterDateGrouping = false;\n const fs = attrNum(bvEl, \"firstSheet\");\n if (fs !== undefined) bv.firstSheet = fs;\n if (String(attr(bvEl, \"showHorizontalScroll\")) === \"0\") bv.showHorizontalScroll = false;\n if (String(attr(bvEl, \"showVerticalScroll\")) === \"0\") bv.showVerticalScroll = false;\n if (String(attr(bvEl, \"showSheetTabs\")) === \"0\") bv.showSheetTabs = false;\n const tr = attrNum(bvEl, \"tabRatio\");\n if (tr !== undefined) bv.tabRatio = tr;\n const vis = attr(bvEl, \"visibility\");\n if (vis !== undefined) bv.visibility = vis as WorkbookViewOptions[\"visibility\"];\n result.bookView = bv;\n }\n }\n\n // Calc properties\n const calcPrEl = findChild(el, \"calcPr\");\n if (calcPrEl?.attributes) {\n const calc: CalculationPropertiesOptions = {};\n const calcId = attrNum(calcPrEl, \"calcId\");\n if (calcId !== undefined) calc.calcId = calcId;\n if (attr(calcPrEl, \"calcMode\"))\n calc.calcMode = attr(calcPrEl, \"calcMode\") as CalculationPropertiesOptions[\"calcMode\"];\n if (parseOnOff(attr(calcPrEl, \"fullCalcOnLoad\"))) calc.fullCalcOnLoad = true;\n if (String(attr(calcPrEl, \"concurrentCalc\")) === \"0\") calc.concurrentCalc = false;\n if (attr(calcPrEl, \"refMode\"))\n calc.refMode = attr(calcPrEl, \"refMode\") as CalculationPropertiesOptions[\"refMode\"];\n if (String(attr(calcPrEl, \"calcOnSave\")) === \"0\") calc.calcOnSave = false;\n if (parseOnOff(attr(calcPrEl, \"forceFullCalc\"))) calc.forceFullCalc = true;\n const cmc = attrNum(calcPrEl, \"concurrentManualCount\");\n if (cmc !== undefined) calc.concurrentManualCount = cmc;\n if (parseOnOff(attr(calcPrEl, \"iterate\"))) calc.iterate = true;\n const ic = attrNum(calcPrEl, \"iterateCount\");\n if (ic !== undefined) calc.iterateCount = ic;\n const id = attrNum(calcPrEl, \"iterateDelta\");\n if (id !== undefined) calc.iterateDelta = id;\n if (String(attr(calcPrEl, \"fullPrecision\")) === \"0\") calc.fullPrecision = false;\n if (parseOnOff(attr(calcPrEl, \"calcCompleted\"))) calc.calcCompleted = true;\n result.calcPr = calc;\n }\n\n // OLE size (after calcPr, before customWorkbookViews per XSD sequence)\n const oleSizeEl = findChild(el, \"oleSize\");\n if (oleSizeEl) {\n const ref = attr(oleSizeEl, \"ref\");\n if (ref) result.oleSize = ref;\n }\n\n // Custom workbook views\n const customViewsEl = findChild(el, \"customWorkbookViews\");\n if (customViewsEl) {\n const views: CustomWorkbookViewOptions[] = [];\n for (const v of customViewsEl.elements ?? []) {\n if (v.name !== \"customWorkbookView\") continue;\n const view: CustomWorkbookViewOptions = {\n name: attr(v, \"name\") ?? \"\",\n guid: attr(v, \"guid\") ?? \"\",\n windowWidth: attrNum(v, \"windowWidth\") ?? 0,\n windowHeight: attrNum(v, \"windowHeight\") ?? 0,\n activeSheetId: attrNum(v, \"activeSheetId\") ?? 1,\n };\n const xw = attrNum(v, \"xWindow\");\n if (xw !== undefined) view.xWindow = xw;\n const yw = attrNum(v, \"yWindow\");\n if (yw !== undefined) view.yWindow = yw;\n if (String(attr(v, \"showFormulaBar\")) === \"0\") view.showFormulaBar = false;\n if (String(attr(v, \"showStatusbar\")) === \"0\") view.showStatusbar = false;\n if (String(attr(v, \"showHorizontalScroll\")) === \"0\") view.showHorizontalScroll = false;\n if (String(attr(v, \"showVerticalScroll\")) === \"0\") view.showVerticalScroll = false;\n if (String(attr(v, \"showSheetTabs\")) === \"0\") view.showSheetTabs = false;\n const tabRatio = attrNum(v, \"tabRatio\");\n if (tabRatio !== undefined) view.tabRatio = tabRatio;\n const so = attr(v, \"showObjects\");\n if (so) view.showObjects = so as CustomWorkbookViewOptions[\"showObjects\"];\n if (String(attr(v, \"includeHiddenRowCol\")) === \"0\") view.includeHiddenRowCol = false;\n if (String(attr(v, \"includePrintSettings\")) === \"0\") view.includePrintSettings = false;\n if (parseOnOff(attr(v, \"personalView\"))) view.personalView = true;\n if (parseOnOff(attr(v, \"maximized\"))) view.maximized = true;\n if (parseOnOff(attr(v, \"minimized\"))) view.minimized = true;\n if (parseOnOff(attr(v, \"autoUpdate\"))) view.autoUpdate = true;\n const mi = attrNum(v, \"mergeInterval\");\n if (mi !== undefined) view.mergeInterval = mi;\n if (parseOnOff(attr(v, \"changesSavedWin\"))) view.changesSavedWin = true;\n if (parseOnOff(attr(v, \"onlySync\"))) view.onlySync = true;\n const sc = attr(v, \"showComments\");\n if (sc)\n view.showComments = xsdComments.from(sc) as CustomWorkbookViewOptions[\"showComments\"];\n views.push(view);\n }\n if (views.length > 0) result.customViews = views;\n }\n\n // File sharing\n const fileSharingEl = findChild(el, \"fileSharing\");\n if (fileSharingEl?.attributes) {\n const fs: FileSharingOptions = {};\n if (parseOnOff(attr(fileSharingEl, \"readOnlyRecommended\"))) fs.readOnlyRecommended = true;\n if (attr(fileSharingEl, \"userName\")) fs.userName = attr(fileSharingEl, \"userName\");\n if (attr(fileSharingEl, \"reservationPassword\"))\n fs.reservationPassword = attr(fileSharingEl, \"reservationPassword\");\n if (attr(fileSharingEl, \"algorithmName\"))\n fs.algorithmName = attr(fileSharingEl, \"algorithmName\");\n if (attr(fileSharingEl, \"hashValue\")) fs.hashValue = attr(fileSharingEl, \"hashValue\");\n if (attr(fileSharingEl, \"saltValue\")) fs.saltValue = attr(fileSharingEl, \"saltValue\");\n const sc = attrNum(fileSharingEl, \"spinCount\");\n if (sc !== undefined) fs.spinCount = sc;\n result.fileSharing = fs;\n }\n\n // Web publishing\n const webPublishingEl = findChild(el, \"webPublishing\");\n if (webPublishingEl?.attributes) {\n const wp: WebPublishingOptions = {};\n if (String(attr(webPublishingEl, \"css\")) === \"0\") wp.css = false;\n if (String(attr(webPublishingEl, \"thicket\")) === \"0\") wp.thicket = false;\n if (String(attr(webPublishingEl, \"longFileNames\")) === \"0\") wp.longFileNames = false;\n if (parseOnOff(attr(webPublishingEl, \"vml\"))) wp.vml = true;\n if (parseOnOff(attr(webPublishingEl, \"allowPng\"))) wp.allowPng = true;\n if (attr(webPublishingEl, \"targetScreenSize\"))\n wp.targetScreenSize = attr(\n webPublishingEl,\n \"targetScreenSize\",\n ) as WebPublishingOptions[\"targetScreenSize\"];\n const dpi = attrNum(webPublishingEl, \"dpi\");\n if (dpi !== undefined) wp.dpi = dpi;\n const codePage = attrNum(webPublishingEl, \"codePage\");\n if (codePage !== undefined) wp.codePage = codePage;\n if (attr(webPublishingEl, \"characterSet\"))\n wp.characterSet = attr(webPublishingEl, \"characterSet\");\n result.webPublishing = wp;\n }\n\n // File recovery\n const fileRecoveryEl = findChild(el, \"fileRecoveryPr\");\n if (fileRecoveryEl?.attributes) {\n const frp: FileRecoveryPropertiesOptions = {};\n if (String(attr(fileRecoveryEl, \"autoRecover\")) === \"0\") frp.autoRecover = false;\n if (parseOnOff(attr(fileRecoveryEl, \"crashSave\"))) frp.crashSave = true;\n if (parseOnOff(attr(fileRecoveryEl, \"dataExtractLoad\"))) frp.dataExtractLoad = true;\n if (parseOnOff(attr(fileRecoveryEl, \"repairLoad\"))) frp.repairLoad = true;\n result.fileRecoveryPr = frp;\n }\n\n // Workbook properties\n const wbPrEl = findChild(el, \"workbookPr\");\n if (wbPrEl?.attributes) {\n const wbPr: WorkbookPropertiesOptions = {};\n if (parseOnOff(attr(wbPrEl, \"date1904\"))) wbPr.date1904 = true;\n const dtv = attrNum(wbPrEl, \"defaultThemeVersion\");\n if (dtv !== undefined) wbPr.defaultThemeVersion = dtv;\n if (attr(wbPrEl, \"showObjects\"))\n wbPr.showObjects = attr(wbPrEl, \"showObjects\") as WorkbookPropertiesOptions[\"showObjects\"];\n if (parseOnOff(attr(wbPrEl, \"hidePivotFieldList\"))) wbPr.hidePivotFieldList = true;\n if (parseOnOff(attr(wbPrEl, \"allowRefreshQuery\"))) wbPr.allowRefreshQuery = true;\n if (parseOnOff(attr(wbPrEl, \"filterPrivacy\"))) wbPr.filterPrivacy = true;\n if (parseOnOff(attr(wbPrEl, \"backupFile\"))) wbPr.backupFile = true;\n if (attr(wbPrEl, \"codeName\")) wbPr.codeName = attr(wbPrEl, \"codeName\");\n if (parseOnOff(attr(wbPrEl, \"showBorderUnselectedTables\")))\n wbPr.showBorderUnselectedTables = true;\n if (parseOnOff(attr(wbPrEl, \"promptedSolutions\"))) wbPr.promptedSolutions = true;\n if (String(attr(wbPrEl, \"showInkAnnotation\")) === \"0\") wbPr.showInkAnnotation = false;\n if (String(attr(wbPrEl, \"saveExternalLinkValues\")) === \"0\")\n wbPr.saveExternalLinkValues = false;\n if (attr(wbPrEl, \"updateLinks\"))\n wbPr.updateLinks = attr(wbPrEl, \"updateLinks\") as WorkbookPropertiesOptions[\"updateLinks\"];\n if (parseOnOff(attr(wbPrEl, \"showPivotChartFilter\"))) wbPr.showPivotChartFilter = true;\n if (parseOnOff(attr(wbPrEl, \"publishItems\"))) wbPr.publishItems = true;\n if (parseOnOff(attr(wbPrEl, \"checkCompatibility\"))) wbPr.checkCompatibility = true;\n if (String(attr(wbPrEl, \"autoCompressPictures\")) === \"0\") wbPr.autoCompressPictures = false;\n if (parseOnOff(attr(wbPrEl, \"refreshAllConnections\"))) wbPr.refreshAllConnections = true;\n result.workbookPr = wbPr;\n }\n\n // AbsPath rides in an mc:AlternateContent between workbookPr and bookViews\n const acEl = findChild(el, \"mc:AlternateContent\");\n if (acEl) {\n const choice = findChild(acEl, \"mc:Choice\");\n // Excel writes both prefixes in the wild: x15ac (2010/11/ac, the\n // common form our stringify re-emits) and x15 (2010/11/main, root-bound).\n const absPathEl = choice\n ? (findChild(choice, \"x15ac:absPath\") ?? findChild(choice, \"x15:absPath\"))\n : undefined;\n const url = absPathEl ? attr(absPathEl, \"url\") : undefined;\n if (url !== undefined) result.absPath = url;\n }\n\n // Coauthoring revision state\n const rpEl = findChild(el, \"xr:revisionPtr\");\n if (rpEl) {\n const rp: RevisionPtrOptions = {};\n const revId = attrNum(rpEl, \"revIDLastSave\");\n if (revId !== undefined) rp.revisionIdLastSave = revId;\n if (attr(rpEl, \"documentId\")) rp.documentId = attr(rpEl, \"documentId\");\n const cvLast = attrNum(rpEl, \"xr6:coauthVersionLast\");\n if (cvLast !== undefined) rp.coauthVersionLast = cvLast;\n const cvMax = attrNum(rpEl, \"xr6:coauthVersionMax\");\n if (cvMax !== undefined) rp.coauthVersionMax = cvMax;\n if (attr(rpEl, \"xr10:uidLastSave\")) rp.uidLastSave = attr(rpEl, \"xr10:uidLastSave\");\n result.revisionPtr = rp;\n }\n\n // Trailing extension list (workbook > extLst > ext) — raw round-trip\n const extLstEl = findChild(el, \"extLst\");\n if (extLstEl) {\n const extensions: WorkbookExtensionOptions[] = [];\n for (const ext of extLstEl.elements ?? []) {\n if (ext.name !== \"ext\") continue;\n const uri = attr(ext, \"uri\");\n if (!uri) continue;\n const namespaces: Record<string, string> = {};\n for (const [name, value] of Object.entries(ext.attributes ?? {})) {\n if (name.startsWith(\"xmlns:\") && typeof value === \"string\") namespaces[name] = value;\n }\n const content = (ext.elements ?? []).map((e) => stringifyElement(e)).join(\"\");\n extensions.push({\n uri,\n ...(Object.keys(namespaces).length > 0 ? { namespaces } : {}),\n ...(content ? { content } : {}),\n });\n }\n if (extensions.length > 0) result.extensions = extensions;\n }\n\n // Function groups\n const fgEl = findChild(el, \"functionGroups\");\n if (fgEl) {\n const names: string[] = [];\n for (const fg of fgEl.elements ?? []) {\n if (fg.name === \"functionGroup\" && attr(fg, \"name\")) {\n names.push(attr(fg, \"name\")!);\n }\n }\n if (names.length > 0) result.functionGroups = names;\n }\n\n // Web publish objects\n const wpoEl = findChild(el, \"webPublishObjects\");\n if (wpoEl) {\n const objs: WebPublishObjectOptions[] = [];\n for (const wo of wpoEl.elements ?? []) {\n if (wo.name !== \"webPublishObject\") continue;\n const id = attrNum(wo, \"id\");\n const divId = attr(wo, \"divId\");\n const destinationFile = attr(wo, \"destinationFile\");\n if (id === undefined || divId === undefined || destinationFile === undefined) continue;\n const obj: WebPublishObjectOptions = { id, divId, destinationFile };\n if (attr(wo, \"sourceObject\")) obj.sourceObject = attr(wo, \"sourceObject\");\n if (attr(wo, \"title\")) obj.title = attr(wo, \"title\");\n if (parseOnOff(attr(wo, \"autoRepublish\"))) obj.autoRepublish = true;\n objs.push(obj);\n }\n if (objs.length > 0) result.webPublishObjects = objs;\n }\n\n // Defined names (CT_DefinedNames — simpleContent ST_Formula + 14 attrs)\n const definedNamesEl = findChild(el, \"definedNames\");\n if (definedNamesEl) {\n const names: DefinedNameOptions[] = [];\n for (const d of definedNamesEl.elements ?? []) {\n if (d.name !== \"definedName\") continue;\n const value = (d.elements ?? []).map((e) => e.text ?? \"\").join(\"\");\n const dn: DefinedNameOptions = { name: attr(d, \"name\") ?? \"\", value };\n if (attr(d, \"comment\") !== undefined) dn.comment = attr(d, \"comment\");\n if (attr(d, \"customMenu\") !== undefined) dn.customMenu = attr(d, \"customMenu\");\n if (attr(d, \"description\") !== undefined) dn.description = attr(d, \"description\");\n if (attr(d, \"help\") !== undefined) dn.help = attr(d, \"help\");\n if (attr(d, \"statusBar\") !== undefined) dn.statusBar = attr(d, \"statusBar\");\n const localSheetId = attrNum(d, \"localSheetId\");\n if (localSheetId !== undefined) dn.localSheetId = localSheetId;\n if (parseOnOff(attr(d, \"hidden\"))) dn.hidden = true;\n if (parseOnOff(attr(d, \"function\"))) dn.function = true;\n if (parseOnOff(attr(d, \"vbProcedure\"))) dn.vbProcedure = true;\n if (parseOnOff(attr(d, \"xlm\"))) dn.xlm = true;\n const functionGroupId = attrNum(d, \"functionGroupId\");\n if (functionGroupId !== undefined) dn.functionGroupId = functionGroupId;\n if (attr(d, \"shortcutKey\") !== undefined) dn.shortcutKey = attr(d, \"shortcutKey\");\n if (parseOnOff(attr(d, \"publishToServer\"))) dn.publishToServer = true;\n if (parseOnOff(attr(d, \"workbookParameter\"))) dn.workbookParameter = true;\n names.push(dn);\n }\n if (names.length > 0) result.definedNames = names;\n }\n\n // Smart tag properties (CT_SmartTagPr)\n const smartTagPrEl = findChild(el, \"smartTagPr\");\n if (smartTagPrEl?.attributes) {\n const stp: SmartTagPropertiesOptions = {};\n if (parseOnOff(attr(smartTagPrEl, \"embed\"))) stp.embed = true;\n const show = attr(smartTagPrEl, \"show\");\n if (show && show !== \"all\") stp.show = show as SmartTagShow;\n result.smartTagPr = stp;\n }\n\n // Smart tag types (CT_SmartTagTypes → smartTagType[])\n const smartTagTypesEl = findChild(el, \"smartTagTypes\");\n if (smartTagTypesEl) {\n const types: SmartTagTypeOptions[] = [];\n for (const t of smartTagTypesEl.elements ?? []) {\n if (t.name !== \"smartTagType\") continue;\n const type: SmartTagTypeOptions = {};\n const ns = attr(t, \"namespaceUri\");\n if (ns) type.namespaceUri = ns;\n const n = attr(t, \"name\");\n if (n) type.name = n;\n const u = attr(t, \"url\");\n if (u) type.url = u;\n types.push(type);\n }\n if (types.length > 0) result.smartTagTypes = types;\n }\n\n // Conformance\n if (el.attributes?.[\"conformance\"]) {\n result.conformance = attr(el, \"conformance\") as WorkbookConformance;\n }\n\n return result as WorkbookDescriptorOptions;\n },\n};\n","/**\n * Dialogsheet types and descriptor for SpreadsheetML documents.\n *\n * A dialogsheet is a legacy Excel 5.0 dialog sheet (no cell data).\n *\n * Reference: OOXML transitional, sml.xsd, CT_Dialogsheet\n *\n * @module\n */\n\nimport { convertToInch, parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs, attr, attrNum, escapeXml, findChild, stringifyElement } from \"@office-open/xml\";\n\nimport {\n parseHeaderFooterEl,\n parsePageSetupEl,\n parseSheetProtectionEl,\n} from \"./worksheet/descriptor\";\nimport {\n stringifyHeaderFooterXml,\n stringifyPageSetupXml,\n stringifyPrintOptionsXml,\n stringifySheetProtectionXml,\n} from \"./worksheet/stringify\";\nimport type {\n HeaderFooterOptions,\n PageMarginsOptions,\n PageSetupOptions,\n PrintOptions,\n SheetProtectionOptions,\n} from \"./worksheet/types\";\n\n// ── Types ──\n\n/** A legacy dialog sheet (xl/dialogsheets/sheetN.xml) — form-dialog controls. */\nexport interface DialogsheetOptions {\n /** Sheet name */\n name?: string;\n /** Workbook sheet id (CT_Sheet `@sheetId`) — unique but not necessarily sequential. */\n sheetId?: number;\n /** Visibility (CT_Sheet `@state`) */\n state?: \"visible\" | \"hidden\" | \"veryHidden\";\n /** Tab color (hex ARGB) */\n tabColor?: string;\n /** Published to a server (CT_SheetPr `@published`, XSD default true — only false is emitted) */\n published?: boolean;\n /** VBA code name (CT_SheetPr `@codeName`) */\n codeName?: string;\n pageMargins?: PageMarginsOptions;\n pageSetup?: PageSetupOptions;\n sheetProtection?: SheetProtectionOptions;\n /** Print options (CT_PrintOptions) */\n printOptions?: PrintOptions;\n /** Header/footer (CT_HeaderFooter) */\n headerFooter?: HeaderFooterOptions;\n /**\n * Relationship id of the dialog form drawing (CT_Dialogsheet `drawing`).\n * Round-trip only: the referenced drawing part is not re-emitted, so the id\n * is not resolvable in a freshly generated workbook.\n */\n drawingRId?: string;\n /**\n * Relationship id of the legacy VML drawing (CT_Dialogsheet `legacyDrawing`).\n * Round-trip only: the referenced VML part is not re-emitted.\n */\n legacyDrawingRId?: string;\n /** Raw extension list preserved verbatim (extLst) */\n extLst?: string;\n}\n\n// ── Descriptor ──\n\nexport const dialogsheetDesc: CustomDescriptor<DialogsheetOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<dialogsheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ];\n\n // sheetPr (optional)\n if (opts.tabColor || opts.published !== undefined || opts.codeName) {\n const prChildren: string[] = [];\n if (opts.tabColor) prChildren.push(`<tabColor${attrs({ rgb: opts.tabColor })}/>`);\n const prAttrs: string[] = [];\n // XSD default true — emit only the explicit-false form (0).\n if (opts.published === false) prAttrs.push(' published=\"0\"');\n if (opts.codeName) prAttrs.push(` codeName=\"${escapeXml(opts.codeName)}\"`);\n p.push(`<sheetPr${prAttrs.join(\"\")}>${prChildren.join(\"\")}</sheetPr>`);\n }\n\n // sheetProtection (optional) — CT_SheetProtection, shared with worksheet\n if (opts.sheetProtection) {\n p.push(stringifySheetProtectionXml(opts.sheetProtection));\n }\n\n // printOptions (optional) — CT_PrintOptions, shared with worksheet\n if (opts.printOptions) {\n p.push(stringifyPrintOptionsXml(opts.printOptions));\n }\n\n // pageMargins (optional)\n if (opts.pageMargins) {\n const pm = opts.pageMargins;\n p.push(\n `<pageMargins${attrs({\n left: convertToInch(pm.left ?? 0.7),\n right: convertToInch(pm.right ?? 0.7),\n top: convertToInch(pm.top ?? 0.75),\n bottom: convertToInch(pm.bottom ?? 0.75),\n header: convertToInch(pm.header ?? 0.3),\n footer: convertToInch(pm.footer ?? 0.3),\n })}/>`,\n );\n }\n\n // pageSetup (optional) — CT_PageSetup, shared with worksheet\n if (opts.pageSetup) {\n p.push(stringifyPageSetupXml(opts.pageSetup));\n }\n\n // headerFooter (optional) — CT_HeaderFooter, shared with worksheet\n if (opts.headerFooter) {\n const hfXml = stringifyHeaderFooterXml(opts.headerFooter);\n if (hfXml) p.push(hfXml);\n }\n\n // drawing / legacyDrawing (optional) — r:id passthrough, round-trip only\n if (opts.drawingRId) {\n p.push(`<drawing r:id=\"${escapeXml(opts.drawingRId)}\"/>`);\n }\n if (opts.legacyDrawingRId) {\n p.push(`<legacyDrawing r:id=\"${escapeXml(opts.legacyDrawingRId)}\"/>`);\n }\n\n if (opts.extLst) p.push(opts.extLst);\n\n p.push(\"</dialogsheet>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<DialogsheetOptions> = {};\n\n // sheetPr\n const sheetPrEl = findChild(el, \"sheetPr\");\n if (sheetPrEl) {\n // XSD default true — only the explicit \"0\" carries information back.\n if (String(attr(sheetPrEl, \"published\")) === \"0\") result.published = false;\n if (attr(sheetPrEl, \"codeName\")) result.codeName = attr(sheetPrEl, \"codeName\");\n const tcEl = findChild(sheetPrEl, \"tabColor\");\n if (tcEl && attr(tcEl, \"rgb\")) result.tabColor = attr(tcEl, \"rgb\");\n }\n\n // sheetProtection — CT_SheetProtection, shared with worksheet\n const spEl = findChild(el, \"sheetProtection\");\n if (spEl?.attributes) {\n result.sheetProtection = parseSheetProtectionEl(spEl);\n }\n\n // pageMargins\n const pmEl = findChild(el, \"pageMargins\");\n if (pmEl) {\n const pm: Partial<PageMarginsOptions> = {};\n const ml = attrNum(pmEl, \"left\");\n if (ml !== undefined) pm.left = ml;\n const mr = attrNum(pmEl, \"right\");\n if (mr !== undefined) pm.right = mr;\n const mt = attrNum(pmEl, \"top\");\n if (mt !== undefined) pm.top = mt;\n const mb = attrNum(pmEl, \"bottom\");\n if (mb !== undefined) pm.bottom = mb;\n const mh = attrNum(pmEl, \"header\");\n if (mh !== undefined) pm.header = mh;\n const mf = attrNum(pmEl, \"footer\");\n if (mf !== undefined) pm.footer = mf;\n result.pageMargins = pm;\n }\n\n // pageSetup — CT_PageSetup, shared with worksheet\n const psEl = findChild(el, \"pageSetup\");\n if (psEl) {\n result.pageSetup = parsePageSetupEl(psEl);\n }\n\n // printOptions — CT_PrintOptions, shared with worksheet\n const poEl = findChild(el, \"printOptions\");\n if (poEl) {\n const po: PrintOptions = {};\n if (parseOnOff(attr(poEl, \"horizontalCentered\"))) po.horizontalCentered = true;\n if (parseOnOff(attr(poEl, \"verticalCentered\"))) po.verticalCentered = true;\n if (parseOnOff(attr(poEl, \"headings\"))) po.headings = true;\n if (parseOnOff(attr(poEl, \"gridLines\"))) po.gridLines = true;\n if (String(attr(poEl, \"gridLinesSet\")) === \"0\") po.gridLinesSet = false;\n result.printOptions = po;\n }\n\n // headerFooter — CT_HeaderFooter, shared with worksheet\n const hfEl = findChild(el, \"headerFooter\");\n if (hfEl) {\n result.headerFooter = parseHeaderFooterEl(hfEl);\n }\n\n // drawing / legacyDrawing — r:id passthrough\n const drEl = findChild(el, \"drawing\");\n if (drEl) {\n const rId = drEl.attributes?.[\"r:id\"] as string | undefined;\n if (rId) result.drawingRId = rId;\n }\n const ldEl = findChild(el, \"legacyDrawing\");\n if (ldEl) {\n const rId = ldEl.attributes?.[\"r:id\"] as string | undefined;\n if (rId) result.legacyDrawingRId = rId;\n }\n\n // extLst — preserved verbatim\n const extEl = findChild(el, \"extLst\");\n if (extEl) result.extLst = stringifyElement(extEl);\n\n return result as DialogsheetOptions;\n },\n};\n","/**\n * XML Mapping types and descriptors for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd\n * CT_MapInfo, CT_Schema, CT_Map, CT_DataBinding,\n * CT_SingleXmlCells, CT_SingleXmlCell, CT_XmlCellPr, CT_XmlPr\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { attr, attrNum, escapeXml, findChild, stringifyElement } from \"@office-open/xml\";\n\n// ── Options ──\n\n/** XML schema definition (CT_Schema). Content is arbitrary (xsd:any, mixed). */\nexport interface SchemaOptions {\n /** Unique schema ID (required) */\n id: string;\n /** Schema reference (CT_Schema `@SchemaRef`) */\n schemaRef?: string;\n /** Namespace URI (CT_Schema `@Namespace`) */\n namespace?: string;\n /** Schema language (CT_Schema `@SchemaLanguage`) */\n schemaLanguage?: string;\n /** Raw schema content preserved verbatim (xsd:any inner XML) */\n content?: string;\n}\n\n/** Data binding (CT_DataBinding). */\nexport interface DataBindingOptions {\n /** Data binding name (CT_DataBinding@DataBindingName) */\n dataBindingName?: string;\n /** Whether this is a file binding (CT_DataBinding `@FileBinding`) */\n fileBinding?: boolean;\n /** Connection ID (CT_DataBinding `@ConnectionID`) */\n connectionId?: number;\n /** File binding name (CT_DataBinding `@FileBindingName`) */\n fileBindingName?: string;\n /** Load mode (CT_DataBinding@DataBindingLoadMode, required by XSD) */\n dataBindingLoadMode: number;\n}\n\n/** XML map (CT_Map). */\nexport interface MapOptions {\n /** Unique map ID (required) */\n id: number;\n /** Map name (required) */\n name: string;\n /** Root element name (required) */\n rootElement: string;\n /** Owning schema ID (required) */\n schemaId: string;\n /** Show import/export validation errors (required by XSD) */\n showImportExportValidationErrors?: boolean;\n /** Auto-fit columns (CT_Map `@AutoFit`, required by XSD) */\n autoFit?: boolean;\n /** Append new data (CT_Map `@Append`, required by XSD) */\n append?: boolean;\n /** Preserve sort/autofilter layout (CT_Map `@PreserveSortAFLayout`, required by XSD) */\n preserveSortAFLayout?: boolean;\n /** Preserve formatting (CT_Map `@PreserveFormat`, required by XSD) */\n preserveFormat?: boolean;\n /** Data binding (DataBinding child) */\n dataBinding?: DataBindingOptions;\n}\n\n/** Options for xl/xmlMaps.xml (CT_MapInfo). */\nexport interface MapInfoOptions {\n /** Selection namespaces declaration (required) */\n selectionNamespaces: string;\n /** Schema definitions */\n schemas: SchemaOptions[];\n /** XML maps */\n maps: MapOptions[];\n}\n\n/** XML cell properties (CT_XmlPr). */\nexport interface XmlPropertiesOptions {\n /** Owning map ID (required) */\n mapId: number;\n /** XPath expression (required) */\n xpath: string;\n /** XML data type (required) */\n xmlDataType: string;\n}\n\n/** Cell properties of a single-cell XML table (CT_XmlCellPr). */\nexport interface XmlCellPropertiesOptions {\n /** Table ID (required) */\n id: number;\n /** Unique name (CT_XmlCellPr `@uniqueName`) */\n uniqueName?: string;\n /** XML properties (required) */\n xmlPr: XmlPropertiesOptions;\n}\n\n/** Single-cell XML table entry (CT_SingleXmlCell). */\nexport interface SingleXmlCellOptions {\n /** Table ID (required) */\n id: number;\n /** Cell reference, e.g. \"A1\" (CT_SingleXmlCell `@r`, required) */\n reference: string;\n /** Connection ID (required) */\n connectionId: number;\n /** Cell properties (required) */\n xmlCellPr: XmlCellPropertiesOptions;\n}\n\n/** Options for xl/tables/tableSingleCells{n}.xml (CT_SingleXmlCells). */\nexport interface SingleXmlCellsOptions {\n /** Single-cell XML tables */\n cells: SingleXmlCellOptions[];\n}\n\n/** Table column XML mapping (CT_XmlColumnPr) — lives on table columns, not this part. */\nexport interface XmlColumnPropertiesOptions {\n /** XPath expression (required) */\n xpath: string;\n /** XML data type (required) */\n xmlDataType: string;\n /** Owning map ID (required) */\n mapId: number;\n /** Denormalized (CT_XmlColumnPr `@denormalized`) */\n denormalized?: boolean;\n}\n\n// ── Descriptors ──\n\nexport const mapInfoDesc: CustomDescriptor<MapInfoOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n `<MapInfo xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" SelectionNamespaces=\"${escapeXml(opts.selectionNamespaces)}\">`,\n ];\n for (const s of opts.schemas) {\n const attrs: string[] = [`ID=\"${escapeXml(s.id)}\"`];\n if (s.schemaRef !== undefined) attrs.push(`SchemaRef=\"${escapeXml(s.schemaRef)}\"`);\n if (s.namespace !== undefined) attrs.push(`Namespace=\"${escapeXml(s.namespace)}\"`);\n if (s.schemaLanguage !== undefined)\n attrs.push(`SchemaLanguage=\"${escapeXml(s.schemaLanguage)}\"`);\n if (s.content) p.push(`<Schema ${attrs.join(\" \")}>${s.content}</Schema>`);\n else p.push(`<Schema ${attrs.join(\" \")}/>`);\n }\n for (const m of opts.maps) {\n const attrs: string[] = [\n `ID=\"${m.id}\"`,\n `Name=\"${escapeXml(m.name)}\"`,\n `RootElement=\"${escapeXml(m.rootElement)}\"`,\n `SchemaID=\"${escapeXml(m.schemaId)}\"`,\n `ShowImportExportValidationErrors=\"${m.showImportExportValidationErrors ? 1 : 0}\"`,\n `AutoFit=\"${m.autoFit ? 1 : 0}\"`,\n `Append=\"${m.append ? 1 : 0}\"`,\n `PreserveSortAFLayout=\"${m.preserveSortAFLayout ? 1 : 0}\"`,\n `PreserveFormat=\"${m.preserveFormat ? 1 : 0}\"`,\n ];\n if (m.dataBinding) {\n const d = m.dataBinding;\n const dAttrs: string[] = [];\n if (d.dataBindingName !== undefined)\n dAttrs.push(`DataBindingName=\"${escapeXml(d.dataBindingName)}\"`);\n if (d.fileBinding) dAttrs.push('FileBinding=\"1\"');\n if (d.connectionId !== undefined) dAttrs.push(`ConnectionID=\"${d.connectionId}\"`);\n if (d.fileBindingName !== undefined)\n dAttrs.push(`FileBindingName=\"${escapeXml(d.fileBindingName)}\"`);\n dAttrs.push(`DataBindingLoadMode=\"${d.dataBindingLoadMode}\"`);\n p.push(`<Map ${attrs.join(\" \")}><DataBinding ${dAttrs.join(\" \")}/></Map>`);\n } else {\n p.push(`<Map ${attrs.join(\" \")}/>`);\n }\n }\n p.push(\"</MapInfo>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const schemas: SchemaOptions[] = [];\n const maps: MapOptions[] = [];\n for (const child of el.elements ?? []) {\n if (child.name === \"Schema\") {\n const s: Partial<SchemaOptions> = { id: attr(child, \"ID\") ?? \"\" };\n if (attr(child, \"SchemaRef\") !== undefined) s.schemaRef = attr(child, \"SchemaRef\");\n if (attr(child, \"Namespace\") !== undefined) s.namespace = attr(child, \"Namespace\");\n if (attr(child, \"SchemaLanguage\") !== undefined)\n s.schemaLanguage = attr(child, \"SchemaLanguage\");\n const inner = (child.elements ?? []).map((c) => stringifyElement(c)).join(\"\");\n if (inner) s.content = inner;\n schemas.push(s as SchemaOptions);\n } else if (child.name === \"Map\") {\n const m: Partial<MapOptions> = {\n id: attrNum(child, \"ID\") ?? 0,\n name: attr(child, \"Name\") ?? \"\",\n rootElement: attr(child, \"RootElement\") ?? \"\",\n schemaId: attr(child, \"SchemaID\") ?? \"\",\n };\n if (parseOnOff(attr(child, \"ShowImportExportValidationErrors\")))\n m.showImportExportValidationErrors = true;\n if (parseOnOff(attr(child, \"AutoFit\"))) m.autoFit = true;\n if (parseOnOff(attr(child, \"Append\"))) m.append = true;\n if (parseOnOff(attr(child, \"PreserveSortAFLayout\"))) m.preserveSortAFLayout = true;\n if (parseOnOff(attr(child, \"PreserveFormat\"))) m.preserveFormat = true;\n const dEl = findChild(child, \"DataBinding\");\n if (dEl) {\n const d: DataBindingOptions = { dataBindingLoadMode: 0 };\n if (attr(dEl, \"DataBindingName\") !== undefined)\n d.dataBindingName = attr(dEl, \"DataBindingName\");\n if (parseOnOff(attr(dEl, \"FileBinding\"))) d.fileBinding = true;\n const cid = attrNum(dEl, \"ConnectionID\");\n if (cid !== undefined) d.connectionId = cid;\n if (attr(dEl, \"FileBindingName\") !== undefined)\n d.fileBindingName = attr(dEl, \"FileBindingName\");\n const mode = attrNum(dEl, \"DataBindingLoadMode\");\n if (mode !== undefined) d.dataBindingLoadMode = mode;\n m.dataBinding = d;\n }\n maps.push(m as MapOptions);\n }\n }\n return {\n selectionNamespaces: attr(el, \"SelectionNamespaces\") ?? \"\",\n schemas,\n maps,\n };\n },\n};\n\nexport const singleXmlCellsDesc: CustomDescriptor<SingleXmlCellsOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<singleXmlCells xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n for (const c of opts.cells) {\n const pr = c.xmlCellPr;\n const prAttrs: string[] = [`id=\"${pr.id}\"`];\n if (pr.uniqueName !== undefined) prAttrs.push(`uniqueName=\"${escapeXml(pr.uniqueName)}\"`);\n // x:xmlPr @mapId is a required UInt32 (CT_XmlPr) — without a usable map\n // id the cell has nothing to bind to, so drop the whole xmlCellPr branch\n if (typeof pr.xmlPr.mapId !== \"number\") continue;\n p.push(\n `<singleXmlCell id=\"${c.id}\" r=\"${escapeXml(c.reference)}\" connectionId=\"${c.connectionId}\">` +\n `<xmlCellPr ${prAttrs.join(\" \")}>` +\n `<xmlPr mapId=\"${pr.xmlPr.mapId}\" xpath=\"${escapeXml(pr.xmlPr.xpath)}\" xmlDataType=\"${escapeXml(pr.xmlPr.xmlDataType)}\"/>` +\n `</xmlCellPr></singleXmlCell>`,\n );\n }\n p.push(\"</singleXmlCells>\");\n return p.join(\"\");\n },\n\n parse(el: Element, _ctx) {\n const cells: SingleXmlCellOptions[] = [];\n for (const cEl of el.elements ?? []) {\n if (cEl.name !== \"singleXmlCell\") continue;\n const prEl = findChild(cEl, \"xmlCellPr\");\n if (!prEl) continue;\n const xmlPrEl = findChild(prEl, \"xmlPr\");\n if (!xmlPrEl) continue;\n const pr: Partial<XmlCellPropertiesOptions> = { id: attrNum(prEl, \"id\") ?? 0 };\n if (attr(prEl, \"uniqueName\") !== undefined) pr.uniqueName = attr(prEl, \"uniqueName\");\n pr.xmlPr = {\n mapId: attrNum(xmlPrEl, \"mapId\") ?? 0,\n xpath: attr(xmlPrEl, \"xpath\") ?? \"\",\n xmlDataType: attr(xmlPrEl, \"xmlDataType\") ?? \"\",\n };\n cells.push({\n id: attrNum(cEl, \"id\") ?? 0,\n reference: attr(cEl, \"r\") ?? \"\",\n connectionId: attrNum(cEl, \"connectionId\") ?? 0,\n xmlCellPr: pr as XmlCellPropertiesOptions,\n });\n }\n return { cells };\n },\n};\n","/**\n * Static formula lint over workbook options.\n *\n * Catches the formula failure classes a JSON schema cannot see before the file\n * reaches Excel: references to sheets the workbook does not contain (Excel\n * evaluates them to #REF!) and unbalanced parentheses or quotes (Excel rejects\n * the formula outright). Best-effort by design — it reads sheet references\n * syntactically and never evaluates anything.\n *\n * @module\n */\nimport type { WorkbookOptions } from \"../parts/file\";\nimport type { WorksheetOptions } from \"../parts/worksheet/types\";\n\nexport interface FormulaIssue {\n /** Location hint, e.g. \"Sheet1!B2\" or \"Sheet1 conditional format A1:A10\". */\n location: string;\n formula: string;\n message: string;\n}\n\n// \\w plus '.' (sheet names like \"Q1.Report\") and ':' (3-D ranges \"A:B!\").\nconst REF_CHARS = /[\\w.:]/;\n\n// Cell references (\"A1\", \"$AB$12\") swept up while scanning a range segment\n// back from '!' (e.g. the \"A1:Data\" before the second '!' in \"Data!A1:Data!B2\").\n// Skipping them favors misses over false positives — a lint layer must not\n// reject a legal formula.\nconst CELL_REF = /^\\$?[A-Za-z]{1,3}\\$?\\d+$/;\n\n// String literals: an escaped quote inside a literal is written as \"\".\nconst STRING_LITERAL = /\"(?:[^\"]|\"\")*\"/g;\n\nfunction syntaxIssue(formula: string): string | undefined {\n const stripped = formula.replace(STRING_LITERAL, '\"\"');\n let parens = 0;\n for (const ch of stripped) {\n if (ch === \"(\") parens++;\n else if (ch === \")\") {\n parens--;\n if (parens < 0) return \"unbalanced parentheses\";\n }\n }\n if (parens !== 0) return \"unbalanced parentheses\";\n let quotes = 0;\n for (let i = 0; i < formula.length; i++) if (formula.charCodeAt(i) === 0x22) quotes++;\n if (quotes % 2 !== 0) return \"unbalanced double quotes\";\n return undefined;\n}\n\nfunction sheetReferenceIssues(formula: string, sheetNames: ReadonlySet<string>): string[] {\n // Strip literals first: after this every remaining '!' belongs to a sheet\n // reference — Excel's inequality is '<>' and error literals like #REF! are\n // skipped below, so '!' has no other use in a formula.\n const stripped = formula.replace(STRING_LITERAL, '\"\"');\n const messages: string[] = [];\n for (let i = stripped.indexOf(\"!\"); i !== -1; i = stripped.indexOf(\"!\", i + 1)) {\n const names: string[] = [];\n if (stripped.charCodeAt(i - 1) === 0x27) {\n // Quoted sheet name: 'My Sheet'!A1 — look up no further than its quotes.\n const open = stripped.lastIndexOf(\"'\", i - 2);\n if (open === -1) continue;\n const name = stripped.slice(open + 1, i - 1);\n if (!name) continue;\n // External-workbook ref \"[1]'My Sheet'!A1\" — target is not this file.\n if (stripped.charCodeAt(open - 1) === 0x5d) continue;\n names.push(name);\n } else {\n let k = i;\n while (k > 0 && REF_CHARS.test(stripped[k - 1]!)) k--;\n const segment = stripped.slice(k, i);\n // Empty (stray '!'), error literal (#REF!), or external ref ([1]Sheet2!).\n if (!segment) continue;\n if (stripped[k - 1] === \"#\" || stripped[k - 1] === \"]\") continue;\n for (const name of segment.split(\":\")) {\n if (!CELL_REF.test(name)) names.push(name);\n }\n }\n for (const name of names) {\n if (!sheetNames.has(name)) {\n messages.push(\n `references sheet \"${name}\" which does not exist (sheets: ${[...sheetNames].join(\", \")})`,\n );\n }\n }\n }\n return [...new Set(messages)];\n}\n\nfunction collectSheetNames(options: WorkbookOptions): Set<string> {\n const names = new Set<string>();\n // Mirror the compiler's default worksheet naming (`Sheet${i+1}`).\n options.worksheets?.forEach((ws, i) => names.add(ws.name ?? `Sheet${i + 1}`));\n // Chartsheet/dialogsheet defaults depend on global sheet order, so only\n // explicit names are lintable — formulas rarely target them anyway.\n for (const sheet of options.chartsheets ?? []) if (sheet.name) names.add(sheet.name);\n for (const sheet of options.dialogsheets ?? []) if (sheet.name) names.add(sheet.name);\n return names;\n}\n\n/** Lint all formulas in a workbook: cell formulas, conditional-format rules,\n * and data-validation formulas. Empty result = no findings. */\nexport function lintWorkbookFormulas(options: WorkbookOptions): FormulaIssue[] {\n const issues: FormulaIssue[] = [];\n const sheetNames = collectSheetNames(options);\n\n const check = (formula: string, location: string) => {\n const syntax = syntaxIssue(formula);\n if (syntax) issues.push({ location, formula, message: syntax });\n for (const message of sheetReferenceIssues(formula, sheetNames)) {\n issues.push({ location, formula, message });\n }\n };\n\n const checkSheet = (ws: WorksheetOptions, sheetName: string) => {\n (ws.rows ?? []).forEach((row, rowIdx) => {\n const rowHint = row.rowNumber ?? rowIdx + 1;\n for (const cell of row.cells ?? []) {\n const formula = typeof cell.formula === \"string\" ? cell.formula : cell.formula?.formula;\n if (!formula) continue;\n check(formula, `${sheetName}!${cell.reference ?? `row ${rowHint}`}`);\n }\n });\n for (const cf of ws.conditionalFormats ?? []) {\n for (const rule of cf.rules ?? []) {\n for (const formula of rule.formulas ?? []) {\n check(formula, `${sheetName} conditional format ${cf.sqref}`);\n }\n }\n }\n for (const dv of ws.dataValidations ?? []) {\n for (const formula of [dv.formula1, dv.formula2]) {\n if (formula) check(formula, `${sheetName} data validation ${dv.sqref}`);\n }\n }\n };\n\n options.worksheets?.forEach((ws, i) => checkSheet(ws, ws.name ?? `Sheet${i + 1}`));\n return issues;\n}\n","/**\n * Revision log — per-revision parse helpers and shared attribute readers.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { attr, escapeXml, findChild, stringifyElement, textOf } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type {\n RevisionAction,\n RevisionAutoFormattingOptions,\n RevisionCellChangeOptions,\n RevisionCommentOptions,\n RevisionConflictOptions,\n RevisionDefinedNameOptions,\n RevisionEntry,\n RevisionFormattingOptions,\n RevisionInsertSheetOptions,\n RevisionMoveOptions,\n RevisionNestedChild,\n RevisionRowColumnOptions,\n RevisionSheetRenameOptions,\n RevisionUndoOptions,\n RowColumnAction,\n} from \"./types\";\n\n// ── Per-revision parse ──\n\n/** Parses the shared undo/rcc/rfmt nested choice group on rrc/rm. */\nfunction parseNestedChildren(el: XmlElement): RevisionNestedChild[] {\n const children: RevisionNestedChild[] = [];\n for (const child of el.elements ?? []) {\n if (child.type !== \"element\") continue;\n if (child.name === \"undo\") {\n const undo: Partial<RevisionUndoOptions> = {\n index: Number(attr(child, \"index\") ?? \"0\"),\n expression: (attr(child, \"exp\") ?? \"ref\") as RevisionUndoOptions[\"expression\"],\n undoRange: attr(child, \"dr\") ?? \"\",\n };\n readBool(child, \"ref3D\", (v) => (undo.ref3D = v));\n readBool(child, \"array\", (v) => (undo.array = v));\n readBool(child, \"v\", (v) => (undo.value = v));\n readBool(child, \"nf\", (v) => (undo.numberFormat = v));\n readBool(child, \"cs\", (v) => (undo.conditionalStyle = v));\n readStr(child, \"dn\", (v) => (undo.definedName = v));\n readStr(child, \"r\", (v) => (undo.reference = v));\n readNum(child, \"sId\", (v) => (undo.sId = v));\n children.push({ kind: \"undo\", data: undo as RevisionUndoOptions });\n } else if (child.name === \"rcc\") {\n const nested = parseEntry(child);\n if (nested?.type === \"cellChange\") children.push({ kind: \"cellChange\", data: nested.data });\n } else if (child.name === \"rfmt\") {\n const nested = parseEntry(child);\n if (nested?.type === \"formatting\") children.push({ kind: \"formatting\", data: nested.data });\n }\n }\n return children;\n}\n\n/** Returns the first element child of a node as raw XML string. */\nfunction firstChildXml(el: XmlElement | null, name: string): string | undefined {\n const child = findChild(el ?? undefined, name);\n return child ? stringifyElement(child) : undefined;\n}\n\nfunction parseBool(el: XmlElement, name: string): boolean | undefined {\n const v = attr(el, name);\n if (v === undefined) return undefined;\n // nativeTypeAttributes (xlsx parse path) coerces \"1\" to number 1.\n return parseOnOff(v) ?? false;\n}\n\nexport function parseEntry(el: XmlElement): RevisionEntry | undefined {\n switch (el.name) {\n case \"rrc\": {\n const d: Partial<RevisionRowColumnOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sId\") ?? \"0\"),\n ref: attr(el, \"ref\") ?? \"\",\n action: (attr(el, \"action\") ?? \"insertRow\") as RowColumnAction,\n };\n const endOfList = parseBool(el, \"eol\");\n if (endOfList) d.endOfList = endOfList;\n const edge = parseBool(el, \"edge\");\n if (edge) d.edge = edge;\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const children = parseNestedChildren(el);\n if (children.length > 0) d.children = children;\n return { type: \"rowColumn\", data: d as RevisionRowColumnOptions };\n }\n case \"rm\": {\n const d: Partial<RevisionMoveOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n source: attr(el, \"source\") ?? \"\",\n destination: attr(el, \"destination\") ?? \"\",\n };\n const sourceSheetId = attr(el, \"sourceSheetId\");\n if (sourceSheetId !== undefined) d.sourceSheetId = Number(sourceSheetId);\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const children = parseNestedChildren(el);\n if (children.length > 0) d.children = children;\n return { type: \"move\", data: d as RevisionMoveOptions };\n }\n case \"rcv\":\n return {\n type: \"customView\",\n data: {\n guid: attr(el, \"guid\") ?? \"\",\n action: (attr(el, \"action\") ?? \"add\") as RevisionAction,\n },\n };\n case \"rsnm\": {\n const d: Partial<RevisionSheetRenameOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n oldName: attr(el, \"oldName\") ?? \"\",\n newName: attr(el, \"newName\") ?? \"\",\n };\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n return { type: \"sheetRename\", data: d as RevisionSheetRenameOptions };\n }\n case \"ris\": {\n const d: Partial<RevisionInsertSheetOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n name: attr(el, \"name\") ?? \"\",\n sheetPosition: Number(attr(el, \"sheetPosition\") ?? \"0\"),\n };\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n return { type: \"insertSheet\", data: d as RevisionInsertSheetOptions };\n }\n case \"rcc\": {\n const d: Partial<RevisionCellChangeOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sId\") ?? \"0\"),\n newCellXml: firstChildXml(el, \"nc\") ?? \"\",\n };\n const hasOldDxf = parseBool(el, \"odxf\");\n if (hasOldDxf) d.hasOldDxf = hasOldDxf;\n const xfDxf = parseBool(el, \"xfDxf\");\n if (xfDxf) d.xfDxf = xfDxf;\n const style = parseBool(el, \"s\");\n if (style) d.style = style;\n const hasDxf = parseBool(el, \"dxf\");\n if (hasDxf) d.hasDxf = hasDxf;\n const numFmtId = attr(el, \"numFmtId\");\n if (numFmtId !== undefined) d.numFmtId = Number(numFmtId);\n const quotePrefix = parseBool(el, \"quotePrefix\");\n if (quotePrefix) d.quotePrefix = quotePrefix;\n const oldQuotePrefix = parseBool(el, \"oldQuotePrefix\");\n if (oldQuotePrefix) d.oldQuotePrefix = oldQuotePrefix;\n const phonetic = parseBool(el, \"ph\");\n if (phonetic) d.phonetic = phonetic;\n const oldPhonetic = parseBool(el, \"oldPh\");\n if (oldPhonetic) d.oldPhonetic = oldPhonetic;\n const endOfList = parseBool(el, \"endOfListFormulaUpdate\");\n if (endOfList) d.endOfListFormulaUpdate = endOfList;\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const oc = firstChildXml(el, \"oc\");\n if (oc) d.oldCellXml = oc;\n const odxf = firstChildXml(el, \"odxf\");\n if (odxf) d.oldDxfXml = odxf;\n const ndxf = firstChildXml(el, \"ndxf\");\n if (ndxf) d.newDxfXml = ndxf;\n return { type: \"cellChange\", data: d as RevisionCellChangeOptions };\n }\n case \"rfmt\": {\n const d: Partial<RevisionFormattingOptions> = {\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n sqref: attr(el, \"sqref\") ?? \"\",\n };\n const xfDxf = parseBool(el, \"xfDxf\");\n if (xfDxf) d.xfDxf = xfDxf;\n const style = parseBool(el, \"s\");\n if (style) d.style = style;\n const start = attr(el, \"start\");\n if (start !== undefined) d.start = Number(start);\n const length = attr(el, \"length\");\n if (length !== undefined) d.length = Number(length);\n const dxfXml = firstChildXml(el, \"dxf\");\n if (dxfXml) d.dxfXml = dxfXml;\n return { type: \"formatting\", data: d as RevisionFormattingOptions };\n }\n case \"raf\": {\n const d: Partial<RevisionAutoFormattingOptions> = {\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n ref: attr(el, \"ref\") ?? \"\",\n };\n // AG_AutoFormat is a fixed set of optional attributes; capture verbatim.\n const autoAttrs = Object.entries(el.attributes ?? {})\n .filter(([k]) => k !== \"sheetId\" && k !== \"ref\")\n .map(([k, v]) => ` ${k}=\"${escapeXml(String(v))}\"`)\n .join(\"\");\n if (autoAttrs) d.autoFormatXml = autoAttrs;\n return { type: \"autoFormatting\", data: d as RevisionAutoFormattingOptions };\n }\n case \"rdn\": {\n const d: Partial<RevisionDefinedNameOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n name: attr(el, \"name\") ?? \"\",\n };\n const localSheetId = attr(el, \"localSheetId\");\n if (localSheetId !== undefined) d.localSheetId = Number(localSheetId);\n readBool(el, \"customView\", (v) => (d.customView = v));\n readBool(el, \"function\", (v) => (d.function = v));\n readBool(el, \"oldFunction\", (v) => (d.oldFunction = v));\n readNum(el, \"functionGroupId\", (v) => (d.functionGroupId = v));\n readNum(el, \"oldFunctionGroupId\", (v) => (d.oldFunctionGroupId = v));\n readNum(el, \"shortcutKey\", (v) => (d.shortcutKey = v));\n readNum(el, \"oldShortcutKey\", (v) => (d.oldShortcutKey = v));\n readBool(el, \"hidden\", (v) => (d.hidden = v));\n readBool(el, \"oldHidden\", (v) => (d.oldHidden = v));\n readStr(el, \"customMenu\", (v) => (d.customMenu = v));\n readStr(el, \"oldCustomMenu\", (v) => (d.oldCustomMenu = v));\n readStr(el, \"description\", (v) => (d.description = v));\n readStr(el, \"oldDescription\", (v) => (d.oldDescription = v));\n readStr(el, \"help\", (v) => (d.help = v));\n readStr(el, \"oldHelp\", (v) => (d.oldHelp = v));\n readStr(el, \"statusBar\", (v) => (d.statusBar = v));\n readStr(el, \"oldStatusBar\", (v) => (d.oldStatusBar = v));\n readStr(el, \"comment\", (v) => (d.comment = v));\n readStr(el, \"oldComment\", (v) => (d.oldComment = v));\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const formula = findChild(el, \"formula\");\n if (formula) d.formula = textOf(formula) ?? \"\";\n const oldFormula = findChild(el, \"oldFormula\");\n if (oldFormula) d.oldFormula = textOf(oldFormula) ?? \"\";\n return { type: \"definedName\", data: d as RevisionDefinedNameOptions };\n }\n case \"rcmt\": {\n const d: Partial<RevisionCommentOptions> = {\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n cell: attr(el, \"cell\") ?? \"\",\n guid: attr(el, \"guid\") ?? \"\",\n author: attr(el, \"author\") ?? \"\",\n };\n const action = attr(el, \"action\");\n if (action) d.action = action as RevisionAction;\n readBool(el, \"alwaysShow\", (v) => (d.alwaysShow = v));\n readBool(el, \"old\", (v) => (d.old = v));\n readBool(el, \"hiddenRow\", (v) => (d.hiddenRow = v));\n readBool(el, \"hiddenColumn\", (v) => (d.hiddenColumn = v));\n readNum(el, \"oldLength\", (v) => (d.oldLength = v));\n readNum(el, \"newLength\", (v) => (d.newLength = v));\n return { type: \"comment\", data: d as RevisionCommentOptions };\n }\n case \"rqt\":\n return {\n type: \"queryTableField\",\n data: {\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n ref: attr(el, \"ref\") ?? \"\",\n fieldId: Number(attr(el, \"fieldId\") ?? \"0\"),\n },\n };\n case \"rcft\": {\n const d: Partial<RevisionConflictOptions> = { rId: Number(attr(el, \"rId\") ?? \"0\") };\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const sheetId = attr(el, \"sheetId\");\n if (sheetId !== undefined) d.sheetId = Number(sheetId);\n return { type: \"conflict\", data: d as RevisionConflictOptions };\n }\n default:\n return undefined;\n }\n}\n\n// ── Attribute readers (set-callback style keeps parse paths on concrete types) ──\n\nexport function readBool(el: XmlElement, name: string, set: (v: boolean) => void): void {\n const raw = attr(el, name);\n // nativeTypeAttributes (xlsx parse path) coerces \"1\" to number 1.\n if (parseOnOff(raw)) set(true);\n}\n\nexport function readNum(el: XmlElement, name: string, set: (v: number) => void): void {\n const raw = attr(el, name);\n if (raw !== undefined) set(Number(raw));\n}\n\nexport function readStr(el: XmlElement, name: string, set: (v: string) => void): void {\n const raw = attr(el, name);\n if (raw !== undefined) set(raw);\n}\n","/**\n * Revision log — per-revision stringify helpers and namespace constants.\n *\n * @module\n */\n\nimport { escapeXml } from \"@office-open/xml\";\n\nimport type { RevisionEntry, RevisionNestedChild, RevisionUndoOptions } from \"./types\";\n\n// Namespace constants shared across the headers/users/log descriptors.\nconst S_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst R_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\n\n// ── Per-revision stringify ──\n\nfunction agRevData(data: { rId: number; undo?: boolean; rejected?: boolean }): string {\n let s = ` rId=\"${data.rId}\"`;\n if (data.undo) s += ` ua=\"1\"`;\n if (data.rejected) s += ` ra=\"1\"`;\n return s;\n}\n\nfunction stringifyUndo(d: RevisionUndoOptions): string {\n let a = ` index=\"${d.index}\" exp=\"${d.expression}\" dr=\"${escapeXml(d.undoRange)}\"`;\n if (d.ref3D) a += ` ref3D=\"1\"`;\n if (d.array) a += ` array=\"1\"`;\n if (d.value) a += ` v=\"1\"`;\n if (d.numberFormat) a += ` nf=\"1\"`;\n if (d.conditionalStyle) a += ` cs=\"1\"`;\n if (d.definedName !== undefined) a += ` dn=\"${escapeXml(d.definedName)}\"`;\n if (d.reference !== undefined) a += ` r=\"${escapeXml(d.reference)}\"`;\n if (d.sId !== undefined) a += ` sId=\"${d.sId}\"`;\n return `<undo${a}/>`;\n}\n\nfunction stringifyNestedChildren(children: RevisionNestedChild[] | undefined): string {\n if (!children) return \"\";\n return children\n .map((child) => {\n switch (child.kind) {\n case \"undo\":\n return stringifyUndo(child.data);\n case \"cellChange\":\n return stringifyEntry({ type: \"cellChange\", data: child.data });\n case \"formatting\":\n return stringifyEntry({ type: \"formatting\", data: child.data });\n }\n })\n .join(\"\");\n}\n\nexport function stringifyEntry(entry: RevisionEntry): string {\n switch (entry.type) {\n case \"rowColumn\": {\n const d = entry.data;\n let a = agRevData(d) + ` sId=\"${d.sheetId}\" ref=\"${escapeXml(d.ref)}\" action=\"${d.action}\"`;\n if (d.endOfList) a += ` eol=\"1\"`;\n if (d.edge) a += ` edge=\"1\"`;\n return `<rrc${a}>${stringifyNestedChildren(d.children)}</rrc>`;\n }\n case \"move\": {\n const d = entry.data;\n let a =\n agRevData(d) +\n ` sheetId=\"${d.sheetId}\" source=\"${escapeXml(d.source)}\" destination=\"${escapeXml(d.destination)}\"`;\n if (d.sourceSheetId !== undefined) a += ` sourceSheetId=\"${d.sourceSheetId}\"`;\n return `<rm${a}>${stringifyNestedChildren(d.children)}</rm>`;\n }\n case \"customView\": {\n const d = entry.data;\n return `<rcv guid=\"${escapeXml(d.guid)}\" action=\"${d.action}\"/>`;\n }\n case \"sheetRename\": {\n const d = entry.data;\n return `<rsnm${agRevData(d)} sheetId=\"${d.sheetId}\" oldName=\"${escapeXml(\n d.oldName,\n )}\" newName=\"${escapeXml(d.newName)}\"/>`;\n }\n case \"insertSheet\": {\n const d = entry.data;\n return `<ris${agRevData(d)} sheetId=\"${d.sheetId}\" name=\"${escapeXml(\n d.name,\n )}\" sheetPosition=\"${d.sheetPosition}\"/>`;\n }\n case \"cellChange\": {\n const d = entry.data;\n let a = agRevData(d) + ` sId=\"${d.sheetId}\"`;\n if (d.hasOldDxf) a += ` odxf=\"1\"`;\n if (d.xfDxf) a += ` xfDxf=\"1\"`;\n if (d.style) a += ` s=\"1\"`;\n if (d.hasDxf) a += ` dxf=\"1\"`;\n if (d.numFmtId !== undefined) a += ` numFmtId=\"${d.numFmtId}\"`;\n if (d.quotePrefix) a += ` quotePrefix=\"1\"`;\n if (d.oldQuotePrefix) a += ` oldQuotePrefix=\"1\"`;\n if (d.phonetic) a += ` ph=\"1\"`;\n if (d.oldPhonetic) a += ` oldPh=\"1\"`;\n if (d.endOfListFormulaUpdate) a += ` endOfListFormulaUpdate=\"1\"`;\n // CT_RevisionCellChange requires the new-cell child (nc, min 1) — an entry\n // without one cannot serialize and is skipped\n if (!d.newCellXml) return \"\";\n const children = [d.oldCellXml ?? \"\", d.newCellXml, d.oldDxfXml ?? \"\", d.newDxfXml ?? \"\"]\n .filter(Boolean)\n .join(\"\");\n return `<rcc${a}>${children}</rcc>`;\n }\n case \"formatting\": {\n const d = entry.data;\n let a = ` sheetId=\"${d.sheetId}\" sqref=\"${escapeXml(d.sqref)}\"`;\n if (d.xfDxf) a += ` xfDxf=\"1\"`;\n if (d.style) a += ` s=\"1\"`;\n if (d.start !== undefined) a += ` start=\"${d.start}\"`;\n if (d.length !== undefined) a += ` length=\"${d.length}\"`;\n return `<rfmt${a}>${d.dxfXml ?? \"\"}</rfmt>`;\n }\n case \"autoFormatting\": {\n const d = entry.data;\n return `<raf sheetId=\"${d.sheetId}\" ref=\"${escapeXml(d.ref)}\"${d.autoFormatXml ?? \"\"}/>`;\n }\n case \"definedName\": {\n const d = entry.data;\n let a = agRevData(d) + ` name=\"${escapeXml(d.name)}\"`;\n if (d.localSheetId !== undefined) a += ` localSheetId=\"${d.localSheetId}\"`;\n if (d.customView) a += ` customView=\"1\"`;\n if (d.function) a += ` function=\"1\"`;\n if (d.oldFunction) a += ` oldFunction=\"1\"`;\n if (d.functionGroupId !== undefined) a += ` functionGroupId=\"${d.functionGroupId}\"`;\n if (d.oldFunctionGroupId !== undefined) a += ` oldFunctionGroupId=\"${d.oldFunctionGroupId}\"`;\n if (d.shortcutKey !== undefined) a += ` shortcutKey=\"${d.shortcutKey}\"`;\n if (d.oldShortcutKey !== undefined) a += ` oldShortcutKey=\"${d.oldShortcutKey}\"`;\n if (d.hidden) a += ` hidden=\"1\"`;\n if (d.oldHidden) a += ` oldHidden=\"1\"`;\n const xstring = (v: string | undefined, attr: string) =>\n v !== undefined ? ` ${attr}=\"${escapeXml(v)}\"` : \"\";\n a += xstring(d.customMenu, \"customMenu\") + xstring(d.oldCustomMenu, \"oldCustomMenu\");\n a += xstring(d.description, \"description\") + xstring(d.oldDescription, \"oldDescription\");\n a += xstring(d.help, \"help\") + xstring(d.oldHelp, \"oldHelp\");\n a += xstring(d.statusBar, \"statusBar\") + xstring(d.oldStatusBar, \"oldStatusBar\");\n a += xstring(d.comment, \"comment\") + xstring(d.oldComment, \"oldComment\");\n const children = [\n d.formula !== undefined ? `<formula>${escapeXml(d.formula)}</formula>` : \"\",\n d.oldFormula !== undefined ? `<oldFormula>${escapeXml(d.oldFormula)}</oldFormula>` : \"\",\n ]\n .filter(Boolean)\n .join(\"\");\n return `<rdn${a}>${children}</rdn>`;\n }\n case \"comment\": {\n const d = entry.data;\n let a = ` sheetId=\"${d.sheetId}\" cell=\"${escapeXml(d.cell)}\" guid=\"${escapeXml(\n d.guid,\n )}\" action=\"${d.action ?? \"add\"}\" author=\"${escapeXml(d.author)}\"`;\n if (d.alwaysShow) a += ` alwaysShow=\"1\"`;\n if (d.old) a += ` old=\"1\"`;\n if (d.hiddenRow) a += ` hiddenRow=\"1\"`;\n if (d.hiddenColumn) a += ` hiddenColumn=\"1\"`;\n if (d.oldLength !== undefined) a += ` oldLength=\"${d.oldLength}\"`;\n if (d.newLength !== undefined) a += ` newLength=\"${d.newLength}\"`;\n return `<rcmt${a}/>`;\n }\n case \"queryTableField\": {\n // All three attributes are required by CT_RevisionQueryTableField — skip\n // the entry rather than emit \"undefined\" literals for missing fields.\n const d = entry.data;\n if (d.sheetId === undefined || d.ref === undefined || d.fieldId === undefined) return \"\";\n return `<rqt sheetId=\"${d.sheetId}\" ref=\"${escapeXml(d.ref)}\" fieldId=\"${d.fieldId}\"/>`;\n }\n case \"conflict\": {\n const d = entry.data;\n if (d.rId === undefined) return \"\";\n let a = agRevData(d);\n if (d.sheetId !== undefined) a += ` sheetId=\"${d.sheetId}\"`;\n return `<rcft${a}/>`;\n }\n }\n}\n\nexport { R_NS, S_NS };\n","/**\n * Revision headers — xl/revisionHeaders.xml (CT_RevisionHeaders) descriptor.\n *\n * Index of revision logs in a shared workbook.\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, children, escapeXml, findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport { readBool, readNum } from \"./parse\";\nimport { R_NS, S_NS } from \"./stringify\";\nimport type { RevisionHeaderEntry, RevisionHeadersOptions } from \"./types\";\n\nfunction stringifyHeader(h: RevisionHeaderEntry): string {\n const sheetIds = h.sheetIds.map((id) => `<sheetId val=\"${id}\"/>`).join(\"\");\n const reviewedXml =\n h.reviewed && h.reviewed.length > 0\n ? `<reviewedList count=\"${h.reviewed.length}\">${h.reviewed\n .map((r) => `<reviewed rId=\"${r}\"/>`)\n .join(\"\")}</reviewedList>`\n : \"\";\n let attrs =\n ` guid=\"${escapeXml(h.guid)}\" dateTime=\"${escapeXml(h.dateTime)}\"` +\n ` maxSheetId=\"${h.maxSheetId}\" userName=\"${escapeXml(h.userName)}\"` +\n ` r:id=\"${escapeXml(h.rId)}\"`;\n if (h.minRId !== undefined) attrs += ` minRId=\"${h.minRId}\"`;\n if (h.maxRId !== undefined) attrs += ` maxRId=\"${h.maxRId}\"`;\n return `<header${attrs}><sheetIdMap count=\"${h.sheetIds.length}\">${sheetIds}</sheetIdMap>${reviewedXml}</header>`;\n}\n\nfunction parseHeader(el: XmlElement): RevisionHeaderEntry {\n const guid = attr(el, \"guid\") ?? \"\";\n const dateTime = attr(el, \"dateTime\") ?? \"\";\n const userName = attr(el, \"userName\") ?? \"\";\n // r:id lives in the relationships namespace\n const rId = String(el.attributes?.[\"r:id\"] ?? el.attributes?.[\"id\"] ?? \"\");\n const maxSheetId = Number(attr(el, \"maxSheetId\") ?? \"0\");\n const sheetIdMap = findChild(el, \"sheetIdMap\");\n const sheetIds = children(sheetIdMap, \"sheetId\").map((s) => Number(attr(s, \"val\") ?? \"0\"));\n const result: RevisionHeaderEntry = { guid, dateTime, userName, rId, maxSheetId, sheetIds };\n const reviewedList = findChild(el, \"reviewedList\");\n if (reviewedList) {\n const reviewed = children(reviewedList, \"reviewed\").map((r) => Number(attr(r, \"rId\") ?? \"0\"));\n if (reviewed.length > 0) result.reviewed = reviewed;\n }\n const minRId = attr(el, \"minRId\");\n if (minRId !== undefined) result.minRId = Number(minRId);\n const maxRId = attr(el, \"maxRId\");\n if (maxRId !== undefined) result.maxRId = Number(maxRId);\n return result;\n}\n\nexport const revisionHeadersDesc: CustomDescriptor<RevisionHeadersOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.headers.length === 0) return undefined;\n let attrs = ` xmlns=\"${S_NS}\" xmlns:r=\"${R_NS}\" guid=\"${escapeXml(opts.guid)}\"`;\n if (opts.lastGuid) attrs += ` lastGuid=\"${escapeXml(opts.lastGuid)}\"`;\n if (opts.shared !== undefined) attrs += ` shared=\"${opts.shared ? 1 : 0}\"`;\n if (opts.diskRevisions !== undefined) attrs += ` diskRevisions=\"${opts.diskRevisions ? 1 : 0}\"`;\n if (opts.history !== undefined) attrs += ` history=\"${opts.history ? 1 : 0}\"`;\n if (opts.trackRevisions !== undefined)\n attrs += ` trackRevisions=\"${opts.trackRevisions ? 1 : 0}\"`;\n if (opts.exclusive !== undefined) attrs += ` exclusive=\"${opts.exclusive ? 1 : 0}\"`;\n if (opts.revisionId !== undefined) attrs += ` revisionId=\"${opts.revisionId}\"`;\n if (opts.version !== undefined) attrs += ` version=\"${opts.version}\"`;\n if (opts.keepChangeHistory !== undefined)\n attrs += ` keepChangeHistory=\"${opts.keepChangeHistory ? 1 : 0}\"`;\n if (opts.protected !== undefined) attrs += ` protected=\"${opts.protected ? 1 : 0}\"`;\n if (opts.preserveHistory !== undefined) attrs += ` preserveHistory=\"${opts.preserveHistory}\"`;\n return `<headers${attrs}>${opts.headers.map(stringifyHeader).join(\"\")}</headers>`;\n },\n\n parse(el, _ctx) {\n const guid = attr(el, \"guid\") ?? \"\";\n const headers = children(el, \"header\").map(parseHeader);\n const result: Partial<RevisionHeadersOptions> = { guid, headers };\n const lastGuid = attr(el, \"lastGuid\");\n if (lastGuid !== undefined) result.lastGuid = lastGuid;\n readBool(el, \"shared\", (v) => (result.shared = v));\n readBool(el, \"diskRevisions\", (v) => (result.diskRevisions = v));\n readBool(el, \"history\", (v) => (result.history = v));\n readBool(el, \"trackRevisions\", (v) => (result.trackRevisions = v));\n readBool(el, \"exclusive\", (v) => (result.exclusive = v));\n readNum(el, \"revisionId\", (v) => (result.revisionId = v));\n readNum(el, \"version\", (v) => (result.version = v));\n readBool(el, \"keepChangeHistory\", (v) => (result.keepChangeHistory = v));\n readBool(el, \"protected\", (v) => (result.protected = v));\n readNum(el, \"preserveHistory\", (v) => (result.preserveHistory = v));\n return result as RevisionHeadersOptions;\n },\n};\n","/**\n * Users — xl/users.xml (CT_Users, sml.xsd:2100) descriptor.\n *\n * Shared-workbook user list.\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, children, escapeXml } from \"@office-open/xml\";\n\nimport { S_NS } from \"./stringify\";\nimport type { UsersOptions } from \"./types\";\n\nexport const usersDesc: CustomDescriptor<UsersOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (!opts.users || opts.users.length === 0) return undefined;\n const users = opts.users\n .map(\n (u) =>\n `<userInfo guid=\"${escapeXml(u.guid)}\" name=\"${escapeXml(u.name)}\" id=\"${u.id}\"` +\n ` dateTime=\"${escapeXml(u.dateTime)}\"/>`,\n )\n .join(\"\");\n return `<users xmlns=\"${S_NS}\" count=\"${opts.users.length}\">${users}</users>`;\n },\n\n parse(el, _ctx) {\n const users = children(el, \"userInfo\").map((u) => ({\n guid: attr(u, \"guid\") ?? \"\",\n name: attr(u, \"name\") ?? \"\",\n id: Number(attr(u, \"id\") ?? \"0\"),\n dateTime: attr(u, \"dateTime\") ?? \"\",\n }));\n const result: Partial<UsersOptions> = {};\n if (users.length > 0) result.users = users;\n return result as UsersOptions;\n },\n};\n","/**\n * Revision log descriptors for shared-workbook change tracking.\n *\n * Three parts:\n * - xl/revisionHeaders.xml (CT_RevisionHeaders) — index of revision logs\n * - xl/revisions/revisionN.xml (CT_Revisions) — one log per header entry\n * - xl/users.xml (CT_Users) — shared-workbook users\n *\n * Reference: OOXML transitional, sml.xsd — CT_RevisionHeaders (:1860),\n * CT_RevisionHeader (:1898), CT_Revisions (:1877, 12 revision elements),\n * CT_Users (:2100), AG_RevData (:1893).\n *\n * Nested CT_Cell (oc/nc) and CT_Dxf (odxf/ndxf/dxf) carry through verbatim as\n * `*Xml` strings — their full content model is large and revision round-trip only\n * needs lossless preservation, not a re-authored abstraction.\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport { parseEntry } from \"./parse\";\nimport { S_NS, stringifyEntry } from \"./stringify\";\nimport type { RevisionLogOptions } from \"./types\";\n\nexport const revisionLogDesc: CustomDescriptor<RevisionLogOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.revisions.length === 0) return undefined;\n return `<revisions xmlns=\"${S_NS}\">${opts.revisions.map(stringifyEntry).filter(Boolean).join(\"\")}</revisions>`;\n },\n\n parse(el, _ctx) {\n const revisions: RevisionLogOptions[\"revisions\"] = [];\n for (const child of el.elements ?? []) {\n if (child.type !== \"element\") continue;\n const entry = parseEntry(child as XmlElement);\n if (entry) revisions.push(entry);\n }\n return { revisions } as RevisionLogOptions;\n },\n};\n","/**\n * Volatile function types — the standalone `xl/volTypes.xml` part\n * (CT_VolTypes root, RTD server topic registrations). Never a child of\n * workbook.xml: sml.xsd declares volTypes as a top-level part element.\n *\n * @module\n */\nimport { attr, attrNum, escapeXml, findChild } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\n\nimport type {\n VolMainOptions,\n VolTopicOptions,\n VolTopicRefOptions,\n VolTypeOptions,\n} from \"./workbook/types\";\n\nexport type { VolTypeOptions } from \"./workbook/types\";\n\nconst SML_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\n\n/** Emit the complete `<volTypes>` root element for xl/volTypes.xml. */\nexport function buildVolTypesXml(volTypes: readonly VolTypeOptions[]): string {\n if (volTypes.length === 0) return \"\";\n const parts: string[] = [`<volTypes xmlns=\"${SML_NS}\" count=\"${volTypes.length}\">`];\n for (const vt of volTypes) {\n const vtType = vt.type ?? \"realTimeData\";\n const mains = vt.mains ?? [];\n if (mains.length > 0) {\n const mainParts: string[] = [];\n for (const m of mains) {\n const tpParts: string[] = [];\n for (const topic of m.topics ?? []) {\n const tpInner: string[] = [`<v>${escapeXml(topic.value)}</v>`];\n for (const stp of topic.stringTopics ?? []) {\n tpInner.push(`<stp>${escapeXml(stp)}</stp>`);\n }\n for (const tr of topic.refs ?? []) {\n tpInner.push(`<tr r=\"${escapeXml(tr.reference)}\" s=\"${tr.sheetIndex}\"/>`);\n }\n const tpAttr =\n topic.valueType && topic.valueType !== \"n\" ? ` t=\"${escapeXml(topic.valueType)}\"` : \"\";\n tpParts.push(`<tp${tpAttr}>${tpInner.join(\"\")}</tp>`);\n }\n mainParts.push(`<main first=\"${escapeXml(m.first)}\">${tpParts.join(\"\")}</main>`);\n }\n parts.push(`<volType type=\"${vtType}\">${mainParts.join(\"\")}</volType>`);\n } else {\n parts.push(`<volType type=\"${vtType}\"/>`);\n }\n }\n parts.push(\"</volTypes>\");\n return parts.join(\"\");\n}\n\n/** Parse the `<volTypes>` root element of xl/volTypes.xml. */\nexport function parseVolTypesEl(el: Element): VolTypeOptions[] {\n const volTypes: VolTypeOptions[] = [];\n for (const vt of el.elements ?? []) {\n if (vt.name !== \"volType\") continue;\n const volType: VolTypeOptions = {};\n const typeVal = attr(vt, \"type\");\n if (typeVal) volType.type = typeVal as VolTypeOptions[\"type\"];\n const mains: VolMainOptions[] = [];\n for (const m of vt.elements ?? []) {\n if (m.name !== \"main\") continue;\n const main: VolMainOptions = { first: attr(m, \"first\") ?? \"\" };\n const topics: VolTopicOptions[] = [];\n for (const tp of m.elements ?? []) {\n if (tp.name !== \"tp\") continue;\n const vEl = findChild(tp, \"v\");\n const topic: VolTopicOptions = { value: String(vEl?.elements?.[0]?.text ?? \"\") };\n const tVal = attr(tp, \"t\");\n if (tVal) topic.valueType = tVal;\n const stps: string[] = [];\n const refs: VolTopicRefOptions[] = [];\n for (const inner of tp.elements ?? []) {\n if (inner.name === \"stp\") stps.push(String(inner.elements?.[0]?.text ?? \"\"));\n if (inner.name === \"tr\") {\n const ref: VolTopicRefOptions = {\n reference: attr(inner, \"r\") ?? \"\",\n sheetIndex: attrNum(inner, \"s\") ?? 0,\n };\n refs.push(ref);\n }\n }\n if (stps.length > 0) topic.stringTopics = stps;\n if (refs.length > 0) topic.refs = refs;\n topics.push(topic);\n }\n if (topics.length > 0) main.topics = topics;\n mains.push(main);\n }\n if (mains.length > 0) volType.mains = mains;\n volTypes.push(volType);\n }\n return volTypes;\n}\n","/**\n * XLSX compile context — write and read contexts for the descriptor pipeline.\n *\n * @module\n */\n\nimport {\n ChartCollection,\n partPathToRelsPath,\n Relationships,\n resolveRelationshipTarget,\n type RelationshipType,\n} from \"@office-open/core\";\nimport type { HyperlinkTarget, ReadContext, WriteContext } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { SharedStrings } from \"@parts/shared-strings\";\nimport { Styles } from \"@parts/styles\";\nimport type { DxfOptions } from \"@parts/styles\";\nimport type { PivotCacheReference } from \"@parts/workbook\";\nimport type { RichTextOptions } from \"@parts/worksheet\";\nimport { Media, type MediaData } from \"@shared/media\";\n\nimport type { XlsxDocument } from \"./parse\";\n\n// ── Write Context ──\n\n/**\n * XLSX-specific write context.\n *\n * Holds mutable state that accumulates during the compile phase:\n * shared strings, styles, media, charts, content types, and relationships.\n */\nexport interface HyperlinkEntry {\n key: string;\n url: string;\n tooltip?: string;\n}\n\nexport class XlsxWriteContext implements WriteContext {\n sharedStrings = new SharedStrings();\n styles = new Styles();\n media = new Media<MediaData>();\n charts = new ChartCollection();\n workbookRels = new Relationships();\n pivotCacheRefs: PivotCacheReference[] = [];\n private _hyperlinks = new Map<string, HyperlinkEntry>();\n\n // ── WriteContext interface (core descriptor pipeline) ──\n\n public addRelationship(type: RelationshipType, target: string, _mode?: string): string {\n return `rId${this.workbookRels.add(type, target)}`;\n }\n\n public addMedia(data: Uint8Array, type: string): string {\n // Reached by DrawingML blip fills (drawing shape picture fill) via fillDesc.\n // Image anchors still register through ctx.media directly in the compiler\n // because they carry pixel dimensions; both land in the same collection.\n const entry = this.media.addMedia(data, type, (fileName) => ({\n fileName,\n type,\n data,\n width: 0,\n height: 0,\n }));\n return `{${entry.fileName}}`;\n }\n\n public addHyperlink(key: string, target: HyperlinkTarget): void {\n // XLSX has no slide concept; stringify is strict, so reject the slide leg\n // instead of silently dropping it.\n if (target.slide !== undefined) {\n throw new Error(\"xlsx text hyperlinks cannot target slides — use url instead\");\n }\n this._hyperlinks.set(key, { key, url: target.url ?? \"\", tooltip: target.tooltip });\n }\n\n /**\n * Register a differential format and return its dxfId.\n */\n public registerDxf(opts: DxfOptions): number {\n return this.styles.registerDxf(opts);\n }\n\n /** DrawingML text hyperlinks registered by drawing shape runs (placeholder key → entry). */\n public get hyperlinks(): HyperlinkEntry[] {\n return [...this._hyperlinks.values()];\n }\n}\n\n// ── Read Context ──\n\n/**\n * XLSX-specific read context.\n *\n * Wraps an {@link XlsxDocument} to implement the core {@link ReadContext}\n * interface used by the descriptor parse pipeline.\n */\nexport class XlsxReadContext implements ReadContext {\n /**\n * Parsed shared-string entries for resolving cell values. Rich-text entries\n * flow through as RichTextOptions objects so cells keep their structure\n * (cell.value accepts both shapes).\n */\n public readonly sharedStrings: (string | RichTextOptions)[];\n\n /**\n * Path of the part currently being parsed. rId numbering is per-part, so a\n * descriptor resolving a relationship mid-parse (a theme blip fill's\n * r:embed) must hit that part's own .rels, not the workbook's.\n */\n public currentPart = \"xl/workbook.xml\";\n private readonly partRels = new Map<string, Map<string, string>>();\n\n constructor(\n private xlsx: XlsxDocument,\n sharedStrings?: (string | RichTextOptions)[],\n ) {\n this.sharedStrings = sharedStrings ?? [];\n this.loadPartRels();\n }\n\n /** Index every `x/_rels/y.xml.rels` as y → (rId → resolved target path). */\n private loadPartRels(): void {\n for (const relsPath of this.xlsx.doc.keys()) {\n const idx = relsPath.lastIndexOf(\"/_rels/\");\n if (idx < 0 || !relsPath.endsWith(\".rels\")) continue;\n const partPath = `${relsPath.slice(0, idx)}/${relsPath.slice(idx + 7, -5)}`;\n const relsEl = this.xlsx.doc.get(relsPath);\n if (!relsEl?.elements) continue;\n const byId = new Map<string, string>();\n for (const child of relsEl.elements) {\n if (child.name !== \"Relationship\") continue;\n const id = child.attributes?.[\"Id\"] as string | undefined;\n const target = child.attributes?.[\"Target\"] as string | undefined;\n if (id && target) byId.set(id, resolveRelationshipTarget(partPath, target));\n }\n this.partRels.set(partPath, byId);\n }\n }\n\n /**\n * Run `fn` with `currentPart` temporarily set to `partPath`, restoring the\n * previous value afterwards — a sub-part parse (the theme) resolves its\n * relationship ids against that part's own rels.\n */\n public withPart<T>(partPath: string, fn: () => T): T {\n const prev = this.currentPart;\n this.currentPart = partPath;\n try {\n return fn();\n } finally {\n this.currentPart = prev;\n }\n }\n\n public resolveRelationship(rId: string): string | undefined {\n const scoped = this.partRels.get(this.currentPart)?.get(rId);\n if (scoped !== undefined) return scoped;\n const wbRels = this.xlsx.doc.get(\"xl/_rels/workbook.xml.rels\");\n if (!wbRels?.elements) return undefined;\n for (const child of wbRels.elements) {\n if (child.name !== \"Relationship\") continue;\n if (child.attributes?.[\"Id\"] === rId) {\n const target = child.attributes[\"Target\"] as string | undefined;\n if (!target) return undefined;\n return target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`;\n }\n }\n return undefined;\n }\n\n /**\n * Resolve a relationship rId from a worksheet-level rels file.\n * Worksheet rels paths: `xl/worksheets/sheet1.xml` → `xl/worksheets/_rels/sheet1.xml.rels`\n */\n public resolveWorksheetRel(wsPath: string, rId: string): string | undefined {\n return this.partRels.get(wsPath)?.get(rId);\n }\n\n /**\n * Get all relationships from a worksheet rels file matching a type fragment.\n * e.g. `getWorksheetRelsByType(path, \"/comments\")` returns all comment relationships.\n */\n public getWorksheetRelsByType(\n wsPath: string,\n typeFragment: string,\n ): Array<{ rId: string; target: string }> {\n const relsPath = partPathToRelsPath(wsPath);\n const rels = this.xlsx.doc.get(relsPath);\n if (!rels?.elements) return [];\n const result: Array<{ rId: string; target: string }> = [];\n for (const child of rels.elements) {\n if (child.name !== \"Relationship\") continue;\n const type = child.attributes?.[\"Type\"] as string | undefined;\n if (!type || !type.includes(typeFragment)) continue;\n const rId = child.attributes?.[\"Id\"] as string | undefined;\n const target = child.attributes?.[\"Target\"] as string | undefined;\n if (rId && target) {\n result.push({ rId, target: resolveRelationshipTarget(wsPath, target) });\n }\n }\n return result;\n }\n\n public getPart(path: string): Element | undefined {\n return this.xlsx.doc.get(path);\n }\n\n public getRaw(path: string): Uint8Array | undefined {\n return this.xlsx.doc.getRaw(path);\n }\n}\n","/**\n * XLSX parsing — parse .xlsx files into structured data.\n *\n * @module\n */\nimport {\n appPropertiesDesc,\n contentTypesDesc,\n convertToEmu,\n customPropertiesDesc,\n parseArchive,\n parseCorePropsElement,\n} from \"@office-open/core\";\nimport type { ParsedArchive } from \"@office-open/core\";\nimport {\n collectPassthroughParts,\n isEncryptedContainer,\n partPathToRelsPath,\n pickNonVisualDrawingProperties,\n resolveRelationshipTarget,\n toUint8Array,\n} from \"@office-open/core\";\nimport type { DataType } from \"@office-open/core\";\nimport { chartSpaceDesc } from \"@office-open/core/chart\";\nimport type { ReadContext } from \"@office-open/core/descriptor\";\nimport { themeDesc } from \"@office-open/core/theme\";\nimport type { Element } from \"@office-open/xml\";\nimport type { ParseOptions } from \"@office-open/xml\";\nimport { attr, findChild } from \"@office-open/xml\";\nimport { calcChainDesc } from \"@parts/calc-chain\";\nimport { chartsheetDesc } from \"@parts/chartsheet\";\nimport type { ChartsheetOptions } from \"@parts/chartsheet\";\nimport { commentsDesc, mergeNoteAnchors, vmlNotesDesc } from \"@parts/comments\";\nimport { connectionsDesc } from \"@parts/connection\";\nimport { dialogsheetDesc } from \"@parts/dialogsheet\";\nimport type { DialogsheetOptions } from \"@parts/dialogsheet\";\nimport { drawingDesc, pickAnchorOptions } from \"@parts/drawing\";\nimport { externalLinkDesc } from \"@parts/external-link\";\nimport type { ExternalLinkOptions } from \"@parts/external-link\";\nimport type { SharedWorkbookOptions, WorkbookOptions } from \"@parts/file\";\nimport { metadataDesc } from \"@parts/metadata\";\nimport { pivotCacheDefDesc, pivotCacheRecordsDesc } from \"@parts/pivot-cache\";\nimport type { PivotCacheDefParseResult, PivotCacheRecordsParseResult } from \"@parts/pivot-cache\";\nimport { queryTableDesc } from \"@parts/query-table\";\nimport type { QueryTableOptions } from \"@parts/query-table\";\nimport {\n revisionHeadersDesc,\n revisionLogDesc,\n usersDesc,\n type RevisionLogOptions,\n} from \"@parts/revision-log\";\nimport { sharedStringsDesc } from \"@parts/shared-strings\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { tableDesc } from \"@parts/table\";\nimport type { TableOptions } from \"@parts/table\";\nimport { parseVolTypesEl } from \"@parts/vol-types\";\nimport { workbookDesc } from \"@parts/workbook\";\nimport type { PivotCacheReference } from \"@parts/workbook\";\nimport type { RichTextOptions } from \"@parts/worksheet\";\nimport { worksheetDesc } from \"@parts/worksheet\";\nimport type {\n WorksheetChartOptions,\n WorksheetSmartArtOptions,\n PictureOptions,\n WorksheetOptions,\n} from \"@parts/worksheet\";\nimport { mapInfoDesc, singleXmlCellsDesc } from \"@parts/xml-mapping\";\nimport type { SingleXmlCellOptions } from \"@parts/xml-mapping\";\n\nimport { XlsxReadContext } from \"./context\";\n\nexport { parseArchive };\n\n// ── Low-level parse result ──\n\nexport interface XlsxPartRefs {\n worksheets: string[];\n charts: string[];\n media: string[];\n drawings: string[];\n}\n\nexport interface XlsxDocument {\n doc: ParsedArchive;\n /** xl/workbook.xml root element */\n workbook?: Element;\n /** Worksheet paths (xl/worksheets/sheet{n}.xml) */\n worksheets: string[];\n /** xl/styles.xml root element */\n styles?: Element;\n /** xl/sharedStrings.xml root element */\n sharedStrings?: Element;\n /** xl/theme/theme{n}.xml path (resolved from workbook rels) */\n theme?: string;\n partRefs: XlsxPartRefs;\n /** docProps/core.xml path */\n coreProps?: string;\n /** docProps/app.xml path */\n appProps?: string;\n /** docProps/custom.xml path */\n customProps?: string;\n}\n\nfunction sortByNumber(paths: string[]): string[] {\n return paths.sort((a, b) => {\n const numA = parseInt(a.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n const numB = parseInt(b.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n return numA - numB;\n });\n}\n\n/**\n * Worksheet parts read with sheetData deferred — the XML parser captures the\n * container's inner XML verbatim and `parseSheetDataRows` walks it directly.\n */\nconst WORKSHEET_PARSE_OPTIONS: ParseOptions = { deferElements: [\"sheetData\"] };\n\n/**\n * Parse raw .xlsx data into a low-level XlsxDocument.\n */\nexport function parseXlsx(data: DataType): XlsxDocument {\n const uint8 = toUint8Array(data);\n const doc = parseArchive(uint8);\n\n const workbook = doc.get(\"xl/workbook.xml\");\n const styles = doc.get(\"xl/styles.xml\");\n const sharedStrings = doc.get(\"xl/sharedStrings.xml\");\n\n // Resolve worksheet paths from workbook rels\n const worksheets: string[] = [];\n const charts: string[] = [];\n const drawings: string[] = [];\n const media: string[] = [];\n let theme: string | undefined;\n\n const wbRels = doc.get(\"xl/_rels/workbook.xml.rels\");\n if (wbRels) {\n for (const child of wbRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (!target) continue;\n\n if (type.includes(\"/worksheet\")) {\n worksheets.push(target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`);\n } else if (type.includes(\"/theme\")) {\n theme = target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`;\n }\n }\n }\n sortByNumber(worksheets);\n\n // Scan for drawings, charts, media\n drawings.push(...doc.keys(\"xl/drawings/\").filter((k) => k.endsWith(\".xml\")));\n charts.push(...doc.keys(\"xl/charts/\").filter((k) => k.endsWith(\".xml\")));\n media.push(...doc.keys(\"xl/media/\"));\n sortByNumber(drawings);\n sortByNumber(charts);\n\n // Root rels → core/app props\n let coreProps: string | undefined;\n let appProps: string | undefined;\n let customProps: string | undefined;\n const rootRels = doc.get(\"_rels/.rels\");\n if (rootRels) {\n for (const child of rootRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n // Transitional packages use the oclc URI form with camelCase segments\n // (…/extendedProperties); normalize case and hyphens so both resolve.\n const relType = type.toLowerCase().replaceAll(\"-\", \"\");\n if (relType.includes(\"/coreproperties\")) coreProps = target;\n else if (relType.includes(\"/extendedproperties\")) appProps = target;\n else if (relType.includes(\"/customproperties\")) customProps = target;\n }\n }\n\n return {\n doc,\n workbook,\n worksheets,\n styles,\n sharedStrings,\n theme,\n partRefs: { worksheets, charts, media, drawings },\n coreProps,\n appProps,\n customProps,\n };\n}\n\n// ── Shared strings helper ──\n\n/**\n * Parse a .xlsx file and convert it into WorkbookOptions.\n *\n * The returned options can be passed to `new Workbook(parsed)`.\n */\nexport function parseWorkbook(data: DataType): WorkbookOptions {\n // Encrypted package (OLE2/CFB container): the plaintext needs the password,\n // so carry the source bytes verbatim for generate() to re-emit.\n const uint8 = toUint8Array(data);\n if (isEncryptedContainer(uint8)) {\n return { encrypted: { data: uint8 } };\n }\n\n const xlsx = parseXlsx(uint8);\n\n const opts: Partial<WorkbookOptions> = {};\n\n // Core properties\n if (xlsx.coreProps) {\n const corePropsEl = xlsx.doc.get(xlsx.coreProps);\n if (corePropsEl) {\n const cp = parseCorePropsElement(corePropsEl);\n // Empty strings are meaningful (element present, text empty) — assign\n // the whole shape so they survive round-trip.\n Object.assign(opts, cp);\n }\n }\n\n // Extended (app) properties\n if (xlsx.appProps) {\n const appPropsEl = xlsx.doc.get(xlsx.appProps);\n if (appPropsEl) {\n const ap = appPropertiesDesc.parse(appPropsEl, {} as ReadContext);\n if (ap && Object.keys(ap).length > 0) opts.appProperties = ap;\n }\n }\n\n // Custom properties\n if (xlsx.customProps) {\n const customPropsEl = xlsx.doc.get(xlsx.customProps);\n if (customPropsEl) {\n const cp = customPropertiesDesc.parse(customPropsEl, {} as ReadContext);\n if (cp.properties?.length) opts.customProperties = cp.properties;\n }\n }\n\n // Shared strings — rich-text entries flow through as objects so both the\n // cell lookup and the rebuilt table keep their structure; generate() seeds\n // the write context from opts.sharedStrings to preserve si indices.\n let sstEntries: (string | RichTextOptions)[] = [];\n if (xlsx.sharedStrings) {\n sstEntries = sharedStringsDesc.parse(xlsx.sharedStrings, {} as never).entries;\n }\n if (sstEntries.length > 0) opts.sharedStrings = sstEntries;\n\n // Create read context for descriptor pipeline\n const readContext = new XlsxReadContext(xlsx, sstEntries);\n\n // Pivot cache definitions, keyed by part path — surfaced on\n // WorkbookOptions.pivotCaches for the model layer.\n const pivotCacheByPath = new Map<string, PivotCacheDefParseResult>();\n for (const key of xlsx.doc.keys(\"xl/pivotCache/\")) {\n if (!key.includes(\"pivotCacheDefinition\")) continue;\n const pcdEl = xlsx.doc.get(key);\n if (!pcdEl) continue;\n pivotCacheByPath.set(key, pivotCacheDefDesc.parse(pcdEl, readContext));\n }\n // workbook.xml pivotCaches: cacheId → rId reference chain.\n const pivotCacheRefs: PivotCacheReference[] = [];\n const wbPivotCaches = xlsx.workbook ? findChild(xlsx.workbook, \"pivotCaches\") : undefined;\n for (const pc of wbPivotCaches?.elements ?? []) {\n if (pc.name !== \"pivotCache\") continue;\n const cacheId = attr(pc, \"cacheId\");\n const rId = attr(pc, \"r:id\");\n if (cacheId === undefined || rId === undefined) continue;\n pivotCacheRefs.push({ cacheId: Number(cacheId), rId });\n }\n if (pivotCacheRefs.length > 0) opts.pivotCacheRefs = pivotCacheRefs;\n\n // Parse styles (fonts, fills, borders, cellXfs)\n if (xlsx.styles) {\n const parsedStyles = stylesDesc.parse(xlsx.styles, readContext);\n\n // Expose styles sections onto the returned opts for round-trip. The six\n // table sections fall back to [] so `undefined` keeps meaning \"fresh\n // document\" — an adopted table (even empty, e.g. a bare <styleSheet/>) is\n // distinct from the compiler's fresh-file defaults. fonts/fills/borders/\n // cellXfs/numFmts adopt the parsed table wholesale: cells then keep raw\n // style indices (the source's own numbering) instead of resolved\n // definitions — the SDK's Stylesheet model.\n if (parsedStyles.dxfs) opts.dxfs = parsedStyles.dxfs;\n opts.fonts = parsedStyles.fonts ?? [];\n opts.fills = parsedStyles.fills ?? [];\n opts.borders = parsedStyles.borders ?? [];\n opts.cellXfs = parsedStyles.cellXfs ?? [];\n if (parsedStyles.numFmts) opts.numFmts = parsedStyles.numFmts;\n if (parsedStyles.colors) opts.colors = parsedStyles.colors;\n // Optional sections: undefined (absent) stays absent; a present-but-empty\n // section round-trips as an empty container.\n if (parsedStyles.customCellStyles !== undefined)\n opts.cellStyles = parsedStyles.customCellStyles;\n if (parsedStyles.cellStyleXfs !== undefined) opts.cellStyleXfs = parsedStyles.cellStyleXfs;\n if (parsedStyles.styleExtensions) opts.styleExtensions = parsedStyles.styleExtensions;\n if (parsedStyles.tableStylesInfo)\n opts.tableStyles = parsedStyles.tableStylesInfo.tableStyles ?? [];\n }\n\n // Theme — structured round-trip so a custom source theme survives instead of\n // being replaced by the compiler's fresh default. Parsed under the theme\n // part's own rels scope so a blip fill's r:embed resolves to the theme's\n // image, not to whatever the workbook rels hide under the same rId.\n if (xlsx.theme) {\n const themeEl = xlsx.doc.get(xlsx.theme);\n if (themeEl) {\n const themeOptions = readContext.withPart(xlsx.theme, () =>\n themeDesc.parse(themeEl, readContext),\n );\n if (themeOptions) opts.theme = themeOptions;\n }\n }\n\n // Parse workbook via descriptor for richer data\n let sheetNames: string[] = [];\n let sheetIds: number[] = [];\n let sheetStates: Array<\"visible\" | \"hidden\" | \"veryHidden\" | undefined> = [];\n if (xlsx.workbook) {\n const wbData = workbookDesc.parse(xlsx.workbook, readContext);\n if (wbData.sheets) {\n sheetNames = wbData.sheets.map((s) => s.name);\n sheetIds = wbData.sheets.map((s) => s.sheetId);\n sheetStates = wbData.sheets.map((s) => s.state);\n }\n\n // Workbook-level properties\n if (wbData.protection) opts.workbookProtection = wbData.protection;\n if (wbData.bookView) opts.bookView = wbData.bookView;\n if (wbData.calcPr) opts.calcPr = wbData.calcPr;\n if (wbData.oleSize) opts.oleSize = wbData.oleSize;\n if (wbData.customViews) opts.customWorkbookViews = wbData.customViews;\n if (wbData.fileRecoveryPr) opts.fileRecoveryPr = wbData.fileRecoveryPr;\n if (wbData.functionGroups) opts.functionGroups = wbData.functionGroups;\n if (wbData.webPublishing) opts.webPublishing = wbData.webPublishing;\n if (wbData.fileSharing) opts.fileSharing = wbData.fileSharing;\n if (wbData.workbookPr) opts.workbookPr = wbData.workbookPr;\n if (wbData.webPublishObjects) opts.webPublishObjects = wbData.webPublishObjects;\n if (wbData.definedNames) opts.definedNames = wbData.definedNames;\n if (wbData.absPath !== undefined) opts.absPath = wbData.absPath;\n if (wbData.revisionPtr) opts.revisionPtr = wbData.revisionPtr;\n if (wbData.extensions) opts.extensions = wbData.extensions;\n }\n\n // Parse worksheets using descriptor pipeline. Worksheet parts defer\n // sheetData — the row scanner walks the captured inner XML, skipping the\n // per-cell Element tree (the dominant allocation cost on large sheets).\n const worksheets: WorksheetOptions[] = [];\n for (const [i, wsPath] of xlsx.worksheets.entries()) {\n const wsEl = xlsx.doc.get(wsPath, WORKSHEET_PARSE_OPTIONS);\n if (!wsEl) continue;\n\n const wsOpts = worksheetDesc.parse(wsEl, readContext);\n if (sheetNames[i]) wsOpts.name = sheetNames[i];\n if (sheetIds[i] !== undefined) wsOpts.sheetId = sheetIds[i];\n if (sheetStates[i]) wsOpts.state = sheetStates[i];\n\n // ── Resolve sub-parts via worksheet relationships ──\n\n // Comments\n const commentRels = readContext.getWorksheetRelsByType(wsPath, \"/comments\");\n for (const cr of commentRels) {\n const commentEl = xlsx.doc.get(cr.target);\n if (!commentEl) continue;\n const commentData = commentsDesc.parse(commentEl, readContext);\n if (commentData.comments) {\n wsOpts.comments = commentData.comments;\n break; // one comments file per worksheet\n }\n }\n\n // Note anchors (vmlDrawing) — merge per-note placement into the comments\n // so custom position/size/visibility survive the round-trip.\n const vmlRels = readContext.getWorksheetRelsByType(wsPath, \"/vmlDrawing\");\n for (const vr of vmlRels) {\n const vmlEl = xlsx.doc.get(vr.target);\n if (!vmlEl) continue;\n mergeNoteAnchors(wsOpts.comments, vmlNotesDesc.parse(vmlEl, readContext));\n break; // one vmlDrawing per worksheet\n }\n\n // Drawings (images + charts)\n const drawingRels = readContext.getWorksheetRelsByType(wsPath, \"/drawing\");\n for (const dr of drawingRels) {\n const drawingEl = xlsx.doc.get(dr.target);\n if (!drawingEl) continue;\n // cNvPr hyperlinks (a:hlinkClick) resolve through the drawing part's own\n // rels: internal targets resolve against the part path, External ones\n // (absolute URLs) stay verbatim. Fall back to the workbook context.\n const drawingRelById = new Map<string, { target: string; mode?: string }>();\n const drawingRelsEl = xlsx.doc.get(partPathToRelsPath(dr.target));\n for (const rel of drawingRelsEl?.elements ?? []) {\n if (rel.name !== \"Relationship\") continue;\n const id = rel.attributes?.[\"Id\"];\n const target = rel.attributes?.[\"Target\"];\n if (id === undefined || target === undefined) continue;\n const mode =\n rel.attributes?.[\"TargetMode\"] !== undefined\n ? String(rel.attributes[\"TargetMode\"])\n : undefined;\n drawingRelById.set(String(id), { target: String(target), mode });\n }\n const drawingCtx: ReadContext = {\n resolveRelationship: (rid) => {\n const rel = drawingRelById.get(rid);\n if (!rel) return readContext.resolveRelationship(rid);\n return rel.mode === \"External\"\n ? rel.target\n : resolveRelationshipTarget(dr.target, rel.target);\n },\n getPart: (path) => readContext.getPart(path),\n getRaw: (path) => readContext.getRaw(path),\n };\n const drawingData = drawingDesc.parse(drawingEl, drawingCtx);\n // drawingDesc.parse yields CT-layer anchors (rId-anchored DrawingImage/\n // DrawingChart); bridge them to the user-layer shapes the compiler\n // consumes: image bytes are read back through the drawing's image\n // relationships, chart parts through the core chartSpace descriptor.\n if (drawingData.images) {\n const images: PictureOptions[] = [];\n for (const image of drawingData.images) {\n // Linked source (a:blip @r:link): only an External relationship\n // carries a usable URL; internal link targets have no media part.\n const linkRel = image.linkRId ? drawingRelById.get(image.linkRId) : undefined;\n const sourceUrl = linkRel?.mode === \"External\" ? linkRel.target : undefined;\n const mediaPath = image.rId\n ? readContext.resolveWorksheetRel(dr.target, image.rId)\n : undefined;\n const raw = mediaPath ? xlsx.doc.getRaw(mediaPath) : undefined;\n const ext = mediaPath?.split(\".\").pop();\n if (\n !raw ||\n (ext !== \"png\" && ext !== \"jpeg\" && ext !== \"jpg\" && ext !== \"wmf\" && ext !== \"emf\")\n ) {\n // Linked-only picture (no bytes in the package): keep the URL,\n // derive the type token from it (png fallback for extension-less).\n if (sourceUrl !== undefined) {\n const linkExt = sourceUrl.split(\".\").pop()?.toLowerCase() ?? \"\";\n images.push({\n type:\n linkExt === \"wmf\"\n ? \"wmf\"\n : linkExt === \"emf\"\n ? \"emf\"\n : linkExt === \"jpg\" || linkExt === \"jpeg\"\n ? \"jpg\"\n : \"png\",\n sourceUrl,\n ...pickAnchorOptions(image),\n name: image.name,\n description: image.description,\n title: image.title,\n hidden: image.hidden,\n ...(image.spPr ? { spPr: image.spPr } : {}),\n ...(image.blackWhiteMode ? { blackWhiteMode: image.blackWhiteMode } : {}),\n ...(image.sourceRectangle ? { sourceRectangle: image.sourceRectangle } : {}),\n ...(image.preferRelativeResize !== undefined\n ? { preferRelativeResize: image.preferRelativeResize }\n : {}),\n ...(image.blipEffects ? { blipEffects: image.blipEffects } : {}),\n ...(image.useLocalDpi !== undefined ? { useLocalDpi: image.useLocalDpi } : {}),\n ...(image.blipExt !== undefined ? { blipExt: image.blipExt } : {}),\n ...(image.locking ? { locking: image.locking } : {}),\n ...(image.hyperlink ? { hyperlink: image.hyperlink } : {}),\n ...(image.zOrder !== undefined ? { zOrder: image.zOrder } : {}),\n ...(image.shapeId !== undefined ? { shapeId: image.shapeId } : {}),\n });\n }\n continue;\n }\n // WMF/EMF clip-art images round-trip like raster ones (the media\n // store keeps their bytes and extension verbatim).\n const type =\n ext === \"png\" ? \"png\" : ext === \"wmf\" ? \"wmf\" : ext === \"emf\" ? \"emf\" : \"jpg\";\n images.push({\n data: raw,\n type,\n ...(sourceUrl !== undefined ? { sourceUrl } : {}),\n ...pickAnchorOptions(image),\n name: image.name,\n description: image.description,\n title: image.title,\n hidden: image.hidden,\n ...(image.spPr ? { spPr: image.spPr } : {}),\n ...(image.blackWhiteMode ? { blackWhiteMode: image.blackWhiteMode } : {}),\n ...(image.sourceRectangle ? { sourceRectangle: image.sourceRectangle } : {}),\n ...(image.preferRelativeResize !== undefined\n ? { preferRelativeResize: image.preferRelativeResize }\n : {}),\n ...(image.blipEffects ? { blipEffects: image.blipEffects } : {}),\n ...(image.useLocalDpi !== undefined ? { useLocalDpi: image.useLocalDpi } : {}),\n ...(image.blipExt !== undefined ? { blipExt: image.blipExt } : {}),\n ...(image.locking ? { locking: image.locking } : {}),\n ...(image.hyperlink ? { hyperlink: image.hyperlink } : {}),\n ...(image.zOrder !== undefined ? { zOrder: image.zOrder } : {}),\n ...(image.shapeId !== undefined ? { shapeId: image.shapeId } : {}),\n });\n }\n if (images.length > 0) wsOpts.images = images;\n }\n if (drawingData.charts) {\n const charts: WorksheetChartOptions[] = [];\n for (const anchor of drawingData.charts) {\n const chartPath = readContext.resolveWorksheetRel(dr.target, anchor.rId);\n const chartEl = chartPath ? xlsx.doc.get(chartPath) : undefined;\n if (!chartEl) continue;\n const chartSpace = chartSpaceDesc.parse(chartEl, readContext);\n // cNvPr @title stays unbridged (same rule as the compiler leg):\n // WorksheetChartOptions.title is the chart title, not the frame's.\n const chartCnvPr = pickNonVisualDrawingProperties(anchor);\n delete chartCnvPr.title;\n charts.push({\n ...chartSpace,\n ...pickAnchorOptions(anchor),\n ...chartCnvPr,\n ...(anchor.frameLocks ? { frameLocks: anchor.frameLocks } : {}),\n ...(anchor.macro !== undefined ? { macro: anchor.macro } : {}),\n ...(anchor.hyperlink ? { hyperlink: anchor.hyperlink } : {}),\n ...(anchor.zOrder !== undefined ? { zOrder: anchor.zOrder } : {}),\n ...(anchor.shapeId !== undefined ? { shapeId: anchor.shapeId } : {}),\n });\n }\n if (charts.length > 0) wsOpts.charts = charts;\n }\n if (drawingData.smartArts) {\n const smartArts: WorksheetSmartArtOptions[] = [];\n for (const anchor of drawingData.smartArts) {\n // The diagram parts themselves pass through verbatim; carry their\n // package-absolute paths so the compiler can re-wire the drawing rels.\n const dataPath = readContext.resolveWorksheetRel(dr.target, anchor.dataRId);\n const layoutPath = readContext.resolveWorksheetRel(dr.target, anchor.layoutRId);\n const quickStylePath = readContext.resolveWorksheetRel(dr.target, anchor.quickStyleRId);\n const colorsPath = readContext.resolveWorksheetRel(dr.target, anchor.colorsRId);\n if (!dataPath || !layoutPath || !quickStylePath || !colorsPath) continue;\n smartArts.push({\n ...pickAnchorOptions(anchor),\n ...pickNonVisualDrawingProperties(anchor),\n dataPath,\n layoutPath,\n quickStylePath,\n colorsPath,\n ...(anchor.frameLocks ? { frameLocks: anchor.frameLocks } : {}),\n ...(anchor.macro !== undefined ? { macro: anchor.macro } : {}),\n ...(anchor.zOrder !== undefined ? { zOrder: anchor.zOrder } : {}),\n ...(anchor.shapeId !== undefined ? { shapeId: anchor.shapeId } : {}),\n });\n }\n if (smartArts.length > 0) wsOpts.smartArts = smartArts;\n }\n // Shapes/connectors/groups pass through unchanged (no media bridge).\n if (drawingData.shapes) wsOpts.shapes = drawingData.shapes;\n if (drawingData.connectors) wsOpts.connectors = drawingData.connectors;\n if (drawingData.groups) wsOpts.groups = drawingData.groups;\n break;\n }\n\n // Background picture — the worksheet-level image relationship backs the\n // <picture r:id/> element (drawing images live in the drawing part's own\n // rels, so worksheet-level image rels are backgrounds only).\n const bgRels = readContext.getWorksheetRelsByType(wsPath, \"/image\");\n for (const bg of bgRels) {\n const raw = xlsx.doc.getRaw(bg.target);\n const ext = bg.target.split(\".\").pop();\n if (!raw || (ext !== \"png\" && ext !== \"jpeg\" && ext !== \"jpg\")) continue;\n wsOpts.backgroundImage = { data: raw, type: ext === \"png\" ? \"png\" : \"jpg\" };\n break; // one background picture per worksheet\n }\n\n // Tables\n const tableRels = readContext.getWorksheetRelsByType(wsPath, \"/table\");\n if (tableRels.length > 0) {\n const tables: TableOptions[] = [];\n for (const tr of tableRels) {\n const tableEl = xlsx.doc.get(tr.target);\n if (!tableEl) continue;\n // The /table relationship also targets XML Map parts (singleXmlCells)\n // whose root is not a table — skip anything else instead of feeding\n // an unmodeled part through the table descriptor.\n if (tableEl.name !== \"table\") continue;\n const tableData = tableDesc.parse(tableEl, readContext);\n tables.push(tableData);\n }\n if (tables.length > 0) wsOpts.tables = tables;\n }\n\n // Query tables\n const queryTableRels = readContext.getWorksheetRelsByType(wsPath, \"/queryTable\");\n if (queryTableRels.length > 0) {\n const queryTables: QueryTableOptions[] = [];\n for (const qtr of queryTableRels) {\n const qtEl = xlsx.doc.get(qtr.target);\n if (!qtEl) continue;\n queryTables.push(queryTableDesc.parse(qtEl, readContext));\n }\n if (queryTables.length > 0) wsOpts.queryTables = queryTables;\n }\n\n // Single-cell XML tables\n const singleXmlCellRels = readContext.getWorksheetRelsByType(wsPath, \"/tableSingleCells\");\n if (singleXmlCellRels.length > 0) {\n const singleXmlCells: SingleXmlCellOptions[] = [];\n for (const sxr of singleXmlCellRels) {\n const sxEl = xlsx.doc.get(sxr.target);\n if (!sxEl) continue;\n singleXmlCells.push(...singleXmlCellsDesc.parse(sxEl, readContext).cells);\n }\n if (singleXmlCells.length > 0) wsOpts.singleXmlCells = singleXmlCells;\n }\n\n // Pivot tables — rebuild the user-layer shape from the CT-layer parse\n // result: field indices resolve against the cache definition's field\n // names, the data range against its worksheetSource.\n // PivotTable parts are NOT absorbed into the model here: the authoring\n // model (source ref + field-name rows/columns/data) is a lossy projection\n // that the compiler would rebuild from, reinterpreting the source. A\n // round-tripped pivot table stays in the verbatim passthrough set —\n // sheet-level pivotTable relationships re-attach via passthrough rels.\n\n // Resolve external hyperlink URLs\n const hyperlinks = wsOpts.hyperlinks;\n if (hyperlinks) {\n for (const hl of hyperlinks) {\n if (hl.url !== undefined) {\n const resolved = readContext.resolveWorksheetRel(wsPath, hl.url);\n if (resolved) hl.url = resolved;\n }\n }\n }\n\n worksheets.push(wsOpts as WorksheetOptions);\n }\n\n opts.worksheets = worksheets;\n\n // Chartsheets — parse chartsheet parts. Sort numerically: doc.keys() yields\n // ZIP entry order, while sheetNames indexes rely on sheetN.xml numbering.\n const chartsheetPaths = sortByNumber(\n xlsx.doc.keys(\"xl/chartsheets/\").filter((k) => k.endsWith(\".xml\")),\n );\n if (chartsheetPaths.length > 0) {\n const chartsheets: ChartsheetOptions[] = [];\n for (const [i, csPath] of chartsheetPaths.entries()) {\n const csEl = xlsx.doc.get(csPath);\n if (!csEl) continue;\n const csData = chartsheetDesc.parse(csEl, readContext);\n if (sheetNames[worksheets.length + i]) csData.name = sheetNames[worksheets.length + i];\n if (sheetIds[worksheets.length + i] !== undefined)\n csData.sheetId = sheetIds[worksheets.length + i]!;\n if (sheetStates[worksheets.length + i]) csData.state = sheetStates[worksheets.length + i];\n // The chart itself lives in a drawing part — bridge it back through the\n // core chartSpace descriptor into the simplified chartsheet chart shape.\n const csDrawingRels = readContext.getWorksheetRelsByType(csPath, \"/drawing\");\n outer: for (const dr of csDrawingRels) {\n const drawingEl = xlsx.doc.get(dr.target);\n if (!drawingEl) continue;\n const drawingData = drawingDesc.parse(drawingEl, readContext);\n for (const anchor of drawingData.charts ?? []) {\n const chartPath = readContext.resolveWorksheetRel(dr.target, anchor.rId);\n const chartEl = chartPath ? xlsx.doc.get(chartPath) : undefined;\n if (!chartEl) continue;\n // Full chartSpace passthrough — the simplified type/title/series\n // projection dropped chartSpace-level fidelity (c:lang, c:date1904,\n // axis/plot formatting, …) on round-trip.\n csData.chart = chartSpaceDesc.parse(chartEl, readContext);\n if (anchor.macro !== undefined) csData.macro = anchor.macro;\n if (anchor.frameLocks) csData.frameLocks = anchor.frameLocks;\n // Anchor geometry is the rendered chart size on the sheet — Excel\n // keeps it verbatim on save, so round-trip must not fall back to the\n // full-page default. The drawing fields accept UniversalMeasure;\n // chartsheet anchors are plain EMU numbers.\n if (anchor.absoluteX !== undefined) csData.absoluteX = convertToEmu(anchor.absoluteX);\n if (anchor.absoluteY !== undefined) csData.absoluteY = convertToEmu(anchor.absoluteY);\n if (anchor.extentCx !== undefined) csData.extentCx = convertToEmu(anchor.extentCx);\n if (anchor.extentCy !== undefined) csData.extentCy = convertToEmu(anchor.extentCy);\n if (anchor.shapeId !== undefined) csData.shapeId = anchor.shapeId;\n break outer;\n }\n }\n chartsheets.push(csData);\n }\n if (chartsheets.length > 0) opts.chartsheets = chartsheets;\n }\n\n // Dialogsheets — parse legacy dialog sheet parts\n const dialogsheetPaths = xlsx.doc.keys(\"xl/dialogSheets/\").filter((k) => k.endsWith(\".xml\"));\n if (dialogsheetPaths.length > 0) {\n const dialogsheets: DialogsheetOptions[] = [];\n for (const dsPath of dialogsheetPaths) {\n const dsEl = xlsx.doc.get(dsPath);\n if (!dsEl) continue;\n const dsData = dialogsheetDesc.parse(dsEl, readContext);\n dialogsheets.push(dsData);\n }\n if (dialogsheets.length > 0) opts.dialogsheets = dialogsheets;\n }\n\n // Pivot cache definitions (parsed into pivotCacheByPath above) and records\n if (pivotCacheByPath.size > 0) {\n opts.pivotCaches = [...pivotCacheByPath.values()];\n }\n\n const pivotCacheRecPaths = xlsx.doc\n .keys(\"xl/pivotCache/\")\n .filter((k) => k.includes(\"pivotCacheRecords\"));\n if (pivotCacheRecPaths.length > 0) {\n const pivotCacheRecords: PivotCacheRecordsParseResult[] = [];\n for (const pcrPath of pivotCacheRecPaths) {\n const pcrEl = xlsx.doc.get(pcrPath);\n if (!pcrEl) continue;\n const pcrData = pivotCacheRecordsDesc.parse(pcrEl, readContext);\n pivotCacheRecords.push(pcrData);\n }\n if (pivotCacheRecords.length > 0) opts.pivotCacheRecords = pivotCacheRecords;\n }\n\n // Calculation chain\n const calcChainEl = xlsx.doc.get(\"xl/calcChain.xml\");\n if (calcChainEl) {\n const calcData = calcChainDesc.parse(calcChainEl, readContext);\n if (calcData.cells) opts.calcChain = calcData.cells;\n }\n\n // Connections (xl/connections.xml)\n const connectionsEl = xlsx.doc.get(\"xl/connections.xml\");\n if (connectionsEl) {\n const connData = connectionsDesc.parse(connectionsEl, readContext);\n if (connData.connections.length > 0) opts.connections = connData.connections;\n }\n\n // Rich metadata (xl/metadata.xml)\n const metadataEl = xlsx.doc.get(\"xl/metadata.xml\");\n if (metadataEl) {\n const metadataData = metadataDesc.parse(metadataEl, readContext);\n opts.metadata = metadataData;\n }\n\n // XML mappings (xl/xmlMaps.xml)\n const xmlMapsEl = xlsx.doc.get(\"xl/xmlMaps.xml\");\n if (xmlMapsEl) {\n opts.xmlMaps = mapInfoDesc.parse(xmlMapsEl, readContext);\n }\n\n // Volatile function types (xl/volTypes.xml)\n const volTypesEl = xlsx.doc.get(\"xl/volTypes.xml\");\n if (volTypesEl) {\n const volTypes = parseVolTypesEl(volTypesEl);\n if (volTypes.length > 0) opts.volTypes = volTypes;\n }\n\n // External links\n const extLinkPaths = xlsx.doc.keys(\"xl/externalLinks/\").filter((k) => k.endsWith(\".xml\"));\n if (extLinkPaths.length > 0) {\n const externalLinks: ExternalLinkOptions[] = [];\n for (const elPath of extLinkPaths) {\n const elEl = xlsx.doc.get(elPath);\n if (!elEl) continue;\n const elData = externalLinkDesc.parse(elEl, readContext);\n\n // Resolve the external book target from the sibling rels file\n // (xl/externalLinks/_rels/externalLinkN.xml.rels), which compiler.ts writes.\n if (elData.externalBook) {\n const relsPath = partPathToRelsPath(elPath);\n const relsEl = xlsx.doc.get(relsPath);\n if (relsEl) {\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n if (!type.includes(\"/externalLinkPath\")) continue;\n const target = attr(child, \"Target\");\n if (target) {\n elData.externalBook.target = target;\n break;\n }\n }\n }\n }\n\n externalLinks.push(elData);\n }\n if (externalLinks.length > 0) opts.externalLinks = externalLinks;\n }\n\n // Shared-workbook revisions: workbook.xml.rels → revisionHeaders/users;\n // revisionHeaders.xml.rels → per-header revision logs.\n const wbRelsEl2 = xlsx.doc.get(\"xl/_rels/workbook.xml.rels\");\n let revHeadersTarget: string | undefined;\n let usersTarget: string | undefined;\n if (wbRelsEl2) {\n for (const child of wbRelsEl2.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (type.includes(\"/revisionHeaders\")) revHeadersTarget = target;\n else if (type.includes(\"/users\")) usersTarget = target;\n }\n }\n if (revHeadersTarget) {\n const headersPath = revHeadersTarget.startsWith(\"/\")\n ? revHeadersTarget.slice(1)\n : `xl/${revHeadersTarget}`;\n const headersEl = xlsx.doc.get(headersPath);\n if (headersEl) {\n const headers = revisionHeadersDesc.parse(headersEl, readContext);\n const logs: RevisionLogOptions[] = [];\n const revHeadersRelsEl = xlsx.doc.get(partPathToRelsPath(headersPath));\n if (revHeadersRelsEl) {\n for (const child of revHeadersRelsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n if (!(attr(child, \"Type\") ?? \"\").includes(\"/revisionLog\")) continue;\n const t = attr(child, \"Target\");\n if (!t) continue;\n const logEl = xlsx.doc.get(t.startsWith(\"/\") ? t.slice(1) : `xl/${t}`);\n if (logEl) logs.push(revisionLogDesc.parse(logEl, readContext));\n }\n }\n const revisionLog: SharedWorkbookOptions = { headers, logs };\n if (usersTarget) {\n const usersEl = xlsx.doc.get(\n usersTarget.startsWith(\"/\") ? usersTarget.slice(1) : `xl/${usersTarget}`,\n );\n if (usersEl) {\n const users = usersDesc.parse(usersEl, readContext);\n if (users.users) revisionLog.users = users;\n }\n }\n opts.revisionLog = revisionLog;\n }\n }\n\n // Package-wide passthrough (SDK ExtendedPart analogue): every part the model\n // did NOT absorb is carried verbatim instead of dropped. Only parts the\n // compiler always re-emits are excluded — model-driven parts (themes,\n // sharedStrings, drawings, VML, external links) pass through and yield to\n // the compiler's own output at the same path by assembly order.\n const rebuilt: string[] = [\n \"xl/workbook.xml\",\n \"xl/_rels/workbook.xml.rels\",\n ...(xlsx.styles ? [\"xl/styles.xml\"] : []),\n ...(xlsx.coreProps ? [xlsx.coreProps] : []),\n ...(xlsx.appProps ? [xlsx.appProps] : []),\n ...(xlsx.customProps ? [xlsx.customProps] : []),\n ...xlsx.worksheets,\n ...chartsheetPaths,\n ...dialogsheetPaths,\n ];\n const { parts: passthroughParts, relationships: passthroughRels } = collectPassthroughParts(\n xlsx.doc,\n rebuilt,\n );\n if (passthroughParts.length > 0) opts.rawParts = passthroughParts;\n if (passthroughRels.length > 0) opts.passthroughRelationships = passthroughRels;\n\n // Source content-type declarations — the compiler keeps them as the base\n // table so round-trip preserves the Default/Override split as written.\n const sourceContentTypes = xlsx.doc.get(\"[Content_Types].xml\");\n if (sourceContentTypes) {\n const ct = contentTypesDesc.parse(sourceContentTypes, {} as ReadContext);\n if (ct) opts.contentTypes = ct;\n }\n\n return opts as WorkbookOptions;\n}\n","/**\n * XLSX patching — replace placeholders in existing .xlsx files.\n *\n * Unlike DOCX/PPTX (paragraph-based), XLSX patching targets cell values:\n * - String-valued patches substitute the placeholder text in place (shared\n * strings table or inline strings).\n * - Non-string-valued patches (number / boolean / Date) whose placeholder is\n * the entire cell content rewrite the cell to a typed value with the correct\n * cell type (`t`), so the result is a real number/boolean/date cell — not a\n * stringified copy.\n *\n * @module\n */\nimport {\n OoxmlMimeType,\n appendContentType,\n appendOverride,\n appendRelationship,\n applyCorePropertiesOverride,\n getNextRelationshipIndex,\n nextNumericId,\n partPathToRelsPath,\n removeOverride,\n strFromU8,\n toJson,\n unzipSync,\n zipAndConvert,\n} from \"@office-open/core\";\nimport type { BasePatchOptions, OutputByType, OutputType } from \"@office-open/core\";\nimport { toUint8Array } from \"@office-open/core\";\nimport type { ReadContext, WriteContext } from \"@office-open/core/descriptor\";\nimport { OOXML_XML_DECLARATION } from \"@office-open/xml\";\nimport { stringify } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { commentsDesc, vmlNotesDesc } from \"@parts/comments\";\nimport { SharedStrings, sharedStringsDesc } from \"@parts/shared-strings\";\nimport { buildWorksheetXml, stripWorksheetPlaceholders } from \"@parts/worksheet\";\nimport type { CommentOptions, WorksheetOptions } from \"@parts/worksheet\";\nimport { dateToSerialNumber } from \"@util/index\";\n\n/** Reusable TextEncoder (stateless, safe to share). */\nconst encoder = new TextEncoder();\n\n/** Scalar cell value accepted by {@link patchWorkbook}. */\nexport type ScalarValue = string | number | boolean | Date;\n\n/** A patch value is just a scalar. */\nexport type Patch = ScalarValue;\n\nexport interface PatchWorkbookOptions<T extends OutputType = OutputType> extends BasePatchOptions<\n T,\n ScalarValue\n> {\n /**\n * Worksheet collection edits. The shared-strings table is rebuilt from the\n * template first, so appended/replaced worksheets continue indexing strings\n * at the correct offset. Cell styles are not supported on appended rows —\n * reference only styles already present in the template.\n */\n worksheets?: {\n /** Replace worksheets keyed by sheet name (as declared in workbook.xml). */\n replace?: Readonly<Record<string, WorksheetOptions>>;\n /** Append worksheets after the last existing sheet. */\n append?: Readonly<WorksheetOptions[]>;\n /** Remove worksheets by name (as declared in workbook.xml). */\n remove?: readonly string[];\n };\n /**\n * Cell comments (notes) to append per worksheet. Existing comments on the\n * target worksheet are merged — parsed, extended with the new entries, and\n * re-serialized. Keyed by worksheet name (as declared in workbook.xml).\n */\n comments?: Readonly<Record<string, CommentOptions[]>>;\n}\n\nconst WORKSHEET_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\";\nconst WORKSHEET_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\";\nconst COMMENTS_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\";\nconst VML_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\";\nconst COMMENTS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\";\nconst VML_CONTENT_TYPE = \"application/vnd.openxmlformats-officedocument.vmlDrawing\";\n\n/**\n * sharedStringsDesc.parse ignores its context, but its signature requires a\n * {@link ReadContext}. This stub satisfies the type without pulling in parse\n * machinery the patch path does not need.\n */\nconst STUB_READ_CTX: ReadContext = {\n resolveRelationship: () => undefined,\n getPart: () => undefined,\n getRaw: () => undefined,\n};\n\n/** Human-readable form for string-substitution (mixed-text) fallback. */\nconst toDisplayString = (value: Exclude<ScalarValue, string>): string => {\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (value instanceof Date) return value.toISOString().split(\"T\")[0] ?? \"\";\n return String(value);\n};\n\n/**\n * Patch an existing .xlsx workbook by replacing placeholder text in cells.\n *\n * @publicApi\n */\nexport const patchWorkbook = async <T extends OutputType = OutputType>({\n outputType,\n data,\n placeholders,\n findReplace,\n coreProperties,\n worksheets,\n comments,\n placeholderDelimiters = { start: \"{{\", end: \"}}\" } as const,\n}: PatchWorkbookOptions<T>): Promise<OutputByType[T]> => {\n const { start, end } = placeholderDelimiters;\n if (!start.trim() || !end.trim()) {\n throw new Error(\"Both start and end delimiters must be non-empty strings.\");\n }\n\n const zipContent = unzipSync(toUint8Array(data));\n\n const xmlMap = new Map<string, Element>();\n const binaryMap = new Map<string, Uint8Array>();\n // VML parts are text XML under a .vml extension — kept out of xmlMap (which\n // only holds .xml/.rels) and serialized as raw text at the end.\n const vmlFiles = new Map<string, string>();\n\n // Separate XML files from binary files\n for (const [key, value] of Object.entries(zipContent)) {\n if (key.endsWith(\".xml\") || key.endsWith(\".rels\")) {\n xmlMap.set(key, toJson(strFromU8(value)));\n } else {\n binaryMap.set(key, value);\n }\n }\n\n // Unified patch map: placeholders are delimiter-wrapped, findReplace keys are\n // literal strings. Both feed the same Pass A (typed cells) / Pass B (text) engine.\n const patchMap = new Map<string, ScalarValue>();\n if (placeholders) {\n for (const [key, value] of Object.entries(placeholders)) {\n patchMap.set(`${start}${key}${end}`, value);\n }\n }\n if (findReplace) {\n for (const [key, value] of Object.entries(findReplace)) {\n patchMap.set(key, value);\n }\n }\n\n const sharedStrings = xmlMap.get(\"xl/sharedStrings.xml\");\n const sharedTextByIndex = buildSharedTextIndex(sharedStrings);\n\n const worksheetKeys = Object.keys(zipContent).filter(\n (k) => k.startsWith(\"xl/worksheets/sheet\") && k.endsWith(\".xml\"),\n );\n\n // Pass A: rewrite pure placeholder cells to typed values (number / boolean / Date)\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (ws) rewriteTypedCells(ws, patchMap, sharedTextByIndex);\n }\n\n // Pass B: text substitution in shared strings + inline strings\n // (string-valued patches, plus non-string patches embedded in mixed text)\n if (sharedStrings) patchSharedStrings(sharedStrings, patchMap);\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (!ws) continue;\n patchWorksheetInlineStrings(ws, patchMap);\n // Pass C: print headers/footers (oddHeader/oddFooter/… literal text)\n patchHeaderFooter(ws, patchMap);\n }\n\n // Worksheet collection edits — rebuild shared strings first so appended/\n // replaced worksheets continue indexing at the right offset, then serialize.\n // Removal runs last: replace addresses the original sheet list, which the\n // removals (dropping entries) would otherwise change.\n if (worksheets) {\n const sharedStrings = rebuildSharedStrings(xmlMap);\n if (worksheets.replace) {\n for (const [name, wsOpts] of Object.entries(worksheets.replace)) {\n replaceWorksheetInMap(xmlMap, name, wsOpts, sharedStrings);\n }\n }\n if (worksheets.append) {\n for (const wsOpts of worksheets.append) {\n appendWorksheetToMap(xmlMap, wsOpts, sharedStrings);\n }\n }\n rewriteSharedStrings(xmlMap, sharedStrings);\n if (worksheets.remove) {\n removeWorksheetsFromMap(xmlMap, worksheets.remove);\n }\n }\n\n // Cell comments — append per worksheet, merging with any existing comments.\n if (comments) {\n for (const [sheetName, commentOpts] of Object.entries(comments)) {\n appendCommentsToMap(xmlMap, vmlFiles, sheetName, commentOpts);\n }\n }\n\n // Rebuild ZIP\n const files: Record<string, Uint8Array> = {};\n for (const [key, value] of xmlMap) {\n files[key] =\n key === \"docProps/core.xml\" && coreProperties\n ? encoder.encode(OOXML_XML_DECLARATION + applyCorePropertiesOverride(value, coreProperties))\n : encoder.encode(stringify(value));\n }\n for (const [key, value] of binaryMap) {\n files[key] = value;\n }\n for (const [key, value] of vmlFiles) {\n files[key] = encoder.encode(value);\n }\n\n return await zipAndConvert(files, outputType, OoxmlMimeType.XLSX);\n};\n\n/** Map each `<si>` shared-string index to its flattened text. */\nfunction buildSharedTextIndex(sst: Element | undefined): Map<number, string> {\n const map = new Map<number, string>();\n if (!sst) return map;\n const root = sst.name ? sst : sst.elements?.[0];\n let idx = 0;\n for (const si of root?.elements ?? []) {\n if (si.name !== \"si\") continue;\n map.set(idx, flattenText(si));\n idx++;\n }\n return map;\n}\n\n/**\n * Pass A — for each cell whose entire text is a non-string placeholder, rewrite\n * the cell to a typed value cell (`<v>` with the correct `t`).\n */\nfunction rewriteTypedCells(\n ws: Element,\n patchMap: Map<string, ScalarValue>,\n sharedTextByIndex: Map<number, string>,\n): void {\n const root = ws.name ? ws : ws.elements?.[0];\n const sheetData = root && findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n const text = effectiveCellText(cell, sharedTextByIndex);\n if (text === undefined) continue;\n\n // Text is fully resolved here, so an exact match is a single Map lookup.\n // A pure cell holds a single placeholder; string values are Pass B's.\n const value = patchMap.get(text);\n if (value !== undefined && typeof value !== \"string\") {\n rewriteCellToValue(cell, value);\n }\n }\n }\n}\n\n/** Resolve the displayed text of a string/inline-string cell, else undefined. */\nfunction effectiveCellText(\n cell: Element,\n sharedTextByIndex: Map<number, string>,\n): string | undefined {\n const t = cell.attributes?.[\"t\"];\n if (t === \"inlineStr\") {\n const isEl = findLocalChild(cell, \"is\");\n return isEl ? flattenText(isEl) : undefined;\n }\n if (t === \"s\") {\n const v = findLocalChild(cell, \"v\");\n const raw = v?.elements?.[0]?.text;\n const idx = Number(raw);\n return Number.isNaN(idx) ? undefined : sharedTextByIndex.get(idx);\n }\n return undefined;\n}\n\n/** Rewrite a cell element to a typed value (`<v>` with the correct `t`). */\nfunction rewriteCellToValue(cell: Element, value: Exclude<ScalarValue, string>): void {\n const attrs = cell.attributes ?? (cell.attributes = {});\n let vText: string;\n if (typeof value === \"boolean\") {\n attrs[\"t\"] = \"b\";\n vText = value ? \"1\" : \"0\";\n } else if (value instanceof Date) {\n delete attrs[\"t\"]; // serial date is numeric\n vText = String(dateToSerialNumber(value));\n } else {\n delete attrs[\"t\"]; // plain numeric\n vText = String(value);\n }\n cell.elements = [{ type: \"element\", name: \"v\", elements: [{ type: \"text\", text: vText }] }];\n}\n\n/** Pass B — substitute placeholders in shared-string `<si>` text. */\nfunction patchSharedStrings(sst: Element, patchMap: Map<string, ScalarValue>): void {\n const root = sst.name ? sst : sst.elements?.[0];\n if (!root) return;\n\n for (const si of root.elements ?? []) {\n if (si.name !== \"si\") continue;\n\n // Simple: <si><t>text</t></si>\n const t = findLocalChild(si, \"t\");\n if (t) {\n patchTextElement(t, patchMap);\n } else {\n // Rich text: <si><r><t>text</t></r>...</si>\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findLocalChild(r, \"t\");\n if (rt) patchTextElement(rt, patchMap);\n }\n }\n }\n}\n\n/** Pass B — substitute placeholders in worksheet inline strings. */\nfunction patchWorksheetInlineStrings(ws: Element, patchMap: Map<string, ScalarValue>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n\n const sheetData = findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n\n // Inline strings: <c t=\"inlineStr\"><is><t>text</t></is></c>\n const isEl = findLocalChild(cell, \"is\");\n if (isEl) {\n const t = findLocalChild(isEl, \"t\");\n if (t) patchTextElement(t, patchMap);\n }\n }\n }\n}\n\nconst HEADER_FOOTER_NAMES = new Set([\n \"oddHeader\",\n \"oddFooter\",\n \"evenHeader\",\n \"evenFooter\",\n \"firstHeader\",\n \"firstFooter\",\n]);\n\n/**\n * Pass C — substitute placeholders in worksheet print header/footer text.\n * Header/footer children (oddHeader/oddFooter/…) carry their text directly\n * (not wrapped in `<t>`), so this is a substring substitution on the element's\n * own text node.\n */\nfunction patchHeaderFooter(ws: Element, patchMap: Map<string, ScalarValue>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n const headerFooter = findLocalChild(root, \"headerFooter\");\n if (!headerFooter) return;\n\n for (const part of headerFooter.elements ?? []) {\n if (part.type !== \"element\" || !HEADER_FOOTER_NAMES.has(localName(part))) continue;\n const textNode = part.elements?.[0];\n if (!textNode || typeof textNode.text !== \"string\") continue;\n\n let replaced = textNode.text;\n for (const [placeholder, value] of patchMap) {\n if (!replaced.includes(placeholder)) continue;\n const display = typeof value === \"string\" ? value : toDisplayString(value);\n replaced = replaced.split(placeholder).join(display);\n }\n if (replaced !== textNode.text) {\n part.elements![0] = { ...textNode, text: replaced };\n }\n }\n}\n\n/** Substitute any placeholder substring in a `<t>` element's text. */\nfunction patchTextElement(tEl: Element, patchMap: Map<string, ScalarValue>): void {\n const textNode = tEl.elements?.[0];\n const text = textNode?.text;\n if (typeof text !== \"string\") return;\n\n let replaced = text;\n for (const [placeholder, value] of patchMap) {\n if (!replaced.includes(placeholder)) continue;\n const display = typeof value === \"string\" ? value : toDisplayString(value);\n replaced = replaced.split(placeholder).join(display);\n }\n if (replaced !== text && tEl.elements) {\n tEl.elements[0] = { ...textNode, text: replaced };\n }\n}\n\n/** Flatten all descendant text of an element into a single string. */\nfunction flattenText(el: Element): string {\n let out = \"\";\n for (const child of el.elements ?? []) {\n if (child.type === \"text\") {\n out += child.text ?? \"\";\n } else if (child.type === \"element\") {\n out += flattenText(child);\n }\n }\n return out;\n}\n\nfunction localName(el: Element): string {\n const name = el.name ?? \"\";\n const colonIdx = name.indexOf(\":\");\n return colonIdx >= 0 ? name.slice(colonIdx + 1) : name;\n}\n\nfunction findLocalChild(parent: Element, name: string): Element | undefined {\n return (parent.elements ?? []).find((el) => localName(el) === name);\n}\n\n// ── Worksheet collection edits (append / replace) ──\n\n/** Unwrap the document element: a parsed part is `{ declaration, elements: [<root>] }`. */\nfunction rootOf(doc: Element | undefined): Element | undefined {\n return doc && (doc.name ? doc : doc.elements?.[0]);\n}\n\n/** Build a bare element node with the given attributes. */\nfunction makeElement(name: string, attributes: Record<string, string> = {}): Element {\n return { type: \"element\", name, attributes, elements: [] };\n}\n\n/** Empty `<Relationships>` part (wrapped for stringify serialization). */\nfunction createRelationshipFile(): Element {\n return {\n declaration: { attributes: { encoding: \"UTF-8\", standalone: \"yes\", version: \"1.0\" } },\n elements: [\n {\n attributes: { xmlns: \"http://schemas.openxmlformats.org/package/2006/relationships\" },\n elements: [],\n name: \"Relationships\",\n type: \"element\",\n },\n ],\n };\n}\n\n/** Next 1-based worksheet file number given existing worksheet parts. */\nfunction nextWorksheetNumber(xmlMap: Map<string, Element>): number {\n let maxN = 0;\n for (const key of xmlMap.keys()) {\n const m = key.match(/^xl\\/worksheets\\/sheet(\\d+)\\.xml$/);\n if (m) maxN = Math.max(maxN, Number(m[1]));\n }\n return maxN + 1;\n}\n\n/** Next `sheetId` for an appended `<sheet>` entry. */\nfunction nextSheetId(sheetsEl: Element | undefined): number {\n return nextNumericId(sheetsEl, \"sheet\", \"sheetId\", 0);\n}\n\n/** Resolve a relationship `rId` to its Target via a rels part root. */\nfunction resolveRelTarget(relsRoot: Element | undefined, rId: string): string | undefined {\n for (const child of relsRoot?.elements ?? []) {\n if (localName(child) === \"Relationship\" && String(child.attributes?.[\"Id\"]) === rId) {\n const target = child.attributes?.[\"Target\"];\n return target !== undefined ? String(target) : undefined;\n }\n }\n return undefined;\n}\n\n/** Rebuild the shared-strings table from the template so new sheets extend it. */\nfunction rebuildSharedStrings(xmlMap: Map<string, Element>): SharedStrings {\n const ss = new SharedStrings();\n const sstRoot = rootOf(xmlMap.get(\"xl/sharedStrings.xml\"));\n if (sstRoot) {\n ss.loadEntries(sharedStringsDesc.parse(sstRoot, STUB_READ_CTX).entries);\n }\n return ss;\n}\n\n/** Re-serialize the shared-strings part (called after worksheets are built). */\nfunction rewriteSharedStrings(xmlMap: Map<string, Element>, ss: SharedStrings): void {\n if (ss.count === 0) return;\n xmlMap.set(\n \"xl/sharedStrings.xml\",\n toJson(`<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${ss.serialize()}`),\n );\n}\n\n/**\n * Append a worksheet: serialize it (registering strings into the shared-strings\n * table), then wire workbook `<sheets>` + workbook rels + content types.\n */\nfunction appendWorksheetToMap(\n xmlMap: Map<string, Element>,\n wsOpts: WorksheetOptions,\n sharedStrings: SharedStrings,\n): void {\n const newN = nextWorksheetNumber(xmlMap);\n const sheetPath = `xl/worksheets/sheet${newN}.xml`;\n const sheetName = wsOpts.name ?? `Sheet${newN}`;\n\n // Worksheet part (no XML declaration — matches generated worksheet parts).\n // Placeholder comments are stripped: patch never wires compiler-owned rels.\n xmlMap.set(\n sheetPath,\n toJson(stripWorksheetPlaceholders(buildWorksheetXml(wsOpts, { sharedStrings }))),\n );\n\n // workbook.xml <sheets> + workbook.xml.rels (the new rId ties them)\n const wbRoot = rootOf(xmlMap.get(\"xl/workbook.xml\"));\n const wbSheets = wbRoot && findLocalChild(wbRoot, \"sheets\");\n const wbRels = xmlMap.get(\"xl/_rels/workbook.xml.rels\") ?? createRelationshipFile();\n xmlMap.set(\"xl/_rels/workbook.xml.rels\", wbRels);\n const newRId = getNextRelationshipIndex(wbRels);\n\n if (wbSheets) {\n const els = wbSheets.elements ?? (wbSheets.elements = []);\n els.push(\n makeElement(\"sheet\", {\n name: sheetName,\n sheetId: String(nextSheetId(wbSheets)),\n \"r:id\": `rId${newRId}`,\n }),\n );\n }\n appendRelationship(wbRels, newRId, WORKSHEET_REL_TYPE, `worksheets/sheet${newN}.xml`);\n\n // [Content_Types].xml Override\n const contentTypes = xmlMap.get(\"[Content_Types].xml\");\n if (contentTypes) {\n appendOverride(contentTypes, `/${sheetPath}`, WORKSHEET_CONTENT_TYPE);\n }\n}\n\n/** Normalize a worksheet name to its full part path via workbook.xml + rels. */\nfunction resolveSheetPath(xmlMap: Map<string, Element>, name: string): string {\n const wbRoot = rootOf(xmlMap.get(\"xl/workbook.xml\"));\n const wbSheets = wbRoot && findLocalChild(wbRoot, \"sheets\");\n const sheetEls = (wbSheets?.elements ?? []).filter((e) => localName(e) === \"sheet\");\n const target = sheetEls.find((e) => String(e.attributes?.[\"name\"]) === name);\n if (!target?.attributes?.[\"r:id\"]) {\n throw new Error(`patchWorkbook: no worksheet named \"${name}\"`);\n }\n const relTarget = resolveRelTarget(\n rootOf(xmlMap.get(\"xl/_rels/workbook.xml.rels\")),\n String(target.attributes[\"r:id\"]),\n );\n if (!relTarget) {\n throw new Error(`patchWorkbook: worksheet \"${name}\" relationship target not found`);\n }\n if (relTarget.startsWith(\"/\")) return relTarget.slice(1);\n return relTarget.startsWith(\"xl/\") ? relTarget : `xl/${relTarget}`;\n}\n\n/**\n * Replace a worksheet by name: resolve the name to its part via workbook rels,\n * then rewrite only that part's content. Sheet identity, rId, and content types\n * are unchanged.\n */\nfunction replaceWorksheetInMap(\n xmlMap: Map<string, Element>,\n name: string,\n wsOpts: WorksheetOptions,\n sharedStrings: SharedStrings,\n): void {\n const sheetPath = resolveSheetPath(xmlMap, name);\n xmlMap.set(\n sheetPath,\n toJson(stripWorksheetPlaceholders(buildWorksheetXml(wsOpts, { sharedStrings }))),\n );\n}\n\n/**\n * Remove worksheets by name: drop each `<sheet>` entry, the workbook\n * relationship, and the sheet part with its rels. `definedName` entries scoped\n * to a removed sheet are dropped and the survivors' `localSheetId` (and the\n * workbook view's `activeTab`) are renumbered to the post-removal indices.\n * Parts the sheet's rels point at (comments, drawings, …) are left in place —\n * they may be referenced elsewhere and unreferenced parts are inert in OPC.\n */\nfunction removeWorksheetsFromMap(xmlMap: Map<string, Element>, names: readonly string[]): void {\n const wbRoot = rootOf(xmlMap.get(\"xl/workbook.xml\"));\n const wbSheets = wbRoot && findLocalChild(wbRoot, \"sheets\");\n const sheetEls = (wbSheets?.elements ?? []).filter((e) => localName(e) === \"sheet\");\n const wbRelsKey = \"xl/_rels/workbook.xml.rels\";\n\n // Resolve every name before touching <sheets> so positions stay stable.\n const doomedEntries = new Set<Element>();\n const doomedRIds = new Set<string>();\n const doomedPositions = new Set<number>();\n const sheetPaths: string[] = [];\n for (const name of names) {\n const entry = sheetEls.find((e) => String(e.attributes?.[\"name\"] ?? \"\") === name);\n const rId = entry?.attributes?.[\"r:id\"];\n if (!entry || !rId) {\n throw new Error(`patchWorkbook: no worksheet named \"${name}\"`);\n }\n const relTarget = resolveRelTarget(rootOf(xmlMap.get(wbRelsKey)), String(rId));\n if (!relTarget) {\n throw new Error(`patchWorkbook: worksheet \"${name}\" relationship target not found`);\n }\n doomedEntries.add(entry);\n doomedRIds.add(String(rId));\n doomedPositions.add(sheetEls.indexOf(entry));\n sheetPaths.push(\n relTarget.startsWith(\"/\")\n ? relTarget.slice(1)\n : relTarget.startsWith(\"xl/\")\n ? relTarget\n : `xl/${relTarget}`,\n );\n }\n\n if (wbSheets?.elements) {\n wbSheets.elements = wbSheets.elements.filter((e) => !doomedEntries.has(e));\n }\n const wbRelsRoot = rootOf(xmlMap.get(wbRelsKey));\n if (wbRelsRoot?.elements) {\n wbRelsRoot.elements = wbRelsRoot.elements.filter(\n (e) => !(localName(e) === \"Relationship\" && doomedRIds.has(String(e.attributes?.[\"Id\"]))),\n );\n }\n\n // Remap sheet positions for definedName@localSheetId and bookView@activeTab.\n const remapIndex = (index: number): number | undefined => {\n if (doomedPositions.has(index)) return undefined;\n let kept = 0;\n for (let p = 0; p < index; p++) {\n if (!doomedPositions.has(p)) kept++;\n }\n return kept;\n };\n if (wbRoot) {\n const definedNames = findLocalChild(wbRoot, \"definedNames\");\n if (definedNames?.elements) {\n definedNames.elements = definedNames.elements.flatMap((dn) => {\n if (localName(dn) !== \"definedName\") return [dn];\n const localSheetId = dn.attributes?.[\"localSheetId\"];\n if (localSheetId !== undefined) {\n const mapped = remapIndex(Number(localSheetId));\n if (mapped === undefined) return []; // scoped to a removed sheet — drop\n if (mapped !== Number(localSheetId)) {\n dn.attributes![\"localSheetId\"] = String(mapped);\n }\n }\n return [dn];\n });\n // An emptied container is not valid — drop it entirely.\n if (definedNames.elements.length === 0) {\n wbRoot.elements = (wbRoot.elements ?? []).filter((e) => e !== definedNames);\n }\n }\n const bookViews = findLocalChild(wbRoot, \"bookViews\");\n for (const view of bookViews?.elements ?? []) {\n if (localName(view) !== \"workbookView\") continue;\n const activeTab = view.attributes?.[\"activeTab\"];\n if (activeTab === undefined) continue;\n const mapped = remapIndex(Number(activeTab));\n if (mapped === undefined) {\n delete view.attributes![\"activeTab\"]; // was on a removed sheet — reset\n } else if (mapped !== Number(activeTab)) {\n view.attributes![\"activeTab\"] = String(mapped);\n }\n }\n }\n\n for (const sheetPath of sheetPaths) {\n xmlMap.delete(sheetPath);\n xmlMap.delete(partPathToRelsPath(sheetPath));\n const contentTypes = xmlMap.get(\"[Content_Types].xml\");\n if (contentTypes) removeOverride(contentTypes, `/${sheetPath}`);\n }\n}\n\n/** Find an existing relationship of a type in a rels root: { id, target }. */\nfunction findRelByType(\n relsRoot: Element | undefined,\n type: string,\n): { id: string; target: string } | undefined {\n for (const child of relsRoot?.elements ?? []) {\n if (localName(child) === \"Relationship\" && String(child.attributes?.[\"Type\"]) === type) {\n const target = child.attributes?.[\"Target\"];\n if (target !== undefined) {\n return { id: String(child.attributes?.[\"Id\"]), target: String(target) };\n }\n }\n }\n return undefined;\n}\n\n/** Largest existing comments file number (xl/comments{n}.xml), for append offset. */\nfunction nextCommentsNumber(xmlMap: Map<string, Element>): number {\n let maxN = 0;\n for (const key of xmlMap.keys()) {\n const m = key.match(/^xl\\/comments(\\d+)\\.xml$/);\n if (m) maxN = Math.max(maxN, Number(m[1]));\n }\n return maxN + 1;\n}\n\n/**\n * Insert `<legacyDrawing>` into a worksheet, after `<drawing>` and before the\n * trailing collection elements (CT_Worksheet sequence order). Skipped when one\n * already exists.\n */\nfunction insertLegacyDrawing(wsRoot: Element, rId: string): void {\n const els = wsRoot.elements ?? (wsRoot.elements = []);\n if (els.some((e) => localName(e) === \"legacyDrawing\")) return;\n const legacy = makeElement(\"legacyDrawing\", { \"r:id\": rId });\n const afterLegacy = new Set([\n \"tableParts\",\n \"extLst\",\n \"oleObjects\",\n \"controls\",\n \"picture\",\n \"webPublishItems\",\n ]);\n let insertAt = els.length;\n for (const [i, el] of els.entries()) {\n if (afterLegacy.has(localName(el))) {\n insertAt = i;\n break;\n }\n }\n els.splice(insertAt, 0, legacy);\n}\n\n/** commentsDesc.stringify ignores its context; this satisfies the WriteContext type. */\nconst STUB_WRITE_CTX = {} as unknown as WriteContext;\n\n/**\n * Append cell comments to a worksheet, merging with any existing comments part.\n * Wires commentsN.xml + vmlDrawingN.vml (reusing the existing pair when present),\n * the worksheet relationships, the `<legacyDrawing>` anchor, and content types.\n * VML text is written to {@link vmlFiles} (not xmlMap) because of its extension.\n */\nfunction appendCommentsToMap(\n xmlMap: Map<string, Element>,\n vmlFiles: Map<string, string>,\n sheetName: string,\n commentOpts: CommentOptions[],\n): void {\n const sheetPath = resolveSheetPath(xmlMap, sheetName);\n const wsRelsKey = partPathToRelsPath(sheetPath);\n const wsRels = xmlMap.get(wsRelsKey) ?? createRelationshipFile();\n xmlMap.set(wsRelsKey, wsRels);\n\n // Reuse the worksheet's existing comments/vmlDrawing relationships when present.\n const existingComments = findRelByType(rootOf(wsRels), COMMENTS_REL_TYPE);\n const existingVml = findRelByType(rootOf(wsRels), VML_REL_TYPE);\n\n const commentsN = existingComments\n ? Number((existingComments.target.match(/comments(\\d+)\\.xml$/) ?? [])[1]) ||\n nextCommentsNumber(xmlMap)\n : nextCommentsNumber(xmlMap);\n const commentsPath = `xl/comments${commentsN}.xml`;\n // Reuse the existing vmlDrawing path when present — its index can differ from\n // the comments index in third-party files.\n const vmlPath = existingVml\n ? `xl/drawings/${existingVml.target.slice(existingVml.target.lastIndexOf(\"/\") + 1)}`\n : `xl/drawings/vmlDrawing${commentsN}.vml`;\n\n // Merge with the existing comments part if it was already in the package.\n const existingPart = rootOf(xmlMap.get(commentsPath));\n let merged = commentOpts;\n if (existingPart) {\n merged = [...commentsDesc.parse(existingPart, STUB_READ_CTX).comments, ...commentOpts];\n }\n\n const commentsXml = commentsDesc.stringify({ comments: merged }, STUB_WRITE_CTX);\n if (commentsXml) {\n xmlMap.set(\n commentsPath,\n toJson(`<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${commentsXml}`),\n );\n }\n const vmlXml = vmlNotesDesc.stringify({ comments: merged }, STUB_WRITE_CTX);\n if (vmlXml) {\n vmlFiles.set(vmlPath, `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${vmlXml}`);\n }\n\n // Worksheet relationships — added only when the part is newly introduced.\n if (!existingComments) {\n const n = getNextRelationshipIndex(wsRels);\n appendRelationship(wsRels, n, COMMENTS_REL_TYPE, `../comments${commentsN}.xml`);\n }\n let vmlRidRef: string;\n if (existingVml) {\n vmlRidRef = existingVml.id;\n } else {\n const n = getNextRelationshipIndex(wsRels);\n appendRelationship(wsRels, n, VML_REL_TYPE, `../drawings/vmlDrawing${commentsN}.vml`);\n vmlRidRef = `rId${n}`;\n }\n\n // `<legacyDrawing>` anchor on the worksheet (deduped).\n const wsRoot = rootOf(xmlMap.get(sheetPath));\n if (wsRoot) insertLegacyDrawing(wsRoot, vmlRidRef);\n\n // Content types — comments Override (new part only) + vml Default (deduped).\n const contentTypes = xmlMap.get(\"[Content_Types].xml\");\n if (contentTypes) {\n if (!existingPart) {\n appendOverride(contentTypes, `/${commentsPath}`, COMMENTS_CONTENT_TYPE);\n }\n appendContentType(contentTypes, VML_CONTENT_TYPE, \"vml\");\n }\n}\n","/**\n * XLSX Compiler — compiles WorkbookOptions into a Zippable structure.\n *\n * Accepts pure JSON WorkbookOptions — no intermediate File class needed.\n * Uses XlsxWriteContext for shared state (strings, styles, media, charts).\n *\n * @module\n */\n\nimport {\n Relationships,\n TargetModeType,\n appPropertiesDesc,\n buildCorePropertiesXmlString,\n buildRootRelationships,\n compileMapping,\n contentTypesDesc,\n dropDanglingPassthroughRels,\n type PassthroughRelationship,\n type RelationshipType,\n deriveContentTypes,\n pickNonVisualDrawingProperties,\n resolverFromRegistry,\n XLSX_PARTS,\n customPropertiesDesc,\n toUint8Array,\n IMAGE_MEDIA_CONTENT_TYPES,\n type XmlifyedFile,\n type Zippable,\n} from \"@office-open/core\";\nimport { chartSpaceDesc } from \"@office-open/core/chart\";\nimport { buildThemeXml } from \"@office-open/core/theme\";\nimport { escapeXml, OOXML_XML_DECLARATION } from \"@office-open/xml\";\nimport type { CalcCell } from \"@parts/calc-chain\";\nimport { calcChainDesc } from \"@parts/calc-chain\";\nimport { chartsheetDesc, type ChartsheetOptions } from \"@parts/chartsheet\";\nimport { commentsDesc, vmlNotesDesc } from \"@parts/comments\";\nimport { connectionsDesc } from \"@parts/connection\";\nimport { dialogsheetDesc, type DialogsheetOptions } from \"@parts/dialogsheet\";\nimport type {\n DrawingChartOptions,\n DrawingPictureOptions,\n DrawingSmartArtOptions,\n} from \"@parts/drawing\";\nimport { pickAnchorOptions } from \"@parts/drawing\";\nimport { drawingDesc } from \"@parts/drawing\";\nimport { A_NS, R_NS, XDR_NS, graphicFrameXml, wrapAnchor } from \"@parts/drawing/stringify\";\nimport { externalLinkDesc } from \"@parts/external-link\";\nimport type { WorkbookOptions } from \"@parts/file\";\nimport { metadataDesc } from \"@parts/metadata\";\nimport type { MetadataOptions } from \"@parts/metadata\";\nimport { aggregate, collectUniqueValues } from \"@parts/pivot\";\nimport type { PivotSourceData, PivotTableOptions } from \"@parts/pivot\";\nimport { pivotCacheDefDesc, pivotCacheRecordsDesc } from \"@parts/pivot-cache\";\nimport { pivotTableDesc } from \"@parts/pivot-table\";\nimport { queryTableDesc } from \"@parts/query-table\";\nimport { revisionHeadersDesc, revisionLogDesc, usersDesc } from \"@parts/revision-log\";\nimport { sharedStringsDesc } from \"@parts/shared-strings\";\nimport type { SharedStrings } from \"@parts/shared-strings\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { tableDesc } from \"@parts/table\";\nimport { createThemeXml } from \"@parts/theme\";\nimport { buildVolTypesXml } from \"@parts/vol-types\";\nimport type { PivotCacheReference, TablePartReference, SheetDefinition } from \"@parts/workbook\";\nimport { workbookDesc, buildTablePartsXml, buildExternalReferencesXml } from \"@parts/workbook\";\nimport {\n buildWorksheetXml,\n editSheetTailMarker,\n stripWorksheetPlaceholders,\n type WorksheetContext,\n} from \"@parts/worksheet\";\nimport type { RowOptions, WorksheetOptions } from \"@parts/worksheet\";\nimport { mapInfoDesc, singleXmlCellsDesc } from \"@parts/xml-mapping\";\nimport { columnToLetter, letterToColumn } from \"@util/index\";\n\nimport { XlsxWriteContext } from \"./context\";\n\nconst XML_DECL = OOXML_XML_DECLARATION;\n\nconst IMAGE_REL = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\";\n\n/**\n * Replace `{fileName}` media placeholders in compiled part XML with\n * relationship ids. Core fill descriptors register blip-fill images through\n * `ctx.addMedia`, which returns a placeholder because the owning part's rels\n * don't exist yet; a placeholder surviving into the part makes Excel refuse\n * the package. Each distinct image registers one relationship — consuming\n * parts (theme, drawings) live one level under `xl/`, so the media target is\n * always `../media/<name>`.\n */\nfunction bindMediaPlaceholders(\n xml: string,\n media: XlsxWriteContext[\"media\"],\n rels: Relationships,\n): string {\n const names = new Set(media.array.map((m) => m.fileName));\n let usesMedia = false;\n for (const name of names) {\n if (xml.includes(`{${name}}`)) {\n usesMedia = true;\n break;\n }\n }\n if (!usesMedia) return xml;\n const ridByName = new Map<string, string>();\n return xml.replace(/\\{([^{}]+)\\}/g, (whole, name: string) => {\n let rid = ridByName.get(name);\n if (rid === undefined) {\n if (!names.has(name)) return whole;\n rid = `rId${rels.add(IMAGE_REL, `../media/${name}`)}`;\n ridByName.set(name, rid);\n }\n return rid;\n });\n}\n\n/** XLSX part path → content type, derived from the part registry. Matches\n * actual file paths, so the dense/sequential xlsx part naming is handled. */\nconst XLSX_CONTENT_TYPE_RESOLVER = resolverFromRegistry(XLSX_PARTS);\n\n/** Extension → MIME for image and VML Default entries. Declared only for\n * extensions actually present in the package. VML backs legacy comment\n * anchors (xl/drawings/vmlDrawing${i}.vml). */\nconst XLSX_MEDIA_CONTENT_TYPES: Record<string, string> = {\n ...IMAGE_MEDIA_CONTENT_TYPES,\n vml: \"application/vnd.openxmlformats-officedocument.vmlDrawing\",\n};\n\n/** UTF-8 encoder for serializing the derived [Content_Types].xml into the package. */\nconst encoder = new TextEncoder();\n\n/**\n * Compile workbook options into a Zippable structure.\n */\nexport function compileWorkbook(\n options: WorkbookOptions,\n overrides: XmlifyedFile[] = [],\n mediaLevel: number = 0,\n): Zippable {\n const ctx = new XlsxWriteContext();\n const mapping: Record<string, { data: string; path: string }> = {};\n\n // Seed the shared string table from parsed entries so round-tripped cells\n // keep their si indices and rich-text structure (identity dedup in\n // registerRich resolves the same entry object back to its source index).\n if (options.sharedStrings) ctx.sharedStrings.loadEntries(options.sharedStrings);\n\n const worksheetConfigs = options.worksheets ?? [];\n const chartsheetConfigs = options.chartsheets ?? [];\n const dialogsheetConfigs = options.dialogsheets ?? [];\n const hasCustomProperties = !!options.customProperties && options.customProperties.length > 0;\n\n // Core properties\n mapping[\"Properties\"] = {\n data: XML_DECL + buildCorePropertiesXmlString(options),\n path: \"docProps/core.xml\",\n };\n\n // App properties\n mapping[\"AppProperties\"] = {\n data: XML_DECL + (appPropertiesDesc.stringify(options.appProperties ?? {}, ctx) ?? \"\"),\n path: \"docProps/app.xml\",\n };\n\n // Custom properties (optional part; only emitted when present)\n if (hasCustomProperties) {\n mapping[\"CustomProperties\"] = {\n data:\n XML_DECL +\n (customPropertiesDesc.stringify({ properties: options.customProperties ?? [] }, ctx) ?? \"\"),\n path: \"docProps/custom.xml\",\n };\n }\n\n // File-level relationships (_rels/.rels)\n const fileRels = buildRootRelationships(\n \"xl/workbook.xml\",\n hasCustomProperties,\n options.passthroughRelationships,\n );\n mapping[\"FileRelationships\"] = {\n data: XML_DECL + fileRels.serialize(),\n path: \"_rels/.rels\",\n };\n\n // Register predefined DXFs before worksheets use styles. options.dxfs === []\n // means the source declared an empty <dxfs/> container — kept as-is.\n if (options.dxfs !== undefined) ctx.styles.setDxfs(options.dxfs);\n\n // Adopt the parsed style table wholesale (the SDK's Stylesheet model): fonts/\n // fills/borders/cellXfs/numFmts replace the fresh-file defaults, so raw cell\n // style indices carried by parsed rows resolve exactly as in the source.\n // fonts !== undefined is the \"source styles.xml was parsed\" signal (parse\n // fills all table sections with [] when the part exists, even bare).\n if (options.fonts !== undefined) {\n ctx.styles.adopt({\n fonts: options.fonts,\n fills: options.fills ?? [],\n borders: options.borders ?? [],\n cellXfs: options.cellXfs ?? [],\n numFmts: options.numFmts,\n });\n }\n\n // Re-apply parsed style sections so a declarative round-trip preserves\n // them (colors, table/cell styles, extensions) alongside DXFs.\n if (options.colors) ctx.styles.setColors(options.colors);\n if (options.tableStyles) ctx.styles.setTableStyles(options.tableStyles);\n if (options.cellStyles !== undefined) ctx.styles.setCustomCellStyles(options.cellStyles);\n if (options.cellStyleXfs !== undefined) ctx.styles.setCellStyleXfs(options.cellStyleXfs);\n if (options.styleExtensions) ctx.styles.setExtensions(options.styleExtensions);\n\n // Build workbook relationships\n buildWorkbookRelationships(\n ctx.workbookRels,\n worksheetConfigs.length,\n chartsheetConfigs.length,\n dialogsheetConfigs.length,\n );\n\n // Build sheet definitions for workbook XML. An explicit sheetId wins; the\n // fallback counter skips past every id handed out so ids stay unique even\n // when options mix explicit and generated values.\n const sheets: SheetDefinition[] = [];\n let sheetId = 1;\n const nextSheetId = (explicit: number | undefined): number => {\n const id = explicit ?? sheetId;\n if (id >= sheetId) sheetId = id + 1;\n return id;\n };\n let rId = 1;\n for (const ws of worksheetConfigs) {\n sheets.push({\n name: ws.name ?? `Sheet${sheetId}`,\n sheetId: nextSheetId(ws.sheetId),\n state: ws.state,\n rId: `rId${rId++}`,\n });\n }\n for (const cs of chartsheetConfigs) {\n sheets.push({\n name: cs.name ?? `Chart${sheetId}`,\n sheetId: nextSheetId(cs.sheetId),\n state: cs.state,\n rId: `rId${rId++}`,\n });\n }\n for (const ds of dialogsheetConfigs) {\n sheets.push({\n name: ds.name ?? `Dialog${sheetId}`,\n sheetId: nextSheetId(ds.sheetId),\n state: ds.state,\n rId: `rId${rId++}`,\n });\n }\n\n const wsContext: WorksheetContext = { sharedStrings: ctx.sharedStrings, styles: ctx.styles };\n const state: WorksheetCompileState = {\n globalMediaIdx: 0,\n globalChartIdx: 0,\n globalPivotIdx: 0,\n globalPivotCacheIdx: 0,\n globalTableIdx: 0,\n globalQueryTableIdx: 0,\n globalSingleXmlCellsIdx: 0,\n pivotCacheDataMap: new Map<string, { cacheId: number; cacheIdx: number }>(),\n calcCells: [],\n allTableParts: [],\n };\n for (const [i, wsOpts] of worksheetConfigs.entries()) {\n compileWorksheetPart(\n wsOpts,\n i,\n worksheetConfigs,\n ctx,\n mapping,\n wsContext,\n state,\n options.passthroughRelationships,\n );\n }\n\n compileChartsheets(chartsheetConfigs, ctx, mapping, options.passthroughRelationships);\n compileDialogsheets(dialogsheetConfigs, ctx, mapping);\n // Round-trip pivotCache references: register the passthrough pivotCache\n // definition relationship here (before the workbook XML below and the\n // generic workbook-rels replay later) so the element and the rels agree on\n // the possibly renumbered id.\n let rtPivotRefs: PivotCacheReference[] | undefined;\n if (options.pivotCacheRefs && options.pivotCacheRefs.length > 0) {\n rtPivotRefs = [];\n for (const ref of options.pivotCacheRefs) {\n const rel = (options.passthroughRelationships ?? []).find(\n (r) => r.source === \"xl/workbook.xml\" && r.rId === ref.rId,\n );\n if (!rel) continue;\n let rid = ctx.workbookRels.idOf(rel.relationshipType, rel.target);\n if (rid === undefined) {\n ctx.workbookRels.add(rel.relationshipType as RelationshipType, rel.target);\n rid = ctx.workbookRels.idOf(rel.relationshipType, rel.target);\n }\n if (rid) rtPivotRefs.push({ cacheId: ref.cacheId, rId: rid });\n }\n }\n // Workbook XML (via descriptor)\n let wbXml =\n workbookDesc.stringify(\n {\n sheets,\n pivotCaches: ctx.pivotCacheRefs.length > 0 ? ctx.pivotCacheRefs : (rtPivotRefs ?? []),\n protection: options.workbookProtection,\n customViews: options.customWorkbookViews,\n fileRecoveryPr: options.fileRecoveryPr,\n functionGroups: options.functionGroups,\n webPublishing: options.webPublishing,\n fileSharing: options.fileSharing,\n webPublishObjects: options.webPublishObjects,\n definedNames: options.definedNames,\n workbookPr: options.workbookPr,\n calcPr: options.calcPr,\n oleSize: options.oleSize,\n bookView: options.bookView,\n ...(options.absPath !== undefined ? { absPath: options.absPath } : {}),\n ...(options.revisionPtr ? { revisionPtr: options.revisionPtr } : {}),\n ...(options.extensions ? { extensions: options.extensions } : {}),\n },\n ctx,\n ) ?? \"\";\n\n // Connections — xl/connections.xml (single part, workbook-level relationship)\n if (options.connections && options.connections.length > 0) {\n const cRid = ctx.workbookRels.nextRelationshipId;\n ctx.workbookRels.addRelationship(\n cRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections\",\n \"connections.xml\",\n );\n mapping[\"Connections\"] = {\n data: XML_DECL + connectionsDesc.stringify({ connections: options.connections }, ctx),\n path: \"xl/connections.xml\",\n };\n }\n\n // Metadata — xl/metadata.xml (single part, workbook-level relationship)\n if (options.metadata && hasMetadataContent(options.metadata)) {\n const mRid = ctx.workbookRels.nextRelationshipId;\n ctx.workbookRels.addRelationship(\n mRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata\",\n \"metadata.xml\",\n );\n mapping[\"Metadata\"] = {\n data: XML_DECL + metadataDesc.stringify(options.metadata, ctx),\n path: \"xl/metadata.xml\",\n };\n }\n\n // XML mappings — xl/xmlMaps.xml (single part, workbook-level relationship)\n if (options.xmlMaps) {\n const xRid = ctx.workbookRels.nextRelationshipId;\n ctx.workbookRels.addRelationship(\n xRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/xmlMaps\",\n \"xmlMaps.xml\",\n );\n mapping[\"XmlMaps\"] = {\n data: XML_DECL + mapInfoDesc.stringify(options.xmlMaps, ctx),\n path: \"xl/xmlMaps.xml\",\n };\n }\n\n // Volatile function types — xl/volTypes.xml (single part, workbook-level\n // relationship; sml.xsd declares volTypes as a part root, never a workbook child)\n if (options.volTypes && options.volTypes.length > 0) {\n const vRid = ctx.workbookRels.nextRelationshipId;\n ctx.workbookRels.addRelationship(\n vRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/volTypes\",\n \"volTypes.xml\",\n );\n mapping[\"VolTypes\"] = {\n data: XML_DECL + buildVolTypesXml(options.volTypes),\n path: \"xl/volTypes.xml\",\n };\n }\n\n // External links — generate XML files and inject externalReferences into workbook\n const extLinks = options.externalLinks ?? [];\n if (extLinks.length > 0) {\n const extRefs: { rId: string }[] = [];\n for (let ei = 0; ei < extLinks.length; ei++) {\n const elIdx = ei + 1;\n const elRid = ctx.workbookRels.nextRelationshipId;\n ctx.workbookRels.addRelationship(\n elRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink\",\n `externalLinks/externalLink${elIdx}.xml`,\n );\n\n // Create the rels file for this external link\n const elOpts = extLinks[ei];\n if (!elOpts) continue;\n let bookRId: string | undefined;\n if (elOpts.externalBook?.target) {\n const elRels = new Relationships();\n elRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath\",\n elOpts.externalBook.target,\n TargetModeType.EXTERNAL,\n );\n bookRId = \"rId1\";\n mapping[`ExternalLinkRels${elIdx}`] = {\n data: XML_DECL + elRels.serialize(),\n path: `xl/externalLinks/_rels/externalLink${elIdx}.xml.rels`,\n };\n }\n\n // Generate the external link XML\n mapping[`ExternalLink${elIdx}`] = {\n data: XML_DECL + externalLinkDesc.stringify({ ...elOpts, bookRId }, ctx),\n path: `xl/externalLinks/externalLink${elIdx}.xml`,\n };\n\n extRefs.push({ rId: `rId${elRid}` });\n }\n\n // Inject externalReferences into workbook XML\n const extRefsXml = buildExternalReferencesXml(extRefs);\n wbXml = wbXml.replace(\"<!--EXTERNAL_REFS-->\", extRefsXml);\n } else {\n wbXml = wbXml.replace(\"<!--EXTERNAL_REFS-->\", \"\");\n }\n\n mapping[\"Workbook\"] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${wbXml}`,\n path: \"xl/workbook.xml\",\n };\n\n // Shared Strings — AFTER worksheets so all strings are collected\n if (ctx.sharedStrings.count > 0) {\n ctx.workbookRels.addRelationship(\n ctx.workbookRels.nextRelationshipId,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n \"sharedStrings.xml\",\n );\n const ssXml = sharedStringsDesc.stringify(ctx.sharedStrings.toDescriptorOptions(), ctx);\n mapping[\"SharedStrings\"] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${ssXml}`,\n path: \"xl/sharedStrings.xml\",\n };\n }\n\n // Styles (via descriptor — delegates to Styles.toXml internally)\n const stylesXml = stylesDesc.stringify({ styles: ctx.styles }, ctx);\n mapping[\"Styles\"] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${stylesXml}`,\n path: \"xl/styles.xml\",\n };\n\n // Theme — a parsed source theme round-trips structurally; fresh output\n // keeps the Office default. Blip fills inside the format scheme register\n // media placeholders; bind them to a theme-part image relationship.\n const themeRels = new Relationships();\n const themeXml = options.theme\n ? bindMediaPlaceholders(buildThemeXml(options.theme, ctx), ctx.media, themeRels)\n : createThemeXml();\n mapping[\"Theme\"] = {\n data: XML_DECL + themeXml,\n path: \"xl/theme/theme1.xml\",\n };\n if (themeRels.relationshipCount > 0) {\n mapping[\"ThemeRels\"] = {\n data: XML_DECL + themeRels.serialize(),\n path: \"xl/theme/_rels/theme1.xml.rels\",\n };\n }\n\n // Charts — AFTER worksheets so charts are registered\n for (const [i, chartData] of ctx.charts.array.entries()) {\n mapping[`Chart${i}`] = {\n data: XML_DECL + chartData.chartSpaceXml,\n path: `xl/charts/chart${i + 1}.xml`,\n };\n }\n\n // Calculation chain — round-trips preserve the parsed chain verbatim (the\n // chain encodes Excel's own evaluation order, not something derivable);\n // fresh authoring rebuilds one from formula cells. A source whose workbook\n // rels reference calcChain but ship no part (repair-style files) keeps the\n // part absent — Excel tolerates the dangling reference exactly as received.\n const calcChainCells = options.calcChain ?? state.calcCells;\n const srcReferencesCalcChain = (options.passthroughRelationships ?? []).some(\n (r) => r.source === \"xl/workbook.xml\" && r.relationshipType.endsWith(\"/calcChain\"),\n );\n if (calcChainCells.length > 0 && !(srcReferencesCalcChain && options.calcChain === undefined)) {\n mapping[\"CalcChain\"] = {\n data: calcChainDesc.stringify({ cells: calcChainCells }, ctx) ?? \"\",\n path: \"xl/calcChain.xml\",\n };\n const calcChainRid = ctx.workbookRels.nextRelationshipId;\n ctx.workbookRels.addRelationship(\n calcChainRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain\",\n \"calcChain.xml\",\n );\n }\n\n if (options.revisionLog) {\n compileRevisionLogs(options.revisionLog, ctx, mapping);\n }\n\n // Workbook relationships — serialized after calcChain/revision register their\n // targets, so every workbook-level relationship lands in workbook.xml.rels.\n // Passthrough relationships (round-trip) follow: the source workbook.xml.rels\n // referenced parts the model carries verbatim (externalLinks, pivotCaches, …).\n // Re-emitted as written — targets are passthrough paths that never move.\n for (const rel of options.passthroughRelationships ?? []) {\n if (rel.source !== \"xl/workbook.xml\") continue;\n if (ctx.workbookRels.hasRelationship(rel.relationshipType, rel.target)) continue;\n ctx.workbookRels.add(rel.relationshipType as RelationshipType, rel.target);\n }\n mapping[\"WorkbookRelationships\"] = {\n data: XML_DECL + ctx.workbookRels.serialize(),\n path: \"xl/_rels/workbook.xml.rels\",\n };\n\n // Convert mapping to Zippable\n const mediaFiles: Array<{ data: Uint8Array; path: string }> = [];\n for (const img of ctx.media.array) {\n mediaFiles.push({ data: img.data, path: `xl/media/${img.fileName}` });\n }\n\n const files = compileMapping(mapping, overrides, mediaFiles, mediaLevel);\n // Raw passthrough parts (drawings, VML, external links, unknown extensions, …).\n // The compiler output above wins over a passthrough copy at the same path, so\n // only what the model missed actually passes through.\n const passthroughSkipped = new Set<string>();\n for (const part of options.rawParts ?? []) {\n if (files[part.path] !== undefined) {\n passthroughSkipped.add(part.path);\n continue;\n }\n files[part.path] = toUint8Array(part.data);\n }\n // Derive [Content_Types].xml from the actual parts written — the file set is\n // the single source of truth, so content-type declarations cannot drift from\n // what is written. Sparse/index-based naming is handled naturally.\n const contentTypesInput = deriveContentTypes(Object.keys(files), {\n resolve: XLSX_CONTENT_TYPE_RESOLVER,\n mediaContentTypes: XLSX_MEDIA_CONTENT_TYPES,\n // Round-trip: the source declaration table is the base; derived entries\n // only fill what surviving source entries leave uncovered or mistyped.\n source: options.contentTypes,\n verbatimPaths: new Set((options.rawParts ?? []).map((p) => p.path)),\n });\n // Passthrough parts whose extension has no covering Default would leave the\n // package invalid (an undeclared part — Excel refuses to open). Only those\n // borrow their source content-type declaration as a per-part Override;\n // extensions already covered (xml/rels/media) stay as derived above.\n const coveredExt = new Set(contentTypesInput.defaults.map((d) => d.extension.toLowerCase()));\n for (const part of options.rawParts ?? []) {\n if (part.contentType === undefined || passthroughSkipped.has(part.path)) continue;\n const dot = part.path.lastIndexOf(\".\");\n const slash = part.path.lastIndexOf(\"/\");\n const ext = dot > slash ? part.path.slice(dot + 1).toLowerCase() : undefined;\n if (ext && coveredExt.has(ext)) continue;\n contentTypesInput.overrides.push({ partName: `/${part.path}`, contentType: part.contentType });\n }\n files[\"[Content_Types].xml\"] = encoder.encode(\n XML_DECL + (contentTypesDesc.stringify(contentTypesInput, ctx) ?? \"\"),\n );\n // Guard: drop passthrough rels whose target part never made it into the\n // package (hand-authored input) — Office refuses to open dangling rels.\n dropDanglingPassthroughRels(files, options.passthroughRelationships);\n return files;\n}\n\n/** Cross-worksheet compile state threaded through compileWorksheetPart. */\ninterface WorksheetCompileState {\n globalMediaIdx: number;\n globalChartIdx: number;\n globalPivotIdx: number;\n globalPivotCacheIdx: number;\n globalTableIdx: number;\n globalQueryTableIdx: number;\n globalSingleXmlCellsIdx: number;\n pivotCacheDataMap: Map<string, { cacheId: number; cacheIdx: number }>;\n calcCells: CalcCell[];\n allTableParts: TablePartReference[];\n}\n\n/**\n * Compile one worksheet: sheet XML, calcChain cells, drawing/media,\n * comments + VML, background, pivots, tables, query tables and\n * single-cell XML tables, with their worksheet-level relationships.\n * Rel registration order is significant (rIds are assigned sequentially).\n */\nfunction compileWorksheetPart(\n wsOpts: WorksheetOptions,\n i: number,\n worksheetConfigs: WorksheetOptions[],\n ctx: XlsxWriteContext,\n mapping: Record<string, { data: string; path: string }>,\n wsContext: WorksheetContext,\n state: WorksheetCompileState,\n passthroughRelationships?: readonly PassthroughRelationship[],\n): void {\n const imgOpts = wsOpts.images ?? [];\n const chartOpts = wsOpts.charts ?? [];\n const smartArtOpts = wsOpts.smartArts ?? [];\n const shapeOpts = wsOpts.shapes ?? [];\n const connectorOpts = wsOpts.connectors ?? [];\n const groupOpts = wsOpts.groups ?? [];\n const hlOpts = wsOpts.hyperlinks ?? [];\n const sheetName = wsOpts.name ?? `Sheet${i + 1}`;\n\n // Worksheet uses buildWorksheetXml fast path (zero-allocation string concat)\n let sheetXml = buildWorksheetXml(wsOpts, wsContext);\n\n // Collect formula cells for calcChain. calcChain's i attribute is the\n // workbook sheetId (CT_Sheet @sheetId), not the sheet's position — the\n // fallback matches the all-generated case where both coincide.\n const sheetIdx = wsOpts.sheetId ?? i + 1;\n const wsRows = wsOpts.rows ?? [];\n for (let ri = 0; ri < wsRows.length; ri++) {\n const rowOpts = wsRows[ri]!;\n const rowNumber = rowOpts.rowNumber ?? ri + 1;\n const cells = rowOpts.cells;\n if (!cells) continue;\n for (let ci = 0; ci < cells.length; ci++) {\n const cell = cells[ci]!;\n if (!cell.formula) continue;\n const ref = cell.reference ?? columnToLetter(ci + 1) + rowNumber;\n state.calcCells.push({\n reference: ref,\n sheetIndex: sheetIdx,\n array: typeof cell.formula === \"object\" && cell.formula.type === \"array\",\n });\n }\n }\n\n const hasMedia =\n imgOpts.length > 0 ||\n chartOpts.length > 0 ||\n smartArtOpts.length > 0 ||\n shapeOpts.length > 0 ||\n connectorOpts.length > 0 ||\n groupOpts.length > 0;\n const hasExternalHyperlinks = hlOpts.some((h) => h.url !== undefined);\n const commentOpts = wsOpts.comments ?? [];\n const hasComments = commentOpts.length > 0;\n const pivotOpts = wsOpts.pivotTables ?? [];\n const hasPivots = pivotOpts.length > 0;\n const tableOpts = wsOpts.tables ?? [];\n const hasTables = tableOpts.length > 0;\n const queryTableOpts = wsOpts.queryTables ?? [];\n const hasQueryTables = queryTableOpts.length > 0;\n const singleXmlCellOpts = wsOpts.singleXmlCells ?? [];\n const bgImg = wsOpts.backgroundImage;\n\n // Worksheet-level relationships\n let wsRels: Relationships | undefined;\n let nextRid = 0;\n\n if (\n hasMedia ||\n hasExternalHyperlinks ||\n hasComments ||\n hasPivots ||\n hasTables ||\n hasQueryTables ||\n singleXmlCellOpts.length > 0 ||\n bgImg\n ) {\n wsRels = new Relationships();\n }\n\n if (hasExternalHyperlinks) {\n for (const hl of hlOpts) {\n if (hl.url === undefined) continue;\n const rid = ++nextRid;\n wsRels!.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n hl.url,\n \"External\",\n );\n }\n }\n\n if (hasMedia) {\n const drawingImages: DrawingPictureOptions[] = [];\n const drawingCharts: DrawingChartOptions[] = [];\n const drawingSmartArts: DrawingSmartArtOptions[] = [];\n const drawingRels = new Relationships();\n let rid = 1;\n\n // Process images\n for (const img of imgOpts) {\n let embedRid: string | undefined;\n let linkRid: string | undefined;\n\n if (img.data !== undefined) {\n // Media-store extension (jpg → jpeg); vector formats pass through.\n const ext = img.type === \"jpg\" ? \"jpeg\" : img.type;\n const rawBytes = toUint8Array(img.data, { encoding: \"base64\" });\n const entry = ctx.media.addMedia(rawBytes, ext, (fileName) => ({\n fileName,\n type: ext,\n data: rawBytes,\n width: 0,\n height: 0,\n }));\n\n // Anchors sharing one picture share the relationship too — the source\n // writes a single image rel that every a:blip references.\n const target = `../media/${entry.fileName}`;\n embedRid = drawingRels.idOf(IMAGE_REL, target);\n if (embedRid === undefined) {\n drawingRels.addRelationship(rid, IMAGE_REL, target);\n embedRid = `rId${rid}`;\n rid++;\n }\n state.globalMediaIdx++;\n }\n\n // Linked source (a:blip @r:link): one External image relationship per\n // URL — no media part, no bytes.\n if (img.sourceUrl !== undefined) {\n drawingRels.addRelationship(rid, IMAGE_REL, img.sourceUrl, \"External\");\n linkRid = `rId${rid}`;\n rid++;\n }\n\n drawingImages.push({\n ...pickAnchorOptions(img),\n rId: embedRid ?? \"\",\n ...(linkRid ? { linkRId: linkRid } : {}),\n ...pickNonVisualDrawingProperties(img),\n ...(img.spPr ? { spPr: img.spPr } : {}),\n ...(img.blackWhiteMode ? { blackWhiteMode: img.blackWhiteMode } : {}),\n ...(img.sourceRectangle ? { sourceRectangle: img.sourceRectangle } : {}),\n ...(img.preferRelativeResize !== undefined\n ? { preferRelativeResize: img.preferRelativeResize }\n : {}),\n ...(img.blipEffects ? { blipEffects: img.blipEffects } : {}),\n ...(img.useLocalDpi !== undefined ? { useLocalDpi: img.useLocalDpi } : {}),\n ...(img.blipExt !== undefined ? { blipExt: img.blipExt } : {}),\n ...(img.locking ? { locking: img.locking } : {}),\n ...(img.hyperlink ? { hyperlink: img.hyperlink } : {}),\n ...(img.zOrder !== undefined ? { zOrder: img.zOrder } : {}),\n ...(img.shapeId !== undefined ? { shapeId: img.shapeId } : {}),\n });\n }\n\n // Process charts\n for (const chart of chartOpts) {\n const chartKey = `chart_${state.globalChartIdx}`;\n ctx.charts.addChart(chartKey, {\n key: chartKey,\n chartSpaceXml: chartSpaceDesc.stringify(chart, ctx) ?? \"\",\n });\n\n drawingRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n `../charts/chart${state.globalChartIdx + 1}.xml`,\n );\n\n // cNvPr @title/@ext stay unbridged: WorksheetChartOptions.title is the\n // chart title (c:title) and its ext is the chart-space c:extLst —\n // neither belongs on the graphicFrame's cNvPr.\n const chartCnvPr = pickNonVisualDrawingProperties({\n ...chart,\n title: undefined,\n ext: undefined,\n });\n drawingCharts.push({\n ...pickAnchorOptions(chart),\n ...chartCnvPr,\n rId: `rId${rid}`,\n ...(chart.frameLocks ? { frameLocks: chart.frameLocks } : {}),\n ...(chart.macro !== undefined ? { macro: chart.macro } : {}),\n ...(chart.hyperlink ? { hyperlink: chart.hyperlink } : {}),\n ...(chart.zOrder !== undefined ? { zOrder: chart.zOrder } : {}),\n ...(chart.shapeId !== undefined ? { shapeId: chart.shapeId } : {}),\n });\n rid++;\n state.globalChartIdx++;\n }\n\n // Process SmartArt — the diagram parts themselves are passthrough, so the\n // relationship targets stay exactly the source-relative form; only the\n // rIds are renumbered into the rebuilt drawing rels.\n for (const sa of smartArtOpts) {\n const relTarget = (path: string): string =>\n path.startsWith(\"xl/\") ? `../${path.slice(3)}` : path;\n // One relationship per (kind, target) — anchors sharing a diagram set\n // share its relationships too.\n const addDiagRel = (relType: RelationshipType, path: string): string => {\n const target = relTarget(path);\n const existing = drawingRels.idOf(relType, target);\n if (existing !== undefined) return existing;\n drawingRels.addRelationship(rid, relType, target);\n return `rId${rid++}`;\n };\n const relBase = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\n drawingSmartArts.push({\n ...pickAnchorOptions(sa),\n ...pickNonVisualDrawingProperties(sa),\n dataRId: addDiagRel(`${relBase}/diagramData`, sa.dataPath),\n layoutRId: addDiagRel(`${relBase}/diagramLayout`, sa.layoutPath),\n quickStyleRId: addDiagRel(`${relBase}/diagramQuickStyle`, sa.quickStylePath),\n colorsRId: addDiagRel(`${relBase}/diagramColors`, sa.colorsPath),\n ...(sa.frameLocks ? { frameLocks: sa.frameLocks } : {}),\n ...(sa.macro !== undefined ? { macro: sa.macro } : {}),\n ...(sa.zOrder !== undefined ? { zOrder: sa.zOrder } : {}),\n ...(sa.shapeId !== undefined ? { shapeId: sa.shapeId } : {}),\n });\n }\n\n // Generate drawing XML (via descriptor). Snapshot the hyperlink registry\n // first so only runs stringified for this sheet's drawing resolve here.\n const hyperlinkBase = ctx.hyperlinks.length;\n const drawingXml = drawingDesc.stringify(\n {\n images: drawingImages,\n charts: drawingCharts,\n smartArts: drawingSmartArts,\n shapes: shapeOpts,\n connectors: connectorOpts,\n groups: groupOpts,\n },\n ctx,\n );\n // Resolve drawing shape text-hyperlink placeholders ({hlink:key} → real\n // rId) and register each as an External hyperlink relationship.\n let resolvedDrawingXml = drawingXml!;\n // One External relationship per distinct URL — several objects/runs\n // pointing at the same target share it (matches how Excel writes rels).\n const hlinkRidByUrl = new Map<string, number>();\n for (const h of ctx.hyperlinks.slice(hyperlinkBase)) {\n let hlinkRid = hlinkRidByUrl.get(h.url);\n if (hlinkRid === undefined) {\n drawingRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n h.url,\n \"External\",\n );\n hlinkRid = rid;\n hlinkRidByUrl.set(h.url, hlinkRid);\n rid++;\n }\n resolvedDrawingXml = resolvedDrawingXml\n .split(`r:id=\"{hlink:${h.key}}\"`)\n .join(`r:id=\"rId${hlinkRid}\"`);\n }\n // Shape blip fills inside the drawing register `{fileName}` media\n // placeholders — bind them the same way the theme does.\n resolvedDrawingXml = bindMediaPlaceholders(resolvedDrawingXml, ctx.media, drawingRels);\n const drawingIdx = i + 1;\n mapping[`Drawing${i}`] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${resolvedDrawingXml}`,\n path: `xl/drawings/drawing${drawingIdx}.xml`,\n };\n\n // Drawing relationships\n mapping[`DrawingRels${i}`] = {\n data: XML_DECL + drawingRels.serialize(),\n path: `xl/drawings/_rels/drawing${drawingIdx}.xml.rels`,\n };\n\n // Insert drawing reference at its CT_Worksheet sequence position.\n const drawingRid = ++nextRid;\n sheetXml = editSheetTailMarker(\n sheetXml,\n \"<!--DRAWING-->\",\n `<drawing r:id=\"rId${drawingRid}\"/>`,\n );\n\n // Add drawing relationship to worksheet rels\n wsRels!.addRelationship(\n drawingRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n `../drawings/drawing${drawingIdx}.xml`,\n );\n }\n\n // Comments\n if (hasComments) {\n const commentsIdx = i + 1;\n\n // Comments XML (via descriptor)\n const commentsXml = commentsDesc.stringify({ comments: commentOpts }, ctx);\n mapping[`Comments${i}`] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${commentsXml}`,\n path: `xl/comments${commentsIdx}.xml`,\n };\n\n // VML drawing (via descriptor)\n const vmlXml = vmlNotesDesc.stringify({ comments: commentOpts }, ctx);\n mapping[`VmlDrawing${i}`] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${vmlXml}`,\n path: `xl/drawings/vmlDrawing${commentsIdx}.vml`,\n };\n\n // Worksheet rels: comments → comments XML, legacyDrawing → VML file\n const commentsRid = ++nextRid;\n wsRels!.addRelationship(\n commentsRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n `../comments${commentsIdx}.xml`,\n );\n\n const vmlRid = ++nextRid;\n wsRels!.addRelationship(\n vmlRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n `../drawings/vmlDrawing${commentsIdx}.vml`,\n );\n\n // Insert legacyDrawing reference at its CT_Worksheet sequence position.\n sheetXml = editSheetTailMarker(\n sheetXml,\n \"<!--LEGACY_DRAWING-->\",\n `<legacyDrawing r:id=\"rId${vmlRid}\"/>`,\n );\n }\n\n // Background picture\n if (bgImg) {\n const ext = bgImg.type === \"jpg\" ? \"jpeg\" : bgImg.type;\n const rawBytes = toUint8Array(bgImg.data, { encoding: \"base64\" });\n const entry = ctx.media.addMedia(rawBytes, ext, (fileName) => ({\n fileName,\n type: ext,\n data: rawBytes,\n width: 0,\n height: 0,\n }));\n state.globalMediaIdx++;\n const bgRid = ++nextRid;\n wsRels!.addRelationship(bgRid, IMAGE_REL, `../media/${entry.fileName}`);\n sheetXml = editSheetTailMarker(\n sheetXml,\n \"<!--BACKGROUND_PICTURE-->\",\n `<picture r:id=\"rId${bgRid}\"/>`,\n );\n }\n\n // Round-trip drawing/legacyDrawing references. The referenced part passes\n // through verbatim when its anchors do not map onto options (e.g. OLE\n // object shape representations). With untouched (passthrough) worksheet\n // rels the original id stays valid; when the rels were rebuilt because the\n // same sheet carries comments/tables/…, re-register the passthrough\n // relationship — keeping the source id when it is free — so the reference\n // stays resolvable instead of dangling.\n const wsPath = `xl/worksheets/sheet${i + 1}.xml`;\n const resolvePassthroughRid = (typeFragment: string, originalRid: string): string => {\n if (!wsRels) return originalRid;\n const rel = (passthroughRelationships ?? []).find(\n (r) =>\n r.source === wsPath && r.rId === originalRid && r.relationshipType.endsWith(typeFragment),\n );\n if (!rel) return originalRid;\n const existing = wsRels.idOf(rel.relationshipType, rel.target);\n if (existing) return existing;\n if (wsRels.hasId(originalRid)) {\n const n = ++nextRid;\n wsRels.addRelationship(n, rel.relationshipType as RelationshipType, rel.target);\n return `rId${n}`;\n }\n wsRels.addRelationship(originalRid, rel.relationshipType as RelationshipType, rel.target);\n return originalRid;\n };\n if (wsOpts.drawingRid) {\n const rid = escapeXml(resolvePassthroughRid(\"/drawing\", wsOpts.drawingRid));\n sheetXml = editSheetTailMarker(sheetXml, \"<!--DRAWING-->\", `<drawing r:id=\"${rid}\"/>`);\n }\n if (wsOpts.legacyDrawingRid) {\n const rid = escapeXml(resolvePassthroughRid(\"/vmlDrawing\", wsOpts.legacyDrawingRid));\n sheetXml = editSheetTailMarker(\n sheetXml,\n \"<!--LEGACY_DRAWING-->\",\n `<legacyDrawing r:id=\"${rid}\"/>`,\n );\n }\n\n // Pivot tables\n if (hasPivots) {\n for (const pt of pivotOpts) {\n state.globalPivotIdx++;\n const pivotIdx = state.globalPivotIdx;\n\n // Extract source data from source sheet\n const sourceSheet = pt.sourceSheet ?? sheetName;\n const sourceWsIdx = findWorksheetIndex(worksheetConfigs, sourceSheet);\n if (sourceWsIdx === -1) continue;\n const sourceWs = worksheetConfigs[sourceWsIdx];\n if (!sourceWs) continue;\n\n const sourceRows = sourceWs.rows ?? [];\n const sourceData = extractPivotSourceData(sourceRows, pt.source);\n\n // Deduplicate pivot caches by source reference\n const cacheKey = `${sourceSheet}:${pt.source}`;\n let cacheId: number;\n let cacheIdx: number;\n const existing = state.pivotCacheDataMap.get(cacheKey);\n if (existing) {\n cacheId = existing.cacheId;\n cacheIdx = existing.cacheIdx;\n } else {\n state.globalPivotCacheIdx++;\n cacheIdx = state.globalPivotCacheIdx;\n cacheId = cacheIdx;\n state.pivotCacheDataMap.set(cacheKey, { cacheId, cacheIdx });\n\n // Generate pivotCacheDefinition\n const cacheDefRels = new Relationships();\n cacheDefRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecords\",\n \"pivotCacheRecords1.xml\",\n );\n\n const cacheDefXml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n pivotCacheDefDesc.stringify(\n {\n sourceRef: pt.source.split(\":\")[0] ? pt.source : \"A1\",\n sourceSheet,\n sourceData,\n recordsRid: \"rId1\",\n },\n ctx,\n );\n\n mapping[`PivotCacheDef${cacheIdx}`] = {\n data: cacheDefXml,\n path: `xl/pivotCache/pivotCacheDefinition${cacheIdx}.xml`,\n };\n mapping[`PivotCacheDefRels${cacheIdx}`] = {\n data: XML_DECL + cacheDefRels.serialize(),\n path: `xl/pivotCache/_rels/pivotCacheDefinition${cacheIdx}.xml.rels`,\n };\n\n // Generate pivotCacheRecords\n const cacheRecordsXml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n pivotCacheRecordsDesc.stringify({ sourceData }, ctx);\n mapping[`PivotCacheRecords${cacheIdx}`] = {\n data: cacheRecordsXml,\n path: `xl/pivotCache/pivotCacheRecords${cacheIdx}.xml`,\n };\n\n // Register in workbook\n const wbPivotRid = ctx.workbookRels.nextRelationshipId;\n ctx.workbookRels.addRelationship(\n wbPivotRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition\",\n `pivotCache/pivotCacheDefinition${cacheIdx}.xml`,\n );\n ctx.pivotCacheRefs.push({ cacheId, rId: `rId${wbPivotRid}` });\n }\n\n // Generate pivotTable\n const pivotTableXml =\n XML_DECL + pivotTableDesc.stringify({ options: pt, sourceData, cacheId }, ctx);\n mapping[`PivotTable${pivotIdx}`] = {\n data: pivotTableXml,\n path: `xl/pivotTables/pivotTable${pivotIdx}.xml`,\n };\n\n // pivotTable rels → cacheDefinition\n const ptRels = new Relationships();\n ptRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition\",\n `../pivotCache/pivotCacheDefinition${cacheIdx}.xml`,\n );\n mapping[`PivotTableRels${pivotIdx}`] = {\n data: XML_DECL + ptRels.serialize(),\n path: `xl/pivotTables/_rels/pivotTable${pivotIdx}.xml.rels`,\n };\n\n // Worksheet rels → pivotTable\n const ptRid = ++nextRid;\n wsRels!.addRelationship(\n ptRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable\",\n `../pivotTables/pivotTable${pivotIdx}.xml`,\n );\n }\n }\n\n // Tables (list objects)\n const wsTableParts: TablePartReference[] = [];\n if (hasTables) {\n for (const tbl of tableOpts) {\n state.globalTableIdx++;\n const tableIdx = state.globalTableIdx;\n\n // A table without columns cannot form valid tableColumns XML — skip\n // instead of emitting a broken part (defensive; parse filters these).\n if (!tbl.columns?.length) continue;\n\n // Generate table XML\n const tableXmlStr =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n tableDesc.stringify({ ...tbl, id: tbl.id ?? tableIdx }, ctx);\n mapping[`Table${tableIdx}`] = {\n data: tableXmlStr,\n path: `xl/tables/table${tableIdx}.xml`,\n };\n\n // Worksheet rels → table\n const tblRid = ++nextRid;\n wsRels!.addRelationship(\n tblRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/table\",\n `../tables/table${tableIdx}.xml`,\n );\n\n wsTableParts.push({ rId: `rId${tblRid}` });\n state.allTableParts.push({ rId: `rId${tblRid}` });\n }\n }\n\n // Query tables\n if (hasQueryTables) {\n for (const qt of queryTableOpts) {\n state.globalQueryTableIdx++;\n mapping[`QueryTable${state.globalQueryTableIdx}`] = {\n data: XML_DECL + queryTableDesc.stringify(qt, ctx),\n path: `xl/queryTables/queryTable${state.globalQueryTableIdx}.xml`,\n };\n const qtRid = ++nextRid;\n wsRels!.addRelationship(\n qtRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/queryTable\",\n `../queryTables/queryTable${state.globalQueryTableIdx}.xml`,\n );\n }\n }\n\n // Single-cell XML tables\n if (singleXmlCellOpts.length > 0) {\n state.globalSingleXmlCellsIdx++;\n mapping[`TableSingleCells${state.globalSingleXmlCellsIdx}`] = {\n data: XML_DECL + singleXmlCellsDesc.stringify({ cells: singleXmlCellOpts }, ctx),\n path: `xl/tables/tableSingleCells${state.globalSingleXmlCellsIdx}.xml`,\n };\n const sxcRid = ++nextRid;\n wsRels!.addRelationship(\n sxcRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableSingleCells\",\n `../tables/tableSingleCells${state.globalSingleXmlCellsIdx}.xml`,\n );\n }\n\n // Pre-render pivot table data into sheetData\n if (hasPivots) {\n const rendered = renderPivotSheetData(\n pivotOpts,\n worksheetConfigs,\n ctx.sharedStrings,\n sheetName,\n );\n if (rendered.sheetData.length > 0) {\n // Replace empty <sheetData/> or <sheetData></sheetData> with rendered data\n sheetXml = sheetXml.replace(/<sheetData\\/>|<sheetData><\\/sheetData>/, rendered.sheetData);\n // Inject <dimension> before <sheetViews> (XSD sequence order: dimension before sheetViews)\n if (!sheetXml.includes(\"<dimension\")) {\n sheetXml = sheetXml.replace(\n \"<sheetViews\",\n `<dimension ref=\"${rendered.dimensionRef}\"/><sheetViews`,\n );\n }\n }\n }\n\n // Insert tableParts at their CT_Worksheet sequence position\n if (wsTableParts.length > 0) {\n sheetXml = editSheetTailMarker(\n sheetXml,\n \"<!--TABLE_PARTS-->\",\n buildTablePartsXml(wsTableParts),\n );\n }\n // Strip placeholders the compiler did not replace (drawing, legacyDrawing,\n // tableParts) — their existence depends on relationships owned here.\n sheetXml = stripWorksheetPlaceholders(sheetXml);\n\n // Round-trip: re-emit sheet relationships the model did not absorb\n // (printerSettings above all). Rebuilding the rels for tables/comments/…\n // must not drop part associations the worksheet XML never references by\n // r:id. Targets are passthrough paths that never move, so kind+target\n // identifies an instance the model already registered (drawing above).\n if (wsRels) {\n // pageSetup r:id → printerSettings: the rebuilt rels renumber every id,\n // so remap the source id onto the re-emitted relationship (registered by\n // resolvePassthroughRid; the kind+target loop below then skips it).\n if (wsOpts.pageSetup?.printerSettingsRId) {\n const src = wsOpts.pageSetup.printerSettingsRId;\n const rid = resolvePassthroughRid(\"/printerSettings\", src);\n if (rid !== src) {\n sheetXml = sheetXml.replace(\n new RegExp(`(<pageSetup[^>]*r:id=\")${src.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}(\")`),\n `$1${rid}$2`,\n );\n }\n }\n // pivotSelection r:id → pivotTable: same renumbering concern — the\n // selection references a pivotTable by the source id, which a rebuilt\n // rels table may have handed to a different part type.\n if (wsOpts.pivotSelection?.rId) {\n const src = wsOpts.pivotSelection.rId;\n const rid = resolvePassthroughRid(\"/pivotTable\", src);\n if (rid !== src) {\n sheetXml = sheetXml.replace(\n new RegExp(\n `(<pivotSelection[^>]*r:id=\")${src.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}(\")`,\n ),\n `$1${rid}$2`,\n );\n }\n }\n for (const rel of passthroughRelationships ?? []) {\n if (rel.source !== wsPath) continue;\n if (wsRels.hasRelationship(rel.relationshipType, rel.target)) continue;\n const n = ++nextRid;\n wsRels.addRelationship(n, rel.relationshipType as RelationshipType, rel.target);\n }\n }\n\n // Write worksheet rels if needed\n if (wsRels) {\n mapping[`WorksheetRels${i}`] = {\n data: XML_DECL + wsRels.serialize(),\n path: `xl/worksheets/_rels/sheet${i + 1}.xml.rels`,\n };\n }\n\n mapping[`Worksheet${i}`] = {\n data: sheetXml,\n path: `xl/worksheets/sheet${i + 1}.xml`,\n };\n}\n\n/** Full-page default frame for a fresh chartsheet chart (≈9.70×6.35 in). */\nconst CHARTSHEET_DEFAULT_CX = 9308969;\nconst CHARTSHEET_DEFAULT_CY = 6096000;\n\n/** Compile all chartsheets: chart part, chartsheet/drawing XML and rels. */\nfunction compileChartsheets(\n chartsheetConfigs: ChartsheetOptions[],\n ctx: XlsxWriteContext,\n mapping: Record<string, { data: string; path: string }>,\n passthroughRelationships?: readonly PassthroughRelationship[],\n): void {\n // Chartsheets — chart-only sheets\n for (const [i, csOpts] of chartsheetConfigs.entries()) {\n // Register chart in the charts collection. Skip a chartsheet whose chart\n // could not be resolved (missing drawing/chart part in a broken source) —\n // safer than crashing the whole workbook compile.\n const chartDef = csOpts.chart;\n if (!chartDef) continue;\n const csChartGlobalIdx = ctx.charts.array.length;\n const csChartKey = `cs_chart_${csChartGlobalIdx}`;\n ctx.charts.addChart(csChartKey, {\n key: csChartKey,\n chartSpaceXml: chartSpaceDesc.stringify(chartDef, ctx) ?? \"\",\n });\n\n // Chartsheet relationships: drawing (required)\n const csRels = new Relationships();\n const csDrawingIdx = i + 1;\n csRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n `../drawings/drawing${csDrawingIdx}.xml`,\n );\n\n // Round-trip: re-emit chartsheet relationships the model did not absorb\n // (printerSettings above all) — same contract as worksheet rels.\n let csNextRid = 2;\n for (const rel of passthroughRelationships ?? []) {\n if (rel.source !== `xl/chartsheets/sheet${i + 1}.xml`) continue;\n if (csRels.hasRelationship(rel.relationshipType, rel.target)) continue;\n csRels.addRelationship(csNextRid++, rel.relationshipType as RelationshipType, rel.target);\n }\n\n // Drawing rels: chart reference\n const csDrawingRels = new Relationships();\n csDrawingRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n `../charts/chart${csChartGlobalIdx + 1}.xml`,\n );\n\n // Drawing XML with chart anchor — reuses the parts/drawing anchor and\n // graphicFrame builders (no hand-rolled xdr emitter). Round-tripped\n // sheets keep the source anchor geometry (the rendered chart size —\n // Excel writes it back verbatim on save); fresh sheets anchor at origin\n // with the full-page frame. The graphicFrame xfrm stays 0×0, Excel's own\n // chartsheet form: it sizes from the anchor ext and zeroes xfrm on save.\n const frame = graphicFrameXml(\n csOpts.shapeId ?? 1,\n undefined,\n `Chart ${i + 1}`,\n \"rId1\",\n 0,\n 0,\n ctx,\n {\n frameLocks: csOpts.frameLocks,\n macro: csOpts.macro,\n },\n );\n const anchor = wrapAnchor(\n {\n anchorType: \"absolute\",\n col: 1,\n row: 1,\n absoluteX: csOpts.absoluteX ?? 0,\n absoluteY: csOpts.absoluteY ?? 0,\n extentCx: csOpts.extentCx ?? CHARTSHEET_DEFAULT_CX,\n extentCy: csOpts.extentCy ?? CHARTSHEET_DEFAULT_CY,\n },\n `${frame}<xdr:clientData/>`,\n );\n const csDrawingXml = `<xdr:wsDr xmlns:xdr=\"${XDR_NS}\" xmlns:a=\"${A_NS}\" xmlns:r=\"${R_NS}\">${anchor}</xdr:wsDr>`;\n\n mapping[`ChartsheetDrawing${i}`] = {\n data: csDrawingXml,\n path: `xl/drawings/drawing${csDrawingIdx}.xml`,\n };\n mapping[`ChartsheetDrawingRels${i}`] = {\n data: XML_DECL + csDrawingRels.serialize(),\n path: `xl/drawings/_rels/drawing${csDrawingIdx}.xml.rels`,\n };\n\n mapping[`ChartsheetRels${i}`] = {\n data: XML_DECL + csRels.serialize(),\n path: `xl/chartsheets/_rels/sheet${i + 1}.xml.rels`,\n };\n\n // pageSetup r:id → printerSettings: the rebuilt rels renumber every id\n // (drawing holds rId1), so remap the source id onto the re-emitted\n // relationship — otherwise the passthrough .bin stays orphaned and Excel\n // discards it on the next save.\n let csPageSetup = csOpts.pageSetup;\n if (csPageSetup?.printerSettingsRId) {\n const srcRid = csPageSetup.printerSettingsRId;\n const rel = (passthroughRelationships ?? []).find(\n (r) =>\n r.source === `xl/chartsheets/sheet${i + 1}.xml` &&\n r.rId === srcRid &&\n r.relationshipType.endsWith(\"/printerSettings\"),\n );\n const rid = rel ? (csRels.idOf(rel.relationshipType, rel.target) ?? srcRid) : srcRid;\n if (rid !== srcRid) csPageSetup = { ...csPageSetup, printerSettingsRId: rid };\n }\n mapping[`Chartsheet${i}`] = {\n data:\n XML_DECL +\n chartsheetDesc.stringify({ ...csOpts, drawingRId: \"rId1\", pageSetup: csPageSetup }, ctx),\n path: `xl/chartsheets/sheet${i + 1}.xml`,\n };\n }\n}\n\n/** Compile all dialog sheets (legacy Excel 5.0 dialog sheets). */\nfunction compileDialogsheets(\n dialogsheetConfigs: DialogsheetOptions[],\n ctx: XlsxWriteContext,\n mapping: Record<string, { data: string; path: string }>,\n): void {\n // Dialogsheets — legacy Excel 5.0 dialog sheets\n for (const [i, dsOpts] of dialogsheetConfigs.entries()) {\n mapping[`Dialogsheet${i}`] = {\n data: XML_DECL + dialogsheetDesc.stringify(dsOpts, ctx),\n path: `xl/dialogSheets/sheet${i + 1}.xml`,\n };\n }\n}\n\n/**\n * Compile shared-workbook revisions (xl/revisionHeaders.xml +\n * xl/revisions/revisionN.xml + xl/users.xml). CT_Workbook has no revision\n * element — parts are discovered via workbook.xml.rels + [Content_Types].\n */\nfunction compileRevisionLogs(\n rl: NonNullable<WorkbookOptions[\"revisionLog\"]>,\n ctx: XlsxWriteContext,\n mapping: Record<string, { data: string; path: string }>,\n): void {\n const REV_HEADERS_REL =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionHeaders\";\n const REV_LOG_REL =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionLog\";\n const USERS_REL = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/users\";\n\n // xl/revisionHeaders.xml — target of an implicit relationship from the workbook.\n mapping[\"RevisionHeaders\"] = {\n data: XML_DECL + (revisionHeadersDesc.stringify(rl.headers, ctx) ?? \"\"),\n path: \"xl/revisionHeaders.xml\",\n };\n ctx.workbookRels.addRelationship(\n ctx.workbookRels.nextRelationshipId,\n REV_HEADERS_REL,\n \"revisionHeaders.xml\",\n );\n\n // One revision log per header entry, plus revisionHeaders.xml.rels pointing to each.\n const revHeadersRels = new Relationships();\n for (const [i, log] of rl.logs.entries()) {\n mapping[`RevisionLog${i}`] = {\n data: XML_DECL + (revisionLogDesc.stringify(log, ctx) ?? \"\"),\n path: `xl/revisions/revision${i + 1}.xml`,\n };\n revHeadersRels.addRelationship(i + 1, REV_LOG_REL, `revisions/revision${i + 1}.xml`);\n }\n mapping[\"RevisionHeadersRels\"] = {\n data: XML_DECL + revHeadersRels.serialize(),\n path: \"xl/_rels/revisionHeaders.xml.rels\",\n };\n\n // xl/users.xml (optional)\n if (rl.users) {\n const usersXml = usersDesc.stringify(rl.users, ctx);\n if (usersXml) {\n mapping[\"Users\"] = { data: XML_DECL + usersXml, path: \"xl/users.xml\" };\n ctx.workbookRels.addRelationship(ctx.workbookRels.nextRelationshipId, USERS_REL, \"users.xml\");\n }\n }\n}\n\n// ── Pure helper functions ──\n\nfunction buildWorkbookRelationships(\n rels: Relationships,\n wsCount: number,\n csCount: number,\n dsCount: number = 0,\n): void {\n let rid = 1;\n for (let i = 0; i < wsCount; i++) {\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n `worksheets/sheet${i + 1}.xml`,\n );\n }\n for (let i = 0; i < csCount; i++) {\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet\",\n `chartsheets/sheet${i + 1}.xml`,\n );\n }\n for (let i = 0; i < dsCount; i++) {\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet\",\n `dialogSheets/sheet${i + 1}.xml`,\n );\n }\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n \"styles.xml\",\n );\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n \"theme/theme1.xml\",\n );\n}\n\nfunction hasMetadataContent(metadata: MetadataOptions): boolean {\n return (\n (metadata.types?.length ?? 0) > 0 ||\n (metadata.strings?.length ?? 0) > 0 ||\n (metadata.mdx?.length ?? 0) > 0 ||\n (metadata.futureMetadata?.length ?? 0) > 0 ||\n (metadata.cellMetadata?.length ?? 0) > 0 ||\n (metadata.valueMetadata?.length ?? 0) > 0\n );\n}\n\nfunction extractPivotSourceData(rows: RowOptions[], sourceRef: string): PivotSourceData {\n const parts = sourceRef.split(\":\");\n const startMatch = parts[0]?.match(/^([A-Z]+)(\\d+)$/);\n const endMatch = parts[1]?.match(/^([A-Z]+)(\\d+)$/);\n if (!startMatch) {\n return { fieldNames: [], records: [] };\n }\n\n const startRow = parseInt(startMatch[2] ?? \"1\", 10) - 1;\n const endRow = endMatch ? parseInt(endMatch[2] ?? \"1\", 10) - 1 : startRow;\n const startCol = letterToColumn(startMatch[1] ?? \"A\") - 1;\n const endCol = endMatch ? letterToColumn(endMatch[1] ?? \"A\") - 1 : startCol;\n const colCount = endCol - startCol + 1;\n\n // First row is headers\n const headerRow = rows[startRow];\n const fieldNames: string[] = [];\n if (headerRow?.cells) {\n for (let c = startCol; c <= endCol && c < headerRow.cells.length; c++) {\n const hv = headerRow.cells[c]?.value;\n fieldNames.push(\n typeof hv === \"string\"\n ? hv\n : typeof hv === \"number\" || typeof hv === \"boolean\"\n ? String(hv)\n : `Col${c}`,\n );\n }\n }\n\n // Remaining rows are data\n const records: (string | number)[][] = [];\n for (let r = startRow + 1; r <= endRow; r++) {\n const row = rows[r];\n if (!row?.cells) continue;\n const record: (string | number)[] = [];\n for (let c = startCol; c <= endCol; c++) {\n const val = row.cells[c]?.value;\n if (typeof val === \"number\") {\n record.push(val);\n } else if (val instanceof Date) {\n record.push(val.getTime());\n } else {\n record.push(typeof val === \"string\" ? val : typeof val === \"boolean\" ? String(val) : \"\");\n }\n }\n if (record.length === colCount) {\n records.push(record);\n }\n }\n\n return { fieldNames, records };\n}\n\n/** Find a worksheet config by name, honoring the `Sheet${i+1}` default naming. */\nfunction findWorksheetIndex(configs: WorksheetOptions[], name: string): number {\n for (let i = 0; i < configs.length; i++) {\n const ws = configs[i]!;\n if ((ws.name ?? `Sheet${i + 1}`) === name) return i;\n }\n return -1;\n}\n\nfunction renderPivotSheetData(\n pivotOpts: PivotTableOptions[],\n worksheetConfigs: WorksheetOptions[],\n sharedStrings: SharedStrings,\n currentSheetName: string,\n): { sheetData: string; dimensionRef: string } {\n const rowCells = new Map<number, string[]>();\n let maxRow = 0;\n let maxCol = 0;\n let minRow = Infinity;\n let minCol = Infinity;\n\n for (const pt of pivotOpts) {\n const location = pt.location ?? \"A3\";\n const locMatch = location.match(/^([A-Z]+)(\\d+)$/);\n if (!locMatch) continue;\n\n const startCol = letterToColumn(locMatch[1] ?? \"A\") - 1;\n const startRow = parseInt(locMatch[2] ?? \"1\", 10);\n const rowFieldNames = pt.rows;\n const dataFields = pt.data;\n\n const sourceSheetName = pt.sourceSheet ?? currentSheetName;\n const sourceWsIdx = findWorksheetIndex(worksheetConfigs, sourceSheetName);\n if (sourceWsIdx === -1) continue;\n\n const sourceRows = worksheetConfigs[sourceWsIdx]?.rows ?? [];\n const sourceData = extractPivotSourceData(sourceRows, pt.source);\n if (sourceData.fieldNames.length === 0) continue;\n\n const fields = sourceData.fieldNames;\n const rowFieldIndices = rowFieldNames.map((n) => fields.indexOf(n));\n const dataFieldIndices = dataFields.map((df) => fields.indexOf(df.field));\n\n if (rowFieldIndices.some((idx) => idx === -1)) continue;\n if (dataFieldIndices.some((idx) => idx === -1)) continue;\n\n // Group records by row field values\n const groupMap = new Map<string, { keys: (string | number)[]; values: number[][] }>();\n for (const record of sourceData.records) {\n const groupKey = rowFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n let group = groupMap.get(groupKey);\n if (!group) {\n group = {\n keys: rowFieldIndices.map((fi) => {\n const v = record[fi];\n return typeof v === \"string\" || typeof v === \"number\" ? v : String(v ?? \"\");\n }),\n values: dataFieldIndices.map(() => []),\n };\n groupMap.set(groupKey, group);\n }\n for (const [di, fi] of dataFieldIndices.entries()) {\n const val = record[fi];\n if (typeof val === \"number\") {\n group.values[di]?.push(val);\n }\n }\n }\n\n // Column field info for cross-tab layout\n const colFieldNames = pt.columns ?? [];\n const colFieldIndices = colFieldNames.map((n) => fields.indexOf(n));\n\n const addCells = (rowIdx: number, cells: string[]) => {\n let arr = rowCells.get(rowIdx);\n if (!arr) {\n arr = [];\n rowCells.set(rowIdx, arr);\n }\n for (const c of cells) arr.push(c);\n minRow = Math.min(minRow, rowIdx);\n maxRow = Math.max(maxRow, rowIdx);\n };\n\n if (colFieldIndices.length > 0 && !colFieldIndices.some((idx) => idx === -1)) {\n // --- Cross-tab layout (with column fields) ---\n // Unique column values for the first column field\n const colUniqueVals = collectUniqueValues(sourceData.records, colFieldIndices[0] ?? 0).map(\n (v) => (typeof v === \"string\" || typeof v === \"number\" ? String(v) : String(v ?? \"\")),\n );\n\n // Build cross-tab map: rowKey → colKey → aggregated values per data field\n const crossTabMap = new Map<\n string,\n { rowKeys: (string | number)[]; colData: Map<string, number[][]>; rowTotals: number[][] }\n >();\n for (const record of sourceData.records) {\n const rowKey = rowFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n const colKey = colFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n let entry = crossTabMap.get(rowKey);\n if (!entry) {\n entry = {\n rowKeys: rowFieldIndices.map((fi) => {\n const v = record[fi];\n return typeof v === \"string\" || typeof v === \"number\" ? v : String(v ?? \"\");\n }),\n colData: new Map(),\n rowTotals: dataFieldIndices.map(() => []),\n };\n crossTabMap.set(rowKey, entry);\n }\n let colValues = entry.colData.get(colKey);\n if (!colValues) {\n colValues = dataFieldIndices.map(() => []);\n entry.colData.set(colKey, colValues);\n }\n for (const [di, fi] of dataFieldIndices.entries()) {\n const val = record[fi];\n if (typeof val === \"number\") {\n colValues[di]?.push(val);\n entry.rowTotals[di]?.push(val);\n }\n }\n }\n\n // Column count: row fields + column unique values + 1 (grand total column)\n const numColVals = colUniqueVals.length;\n const totalCols = rowFieldNames.length + numColVals + 1;\n const endCol = startCol + totalCols - 1;\n minCol = Math.min(minCol, startCol);\n maxCol = Math.max(maxCol, endCol);\n\n // Header row: [rowFieldName(s), ...colUniqueVals, dataFieldName or \"Grand Total\"]\n const headerCells: string[] = [];\n for (const rfName of rowFieldNames) {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n const strIdx = sharedStrings.register(rfName);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n for (const cv of colUniqueVals) {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n const strIdx = sharedStrings.register(cv);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n // Last header cell: data field name (e.g., \"Total Revenue\")\n {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n // Pivot layout requires at least one data field, so index 0 always exists.\n const df0 = dataFields[0]!;\n const subtotal = df0.summarize ?? \"sum\";\n const dfName = df0.name ?? `${subtotal === \"sum\" ? \"Sum\" : subtotal} of ${df0.field}`;\n const strIdx = sharedStrings.register(dfName);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n addCells(startRow, headerCells);\n\n // Data rows\n let currentRow = startRow + 1;\n for (const [, entry] of crossTabMap) {\n const cells: string[] = [];\n // Row label\n for (const [ri, rowKey] of entry.rowKeys.entries()) {\n const cellRef = colIndexToLetter(startCol + ri) + currentRow;\n const strIdx = sharedStrings.register(String(rowKey));\n cells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n // Column values for each unique column value\n for (const [ci, colKey] of colUniqueVals.entries()) {\n const colValues = entry.colData.get(colKey);\n const colOffset = rowFieldNames.length + ci;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const subtotal = dataFields[0]!.summarize ?? \"sum\";\n const result = colValues ? aggregate(colValues[0] ?? [], subtotal) : 0;\n cells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n // Row total (last column)\n {\n const colOffset = rowFieldNames.length + numColVals;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const subtotal = dataFields[0]!.summarize ?? \"sum\";\n const result = aggregate(entry.rowTotals[0] ?? [], subtotal);\n cells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n addCells(currentRow, cells);\n currentRow++;\n }\n\n // Grand total row\n const gtCells: string[] = [];\n const gtStrIdx = sharedStrings.register(\"Grand Total\");\n gtCells.push(\n `<c r=\"${colIndexToLetter(startCol)}${currentRow}\" t=\"s\"><v>${gtStrIdx}</v></c>`,\n );\n for (const [ci, colKey] of colUniqueVals.entries()) {\n const subtotal = dataFields[0]!.summarize ?? \"sum\";\n const colAllValues: number[] = [];\n const dfIdx0 = dataFieldIndices[0];\n for (const record of sourceData.records) {\n const recColKey = colFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n if (recColKey === colKey && dfIdx0 !== undefined) {\n const val = record[dfIdx0];\n if (typeof val === \"number\") colAllValues.push(val);\n }\n }\n const colOffset = rowFieldNames.length + ci;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const result = aggregate(colAllValues, subtotal);\n gtCells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n // Grand total (bottom-right)\n {\n const subtotal = dataFields[0]!.summarize ?? \"sum\";\n const dfIdx0 = dataFieldIndices[0];\n const allValues = sourceData.records\n .map((r) => (dfIdx0 !== undefined ? r[dfIdx0] : undefined))\n .filter((v): v is number => typeof v === \"number\");\n const colOffset = rowFieldNames.length + numColVals;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const result = aggregate(allValues, subtotal);\n gtCells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n addCells(currentRow, gtCells);\n } else {\n // --- Simple layout (no column fields) ---\n const endCol = startCol + rowFieldNames.length + dataFields.length - 1;\n minCol = Math.min(minCol, startCol);\n maxCol = Math.max(maxCol, endCol);\n\n // Header row\n const headerCells: string[] = [];\n for (const rfName of rowFieldNames) {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n const strIdx = sharedStrings.register(rfName);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n for (const df of dataFields) {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n const subtotal = df.summarize ?? \"sum\";\n const dfName = df.name ?? `${subtotal === \"sum\" ? \"Sum\" : subtotal} of ${df.field}`;\n const strIdx = sharedStrings.register(dfName);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n addCells(startRow, headerCells);\n\n // Data rows\n let currentRow = startRow + 1;\n for (const [, group] of groupMap) {\n const cells: string[] = [];\n for (const [ri, key] of group.keys.entries()) {\n const cellRef = colIndexToLetter(startCol + ri) + currentRow;\n const strIdx = sharedStrings.register(String(key));\n cells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n for (const [di, df] of dataFields.entries()) {\n const colOffset = rowFieldNames.length + di;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const subtotal = df.summarize ?? \"sum\";\n const result = aggregate(group.values[di] ?? [], subtotal);\n cells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n addCells(currentRow, cells);\n currentRow++;\n }\n\n // Grand total row\n const gtCells: string[] = [];\n const gtStrIdx = sharedStrings.register(\"Grand Total\");\n gtCells.push(\n `<c r=\"${colIndexToLetter(startCol)}${currentRow}\" t=\"s\"><v>${gtStrIdx}</v></c>`,\n );\n for (const [di, df] of dataFields.entries()) {\n const colOffset = rowFieldNames.length + di;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const subtotal = df.summarize ?? \"sum\";\n const dfIdx = dataFieldIndices[di];\n const allValues = sourceData.records\n .map((r) => (dfIdx !== undefined ? r[dfIdx] : undefined))\n .filter((v): v is number => typeof v === \"number\");\n const result = aggregate(allValues, subtotal);\n gtCells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n addCells(currentRow, gtCells);\n }\n }\n\n if (rowCells.size === 0) return { sheetData: \"\", dimensionRef: \"\" };\n\n // Build sheetData\n const parts: string[] = [\"<sheetData>\"];\n const sortedRows = [...rowCells.entries()].sort((a, b) => a[0] - b[0]);\n for (const [rowIdx, cells] of sortedRows) {\n parts.push(`<row r=\"${rowIdx}\" x14ac:dyDescent=\"0.25\">`);\n for (const c of cells) parts.push(c);\n parts.push(\"</row>\");\n }\n parts.push(\"</sheetData>\");\n\n const dimStartCol = colIndexToLetter(minCol === Infinity ? 0 : minCol);\n const dimStartRow = minRow === Infinity ? 1 : minRow;\n const dimensionRef = `${dimStartCol}${dimStartRow}:${colIndexToLetter(maxCol)}${maxRow}`;\n return { sheetData: parts.join(\"\"), dimensionRef };\n}\n\n/** 0-based column index → Excel letter(s); delegates to the 1-based util helper. */\nfunction colIndexToLetter(col: number): string {\n return columnToLetter(col + 1);\n}\n","/**\n * Streaming XLSX compilation — writes parts into a {@link ZipStreamWriter} as\n * they are produced instead of building the complete Zippable map first.\n *\n * The worksheet part (the only one that grows without bound) is serialized\n * row-chunk-wise through the shared `appendSheetDataRows`, so the full\n * worksheet XML string, its encoded bytes, and the archive buffer never\n * coexist. String cells use `t=\"inlineStr\"` (sharedStrings omitted) — the\n * documented Excel feature every constant-memory writer uses — because SST\n * indices would have to be known before the first row is written.\n *\n * Non-worksheet parts are small and come from the same descriptors as the\n * regular compile path, so their XML cannot drift.\n *\n * {@link generateWorkbookStream} routes plain-data workbooks here via\n * {@link canStreamWorkbook} and falls back to the full-memory stream for\n * anything richer — the fallback loses constant memory, not content.\n *\n * @module\n */\n\nimport {\n Relationships,\n ZipStreamWriter,\n appPropertiesDesc,\n buildCorePropertiesXmlString,\n buildRootRelationships,\n contentTypesDesc,\n customPropertiesDesc,\n deriveContentTypes,\n resolverFromRegistry,\n XLSX_PARTS,\n ZIP_DEFLATE_LEVEL,\n type CompressionOptions,\n} from \"@office-open/core\";\nimport { OOXML_XML_DECLARATION } from \"@office-open/xml\";\nimport type { WorkbookOptions } from \"@parts/file\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { createThemeXml } from \"@parts/theme\";\nimport { buildVolTypesXml } from \"@parts/vol-types\";\nimport { workbookDesc } from \"@parts/workbook\";\nimport type { SheetDefinition } from \"@parts/workbook\";\nimport type { RowOptions } from \"@parts/worksheet\";\nimport { appendSheetDataRows } from \"@parts/worksheet/stringify\";\nimport { columnToLetter } from \"@util/index\";\n\nimport { XlsxWriteContext } from \"./context\";\n\n/** Rows per serialization flush — bounds the intermediate chunk size. */\nconst ROWS_PER_CHUNK = 5_000;\n\nconst XLSX_CONTENT_TYPE_RESOLVER = resolverFromRegistry(XLSX_PARTS);\n\n/** Workbook keys this path serializes. Anything else falls back to full compile. */\nconst WORKBOOK_KEYS: ReadonlySet<string> = new Set([\n // core properties (CorePropertiesOptions)\n \"title\",\n \"subject\",\n \"creator\",\n \"keywords\",\n \"description\",\n \"lastModifiedBy\",\n \"revision\",\n \"lastPrinted\",\n \"created\",\n \"modified\",\n // workbook content this path emits\n \"worksheets\",\n \"appProperties\",\n \"customProperties\",\n \"workbookProtection\",\n \"definedNames\",\n \"fileRecoveryPr\",\n \"functionGroups\",\n \"webPublishing\",\n \"fileSharing\",\n \"volTypes\",\n]);\n\n/** Worksheet keys this path serializes. Anything else falls back to full compile. */\nconst WORKSHEET_KEYS: ReadonlySet<string> = new Set([\"name\", \"rows\", \"dimension\"]);\n\n/**\n * Whether {@link streamWorkbook} covers every feature this options tree uses.\n * Unknown keys (including fields added after this list was written) answer\n * `false`, so the caller falls back to the full compile path — the failure\n * mode is losing constant memory, never losing content.\n */\nexport function canStreamWorkbook(options: WorkbookOptions): boolean {\n for (const key of Object.keys(options)) {\n if (!WORKBOOK_KEYS.has(key)) return false;\n }\n for (const ws of options.worksheets ?? []) {\n for (const key of Object.keys(ws)) {\n if (!WORKSHEET_KEYS.has(key)) return false;\n }\n }\n return true;\n}\n\n/**\n * Compile a plain-data workbook into streaming ZIP output. Callers must gate\n * on {@link canStreamWorkbook} — this path silently omits parts for features\n * outside its subset.\n */\nexport function streamWorkbook(\n options: WorkbookOptions,\n ondata: (err: Error | null, chunk: Uint8Array, final: boolean) => void,\n compression: CompressionOptions = {},\n): void {\n const xmlLevel = compression.xml ?? ZIP_DEFLATE_LEVEL;\n const ctx = new XlsxWriteContext();\n const encoder = new TextEncoder();\n const writer = new ZipStreamWriter(ondata, xmlLevel);\n\n const worksheets = options.worksheets ?? [];\n const sheetPaths = worksheets.map((_, i) => `xl/worksheets/sheet${i + 1}.xml`);\n const hasCustomProperties = !!options.customProperties?.length;\n const hasVolTypes = !!(options.volTypes && options.volTypes.length > 0);\n\n // [Content_Types].xml leads per OPC; its part list is deterministic from\n // the options (this path emits a fixed part set).\n const partPaths = [\n \"[Content_Types].xml\",\n \"_rels/.rels\",\n \"docProps/core.xml\",\n \"docProps/app.xml\",\n \"xl/workbook.xml\",\n \"xl/_rels/workbook.xml.rels\",\n \"xl/styles.xml\",\n \"xl/theme/theme1.xml\",\n ...sheetPaths,\n ];\n if (hasCustomProperties) partPaths.push(\"docProps/custom.xml\");\n if (hasVolTypes) partPaths.push(\"xl/volTypes.xml\");\n\n const writeString = (path: string, xml: string): void => {\n const sink = writer.addPart(path, xmlLevel);\n sink.push(encoder.encode(xml));\n sink.end();\n };\n\n writeString(\n \"[Content_Types].xml\",\n OOXML_XML_DECLARATION +\n (contentTypesDesc.stringify(\n deriveContentTypes(partPaths, {\n resolve: XLSX_CONTENT_TYPE_RESOLVER,\n // This path emits no media parts, so there is nothing to resolve.\n mediaContentTypes: {},\n }),\n ctx,\n ) ?? \"\"),\n );\n writeString(\n \"_rels/.rels\",\n OOXML_XML_DECLARATION +\n buildRootRelationships(\n \"xl/workbook.xml\",\n hasCustomProperties,\n options.passthroughRelationships,\n ).serialize(),\n );\n writeString(\"docProps/core.xml\", OOXML_XML_DECLARATION + buildCorePropertiesXmlString(options));\n writeString(\n \"docProps/app.xml\",\n OOXML_XML_DECLARATION + (appPropertiesDesc.stringify(options.appProperties ?? {}, ctx) ?? \"\"),\n );\n if (hasCustomProperties) {\n writeString(\n \"docProps/custom.xml\",\n OOXML_XML_DECLARATION +\n (customPropertiesDesc.stringify({ properties: options.customProperties ?? [] }, ctx) ?? \"\"),\n );\n }\n\n // Workbook + its rels — the sheet list is known up front.\n const sheets: SheetDefinition[] = worksheets.map((ws, i) => ({\n name: ws.name ?? `Sheet${i + 1}`,\n sheetId: ws.sheetId ?? i + 1,\n state: ws.state,\n rId: `rId${i + 1}`,\n }));\n writeString(\n \"xl/workbook.xml\",\n OOXML_XML_DECLARATION +\n (workbookDesc.stringify(\n {\n sheets,\n protection: options.workbookProtection,\n definedNames: options.definedNames,\n fileRecoveryPr: options.fileRecoveryPr,\n functionGroups: options.functionGroups,\n webPublishing: options.webPublishing,\n fileSharing: options.fileSharing,\n },\n ctx,\n ) ?? \"\"),\n );\n // Volatile function types live in their own part (never a workbook child)\n if (hasVolTypes) {\n writeString(\n \"xl/volTypes.xml\",\n OOXML_XML_DECLARATION + buildVolTypesXml(options.volTypes ?? []),\n );\n }\n const wbRels = new Relationships();\n let rid = 1;\n for (let i = 0; i < sheets.length; i++) {\n wbRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n `worksheets/sheet${i + 1}.xml`,\n );\n }\n wbRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n \"styles.xml\",\n );\n wbRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n \"theme/theme1.xml\",\n );\n if (hasVolTypes) {\n wbRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/volTypes\",\n \"volTypes.xml\",\n );\n }\n writeString(\"xl/_rels/workbook.xml.rels\", OOXML_XML_DECLARATION + wbRels.serialize());\n\n // Worksheets — the streaming core. Cells serialize with sharedStrings\n // undefined, so string cells emit t=\"inlineStr\" and no SST part is written.\n for (const [i, ws] of worksheets.entries()) {\n const rows = ws.rows ?? [];\n const sink = writer.addPart(sheetPaths[i]!, xmlLevel);\n sink.push(\n encoder.encode(\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ),\n );\n const dimRef = ws.dimension ?? sheetDimension(rows);\n if (dimRef) sink.push(encoder.encode(`<dimension ref=\"${dimRef}\"/>`));\n sink.push(encoder.encode(\"<sheetData>\"));\n\n const buf: string[] = [];\n for (let start = 0; start < rows.length; start += ROWS_PER_CHUNK) {\n appendSheetDataRows(\n rows.slice(start, start + ROWS_PER_CHUNK),\n buf,\n undefined,\n ctx.styles,\n start + 1,\n );\n sink.push(encoder.encode(buf.join(\"\")));\n buf.length = 0;\n }\n sink.push(encoder.encode(\"</sheetData></worksheet>\"));\n sink.end();\n }\n\n // Styles last per sheet order — cell.style registrations are complete.\n writeString(\n \"xl/styles.xml\",\n OOXML_XML_DECLARATION + (stylesDesc.stringify({ styles: ctx.styles }, ctx) ?? \"\"),\n );\n writeString(\"xl/theme/theme1.xml\", OOXML_XML_DECLARATION + createThemeXml());\n\n writer.end();\n}\n\n/** Used-range ref (`A1:xxN`) from the row list; empty when there are no cells. */\nfunction sheetDimension(rows: RowOptions[]): string | undefined {\n const maxRow = rows.length;\n let maxCol = 0;\n for (const row of rows) {\n if (row.cells && row.cells.length > maxCol) maxCol = row.cells.length;\n }\n return maxRow > 0 && maxCol > 0 ? `A1:${columnToLetter(maxCol)}${maxRow}` : undefined;\n}\n","/**\n * Pure function API for generating XLSX files.\n *\n * @module\n */\n\nimport { createPacker, OoxmlMimeType } from \"@office-open/core\";\nimport {\n assertEncryptedExclusive,\n encryptedContainerOutput,\n encryptedContainerStream,\n} from \"@office-open/core\";\nimport type { OutputByType, OutputType, PackerOptions } from \"@office-open/core\";\nimport type { WorkbookOptions } from \"@parts/file\";\n\nimport { compileWorkbook } from \"./compiler\";\nimport { canStreamWorkbook, streamWorkbook } from \"./stream\";\n\n/** `@internal` Packer instance for XLSX generation. */\nconst Packer = createPacker<WorkbookOptions>({\n compile: (options, overrides, mediaLevel) => compileWorkbook(options, overrides, mediaLevel),\n mimeType: OoxmlMimeType.XLSX,\n});\n\n/** Whether any sheet collection carries content (encrypted passthrough must be exclusive). */\nfunction hasSheetContent(options: WorkbookOptions): boolean {\n return (\n (options.worksheets?.length ?? 0) > 0 ||\n (options.chartsheets?.length ?? 0) > 0 ||\n (options.dialogsheets?.length ?? 0) > 0\n );\n}\n\n/**\n * Re-emit the verbatim encrypted-container bytes, or `undefined` to compile.\n * Mixed content is rejected up front — compiling would silently drop it.\n */\nfunction encryptedPassthrough<T extends OutputType>(\n options: WorkbookOptions,\n type: T,\n): OutputByType[T] | undefined {\n assertEncryptedExclusive(options, hasSheetContent(options));\n return encryptedContainerOutput(options, type, OoxmlMimeType.XLSX);\n}\n\n/**\n * Generate an XLSX file from pure JSON options.\n *\n * The output format is controlled by `packerOptions.type` (default: `\"nodebuffer\"` → Buffer).\n * For synchronous generation, use {@link generateWorkbookSync}. For streaming, use {@link generateWorkbookStream}.\n *\n * @param options - Workbook options (worksheets, styles, etc.)\n * @param packerOptions - Optional packer configuration (type, compression, overrides, etc.)\n *\n * @example\n * ```typescript\n * import { generateWorkbook } from \"`@office`-open/xlsx\";\n *\n * const buffer = await generateWorkbook({ worksheets: [...] });\n * const bytes = await generateWorkbook({ worksheets: [...] }, { type: \"uint8array\" });\n * const blob = await generateWorkbook({ worksheets: [...] }, { type: \"blob\" });\n * ```\n */\nexport function generateWorkbook<T extends OutputType = \"nodebuffer\">(\n options: WorkbookOptions,\n packerOptions?: PackerOptions<T>,\n): Promise<OutputByType[T]> {\n const encrypted = encryptedPassthrough(options, packerOptions?.type ?? \"nodebuffer\");\n if (encrypted) return Promise.resolve(encrypted as OutputByType[T]);\n return Packer.pack(options, packerOptions) as Promise<OutputByType[T]>;\n}\n\n/**\n * Synchronously generate an XLSX file from pure JSON options.\n */\nexport function generateWorkbookSync<T extends OutputType = \"nodebuffer\">(\n options: WorkbookOptions,\n packerOptions?: PackerOptions<T>,\n): OutputByType[T] {\n const encrypted = encryptedPassthrough(options, packerOptions?.type ?? \"nodebuffer\");\n if (encrypted) return encrypted as OutputByType[T];\n return Packer.packSync(options, packerOptions) as OutputByType[T];\n}\n\n/**\n * Generate an XLSX file as a `ReadableStream<Uint8Array>`.\n *\n * Plain-data workbooks (worksheets with rows/cells, metadata) stream through\n * a constant-memory path: worksheet XML is written row-chunk-wise with inline\n * strings, so the full part and the archive never coexist in memory.\n * Workbooks using richer features (images, charts, tables, …) fall back to\n * the full-memory stream — same output contract, linear memory.\n */\nexport function generateWorkbookStream(\n options: WorkbookOptions,\n packerOptions?: PackerOptions,\n): ReadableStream<Uint8Array> {\n assertEncryptedExclusive(options, hasSheetContent(options));\n const encrypted = encryptedContainerStream(options);\n if (encrypted) return encrypted;\n if (!canStreamWorkbook(options)) {\n return Packer.toStream(options, packerOptions);\n }\n return new ReadableStream<Uint8Array>({\n start(controller) {\n try {\n streamWorkbook(\n options,\n (err, chunk, final) => {\n if (err) {\n controller.error(err);\n return;\n }\n controller.enqueue(chunk);\n if (final) controller.close();\n },\n packerOptions?.compression,\n );\n } catch (err) {\n controller.error(err instanceof Error ? err : new Error(String(err)));\n }\n },\n });\n}\n"],"mappings":"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"}
|