{"version":3,"file":"save-BcpDpE90.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  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  let nextCommentsId = 1;\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  let nextImageId = 1;\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      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 = `rId${drawingRels.rels.length + 1}`;\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 = `rId${drawingRels.rels.length + 1}`;\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 = { id, bytes: drawingToBytes({ items: itemsForXml }) };\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  // 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/** Serialise the minimum `<workbook><sheets/></workbook>` Excel needs to load a sheet list. */\nfunction serializeWorkbookXml(wb: Workbook, sheetRIds: ReadonlyArray<string>): string {\n  const parts: string[] = [\n    '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>',\n    `<workbook xmlns=\"${SHEET_MAIN_NS}\" xmlns:r=\"${REL_NS}\">`,\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  if (wb.workbookXmlExtras?.beforeSheets) {\n    for (const node of wb.workbookXmlExtras.beforeSheets) parts.push(serializeChildNode(node));\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  if (wb.bookViews && wb.bookViews.length > 0) parts.push(serializeBookViews(wb.bookViews));\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  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.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.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.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.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.workbookXmlExtras?.afterSheets) {\n    for (const node of wb.workbookXmlExtras.afterSheets) parts.push(serializeChildNode(node));\n  }\n  if (wb.fileRecoveryPr) {\n    const fp = serializeFileRecoveryPr(wb.fileRecoveryPr);\n    if (fp) parts.push(fp);\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(views: ReadonlyArray<import('../workbook/views').WorkbookView>): 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    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 namespace prefixes get\n * reallocated by serializeXml — Excel tolerates the extra `xmlns=\"…\"`\n * declarations on each captured root.\n */\nfunction serializeChildNode(node: import('../xml/tree').XmlNode): string {\n  const bytes = serializeXmlNode(node, { xmlDeclaration: false });\n  return new TextDecoder().decode(bytes);\n}\n"],"mappings":"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"}