@office-kit/xlsx 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/{cell-style-CN9JXOwm.mjs → cell-style-DuvS_Lsg.mjs} +2 -2
  2. package/dist/cell-style-DuvS_Lsg.mjs.map +1 -0
  3. package/dist/{differential-YEjxNScf.mjs → differential-DvKU8fJt.mjs} +2 -2
  4. package/dist/{differential-YEjxNScf.mjs.map → differential-DvKU8fJt.mjs.map} +1 -1
  5. package/dist/drawing/drawing-xml.d.ts +7 -0
  6. package/dist/drawing/drawing.d.ts +25 -0
  7. package/dist/drawing-BxzLuryn.mjs.map +1 -1
  8. package/dist/io.mjs +2 -2
  9. package/dist/{load-DeAQKGQN.mjs → load-CnPfhGo3.mjs} +93 -26
  10. package/dist/load-CnPfhGo3.mjs.map +1 -0
  11. package/dist/{manifest-CVL1_t0O.mjs → manifest-Cm9K7D62.mjs} +5 -5
  12. package/dist/{manifest-CVL1_t0O.mjs.map → manifest-Cm9K7D62.mjs.map} +1 -1
  13. package/dist/node.mjs +1 -1
  14. package/dist/packaging.mjs +1 -1
  15. package/dist/{parser-nk0Lqmcb.mjs → parser-D3SLaOFe.mjs} +27 -4
  16. package/dist/parser-D3SLaOFe.mjs.map +1 -0
  17. package/dist/{save-OTuS72yI.mjs → save-2moCT3Af.mjs} +68 -34
  18. package/dist/save-2moCT3Af.mjs.map +1 -0
  19. package/dist/schema.mjs +1 -1
  20. package/dist/{serialize-55EnT30e.mjs → serialize-BC2Wu3bR.mjs} +2 -2
  21. package/dist/{serialize-55EnT30e.mjs.map → serialize-BC2Wu3bR.mjs.map} +1 -1
  22. package/dist/{serializer-DQzTTNOS.mjs → serializer-BtO2TrI7.mjs} +21 -9
  23. package/dist/serializer-BtO2TrI7.mjs.map +1 -0
  24. package/dist/streaming.mjs +9 -12
  25. package/dist/streaming.mjs.map +1 -1
  26. package/dist/styles/stylesheet.d.ts +8 -0
  27. package/dist/styles.mjs +3 -3
  28. package/dist/{stylesheet-writer-P1Hxoqzm.mjs → stylesheet-writer-BrOw4jMY.mjs} +133 -51
  29. package/dist/stylesheet-writer-BrOw4jMY.mjs.map +1 -0
  30. package/dist/{table-BifavDVW.mjs → table-1P8we2gS.mjs} +2 -2
  31. package/dist/{table-BifavDVW.mjs.map → table-1P8we2gS.mjs.map} +1 -1
  32. package/dist/{tree-Bbs1C8Rc.mjs → tree-BX-sRRVp.mjs} +3 -1
  33. package/dist/tree-BX-sRRVp.mjs.map +1 -0
  34. package/dist/{utf8-D91g1XTG.mjs → utf8-Tn3nzyik.mjs} +2 -2
  35. package/dist/{utf8-D91g1XTG.mjs.map → utf8-Tn3nzyik.mjs.map} +1 -1
  36. package/dist/workbook/shared-strings.d.ts +15 -5
  37. package/dist/workbook/views.d.ts +7 -0
  38. package/dist/workbook/workbook.d.ts +15 -0
  39. package/dist/{workbook-T1Y3lstQ.mjs → workbook-CARZS94U.mjs} +39 -14
  40. package/dist/workbook-CARZS94U.mjs.map +1 -0
  41. package/dist/workbook.mjs +1 -1
  42. package/dist/workbook.mjs.map +1 -1
  43. package/dist/worksheet/hyperlinks.d.ts +5 -0
  44. package/dist/worksheet/reader.d.ts +7 -2
  45. package/dist/worksheet/worksheet.d.ts +14 -2
  46. package/dist/{worksheet-C6CWgvP5.mjs → worksheet-C5Ensf_j.mjs} +167 -135
  47. package/dist/worksheet-C5Ensf_j.mjs.map +1 -0
  48. package/dist/worksheet.mjs +2 -2
  49. package/dist/xml/parser.d.ts +20 -0
  50. package/dist/xml/serializer.d.ts +8 -0
  51. package/dist/xml.mjs +4 -4
  52. package/package.json +1 -1
  53. package/dist/cell-style-CN9JXOwm.mjs.map +0 -1
  54. package/dist/load-DeAQKGQN.mjs.map +0 -1
  55. package/dist/parser-nk0Lqmcb.mjs.map +0 -1
  56. package/dist/save-OTuS72yI.mjs.map +0 -1
  57. package/dist/serializer-DQzTTNOS.mjs.map +0 -1
  58. package/dist/stylesheet-writer-P1Hxoqzm.mjs.map +0 -1
  59. package/dist/tree-Bbs1C8Rc.mjs.map +0 -1
  60. package/dist/workbook-T1Y3lstQ.mjs.map +0 -1
  61. package/dist/worksheet-C6CWgvP5.mjs.map +0 -1
@@ -1,12 +1,12 @@
1
1
  import { o as OpenXmlSchemaError } from "./exceptions-D-CFwxgm.mjs";
2
2
  import { h as loadImage } from "./drawing-BxzLuryn.mjs";
3
- import { At as parseQName, a as findChildren, c as ARC_CONTENT_TYPES, f as ARC_ROOT_RELS, ft as SHEET_MAIN_NS, g as ARC_WORKBOOK, h as ARC_THEME, i as findChild, jt as qname, l as ARC_CORE, lt as REL_NS, m as ARC_STYLE, p as ARC_SHARED_STRINGS, s as ARC_APP, u as ARC_CUSTOM } from "./tree-Bbs1C8Rc.mjs";
4
- import { C as isChartExBytes, D as parseChartXml, E as findUserShapesRId, a as parseCommentsXml, b as parseUserShapesXml, c as NumberFormatSchema, d as BorderSchema, f as AlignmentSchema, g as parseChartsheetXml, l as FontSchema, m as parseDrawingXml, n as parseTableXml, s as ProtectionSchema, u as fillFromTree, w as parseChartExXml, y as parseWorksheetXml } from "./stylesheet-writer-P1Hxoqzm.mjs";
5
- import { t as parseXml } from "./parser-nk0Lqmcb.mjs";
6
- import { t as fromTree } from "./serialize-55EnT30e.mjs";
7
- import { B as corePropsFromBytes, Q as findById, _ as customPropsFromBytes, c as extendedPropsFromBytes, et as indexRelsById, nt as relsFromBytes, o as manifestFromBytes } from "./manifest-CVL1_t0O.mjs";
8
- import { D as parseSharedStringsXml, r as createWorkbook } from "./workbook-T1Y3lstQ.mjs";
9
- import { Zt as stableStringify, ft as makeStylesheet } from "./cell-style-CN9JXOwm.mjs";
3
+ import { At as parseQName, a as findChildren, c as ARC_CONTENT_TYPES, f as ARC_ROOT_RELS, ft as SHEET_MAIN_NS, g as ARC_WORKBOOK, h as ARC_THEME, i as findChild, jt as qname, l as ARC_CORE, lt as REL_NS, m as ARC_STYLE, p as ARC_SHARED_STRINGS, q as MARKUP_COMPAT_NS, s as ARC_APP, u as ARC_CUSTOM } from "./tree-BX-sRRVp.mjs";
4
+ import { D as findUserShapesRId, O as parseChartXml, T as parseChartExXml, _ as parseChartsheetXml, a as parseCommentsXml, b as parseWorksheetXml, c as NumberFormatSchema, d as BorderSchema, f as AlignmentSchema, h as parseDrawingXml, l as FontSchema, n as parseTableXml, p as collectRawRelIds, s as ProtectionSchema, u as fillFromTree, w as isChartExBytes, x as parseUserShapesXml } from "./stylesheet-writer-BrOw4jMY.mjs";
5
+ import { n as parseXmlDocument, t as parseXml } from "./parser-D3SLaOFe.mjs";
6
+ import { t as fromTree } from "./serialize-BC2Wu3bR.mjs";
7
+ import { B as corePropsFromBytes, Q as findById, _ as customPropsFromBytes, c as extendedPropsFromBytes, et as indexRelsById, nt as relsFromBytes, o as manifestFromBytes, tt as makeRelationships } from "./manifest-Cm9K7D62.mjs";
8
+ import { Zt as stableStringify, ft as makeStylesheet } from "./cell-style-DuvS_Lsg.mjs";
9
+ import { k as parseSharedStringsXml, r as createWorkbook } from "./workbook-CARZS94U.mjs";
10
10
  import { a as makeDefinedName } from "./defined-names-CviWmtQg.mjs";
11
11
  import { t as openZip } from "./reader-BNaUTVCy.mjs";
12
12
  //#region src/styles/stylesheet-reader.ts
@@ -23,6 +23,16 @@ const CELLSTYLE_TAG = qname(SHEET_MAIN_NS, "cellStyle");
23
23
  const DXFS_TAG = qname(SHEET_MAIN_NS, "dxfs");
24
24
  const DXF_TAG = qname(SHEET_MAIN_NS, "dxf");
25
25
  const XF_TAG = qname(SHEET_MAIN_NS, "xf");
26
+ const MODELED_SECTION_TAGS = /* @__PURE__ */ new Set([
27
+ NUMFMTS_TAG,
28
+ FONTS_TAG,
29
+ FILLS_TAG,
30
+ BORDERS_TAG,
31
+ CELLSTYLEXFS_TAG,
32
+ CELLXFS_TAG,
33
+ CELLSTYLES_TAG,
34
+ DXFS_TAG
35
+ ]);
26
36
  const FONT_TAG = qname(SHEET_MAIN_NS, "font");
27
37
  const FILL_TAG = qname(SHEET_MAIN_NS, "fill");
28
38
  const BORDER_TAG = qname(SHEET_MAIN_NS, "border");
@@ -98,6 +108,8 @@ function parseStylesheetXml(bytes) {
98
108
  w._dxfIdByKey = new Map(dxfs.map((d, i) => [stableStringify(d), i]));
99
109
  }
100
110
  }
111
+ const tail = root.children.filter((child) => !MODELED_SECTION_TAGS.has(child.name));
112
+ if (tail.length > 0) ss.stylesXmlTail = tail;
101
113
  rebuildIndexes(ss);
102
114
  return ss;
103
115
  }
@@ -327,7 +339,8 @@ function loadWorkbookFromArchive(archive) {
327
339
  if (workbookPath !== ARC_WORKBOOK) {
328
340
  if (!archive.has(workbookPath)) throw new OpenXmlSchemaError(`loadWorkbook: workbook part "${workbookPath}" not found in archive`);
329
341
  }
330
- const wbRoot = parseXml(archive.read(workbookPath));
342
+ const wbDoc = parseXmlDocument(archive.read(workbookPath));
343
+ const wbRoot = wbDoc.root;
331
344
  if (parseQName(wbRoot.name).local !== "workbook") throw new OpenXmlSchemaError(`loadWorkbook: ${workbookPath} root is "${wbRoot.name}", expected workbook`);
332
345
  const sheetEntries = parseSheetEntries(wbRoot);
333
346
  const definedNamesFromXml = parseDefinedNames(wbRoot);
@@ -343,7 +356,7 @@ function loadWorkbookFromArchive(archive) {
343
356
  if (archive.has(sstPath)) sharedStrings = parseSharedStringsXml(archive.read(sstPath));
344
357
  }
345
358
  }
346
- const sst = (sharedStrings?.entries ?? []).map((e) => typeof e === "string" ? e : e.runs.map((r) => r.text).join(""));
359
+ const sst = sharedStrings?.entries ?? [];
347
360
  let styles;
348
361
  if (archive.has(ARC_STYLE)) styles = parseStylesheetXml(archive.read(ARC_STYLE));
349
362
  else {
@@ -373,6 +386,7 @@ function loadWorkbookFromArchive(archive) {
373
386
  if (definedNamesFromXml.length > 0) wb.definedNames = definedNamesFromXml;
374
387
  const seenTitles = /* @__PURE__ */ new Set();
375
388
  const passthroughRoots = [];
389
+ const vml = makeVmlPartCache(archive);
376
390
  for (const entry of sheetEntries) {
377
391
  if (seenTitles.has(entry.name)) throw new OpenXmlSchemaError(`loadWorkbook: duplicate sheet name "${entry.name}"`);
378
392
  seenTitles.add(entry.name);
@@ -443,6 +457,17 @@ function loadWorkbookFromArchive(archive) {
443
457
  item.content.picture.image = loadImage(archive.read(imgPath));
444
458
  } catch {}
445
459
  }
460
+ const rawRelIds = collectRawRelIds(drawing);
461
+ if (rawRelIds.size > 0) {
462
+ const carried = makeRelationships();
463
+ for (const id of rawRelIds) {
464
+ const rawRel = dRelsById.get(id);
465
+ if (!rawRel) continue;
466
+ carried.rels.push(rawRel);
467
+ if (rawRel.targetMode !== "External") passthroughRoots.push(resolveRelTarget(dPath, rawRel.target));
468
+ }
469
+ if (carried.rels.length > 0) drawing.rawRels = carried;
470
+ }
446
471
  }
447
472
  return drawing;
448
473
  } : void 0;
@@ -473,12 +498,13 @@ function loadWorkbookFromArchive(archive) {
473
498
  ...loadDrawing ? { loadDrawing } : {}
474
499
  });
475
500
  if (sheetRels) {
476
- const extras = captureSheetRelsExtras(sheetRels, ws);
501
+ const extras = captureSheetRelsExtras(sheetRels, sheetPath, vml);
477
502
  if (extras.length > 0) {
478
503
  ws.relsExtras = extras;
479
504
  for (const e of extras) if (e.targetMode !== "External") passthroughRoots.push(resolveRelTarget(sheetPath, e.target));
480
505
  }
481
506
  }
507
+ if (ws.legacyDrawingRId !== void 0 && !ws.relsExtras?.some((e) => e.id === ws.legacyDrawingRId)) delete ws.legacyDrawingRId;
482
508
  const ref = {
483
509
  kind: "worksheet",
484
510
  sheet: ws,
@@ -489,17 +515,18 @@ function loadWorkbookFromArchive(archive) {
489
515
  wb.sheets.push(ref);
490
516
  }
491
517
  captureWorkbookXmlExtras(wbRoot, wb);
518
+ captureWorkbookXmlRoot(wbDoc, wb);
492
519
  captureWorkbookRelsExtras(wbRels, wb);
493
- capturePassthrough(archive, manifest, wb, passthroughRoots);
520
+ capturePassthrough(archive, manifest, wb, passthroughRoots, vml);
494
521
  return wb;
495
522
  }
496
523
  const SHEET_MODELED_REL_TYPES = /* @__PURE__ */ new Set([
497
524
  `${REL_NS}/hyperlink`,
498
525
  `${REL_NS}/table`,
499
526
  `${REL_NS}/comments`,
500
- `${REL_NS}/vmlDrawing`,
501
527
  `${REL_NS}/drawing`
502
528
  ]);
529
+ const VML_DRAWING_REL = `${REL_NS}/vmlDrawing`;
503
530
  /**
504
531
  * Capture per-sheet rels entries that don't match a modeled type. The writer
505
532
  * re-emits these verbatim alongside the freshly allocated modeled rels so
@@ -507,14 +534,16 @@ const SHEET_MODELED_REL_TYPES = /* @__PURE__ */ new Set([
507
534
  * printerSettings / oleObject / customProperty / threadedComment) remain
508
535
  * reachable from the worksheet after a round-trip.
509
536
  *
510
- * `vmlDrawing` is a modeled type only for the comments VML (regenerated from
511
- * `ws.legacyComments`). The header/footer VML behind `<legacyDrawingHF>` is
512
- * re-emitted by its original r:id, so that one rel rides along as an extra.
537
+ * `vmlDrawing` rels are split by part content rather than by type: only the
538
+ * comments VML is regenerated (from `ws.legacyComments`), so its rel is
539
+ * dropped; header/footer and form-control VML is re-emitted by its original
540
+ * r:id and rides along as an extra.
513
541
  */
514
- function captureSheetRelsExtras(sheetRels, ws) {
542
+ function captureSheetRelsExtras(sheetRels, sheetPath, vml) {
515
543
  const extras = [];
516
544
  for (const rel of sheetRels.rels) {
517
- if (SHEET_MODELED_REL_TYPES.has(rel.type) && rel.id !== ws.legacyDrawingHFRId) continue;
545
+ if (SHEET_MODELED_REL_TYPES.has(rel.type)) continue;
546
+ if (rel.type === VML_DRAWING_REL && vml.isCommentVml(resolveRelTarget(sheetPath, rel.target))) continue;
518
547
  extras.push(rel);
519
548
  }
520
549
  return extras;
@@ -526,6 +555,22 @@ function captureSheetRelsExtras(sheetRels, ws) {
526
555
  * things like `<fileVersion>`, `<workbookPr>`, `<bookViews>`, `<calcPr>`,
527
556
  * `<pivotCaches>`, `<extLst>` round-trip in document order.
528
557
  */
558
+ /**
559
+ * Keep the `<workbook>` root's namespace declarations and `mc:Ignorable`. Excel
560
+ * writes `mc:Ignorable="x15 xr xr6 xr10 xr2"` naming prefixes declared only
561
+ * there; dropping either half — or renaming the prefixes — makes Excel report
562
+ * the file as corrupt. The default namespace and `r` are re-emitted by the
563
+ * writer itself, so they are not carried here.
564
+ */
565
+ function captureWorkbookXmlRoot(doc, wb) {
566
+ const namespaces = doc.rootNamespaces.filter((d) => d.prefix !== "" && d.prefix !== "r");
567
+ const ignorable = doc.root.attrs[`{${MARKUP_COMPAT_NS}}Ignorable`];
568
+ if (namespaces.length === 0 && ignorable === void 0) return;
569
+ wb.workbookXmlRoot = {
570
+ namespaces,
571
+ ...ignorable !== void 0 ? { ignorable } : {}
572
+ };
573
+ }
529
574
  function captureWorkbookXmlExtras(wbRoot, wb) {
530
575
  const beforeSheets = [];
531
576
  const afterSheets = [];
@@ -894,6 +939,9 @@ const parseWorkbookView = (node) => {
894
939
  if (fs !== void 0) out.firstSheet = fs;
895
940
  const at = intAttr("activeTab");
896
941
  if (at !== void 0) out.activeTab = at;
942
+ const extAttrs = {};
943
+ for (const [k, v] of Object.entries(a)) if (k.startsWith("{")) extAttrs[k] = v;
944
+ if (Object.keys(extAttrs).length > 0) out.extAttrs = extAttrs;
897
945
  const adg = flag(a["autoFilterDateGrouping"]);
898
946
  if (adg !== void 0) out.autoFilterDateGrouping = adg;
899
947
  return out;
@@ -1009,6 +1057,25 @@ const LATIN1_DECODER = new TextDecoder("latin1");
1009
1057
  const isVmlDrawing = (path) => path.startsWith("xl/drawings/") && path.endsWith(".vml");
1010
1058
  const containsCommentMarker = (bytes) => LATIN1_DECODER.decode(bytes).includes(COMMENT_VML_MARKER);
1011
1059
  /**
1060
+ * Both the per-sheet rels capture and the passthrough sweep need to classify
1061
+ * VML parts; share one inflate per part between them.
1062
+ */
1063
+ const makeVmlPartCache = (archive) => {
1064
+ const bytesByPath = /* @__PURE__ */ new Map();
1065
+ const read = (path) => {
1066
+ let bytes = bytesByPath.get(path);
1067
+ if (bytes === void 0) {
1068
+ bytes = archive.read(path);
1069
+ bytesByPath.set(path, bytes);
1070
+ }
1071
+ return bytes;
1072
+ };
1073
+ return {
1074
+ read,
1075
+ isCommentVml: (path) => archive.has(path) && containsCommentMarker(read(path))
1076
+ };
1077
+ };
1078
+ /**
1012
1079
  * Top-level xl/*.xml files that aren't modeled but Excel relies on (or
1013
1080
  * harmlessly preserves). Captured by exact path; their content types come
1014
1081
  * through the manifest Override map.
@@ -1032,10 +1099,10 @@ const PASSTHROUGH_EXACT_PATHS = /* @__PURE__ */ new Set([
1032
1099
  "docProps/thumbnail.wmf",
1033
1100
  "docProps/thumbnail.emf"
1034
1101
  ]);
1035
- const isPassthroughPath = (path, bytes) => {
1102
+ const isPassthroughPath = (path, vml) => {
1036
1103
  if (PASSTHROUGH_EXACT_PATHS.has(path)) return true;
1037
1104
  if (PASSTHROUGH_PREFIXES.some((p) => path.startsWith(p))) return true;
1038
- if (isVmlDrawing(path) && bytes) return !containsCommentMarker(bytes);
1105
+ if (isVmlDrawing(path)) return !vml.isCommentVml(path);
1039
1106
  return false;
1040
1107
  };
1041
1108
  /**
@@ -1050,7 +1117,7 @@ const isPassthroughPath = (path, bytes) => {
1050
1117
  * `xl/media/imageN.jpeg`) attached. Passthrough VML parts get the same
1051
1118
  * treatment because form-control VML references images the same way.
1052
1119
  */
1053
- function capturePassthrough(archive, manifest, wb, roots) {
1120
+ function capturePassthrough(archive, manifest, wb, roots, vml) {
1054
1121
  const overrides = /* @__PURE__ */ new Map();
1055
1122
  for (const o of manifest.overrides) overrides.set(o.partName.replace(/^\//, ""), o.contentType);
1056
1123
  const defaults = /* @__PURE__ */ new Map();
@@ -1081,11 +1148,11 @@ function capturePassthrough(archive, manifest, wb, roots) {
1081
1148
  wb.vbaSignature = archive.read(path);
1082
1149
  continue;
1083
1150
  }
1084
- let cached;
1085
- if (isVmlDrawing(path)) cached = archive.read(path);
1086
- if (!isPassthroughPath(path, cached)) continue;
1087
- capture(path, cached ?? archive.read(path));
1088
- if (cached !== void 0) closureRoots.push(path);
1151
+ if (!isPassthroughPath(path, vml)) continue;
1152
+ if (isVmlDrawing(path)) {
1153
+ capture(path, vml.read(path));
1154
+ closureRoots.push(path);
1155
+ } else capture(path, archive.read(path));
1089
1156
  }
1090
1157
  const visited = /* @__PURE__ */ new Set();
1091
1158
  for (const path of closureRoots) {
@@ -1102,4 +1169,4 @@ function capturePassthrough(archive, manifest, wb, roots) {
1102
1169
  //#endregion
1103
1170
  export { resolveRelTarget as n, parseStylesheetXml as r, loadWorkbook as t };
1104
1171
 
1105
- //# sourceMappingURL=load-DeAQKGQN.mjs.map
1172
+ //# sourceMappingURL=load-CnPfhGo3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-CnPfhGo3.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 / Duration cell serial conversion in worksheet/writer.ts and\n * reader.ts.\n */\nfunction 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,8 +1,8 @@
1
1
  import { o as OpenXmlSchemaError } from "./exceptions-D-CFwxgm.mjs";
2
- import { A as COREPROPS_NS, At as parseQName, F as CUSTPROPS_NS, Ot as XPROPS_NS, R as DCORE_NS, ct as PKG_REL_NS, k as CONTYPES_NS, kt as XSI_NS, n as el, vt as VTYPES_NS, z as DCTERMS_NS } from "./tree-Bbs1C8Rc.mjs";
3
- import { t as parseXml } from "./parser-nk0Lqmcb.mjs";
4
- import { n as toTree, r as defineSchema, t as fromTree } from "./serialize-55EnT30e.mjs";
5
- import { t as serializeXml } from "./serializer-DQzTTNOS.mjs";
2
+ import { A as COREPROPS_NS, At as parseQName, F as CUSTPROPS_NS, Ot as XPROPS_NS, R as DCORE_NS, ct as PKG_REL_NS, k as CONTYPES_NS, kt as XSI_NS, n as el, vt as VTYPES_NS, z as DCTERMS_NS } from "./tree-BX-sRRVp.mjs";
3
+ import { t as parseXml } from "./parser-D3SLaOFe.mjs";
4
+ import { n as toTree, r as defineSchema, t as fromTree } from "./serialize-BC2Wu3bR.mjs";
5
+ import { t as serializeXml } from "./serializer-BtO2TrI7.mjs";
6
6
  //#region src/packaging/relationships.ts
7
7
  const RelationshipSchema = defineSchema({
8
8
  tagname: "Relationship",
@@ -800,4 +800,4 @@ function manifestFromBytes(bytes) {
800
800
  //#endregion
801
801
  export { findByType as $, readBoolValue as A, corePropsFromBytes as B, makeBoolValue as C, makeFiletimeValue as D, makeDoubleValue as E, removeCustomProperty as F, setWorkbookDescription as G, makeCoreProperties as H, setCustomBoolProperty as I, setWorkbookSubject as J, setWorkbookKeywords as K, setCustomDateProperty as L, readFiletimeValue as M, readIntValue as N, makeIntValue as O, readStringValue as P, findById as Q, setCustomNumberProperty as R, makeAsciiStringValue as S, makeDateValue as T, setWorkbookCategory as U, corePropsToBytes as V, setWorkbookCreator as W, appendRel as X, setWorkbookTitle as Y, findAllByType as Z, customPropsFromBytes as _, makeManifest as a, getCustomPropertyValue as b, extendedPropsFromBytes as c, setWorkbookAppVersion as d, indexRelsById as et, setWorkbookApplication as f, appendCustomProperty as g, setWorkbookManager as h, findOverrideByContentType as i, readDoubleValue as j, makeStringValue as k, extendedPropsToBytes as l, setWorkbookHyperlinkBase as m, addOverride as n, relsFromBytes as nt, manifestFromBytes as o, setWorkbookCompany as p, setWorkbookLastModifiedBy as q, findOverride as r, relsToBytes as rt, manifestToBytes as s, addDefault as t, makeRelationships as tt, makeExtendedProperties as u, customPropsToBytes as v, makeCustomProperties as w, listCustomProperties as x, findCustomPropertyByName as y, setCustomStringProperty as z };
802
802
 
803
- //# sourceMappingURL=manifest-CVL1_t0O.mjs.map
803
+ //# sourceMappingURL=manifest-Cm9K7D62.mjs.map