@office-kit/xlsx 0.11.0 → 0.11.1
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 +7 -0
- package/dist/cell/cell.d.ts +1 -1
- package/dist/cell/index.d.ts +4 -4
- package/dist/cell/rich-text.d.ts +1 -1
- package/dist/cell-BucgGwl3.mjs.map +1 -1
- package/dist/cell-style-DuvS_Lsg.mjs.map +1 -1
- package/dist/chart/chart-xml.d.ts +1 -1
- package/dist/chart/chart.d.ts +3 -3
- package/dist/chart/cx/chartex-xml.d.ts +1 -1
- package/dist/chart/cx/chartex.d.ts +2 -2
- package/dist/chart/index.d.ts +6 -6
- package/dist/chart/user-shapes-xml.d.ts +1 -1
- package/dist/chart/user-shapes.d.ts +2 -2
- package/dist/chart.mjs.map +1 -1
- package/dist/chartsheet/chartsheet-xml.d.ts +1 -1
- package/dist/chartsheet/chartsheet.d.ts +4 -4
- package/dist/chartsheet/index.d.ts +2 -2
- package/dist/chartsheet-C3-tqkPy.mjs.map +1 -1
- package/dist/coordinate-96Ecci4d.mjs.map +1 -1
- package/dist/datetime-B2ySVlXt.mjs.map +1 -1
- package/dist/defined-names-CviWmtQg.mjs.map +1 -1
- package/dist/differential-DvKU8fJt.mjs.map +1 -1
- package/dist/drawing/dml/dml-xml.d.ts +8 -8
- package/dist/drawing/dml/effect.d.ts +2 -2
- package/dist/drawing/dml/fill.d.ts +1 -1
- package/dist/drawing/dml/geometry.d.ts +1 -1
- package/dist/drawing/dml/line.d.ts +1 -1
- package/dist/drawing/dml/shape-properties.d.ts +5 -5
- package/dist/drawing/dml/text.d.ts +4 -4
- package/dist/drawing/drawing-xml.d.ts +1 -1
- package/dist/drawing/drawing.d.ts +9 -9
- package/dist/drawing/index.d.ts +14 -14
- package/dist/drawing-BxzLuryn.mjs.map +1 -1
- package/dist/drawing.mjs.map +1 -1
- package/dist/{escape-DFTE7ZJc.mjs → escape-rnWSPpWY.mjs} +4 -6
- package/dist/{escape-DFTE7ZJc.mjs.map → escape-rnWSPpWY.mjs.map} +1 -1
- package/dist/formula/tokenizer.d.ts +1 -1
- package/dist/formula/translate.d.ts +2 -2
- package/dist/io/browser.d.ts +2 -2
- package/dist/io/index.d.ts +7 -7
- package/dist/io/load.d.ts +4 -4
- package/dist/io/node-fs.d.ts +2 -2
- package/dist/io/node-save.d.ts +2 -2
- package/dist/io/node.d.ts +2 -2
- package/dist/io/save.d.ts +2 -2
- package/dist/io.mjs +2 -2
- package/dist/io.mjs.map +1 -1
- package/dist/{load-MyOIjtrU.mjs → load-Bghb1YHY.mjs} +5 -5
- package/dist/load-Bghb1YHY.mjs.map +1 -0
- package/dist/{manifest-Cm9K7D62.mjs → manifest-pLmx7KYh.mjs} +3 -3
- package/dist/manifest-pLmx7KYh.mjs.map +1 -0
- package/dist/node.d.ts +3 -3
- package/dist/node.mjs +1 -1
- package/dist/node.mjs.map +1 -1
- package/dist/packaging/core.d.ts +1 -1
- package/dist/packaging/custom.d.ts +2 -2
- package/dist/packaging/extended.d.ts +2 -2
- package/dist/packaging/index.d.ts +10 -10
- package/dist/packaging.mjs +1 -1
- package/dist/{parser-D3SLaOFe.mjs → parser-By6RWZVW.mjs} +39 -10
- package/dist/parser-By6RWZVW.mjs.map +1 -0
- package/dist/reader-BNaUTVCy.mjs.map +1 -1
- package/dist/{save-2moCT3Af.mjs → save-Bqcf8w3g.mjs} +6 -6
- package/dist/save-Bqcf8w3g.mjs.map +1 -0
- package/dist/schema/core.d.ts +1 -1
- package/dist/schema/index.d.ts +3 -3
- package/dist/schema/serialize.d.ts +2 -2
- package/dist/serialize-BC2Wu3bR.mjs.map +1 -1
- package/dist/{serializer-BtO2TrI7.mjs → serializer-C6nm0mRJ.mjs} +2 -2
- package/dist/serializer-C6nm0mRJ.mjs.map +1 -0
- package/dist/streaming/index.d.ts +2 -2
- package/dist/streaming/read-only.d.ts +4 -4
- package/dist/streaming/write-only.d.ts +7 -7
- package/dist/streaming.mjs +6 -6
- package/dist/streaming.mjs.map +1 -1
- package/dist/styles/alignment.schema.d.ts +2 -2
- package/dist/styles/borders.d.ts +1 -1
- package/dist/styles/borders.schema.d.ts +2 -2
- package/dist/styles/cell-style.d.ts +9 -9
- package/dist/styles/colors.schema.d.ts +2 -2
- package/dist/styles/differential.d.ts +7 -7
- package/dist/styles/fills.d.ts +1 -1
- package/dist/styles/fills.schema.d.ts +2 -2
- package/dist/styles/fonts.d.ts +1 -1
- package/dist/styles/fonts.schema.d.ts +2 -2
- package/dist/styles/index.d.ts +21 -21
- package/dist/styles/named-styles.d.ts +6 -6
- package/dist/styles/numbers.schema.d.ts +2 -2
- package/dist/styles/protection.schema.d.ts +2 -2
- package/dist/styles/stylesheet-reader.d.ts +1 -1
- package/dist/styles/stylesheet-writer.d.ts +1 -1
- package/dist/styles/stylesheet.d.ts +8 -8
- package/dist/{stylesheet-writer-BrOw4jMY.mjs → stylesheet-writer-HxaX7bGy.mjs} +6 -6
- package/dist/stylesheet-writer-HxaX7bGy.mjs.map +1 -0
- package/dist/table-1P8we2gS.mjs.map +1 -1
- package/dist/tree-BX-sRRVp.mjs.map +1 -1
- package/dist/user-shapes-DfmCGKB0.mjs.map +1 -1
- package/dist/utf8-Tn3nzyik.mjs.map +1 -1
- package/dist/utils/escape.d.ts +3 -5
- package/dist/utils/index.d.ts +11 -11
- package/dist/utils.mjs +1 -1
- package/dist/workbook/calc-properties.d.ts +1 -1
- package/dist/workbook/defined-names.d.ts +3 -3
- package/dist/workbook/index.d.ts +24 -24
- package/dist/workbook/protection.d.ts +1 -1
- package/dist/workbook/shared-strings.d.ts +2 -2
- package/dist/workbook/views.d.ts +1 -1
- package/dist/workbook/workbook-properties.d.ts +1 -1
- package/dist/workbook/workbook.d.ts +46 -46
- package/dist/{workbook-CARZS94U.mjs → workbook-BlZVXiyG.mjs} +3 -3
- package/dist/workbook-BlZVXiyG.mjs.map +1 -0
- package/dist/workbook.mjs +1 -1
- package/dist/workbook.mjs.map +1 -1
- package/dist/worksheet/auto-filter.d.ts +1 -1
- package/dist/worksheet/cell-range.d.ts +2 -2
- package/dist/worksheet/comments-xml.d.ts +1 -1
- package/dist/worksheet/conditional-formatting.d.ts +2 -2
- package/dist/worksheet/custom-sheet-views.d.ts +2 -2
- package/dist/worksheet/data-validations.d.ts +2 -2
- package/dist/worksheet/errors.d.ts +1 -1
- package/dist/worksheet/hyperlinks.d.ts +1 -1
- package/dist/worksheet/index.d.ts +46 -46
- package/dist/worksheet/ole-objects.d.ts +1 -1
- package/dist/worksheet/page-setup.d.ts +1 -1
- package/dist/worksheet/properties.d.ts +1 -1
- package/dist/worksheet/protected-ranges.d.ts +1 -1
- package/dist/worksheet/protection.d.ts +1 -1
- package/dist/worksheet/reader.d.ts +9 -9
- package/dist/worksheet/scenarios.d.ts +1 -1
- package/dist/worksheet/table-xml.d.ts +1 -1
- package/dist/worksheet/table.d.ts +3 -3
- package/dist/worksheet/worksheet.d.ts +31 -31
- package/dist/worksheet/writer.d.ts +9 -9
- package/dist/worksheet-C5Ensf_j.mjs.map +1 -1
- package/dist/worksheet.mjs.map +1 -1
- package/dist/writer-IyFccCRJ.mjs.map +1 -1
- package/dist/xml/index.d.ts +10 -10
- package/dist/xml/parser.d.ts +1 -1
- package/dist/xml/serializer.d.ts +1 -1
- package/dist/xml/stream-writer.d.ts +1 -1
- package/dist/xml.mjs +3 -3
- package/dist/xml.mjs.map +1 -1
- package/dist/zip/decompression-guard.d.ts +1 -1
- package/dist/zip/index.d.ts +6 -6
- package/dist/zip/random-access-reader.d.ts +2 -2
- package/dist/zip/reader.d.ts +2 -2
- package/dist/zip/writer.d.ts +1 -1
- package/package.json +4 -1
- package/dist/load-MyOIjtrU.mjs.map +0 -1
- package/dist/manifest-Cm9K7D62.mjs.map +0 -1
- package/dist/parser-D3SLaOFe.mjs.map +0 -1
- package/dist/save-2moCT3Af.mjs.map +0 -1
- package/dist/serializer-BtO2TrI7.mjs.map +0 -1
- package/dist/stylesheet-writer-BrOw4jMY.mjs.map +0 -1
- package/dist/workbook-CARZS94U.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-MyOIjtrU.mjs","names":[],"sources":["../src/styles/stylesheet-reader.ts","../src/io/load.ts"],"sourcesContent":["// xl/styles.xml → Stylesheet reader.\n//\n// The reader preserves slot ordering exactly — cellXfs[3] in the source xlsx\n// must come back as cellXfs[3] in the loaded Workbook because every `<c s=\"3\">`\n// reference depends on the index, not on the value's identity. That rules out\n// the `addFont` / `addCellXf` dedup helpers (which collapse equal values);\n// instead we push raw entries and rebuild the `_*IdByKey` maps at the end so\n// subsequent edits go back through dedup.\n\nimport { fromTree } from '../schema/serialize';\nimport { OpenXmlSchemaError } from '../utils/exceptions';\nimport { stableStringify } from '../utils/stable-stringify';\nimport { qname, SHEET_MAIN_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { findChild, findChildren, type XmlNode } from '../xml/tree';\nimport { AlignmentSchema } from './alignment.schema';\nimport type { Border } from './borders';\nimport { BorderSchema } from './borders.schema';\nimport type { DifferentialStyle, StylesheetWithDxfs } from './differential';\nimport type { Fill } from './fills';\nimport { fillFromTree } from './fills.schema';\nimport type { Font } from './fonts';\nimport { FontSchema } from './fonts.schema';\nimport type { StylesheetNamedStyle } from './named-styles';\nimport type { NumberFormat } from './numbers';\nimport { NumberFormatSchema } from './numbers.schema';\nimport { ProtectionSchema } from './protection.schema';\nimport { type CellXf, makeStylesheet, type Stylesheet } from './stylesheet';\n\nconst STYLESHEET_TAG = qname(SHEET_MAIN_NS, 'styleSheet');\nconst FONTS_TAG = qname(SHEET_MAIN_NS, 'fonts');\nconst FILLS_TAG = qname(SHEET_MAIN_NS, 'fills');\nconst BORDERS_TAG = qname(SHEET_MAIN_NS, 'borders');\nconst NUMFMTS_TAG = qname(SHEET_MAIN_NS, 'numFmts');\nconst NUMFMT_TAG = qname(SHEET_MAIN_NS, 'numFmt');\nconst CELLXFS_TAG = qname(SHEET_MAIN_NS, 'cellXfs');\nconst CELLSTYLEXFS_TAG = qname(SHEET_MAIN_NS, 'cellStyleXfs');\nconst CELLSTYLES_TAG = qname(SHEET_MAIN_NS, 'cellStyles');\nconst CELLSTYLE_TAG = qname(SHEET_MAIN_NS, 'cellStyle');\nconst DXFS_TAG = qname(SHEET_MAIN_NS, 'dxfs');\nconst DXF_TAG = qname(SHEET_MAIN_NS, 'dxf');\nconst XF_TAG = qname(SHEET_MAIN_NS, 'xf');\n// Every `<styleSheet>` child this reader turns into typed model state. Anything\n// else — `<tableStyles>`, `<colors>`, `<extLst>` — is kept verbatim instead.\nconst MODELED_SECTION_TAGS: ReadonlySet<string> = new Set([\n NUMFMTS_TAG,\n FONTS_TAG,\n FILLS_TAG,\n BORDERS_TAG,\n CELLSTYLEXFS_TAG,\n CELLXFS_TAG,\n CELLSTYLES_TAG,\n DXFS_TAG,\n]);\nconst FONT_TAG = qname(SHEET_MAIN_NS, 'font');\nconst FILL_TAG = qname(SHEET_MAIN_NS, 'fill');\nconst BORDER_TAG = qname(SHEET_MAIN_NS, 'border');\nconst NUMFMT_INNER_TAG = qname(SHEET_MAIN_NS, 'numFmt');\nconst ALIGNMENT_TAG = qname(SHEET_MAIN_NS, 'alignment');\nconst PROTECTION_TAG = qname(SHEET_MAIN_NS, 'protection');\n\n/**\n * Parse `xl/styles.xml` and return a fully-populated {@link Stylesheet}. Slot\n * ordering is preserved verbatim; the dedup index Maps are rebuilt after the\n * fact so future `addFont` / `addCellXf` calls keep working.\n */\nexport function parseStylesheetXml(bytes: Uint8Array | string): Stylesheet {\n const root = parseXml(bytes);\n if (root.name !== STYLESHEET_TAG) {\n throw new OpenXmlSchemaError(`parseStylesheetXml: root is \"${root.name}\", expected styleSheet`);\n }\n\n // Start from a Stylesheet whose default-pool entries we'll wholesale replace\n // with the XML's actual contents.\n const ss = makeStylesheet();\n ss.fonts.length = 0;\n ss.fills.length = 0;\n ss.borders.length = 0;\n\n for (const fontEl of findInSection(root, FONTS_TAG, FONT_TAG)) {\n ss.fonts.push(fromTree(fontEl, FontSchema));\n }\n for (const fillEl of findInSection(root, FILLS_TAG, FILL_TAG)) {\n ss.fills.push(fillFromTree(fillEl));\n }\n for (const borderEl of findInSection(root, BORDERS_TAG, BORDER_TAG)) {\n ss.borders.push(fromTree(borderEl, BorderSchema));\n }\n\n // numFmts is a Map<id, code>; id is on the element so a sparse Map works.\n for (const numFmtEl of findInSection(root, NUMFMTS_TAG, NUMFMT_TAG)) {\n const nf = parseNumFmt(numFmtEl);\n ss.numFmts.set(nf.numFmtId, nf.formatCode);\n }\n\n for (const xfEl of findInSection(root, CELLSTYLEXFS_TAG, XF_TAG)) {\n ss.cellStyleXfs.push(parseCellXf(xfEl));\n }\n for (const xfEl of findInSection(root, CELLXFS_TAG, XF_TAG)) {\n ss.cellXfs.push(parseCellXf(xfEl));\n }\n\n // cellStyles → ss.namedStyles\n const cellStylesEl = findChild(root, CELLSTYLES_TAG);\n if (cellStylesEl) {\n const named: StylesheetNamedStyle[] = [];\n for (const cs of findChildren(cellStylesEl, CELLSTYLE_TAG)) {\n const name = cs.attrs['name'];\n const xfId = parseIntAttr(cs.attrs['xfId'], 'xfId');\n if (name === undefined || xfId === undefined) continue;\n const entry: StylesheetNamedStyle = {\n name,\n xfId,\n ...(cs.attrs['builtinId'] !== undefined ? { builtinId: parseIntAttr(cs.attrs['builtinId'], 'builtinId') ?? 0 } : {}),\n ...(cs.attrs['iLevel'] !== undefined ? { iLevel: parseIntAttr(cs.attrs['iLevel'], 'iLevel') ?? 0 } : {}),\n ...(parseBoolAttr(cs.attrs['hidden']) === true ? { hidden: true } : {}),\n ...(parseBoolAttr(cs.attrs['customBuiltin']) === true ? { customBuiltin: true } : {}),\n };\n named.push(entry);\n }\n if (named.length > 0) {\n ss.namedStyles = named;\n ss._namedStyleByName = new Map(named.map((n) => [n.name, n]));\n }\n }\n\n // dxfs → ss.dxfs\n const dxfsEl = findChild(root, DXFS_TAG);\n if (dxfsEl) {\n const dxfs: DifferentialStyle[] = [];\n for (const dxfEl of findChildren(dxfsEl, DXF_TAG)) {\n const fontEl = findChild(dxfEl, FONT_TAG);\n const numFmtEl = findChild(dxfEl, NUMFMT_INNER_TAG);\n const fillEl = findChild(dxfEl, FILL_TAG);\n const alignmentEl = findChild(dxfEl, ALIGNMENT_TAG);\n const borderEl = findChild(dxfEl, BORDER_TAG);\n const protectionEl = findChild(dxfEl, PROTECTION_TAG);\n const dxf: DifferentialStyle = {\n ...(fontEl ? { font: fromTree(fontEl, FontSchema) } : {}),\n ...(numFmtEl ? { numFmt: fromTree(numFmtEl, NumberFormatSchema) } : {}),\n ...(fillEl ? { fill: fillFromTree(fillEl) } : {}),\n ...(alignmentEl ? { alignment: fromTree(alignmentEl, AlignmentSchema) } : {}),\n ...(borderEl ? { border: fromTree(borderEl, BorderSchema) } : {}),\n ...(protectionEl ? { protection: fromTree(protectionEl, ProtectionSchema) } : {}),\n };\n dxfs.push(Object.freeze(dxf));\n }\n if (dxfs.length > 0) {\n const w = ss as StylesheetWithDxfs;\n w.dxfs = dxfs;\n w._dxfIdByKey = new Map(dxfs.map((d, i) => [stableStringify(d), i]));\n }\n }\n\n const tail = root.children.filter((child) => !MODELED_SECTION_TAGS.has(child.name));\n if (tail.length > 0) ss.stylesXmlTail = tail;\n\n rebuildIndexes(ss);\n return ss;\n}\n\n/** Drill from `<styleSheet>` into a numbered section and yield every matching child. */\nfunction findInSection(root: XmlNode, sectionTag: string, itemTag: string): XmlNode[] {\n const section = findChild(root, sectionTag);\n if (!section) return [];\n return findChildren(section, itemTag);\n}\n\nconst parseNumFmt = (node: XmlNode): NumberFormat => {\n const idAttr = node.attrs['numFmtId'];\n const code = node.attrs['formatCode'];\n if (idAttr === undefined) {\n throw new OpenXmlSchemaError('styles: <numFmt> missing @numFmtId');\n }\n if (code === undefined) {\n throw new OpenXmlSchemaError(`styles: <numFmt numFmtId=\"${idAttr}\"> missing @formatCode`);\n }\n const numFmtId = Number.parseInt(idAttr, 10);\n if (!Number.isInteger(numFmtId) || numFmtId < 0) {\n throw new OpenXmlSchemaError(`styles: <numFmt numFmtId=\"${idAttr}\"> is not a non-negative integer`);\n }\n return { numFmtId, formatCode: code };\n};\n\nconst parseIntAttr = (raw: string | undefined, label: string): number | undefined => {\n if (raw === undefined) return undefined;\n const n = Number.parseInt(raw, 10);\n if (!Number.isInteger(n) || n < 0) {\n throw new OpenXmlSchemaError(`styles: <xf ${label}=\"${raw}\"> is not a non-negative integer`);\n }\n return n;\n};\n\nconst parseBoolAttr = (raw: string | undefined): boolean | undefined => {\n if (raw === undefined) return undefined;\n if (raw === '1' || raw === 'true') return true;\n if (raw === '0' || raw === 'false') return false;\n return undefined;\n};\n\nconst parseCellXf = (node: XmlNode): CellXf => {\n const fontId = parseIntAttr(node.attrs['fontId'], 'fontId') ?? 0;\n const fillId = parseIntAttr(node.attrs['fillId'], 'fillId') ?? 0;\n const borderId = parseIntAttr(node.attrs['borderId'], 'borderId') ?? 0;\n const numFmtId = parseIntAttr(node.attrs['numFmtId'], 'numFmtId') ?? 0;\n const xfId = parseIntAttr(node.attrs['xfId'], 'xfId');\n\n const applyFont = parseBoolAttr(node.attrs['applyFont']);\n const applyFill = parseBoolAttr(node.attrs['applyFill']);\n const applyBorder = parseBoolAttr(node.attrs['applyBorder']);\n const applyNumberFormat = parseBoolAttr(node.attrs['applyNumberFormat']);\n const applyAlignment = parseBoolAttr(node.attrs['applyAlignment']);\n const applyProtection = parseBoolAttr(node.attrs['applyProtection']);\n const pivotButton = parseBoolAttr(node.attrs['pivotButton']);\n const quotePrefix = parseBoolAttr(node.attrs['quotePrefix']);\n\n const alignmentEl = findChild(node, ALIGNMENT_TAG);\n const protectionEl = findChild(node, PROTECTION_TAG);\n\n return {\n fontId,\n fillId,\n borderId,\n numFmtId,\n ...(xfId !== undefined ? { xfId } : {}),\n ...(alignmentEl ? { alignment: fromTree(alignmentEl, AlignmentSchema) } : {}),\n ...(protectionEl ? { protection: fromTree(protectionEl, ProtectionSchema) } : {}),\n ...(applyFont !== undefined ? { applyFont } : {}),\n ...(applyFill !== undefined ? { applyFill } : {}),\n ...(applyBorder !== undefined ? { applyBorder } : {}),\n ...(applyNumberFormat !== undefined ? { applyNumberFormat } : {}),\n ...(applyAlignment !== undefined ? { applyAlignment } : {}),\n ...(applyProtection !== undefined ? { applyProtection } : {}),\n ...(pivotButton !== undefined ? { pivotButton } : {}),\n ...(quotePrefix !== undefined ? { quotePrefix } : {}),\n };\n};\n\n/** Repopulate the `_*IdByKey` maps from the freshly-loaded pool entries. */\nfunction rebuildIndexes(ss: Stylesheet): void {\n ss._fontIdByKey = buildKeyIndex<Font>(ss.fonts);\n ss._fillIdByKey = buildKeyIndex<Fill>(ss.fills);\n ss._borderIdByKey = buildKeyIndex<Border>(ss.borders);\n ss._xfIdByKey = buildKeyIndex<CellXf>(ss.cellXfs);\n ss._styleXfIdByKey = buildKeyIndex<CellXf>(ss.cellStyleXfs);\n ss._numFmtIdByCode = new Map();\n for (const [id, code] of ss.numFmts) ss._numFmtIdByCode.set(code, id);\n}\n\nconst buildKeyIndex = <T>(arr: ReadonlyArray<T>): Map<string, number> => {\n const m = new Map<string, number>();\n for (let i = 0; i < arr.length; i++) {\n const key = stableStringify(arr[i] as T);\n if (!m.has(key)) m.set(key, i);\n }\n return m;\n};\n","// Public `loadWorkbook` entry point.\n//\n// **This is the minimum-skeleton stage**: open zip → parse manifest → resolve\n// workbook part path → parse the `<sheets>` list → for each sheet, allocate an\n// empty Worksheet (title + sheetId + state). Reading the actual cell content /\n// styles / sharedStrings / theme / docProps happens in the next iterations of\n// the loop.\n//\n// The skeleton is enough to round-trip through openpyxl's `genuine/empty.xlsx`\n// fixture (3 empty sheets) and to give the rest of phase 3 a stable scaffolding\n// to layer onto.\n\nimport { findUserShapesRId, parseChartXml } from '../chart/chart-xml';\nimport { isChartExBytes, parseChartExXml } from '../chart/cx/chartex-xml';\nimport { parseUserShapesXml } from '../chart/user-shapes-xml';\nimport { parseChartsheetXml } from '../chartsheet/chartsheet-xml';\nimport { collectRawRelIds, parseDrawingXml } from '../drawing/drawing-xml';\nimport { loadImage } from '../drawing/image';\nimport type { XlsxSource } from '../io/source';\nimport { corePropsFromBytes } from '../packaging/core';\nimport { customPropsFromBytes } from '../packaging/custom';\nimport { extendedPropsFromBytes } from '../packaging/extended';\nimport { manifestFromBytes } from '../packaging/manifest';\nimport { findById, indexRelsById, makeRelationships, type Relationship, relsFromBytes } from '../packaging/relationships';\nimport { parseStylesheetXml } from '../styles/stylesheet-reader';\nimport { OpenXmlSchemaError } from '../utils/exceptions';\nimport type { DefinedName } from '../workbook/defined-names';\nimport { makeDefinedName } from '../workbook/defined-names';\nimport { parseSharedStringsXml, type SharedStringsTable } from '../workbook/shared-strings';\nimport { createWorkbook, type SheetRef, type SheetState, type Workbook } from '../workbook/workbook';\nimport { parseCommentsXml } from '../worksheet/comments-xml';\nimport { parseWorksheetXml } from '../worksheet/reader';\nimport { parseTableXml } from '../worksheet/table-xml';\nimport {\n ARC_APP,\n ARC_CONTENT_TYPES,\n ARC_CORE,\n ARC_CUSTOM,\n ARC_ROOT_RELS,\n ARC_SHARED_STRINGS,\n ARC_STYLE,\n ARC_THEME,\n ARC_WORKBOOK,\n MARKUP_COMPAT_NS,\n parseQName,\n REL_NS,\n SHEET_MAIN_NS,\n} from '../xml/namespaces';\nimport { type ParsedDocument, parseXmlDocument } from '../xml/parser';\nimport { findChild, findChildren, type XmlNode } from '../xml/tree';\nimport type { DecompressionLimits } from '../zip/decompression-guard';\nimport { openZip, type ZipArchive } from '../zip/reader';\n\n/**\n * Options for {@link loadWorkbook}. Earlier drafts exposed `readOnly` /\n * `keepLinks` / `keepVba` / `dataOnly` / `richText` placeholders that the\n * loader silently ignored; those were removed to keep the surface honest.\n * Future toggles land here once their behavior is implemented.\n */\nexport interface LoadOptions {\n /**\n * Decompression-bomb safeguards applied while inflating zip entries.\n * Defaults to limits that fit any legitimate xlsx; pass `false` to disable\n * (only safe for fully trusted sources). See\n * {@link DecompressionLimits} for the individual knobs.\n */\n decompressionLimits?: DecompressionLimits | false;\n}\n\n/** Office Document relationship type — the package-root pointer to `xl/workbook.xml`. */\nconst OFFICE_DOC_REL_TYPE = `${REL_NS}/officeDocument`;\n\n/**\n * Resolve an OPC relationship target against its source part path.\n *\n * - Targets starting with `/` are package-absolute.\n * - Otherwise the target is relative to the source part's parent directory.\n * - `..` segments collapse normally.\n */\nexport function resolveRelTarget(sourcePartPath: string, target: string): string {\n if (target.startsWith('/')) return target.slice(1);\n const lastSlash = sourcePartPath.lastIndexOf('/');\n const parentDir = lastSlash >= 0 ? sourcePartPath.slice(0, lastSlash + 1) : '';\n const joined = parentDir + target;\n return normalizePath(joined);\n}\n\nfunction normalizePath(path: string): string {\n const segments = path.split('/');\n const out: string[] = [];\n for (const seg of segments) {\n if (seg === '' || seg === '.') continue;\n if (seg === '..') {\n // Pop the last accumulated segment when one exists; when `out` is\n // empty (a relative target with more `..` than ancestors) the pop is\n // a no-op so the climb is silently absorbed at the package root. The\n // archive.has() check on the resolved path catches any escape attempt\n // because the entry simply won't exist outside the package — there's\n // no filesystem traversal to worry about, only a missing-entry error.\n out.pop();\n continue;\n }\n out.push(seg);\n }\n return out.join('/');\n}\n\n/** Sibling rels-part path for a given part. `xl/workbook.xml` → `xl/_rels/workbook.xml.rels`. */\nfunction relsPathFor(partPath: string): string {\n const i = partPath.lastIndexOf('/');\n if (i < 0) return `_rels/${partPath}.rels`;\n return `${partPath.slice(0, i)}/_rels/${partPath.slice(i + 1)}.rels`;\n}\n\ninterface SheetEntry {\n /** Display name (`sheet/@name`). */\n name: string;\n /** Workbook-scope sheetId (`sheet/@sheetId`). */\n sheetId: number;\n /** Workbook rels Id (`sheet/@r:id`). */\n rId: string;\n /** Visibility state — defaults to `'visible'` when the attribute is absent. */\n state: SheetState;\n}\n\nconst SHEET_TAG = `{${SHEET_MAIN_NS}}sheet`;\nconst SHEETS_TAG = `{${SHEET_MAIN_NS}}sheets`;\nconst DEFINED_NAMES_TAG = `{${SHEET_MAIN_NS}}definedNames`;\nconst DEFINED_NAME_TAG = `{${SHEET_MAIN_NS}}definedName`;\nconst RID_ATTR = `{${REL_NS}}id`;\n\n/** Extract the `<definedNames>/<definedName>` entries from a parsed `xl/workbook.xml`. */\nfunction parseDefinedNames(workbookRoot: XmlNode): DefinedName[] {\n const wrapper = findChild(workbookRoot, DEFINED_NAMES_TAG);\n if (!wrapper) return [];\n const out: DefinedName[] = [];\n for (const node of findChildren(wrapper, DEFINED_NAME_TAG)) {\n const name = node.attrs['name'];\n if (!name) throw new OpenXmlSchemaError(\"workbook.xml: <definedName> is missing 'name'\");\n const value = node.text ?? '';\n const opts: Partial<DefinedName> & { name: string; value: string } = { name, value };\n const scopeAttr = node.attrs['localSheetId'];\n if (scopeAttr !== undefined) {\n const scope = Number.parseInt(scopeAttr, 10);\n if (Number.isInteger(scope) && scope >= 0) opts.scope = scope;\n }\n if (node.attrs['hidden'] === '1' || node.attrs['hidden'] === 'true') opts.hidden = true;\n if (node.attrs['comment'] !== undefined) opts.comment = node.attrs['comment'];\n out.push(makeDefinedName(opts));\n }\n return out;\n}\n\nconst WORKBOOK_PR_TAG = `{${SHEET_MAIN_NS}}workbookPr`;\nconst WORKBOOK_PROTECTION_TAG = `{${SHEET_MAIN_NS}}workbookProtection`;\nconst BOOK_VIEWS_TAG = `{${SHEET_MAIN_NS}}bookViews`;\nconst WORKBOOK_VIEW_TAG = `{${SHEET_MAIN_NS}}workbookView`;\nconst CUSTOM_WORKBOOK_VIEWS_TAG = `{${SHEET_MAIN_NS}}customWorkbookViews`;\nconst CUSTOM_WORKBOOK_VIEW_TAG = `{${SHEET_MAIN_NS}}customWorkbookView`;\nconst CALC_PR_TAG = `{${SHEET_MAIN_NS}}calcPr`;\nconst FILE_VERSION_TAG = `{${SHEET_MAIN_NS}}fileVersion`;\nconst FILE_SHARING_TAG = `{${SHEET_MAIN_NS}}fileSharing`;\nconst OLE_SIZE_TAG = `{${SHEET_MAIN_NS}}oleSize`;\nconst FILE_RECOVERY_PR_TAG = `{${SHEET_MAIN_NS}}fileRecoveryPr`;\nconst PIVOT_CACHES_TAG = `{${SHEET_MAIN_NS}}pivotCaches`;\nconst PIVOT_CACHE_TAG = `{${SHEET_MAIN_NS}}pivotCache`;\nconst EXTERNAL_REFERENCES_TAG = `{${SHEET_MAIN_NS}}externalReferences`;\nconst EXTERNAL_REFERENCE_TAG = `{${SHEET_MAIN_NS}}externalReference`;\nconst SMART_TAG_PR_TAG = `{${SHEET_MAIN_NS}}smartTagPr`;\nconst SMART_TAG_TYPES_TAG = `{${SHEET_MAIN_NS}}smartTagTypes`;\nconst SMART_TAG_TYPE_TAG = `{${SHEET_MAIN_NS}}smartTagType`;\nconst FUNCTION_GROUPS_TAG = `{${SHEET_MAIN_NS}}functionGroups`;\nconst FUNCTION_GROUP_TAG = `{${SHEET_MAIN_NS}}functionGroup`;\n\n/**\n * Parse the `<workbookPr date1904>` flag. Mac-origin workbooks set\n * `date1904=\"true\"`; everything else uses the Windows 1900 epoch. The value\n * drives Date serialization and lets readers select the epoch when converting\n * numeric date serials.\n */\nexport function parseDate1904(workbookRoot: XmlNode): boolean {\n const pr = findChild(workbookRoot, WORKBOOK_PR_TAG);\n if (!pr) return false;\n const v = pr.attrs['date1904'];\n return v === '1' || v === 'true';\n}\n\n/** Extract the `<sheets>/<sheet>` entries from a parsed `xl/workbook.xml`. */\nexport function parseSheetEntries(workbookRoot: XmlNode): SheetEntry[] {\n const sheets = findChild(workbookRoot, SHEETS_TAG);\n if (!sheets) return [];\n const out: SheetEntry[] = [];\n for (const node of findChildren(sheets, SHEET_TAG)) {\n const name = node.attrs['name'];\n const sheetIdAttr = node.attrs['sheetId'];\n const rId = node.attrs[RID_ATTR];\n if (!name) throw new OpenXmlSchemaError(\"workbook.xml: <sheet> is missing 'name'\");\n if (!sheetIdAttr) throw new OpenXmlSchemaError(`workbook.xml: <sheet name=\"${name}\"> is missing 'sheetId'`);\n if (!rId) throw new OpenXmlSchemaError(`workbook.xml: <sheet name=\"${name}\"> is missing 'r:id'`);\n const sheetId = Number.parseInt(sheetIdAttr, 10);\n if (!Number.isInteger(sheetId) || sheetId < 1) {\n throw new OpenXmlSchemaError(\n `workbook.xml: <sheet name=\"${name}\"> sheetId \"${sheetIdAttr}\" is not a positive integer`,\n );\n }\n const stateAttr = node.attrs['state'];\n let state: SheetState = 'visible';\n if (stateAttr === 'hidden' || stateAttr === 'veryHidden') state = stateAttr;\n out.push({ name, sheetId, rId, state });\n }\n return out;\n}\n\n/**\n * Load a workbook from any {@link XlsxSource}. Currently produces a scaffold\n * Workbook: each Worksheet is empty (no cells / styles / shared strings / theme\n * yet). The next phase-3 iterations layer those in atop the same skeleton.\n */\nexport async function loadWorkbook(source: XlsxSource, opts: LoadOptions = {}): Promise<Workbook> {\n const archive = await openZip(\n source,\n opts.decompressionLimits === undefined ? {} : { decompressionLimits: opts.decompressionLimits },\n );\n try {\n return loadWorkbookFromArchive(archive);\n } finally {\n archive.close();\n }\n}\n\n/** Internal: same as {@link loadWorkbook} but operating on an already-opened archive. */\nfunction loadWorkbookFromArchive(archive: ZipArchive): Workbook {\n // 1. Manifest — resolves which override entries the package declares.\n if (!archive.has(ARC_CONTENT_TYPES)) {\n throw new OpenXmlSchemaError(`loadWorkbook: missing \"${ARC_CONTENT_TYPES}\"`);\n }\n const manifest = manifestFromBytes(archive.read(ARC_CONTENT_TYPES));\n\n // 2. Root rels → resolve the office-document relationship to the workbook part path.\n if (!archive.has(ARC_ROOT_RELS)) {\n throw new OpenXmlSchemaError(`loadWorkbook: missing \"${ARC_ROOT_RELS}\"`);\n }\n const rootRels = relsFromBytes(archive.read(ARC_ROOT_RELS));\n const officeRel = rootRels.rels.find((r) => r.type === OFFICE_DOC_REL_TYPE);\n if (!officeRel) {\n throw new OpenXmlSchemaError('loadWorkbook: root rels missing officeDocument relationship');\n }\n const workbookPath = resolveRelTarget('', officeRel.target);\n if (workbookPath !== ARC_WORKBOOK) {\n // Most xlsx files put the workbook at xl/workbook.xml. We accept any path\n // the rels point at as long as the archive holds it.\n if (!archive.has(workbookPath)) {\n throw new OpenXmlSchemaError(`loadWorkbook: workbook part \"${workbookPath}\" not found in archive`);\n }\n }\n\n // 3. workbook.xml — parse to extract sheet metadata only.\n const wbDoc = parseXmlDocument(archive.read(workbookPath));\n const wbRoot = wbDoc.root;\n if (parseQName(wbRoot.name).local !== 'workbook') {\n throw new OpenXmlSchemaError(`loadWorkbook: ${workbookPath} root is \"${wbRoot.name}\", expected workbook`);\n }\n const sheetEntries = parseSheetEntries(wbRoot);\n const definedNamesFromXml = parseDefinedNames(wbRoot);\n\n // 4. workbook.xml.rels — needed to resolve each sheet's rId to a part path.\n const wbRelsPath = relsPathFor(workbookPath);\n // openpyxl tolerates a missing workbook.xml.rels (it implies no sheets); in\n // practice every Excel file has one. We require it so a malformed package\n // surfaces as an OpenXmlSchemaError, not a silently-empty workbook.\n if (sheetEntries.length > 0 && !archive.has(wbRelsPath)) {\n throw new OpenXmlSchemaError(`loadWorkbook: workbook has sheets but rels part \"${wbRelsPath}\" is missing`);\n }\n const wbRels = archive.has(wbRelsPath) ? relsFromBytes(archive.read(wbRelsPath)) : { rels: [] };\n\n // 4b. sharedStrings.xml — optional. The workbook rels can also point at a\n // non-default location; for the minimum-skeleton stage we look at the\n // canonical `xl/sharedStrings.xml` path first, then fall back to the rels\n // entry if present.\n let sharedStrings: SharedStringsTable | undefined;\n if (archive.has(ARC_SHARED_STRINGS)) {\n sharedStrings = parseSharedStringsXml(archive.read(ARC_SHARED_STRINGS));\n } else {\n const sstRel = wbRels.rels.find((r) => r.type === `${REL_NS}/sharedStrings`);\n if (sstRel) {\n const sstPath = resolveRelTarget(workbookPath, sstRel.target);\n if (archive.has(sstPath)) {\n sharedStrings = parseSharedStringsXml(archive.read(sstPath));\n }\n }\n }\n // Entries reach the worksheet reader as-is: a rich-text `<si>` becomes a\n // rich-text cell value, so the per-run formatting Excel stored survives the\n // round-trip instead of collapsing into the concatenated text body.\n const sst = sharedStrings?.entries ?? [];\n\n // 4c. styles.xml — optional. Same default-or-rels lookup as sst.\n let styles: ReturnType<typeof parseStylesheetXml> | undefined;\n if (archive.has(ARC_STYLE)) {\n styles = parseStylesheetXml(archive.read(ARC_STYLE));\n } else {\n const stylesRel = wbRels.rels.find((r) => r.type === `${REL_NS}/styles`);\n if (stylesRel) {\n const stylesPath = resolveRelTarget(workbookPath, stylesRel.target);\n if (archive.has(stylesPath)) {\n styles = parseStylesheetXml(archive.read(stylesPath));\n }\n }\n }\n\n // 4d. docProps/{core,app,custom}.xml — package-level metadata. Each part is\n // optional; absent ones leave the matching Workbook field undefined. We walk\n // both the canonical path and the root rels so non-default layouts (rare but\n // legal) still resolve.\n const properties = archive.has(ARC_CORE) ? corePropsFromBytes(archive.read(ARC_CORE)) : undefined;\n const appProperties = archive.has(ARC_APP) ? extendedPropsFromBytes(archive.read(ARC_APP)) : undefined;\n const customProperties = archive.has(ARC_CUSTOM) ? customPropsFromBytes(archive.read(ARC_CUSTOM)) : undefined;\n\n // 4e. xl/theme/theme1.xml — kept verbatim. Excel renders with this exact\n // payload; round-tripping the bytes avoids drift.\n const themeXml: Uint8Array | undefined = (() => {\n if (archive.has(ARC_THEME)) return archive.read(ARC_THEME);\n const themeRel = wbRels.rels.find((r) => r.type === `${REL_NS}/theme`);\n if (themeRel) {\n const themePath = resolveRelTarget(workbookPath, themeRel.target);\n if (archive.has(themePath)) return archive.read(themePath);\n }\n return undefined;\n })();\n\n // 5. Build the Workbook. We bypass `addWorksheet` because that allocates\n // sheetIds via `allocateSheetId`; load preserves the IDs from XML.\n const wb = createWorkbook({ date1904: parseDate1904(wbRoot) });\n if (styles) wb.styles = styles;\n if (properties) wb.properties = properties;\n if (appProperties) wb.appProperties = appProperties;\n if (customProperties) wb.customProperties = customProperties;\n if (themeXml) wb.themeXml = themeXml;\n if (definedNamesFromXml.length > 0) wb.definedNames = definedNamesFromXml;\n const seenTitles = new Set<string>();\n const passthroughRoots: string[] = [];\n const vml = makeVmlPartCache(archive);\n for (const entry of sheetEntries) {\n if (seenTitles.has(entry.name)) {\n throw new OpenXmlSchemaError(`loadWorkbook: duplicate sheet name \"${entry.name}\"`);\n }\n seenTitles.add(entry.name);\n const rel = findById(wbRels, entry.rId);\n if (!rel) {\n throw new OpenXmlSchemaError(`loadWorkbook: sheet \"${entry.name}\" rId \"${entry.rId}\" has no matching rels entry`);\n }\n const sheetPath = resolveRelTarget(workbookPath, rel.target);\n if (!archive.has(sheetPath)) {\n throw new OpenXmlSchemaError(`loadWorkbook: sheet part \"${sheetPath}\" not found in archive`);\n }\n const sheetRelsPath = relsPathFor(sheetPath);\n const sheetRels = archive.has(sheetRelsPath) ? relsFromBytes(archive.read(sheetRelsPath)) : undefined;\n // Build an id → rel index once; the loadTable / loadComments / loadDrawing\n // callbacks are invoked once per cross-reference in the worksheet body and\n // a linear find() inside each would be O(rels × refs). Sheets with many\n // hyperlinks / tables / drawings (e.g. dashboard workbooks) make that\n // accumulation visible.\n const sheetRelsById = sheetRels ? indexRelsById(sheetRels) : undefined;\n const loadTable = sheetRelsById\n ? (relId: string) => {\n const tRel = sheetRelsById.get(relId);\n if (!tRel) return undefined;\n const tablePath = resolveRelTarget(sheetPath, tRel.target);\n if (!archive.has(tablePath)) return undefined;\n return parseTableXml(archive.read(tablePath));\n }\n : undefined;\n const loadComments = sheetRelsById\n ? (relId: string) => {\n const cRel = sheetRelsById.get(relId);\n if (!cRel) return undefined;\n const cPath = resolveRelTarget(sheetPath, cRel.target);\n if (!archive.has(cPath)) return undefined;\n return parseCommentsXml(archive.read(cPath));\n }\n : undefined;\n const loadDrawing = sheetRelsById\n ? (relId: string) => {\n const dRel = sheetRelsById.get(relId);\n if (!dRel) return undefined;\n const dPath = resolveRelTarget(sheetPath, dRel.target);\n if (!archive.has(dPath)) return undefined;\n const drawing = parseDrawingXml(archive.read(dPath));\n // Phase-2: resolve drawing-rels to populate chart payloads.\n const dRelsPath = relsPathFor(dPath);\n if (archive.has(dRelsPath)) {\n const dRels = relsFromBytes(archive.read(dRelsPath));\n const dRelsById = indexRelsById(dRels);\n for (const item of drawing.items) {\n if (item.content.kind === 'chart') {\n const chartRId = item.content.chart.rId;\n if (!chartRId) continue;\n const chartRel = dRelsById.get(chartRId);\n if (!chartRel) continue;\n const chartPath = resolveRelTarget(dPath, chartRel.target);\n if (archive.has(chartPath)) {\n const chartBytes = archive.read(chartPath);\n if (isChartExBytes(chartBytes)) {\n item.content.chart.cxSpace = parseChartExXml(chartBytes);\n } else {\n const space = parseChartXml(chartBytes);\n // Resolve <c:userShapes r:id=\"...\"> via the chart's own\n // rels file (xl/charts/_rels/chartN.xml.rels).\n const userShapesRId = findUserShapesRId(chartBytes);\n if (userShapesRId) {\n const chartRelsPath = relsPathFor(chartPath);\n if (archive.has(chartRelsPath)) {\n const chartRelsObj = relsFromBytes(archive.read(chartRelsPath));\n const usRel = indexRelsById(chartRelsObj).get(userShapesRId);\n if (usRel) {\n const usPath = resolveRelTarget(chartPath, usRel.target);\n if (archive.has(usPath)) {\n try {\n space.userShapes = parseUserShapesXml(archive.read(usPath));\n } catch {\n // Tolerate parse failures (Excel sometimes emits\n // chartDrawing parts with namespaces / shapes\n // outside our model).\n }\n }\n }\n }\n }\n item.content.chart.space = space;\n }\n }\n } else if (item.content.kind === 'picture') {\n const picRId = item.content.picture.rId;\n if (!picRId) continue;\n const picRel = dRelsById.get(picRId);\n if (!picRel) continue;\n const imgPath = resolveRelTarget(dPath, picRel.target);\n if (archive.has(imgPath)) {\n try {\n item.content.picture.image = loadImage(archive.read(imgPath));\n } catch {\n // Unknown / unsupported format — leave bytes-less; callers\n // can read via the rId + archive directly if they need the\n // raw payload.\n }\n }\n }\n }\n // Anything kept verbatim (shapes, groups, mc:AlternateContent\n // wrappers) may still reference the drawing's rels. Carry those\n // entries under their original ids and hand their targets to the\n // passthrough sweep so the references still resolve on re-save.\n const rawRelIds = collectRawRelIds(drawing);\n if (rawRelIds.size > 0) {\n const carried = makeRelationships();\n for (const id of rawRelIds) {\n const rawRel = dRelsById.get(id);\n if (!rawRel) continue;\n carried.rels.push(rawRel);\n if (rawRel.targetMode !== 'External') {\n passthroughRoots.push(resolveRelTarget(dPath, rawRel.target));\n }\n }\n if (carried.rels.length > 0) drawing.rawRels = carried;\n }\n }\n return drawing;\n }\n : undefined;\n // Distinguish worksheet vs chartsheet by inspecting the workbook-rels\n // entry's relationship type.\n const isChartsheet = rel.type === `${REL_NS}/chartsheet`;\n if (isChartsheet) {\n const chartsheet = parseChartsheetXml(archive.read(sheetPath), entry.name);\n // Inline drawing reference from the chartsheet XML.\n if (sheetRels) {\n // Find the drawing rel and resolve it the same way worksheets do.\n const drawingRel = sheetRels.rels.find((r) => r.type === `${REL_NS}/drawing`);\n if (drawingRel && loadDrawing) {\n const d = loadDrawing(drawingRel.id);\n if (d) chartsheet.drawing = d;\n }\n }\n const ref: SheetRef = {\n kind: 'chartsheet',\n sheet: chartsheet,\n sheetId: entry.sheetId,\n state: entry.state,\n rId: entry.rId,\n };\n wb.sheets.push(ref);\n continue;\n }\n const ws = parseWorksheetXml(archive.read(sheetPath), entry.name, {\n sharedStrings: sst,\n ...(sheetRels ? { rels: sheetRels } : {}),\n ...(loadTable ? { loadTable } : {}),\n ...(loadComments ? { loadComments } : {}),\n ...(loadDrawing ? { loadDrawing } : {}),\n });\n if (sheetRels) {\n const extras = captureSheetRelsExtras(sheetRels, sheetPath, vml);\n if (extras.length > 0) {\n ws.relsExtras = extras;\n // The writer re-emits these rels verbatim, so whatever they point at\n // has to be carried over as passthrough or the output dangles.\n for (const e of extras) {\n if (e.targetMode !== 'External') passthroughRoots.push(resolveRelTarget(sheetPath, e.target));\n }\n }\n }\n // A <legacyDrawing> pointing at the comment VML (or at nothing) has no\n // surviving rel; the writer regenerates the comment link from\n // ws.legacyComments, so re-emitting this rId would dangle.\n if (ws.legacyDrawingRId !== undefined && !ws.relsExtras?.some((e) => e.id === ws.legacyDrawingRId)) {\n delete ws.legacyDrawingRId;\n }\n const ref: SheetRef = {\n kind: 'worksheet',\n sheet: ws,\n sheetId: entry.sheetId,\n state: entry.state,\n rId: entry.rId,\n };\n wb.sheets.push(ref);\n }\n\n captureWorkbookXmlExtras(wbRoot, wb);\n captureWorkbookXmlRoot(wbDoc, wb);\n captureWorkbookRelsExtras(wbRels, wb);\n\n // Pass-through: capture parts we don't model (VBA / pivot / activeX / OLE /\n // customUI / customXml / etc.) so re-saving doesn't drop them.\n capturePassthrough(archive, manifest, wb, passthroughRoots, vml);\n return wb;\n}\n\nconst SHEET_MODELED_REL_TYPES: ReadonlySet<string> = new Set([\n `${REL_NS}/hyperlink`,\n `${REL_NS}/table`,\n `${REL_NS}/comments`,\n `${REL_NS}/drawing`,\n]);\nconst VML_DRAWING_REL = `${REL_NS}/vmlDrawing`;\n\n/**\n * Capture per-sheet rels entries that don't match a modeled type. The writer\n * re-emits these verbatim alongside the freshly allocated modeled rels so\n * captured passthrough parts (pivotTable / queryTable / slicer /\n * printerSettings / oleObject / customProperty / threadedComment) remain\n * reachable from the worksheet after a round-trip.\n *\n * `vmlDrawing` rels are split by part content rather than by type: only the\n * comments VML is regenerated (from `ws.legacyComments`), so its rel is\n * dropped; header/footer and form-control VML is re-emitted by its original\n * r:id and rides along as an extra.\n */\nfunction captureSheetRelsExtras(\n sheetRels: import('../packaging/relationships').Relationships,\n sheetPath: string,\n vml: VmlPartCache,\n): Relationship[] {\n const extras: Relationship[] = [];\n for (const rel of sheetRels.rels) {\n if (SHEET_MODELED_REL_TYPES.has(rel.type)) continue;\n if (rel.type === VML_DRAWING_REL && vml.isCommentVml(resolveRelTarget(sheetPath, rel.target))) continue;\n extras.push(rel);\n }\n return extras;\n}\n\n/**\n * Walk top-level children of `<workbook>` and split anything that isn't\n * `<sheets>` or `<definedNames>` into the before/after halves the writer\n * inserts around the modeled elements. Order is preserved within each half so\n * things like `<fileVersion>`, `<workbookPr>`, `<bookViews>`, `<calcPr>`,\n * `<pivotCaches>`, `<extLst>` round-trip in document order.\n */\n/**\n * Keep the `<workbook>` root's namespace declarations and `mc:Ignorable`. Excel\n * writes `mc:Ignorable=\"x15 xr xr6 xr10 xr2\"` naming prefixes declared only\n * there; dropping either half — or renaming the prefixes — makes Excel report\n * the file as corrupt. The default namespace and `r` are re-emitted by the\n * writer itself, so they are not carried here.\n */\nfunction captureWorkbookXmlRoot(doc: ParsedDocument, wb: Workbook): void {\n const namespaces = doc.rootNamespaces.filter((d) => d.prefix !== '' && d.prefix !== 'r');\n const ignorable = doc.root.attrs[`{${MARKUP_COMPAT_NS}}Ignorable`];\n if (namespaces.length === 0 && ignorable === undefined) return;\n wb.workbookXmlRoot = {\n namespaces,\n ...(ignorable !== undefined ? { ignorable } : {}),\n };\n}\n\nfunction captureWorkbookXmlExtras(wbRoot: XmlNode, wb: Workbook): void {\n const beforeSheets: XmlNode[] = [];\n const afterSheets: XmlNode[] = [];\n let seenSheets = false;\n for (const child of wbRoot.children) {\n if (child.name === SHEETS_TAG) {\n seenSheets = true;\n continue;\n }\n if (child.name === DEFINED_NAMES_TAG) continue;\n // Lift <workbookProtection> into the typed workbook field instead of\n // stashing it as a passthrough XmlNode (B5 partial).\n if (child.name === WORKBOOK_PROTECTION_TAG) {\n wb.workbookProtection = parseWorkbookProtection(child);\n continue;\n }\n // Lift <workbookPr> into the typed workbook field. The date1904 attribute\n // is already mirrored onto wb.date1904; everything else stops leaking into\n // bodyExtras.\n if (child.name === WORKBOOK_PR_TAG) {\n const wp = parseWorkbookProperties(child);\n if (wp) wb.workbookProperties = wp;\n continue;\n }\n // Lift <fileSharing> into the typed workbook field.\n if (child.name === FILE_SHARING_TAG) {\n const fs: import('../workbook/file-sharing').FileSharing = {};\n const a = child.attrs;\n const flag = (raw: string | undefined): boolean | undefined => {\n if (raw === '1' || raw === 'true') return true;\n if (raw === '0' || raw === 'false') return false;\n return undefined;\n };\n const ror = flag(a['readOnlyRecommended']);\n if (ror !== undefined) fs.readOnlyRecommended = ror;\n if (a['userName'] !== undefined) fs.userName = a['userName'];\n if (a['reservationPassword'] !== undefined) fs.reservationPassword = a['reservationPassword'];\n if (a['algorithmName'] !== undefined) fs.algorithmName = a['algorithmName'];\n if (a['hashValue'] !== undefined) fs.hashValue = a['hashValue'];\n if (a['saltValue'] !== undefined) fs.saltValue = a['saltValue'];\n if (a['spinCount'] !== undefined) {\n const n = Number.parseInt(a['spinCount'], 10);\n if (Number.isInteger(n)) fs.spinCount = n;\n }\n if (Object.keys(fs).length > 0) wb.fileSharing = fs;\n continue;\n }\n // Lift <fileVersion> into the typed workbook field.\n if (child.name === FILE_VERSION_TAG) {\n const fv: import('../workbook/file-version').FileVersion = {};\n if (child.attrs['appName'] !== undefined) fv.appName = child.attrs['appName'];\n if (child.attrs['lastEdited'] !== undefined) fv.lastEdited = child.attrs['lastEdited'];\n if (child.attrs['lowestEdited'] !== undefined) fv.lowestEdited = child.attrs['lowestEdited'];\n if (child.attrs['rupBuild'] !== undefined) fv.rupBuild = child.attrs['rupBuild'];\n if (child.attrs['codeName'] !== undefined) fv.codeName = child.attrs['codeName'];\n if (Object.keys(fv).length > 0) wb.fileVersion = fv;\n continue;\n }\n // Lift <bookViews> into the typed workbook field.\n if (child.name === BOOK_VIEWS_TAG) {\n const views: import('../workbook/views').WorkbookView[] = [];\n for (const v of findChildren(child, WORKBOOK_VIEW_TAG)) views.push(parseWorkbookView(v));\n if (views.length > 0) wb.bookViews = views;\n continue;\n }\n // Lift <customWorkbookViews> into the typed workbook field.\n if (child.name === CUSTOM_WORKBOOK_VIEWS_TAG) {\n const cws: import('../workbook/views').CustomWorkbookView[] = [];\n for (const v of findChildren(child, CUSTOM_WORKBOOK_VIEW_TAG)) {\n const parsed = parseCustomWorkbookView(v);\n if (parsed) cws.push(parsed);\n }\n if (cws.length > 0) wb.customWorkbookViews = cws;\n continue;\n }\n // Lift <calcPr> into the typed workbook field.\n if (child.name === CALC_PR_TAG) {\n const cp = parseCalcProperties(child);\n if (cp) wb.calcProperties = cp;\n continue;\n }\n // Lift <oleSize ref=\"…\"/> as a single typed string attribute.\n if (child.name === OLE_SIZE_TAG) {\n const ref = child.attrs['ref'];\n if (ref) wb.oleSize = ref;\n continue;\n }\n // Lift <smartTagPr embed=\"1\" show=\"all\"/>.\n if (child.name === SMART_TAG_PR_TAG) {\n const out: import('../workbook/smart-tags').SmartTagProperties = {};\n const a = child.attrs;\n if (a['embed'] === '1' || a['embed'] === 'true') out.embed = true;\n else if (a['embed'] === '0' || a['embed'] === 'false') out.embed = false;\n if (a['show'] === 'all' || a['show'] === 'noIndicator') out.show = a['show'];\n if (Object.keys(out).length > 0) wb.smartTagPr = out;\n continue;\n }\n // Lift <smartTagTypes><smartTagType .../></smartTagTypes>.\n if (child.name === SMART_TAG_TYPES_TAG) {\n const tags: import('../workbook/smart-tags').SmartTagType[] = [];\n for (const t of findChildren(child, SMART_TAG_TYPE_TAG)) {\n const entry: import('../workbook/smart-tags').SmartTagType = {};\n if (t.attrs['namespaceUri'] !== undefined) entry.namespaceUri = t.attrs['namespaceUri'];\n if (t.attrs['name'] !== undefined) entry.name = t.attrs['name'];\n if (t.attrs['url'] !== undefined) entry.url = t.attrs['url'];\n if (Object.keys(entry).length > 0) tags.push(entry);\n }\n if (tags.length > 0) wb.smartTagTypes = tags;\n continue;\n }\n // Lift <functionGroups builtInGroupCount=…><functionGroup\n // name=…/></functionGroups>.\n if (child.name === FUNCTION_GROUPS_TAG) {\n const fg: import('../workbook/function-groups').FunctionGroups = { groups: [] };\n const bicgRaw = child.attrs['builtInGroupCount'];\n if (bicgRaw !== undefined) {\n const n = Number.parseInt(bicgRaw, 10);\n if (Number.isInteger(n)) fg.builtInGroupCount = n;\n }\n for (const g of findChildren(child, FUNCTION_GROUP_TAG)) {\n const name = g.attrs['name'];\n if (name) fg.groups.push({ name });\n }\n if (fg.groups.length > 0 || fg.builtInGroupCount !== undefined) wb.functionGroups = fg;\n continue;\n }\n // Lift <externalReferences><externalReference\n // r:id=…/></externalReferences>.\n if (child.name === EXTERNAL_REFERENCES_TAG) {\n const refs: Array<{ rId: string }> = [];\n for (const er of findChildren(child, EXTERNAL_REFERENCE_TAG)) {\n const rId = er.attrs[`{${REL_NS}}id`];\n if (rId) refs.push({ rId });\n }\n if (refs.length > 0) wb.externalReferences = refs;\n continue;\n }\n // Lift <pivotCaches><pivotCache cacheId=… r:id=…/></pivotCaches>.\n if (child.name === PIVOT_CACHES_TAG) {\n const caches: Array<{ cacheId: number; rId: string }> = [];\n for (const pc of findChildren(child, PIVOT_CACHE_TAG)) {\n const cacheIdAttr = pc.attrs['cacheId'];\n const rId = pc.attrs[`{${REL_NS}}id`];\n if (cacheIdAttr === undefined || !rId) continue;\n const cacheId = Number.parseInt(cacheIdAttr, 10);\n if (!Number.isInteger(cacheId)) continue;\n caches.push({ cacheId, rId });\n }\n if (caches.length > 0) wb.pivotCaches = caches;\n continue;\n }\n // Lift <fileRecoveryPr> into the typed workbook field.\n if (child.name === FILE_RECOVERY_PR_TAG) {\n const fp: import('../workbook/file-recovery').FileRecoveryProperties = {};\n const a = child.attrs;\n const flag = (raw: string | undefined): boolean | undefined => {\n if (raw === '1' || raw === 'true') return true;\n if (raw === '0' || raw === 'false') return false;\n return undefined;\n };\n const ar = flag(a['autoRecover']);\n if (ar !== undefined) fp.autoRecover = ar;\n const cs = flag(a['crashSave']);\n if (cs !== undefined) fp.crashSave = cs;\n const del = flag(a['dataExtractLoad']);\n if (del !== undefined) fp.dataExtractLoad = del;\n const rl = flag(a['repairLoad']);\n if (rl !== undefined) fp.repairLoad = rl;\n if (Object.keys(fp).length > 0) wb.fileRecoveryPr = fp;\n continue;\n }\n if (seenSheets) afterSheets.push(child);\n else beforeSheets.push(child);\n }\n if (beforeSheets.length > 0 || afterSheets.length > 0) {\n wb.workbookXmlExtras = { beforeSheets, afterSheets };\n }\n}\n\nconst SHOW_OBJECTS_MODES: ReadonlyArray<import('../workbook/workbook-properties').ShowObjectsMode> = [\n 'all',\n 'placeholders',\n 'none',\n];\nconst UPDATE_LINKS_MODES: ReadonlyArray<import('../workbook/workbook-properties').UpdateLinksMode> = [\n 'userSet',\n 'never',\n 'always',\n];\n\nconst parseWorkbookProperties = (\n node: XmlNode,\n): import('../workbook/workbook-properties').WorkbookProperties | undefined => {\n const out: import('../workbook/workbook-properties').WorkbookProperties = {};\n const a = node.attrs;\n const flag = (raw: string | undefined): boolean | undefined => {\n if (raw === '1' || raw === 'true') return true;\n if (raw === '0' || raw === 'false') return false;\n return undefined;\n };\n const intAttr = (k: string): number | undefined => {\n if (a[k] === undefined) return undefined;\n const n = Number.parseInt(a[k], 10);\n return Number.isInteger(n) ? n : undefined;\n };\n\n const bools = [\n 'date1904',\n 'dateCompatibility',\n 'showBorderUnselectedTables',\n 'filterPrivacy',\n 'promptedSolutions',\n 'showInkAnnotation',\n 'backupFile',\n 'saveExternalLinkValues',\n 'hidePivotFieldList',\n 'showPivotChartFilter',\n 'allowRefreshQuery',\n 'publishItems',\n 'checkCompatibility',\n 'autoCompressPictures',\n 'refreshAllConnections',\n ] as const satisfies ReadonlyArray<keyof import('../workbook/workbook-properties').WorkbookProperties>;\n for (const k of bools) {\n const v = flag(a[k]);\n if (v !== undefined) out[k] = v;\n }\n\n const showObjects = a['showObjects'];\n if (showObjects && SHOW_OBJECTS_MODES.includes(showObjects as import('../workbook/workbook-properties').ShowObjectsMode)) {\n out.showObjects = showObjects as import('../workbook/workbook-properties').ShowObjectsMode;\n }\n const updateLinks = a['updateLinks'];\n if (updateLinks && UPDATE_LINKS_MODES.includes(updateLinks as import('../workbook/workbook-properties').UpdateLinksMode)) {\n out.updateLinks = updateLinks as import('../workbook/workbook-properties').UpdateLinksMode;\n }\n if (a['codeName'] !== undefined) out.codeName = a['codeName'];\n const dtv = intAttr('defaultThemeVersion');\n if (dtv !== undefined) out.defaultThemeVersion = dtv;\n\n return Object.keys(out).length > 0 ? out : undefined;\n};\n\nconst CALC_MODES: ReadonlyArray<import('../workbook/calc-properties').CalcMode> = [\n 'manual',\n 'auto',\n 'autoNoTable',\n];\nconst REF_MODES: ReadonlyArray<import('../workbook/calc-properties').RefMode> = ['A1', 'R1C1'];\n\nconst parseCalcProperties = (\n node: XmlNode,\n): import('../workbook/calc-properties').CalcProperties | undefined => {\n const out: import('../workbook/calc-properties').CalcProperties = {};\n const a = node.attrs;\n const flag = (raw: string | undefined): boolean | undefined => {\n if (raw === '1' || raw === 'true') return true;\n if (raw === '0' || raw === 'false') return false;\n return undefined;\n };\n const intAttr = (k: string): number | undefined => {\n if (a[k] === undefined) return undefined;\n const n = Number.parseInt(a[k], 10);\n return Number.isInteger(n) ? n : undefined;\n };\n const floatAttr = (k: string): number | undefined => {\n if (a[k] === undefined) return undefined;\n const n = Number.parseFloat(a[k]);\n return Number.isFinite(n) ? n : undefined;\n };\n\n const calcId = intAttr('calcId');\n if (calcId !== undefined) out.calcId = calcId;\n const calcMode = a['calcMode'];\n if (calcMode && CALC_MODES.includes(calcMode as import('../workbook/calc-properties').CalcMode)) {\n out.calcMode = calcMode as import('../workbook/calc-properties').CalcMode;\n }\n const fcol = flag(a['fullCalcOnLoad']);\n if (fcol !== undefined) out.fullCalcOnLoad = fcol;\n const refMode = a['refMode'];\n if (refMode && REF_MODES.includes(refMode as import('../workbook/calc-properties').RefMode)) {\n out.refMode = refMode as import('../workbook/calc-properties').RefMode;\n }\n const iterate = flag(a['iterate']);\n if (iterate !== undefined) out.iterate = iterate;\n const iterateCount = intAttr('iterateCount');\n if (iterateCount !== undefined) out.iterateCount = iterateCount;\n const iterateDelta = floatAttr('iterateDelta');\n if (iterateDelta !== undefined) out.iterateDelta = iterateDelta;\n const fullPrecision = flag(a['fullPrecision']);\n if (fullPrecision !== undefined) out.fullPrecision = fullPrecision;\n const calcCompleted = flag(a['calcCompleted']);\n if (calcCompleted !== undefined) out.calcCompleted = calcCompleted;\n const calcOnSave = flag(a['calcOnSave']);\n if (calcOnSave !== undefined) out.calcOnSave = calcOnSave;\n const concurrentCalc = flag(a['concurrentCalc']);\n if (concurrentCalc !== undefined) out.concurrentCalc = concurrentCalc;\n const concurrentManualCount = intAttr('concurrentManualCount');\n if (concurrentManualCount !== undefined) out.concurrentManualCount = concurrentManualCount;\n const forceFullCalc = flag(a['forceFullCalc']);\n if (forceFullCalc !== undefined) out.forceFullCalc = forceFullCalc;\n\n return Object.keys(out).length > 0 ? out : undefined;\n};\n\nconst SHOW_COMMENTS_MODES: ReadonlyArray<import('../workbook/views').CustomViewShowComments> = [\n 'commNone',\n 'commIndicator',\n 'commIndAndComment',\n];\nconst SHOW_OBJECTS_CV_MODES: ReadonlyArray<import('../workbook/views').CustomViewShowObjects> = [\n 'all',\n 'placeholders',\n 'none',\n];\n\nconst parseCustomWorkbookView = (\n node: XmlNode,\n): import('../workbook/views').CustomWorkbookView | undefined => {\n const a = node.attrs;\n const name = a['name'];\n const guid = a['guid'];\n if (!name || !guid) return undefined;\n const flag = (raw: string | undefined): boolean | undefined => {\n if (raw === '1' || raw === 'true') return true;\n if (raw === '0' || raw === 'false') return false;\n return undefined;\n };\n const intAttr = (k: string): number | undefined => {\n if (a[k] === undefined) return undefined;\n const n = Number.parseInt(a[k], 10);\n return Number.isInteger(n) ? n : undefined;\n };\n const ww = intAttr('windowWidth') ?? 0;\n const wh = intAttr('windowHeight') ?? 0;\n const asid = intAttr('activeSheetId') ?? 0;\n const out: import('../workbook/views').CustomWorkbookView = {\n name,\n guid,\n windowWidth: ww,\n windowHeight: wh,\n activeSheetId: asid,\n };\n\n const boolKeys = [\n 'autoUpdate',\n 'changesSavedWin',\n 'onlySync',\n 'personalView',\n 'includePrintSettings',\n 'includeHiddenRowCol',\n 'maximized',\n 'minimized',\n 'showHorizontalScroll',\n 'showVerticalScroll',\n 'showSheetTabs',\n 'showFormulaBar',\n 'showStatusbar',\n ] as const satisfies ReadonlyArray<keyof import('../workbook/views').CustomWorkbookView>;\n for (const k of boolKeys) {\n const v = flag(a[k]);\n if (v !== undefined) out[k] = v;\n }\n const intKeys = [\n 'mergeInterval',\n 'xWindow',\n 'yWindow',\n 'tabRatio',\n ] as const satisfies ReadonlyArray<keyof import('../workbook/views').CustomWorkbookView>;\n for (const k of intKeys) {\n const v = intAttr(k);\n if (v !== undefined) out[k] = v;\n }\n\n const sc = a['showComments'];\n if (sc && SHOW_COMMENTS_MODES.includes(sc as import('../workbook/views').CustomViewShowComments)) {\n out.showComments = sc as import('../workbook/views').CustomViewShowComments;\n }\n const so = a['showObjects'];\n if (so && SHOW_OBJECTS_CV_MODES.includes(so as import('../workbook/views').CustomViewShowObjects)) {\n out.showObjects = so as import('../workbook/views').CustomViewShowObjects;\n }\n return out;\n};\n\nconst VISIBILITIES: ReadonlyArray<import('../workbook/views').WorkbookViewVisibility> = [\n 'visible',\n 'hidden',\n 'veryHidden',\n];\n\nconst parseWorkbookView = (node: XmlNode): import('../workbook/views').WorkbookView => {\n const out: import('../workbook/views').WorkbookView = {};\n const a = node.attrs;\n const flag = (raw: string | undefined): boolean | undefined => {\n if (raw === '1' || raw === 'true') return true;\n if (raw === '0' || raw === 'false') return false;\n return undefined;\n };\n const intAttr = (k: string): number | undefined => {\n if (a[k] === undefined) return undefined;\n const n = Number.parseInt(a[k], 10);\n return Number.isInteger(n) ? n : undefined;\n };\n\n const visibility = a['visibility'];\n if (visibility && VISIBILITIES.includes(visibility as import('../workbook/views').WorkbookViewVisibility)) {\n out.visibility = visibility as import('../workbook/views').WorkbookViewVisibility;\n }\n const minimized = flag(a['minimized']);\n if (minimized !== undefined) out.minimized = minimized;\n const shScroll = flag(a['showHorizontalScroll']);\n if (shScroll !== undefined) out.showHorizontalScroll = shScroll;\n const svScroll = flag(a['showVerticalScroll']);\n if (svScroll !== undefined) out.showVerticalScroll = svScroll;\n const sst = flag(a['showSheetTabs']);\n if (sst !== undefined) out.showSheetTabs = sst;\n const xWindow = intAttr('xWindow');\n if (xWindow !== undefined) out.xWindow = xWindow;\n const yWindow = intAttr('yWindow');\n if (yWindow !== undefined) out.yWindow = yWindow;\n const ww = intAttr('windowWidth');\n if (ww !== undefined) out.windowWidth = ww;\n const wh = intAttr('windowHeight');\n if (wh !== undefined) out.windowHeight = wh;\n const tr = intAttr('tabRatio');\n if (tr !== undefined) out.tabRatio = tr;\n const fs = intAttr('firstSheet');\n if (fs !== undefined) out.firstSheet = fs;\n const at = intAttr('activeTab');\n if (at !== undefined) out.activeTab = at;\n // `xr2:uid` and friends: anything namespaced is outside CT_BookView, so keep\n // it verbatim rather than dropping it.\n const extAttrs: Record<string, string> = {};\n for (const [k, v] of Object.entries(a)) {\n if (k.startsWith('{')) extAttrs[k] = v;\n }\n if (Object.keys(extAttrs).length > 0) out.extAttrs = extAttrs;\n const adg = flag(a['autoFilterDateGrouping']);\n if (adg !== undefined) out.autoFilterDateGrouping = adg;\n return out;\n};\n\nconst parseWorkbookProtection = (node: XmlNode): import('../workbook/protection').WorkbookProtection => {\n const out: import('../workbook/protection').WorkbookProtection = {};\n const a = node.attrs;\n const flag = (raw: string | undefined): boolean | undefined => {\n if (raw === '1' || raw === 'true') return true;\n if (raw === '0' || raw === 'false') return false;\n return undefined;\n };\n if (a['workbookPassword'] !== undefined) out.workbookPassword = a['workbookPassword'];\n if (a['workbookPasswordCharacterSet'] !== undefined)\n out.workbookPasswordCharacterSet = a['workbookPasswordCharacterSet'];\n if (a['workbookAlgorithmName'] !== undefined) out.workbookAlgorithmName = a['workbookAlgorithmName'];\n if (a['workbookHashValue'] !== undefined) out.workbookHashValue = a['workbookHashValue'];\n if (a['workbookSaltValue'] !== undefined) out.workbookSaltValue = a['workbookSaltValue'];\n if (a['workbookSpinCount'] !== undefined) {\n const n = Number.parseInt(a['workbookSpinCount'], 10);\n if (Number.isInteger(n)) out.workbookSpinCount = n;\n }\n if (a['revisionsPassword'] !== undefined) out.revisionsPassword = a['revisionsPassword'];\n if (a['revisionsPasswordCharacterSet'] !== undefined)\n out.revisionsPasswordCharacterSet = a['revisionsPasswordCharacterSet'];\n if (a['revisionsAlgorithmName'] !== undefined) out.revisionsAlgorithmName = a['revisionsAlgorithmName'];\n if (a['revisionsHashValue'] !== undefined) out.revisionsHashValue = a['revisionsHashValue'];\n if (a['revisionsSaltValue'] !== undefined) out.revisionsSaltValue = a['revisionsSaltValue'];\n if (a['revisionsSpinCount'] !== undefined) {\n const n = Number.parseInt(a['revisionsSpinCount'], 10);\n if (Number.isInteger(n)) out.revisionsSpinCount = n;\n }\n const ls = flag(a['lockStructure']);\n if (ls !== undefined) out.lockStructure = ls;\n const lw = flag(a['lockWindows']);\n if (lw !== undefined) out.lockWindows = lw;\n const lr = flag(a['lockRevision']);\n if (lr !== undefined) out.lockRevision = lr;\n return out;\n};\n\n/**\n * Capture workbook-rels entries that don't match a modeled type so the writer\n * can re-emit them with their original Id (and any captured `<pivotCaches\n * r:id=\"…\"/>` etc. still resolves after a round-trip). Modeled non-sheet rels\n * (sst / styles / theme / vbaProject) keep their original Id via\n * `wb.workbookRelOriginalIds` so the writer can prefer those over freshly\n * allocated ones.\n */\nfunction captureWorkbookRelsExtras(\n wbRels: import('../packaging/relationships').Relationships,\n wb: Workbook,\n): void {\n const SHEET_RELS = new Set([`${REL_NS}/worksheet`, `${REL_NS}/chartsheet`]);\n const original: NonNullable<Workbook['workbookRelOriginalIds']> = {};\n const extras: Array<{ id: string; type: string; target: string }> = [];\n for (const rel of wbRels.rels) {\n if (SHEET_RELS.has(rel.type)) continue;\n if (rel.type === `${REL_NS}/sharedStrings`) {\n original.sharedStrings = rel.id;\n continue;\n }\n if (rel.type === `${REL_NS}/styles`) {\n original.styles = rel.id;\n continue;\n }\n if (rel.type === `${REL_NS}/theme`) {\n original.theme = rel.id;\n continue;\n }\n if (rel.type === `${REL_NS}/vbaProject`) {\n original.vbaProject = rel.id;\n continue;\n }\n extras.push({ id: rel.id, type: rel.type, target: rel.target });\n }\n if (Object.keys(original).length > 0) wb.workbookRelOriginalIds = original;\n if (extras.length > 0) wb.workbookRelsExtras = extras;\n}\n\nconst PASSTHROUGH_PREFIXES: ReadonlyArray<string> = [\n 'xl/activeX/',\n 'xl/ctrlProps/',\n 'xl/embeddings/',\n 'xl/externalLinks/',\n // xl/model/ — Power Pivot data model (`xl/model/item.data` etc.).\n 'xl/model/',\n 'xl/persons/',\n 'xl/pivotCache/',\n 'xl/pivotTables/',\n 'xl/printerSettings/',\n 'xl/queryTables/',\n 'xl/richData/',\n 'xl/slicerCaches/',\n 'xl/slicers/',\n 'xl/threadedComments/',\n 'xl/timelineCaches/',\n 'xl/timelines/',\n 'xl/workbookCache/',\n 'customUI/',\n 'customXml/',\n];\n\n/**\n * Excel emits both form-control VMLs and comment VMLs at\n * `xl/drawings/vmlDrawingN.vml`. Filename alone can't tell them apart, but\n * ECMA-376 §17.18.51 requires comment shapes to carry `<x:ClientData\n * ObjectType=\"Note\">`, so a byte-search for that marker decides which path the\n * file belongs on:\n *\n * - With marker → comment VML; the comments writer regenerates\n * these from `Worksheet.legacyComments`, so we must not capture them as\n * passthrough (would duplicate the entry on save).\n * - Without marker → control / OLE / shape VML; capture as\n * passthrough so form controls survive load → save → load.\n */\nconst COMMENT_VML_MARKER = 'ObjectType=\"Note\"';\n// Latin-1 is a 1-to-1 byte-to-character mapping for the 0–255 range, so a\n// String.indexOf scan on the decoded view returns the same answer as a byte\n// search but takes advantage of V8's native StringPrototypeIndexOf — orders\n// of magnitude faster than the JS loop the previous implementation used on\n// multi-megabyte VML drawings.\nconst LATIN1_DECODER = new TextDecoder('latin1');\n\nconst isVmlDrawing = (path: string): boolean =>\n path.startsWith('xl/drawings/') && path.endsWith('.vml');\n\nconst containsCommentMarker = (bytes: Uint8Array): boolean =>\n LATIN1_DECODER.decode(bytes).includes(COMMENT_VML_MARKER);\n\ninterface VmlPartCache {\n /** Inflated VML bytes, read once per part. */\n read(path: string): Uint8Array;\n /** True when the part at `path` exists and is a comment overlay. */\n isCommentVml(path: string): boolean;\n}\n\n/**\n * Both the per-sheet rels capture and the passthrough sweep need to classify\n * VML parts; share one inflate per part between them.\n */\nconst makeVmlPartCache = (archive: ZipArchive): VmlPartCache => {\n const bytesByPath = new Map<string, Uint8Array>();\n const read = (path: string): Uint8Array => {\n let bytes = bytesByPath.get(path);\n if (bytes === undefined) {\n bytes = archive.read(path);\n bytesByPath.set(path, bytes);\n }\n return bytes;\n };\n return {\n read,\n isCommentVml: (path) => archive.has(path) && containsCommentMarker(read(path)),\n };\n};\n\n/**\n * Top-level xl/*.xml files that aren't modeled but Excel relies on (or\n * harmlessly preserves). Captured by exact path; their content types come\n * through the manifest Override map.\n *\n * - `xl/calcChain.xml` — calculation order hint (Excel rebuilds\n * it on first open if missing, but losing it forces a full recalc).\n * - `xl/connections.xml` — external data connection metadata.\n * - `xl/persons/` — threaded-comment author registry\n * (Excel 365). Captured under the prefix list below.\n * - `xl/metadata.xml` — Excel 365 dynamic-array cell metadata.\n * - `xl/SheetMetadata.xml` — variant casing of the same.\n */\nconst PASSTHROUGH_EXACT_PATHS: ReadonlySet<string> = new Set([\n 'xl/calcChain.xml',\n 'xl/connections.xml',\n 'xl/metadata.xml',\n 'xl/SheetMetadata.xml',\n // docProps/thumbnail.jpeg — workbook preview image Excel renders in the OS\n // file browser. JPEG by default; some files use PNG.\n 'docProps/thumbnail.jpeg',\n 'docProps/thumbnail.jpg',\n 'docProps/thumbnail.png',\n 'docProps/thumbnail.wmf',\n 'docProps/thumbnail.emf',\n]);\n\nconst isPassthroughPath = (path: string, vml: VmlPartCache): boolean => {\n if (PASSTHROUGH_EXACT_PATHS.has(path)) return true;\n if (PASSTHROUGH_PREFIXES.some((p) => path.startsWith(p))) return true;\n // Comment VML is regenerated; control / shape / header-footer VML passes\n // through.\n if (isVmlDrawing(path)) return !vml.isCommentVml(path);\n return false;\n};\n\n/**\n * Walk the archive after the modeled parts are loaded and capture any remaining\n * content into `wb.passthrough`. The dedicated VBA project binaries land on\n * their own slots so the writer can promote the workbook content type to xlsm.\n *\n * `roots` are parts the worksheet writer will reference by their original\n * r:id (see `captureSheetRelsExtras`). Each root is captured together with\n * its own `.rels` file and, transitively, every internal target of those rels\n * — that is what keeps a header/footer VML's image (`vmlDrawingN.vml.rels` →\n * `xl/media/imageN.jpeg`) attached. Passthrough VML parts get the same\n * treatment because form-control VML references images the same way.\n */\nfunction capturePassthrough(\n archive: ZipArchive,\n manifest: import('../packaging/manifest').Manifest,\n wb: Workbook,\n roots: ReadonlyArray<string>,\n vml: VmlPartCache,\n): void {\n const overrides = new Map<string, string>();\n for (const o of manifest.overrides) {\n // Manifest paths are package-absolute (`/xl/...`); strip the leading slash.\n overrides.set(o.partName.replace(/^\\//, ''), o.contentType);\n }\n const defaults = new Map<string, string>();\n for (const d of manifest.defaults) defaults.set(d.ext.toLowerCase(), d.contentType);\n\n const capture = (path: string, bytes: Uint8Array): void => {\n if (!wb.passthrough) wb.passthrough = new Map();\n wb.passthrough.set(path, bytes);\n const ct = overrides.get(path);\n if (ct !== undefined) {\n if (!wb.passthroughContentTypes) wb.passthroughContentTypes = new Map();\n wb.passthroughContentTypes.set(path, ct);\n return;\n }\n // No Override → the part is typed by its extension's Default. Remember it\n // so the writer can re-emit that Default; it only knows the extensions of\n // parts it produces itself.\n const ext = path.slice(path.lastIndexOf('.') + 1).toLowerCase();\n const dct = defaults.get(ext);\n if (dct !== undefined) {\n if (!wb.passthroughDefaults) wb.passthroughDefaults = new Map();\n wb.passthroughDefaults.set(ext, dct);\n }\n };\n\n const closureRoots: string[] = [...roots];\n for (const path of archive.list()) {\n if (path === 'xl/vbaProject.bin') {\n wb.vbaProject = archive.read(path);\n continue;\n }\n if (path === 'xl/vbaProjectSignature.bin') {\n wb.vbaSignature = archive.read(path);\n continue;\n }\n if (!isPassthroughPath(path, vml)) continue;\n if (isVmlDrawing(path)) {\n capture(path, vml.read(path));\n closureRoots.push(path);\n } else {\n capture(path, archive.read(path));\n }\n }\n\n // Breadth-first over rels so a chain like sheet → VML → image is captured\n // whole. `visited` (not `wb.passthrough`) gates the walk because roots\n // captured by the prefix scan above still need their rels followed.\n const visited = new Set<string>();\n // for…of re-reads the array length each step, so targets pushed mid-walk\n // are visited too.\n for (const path of closureRoots) {\n if (visited.has(path) || !archive.has(path)) continue;\n visited.add(path);\n if (!wb.passthrough?.has(path)) capture(path, archive.read(path));\n const relsPath = relsPathFor(path);\n if (!archive.has(relsPath)) continue;\n const relsBytes = archive.read(relsPath);\n capture(relsPath, relsBytes);\n for (const r of relsFromBytes(relsBytes).rels) {\n if (r.targetMode !== 'External') closureRoots.push(resolveRelTarget(path, r.target));\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-Cm9K7D62.mjs","names":[],"sources":["../src/packaging/relationships.ts","../src/packaging/core.ts","../src/packaging/custom.ts","../src/packaging/extended.ts","../src/packaging/manifest.ts"],"sourcesContent":["// `*.rels` files — Open Packaging Conventions relationship lists.\n//\n// Mirrors openpyxl/openpyxl/packaging/relationship.py. Relationship Ids\n// (`rId{N}`) auto-increment using the smallest unused integer so the list stays\n// deterministic even when callers mix in pre-assigned ids.\n\nimport { defineSchema, type Schema } from '../schema/core';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { PKG_REL_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\n\nexport interface Relationship {\n /** rIdN identifier; unique within the parent .rels file. */\n id: string;\n /** Full relationship type URI. */\n type: string;\n /** Target — relative part path or absolute URL when targetMode === 'External'. */\n target: string;\n /** Defaults to internal. */\n targetMode?: 'External' | 'Internal';\n}\n\nexport interface Relationships {\n rels: Relationship[];\n}\n\nconst RelationshipSchema = defineSchema<Relationship>({\n tagname: 'Relationship',\n xmlNs: PKG_REL_NS,\n attrs: {\n id: { kind: 'string', xmlName: 'Id' },\n type: { kind: 'string', xmlName: 'Type' },\n target: { kind: 'string', xmlName: 'Target' },\n targetMode: {\n kind: 'enum',\n values: ['External', 'Internal'],\n xmlName: 'TargetMode',\n optional: true,\n },\n },\n elements: [],\n});\n\nconst RelationshipsSchema: Schema<Relationships> = defineSchema<Relationships>({\n tagname: 'Relationships',\n xmlNs: PKG_REL_NS,\n attrs: {},\n elements: [\n {\n kind: 'sequence',\n key: 'rels',\n itemName: 'Relationship',\n itemNs: PKG_REL_NS,\n itemSchema: () => RelationshipSchema,\n },\n ],\n});\n\nexport function makeRelationships(): Relationships {\n return { rels: [] };\n}\n\nconst RID_RE = /^rId(\\d+)$/;\n\nconst allocateNextId = (rels: Relationships): string => {\n // Smallest positive integer not yet used as `rId{N}`. Linear scan is fine\n // because rels lists are small (tens of entries in real workbooks).\n const used = new Set<number>();\n for (const r of rels.rels) {\n const m = RID_RE.exec(r.id);\n if (m !== null) {\n const n = Number.parseInt(m[1] ?? '0', 10);\n if (Number.isFinite(n) && n > 0) used.add(n);\n }\n }\n let n = 1;\n while (used.has(n)) n++;\n return `rId${n}`;\n};\n\n/**\n * Append a relationship and return the resulting object. Auto-assigns the next\n * free `rId{N}` Id.\n */\nexport function appendRel(rels: Relationships, type: string, target: string, targetMode?: 'External'): Relationship {\n const next: Relationship = { id: allocateNextId(rels), type, target };\n if (targetMode !== undefined) next.targetMode = targetMode;\n rels.rels.push(next);\n return next;\n}\n\nexport function findById(rels: Relationships, id: string): Relationship | undefined {\n for (const r of rels.rels) if (r.id === id) return r;\n return undefined;\n}\n\n/**\n * Build an id → relationship index for callers that look up the same .rels\n * file many times in a hot loop. Cheaper than repeated {@link findById} once\n * the rels count crosses a handful of entries.\n */\nexport function indexRelsById(rels: Relationships): Map<string, Relationship> {\n const out = new Map<string, Relationship>();\n for (const r of rels.rels) out.set(r.id, r);\n return out;\n}\n\nexport function findByType(rels: Relationships, type: string): Relationship | undefined {\n for (const r of rels.rels) if (r.type === type) return r;\n return undefined;\n}\n\nexport function findAllByType(rels: Relationships, type: string): Relationship[] {\n const out: Relationship[] = [];\n for (const r of rels.rels) if (r.type === type) out.push(r);\n return out;\n}\n\nexport function relsToBytes(rels: Relationships): Uint8Array {\n return serializeXml(toTree(rels, RelationshipsSchema));\n}\n\nexport function relsFromBytes(bytes: Uint8Array | string): Relationships {\n return fromTree(parseXml(bytes), RelationshipsSchema);\n}\n","// `docProps/core.xml` — Dublin Core / Office core document properties.\n//\n// Each property lives in its own namespace (cp / dc / dcterms). The dcterms\n// timestamps carry an `xsi:type=\"dcterms:W3CDTF\"` marker which we reproduce as\n// a fixed attr on those text elements via the schema layer's `text` element\n// kind.\n\nimport { defineSchema, type Schema } from '../schema/core';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { COREPROPS_NS, DCORE_NS, DCTERMS_NS, XSI_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\n\n/**\n * Set of properties exposed under `docProps/core.xml`. All fields are optional;\n * the workbook only emits those that are set. Timestamps are stored as ISO-8601\n * strings (the W3CDTF subset) — no Date conversion happens at this layer;\n * phase-3 saveWorkbook is responsible for stamping `modified` to `now()` on\n * each save.\n */\nexport interface CoreProperties {\n category?: string;\n contentStatus?: string;\n /** ISO-8601 W3CDTF; auto-stamped on save in phase 3. */\n created?: string;\n creator?: string;\n description?: string;\n identifier?: string;\n keywords?: string;\n language?: string;\n lastModifiedBy?: string;\n /** ISO-8601 W3CDTF. */\n lastPrinted?: string;\n /** ISO-8601 W3CDTF; auto-stamped on save in phase 3. */\n modified?: string;\n revision?: string;\n subject?: string;\n title?: string;\n version?: string;\n}\n\nconst W3CDTF_ATTRS: Record<string, string> = {\n [`{${XSI_NS}}type`]: 'dcterms:W3CDTF',\n};\n\nconst CorePropertiesSchema: Schema<CoreProperties> = defineSchema<CoreProperties>({\n tagname: 'coreProperties',\n xmlNs: COREPROPS_NS,\n attrs: {},\n elements: [\n // openpyxl's child-namespace assignment, mirrored exactly:\n { kind: 'text', key: 'category', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'contentStatus', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'keywords', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'lastModifiedBy', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n {\n kind: 'text',\n key: 'lastPrinted',\n xmlNs: DCTERMS_NS,\n primitive: 'string',\n optional: true,\n attrs: W3CDTF_ATTRS,\n },\n { kind: 'text', key: 'revision', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'version', xmlNs: COREPROPS_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'description', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'identifier', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'language', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'subject', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'title', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n { kind: 'text', key: 'creator', xmlNs: DCORE_NS, primitive: 'string', optional: true },\n {\n kind: 'text',\n key: 'created',\n xmlNs: DCTERMS_NS,\n primitive: 'string',\n optional: true,\n attrs: W3CDTF_ATTRS,\n },\n {\n kind: 'text',\n key: 'modified',\n xmlNs: DCTERMS_NS,\n primitive: 'string',\n optional: true,\n attrs: W3CDTF_ATTRS,\n },\n ],\n});\n\nexport function makeCoreProperties(): CoreProperties {\n return {};\n}\n\nexport function corePropsToBytes(p: CoreProperties): Uint8Array {\n return serializeXml(toTree(p, CorePropertiesSchema));\n}\n\nexport function corePropsFromBytes(bytes: Uint8Array | string): CoreProperties {\n return fromTree(parseXml(bytes), CorePropertiesSchema);\n}\n\n// ---- Workbook ergonomic helpers ----------------------------------------\n\nimport type { Workbook } from '../workbook/workbook';\n\nconst ensureCoreProperties = (wb: Workbook): CoreProperties => {\n if (!wb.properties) wb.properties = {};\n return wb.properties;\n};\n\n/** Set the document author (Excel \"File → Properties → Author\"). */\nexport const setWorkbookCreator = (wb: Workbook, creator: string): void => {\n ensureCoreProperties(wb).creator = creator;\n};\n\n/** Set the document title. */\nexport const setWorkbookTitle = (wb: Workbook, title: string): void => {\n ensureCoreProperties(wb).title = title;\n};\n\n/** Set the document subject. */\nexport const setWorkbookSubject = (wb: Workbook, subject: string): void => {\n ensureCoreProperties(wb).subject = subject;\n};\n\n/** Set the document description / abstract. */\nexport const setWorkbookDescription = (wb: Workbook, description: string): void => {\n ensureCoreProperties(wb).description = description;\n};\n\n/** Set comma- or semicolon-separated keywords. */\nexport const setWorkbookKeywords = (wb: Workbook, keywords: string): void => {\n ensureCoreProperties(wb).keywords = keywords;\n};\n\n/** Set the \"last modified by\" name (defaults to creator if absent). */\nexport const setWorkbookLastModifiedBy = (wb: Workbook, name: string): void => {\n ensureCoreProperties(wb).lastModifiedBy = name;\n};\n\n/** Set the document category (e.g. \"Reports\", \"Drafts\"). */\nexport const setWorkbookCategory = (wb: Workbook, category: string): void => {\n ensureCoreProperties(wb).category = category;\n};\n","// `docProps/custom.xml` — user-defined document properties. Each <property>\n// carries fmtid/pid/name attributes plus a single typed value child from the\n// vt: namespace (vt:lpwstr, vt:i4, vt:bool, …).\n//\n// The Schema layer drives the <property> element attribute set; the typed-value\n// child is stored as a raw XmlNode and the `make*Value` / `read*Value` helpers\n// below cover the most common conversions.\n\nimport { OpenXmlSchemaError } from '../utils/exceptions';\nimport { CPROPS_FMTID, CUSTPROPS_NS, parseQName, VTYPES_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\nimport { el, type XmlNode } from '../xml/tree';\n\nexport interface CustomProperty {\n /** User-visible property name (must be unique within the workbook). */\n name: string;\n /** OOXML \"Property Identifier\"; ≥ 2. Auto-allocated if absent on append. */\n pid: number;\n /** Format ID GUID. Defaults to the well-known {D5CDD505-…} on append. */\n fmtid?: string;\n /** Typed value as a raw vt: element. Use the `make*Value` helpers. */\n value: XmlNode;\n}\n\nexport interface CustomProperties {\n properties: CustomProperty[];\n}\n\nexport function makeCustomProperties(): CustomProperties {\n return { properties: [] };\n}\n\nconst PROPERTY_NAME = `{${CUSTPROPS_NS}}property`;\nconst PROPERTIES_NAME = `{${CUSTPROPS_NS}}Properties`;\n\n// ---- typed-value constructors ----------------------------------------------\n\nconst vt = (local: string, text: string): XmlNode => el(`{${VTYPES_NS}}${local}`, {}, [], text);\n\nexport function makeStringValue(s: string): XmlNode {\n return vt('lpwstr', s);\n}\nexport function makeAsciiStringValue(s: string): XmlNode {\n return vt('lpstr', s);\n}\nexport function makeIntValue(n: number): XmlNode {\n if (!Number.isInteger(n)) throw new OpenXmlSchemaError(`makeIntValue: ${n} is not an integer`);\n return vt('i4', String(n));\n}\nexport function makeDoubleValue(n: number): XmlNode {\n if (!Number.isFinite(n)) throw new OpenXmlSchemaError(`makeDoubleValue: ${n} is not finite`);\n return vt('r8', String(n));\n}\nexport function makeBoolValue(b: boolean): XmlNode {\n return vt('bool', b ? '1' : '0');\n}\nexport function makeFiletimeValue(iso: string): XmlNode {\n return vt('filetime', iso);\n}\nexport function makeDateValue(iso: string): XmlNode {\n return vt('date', iso);\n}\n\n// ---- typed-value readers ---------------------------------------------------\n\nconst localNameOf = (n: XmlNode): string => parseQName(n.name).local;\n\nexport function readStringValue(v: XmlNode): string | undefined {\n const ln = localNameOf(v);\n if (ln === 'lpwstr' || ln === 'lpstr' || ln === 'bstr') return v.text ?? '';\n return undefined;\n}\nexport function readIntValue(v: XmlNode): number | undefined {\n const ln = localNameOf(v);\n if (\n ln === 'i4' ||\n ln === 'i2' ||\n ln === 'i1' ||\n ln === 'int' ||\n ln === 'uint' ||\n ln === 'ui4' ||\n ln === 'ui2' ||\n ln === 'ui1'\n ) {\n const n = Number.parseInt(v.text ?? '', 10);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\nexport function readDoubleValue(v: XmlNode): number | undefined {\n const ln = localNameOf(v);\n if (ln === 'r4' || ln === 'r8' || ln === 'decimal' || ln === 'cy') {\n const n = Number.parseFloat(v.text ?? '');\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\nexport function readBoolValue(v: XmlNode): boolean | undefined {\n if (localNameOf(v) !== 'bool') return undefined;\n const t = (v.text ?? '').toLowerCase();\n if (t === '1' || t === 'true' || t === 't') return true;\n if (t === '0' || t === 'false' || t === 'f') return false;\n return undefined;\n}\nexport function readFiletimeValue(v: XmlNode): string | undefined {\n if (localNameOf(v) === 'filetime') return v.text ?? '';\n return undefined;\n}\n\n// ---- collection ops --------------------------------------------------------\n\nconst allocatePid = (props: CustomProperties): number => {\n // pid 0 / 1 are reserved by the OPC spec; user pids start at 2.\n const used = new Set<number>();\n for (const p of props.properties) used.add(p.pid);\n let n = 2;\n while (used.has(n)) n++;\n return n;\n};\n\nexport function appendCustomProperty(\n props: CustomProperties,\n name: string,\n value: XmlNode,\n opts?: { pid?: number; fmtid?: string },\n): CustomProperty {\n const pid = opts?.pid ?? allocatePid(props);\n const out: CustomProperty = { name, pid, value };\n if (opts?.fmtid !== undefined) out.fmtid = opts.fmtid;\n props.properties.push(out);\n return out;\n}\n\nexport function findCustomPropertyByName(props: CustomProperties, name: string): CustomProperty | undefined {\n for (const p of props.properties) if (p.name === name) return p;\n return undefined;\n}\n\n// ---- bytes round-trip ------------------------------------------------------\n\nexport function customPropsToBytes(p: CustomProperties): Uint8Array {\n const root = el(PROPERTIES_NAME);\n for (const prop of p.properties) {\n const propEl = el(PROPERTY_NAME, {\n fmtid: prop.fmtid ?? CPROPS_FMTID,\n pid: String(prop.pid),\n name: prop.name,\n });\n propEl.children.push(prop.value);\n root.children.push(propEl);\n }\n return serializeXml(root);\n}\n\nexport function customPropsFromBytes(bytes: Uint8Array | string): CustomProperties {\n const root = parseXml(bytes);\n if (root.name !== PROPERTIES_NAME) {\n throw new OpenXmlSchemaError(`customPropsFromBytes: expected <Properties>, got \"${root.name}\"`);\n }\n const properties: CustomProperty[] = [];\n for (const propEl of root.children) {\n if (propEl.name !== PROPERTY_NAME) continue;\n const fmtid = propEl.attrs['fmtid'];\n const pidRaw = propEl.attrs['pid'];\n const name = propEl.attrs['name'];\n if (name === undefined || pidRaw === undefined) {\n throw new OpenXmlSchemaError('custom.xml: <property> requires name and pid attributes');\n }\n const pid = Number.parseInt(pidRaw, 10);\n if (!Number.isFinite(pid)) {\n throw new OpenXmlSchemaError(`custom.xml: <property> pid is not an integer (got \"${pidRaw}\")`);\n }\n const value = propEl.children[0];\n if (value === undefined) {\n throw new OpenXmlSchemaError(`custom.xml: <property name=\"${name}\"> has no typed-value child`);\n }\n const out: CustomProperty = { name, pid, value };\n if (fmtid !== undefined) out.fmtid = fmtid;\n properties.push(out);\n }\n return { properties };\n}\n\n// ---- Workbook ergonomic helpers ----------------------------------------\n\nimport type { Workbook } from '../workbook/workbook';\n\nconst ensureCustomProperties = (wb: Workbook): CustomProperties => {\n if (!wb.customProperties) wb.customProperties = makeCustomProperties();\n return wb.customProperties;\n};\n\nconst replaceOrAppend = (\n wb: Workbook,\n name: string,\n value: XmlNode,\n opts?: { fmtid?: string },\n): CustomProperty => {\n const props = ensureCustomProperties(wb);\n const existing = findCustomPropertyByName(props, name);\n if (existing) {\n existing.value = value;\n if (opts?.fmtid !== undefined) existing.fmtid = opts.fmtid;\n return existing;\n }\n return appendCustomProperty(props, name, value, opts);\n};\n\n/** Set (or replace) a custom string property. */\nexport const setCustomStringProperty = (wb: Workbook, name: string, value: string): CustomProperty =>\n replaceOrAppend(wb, name, makeStringValue(value));\n\n/**\n * Set (or replace) a custom numeric property. Integers (within Int32 range) are\n * stored as `vt:i4`; non-integer / out-of-range numbers as `vt:r8` doubles.\n */\nexport const setCustomNumberProperty = (wb: Workbook, name: string, value: number): CustomProperty => {\n if (!Number.isFinite(value)) {\n throw new OpenXmlSchemaError(`setCustomNumberProperty: value \"${value}\" is not finite`);\n }\n const isInt32 = Number.isInteger(value) && value >= -2147483648 && value <= 2147483647;\n const node = isInt32 ? makeIntValue(value) : makeDoubleValue(value);\n return replaceOrAppend(wb, name, node);\n};\n\n/** Set (or replace) a custom boolean property. */\nexport const setCustomBoolProperty = (wb: Workbook, name: string, value: boolean): CustomProperty =>\n replaceOrAppend(wb, name, makeBoolValue(value));\n\n/**\n * Set (or replace) a custom date property. Accepts a `Date` (converted to ISO\n * via `toISOString()`) or a pre-formatted W3C-DTF string.\n */\nexport const setCustomDateProperty = (\n wb: Workbook,\n name: string,\n value: Date | string,\n): CustomProperty => {\n const iso = value instanceof Date ? value.toISOString() : value;\n return replaceOrAppend(wb, name, makeFiletimeValue(iso));\n};\n\n/**\n * Read the typed value of a custom property by name. Tries each decoder in turn\n * — string, int, double, bool, filetime — and returns the first hit. Returns\n * `undefined` for unknown names or unsupported types.\n */\nexport const getCustomPropertyValue = (\n wb: Workbook,\n name: string,\n): string | number | boolean | undefined => {\n if (!wb.customProperties) return undefined;\n const prop = findCustomPropertyByName(wb.customProperties, name);\n if (!prop) return undefined;\n const s = readStringValue(prop.value);\n if (s !== undefined) return s;\n const i = readIntValue(prop.value);\n if (i !== undefined) return i;\n const d = readDoubleValue(prop.value);\n if (d !== undefined) return d;\n const b = readBoolValue(prop.value);\n if (b !== undefined) return b;\n const ft = readFiletimeValue(prop.value);\n if (ft !== undefined) return ft;\n return undefined;\n};\n\n/**\n * Remove a custom property by name. Returns `true` when one was removed,\n * `false` when the name wasn't found.\n */\nexport const removeCustomProperty = (wb: Workbook, name: string): boolean => {\n if (!wb.customProperties) return false;\n const arr = wb.customProperties.properties;\n const i = arr.findIndex((p) => p.name === name);\n if (i < 0) return false;\n arr.splice(i, 1);\n return true;\n};\n\n/** Read-only snapshot of every custom property. */\nexport const listCustomProperties = (wb: Workbook): ReadonlyArray<CustomProperty> => {\n return wb.customProperties?.properties ?? [];\n};\n","// `docProps/app.xml` — Office \"extended\" document properties.\n//\n// Mirrors openpyxl/openpyxl/packaging/extended.py. Most fields are flat (text\n// or numeric). The four vector-shaped children — HeadingPairs, TitlesOfParts,\n// HLinks, DigSig — are kept as raw XmlNode subtrees and round-tripped verbatim;\n// modelling vt:vector explicitly is a phase-3 concern at the earliest. See row\n// for `packaging/extended.py`.\n\nimport { defineSchema, type Schema } from '../schema/core';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { XPROPS_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\nimport type { XmlNode } from '../xml/tree';\n\nexport interface ExtendedProperties {\n application?: string;\n appVersion?: string;\n characters?: number;\n charactersWithSpaces?: number;\n company?: string;\n digitalSignature?: XmlNode;\n docSecurity?: number;\n hLinks?: XmlNode;\n headingPairs?: XmlNode;\n hiddenSlides?: number;\n hyperlinkBase?: string;\n hyperlinks?: XmlNode;\n hyperlinksChanged?: boolean;\n lines?: number;\n linksUpToDate?: boolean;\n manager?: string;\n mmClips?: number;\n notes?: number;\n pages?: number;\n paragraphs?: number;\n presentationFormat?: string;\n scaleCrop?: boolean;\n sharedDoc?: boolean;\n slides?: number;\n template?: string;\n titlesOfParts?: XmlNode;\n totalTime?: number;\n words?: number;\n}\n\nconst ExtendedSchema: Schema<ExtendedProperties> = defineSchema<ExtendedProperties>({\n tagname: 'Properties',\n xmlNs: XPROPS_NS,\n attrs: {},\n // Element order chosen to match the Office output convention.\n elements: [\n { kind: 'text', key: 'template', xmlNs: XPROPS_NS, name: 'Template', primitive: 'string', optional: true },\n { kind: 'text', key: 'manager', xmlNs: XPROPS_NS, name: 'Manager', primitive: 'string', optional: true },\n { kind: 'text', key: 'company', xmlNs: XPROPS_NS, name: 'Company', primitive: 'string', optional: true },\n { kind: 'text', key: 'pages', xmlNs: XPROPS_NS, name: 'Pages', primitive: 'int', optional: true },\n { kind: 'text', key: 'words', xmlNs: XPROPS_NS, name: 'Words', primitive: 'int', optional: true },\n { kind: 'text', key: 'characters', xmlNs: XPROPS_NS, name: 'Characters', primitive: 'int', optional: true },\n {\n kind: 'text',\n key: 'presentationFormat',\n xmlNs: XPROPS_NS,\n name: 'PresentationFormat',\n primitive: 'string',\n optional: true,\n },\n { kind: 'text', key: 'lines', xmlNs: XPROPS_NS, name: 'Lines', primitive: 'int', optional: true },\n { kind: 'text', key: 'paragraphs', xmlNs: XPROPS_NS, name: 'Paragraphs', primitive: 'int', optional: true },\n { kind: 'text', key: 'slides', xmlNs: XPROPS_NS, name: 'Slides', primitive: 'int', optional: true },\n { kind: 'text', key: 'notes', xmlNs: XPROPS_NS, name: 'Notes', primitive: 'int', optional: true },\n { kind: 'text', key: 'totalTime', xmlNs: XPROPS_NS, name: 'TotalTime', primitive: 'int', optional: true },\n { kind: 'text', key: 'hiddenSlides', xmlNs: XPROPS_NS, name: 'HiddenSlides', primitive: 'int', optional: true },\n { kind: 'text', key: 'mmClips', xmlNs: XPROPS_NS, name: 'MMClips', primitive: 'int', optional: true },\n { kind: 'text', key: 'scaleCrop', xmlNs: XPROPS_NS, name: 'ScaleCrop', primitive: 'bool', optional: true },\n { kind: 'raw', key: 'headingPairs', xmlNs: XPROPS_NS, name: 'HeadingPairs', optional: true },\n { kind: 'raw', key: 'titlesOfParts', xmlNs: XPROPS_NS, name: 'TitlesOfParts', optional: true },\n { kind: 'raw', key: 'hLinks', xmlNs: XPROPS_NS, name: 'HLinks', optional: true },\n { kind: 'raw', key: 'hyperlinks', xmlNs: XPROPS_NS, name: 'Hyperlinks', optional: true },\n { kind: 'text', key: 'linksUpToDate', xmlNs: XPROPS_NS, name: 'LinksUpToDate', primitive: 'bool', optional: true },\n { kind: 'text', key: 'sharedDoc', xmlNs: XPROPS_NS, name: 'SharedDoc', primitive: 'bool', optional: true },\n {\n kind: 'text',\n key: 'hyperlinkBase',\n xmlNs: XPROPS_NS,\n name: 'HyperlinkBase',\n primitive: 'string',\n optional: true,\n },\n {\n kind: 'text',\n key: 'hyperlinksChanged',\n xmlNs: XPROPS_NS,\n name: 'HyperlinksChanged',\n primitive: 'bool',\n optional: true,\n },\n { kind: 'raw', key: 'digitalSignature', xmlNs: XPROPS_NS, name: 'DigSig', optional: true },\n { kind: 'text', key: 'application', xmlNs: XPROPS_NS, name: 'Application', primitive: 'string', optional: true },\n { kind: 'text', key: 'appVersion', xmlNs: XPROPS_NS, name: 'AppVersion', primitive: 'string', optional: true },\n { kind: 'text', key: 'docSecurity', xmlNs: XPROPS_NS, name: 'DocSecurity', primitive: 'int', optional: true },\n {\n kind: 'text',\n key: 'charactersWithSpaces',\n xmlNs: XPROPS_NS,\n name: 'CharactersWithSpaces',\n primitive: 'int',\n optional: true,\n },\n ],\n});\n\nexport function makeExtendedProperties(): ExtendedProperties {\n return {};\n}\n\nexport function extendedPropsToBytes(p: ExtendedProperties): Uint8Array {\n return serializeXml(toTree(p, ExtendedSchema));\n}\n\nexport function extendedPropsFromBytes(bytes: Uint8Array | string): ExtendedProperties {\n return fromTree(parseXml(bytes), ExtendedSchema);\n}\n\n// ---- Workbook ergonomic helpers ----------------------------------------\n\nimport type { Workbook } from '../workbook/workbook';\n\nconst ensureAppProperties = (wb: Workbook): ExtendedProperties => {\n if (!wb.appProperties) wb.appProperties = {};\n return wb.appProperties;\n};\n\n/** Set the company name on docProps/app.xml. */\nexport const setWorkbookCompany = (wb: Workbook, company: string): void => {\n ensureAppProperties(wb).company = company;\n};\n\n/** Set the manager / supervisor name on docProps/app.xml. */\nexport const setWorkbookManager = (wb: Workbook, manager: string): void => {\n ensureAppProperties(wb).manager = manager;\n};\n\n/** Set the application name (e.g. `\"Microsoft Excel\"`). */\nexport const setWorkbookApplication = (wb: Workbook, application: string): void => {\n ensureAppProperties(wb).application = application;\n};\n\n/** Set the application version (typically `\"16.0300\"` for Excel 365). */\nexport const setWorkbookAppVersion = (wb: Workbook, version: string): void => {\n ensureAppProperties(wb).appVersion = version;\n};\n\n/** Set the hyperlink base URL — Excel uses this as a prefix for relative `&F` codes. */\nexport const setWorkbookHyperlinkBase = (wb: Workbook, base: string): void => {\n ensureAppProperties(wb).hyperlinkBase = base;\n};\n","// [Content_Types].xml — the package manifest. Tracks default content types per\n// file extension and per-part Override entries.\n\nimport { defineSchema, type Schema } from '../schema/core';\nimport { fromTree, toTree } from '../schema/serialize';\nimport { CONTYPES_NS } from '../xml/namespaces';\nimport { parseXml } from '../xml/parser';\nimport { serializeXml } from '../xml/serializer';\n\nexport interface DefaultEntry {\n /** File extension without leading dot (e.g. \"rels\", \"xml\", \"png\"). */\n ext: string;\n contentType: string;\n}\n\nexport interface OverrideEntry {\n /** Part name path including leading slash (e.g. \"/xl/workbook.xml\"). */\n partName: string;\n contentType: string;\n}\n\nexport interface Manifest {\n defaults: DefaultEntry[];\n overrides: OverrideEntry[];\n}\n\nconst DefaultSchema = defineSchema<DefaultEntry>({\n tagname: 'Default',\n xmlNs: CONTYPES_NS,\n attrs: {\n ext: { kind: 'string', xmlName: 'Extension' },\n contentType: { kind: 'string', xmlName: 'ContentType' },\n },\n elements: [],\n});\n\nconst OverrideSchema = defineSchema<OverrideEntry>({\n tagname: 'Override',\n xmlNs: CONTYPES_NS,\n attrs: {\n partName: { kind: 'string', xmlName: 'PartName' },\n contentType: { kind: 'string', xmlName: 'ContentType' },\n },\n elements: [],\n});\n\nconst ManifestSchema: Schema<Manifest> = defineSchema<Manifest>({\n tagname: 'Types',\n xmlNs: CONTYPES_NS,\n attrs: {},\n elements: [\n {\n kind: 'sequence',\n key: 'defaults',\n itemName: 'Default',\n itemNs: CONTYPES_NS,\n itemSchema: () => DefaultSchema,\n },\n {\n kind: 'sequence',\n key: 'overrides',\n itemName: 'Override',\n itemNs: CONTYPES_NS,\n itemSchema: () => OverrideSchema,\n },\n ],\n});\n\nexport function makeManifest(): Manifest {\n return { defaults: [], overrides: [] };\n}\n\n/** Register a default content type for an extension. Idempotent. */\nexport function addDefault(m: Manifest, ext: string, contentType: string): void {\n for (const d of m.defaults) {\n if (d.ext === ext) {\n if (d.contentType !== contentType) {\n d.contentType = contentType; // newer wins; matches openpyxl behaviour\n }\n return;\n }\n }\n m.defaults.push({ ext, contentType });\n}\n\n/** Register an Override for a specific part. Idempotent. */\nexport function addOverride(m: Manifest, partName: string, contentType: string): void {\n for (const o of m.overrides) {\n if (o.partName === partName) {\n if (o.contentType !== contentType) o.contentType = contentType;\n return;\n }\n }\n m.overrides.push({ partName, contentType });\n}\n\nexport function findOverride(m: Manifest, partName: string): OverrideEntry | undefined {\n for (const o of m.overrides) if (o.partName === partName) return o;\n return undefined;\n}\n\n/** Find the first Override matching a content type. */\nexport function findOverrideByContentType(m: Manifest, contentType: string): OverrideEntry | undefined {\n for (const o of m.overrides) if (o.contentType === contentType) return o;\n return undefined;\n}\n\nexport function manifestToBytes(m: Manifest): Uint8Array {\n return serializeXml(toTree(m, ManifestSchema));\n}\n\nexport function manifestFromBytes(bytes: Uint8Array | string): Manifest {\n return fromTree(parseXml(bytes), ManifestSchema);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser-D3SLaOFe.mjs","names":[],"sources":["../src/xml/parser.ts"],"sourcesContent":["// DOM-style XML parser. fast-xml-parser does the lexing, then we walk its\n// preserveOrder tree to:\n// 1. resolve `prefix:local` element + attribute names to Clark notation\n// (`{ns}local`) using a namespace-declaration stack;\n// 2. fold text segments into XmlNode.text for text-only elements;\n// 3. drop XML declarations and processing instructions.\n//\n// DOCTYPE / external entity declarations are rejected outright via a byte-level\n// prescan before the parser ever sees the input — fast-xml-parser does not\n// expand external entities, but we still want the offending document to fail\n// loudly.\n\nimport { XMLParser } from 'fast-xml-parser';\nimport { OpenXmlSchemaError } from '../utils/exceptions';\nimport { qname } from './namespaces';\nimport { el, type XmlNode } from './tree';\n\n// ---- DOCTYPE / DTD prescan --------------------------------------------------\n\nconst decoder = new TextDecoder('utf-8', { fatal: false });\n\nconst decodeForPrescan = (input: Uint8Array | string): string => {\n if (typeof input === 'string') return input;\n return decoder.decode(input);\n};\n\nconst checkForDoctype = (text: string): void => {\n // Strip XML declaration so any subsequent `<!DOCTYPE` is the real thing. The\n // declaration is always the first non-BOM token in well-formed XML.\n const stripped = text.replace(/^/, '');\n if (/<!DOCTYPE\\b/.test(stripped)) {\n throw new OpenXmlSchemaError('DTD declarations are not permitted in OOXML payloads');\n }\n if (/<!ENTITY\\b/.test(stripped)) {\n throw new OpenXmlSchemaError('Entity declarations are not permitted in OOXML payloads');\n }\n};\n\n// ---- fast-xml-parser configuration ------------------------------------------\n\nconst parser = new XMLParser({\n preserveOrder: true,\n ignoreAttributes: false,\n attributeNamePrefix: '',\n attributesGroupName: ':@',\n trimValues: false,\n parseTagValue: false,\n parseAttributeValue: false,\n // OOXML needs the standard XML entities (& / < / > / " /\n // ') expanded; HTML / numeric entities outside that set are not used in\n // SpreadsheetML payloads.\n processEntities: true,\n htmlEntities: false,\n});\n\n// ---- preserveOrder shape ----------------------------------------------------\n\ntype FxpAttrs = Record<string, string>;\ntype FxpEntry = { ':@'?: FxpAttrs } & { [tagOrText: string]: FxpEntry[] | string | FxpAttrs | undefined };\ntype FxpTree = FxpEntry[];\n\nconst ATTR_KEY = ':@';\nconst TEXT_KEY = '#text';\n\n// ---- public API -------------------------------------------------------------\n\nexport interface ParsedDocument {\n root: XmlNode;\n /**\n * The root element's own `xmlns` declarations, in source order (`prefix` is\n * `''` for the default one). Clark notation carries the namespace but not\n * the prefix, so these are only needed by parts that must be written back\n * with the prefixes the producer chose — `xl/workbook.xml`, whose\n * `mc:Ignorable` names them by prefix.\n */\n rootNamespaces: Array<{ prefix: string; ns: string }>;\n}\n\n/**\n * Parse a UTF-8 XML payload into an {@link XmlNode} tree. Element and attribute\n * names are returned in Clark notation. Throws {@link OpenXmlSchemaError} on\n * DTD/entity declarations or on multi-root documents.\n *\n * Shorthand for {@link parseXmlDocument} when the root's namespace prefixes\n * don't matter — which is everywhere except the handful of parts that carry an\n * `mc:Ignorable`.\n */\nexport function parseXml(input: Uint8Array | string): XmlNode {\n return parseXmlDocument(input).root;\n}\n\n/** {@link parseXml} plus the root element's namespace declarations. */\nexport function parseXmlDocument(input: Uint8Array | string): ParsedDocument {\n const text = decodeForPrescan(input);\n checkForDoctype(text);\n\n let raw: FxpTree;\n try {\n raw = parser.parse(text) as FxpTree;\n } catch (cause) {\n throw new OpenXmlSchemaError('parseXml: failed to parse XML payload', { cause });\n }\n\n // Skip XML declaration, processing instructions and any leading whitespace\n // text nodes.\n const roots: FxpEntry[] = [];\n for (const entry of raw) {\n const tag = elementTag(entry);\n if (tag === undefined) continue; // text-only entry\n if (isProcessingInstruction(tag)) continue; // <?xml …?>, other PIs\n roots.push(entry);\n }\n if (roots.length === 0) {\n throw new OpenXmlSchemaError('parseXml: document has no root element');\n }\n if (roots.length > 1) {\n throw new OpenXmlSchemaError(`parseXml: document has ${roots.length} root elements; expected exactly one`);\n }\n\n const initial: NamespaceStack = { default: '', byPrefix: {} };\n const [root] = roots;\n if (root === undefined) {\n throw new OpenXmlSchemaError('parseXml: no root element');\n }\n return { root: convertElement(root, initial), rootNamespaces: declarationsOf(root[ATTR_KEY] as FxpAttrs | undefined) };\n}\n\nconst declarationsOf = (attrs: FxpAttrs | undefined): Array<{ prefix: string; ns: string }> => {\n const out: Array<{ prefix: string; ns: string }> = [];\n for (const [k, v] of Object.entries(attrs ?? {})) {\n if (k === 'xmlns') out.push({ prefix: '', ns: v });\n else if (k.startsWith('xmlns:')) out.push({ prefix: k.slice('xmlns:'.length), ns: v });\n }\n return out;\n};\n\n// ---- conversion -------------------------------------------------------------\n\ninterface NamespaceStack {\n /** Default namespace URI (xmlns=\"…\"); empty string means no default. */\n readonly default: string;\n /** Map of prefix → namespace URI declared in this scope or any ancestor. */\n readonly byPrefix: Readonly<Record<string, string>>;\n}\n\nconst elementTag = (entry: FxpEntry): string | undefined => {\n for (const k of Object.keys(entry)) {\n if (k === ATTR_KEY) continue;\n return k;\n }\n return undefined;\n};\n\nconst isProcessingInstruction = (tag: string): boolean => tag.startsWith('?');\n\nconst splitPrefixed = (qname0: string): { prefix: string; local: string } => {\n const idx = qname0.indexOf(':');\n if (idx < 0) return { prefix: '', local: qname0 };\n return { prefix: qname0.slice(0, idx), local: qname0.slice(idx + 1) };\n};\n\nconst extendStack = (parent: NamespaceStack, attrs: FxpAttrs | undefined): NamespaceStack => {\n if (attrs === undefined) return parent;\n let nextDefault = parent.default;\n let nextByPrefix: Record<string, string> | undefined;\n for (const [k, v] of Object.entries(attrs)) {\n if (k === 'xmlns') {\n nextDefault = v;\n continue;\n }\n if (k.startsWith('xmlns:')) {\n const prefix = k.slice('xmlns:'.length);\n nextByPrefix ??= { ...parent.byPrefix };\n nextByPrefix[prefix] = v;\n }\n }\n if (nextDefault === parent.default && nextByPrefix === undefined) return parent;\n return {\n default: nextDefault,\n byPrefix: nextByPrefix ?? parent.byPrefix,\n };\n};\n\nconst resolveElementName = (raw: string, stack: NamespaceStack): string => {\n const { prefix, local } = splitPrefixed(raw);\n if (prefix === '') return qname(stack.default, local);\n const ns = stack.byPrefix[prefix];\n if (ns === undefined) {\n throw new OpenXmlSchemaError(`parseXml: undeclared namespace prefix \"${prefix}\" on element <${raw}>`);\n }\n return qname(ns, local);\n};\n\nconst resolveAttrName = (raw: string, stack: NamespaceStack): string => {\n const { prefix, local } = splitPrefixed(raw);\n // Unprefixed attributes do NOT inherit the default namespace (XMLNS spec).\n if (prefix === '') return local;\n if (prefix === 'xml') return qname('http://www.w3.org/XML/1998/namespace', local);\n const ns = stack.byPrefix[prefix];\n if (ns === undefined) {\n throw new OpenXmlSchemaError(`parseXml: undeclared namespace prefix \"${prefix}\" on attribute \"${raw}\"`);\n }\n return qname(ns, local);\n};\n\nconst filterAttrs = (rawAttrs: FxpAttrs | undefined, stack: NamespaceStack): { resolved: Record<string, string> } => {\n const resolved: Record<string, string> = {};\n if (rawAttrs === undefined) return { resolved };\n for (const [k, v] of Object.entries(rawAttrs)) {\n // xmlns / xmlns:* declarations: dropped from the XmlNode attribute table.\n // The serializer rebuilds them from the Clark-notation namespaces it walks,\n // so round-tripping does not require preserving the declarations.\n if (k === 'xmlns' || k.startsWith('xmlns:')) continue;\n resolved[resolveAttrName(k, stack)] = v;\n }\n return { resolved };\n};\n\nconst isWhitespaceOnly = (s: string): boolean => /^\\s*$/.test(s);\n\nconst convertElement = (entry: FxpEntry, parentStack: NamespaceStack): XmlNode => {\n const rawTag = elementTag(entry);\n if (rawTag === undefined) {\n throw new OpenXmlSchemaError('parseXml: encountered an entry with no element tag');\n }\n if (isProcessingInstruction(rawTag)) {\n throw new OpenXmlSchemaError(`parseXml: processing instructions are not supported (saw \"<${rawTag}>\")`);\n }\n\n const rawAttrs = entry[ATTR_KEY] as FxpAttrs | undefined;\n const stack = extendStack(parentStack, rawAttrs);\n\n const { resolved } = filterAttrs(rawAttrs, stack);\n const node = el(resolveElementName(rawTag, stack), resolved);\n\n const childEntries = entry[rawTag] as FxpEntry[] | undefined;\n if (childEntries === undefined || childEntries.length === 0) return node;\n\n const textParts: string[] = [];\n for (const child of childEntries) {\n if (Object.hasOwn(child, TEXT_KEY)) {\n const t = child[TEXT_KEY];\n if (typeof t === 'string') textParts.push(t);\n continue;\n }\n if (textParts.length > 0 && node.children.length === 0) {\n // text accumulated *before* any child element — keep collecting.\n } else if (textParts.length > 0 && node.children.length > 0) {\n const acc = textParts.join('');\n if (!isWhitespaceOnly(acc)) {\n throw new OpenXmlSchemaError(`parseXml: mixed content not supported (text between elements under <${rawTag}>)`);\n }\n // whitespace-only inter-element text: drop.\n textParts.length = 0;\n }\n node.children.push(convertElement(child, stack));\n }\n // Trailing text after the last child element.\n if (textParts.length > 0) {\n const acc = textParts.join('');\n if (node.children.length === 0) {\n // text-only element (the common case): keep as the element's text.\n node.text = acc;\n } else if (!isWhitespaceOnly(acc)) {\n throw new OpenXmlSchemaError(`parseXml: mixed content not supported (trailing text under <${rawTag}>)`);\n }\n }\n return node;\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"save-2moCT3Af.mjs","names":["serializeXmlNode"],"sources":["../src/io/save.ts"],"sourcesContent":["// Public `saveWorkbook` entry point.\n//\n// **Stage 1 minimum**: emits the bare set of parts a Workbook needs to\n// round-trip through `loadWorkbook`:\n//\n// [Content_Types].xml\n// _rels/.rels\n// xl/workbook.xml\n// xl/_rels/workbook.xml.rels\n// xl/worksheets/sheetN.xml ...\n// xl/styles.xml\n// xl/sharedStrings.xml (only when sst is non-empty)\n//\n// docProps / theme / VBA / drawings / charts are reserved for later iterations\n// — load tolerates their absence.\n\nimport { escapeXmlAttr, escapeXmlText } from '../utils/escape';\nimport { chartToBytes } from '../chart/chart-xml';\nimport { chartExToBytes } from '../chart/cx/chartex-xml';\nimport { userShapesToBytes } from '../chart/user-shapes-xml';\nimport { chartsheetToBytes } from '../chartsheet/chartsheet-xml';\nimport type { Drawing, DrawingItem } from '../drawing/drawing';\nimport { drawingToBytes } from '../drawing/drawing-xml';\nimport { IMAGE_FORMAT_EXTENSION, IMAGE_FORMAT_MIME, type XlsxImageFormat } from '../drawing/image';\nimport type { XlsxSink } from '../io/sink';\nimport { OpenXmlIoError, OpenXmlSchemaError } from '../utils/exceptions';\nimport { corePropsToBytes } from '../packaging/core';\nimport { customPropsToBytes } from '../packaging/custom';\nimport { extendedPropsToBytes } from '../packaging/extended';\nimport { addDefault, addOverride, makeManifest, manifestToBytes } from '../packaging/manifest';\nimport { makeRelationships, type Relationships, relsToBytes } from '../packaging/relationships';\nimport { stylesheetToBytes } from '../styles/stylesheet-writer';\nimport { makeSharedStrings, sharedStringsToBytes } from '../workbook/shared-strings';\nimport { type Workbook, validateSheetTitle } from '../workbook/workbook';\nimport type { LegacyComment } from '../worksheet/comments';\nimport { commentsToBytes, placeholderVmlDrawing } from '../worksheet/comments-xml';\nimport type { TableDefinition } from '../worksheet/table';\nimport { tableToBytes } from '../worksheet/table-xml';\nimport { worksheetToBytes } from '../worksheet/writer';\nimport { serializeXml as serializeXmlNode } from '../xml/serializer';\nimport {\n ARC_APP,\n ARC_CONTENT_TYPES,\n ARC_CORE,\n ARC_CUSTOM,\n ARC_ROOT_RELS,\n ARC_SHARED_STRINGS,\n ARC_STYLE,\n ARC_THEME,\n ARC_WORKBOOK,\n ARC_WORKBOOK_RELS,\n CHARTEX_TYPE,\n CPROPS_TYPE,\n parseQName,\n PKG_REL_NS,\n REL_NS,\n SHARED_STRINGS_TYPE,\n SHEET_MAIN_NS,\n STYLES_TYPE,\n THEME_TYPE,\n WORKSHEET_TYPE,\n XLSX_TYPE,\n} from '../xml/namespaces';\nimport { createZipWriter } from '../zip/writer';\n\nconst CORE_PROPS_TYPE = 'application/vnd.openxmlformats-package.core-properties+xml';\nconst EXT_PROPS_TYPE = 'application/vnd.openxmlformats-officedocument.extended-properties+xml';\nconst CORE_PROPS_REL = `${PKG_REL_NS}/metadata/core-properties`;\nconst EXT_PROPS_REL = `${REL_NS}/extended-properties`;\nconst CUSTOM_PROPS_REL = `${REL_NS}/custom-properties`;\nconst THEME_REL = `${REL_NS}/theme`;\nconst TABLE_REL = `${REL_NS}/table`;\nconst TABLE_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml';\nconst COMMENTS_REL = `${REL_NS}/comments`;\nconst VML_DRAWING_REL = `${REL_NS}/vmlDrawing`;\nconst COMMENTS_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml';\nconst VML_DRAWING_TYPE = 'application/vnd.openxmlformats-officedocument.vmlDrawing';\nconst DRAWING_REL = `${REL_NS}/drawing`;\nconst DRAWING_TYPE = 'application/vnd.openxmlformats-officedocument.drawing+xml';\nconst CHART_REL = `${REL_NS}/chart`;\nconst CHARTEX_REL = 'http://schemas.microsoft.com/office/2014/relationships/chartEx';\nconst CHART_TYPE = 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml';\nconst IMAGE_REL = `${REL_NS}/image`;\nconst CHARTSHEET_REL = `${REL_NS}/chartsheet`;\nconst CHARTSHEET_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml';\nconst CHART_USER_SHAPES_REL = `${REL_NS}/chartUserShapes`;\n\nexport interface SaveOptions {\n /** Reserved — passes through to the underlying ZIP writer when implemented. */\n compressionLevel?: number;\n}\n\n/** Convenience: serialise a Workbook to an in-memory `Uint8Array` xlsx.\n *\n * Browser-safe: this path uses an in-memory `Uint8Array` sink and never\n * touches Node's `Buffer` global, so it works unchanged in browser bundles.\n */\nexport async function workbookToBytes(wb: Workbook, opts: SaveOptions = {}): Promise<Uint8Array> {\n const sink = toUint8ArraySink();\n await saveWorkbook(wb, sink, opts);\n return sink.result();\n}\n\nconst toUint8ArraySink = (): XlsxSink & { result(): Uint8Array } => {\n const chunks: Uint8Array[] = [];\n let finalised: Uint8Array | undefined;\n const finalise = (): Uint8Array => {\n if (finalised !== undefined) return finalised;\n let total = 0;\n for (const c of chunks) total += c.byteLength;\n const out = new Uint8Array(total);\n let off = 0;\n for (const c of chunks) {\n out.set(c, off);\n off += c.byteLength;\n }\n finalised = out;\n chunks.length = 0;\n return out;\n };\n return {\n toBytes() {\n return {\n write(chunk: Uint8Array): void {\n if (finalised !== undefined) {\n throw new OpenXmlIoError('workbookToBytes sink: write after finish');\n }\n if (!(chunk instanceof Uint8Array)) {\n throw new OpenXmlIoError('workbookToBytes sink: chunk is not a Uint8Array');\n }\n chunks.push(chunk);\n },\n async finish(): Promise<Uint8Array> {\n return finalise();\n },\n abort(): void {\n if (finalised !== undefined) return;\n finalised = new Uint8Array(0);\n chunks.length = 0;\n },\n };\n },\n result(): Uint8Array {\n return finalise();\n },\n };\n};\n\n/**\n * Validate every sheet title against Excel's character + length rules and\n * confirm titles are unique within the workbook. Catches bad state introduced\n * via direct mutation (`ws.title = ...`) that bypassed the public mutators.\n *\n * Without this gate, a workbook with an invalid sheet name would round-trip to\n * an xlsx Excel rejects with a generic \"file is corrupt\" dialog on open —\n * making it hard to diagnose. Raising at save time keeps the bad state\n * recoverable: callers can `renameSheet` and retry.\n */\nconst validateSheetTitles = (wb: Workbook): void => {\n const seen = new Map<string, number>();\n for (let i = 0; i < wb.sheets.length; i++) {\n const ref = wb.sheets[i];\n if (!ref) continue;\n const title = ref.sheet.title;\n const reason = validateSheetTitle(title);\n if (reason) {\n throw new OpenXmlSchemaError(`saveWorkbook: sheet[${i}] title \"${title}\": ${reason}`);\n }\n const lower = title.toLowerCase();\n const prior = seen.get(lower);\n if (prior !== undefined) {\n throw new OpenXmlSchemaError(\n `saveWorkbook: sheet[${i}] title \"${title}\" collides with sheet[${prior}]` +\n ` (Excel treats sheet names case-insensitively for uniqueness).`,\n );\n }\n seen.set(lower, i);\n }\n};\n\n/** Save a workbook through the given sink. Returns once `finalize()` resolves. */\nexport async function saveWorkbook(wb: Workbook, sink: XlsxSink, _opts: SaveOptions = {}): Promise<void> {\n validateSheetTitles(wb);\n const writer = createZipWriter(sink);\n try {\n await saveWorkbookImpl(wb, writer);\n } catch (err) {\n // Release the sink so streaming destinations (`toFile` / `toWritable`)\n // don't leave a half-written file looking valid. abort() is idempotent so\n // a successful finalize() above is a no-op here.\n writer.abort(err);\n throw err;\n }\n}\n\nasync function saveWorkbookImpl(wb: Workbook, writer: ReturnType<typeof createZipWriter>): Promise<void> {\n // ---- 1. assemble the per-sheet rels + serialise each worksheet ----------\n const sst = makeSharedStrings();\n interface SheetEmit {\n id: string;\n target: string;\n bytes: Uint8Array;\n /** OOXML relationship type used in workbook.xml.rels. */\n relType: string;\n /** ZIP archive path the bytes are written to. */\n archivePath: string;\n /** Override content type for [Content_Types].xml. */\n contentType: string;\n /** Per-sheet rels — populated only if the sheet has hyperlinks / drawings / etc. */\n rels?: Relationships;\n }\n const sheetEmits: SheetEmit[] = [];\n // Workbook-global table counter so xl/tables/tableN.xml ids stay unique.\n const tableEmits: Array<{ id: number; bytes: Uint8Array }> = [];\n let nextTableId = 1;\n // Same counter pattern for comments parts. The comments part and the VML\n // drawing share their N because Excel always emits them paired.\n interface CommentEmit {\n id: number;\n commentsBytes: Uint8Array;\n vmlBytes: Uint8Array;\n }\n const commentEmits: CommentEmit[] = [];\n // Passthrough carries form-control / header-footer VML under the same\n // xl/drawings/vmlDrawingN.vml naming, so start past whatever is already\n // taken — the zip writer rejects duplicate entries.\n let nextCommentsId = nextFreeIndex(wb, /^xl\\/drawings\\/vmlDrawing(\\d+)\\.vml$/);\n // Drawings: workbook-global drawingN counter for xl/drawings/drawingN.xml +\n // matching drawing-rels file (when chart items are present).\n interface DrawingEmit {\n id: number;\n bytes: Uint8Array;\n /** Drawing rels — when non-empty we also emit the rels file. */\n rels?: Relationships;\n }\n const drawingEmits: DrawingEmit[] = [];\n let nextDrawingId = 1;\n // Chart parts share a workbook-global counter so xl/charts/chartN.xml ids\n // stay unique.\n const chartEmits: Array<{\n id: number;\n bytes: Uint8Array;\n isCx: boolean;\n /** Per-chart rels file (only emitted when chart.userShapes is set). */\n rels?: Relationships;\n }> = [];\n let nextChartId = 1;\n // Workbook-global counter for chartDrawing parts. Each chart with userShapes\n // set produces one xl/drawings/chartDrawingN.xml entry.\n const userShapeEmits: Array<{ id: number; bytes: Uint8Array }> = [];\n let nextUserShapesId = 1;\n // Workbook-global counter for image media parts. Excel uses\n // xl/media/imageN.{ext} where N is shared across the package.\n interface ImageEmit {\n id: number;\n /** File extension (without the dot) — also drives the manifest Default. */\n ext: string;\n bytes: Uint8Array;\n }\n const imageEmits: ImageEmit[] = [];\n const imageExts = new Set<string>();\n // Same collision guard as for VML: images referenced by passthrough parts\n // keep their original xl/media/imageN.* names.\n let nextImageId = nextFreeIndex(wb, /^xl\\/media\\/image(\\d+)\\./);\n // Track separate counters so worksheet / chartsheet IDs do not collide (Excel\n // uses xl/worksheets/sheetN.xml and xl/chartsheets/sheetM.xml independently\n // of one another).\n let nextWorksheetId = 1;\n let nextChartsheetId = 1;\n // Pre-claim every original rId so freshly allocated ones (sheets without a\n // captured rId, plus modeled non-sheet rels) avoid collision with captured\n // workbookRelsExtras and the modeled non-sheet original ids.\n const claimedRIds = new Set<string>();\n for (const ref of wb.sheets) {\n if (ref.rId !== undefined) claimedRIds.add(ref.rId);\n }\n if (wb.workbookRelOriginalIds) {\n for (const v of Object.values(wb.workbookRelOriginalIds)) {\n if (typeof v === 'string') claimedRIds.add(v);\n }\n }\n if (wb.workbookRelsExtras) {\n for (const e of wb.workbookRelsExtras) claimedRIds.add(e.id);\n }\n let nextRIdCursor = 1;\n const allocateRId = (): string => {\n let id = `rId${nextRIdCursor}`;\n while (claimedRIds.has(id)) {\n nextRIdCursor++;\n id = `rId${nextRIdCursor}`;\n }\n claimedRIds.add(id);\n nextRIdCursor++;\n return id;\n };\n wb.sheets.forEach((ref, _i) => {\n const isChartsheet = ref.kind === 'chartsheet';\n const target = isChartsheet ? `chartsheets/sheet${nextChartsheetId}.xml` : `worksheets/sheet${nextWorksheetId}.xml`;\n const archivePath = isChartsheet\n ? `xl/chartsheets/sheet${nextChartsheetId}.xml`\n : `xl/worksheets/sheet${nextWorksheetId}.xml`;\n if (isChartsheet) nextChartsheetId++;\n else nextWorksheetId++;\n const sheetRels = makeRelationships();\n // Pre-claim every captured relsExtras rId so freshly allocated modeled rels\n // never clash. The extras themselves are appended to sheetRels at the end\n // so any rId already used inside the worksheet body (drawing / hyperlink\n // refs) keeps pointing at our newly emitted rel.\n const sheetRelsClaimed = new Set<string>();\n const sheetRelsExtras = ref.kind === 'worksheet' ? (ref.sheet.relsExtras ?? []) : [];\n for (const e of sheetRelsExtras) sheetRelsClaimed.add(e.id);\n let sheetRIdCursor = 1;\n const allocateSheetRId = (): string => {\n let id = `rId${sheetRIdCursor}`;\n while (sheetRelsClaimed.has(id) || sheetRels.rels.some((r) => r.id === id)) {\n sheetRIdCursor++;\n id = `rId${sheetRIdCursor}`;\n }\n sheetRIdCursor++;\n return id;\n };\n const registerTable = (table: TableDefinition): { rId: string } => {\n const tableId = nextTableId++;\n const rId = allocateSheetRId();\n sheetRels.rels.push({\n id: rId,\n type: TABLE_REL,\n target: `../tables/table${tableId}.xml`,\n });\n // Emit the table part with its workbook-global id baked in.\n const xmlTable: TableDefinition = { ...table, id: tableId };\n tableEmits.push({ id: tableId, bytes: tableToBytes(xmlTable) });\n return { rId };\n };\n const registerComments = (comments: ReadonlyArray<LegacyComment>): { vmlRelId: string } => {\n const id = nextCommentsId++;\n const commentsRelId = allocateSheetRId();\n sheetRels.rels.push({\n id: commentsRelId,\n type: COMMENTS_REL,\n target: `../comments${id}.xml`,\n });\n const vmlRelId = allocateSheetRId();\n sheetRels.rels.push({\n id: vmlRelId,\n type: VML_DRAWING_REL,\n target: `../drawings/vmlDrawing${id}.vml`,\n });\n commentEmits.push({\n id,\n commentsBytes: commentsToBytes(comments),\n vmlBytes: placeholderVmlDrawing(comments),\n });\n return { vmlRelId };\n };\n const registerDrawing = (drawing: Drawing): { rId: string } => {\n const id = nextDrawingId++;\n const rId = allocateSheetRId();\n sheetRels.rels.push({\n id: rId,\n type: DRAWING_REL,\n target: `../drawings/drawing${id}.xml`,\n });\n // Walk drawing items: for each chart with a payload, allocate a\n // workbook-global chartN id and a per-drawing rId. Emit the chart part +\n // collect a drawing-rels entry so drawing.xml's <c:chart r:id> resolves.\n const drawingRels = makeRelationships();\n // Rels the drawing's verbatim nodes reference keep their original ids —\n // those ids are baked into XML we re-emit untouched — so the allocator\n // below has to step over them.\n const usedDrawingRIds = new Set<string>();\n for (const rel of drawing.rawRels?.rels ?? []) {\n drawingRels.rels.push(rel);\n usedDrawingRIds.add(rel.id);\n }\n let nextDrawingRId = 1;\n const allocateDrawingRId = (): string => {\n let candidate = `rId${nextDrawingRId++}`;\n while (usedDrawingRIds.has(candidate)) candidate = `rId${nextDrawingRId++}`;\n usedDrawingRIds.add(candidate);\n return candidate;\n };\n const itemsForXml: DrawingItem[] = [];\n for (const item of drawing.items) {\n if (item.content.kind === 'chart' && (item.content.chart.space || item.content.chart.cxSpace)) {\n const chartId = nextChartId++;\n const chartRId = allocateDrawingRId();\n // chartex parts use a different relationship Type than the legacy\n // ECMA-376 charts. Excel rejects the workbook when the drawing rels\n // claim a `relationships/chart` target that actually contains a\n // `cx:chartSpace` root.\n const isCxChart = item.content.chart.cxSpace !== undefined;\n drawingRels.rels.push({\n id: chartRId,\n type: isCxChart ? CHARTEX_REL : CHART_REL,\n target: `../charts/chart${chartId}.xml`,\n });\n if (item.content.chart.cxSpace) {\n chartEmits.push({\n id: chartId,\n bytes: chartExToBytes(item.content.chart.cxSpace),\n isCx: true,\n });\n } else if (item.content.chart.space) {\n const space = item.content.chart.space;\n // If the chart carries user shapes, allocate the chartDrawingN part\n // + a per-chart rels file referencing it, then bake the resulting\n // r:id into the chart's <c:userShapes> element.\n let userShapesRId: string | undefined;\n let chartRelsFile: Relationships | undefined;\n if (space.userShapes && space.userShapes.shapes.length > 0) {\n const userShapesId = nextUserShapesId++;\n userShapesRId = 'rId1';\n chartRelsFile = makeRelationships();\n chartRelsFile.rels.push({\n id: userShapesRId,\n type: CHART_USER_SHAPES_REL,\n target: `../drawings/chartDrawing${userShapesId}.xml`,\n });\n userShapeEmits.push({\n id: userShapesId,\n bytes: userShapesToBytes(space.userShapes),\n });\n }\n const chartEmit: typeof chartEmits[number] = {\n id: chartId,\n bytes: chartToBytes(space, userShapesRId !== undefined ? { userShapesRId } : {}),\n isCx: false,\n };\n if (chartRelsFile) chartEmit.rels = chartRelsFile;\n chartEmits.push(chartEmit);\n }\n itemsForXml.push({\n anchor: item.anchor,\n content: {\n kind: 'chart',\n chart: {\n rId: chartRId,\n ...(item.content.chart.cxSpace ? { isCx: true } : {}),\n },\n },\n });\n } else if (item.content.kind === 'picture' && item.content.picture.image) {\n const img = item.content.picture.image;\n const ext = IMAGE_FORMAT_EXTENSION[img.format];\n const imageId = nextImageId++;\n const picRId = allocateDrawingRId();\n drawingRels.rels.push({\n id: picRId,\n type: IMAGE_REL,\n target: `../media/image${imageId}.${ext}`,\n });\n imageEmits.push({ id: imageId, ext, bytes: img.bytes });\n imageExts.add(ext);\n itemsForXml.push({\n anchor: item.anchor,\n content: {\n kind: 'picture',\n picture: {\n rId: picRId,\n ...(item.content.picture.name !== undefined ? { name: item.content.picture.name } : {}),\n ...(item.content.picture.descr !== undefined ? { descr: item.content.picture.descr } : {}),\n ...(item.content.picture.hidden !== undefined ? { hidden: item.content.picture.hidden } : {}),\n ...(item.content.picture.spPr ? { spPr: item.content.picture.spPr } : {}),\n },\n },\n });\n } else {\n itemsForXml.push(item);\n }\n }\n const emit: DrawingEmit = {\n id,\n bytes: drawingToBytes({\n items: itemsForXml,\n ...(drawing.rawChildren ? { rawChildren: drawing.rawChildren } : {}),\n }),\n };\n if (drawingRels.rels.length > 0) emit.rels = drawingRels;\n drawingEmits.push(emit);\n return { rId };\n };\n let bytes: Uint8Array;\n if (ref.kind === 'worksheet') {\n bytes = worksheetToBytes(ref.sheet, {\n sharedStrings: sst,\n date1904: wb.date1904,\n rels: sheetRels,\n registerTable,\n registerComments,\n registerDrawing,\n });\n } else {\n // Chartsheet: register the drawing (if any), then emit the chartsheet\n // part with the resulting r:id baked in.\n let drawingRId: string | undefined;\n if (ref.sheet.drawing) drawingRId = registerDrawing(ref.sheet.drawing).rId;\n bytes = chartsheetToBytes(ref.sheet, drawingRId !== undefined ? { drawingRId } : {});\n }\n // Append captured per-sheet rels passthrough (pivotTable / queryTable /\n // printerSettings / oleObject / customProperty / threadedComment …)\n // verbatim. Their original rIds were pre-claimed so the modeled allocations\n // above never collide with them.\n for (const e of sheetRelsExtras) {\n sheetRels.rels.push({ id: e.id, type: e.type, target: e.target });\n }\n const sheetRId = ref.rId ?? allocateRId();\n const emit: SheetEmit = {\n id: sheetRId,\n target,\n bytes,\n relType: isChartsheet ? CHARTSHEET_REL : `${REL_NS}/worksheet`,\n archivePath,\n contentType: isChartsheet ? CHARTSHEET_TYPE : WORKSHEET_TYPE,\n };\n if (sheetRels.rels.length > 0) emit.rels = sheetRels;\n sheetEmits.push(emit);\n });\n\n // ---- 2. workbook rels -- sheets first, then sst (if any), then styles, then\n // theme / vbaProject, then any captured workbookRelsExtras (e.g.\n // pivotCacheDefinition rels referenced by `<pivotCaches>`). Modeled non-sheet\n // rels prefer the rId captured at load time so any captured extras XML using\n // that Id still resolves after the round-trip.\n const wbRels = makeRelationships();\n wbRels.rels = sheetEmits.map((e) => ({\n id: e.id,\n type: e.relType,\n target: e.target,\n }));\n const orig = wb.workbookRelOriginalIds;\n if (sst.entries.length > 0) {\n wbRels.rels.push({\n id: orig?.sharedStrings ?? allocateRId(),\n type: `${REL_NS}/sharedStrings`,\n target: 'sharedStrings.xml',\n });\n }\n wbRels.rels.push({\n id: orig?.styles ?? allocateRId(),\n type: `${REL_NS}/styles`,\n target: 'styles.xml',\n });\n if (wb.themeXml) {\n wbRels.rels.push({\n id: orig?.theme ?? allocateRId(),\n type: THEME_REL,\n target: 'theme/theme1.xml',\n });\n }\n if (wb.vbaProject) {\n wbRels.rels.push({\n id: orig?.vbaProject ?? allocateRId(),\n type: `${REL_NS}/vbaProject`,\n target: 'vbaProject.bin',\n });\n }\n if (wb.workbookRelsExtras) {\n for (const e of wb.workbookRelsExtras) {\n wbRels.rels.push({ id: e.id, type: e.type, target: e.target });\n }\n }\n\n // ---- 3. workbook.xml ----------------------------------------------------\n const workbookXml = serializeWorkbookXml(\n wb,\n sheetEmits.map((e) => e.id),\n );\n await writer.addEntry(ARC_WORKBOOK, new TextEncoder().encode(workbookXml));\n await writer.addEntry(ARC_WORKBOOK_RELS, relsToBytes(wbRels));\n\n // ---- 4. each worksheet / chartsheet (and its rels file when present) --\n for (const e of sheetEmits) {\n await writer.addEntry(e.archivePath, e.bytes);\n if (e.rels) {\n // The rels file sits alongside its part: `xl/<dir>/_rels/<file>.rels`.\n const slash = e.archivePath.lastIndexOf('/');\n const dir = e.archivePath.slice(0, slash);\n const file = e.archivePath.slice(slash + 1);\n await writer.addEntry(`${dir}/_rels/${file}.rels`, relsToBytes(e.rels));\n }\n }\n\n // ---- 4b. table parts ----------------------------------------------------\n for (const t of tableEmits) {\n await writer.addEntry(`xl/tables/table${t.id}.xml`, t.bytes);\n }\n\n // ---- 4c. comments parts + matching VML drawings ------------------------\n for (const c of commentEmits) {\n await writer.addEntry(`xl/comments${c.id}.xml`, c.commentsBytes);\n await writer.addEntry(`xl/drawings/vmlDrawing${c.id}.vml`, c.vmlBytes);\n }\n\n // ---- 4d. drawings + their rels (when charts are embedded) -------------\n for (const d of drawingEmits) {\n await writer.addEntry(`xl/drawings/drawing${d.id}.xml`, d.bytes);\n if (d.rels) {\n await writer.addEntry(`xl/drawings/_rels/drawing${d.id}.xml.rels`, relsToBytes(d.rels));\n }\n }\n\n // ---- 4e. chart parts (and per-chart rels when user shapes attach) -----\n for (const c of chartEmits) {\n await writer.addEntry(`xl/charts/chart${c.id}.xml`, c.bytes);\n if (c.rels) {\n await writer.addEntry(`xl/charts/_rels/chart${c.id}.xml.rels`, relsToBytes(c.rels));\n }\n }\n\n // ---- 4f. user-shape drawings (xl/drawings/chartDrawingN.xml) ----------\n for (const us of userShapeEmits) {\n await writer.addEntry(`xl/drawings/chartDrawing${us.id}.xml`, us.bytes);\n }\n\n // ---- 4g. embedded images (xl/media/imageN.{ext}) ----------------------\n for (const img of imageEmits) {\n await writer.addEntry(`xl/media/image${img.id}.${img.ext}`, img.bytes);\n }\n\n // ---- 5. styles.xml + sharedStrings.xml (if any) -------------------------\n await writer.addEntry(ARC_STYLE, stylesheetToBytes(wb.styles));\n if (sst.entries.length > 0) {\n await writer.addEntry(ARC_SHARED_STRINGS, sharedStringsToBytes(sst));\n }\n\n // ---- 5b. theme1.xml (passthrough) — only when wb carries one. The theme rel\n // was already added to wbRels above so workbook.xml.rels references it.\n if (wb.themeXml) await writer.addEntry(ARC_THEME, wb.themeXml);\n\n // ---- 5c. docProps/{core,app,custom}.xml (when present) ------------------\n if (wb.properties) await writer.addEntry(ARC_CORE, corePropsToBytes(wb.properties));\n if (wb.appProperties) await writer.addEntry(ARC_APP, extendedPropsToBytes(wb.appProperties));\n if (wb.customProperties) await writer.addEntry(ARC_CUSTOM, customPropsToBytes(wb.customProperties));\n\n // ---- 5d. VBA project + signature (when present) -------------------------\n if (wb.vbaProject) await writer.addEntry('xl/vbaProject.bin', wb.vbaProject);\n if (wb.vbaSignature) await writer.addEntry('xl/vbaProjectSignature.bin', wb.vbaSignature);\n\n // ---- 5e. Pass-through bytes (pivot / activeX / customXml / etc.) -------\n if (wb.passthrough) {\n for (const [path, bytes] of wb.passthrough) await writer.addEntry(path, bytes);\n }\n\n // ---- 6. root rels -------------------------------------------------------\n const rootRels: Relationships = { rels: [] };\n rootRels.rels.push({\n id: 'rId1',\n type: `${REL_NS}/officeDocument`,\n target: 'xl/workbook.xml',\n });\n if (wb.properties) {\n rootRels.rels.push({\n id: `rId${rootRels.rels.length + 1}`,\n type: CORE_PROPS_REL,\n target: 'docProps/core.xml',\n });\n }\n if (wb.appProperties) {\n rootRels.rels.push({\n id: `rId${rootRels.rels.length + 1}`,\n type: EXT_PROPS_REL,\n target: 'docProps/app.xml',\n });\n }\n if (wb.customProperties) {\n rootRels.rels.push({\n id: `rId${rootRels.rels.length + 1}`,\n type: CUSTOM_PROPS_REL,\n target: 'docProps/custom.xml',\n });\n }\n await writer.addEntry(ARC_ROOT_RELS, relsToBytes(rootRels));\n\n // ---- 7. [Content_Types].xml --------------------------------------------\n const manifest = makeManifest();\n addDefault(manifest, 'rels', 'application/vnd.openxmlformats-package.relationships+xml');\n addDefault(manifest, 'xml', 'application/xml');\n // Defaults carried over for passthrough parts go first: addDefault is\n // last-wins, so the writer's own registrations below (vml for comments, bin\n // for VBA, image formats) still take precedence on a shared extension.\n if (wb.passthroughDefaults) {\n for (const [ext, ct] of wb.passthroughDefaults) addDefault(manifest, ext, ct);\n }\n // VBA-bearing workbooks promote the workbook content type to xlsm.\n const workbookContentType = wb.vbaProject\n ? 'application/vnd.ms-excel.sheet.macroEnabled.main+xml'\n : XLSX_TYPE;\n addOverride(manifest, `/${ARC_WORKBOOK}`, workbookContentType);\n for (const e of sheetEmits) {\n addOverride(manifest, `/${e.archivePath}`, e.contentType);\n }\n addOverride(manifest, `/${ARC_STYLE}`, STYLES_TYPE);\n if (sst.entries.length > 0) {\n addOverride(manifest, `/${ARC_SHARED_STRINGS}`, SHARED_STRINGS_TYPE);\n }\n if (wb.themeXml) addOverride(manifest, `/${ARC_THEME}`, THEME_TYPE);\n for (const t of tableEmits) {\n addOverride(manifest, `/xl/tables/table${t.id}.xml`, TABLE_TYPE);\n }\n if (commentEmits.length > 0) {\n addDefault(manifest, 'vml', VML_DRAWING_TYPE);\n }\n for (const c of commentEmits) {\n addOverride(manifest, `/xl/comments${c.id}.xml`, COMMENTS_TYPE);\n }\n for (const d of drawingEmits) {\n addOverride(manifest, `/xl/drawings/drawing${d.id}.xml`, DRAWING_TYPE);\n }\n for (const c of chartEmits) {\n addOverride(manifest, `/xl/charts/chart${c.id}.xml`, c.isCx ? CHARTEX_TYPE : CHART_TYPE);\n }\n for (const us of userShapeEmits) {\n addOverride(manifest, `/xl/drawings/chartDrawing${us.id}.xml`, DRAWING_TYPE);\n }\n if (wb.vbaProject) {\n addDefault(manifest, 'bin', 'application/vnd.ms-office.vbaProject');\n }\n if (wb.passthrough) {\n for (const path of wb.passthrough.keys()) {\n const ct = wb.passthroughContentTypes?.get(path);\n if (ct !== undefined) addOverride(manifest, `/${path}`, ct);\n }\n }\n // Each unique image extension gets a Default entry (`<Default Extension=\"png\"\n // ContentType=\"image/png\"/>`).\n for (const ext of imageExts) {\n const fmt = (Object.entries(IMAGE_FORMAT_EXTENSION).find(([, e]) => e === ext) ?? [])[0] as\n | XlsxImageFormat\n | undefined;\n if (fmt) addDefault(manifest, ext, IMAGE_FORMAT_MIME[fmt]);\n }\n if (wb.properties) addOverride(manifest, `/${ARC_CORE}`, CORE_PROPS_TYPE);\n if (wb.appProperties) addOverride(manifest, `/${ARC_APP}`, EXT_PROPS_TYPE);\n if (wb.customProperties) addOverride(manifest, `/${ARC_CUSTOM}`, CPROPS_TYPE);\n await writer.addEntry(ARC_CONTENT_TYPES, manifestToBytes(manifest));\n\n // ---- 8. close ----------------------------------------------------------\n await writer.finalize();\n}\n\n/**\n * 1 + the highest N among passthrough paths matching `pattern` (whose first\n * capture group is N), so freshly numbered modeled parts never collide with a\n * carried-over one.\n */\nfunction nextFreeIndex(wb: Workbook, pattern: RegExp): number {\n let max = 0;\n if (wb.passthrough) {\n for (const path of wb.passthrough.keys()) {\n const m = pattern.exec(path);\n if (m?.[1] !== undefined) max = Math.max(max, Number.parseInt(m[1], 10));\n }\n }\n return max + 1;\n}\n\n/** Serialise the minimum `<workbook><sheets/></workbook>` Excel needs to load a sheet list. */\nfunction serializeWorkbookXml(wb: Workbook, sheetRIds: ReadonlyArray<string>): string {\n // Excel's markup-compatibility header: the extra prefixes it declares on the\n // root and the `mc:Ignorable` list naming them. Both are re-emitted exactly\n // as written, and the same prefix map is handed to every captured child so\n // `xr:revisionPtr` doesn't come back as `x16:revisionPtr`.\n const rootNs = wb.workbookXmlRoot?.namespaces ?? [];\n const nsDecls = rootNs.map((d) => ` xmlns:${d.prefix}=\"${escapeAttr(d.ns)}\"`).join('');\n const ignorable = wb.workbookXmlRoot?.ignorable;\n const ignorableAttr = ignorable !== undefined ? ` mc:Ignorable=\"${escapeAttr(ignorable)}\"` : '';\n const inScopePrefixes: Record<string, string> = { [SHEET_MAIN_NS]: '', [REL_NS]: 'r' };\n for (const d of rootNs) inScopePrefixes[d.ns] ??= d.prefix;\n const emitExtra = (node: import('../xml/tree').XmlNode): string =>\n serializeChildNode(node, inScopePrefixes);\n\n const parts: string[] = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>',\n `<workbook xmlns=\"${SHEET_MAIN_NS}\" xmlns:r=\"${REL_NS}\"${nsDecls}${ignorableAttr}>`,\n ];\n if (wb.fileVersion) {\n const fv = serializeFileVersion(wb.fileVersion);\n if (fv) parts.push(fv);\n }\n if (wb.fileSharing) {\n const fs = serializeFileSharing(wb.fileSharing);\n if (fs) parts.push(fs);\n }\n // Emit <workbookPr> from the typed model; fall back to a minimal {date1904:\n // true} synthesis so a fresh workbook (no load history) still round-trips\n // through Excel with the right epoch.\n const effectiveWp = effectiveWorkbookProperties(wb);\n if (effectiveWp) {\n const wp = serializeWorkbookProperties(effectiveWp);\n if (wp) parts.push(wp);\n }\n if (wb.workbookProtection) {\n const wp = serializeWorkbookProtection(wb.workbookProtection);\n if (wp) parts.push(wp);\n }\n // The unmodeled head — `mc:AlternateContent`, `xr:revisionPtr` — sits after\n // `<workbookPr>` in what Excel writes, and CT_Workbook has no slot for it,\n // so it goes here rather than ahead of the modeled elements.\n if (wb.workbookXmlExtras?.beforeSheets) {\n for (const node of wb.workbookXmlExtras.beforeSheets) parts.push(emitExtra(node));\n }\n if (wb.bookViews && wb.bookViews.length > 0) parts.push(serializeBookViews(wb.bookViews, inScopePrefixes));\n parts.push('<sheets>');\n wb.sheets.forEach((ref, i) => {\n const stateAttr = ref.state === 'visible' ? '' : ` state=\"${ref.state}\"`;\n const rId = sheetRIds[i] ?? `rId${i + 1}`;\n parts.push(`<sheet name=\"${escapeAttr(ref.sheet.title)}\" sheetId=\"${ref.sheetId}\"${stateAttr} r:id=\"${rId}\"/>`);\n });\n parts.push('</sheets>');\n // ECMA-376 §18.2.27 makes CT_Workbook an xsd:sequence, so the order below is\n // normative: functionGroups, externalReferences, definedNames, calcPr,\n // oleSize, customWorkbookViews, pivotCaches, smartTagPr, smartTagTypes,\n // webPublishing, fileRecoveryPr, webPublishObjects, extLst. Excel rejects a\n // workbook whose children are out of sequence. `afterSheets` is the\n // unmodeled tail (webPublishing / webPublishObjects / extLst /\n // mc:AlternateContent), so it goes last.\n if (wb.functionGroups) {\n const fg = serializeFunctionGroups(wb.functionGroups);\n if (fg) parts.push(fg);\n }\n if (wb.externalReferences && wb.externalReferences.length > 0) {\n const inner: string[] = ['<externalReferences>'];\n for (const er of wb.externalReferences) {\n inner.push(`<externalReference r:id=\"${escapeAttr(er.rId)}\"/>`);\n }\n inner.push('</externalReferences>');\n parts.push(inner.join(''));\n }\n if (wb.definedNames.length > 0) {\n parts.push('<definedNames>');\n for (const dn of wb.definedNames) {\n let attrs = ` name=\"${escapeAttr(dn.name)}\"`;\n if (dn.scope !== undefined) attrs += ` localSheetId=\"${dn.scope}\"`;\n if (dn.hidden) attrs += ' hidden=\"1\"';\n if (dn.comment !== undefined) attrs += ` comment=\"${escapeAttr(dn.comment)}\"`;\n parts.push(`<definedName${attrs}>${escapeText(dn.value)}</definedName>`);\n }\n parts.push('</definedNames>');\n }\n if (wb.calcProperties) {\n const cp = serializeCalcProperties(wb.calcProperties);\n if (cp) parts.push(cp);\n }\n // No default `<calcPr>` — Excel handles its absence by inserting one on save.\n // Hand-rolled `calcId` values (especially the modern 191029) made Excel\n // reject workbooks whose future-function formulas (LET / LAMBDA / FILTER…)\n // couldn't be evaluated against the declared engine.\n if (wb.oleSize !== undefined) {\n parts.push(`<oleSize ref=\"${escapeAttr(wb.oleSize)}\"/>`);\n }\n if (wb.customWorkbookViews && wb.customWorkbookViews.length > 0) {\n parts.push(serializeCustomWorkbookViews(wb.customWorkbookViews));\n }\n if (wb.pivotCaches && wb.pivotCaches.length > 0) {\n const inner: string[] = ['<pivotCaches>'];\n for (const pc of wb.pivotCaches) {\n inner.push(`<pivotCache cacheId=\"${pc.cacheId}\" r:id=\"${escapeAttr(pc.rId)}\"/>`);\n }\n inner.push('</pivotCaches>');\n parts.push(inner.join(''));\n }\n if (wb.smartTagPr) {\n const stp = serializeSmartTagPr(wb.smartTagPr);\n if (stp) parts.push(stp);\n }\n if (wb.smartTagTypes && wb.smartTagTypes.length > 0) {\n parts.push(serializeSmartTagTypes(wb.smartTagTypes));\n }\n if (wb.fileRecoveryPr) {\n const fp = serializeFileRecoveryPr(wb.fileRecoveryPr);\n if (fp) parts.push(fp);\n }\n if (wb.workbookXmlExtras?.afterSheets) {\n for (const node of wb.workbookXmlExtras.afterSheets) parts.push(emitExtra(node));\n }\n parts.push('</workbook>');\n return parts.join('');\n}\n\nfunction serializeCalcProperties(\n cp: import('../workbook/calc-properties').CalcProperties,\n): string | undefined {\n let attrs = '';\n if (cp.calcId !== undefined) attrs += ` calcId=\"${cp.calcId}\"`;\n if (cp.calcMode !== undefined) attrs += ` calcMode=\"${cp.calcMode}\"`;\n if (cp.fullCalcOnLoad !== undefined) attrs += ` fullCalcOnLoad=\"${cp.fullCalcOnLoad ? '1' : '0'}\"`;\n if (cp.refMode !== undefined) attrs += ` refMode=\"${cp.refMode}\"`;\n if (cp.iterate !== undefined) attrs += ` iterate=\"${cp.iterate ? '1' : '0'}\"`;\n if (cp.iterateCount !== undefined) attrs += ` iterateCount=\"${cp.iterateCount}\"`;\n if (cp.iterateDelta !== undefined) attrs += ` iterateDelta=\"${cp.iterateDelta}\"`;\n if (cp.fullPrecision !== undefined) attrs += ` fullPrecision=\"${cp.fullPrecision ? '1' : '0'}\"`;\n if (cp.calcCompleted !== undefined) attrs += ` calcCompleted=\"${cp.calcCompleted ? '1' : '0'}\"`;\n if (cp.calcOnSave !== undefined) attrs += ` calcOnSave=\"${cp.calcOnSave ? '1' : '0'}\"`;\n if (cp.concurrentCalc !== undefined) attrs += ` concurrentCalc=\"${cp.concurrentCalc ? '1' : '0'}\"`;\n if (cp.concurrentManualCount !== undefined) attrs += ` concurrentManualCount=\"${cp.concurrentManualCount}\"`;\n if (cp.forceFullCalc !== undefined) attrs += ` forceFullCalc=\"${cp.forceFullCalc ? '1' : '0'}\"`;\n if (attrs.length === 0) return undefined;\n return `<calcPr${attrs}/>`;\n}\n\nfunction serializeFunctionGroups(\n fg: import('../workbook/function-groups').FunctionGroups,\n): string | undefined {\n let attrs = '';\n if (fg.builtInGroupCount !== undefined) attrs += ` builtInGroupCount=\"${fg.builtInGroupCount}\"`;\n if (fg.groups.length === 0 && attrs.length === 0) return undefined;\n if (fg.groups.length === 0) return `<functionGroups${attrs}/>`;\n const inner: string[] = [`<functionGroups${attrs}>`];\n for (const g of fg.groups) inner.push(`<functionGroup name=\"${escapeAttr(g.name)}\"/>`);\n inner.push('</functionGroups>');\n return inner.join('');\n}\n\nfunction serializeSmartTagPr(\n stp: import('../workbook/smart-tags').SmartTagProperties,\n): string | undefined {\n let attrs = '';\n if (stp.embed !== undefined) attrs += ` embed=\"${stp.embed ? '1' : '0'}\"`;\n if (stp.show !== undefined) attrs += ` show=\"${stp.show}\"`;\n if (attrs.length === 0) return undefined;\n return `<smartTagPr${attrs}/>`;\n}\n\nfunction serializeSmartTagTypes(\n tags: ReadonlyArray<import('../workbook/smart-tags').SmartTagType>,\n): string {\n const inner: string[] = ['<smartTagTypes>'];\n for (const t of tags) {\n let attrs = '';\n if (t.namespaceUri !== undefined) attrs += ` namespaceUri=\"${escapeAttr(t.namespaceUri)}\"`;\n if (t.name !== undefined) attrs += ` name=\"${escapeAttr(t.name)}\"`;\n if (t.url !== undefined) attrs += ` url=\"${escapeAttr(t.url)}\"`;\n inner.push(`<smartTagType${attrs}/>`);\n }\n inner.push('</smartTagTypes>');\n return inner.join('');\n}\n\nfunction serializeFileRecoveryPr(\n fp: import('../workbook/file-recovery').FileRecoveryProperties,\n): string | undefined {\n let attrs = '';\n if (fp.autoRecover !== undefined) attrs += ` autoRecover=\"${fp.autoRecover ? '1' : '0'}\"`;\n if (fp.crashSave !== undefined) attrs += ` crashSave=\"${fp.crashSave ? '1' : '0'}\"`;\n if (fp.dataExtractLoad !== undefined) attrs += ` dataExtractLoad=\"${fp.dataExtractLoad ? '1' : '0'}\"`;\n if (fp.repairLoad !== undefined) attrs += ` repairLoad=\"${fp.repairLoad ? '1' : '0'}\"`;\n if (attrs.length === 0) return undefined;\n return `<fileRecoveryPr${attrs}/>`;\n}\n\nfunction serializeFileSharing(\n fs: import('../workbook/file-sharing').FileSharing,\n): string | undefined {\n let attrs = '';\n if (fs.readOnlyRecommended !== undefined)\n attrs += ` readOnlyRecommended=\"${fs.readOnlyRecommended ? '1' : '0'}\"`;\n if (fs.userName !== undefined) attrs += ` userName=\"${escapeAttr(fs.userName)}\"`;\n if (fs.reservationPassword !== undefined)\n attrs += ` reservationPassword=\"${escapeAttr(fs.reservationPassword)}\"`;\n if (fs.algorithmName !== undefined) attrs += ` algorithmName=\"${escapeAttr(fs.algorithmName)}\"`;\n if (fs.hashValue !== undefined) attrs += ` hashValue=\"${escapeAttr(fs.hashValue)}\"`;\n if (fs.saltValue !== undefined) attrs += ` saltValue=\"${escapeAttr(fs.saltValue)}\"`;\n if (fs.spinCount !== undefined) attrs += ` spinCount=\"${fs.spinCount}\"`;\n if (attrs.length === 0) return undefined;\n return `<fileSharing${attrs}/>`;\n}\n\nfunction serializeFileVersion(\n fv: import('../workbook/file-version').FileVersion,\n): string | undefined {\n let attrs = '';\n if (fv.appName !== undefined) attrs += ` appName=\"${escapeAttr(fv.appName)}\"`;\n if (fv.lastEdited !== undefined) attrs += ` lastEdited=\"${escapeAttr(fv.lastEdited)}\"`;\n if (fv.lowestEdited !== undefined) attrs += ` lowestEdited=\"${escapeAttr(fv.lowestEdited)}\"`;\n if (fv.rupBuild !== undefined) attrs += ` rupBuild=\"${escapeAttr(fv.rupBuild)}\"`;\n if (fv.codeName !== undefined) attrs += ` codeName=\"${escapeAttr(fv.codeName)}\"`;\n if (attrs.length === 0) return undefined;\n return `<fileVersion${attrs}/>`;\n}\n\nfunction effectiveWorkbookProperties(\n wb: Workbook,\n): import('../workbook/workbook-properties').WorkbookProperties | undefined {\n const explicit = wb.workbookProperties;\n if (explicit) {\n // Mirror the canonical date1904 flag if the typed model omits it.\n if (wb.date1904 && explicit.date1904 === undefined) {\n return { ...explicit, date1904: true };\n }\n return explicit;\n }\n if (wb.date1904) return { date1904: true };\n return undefined;\n}\n\nfunction serializeWorkbookProperties(\n wp: import('../workbook/workbook-properties').WorkbookProperties,\n): string | undefined {\n let attrs = '';\n const boolKeys: ReadonlyArray<keyof import('../workbook/workbook-properties').WorkbookProperties> = [\n 'date1904',\n 'dateCompatibility',\n 'showBorderUnselectedTables',\n 'filterPrivacy',\n 'promptedSolutions',\n 'showInkAnnotation',\n 'backupFile',\n 'saveExternalLinkValues',\n 'hidePivotFieldList',\n 'showPivotChartFilter',\n 'allowRefreshQuery',\n 'publishItems',\n 'checkCompatibility',\n 'autoCompressPictures',\n 'refreshAllConnections',\n ];\n for (const k of boolKeys) {\n const v = wp[k];\n if (v !== undefined) attrs += ` ${k}=\"${v ? '1' : '0'}\"`;\n }\n if (wp.showObjects !== undefined) attrs += ` showObjects=\"${wp.showObjects}\"`;\n if (wp.updateLinks !== undefined) attrs += ` updateLinks=\"${wp.updateLinks}\"`;\n if (wp.codeName !== undefined) attrs += ` codeName=\"${escapeAttr(wp.codeName)}\"`;\n if (wp.defaultThemeVersion !== undefined) attrs += ` defaultThemeVersion=\"${wp.defaultThemeVersion}\"`;\n if (attrs.length === 0) return undefined;\n return `<workbookPr${attrs}/>`;\n}\n\nfunction serializeCustomWorkbookViews(\n views: ReadonlyArray<import('../workbook/views').CustomWorkbookView>,\n): string {\n const parts: string[] = ['<customWorkbookViews>'];\n for (const v of views) {\n let attrs = ` name=\"${escapeAttr(v.name)}\" guid=\"${escapeAttr(v.guid)}\"`;\n if (v.autoUpdate !== undefined) attrs += ` autoUpdate=\"${v.autoUpdate ? '1' : '0'}\"`;\n if (v.mergeInterval !== undefined) attrs += ` mergeInterval=\"${v.mergeInterval}\"`;\n if (v.changesSavedWin !== undefined) attrs += ` changesSavedWin=\"${v.changesSavedWin ? '1' : '0'}\"`;\n if (v.onlySync !== undefined) attrs += ` onlySync=\"${v.onlySync ? '1' : '0'}\"`;\n if (v.personalView !== undefined) attrs += ` personalView=\"${v.personalView ? '1' : '0'}\"`;\n if (v.includePrintSettings !== undefined)\n attrs += ` includePrintSettings=\"${v.includePrintSettings ? '1' : '0'}\"`;\n if (v.includeHiddenRowCol !== undefined)\n attrs += ` includeHiddenRowCol=\"${v.includeHiddenRowCol ? '1' : '0'}\"`;\n if (v.maximized !== undefined) attrs += ` maximized=\"${v.maximized ? '1' : '0'}\"`;\n if (v.minimized !== undefined) attrs += ` minimized=\"${v.minimized ? '1' : '0'}\"`;\n if (v.showHorizontalScroll !== undefined)\n attrs += ` showHorizontalScroll=\"${v.showHorizontalScroll ? '1' : '0'}\"`;\n if (v.showVerticalScroll !== undefined)\n attrs += ` showVerticalScroll=\"${v.showVerticalScroll ? '1' : '0'}\"`;\n if (v.showSheetTabs !== undefined) attrs += ` showSheetTabs=\"${v.showSheetTabs ? '1' : '0'}\"`;\n if (v.xWindow !== undefined) attrs += ` xWindow=\"${v.xWindow}\"`;\n if (v.yWindow !== undefined) attrs += ` yWindow=\"${v.yWindow}\"`;\n attrs += ` windowWidth=\"${v.windowWidth}\" windowHeight=\"${v.windowHeight}\"`;\n if (v.tabRatio !== undefined) attrs += ` tabRatio=\"${v.tabRatio}\"`;\n attrs += ` activeSheetId=\"${v.activeSheetId}\"`;\n if (v.showFormulaBar !== undefined) attrs += ` showFormulaBar=\"${v.showFormulaBar ? '1' : '0'}\"`;\n if (v.showStatusbar !== undefined) attrs += ` showStatusbar=\"${v.showStatusbar ? '1' : '0'}\"`;\n if (v.showComments !== undefined) attrs += ` showComments=\"${v.showComments}\"`;\n if (v.showObjects !== undefined) attrs += ` showObjects=\"${v.showObjects}\"`;\n parts.push(`<customWorkbookView${attrs}/>`);\n }\n parts.push('</customWorkbookViews>');\n return parts.join('');\n}\n\nfunction serializeBookViews(\n views: ReadonlyArray<import('../workbook/views').WorkbookView>,\n prefixOf: Readonly<Record<string, string>>,\n): string {\n const parts: string[] = ['<bookViews>'];\n for (const v of views) {\n let attrs = '';\n if (v.visibility !== undefined) attrs += ` visibility=\"${v.visibility}\"`;\n if (v.minimized !== undefined) attrs += ` minimized=\"${v.minimized ? '1' : '0'}\"`;\n if (v.showHorizontalScroll !== undefined)\n attrs += ` showHorizontalScroll=\"${v.showHorizontalScroll ? '1' : '0'}\"`;\n if (v.showVerticalScroll !== undefined)\n attrs += ` showVerticalScroll=\"${v.showVerticalScroll ? '1' : '0'}\"`;\n if (v.showSheetTabs !== undefined) attrs += ` showSheetTabs=\"${v.showSheetTabs ? '1' : '0'}\"`;\n if (v.xWindow !== undefined) attrs += ` xWindow=\"${v.xWindow}\"`;\n if (v.yWindow !== undefined) attrs += ` yWindow=\"${v.yWindow}\"`;\n if (v.windowWidth !== undefined) attrs += ` windowWidth=\"${v.windowWidth}\"`;\n if (v.windowHeight !== undefined) attrs += ` windowHeight=\"${v.windowHeight}\"`;\n if (v.tabRatio !== undefined) attrs += ` tabRatio=\"${v.tabRatio}\"`;\n if (v.firstSheet !== undefined) attrs += ` firstSheet=\"${v.firstSheet}\"`;\n if (v.activeTab !== undefined) attrs += ` activeTab=\"${v.activeTab}\"`;\n if (v.autoFilterDateGrouping !== undefined)\n attrs += ` autoFilterDateGrouping=\"${v.autoFilterDateGrouping ? '1' : '0'}\"`;\n // Namespaced extras (`xr2:uid`) only make sense with a prefix the root\n // declares; without one the attribute would be unreadable, so skip it.\n for (const [clark, value] of Object.entries(v.extAttrs ?? {})) {\n const { ns, local } = parseQName(clark);\n const prefix = prefixOf[ns];\n if (prefix === undefined) continue;\n attrs += ` ${prefix}:${local}=\"${escapeAttr(value)}\"`;\n }\n parts.push(`<workbookView${attrs}/>`);\n }\n parts.push('</bookViews>');\n return parts.join('');\n}\n\nfunction serializeWorkbookProtection(\n wp: import('../workbook/protection').WorkbookProtection,\n): string | undefined {\n let attrs = '';\n const strAttrs = [\n 'workbookPassword',\n 'workbookPasswordCharacterSet',\n 'workbookAlgorithmName',\n 'workbookHashValue',\n 'workbookSaltValue',\n 'revisionsPassword',\n 'revisionsPasswordCharacterSet',\n 'revisionsAlgorithmName',\n 'revisionsHashValue',\n 'revisionsSaltValue',\n ] as const;\n for (const k of strAttrs) {\n const v = wp[k];\n if (v !== undefined) attrs += ` ${k}=\"${escapeAttr(v)}\"`;\n }\n if (wp.workbookSpinCount !== undefined) attrs += ` workbookSpinCount=\"${wp.workbookSpinCount}\"`;\n if (wp.revisionsSpinCount !== undefined) attrs += ` revisionsSpinCount=\"${wp.revisionsSpinCount}\"`;\n if (wp.lockStructure !== undefined) attrs += ` lockStructure=\"${wp.lockStructure ? '1' : '0'}\"`;\n if (wp.lockWindows !== undefined) attrs += ` lockWindows=\"${wp.lockWindows ? '1' : '0'}\"`;\n if (wp.lockRevision !== undefined) attrs += ` lockRevision=\"${wp.lockRevision ? '1' : '0'}\"`;\n if (attrs.length === 0) return undefined;\n return `<workbookProtection${attrs}/>`;\n}\n\n// Local aliases keep the dense call sites below readable. Canonical\n// implementations live in utils/escape.ts so all three writers (this file,\n// xml/serializer, xml/stream-writer) agree on how `>` / whitespace are\n// handled.\nconst escapeText = escapeXmlText;\nconst escapeAttr = escapeXmlAttr;\n\n/**\n * Serialise an XmlNode child of `<workbook>` for inline injection back into the\n * workbook XML stream. Reuses serializeXml then strips the declaration.\n * Captured nodes carry Clark-notation names, so `inScopePrefixes` is what keeps\n * a child on the prefix the root declared for it instead of a freshly\n * allocated one — which matters when `mc:Ignorable` names those prefixes.\n */\nfunction serializeChildNode(\n node: import('../xml/tree').XmlNode,\n inScopePrefixes?: Readonly<Record<string, string>>,\n): string {\n const bytes = serializeXmlNode(node, {\n xmlDeclaration: false,\n ...(inScopePrefixes ? { inScopePrefixes } : {}),\n });\n return new TextDecoder().decode(bytes);\n}\n"],"mappings":"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"}
|