@office-open/xlsx 0.10.2 → 0.10.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/parts/calc-chain.ts","../src/parts/comments.ts","../src/parts/drawing.ts","../src/parts/pivot-table.ts","../src/parts/pivot-cache.ts","../src/parts/dialogsheet.ts","../src/parts/query-table.ts","../src/parts/metadata.ts","../src/parts/connection.ts","../src/parts/xml-mapping.ts","../src/shared/media.ts","../src/util/index.ts","../src/compiler.ts","../src/parts/content-types.ts","../src/parts/media.ts","../src/context.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/parts/comments.ts","../src/parts/drawing.ts","../src/parts/pivot-table.ts","../src/parts/dialogsheet.ts","../src/parts/query-table.ts","../src/parts/metadata.ts","../src/parts/connection.ts","../src/parts/xml-mapping.ts","../src/shared/media.ts","../src/util/index.ts","../src/compiler.ts","../src/parts/content-types.ts","../src/context.ts"],"mappings":";;;;;;;;;;;UAyBiB,kBAAA;EACf,QAAA,EAAU,cAAc;AAAA;AAAA,cAGb,YAAA,EAAc,gBAAgB,CAAC,kBAAA;AAAA,cAsE/B,YAAA,EAAc,gBAAgB,CAAC,kBAAA;;;cC/C/B,YAAA;EAAA;;;;KAKD,UAAA,WAAqB,YAAA,eAA2B,YAAY;AAAA,cAG3D,aAAA;EAAA;;;;KAKD,UAAA,WAAqB,aAAA,eAA4B,aAAa;AAAA,UAEzD,mBAAA;EAEf,GAAA;EAEA,SAAA;EAEA,GAAA;EAEA,SAAA;EAEA,KAAA;EAEA,KAAA;EAEA,WAAA;EAEA,WAAA;EAEA,GAAA;EAEA,UAAA,GAAa,UAAA;EAEb,MAAA,GAAS,UAAU;EAEnB,SAAA;EAEA,SAAA;EAEA,QAAA;EAEA,QAAA;EAEA,cAAA;EAEA,eAAA;AAAA;AAAA,UAGe,mBAAA;EAEf,GAAA;EAEA,SAAA;EAEA,GAAA;EAEA,SAAA;EAEA,GAAA;EAEA,cAAA;EAEA,eAAA;AAAA;AAAA,UAGe,cAAA;EACf,MAAA,GAAS,mBAAA;EACT,MAAA,GAAS,mBAAmB;AAAA;AAAA,cAejB,WAAA,EAAa,gBAAgB,CAAC,cAAA;;;UC/G1B,2BAAA;EACf,OAAA,EAAS,iBAAA;EACT,UAAA,EAAY,eAAe;EAC3B,OAAA;AAAA;AAAA,UAIe,qBAAA;EACf,IAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;EACA,UAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;EACA,iBAAA;EACA,OAAA;EACA,OAAA;EACA,WAAA;EACA,uBAAA;AAAA;AAAA,UAIe,oBAAA;EACf,IAAA;EACA,GAAA;EACA,QAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,QAAA;AAAA;AAAA,UAIe,oBAAA;EACf,GAAA;EACA,IAAA;EACA,GAAA;AAAA;AAAA,UAIe,sBAAA;EACf,MAAA;EACA,KAAA;EACA,SAAA,GAAY,OAAO,CAAC,gBAAA;AAAA;AAAA,UAIL,sBAAA;EACf,KAAA;EACA,MAAA;EACA,MAAA;EACA,SAAA,GAAY,OAAO,CAAC,gBAAA;AAAA;AAAA,UAIL,yBAAA;EACf,OAAA;EACA,4BAAA;EACA,WAAA;EACA,eAAA;EACA,SAAA;EACA,SAAA;EACA,UAAA;EACA,UAAA;EACA,OAAA;EACA,uBAAA;EACA,OAAA;AAAA;AAAA,UAIe,sBAAA;EACf,GAAA;EACA,IAAA;EACA,EAAA;EACA,KAAA;EACA,SAAA;AAAA;AAAA,UAIe,yBAAA;EACf,cAAc;AAAA;AAAA,UAIC,yBAAA;EACf,KAAA;EACA,OAAA;EACA,SAAA,GAAY,OAAO,CAAC,gBAAA;AAAA;AAAA,UAIL,2BAAA;EACf,IAAA;EACA,GAAA;EACA,UAAA;EACA,SAAA;EACA,MAAA;EACA,UAAA;EACA,GAAA;AAAA;AAAA,UAUe,qBAAA;EACf,IAAA;EACA,OAAA;EACA,UAAA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,iBAAA;EACA,YAAA;EACA,SAAA;EACA,cAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,GAAA;EACA,SAAA;EACA,QAAA;EACA,gBAAA;EACA,YAAA;EACA,YAAA;EACA,iBAAA;EACA,gBAAA;EACA,SAAA;EACA,UAAA;EACA,sBAAA;EACA,YAAA;EACA,YAAA;EACA,WAAA;EACA,qBAAA;EACA,QAAA;EACA,gBAAA;EACA,mBAAA;EACA,gBAAA;EACA,SAAA;EACA,aAAA;EACA,SAAA;EACA,aAAA;EACA,oBAAA;EACA,gBAAA;EACA,gBAAA;EACA,sBAAA;EACA,aAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,SAAA;EACA,YAAA;EACA,WAAA;EACA,QAAA;EACA,oBAAA;EACA,oBAAA;EACA,WAAA,GAAc,qBAAA;EACd,UAAA,GAAa,oBAAA;EACb,SAAA;EACA,SAAA;EACA,UAAA,GAAa,oBAAA;EACb,OAAA,GAAU,sBAAA;EACV,YAAA,GAAe,sBAAA;EACf,gBAAA,GAAmB,yBAAA;EACnB,OAAA,GAAU,sBAAA;EACV,mBAAA,GAAsB,yBAAA;EACtB,mBAAA,GAAsB,yBAAA;EACtB,eAAA,GAAkB,yBAAA;EAClB,iBAAA,GAAoB,2BAAA;EACpB,KAAA;AAAA;AAAA,cAKW,cAAA,EAAgB,gBAAA,CAC3B,2BAAA,EACA,YAAA,EACA,qBAAA;;;UC5Me,sBAAA;EACf,IAAA;EACA,KAAA;EACA,GAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;AAAA;AAAA,UAGe,oBAAA;EACf,SAAA;EACA,WAAA;EACA,aAAA;EACA,WAAA;EACA,MAAA;AAAA;AAAA,UAGe,4BAAA;EACf,OAAA;EACA,OAAA;EACA,SAAA;AAAA;AAAA,UAGe,kBAAA;EAEf,IAAA;EAEA,QAAA;EAEA,WAAA,GAAc,sBAAA;EAEd,SAAA,GAAY,oBAAA;EAEZ,eAAA,GAAkB,4BAAA;AAAA;;;UCnCH,6BAAA;EAEf,IAAI;AAAA;AAAA,UAGW,sBAAA;EAEf,EAAA;EAEA,IAAA;EAEA,aAAA;EAEA,GAAA;EAEA,cAAA;EAEA,cAAA;EAEA,gBAAA;EAEA,gBAAA;EAEA,KAAA;EAEA,OAAA;EAEA,SAAA;AAAA;AAAA,UAGe,wBAAA;EAEf,MAAA;EAEA,cAAA;EAEA,kBAAA;EAEA,iBAAA;EAEA,aAAA;EAEA,iBAAA;EAEA,aAAA,GAAgB,6BAAA;EAEhB,gBAAA,GAAmB,sBAAsB;EAEzC,QAAA;EAEA,cAAA;EAEA,oBAAA;EAEA,wBAAA;EAEA,kBAAA;EAEA,mBAAA;AAAA;AAAA,UAGe,iBAAA;EAEf,IAAA;EAEA,YAAA;EAEA,UAAA;EAEA,kBAAA;EAEA,iBAAA;EAEA,aAAA;EAEA,iBAAA;EAEA,UAAA;EAEA,cAAA;EAEA,sBAAA;EAEA,cAAA;EAEA,YAAA;EAEA,gBAAA;EAEA,WAAA;EAEA,YAAA;EAEA,iBAAA,GAAoB,wBAAwB;AAAA;;;UC7F7B,mBAAA;EAEf,IAAA;EAEA,UAAA;EAEA,mBAAA;EAEA,QAAA;EAEA,QAAA;EAEA,IAAA;EAEA,MAAA;EAEA,IAAA;EAEA,KAAA;EAEA,QAAA;EAEA,aAAA;EAEA,WAAA;EAEA,YAAA;EAEA,aAAA;EAEA,mBAAA;EAEA,YAAA;EAEA,cAAA;EAEA,kBAAA;EAEA,KAAA;EAEA,UAAA;EAEA,QAAA;EAEA,WAAA;EAEA,QAAA;EAEA,YAAA;EAEA,aAAA;EAEA,aAAA;EAEA,MAAA;EAEA,MAAA;EAEA,MAAA;EAEA,QAAA;AAAA;AAAA,UAGe,qBAAA;EAEf,KAAK;AAAA;AAAA,UAGU,qBAAA;EAEf,IAAA;EAEA,IAAI;AAAA;AAAA,UAGW,eAAA;EAEf,KAAA,GAAQ,mBAAA;EAER,OAAA,GAAU,qBAAA;EAEV,cAAA,GAAiB,qBAAA;EAEjB,WAAA,GAAc,UAAA;EAEd,kBAAA,GAAqB,oBAAA;EAErB,mBAAA,GAAsB,oBAAA;AAAA;AAAA,UAIP,UAAA;EAEf,CAAA;EAEA,CAAA;EAEA,KAAA,GAAQ,eAAA;EAER,GAAA,GAAM,aAAA;EAEN,UAAA,GAAa,oBAAA;EAEb,GAAA,GAAM,aAAA;AAAA;AAAA,UAGS,eAAA;EAEf,CAAC;AAAA;AAAA,UAGc,aAAA;EAEf,EAAE;AAAA;AAAA,UAGa,oBAAA;EAEf,CAAA;EAEA,EAAE;AAAA;AAAA,UAGa,aAAA;EAEf,CAAA;EAEA,EAAA;EAEA,CAAA;AAAA;AAAA,UAKe,qBAAA;EAEf,CAAA;EAEA,CAAC;AAAA;AAAA,UAGc,oBAAA;EAEf,OAAA,GAAU,qBAAqB;AAAA;;;UC7IhB,yBAAA;EAEf,UAAA;EAEA,OAAA;EAEA,WAAA;EAEA,aAAA;AAAA;AAAA,UAGe,oBAAA;EAEf,GAAA;EAEA,UAAA;EAEA,UAAA;EAEA,UAAA;EAEA,WAAA;EAEA,cAAA;EAEA,QAAA;EAEA,MAAA;EAEA,QAAA;EAEA,QAAA;EAEA,IAAA;EAEA,SAAA;EAEA,IAAA;EAEA,UAAA,GAAa,gBAAgB;AAAA;AAAA,UAGd,qBAAA;EAEf,UAAA,GAAa,gBAAgB;EAE7B,QAAA;EAEA,YAAA;EAEA,UAAA;EAEA,SAAA;EAEA,GAAA;EAEA,KAAA;EAEA,KAAA;EAEA,SAAA;EAEA,MAAA;EAEA,OAAA;EAEA,SAAA;EAEA,aAAA;EAEA,SAAA;EAEA,QAAA;EAEA,QAAA;EAEA,SAAA;AAAA;AAAA,UAGe,gBAAA;EAEf,IAAA;EAEA,QAAQ;AAAA;AAAA,UAGO,gBAAA;EAEf,IAAA;EAEA,OAAA;EAEA,YAAA;EAEA,WAAA;EAEA,YAAA;EAEA,YAAA;EAEA,eAAA;EAEA,MAAA;EAEA,OAAA;EAEA,SAAA;EAEA,aAAA;AAAA;AAAA,UAGe,iBAAA;EAEf,EAAA;EAEA,IAAA;EAEA,IAAA;EAEA,aAAA;EAEA,gBAAA;EAEA,iBAAA;EAEA,QAAA;EAEA,YAAA;EAEA,WAAA;EAEA,WAAA;EAEA,QAAA;EAEA,SAAA;EAEA,GAAA;EAEA,OAAA;EAEA,qBAAA;EAEA,kBAAA;EAEA,cAAA;EAEA,IAAA,GAAO,yBAAA;EAEP,KAAA,GAAQ,oBAAA;EAER,MAAA,GAAS,qBAAA;EAET,UAAA,GAAa,gBAAA;AAAA;;;UCzJE,aAAA;EAEf,EAAA;EAEA,SAAA;EAEA,SAAA;EAEA,cAAA;EAEA,QAAA;EAEA,kBAAA;EAEA,oBAAA;AAAA;AAAA,UAGe,kBAAA;EAEf,eAAA;EAEA,WAAA;EAEA,eAAA;EAEA,YAAA;EAEA,mBAAA;AAAA;AAAA,UAGe,UAAA;EAEf,EAAA;EAEA,IAAA;EAEA,WAAA;EAEA,QAAA;EAEA,gCAAA;EAEA,MAAA;EAEA,mBAAA;EAEA,OAAA;EAEA,WAAA;EAEA,eAAA;EAEA,cAAA;EAEA,oBAAA;EAEA,WAAA,GAAc,kBAAkB;AAAA;AAAA,UAGjB,cAAA;EAEf,mBAAA;EAEA,OAAA,EAAS,aAAA;EAET,IAAA,EAAM,UAAU;AAAA;AAAA,UAGD,oBAAA;EAEf,UAAA;EAEA,KAAA;EAEA,KAAA;EAEA,WAAA;AAAA;AAAA,UAGe,wBAAA;EAEf,EAAA;EAEA,UAAA;EAEA,KAAA,EAAO,oBAAoB;AAAA;AAAA,UAGZ,oBAAA;EAEf,EAAA;EAEA,CAAA;EAEA,YAAA;EAEA,SAAA,EAAW,wBAAwB;AAAA;AAAA,UAGpB,0BAAA;EAEf,KAAA;EAEA,WAAA;EAEA,KAAA;EAEA,YAAA;AAAA;;;UC3Ge,SAAA;EACf,QAAA;EACA,IAAA;EACA,IAAA,EAAM,UAAU;EAChB,KAAA;EACA,MAAA;AAAA;;;iBCXc,cAAA,CAAe,GAAW;AAAA,iBAe1B,kBAAA,CAAmB,IAAU,EAAJ,IAAI;;;iBC+B7B,eAAA,CACd,OAAA,EAAS,eAAA,EACT,SAAA,GAAW,YAAA,IACX,UAAA,YACC,QAAA;;;cCFU,YAAA;EAAA,QACH,cAAA;EAED,YAAA,CAAa,KAAA;EAQb,aAAA,CAAc,KAAA;EAQd,SAAA;EAQA,gBAAA;EAQA,QAAA,CAAS,KAAA;EAQT,mBAAA;EAQA,QAAA,CAAS,KAAA;EAQT,UAAA,CAAW,KAAA;EAQX,WAAA,CAAY,KAAA;EAQZ,aAAA;EASA,YAAA,CAAa,SAAA;EAMb,aAAA,CAAc,KAAA;EAQd,uBAAA,CAAwB,KAAA;EASxB,oBAAA,CAAqB,KAAA;EASrB,QAAA,CAAS,KAAA;EAQT,eAAA,CAAgB,KAAA;EAQhB,YAAA;EAQA,cAAA,CAAe,KAAA;EAQf,kBAAA;EASA,cAAA,CAAe,KAAA;EAQf,QAAA;EAQA,aAAA,CAAc,KAAA;EAQd,WAAA;EAQA,SAAA;AAAA;;;cCvNI,gBAAA,YAA4B,YAAA;EACvC,aAAA,EAAa,aAAA;EACb,MAAA,EAAM,MAAA;EACN,KAAA,EAAK,KAAA,CAAA,SAAA;EACL,MAAA,EAAM,eAAA;EACN,YAAA,EAAY,YAAA;EACZ,YAAA,EAAY,aAAA;EACZ,cAAA,EAAgB,mBAAA;EAIT,eAAA,CAAgB,IAAA,EAAM,gBAAA,EAAkB,MAAA,UAAgB,KAAA;EAMxD,QAAA,CAAS,KAAA,EAAO,UAAA,EAAY,KAAA;EAQ5B,WAAA,CAAY,IAAA,EAAM,UAAA;AAAA;AAAA,cAad,eAAA,YAA2B,WAAA;EAAA,QAO5B,IAAA;EAAA,SALM,aAAA;EAET,YAAA,GAAe,iBAAA;cAGZ,IAAA,EAAM,YAAA,EACd,aAAA;EAKK,mBAAA,CAAoB,GAAA;EAkBpB,mBAAA,CAAoB,MAAA,UAAgB,GAAA;EAmBpC,sBAAA,CACL,MAAA,UACA,YAAA,WACC,KAAA;IAAQ,GAAA;IAAa,MAAA;EAAA;EAkBjB,OAAA,CAAQ,IAAA,WAAe,OAAA;EAIvB,MAAA,CAAO,IAAA,WAAe,UAAA;EAStB,YAAA,CAAa,UAAA,WAAqB,YAAA;AAAA"}
package/dist/index.mjs CHANGED
@@ -1,20 +1,9 @@
1
- import { a as SharedStrings, i as worksheetDesc, n as vmlNotesDesc, o as sharedStringsDesc, r as stringifyWorksheet, t as commentsDesc } from "./comments-CIu-wLTT.mjs";
2
- import { C as stylesDesc, S as Styles, b as chartsheetDesc, c as workbookDesc, d as tableDesc, f as pivotCacheDefDesc, h as PivotFilterType, l as TableType, m as pivotTableDesc, n as XlsxWriteContext, o as buildExternalReferencesXml, p as pivotCacheRecordsDesc, s as buildTablePartsXml, t as XlsxReadContext, u as TotalsRowFunction, v as externalLinkDesc, x as calcChainDesc, y as drawingDesc } from "./context-Btk-2AKp.mjs";
1
+ import { a as SharedStrings, i as worksheetDesc, n as vmlNotesDesc, o as sharedStringsDesc, r as stringifyWorksheet, t as commentsDesc } from "./comments-CQ5dlj-4.mjs";
2
+ import { C as Styles, S as calcChainDesc, b as drawingDesc, c as buildTablePartsXml, d as TotalsRowFunction, f as tableDesc, g as PivotFilterType, h as pivotTableDesc, l as workbookDesc, m as pivotCacheRecordsDesc, n as XlsxWriteContext, o as Media, p as pivotCacheDefDesc, s as buildExternalReferencesXml, t as XlsxReadContext, u as TableType, w as stylesDesc, x as chartsheetDesc, y as externalLinkDesc } from "./context-CJzw_ObT.mjs";
3
3
  import { parseWorkbook, parseXlsx } from "./parse.mjs";
4
4
  import { patchWorkbook } from "./patch.mjs";
5
- import { i as compileWorkbook, n as generateWorkbookStream, r as generateWorkbookSync, t as generateWorkbook } from "./generate-CNllwVqo.mjs";
5
+ import { i as compileWorkbook, n as generateWorkbookStream, r as generateWorkbookSync, t as generateWorkbook } from "./generate-DMo2Vn6W.mjs";
6
6
  import { createThemeXml } from "@office-open/core/theme";
7
- //#region src/shared/media.ts
8
- var Media = class {
9
- map = /* @__PURE__ */ new Map();
10
- addImage(key, data) {
11
- this.map.set(key, data);
12
- }
13
- get array() {
14
- return [...this.map.values()];
15
- }
16
- };
17
- //#endregion
18
7
  //#region src/util/index.ts
19
8
  /**
20
9
  * Convert a 1-based column number to Excel column letter(s).
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/shared/media.ts","../src/util/index.ts"],"sourcesContent":["/**\n * Media collection for XLSX files — stores image binary data.\n *\n * @module\n */\n\nexport interface MediaData {\n fileName: string;\n type: string;\n data: Uint8Array;\n width: number;\n height: number;\n}\n\nexport class Media {\n private map = new Map<string, MediaData>();\n\n public addImage(key: string, data: MediaData): void {\n this.map.set(key, data);\n }\n\n public get array(): MediaData[] {\n return [...this.map.values()];\n }\n}\n","/**\n * Convert a 1-based column number to Excel column letter(s).\n * 1 → \"A\", 26 → \"Z\", 27 → \"AA\", 28 → \"AB\"\n */\nexport function columnToLetter(col: number): string {\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/**\n * Convert a JavaScript Date to an Excel serial number.\n * Excel epoch: January 1, 1900 = 1 (with the 1900 leap year bug).\n */\nexport function dateToSerialNumber(date: Date): number {\n // Excel treats 1900 as a leap year (bug inherited from Lotus 1-2-3).\n // The epoch is effectively December 30, 1899 = 0.\n const epoch = new Date(1899, 11, 30);\n const msPerDay = 86400000;\n const diff = date.getTime() - epoch.getTime();\n return diff / msPerDay;\n}\n"],"mappings":";;;;;;;AAcA,IAAa,QAAb,MAAmB;CACjB,sBAAc,IAAI,IAAuB;CAEzC,SAAgB,KAAa,MAAuB;EAClD,KAAK,IAAI,IAAI,KAAK,IAAI;CACxB;CAEA,IAAW,QAAqB;EAC9B,OAAO,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC;CAC9B;AACF;;;;;;;ACpBA,SAAgB,eAAe,KAAqB;CAClD,IAAI,SAAS;CACb,IAAI,IAAI;CACR,OAAO,IAAI,GAAG;EACZ,MAAM,aAAa,IAAI,KAAK;EAC5B,SAAS,OAAO,aAAa,KAAK,SAAS,IAAI;EAC/C,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE;CAC7B;CACA,OAAO;AACT;;;;;AAMA,SAAgB,mBAAmB,MAAoB;CAGrD,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,EAAE;CAGnC,QADa,KAAK,QAAQ,IAAI,MAAM,QAAQ,KAC9B;AAChB"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/util/index.ts"],"sourcesContent":["/**\n * Convert a 1-based column number to Excel column letter(s).\n * 1 → \"A\", 26 → \"Z\", 27 → \"AA\", 28 → \"AB\"\n */\nexport function columnToLetter(col: number): string {\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/**\n * Convert a JavaScript Date to an Excel serial number.\n * Excel epoch: January 1, 1900 = 1 (with the 1900 leap year bug).\n */\nexport function dateToSerialNumber(date: Date): number {\n // Excel treats 1900 as a leap year (bug inherited from Lotus 1-2-3).\n // The epoch is effectively December 30, 1899 = 0.\n const epoch = new Date(1899, 11, 30);\n const msPerDay = 86400000;\n const diff = date.getTime() - epoch.getTime();\n return diff / msPerDay;\n}\n"],"mappings":";;;;;;;;;;;AAIA,SAAgB,eAAe,KAAqB;CAClD,IAAI,SAAS;CACb,IAAI,IAAI;CACR,OAAO,IAAI,GAAG;EACZ,MAAM,aAAa,IAAI,KAAK;EAC5B,SAAS,OAAO,aAAa,KAAK,SAAS,IAAI;EAC/C,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE;CAC7B;CACA,OAAO;AACT;;;;;AAMA,SAAgB,mBAAmB,MAAoB;CAGrD,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,EAAE;CAGnC,QADa,KAAK,QAAQ,IAAI,MAAM,QAAQ,KAC9B;AAChB"}
package/dist/parse.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as WorkbookOptions } from "./file-ATgsKghI.mjs";
1
+ import { t as WorkbookOptions } from "./file-BanqmJOZ.mjs";
2
2
  import { Element } from "@office-open/xml";
3
3
  import { DataType, ParsedArchive, parseArchive } from "@office-open/core";
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.mts","names":[],"sources":["../src/parse.ts"],"mappings":";;;;;UA6CiB,YAAA;EACf,UAAA;EACA,MAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,UAGe,YAAA;EACf,GAAA,EAAK,aAAA;EAEL,QAAA,GAAW,OAAA;EAEX,UAAA;EAEA,MAAA,GAAS,OAAA;EAET,aAAA,GAAgB,OAAA;EAChB,QAAA,EAAU,YAAA;EAEV,SAAA;EAEA,QAAA;EAEA,WAAA;AAAA;AAAA,iBAwBc,SAAA,CAAU,IAAA,EAAM,QAAA,GAAW,YAAY;AAAA,iBA2FvC,aAAA,CAAc,IAAA,EAAM,QAAA,GAAW,eAAe"}
1
+ {"version":3,"file":"parse.d.mts","names":[],"sources":["../src/parse.ts"],"mappings":";;;;;UAuDiB,YAAA;EACf,UAAA;EACA,MAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,UAGe,YAAA;EACf,GAAA,EAAK,aAAA;EAEL,QAAA,GAAW,OAAA;EAEX,UAAA;EAEA,MAAA,GAAS,OAAA;EAET,aAAA,GAAgB,OAAA;EAChB,QAAA,EAAU,YAAA;EAEV,SAAA;EAEA,QAAA;EAEA,WAAA;AAAA;AAAA,iBAwBc,SAAA,CAAU,IAAA,EAAM,QAAA,GAAW,YAAY;AAAA,iBAsFvC,aAAA,CAAc,IAAA,EAAM,QAAA,GAAW,eAAe"}
package/dist/parse.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { i as worksheetDesc, o as sharedStringsDesc, t as commentsDesc } from "./comments-CIu-wLTT.mjs";
2
- import { C as stylesDesc, a as usersDesc, b as chartsheetDesc, c as workbookDesc, d as tableDesc, f as pivotCacheDefDesc, i as revisionLogDesc, m as pivotTableDesc, p as pivotCacheRecordsDesc, r as revisionHeadersDesc, t as XlsxReadContext, v as externalLinkDesc, x as calcChainDesc, y as drawingDesc } from "./context-Btk-2AKp.mjs";
1
+ import { i as worksheetDesc, o as sharedStringsDesc, t as commentsDesc } from "./comments-CQ5dlj-4.mjs";
2
+ import { S as calcChainDesc, a as usersDesc, b as drawingDesc, f as tableDesc, h as pivotTableDesc, i as revisionLogDesc, l as workbookDesc, m as pivotCacheRecordsDesc, p as pivotCacheDefDesc, r as revisionHeadersDesc, t as XlsxReadContext, w as stylesDesc, x as chartsheetDesc, y as externalLinkDesc } from "./context-CJzw_ObT.mjs";
3
3
  import { attr } from "@office-open/xml";
4
4
  import { appPropertiesDesc, customPropertiesDesc, parseArchive, parseCorePropsElement, toUint8Array } from "@office-open/core";
5
5
  //#region src/parse.ts
@@ -79,10 +79,7 @@ function parseXlsx(data) {
79
79
  function extractStringsFromEntries(parsed) {
80
80
  const strings = [];
81
81
  for (const entry of parsed.entries) if (typeof entry === "string") strings.push(entry);
82
- else {
83
- const runs = entry.runs;
84
- if (runs && runs.length > 0) strings.push(runs.map((r) => r.text).join(""));
85
- }
82
+ else if (entry.runs && entry.runs.length > 0) strings.push(entry.runs.map((r) => r.text).join(""));
86
83
  return strings;
87
84
  }
88
85
  /**
@@ -133,14 +130,12 @@ function parseWorkbook(data) {
133
130
  if (parsedStyles.colors) opts.colors = parsedStyles.colors;
134
131
  if (parsedStyles.customCellStyles) opts.cellStyles = parsedStyles.customCellStyles;
135
132
  if (parsedStyles.styleExtensions) opts.styleExtensions = parsedStyles.styleExtensions;
136
- const tableStylesInfo = parsedStyles.tableStylesInfo;
137
- if (tableStylesInfo?.tableStyles) opts.tableStyles = tableStylesInfo.tableStyles;
133
+ if (parsedStyles.tableStylesInfo?.tableStyles) opts.tableStyles = parsedStyles.tableStylesInfo.tableStyles;
138
134
  }
139
135
  let sheetNames = [];
140
136
  if (xlsx.workbook) {
141
137
  const wbData = workbookDesc.parse(xlsx.workbook, readContext);
142
- const sheets = wbData.sheets;
143
- if (sheets) sheetNames = sheets.map((s) => s.name);
138
+ if (wbData.sheets) sheetNames = wbData.sheets.map((s) => s.name);
144
139
  if (wbData.protection) opts.workbookProtection = wbData.protection;
145
140
  if (wbData.bookView) opts.bookView = wbData.bookView;
146
141
  if (wbData.calcPr) opts.calcPr = wbData.calcPr;
@@ -202,11 +197,10 @@ function parseWorkbook(data) {
202
197
  if (pivotTables.length > 0) wsOpts.pivotTables = pivotTables;
203
198
  }
204
199
  const hyperlinks = wsOpts.hyperlinks;
205
- if (hyperlinks) for (const hl of hyperlinks) {
206
- const target = hl.target;
207
- if (target?.type === "external" && typeof target.url === "string") {
208
- const resolved = readContext.resolveWorksheetRel(wsPath, target.url);
209
- if (resolved) target.url = resolved;
200
+ if (hyperlinks) {
201
+ for (const hl of hyperlinks) if (hl.target.type === "external") {
202
+ const resolved = readContext.resolveWorksheetRel(wsPath, hl.target.url);
203
+ if (resolved) hl.target.url = resolved;
210
204
  }
211
205
  }
212
206
  worksheets.push(wsOpts);
@@ -258,8 +252,7 @@ function parseWorkbook(data) {
258
252
  const elEl = xlsx.doc.get(elPath);
259
253
  if (!elEl) continue;
260
254
  const elData = externalLinkDesc.parse(elEl, readContext);
261
- const elData2 = elData;
262
- if (elData2.externalBook) {
255
+ if (elData.externalBook) {
263
256
  const relsPath = externalLinkRelsPath(elPath);
264
257
  const relsEl = xlsx.doc.get(relsPath);
265
258
  if (relsEl) for (const child of relsEl.elements ?? []) {
@@ -267,7 +260,7 @@ function parseWorkbook(data) {
267
260
  if (!(attr(child, "Type") ?? "").includes("/externalLinkPath")) continue;
268
261
  const target = attr(child, "Target");
269
262
  if (target) {
270
- elData2.externalBook.target = target;
263
+ elData.externalBook.target = target;
271
264
  break;
272
265
  }
273
266
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parse.mjs","names":[],"sources":["../src/parse.ts"],"sourcesContent":["/**\n * XLSX parsing — parse .xlsx files into structured data.\n *\n * @module\n */\nimport {\n appPropertiesDesc,\n customPropertiesDesc,\n parseArchive,\n parseCorePropsElement,\n} from \"@office-open/core\";\nimport type { ParsedArchive } from \"@office-open/core\";\nimport { toUint8Array } from \"@office-open/core\";\nimport type { DataType } from \"@office-open/core\";\nimport type { ReadContext } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { attr } from \"@office-open/xml\";\nimport { calcChainDesc } from \"@parts/calc-chain\";\nimport { chartsheetDesc } from \"@parts/chartsheet\";\nimport type { ChartsheetOptions } from \"@parts/chartsheet\";\nimport { commentsDesc } from \"@parts/comments\";\nimport { drawingDesc } from \"@parts/drawing\";\nimport { externalLinkDesc } from \"@parts/external-link\";\nimport type { SharedWorkbookOptions, WorkbookOptions } from \"@parts/file\";\nimport { pivotCacheDefDesc, pivotCacheRecordsDesc } from \"@parts/pivot-cache\";\nimport { pivotTableDesc } from \"@parts/pivot-table\";\nimport {\n revisionHeadersDesc,\n revisionLogDesc,\n usersDesc,\n type RevisionLogOptions,\n} from \"@parts/revision-log\";\nimport { sharedStringsDesc } from \"@parts/shared-strings\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { tableDesc } from \"@parts/table\";\nimport { workbookDesc } from \"@parts/workbook\";\nimport { worksheetDesc } from \"@parts/worksheet\";\nimport type { WorksheetOptions } from \"@parts/worksheet\";\n\nimport { XlsxReadContext } from \"./context\";\n\nexport { parseArchive };\n\n// ── Low-level parse result ──\n\nexport interface XlsxPartRefs {\n worksheets: string[];\n charts: string[];\n media: string[];\n drawings: string[];\n}\n\nexport interface XlsxDocument {\n doc: ParsedArchive;\n /** xl/workbook.xml root element */\n workbook?: Element;\n /** Worksheet paths (xl/worksheets/sheet{n}.xml) */\n worksheets: string[];\n /** xl/styles.xml root element */\n styles?: Element;\n /** xl/sharedStrings.xml root element */\n sharedStrings?: Element;\n partRefs: XlsxPartRefs;\n /** docProps/core.xml path */\n coreProps?: string;\n /** docProps/app.xml path */\n appProps?: string;\n /** docProps/custom.xml path */\n customProps?: string;\n}\n\nfunction sortByNumber(paths: string[]): string[] {\n return paths.sort((a, b) => {\n const numA = parseInt(a.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n const numB = parseInt(b.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n return numA - numB;\n });\n}\n\n/** Derive the sibling rels path for an external link part.\n * \"xl/externalLinks/externalLink1.xml\" → \"xl/externalLinks/_rels/externalLink1.xml.rels\"\n */\nfunction externalLinkRelsPath(elPath: string): string {\n const idx = elPath.lastIndexOf(\"/\");\n const dir = elPath.substring(0, idx);\n const file = elPath.substring(idx + 1);\n return `${dir}/_rels/${file}.rels`;\n}\n\n/**\n * Parse raw .xlsx data into a low-level XlsxDocument.\n */\nexport function parseXlsx(data: DataType): XlsxDocument {\n const uint8 = toUint8Array(data);\n const doc = parseArchive(uint8);\n\n const workbook = doc.get(\"xl/workbook.xml\");\n const styles = doc.get(\"xl/styles.xml\");\n const sharedStrings = doc.get(\"xl/sharedStrings.xml\");\n\n // Resolve worksheet paths from workbook rels\n const worksheets: string[] = [];\n const charts: string[] = [];\n const drawings: string[] = [];\n const media: string[] = [];\n\n const wbRels = doc.get(\"xl/_rels/workbook.xml.rels\");\n if (wbRels) {\n for (const child of wbRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (!target) continue;\n\n if (type.includes(\"/worksheet\")) {\n worksheets.push(target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`);\n }\n }\n }\n sortByNumber(worksheets);\n\n // Scan for drawings, charts, media\n drawings.push(...doc.keys(\"xl/drawings/\").filter((k) => k.endsWith(\".xml\")));\n charts.push(...doc.keys(\"xl/charts/\").filter((k) => k.endsWith(\".xml\")));\n media.push(...doc.keys(\"xl/media/\"));\n sortByNumber(drawings);\n sortByNumber(charts);\n\n // Root rels → core/app props\n let coreProps: string | undefined;\n let appProps: string | undefined;\n let customProps: string | undefined;\n const rootRels = doc.get(\"_rels/.rels\");\n if (rootRels) {\n for (const child of rootRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (type.includes(\"/core-properties\")) coreProps = target;\n else if (type.includes(\"/extended-properties\")) appProps = target;\n else if (type.includes(\"/custom-properties\")) customProps = target;\n }\n }\n\n return {\n doc,\n workbook,\n worksheets,\n styles,\n sharedStrings,\n partRefs: { worksheets, charts, media, drawings },\n coreProps,\n appProps,\n customProps,\n };\n}\n\n// ── Shared strings helper ──\n\n/** Extract plain string array from sharedStringsDesc.parse() result. */\nfunction extractStringsFromEntries(parsed: {\n entries: (string | Record<string, unknown>)[];\n}): string[] {\n const strings: string[] = [];\n for (const entry of parsed.entries) {\n if (typeof entry === \"string\") {\n strings.push(entry);\n } else {\n // Rich text: concatenate run texts\n const runs = entry.runs as { text: string }[] | undefined;\n if (runs && runs.length > 0) {\n strings.push(runs.map((r) => r.text).join(\"\"));\n }\n }\n }\n return strings;\n}\n\n/**\n * Parse a .xlsx file and convert it into WorkbookOptions.\n *\n * The returned options can be passed to `new Workbook(parsed)`.\n */\nexport function parseWorkbook(data: DataType): WorkbookOptions {\n const xlsx = parseXlsx(data);\n\n const opts: Record<string, unknown> = {};\n\n // Core properties\n if (xlsx.coreProps) {\n const corePropsEl = xlsx.doc.get(xlsx.coreProps);\n if (corePropsEl) {\n const cp = parseCorePropsElement(corePropsEl);\n if (cp.title) opts.title = cp.title;\n if (cp.subject) opts.subject = cp.subject;\n if (cp.creator) opts.creator = cp.creator;\n if (cp.keywords) opts.keywords = cp.keywords;\n if (cp.description) opts.description = cp.description;\n if (cp.lastModifiedBy) opts.lastModifiedBy = cp.lastModifiedBy;\n if (cp.revision !== undefined) opts.revision = cp.revision;\n if (cp.lastPrinted) opts.lastPrinted = cp.lastPrinted;\n if (cp.created) opts.created = cp.created;\n if (cp.modified) opts.modified = cp.modified;\n }\n }\n\n // Extended (app) properties\n if (xlsx.appProps) {\n const appPropsEl = xlsx.doc.get(xlsx.appProps);\n if (appPropsEl) {\n const ap = appPropertiesDesc.parse(appPropsEl, {} as ReadContext);\n if (ap && Object.keys(ap).length > 0) opts.appProperties = ap;\n }\n }\n\n // Custom properties\n if (xlsx.customProps) {\n const customPropsEl = xlsx.doc.get(xlsx.customProps);\n if (customPropsEl) {\n const cp = customPropertiesDesc.parse(customPropsEl, {} as ReadContext);\n if (cp.properties?.length) opts.customProperties = cp.properties;\n }\n }\n\n // Shared strings — use descriptor.parse() for richer data, then extract strings for lookup\n let strings: string[] = [];\n if (xlsx.sharedStrings) {\n const parsed = sharedStringsDesc.parse(xlsx.sharedStrings, {} as never) as {\n entries: (string | Record<string, unknown>)[];\n };\n strings = extractStringsFromEntries(parsed);\n }\n\n // Create read context for descriptor pipeline\n const readContext = new XlsxReadContext(xlsx, strings);\n\n // Parse styles (fonts, fills, borders, cellXfs)\n if (xlsx.styles) {\n const parsedStyles = stylesDesc.parse(xlsx.styles, readContext) as unknown as Record<\n string,\n unknown\n >;\n readContext.parsedStyles = parsedStyles;\n\n // Expose styles sections onto the returned opts for round-trip. compiler.ts\n // re-emits dxfs from options; colors/tableStyles/cellStyles/styleExtensions\n // are surfaced here even though the compiler currently only consumes dxfs,\n // so callers retain the parsed data and the fields stay documented.\n if (parsedStyles.dxfs) opts.dxfs = parsedStyles.dxfs;\n if (parsedStyles.colors) opts.colors = parsedStyles.colors;\n if (parsedStyles.customCellStyles) opts.cellStyles = parsedStyles.customCellStyles;\n if (parsedStyles.styleExtensions) opts.styleExtensions = parsedStyles.styleExtensions;\n const tableStylesInfo = parsedStyles.tableStylesInfo as { tableStyles?: unknown[] } | undefined;\n if (tableStylesInfo?.tableStyles) opts.tableStyles = tableStylesInfo.tableStyles;\n }\n\n // Parse workbook via descriptor for richer data\n let sheetNames: string[] = [];\n if (xlsx.workbook) {\n const wbData = workbookDesc.parse(xlsx.workbook, readContext) as unknown as Record<\n string,\n unknown\n >;\n const sheets = wbData.sheets as\n | { name: string; sheetId: number; rId: string; state?: string }[]\n | undefined;\n if (sheets) sheetNames = sheets.map((s) => s.name);\n\n // Workbook-level properties\n if (wbData.protection) opts.workbookProtection = wbData.protection;\n if (wbData.bookView) opts.bookView = wbData.bookView;\n if (wbData.calcPr) opts.calcPr = wbData.calcPr;\n if (wbData.customViews) opts.customWorkbookViews = wbData.customViews;\n if (wbData.fileRecoveryPr) opts.fileRecoveryPr = wbData.fileRecoveryPr;\n if (wbData.functionGroups) opts.functionGroups = wbData.functionGroups;\n if (wbData.webPublishing) opts.webPublishing = wbData.webPublishing;\n if (wbData.fileSharing) opts.fileSharing = wbData.fileSharing;\n if (wbData.workbookPr) opts.workbookPr = wbData.workbookPr;\n if (wbData.volTypes) opts.volTypes = wbData.volTypes;\n if (wbData.webPublishObjects) opts.webPublishObjects = wbData.webPublishObjects;\n }\n\n // Parse worksheets using descriptor pipeline\n const worksheets: WorksheetOptions[] = [];\n for (let i = 0; i < xlsx.worksheets.length; i++) {\n const wsPath = xlsx.worksheets[i];\n const wsEl = xlsx.doc.get(wsPath);\n if (!wsEl) continue;\n\n const wsOpts = worksheetDesc.parse(wsEl, readContext) as Record<string, unknown>;\n if (sheetNames[i]) wsOpts.name = sheetNames[i];\n\n // ── Resolve sub-parts via worksheet relationships ──\n\n // Comments\n const commentRels = readContext.getWorksheetRelsByType(wsPath, \"/comments\");\n for (const cr of commentRels) {\n const commentEl = xlsx.doc.get(cr.target);\n if (!commentEl) continue;\n const commentData = commentsDesc.parse(commentEl, readContext) as unknown as Record<\n string,\n unknown\n >;\n if (commentData.comments) {\n wsOpts.comments = commentData.comments;\n break; // one comments file per worksheet\n }\n }\n\n // Drawings (images + charts)\n const drawingRels = readContext.getWorksheetRelsByType(wsPath, \"/drawing\");\n for (const dr of drawingRels) {\n const drawingEl = xlsx.doc.get(dr.target);\n if (!drawingEl) continue;\n const drawingData = drawingDesc.parse(drawingEl, readContext);\n if (drawingData.images) wsOpts.images = drawingData.images;\n if (drawingData.charts) wsOpts.charts = drawingData.charts;\n break;\n }\n\n // Tables\n const tableRels = readContext.getWorksheetRelsByType(wsPath, \"/table\");\n if (tableRels.length > 0) {\n const tables: Record<string, unknown>[] = [];\n for (const tr of tableRels) {\n const tableEl = xlsx.doc.get(tr.target);\n if (!tableEl) continue;\n const tableData = tableDesc.parse(tableEl, readContext) as unknown as Record<\n string,\n unknown\n >;\n tables.push(tableData);\n }\n if (tables.length > 0) wsOpts.tables = tables;\n }\n\n // Pivot tables\n const pivotRels = readContext.getWorksheetRelsByType(wsPath, \"/pivotTable\");\n if (pivotRels.length > 0) {\n const pivotTables: Record<string, unknown>[] = [];\n for (const pr of pivotRels) {\n const pivotEl = xlsx.doc.get(pr.target);\n if (!pivotEl) continue;\n const pivotData = pivotTableDesc.parse(pivotEl, readContext) as unknown as Record<\n string,\n unknown\n >;\n pivotTables.push(pivotData);\n }\n if (pivotTables.length > 0) wsOpts.pivotTables = pivotTables;\n }\n\n // Resolve external hyperlink URLs\n const hyperlinks = wsOpts.hyperlinks as Record<string, unknown>[] | undefined;\n if (hyperlinks) {\n for (const hl of hyperlinks) {\n const target = hl.target as Record<string, unknown> | undefined;\n if (target?.type === \"external\" && typeof target.url === \"string\") {\n const resolved = readContext.resolveWorksheetRel(wsPath, target.url);\n if (resolved) target.url = resolved;\n }\n }\n }\n\n worksheets.push(wsOpts as WorksheetOptions);\n }\n\n opts.worksheets = worksheets;\n\n // Chartsheets — parse chartsheet parts\n const chartsheetPaths = xlsx.doc.keys(\"xl/chartsheets/\").filter((k) => k.endsWith(\".xml\"));\n if (chartsheetPaths.length > 0) {\n const chartsheets: ChartsheetOptions[] = [];\n for (let i = 0; i < chartsheetPaths.length; i++) {\n const csEl = xlsx.doc.get(chartsheetPaths[i]);\n if (!csEl) continue;\n const csData = chartsheetDesc.parse(csEl, readContext) as unknown as Record<string, unknown>;\n if (sheetNames[worksheets.length + i]) csData.name = sheetNames[worksheets.length + i];\n chartsheets.push(csData as unknown as ChartsheetOptions);\n }\n if (chartsheets.length > 0) opts.chartsheets = chartsheets;\n }\n\n // Pivot cache definitions and records\n const pivotCacheDefPaths = xlsx.doc\n .keys(\"xl/pivotCache/\")\n .filter((k) => k.includes(\"pivotCacheDefinition\"));\n if (pivotCacheDefPaths.length > 0) {\n const pivotCaches: Record<string, unknown>[] = [];\n for (const pcdPath of pivotCacheDefPaths) {\n const pcdEl = xlsx.doc.get(pcdPath);\n if (!pcdEl) continue;\n const pcdData = pivotCacheDefDesc.parse(pcdEl, readContext) as unknown as Record<\n string,\n unknown\n >;\n pivotCaches.push(pcdData);\n }\n if (pivotCaches.length > 0) opts.pivotCaches = pivotCaches;\n }\n\n const pivotCacheRecPaths = xlsx.doc\n .keys(\"xl/pivotCache/\")\n .filter((k) => k.includes(\"pivotCacheRecords\"));\n if (pivotCacheRecPaths.length > 0) {\n const pivotCacheRecords: Record<string, unknown>[] = [];\n for (const pcrPath of pivotCacheRecPaths) {\n const pcrEl = xlsx.doc.get(pcrPath);\n if (!pcrEl) continue;\n const pcrData = pivotCacheRecordsDesc.parse(pcrEl, readContext) as unknown as Record<\n string,\n unknown\n >;\n pivotCacheRecords.push(pcrData);\n }\n if (pivotCacheRecords.length > 0) opts.pivotCacheRecords = pivotCacheRecords;\n }\n\n // Calculation chain\n const calcChainEl = xlsx.doc.get(\"xl/calcChain.xml\");\n if (calcChainEl) {\n const calcData = calcChainDesc.parse(calcChainEl, readContext) as unknown as Record<\n string,\n unknown\n >;\n if (calcData.cells) opts.calcChain = calcData.cells;\n }\n\n // External links\n const extLinkPaths = xlsx.doc.keys(\"xl/externalLinks/\").filter((k) => k.endsWith(\".xml\"));\n if (extLinkPaths.length > 0) {\n const externalLinks: Record<string, unknown>[] = [];\n for (const elPath of extLinkPaths) {\n const elEl = xlsx.doc.get(elPath);\n if (!elEl) continue;\n const elData = externalLinkDesc.parse(elEl, readContext) as Record<string, unknown>;\n\n // Resolve the external book target from the sibling rels file\n // (xl/externalLinks/_rels/externalLinkN.xml.rels), which compiler.ts writes.\n const elData2 = elData as { externalBook?: { target?: string } };\n if (elData2.externalBook) {\n const relsPath = externalLinkRelsPath(elPath);\n const relsEl = xlsx.doc.get(relsPath);\n if (relsEl) {\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n if (!type.includes(\"/externalLinkPath\")) continue;\n const target = attr(child, \"Target\");\n if (target) {\n elData2.externalBook.target = target;\n break;\n }\n }\n }\n }\n\n externalLinks.push(elData);\n }\n if (externalLinks.length > 0) opts.externalLinks = externalLinks;\n }\n\n // Shared-workbook revisions: workbook.xml.rels → revisionHeaders/users;\n // revisionHeaders.xml.rels → per-header revision logs.\n const wbRelsEl2 = xlsx.doc.get(\"xl/_rels/workbook.xml.rels\");\n let revHeadersTarget: string | undefined;\n let usersTarget: string | undefined;\n if (wbRelsEl2) {\n for (const child of wbRelsEl2.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (type.includes(\"/revisionHeaders\")) revHeadersTarget = target;\n else if (type.includes(\"/users\")) usersTarget = target;\n }\n }\n if (revHeadersTarget) {\n const headersPath = revHeadersTarget.startsWith(\"/\")\n ? revHeadersTarget.slice(1)\n : `xl/${revHeadersTarget}`;\n const headersEl = xlsx.doc.get(headersPath);\n if (headersEl) {\n const headers = revisionHeadersDesc.parse(headersEl, readContext);\n const logs: RevisionLogOptions[] = [];\n const slash = headersPath.lastIndexOf(\"/\");\n const revHeadersRelsEl = xlsx.doc.get(\n `${headersPath.slice(0, slash)}/_rels/${headersPath.slice(slash + 1)}.rels`,\n );\n if (revHeadersRelsEl) {\n for (const child of revHeadersRelsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n if (!(attr(child, \"Type\") ?? \"\").includes(\"/revisionLog\")) continue;\n const t = attr(child, \"Target\");\n if (!t) continue;\n const logEl = xlsx.doc.get(t.startsWith(\"/\") ? t.slice(1) : `xl/${t}`);\n if (logEl) logs.push(revisionLogDesc.parse(logEl, readContext));\n }\n }\n const revisionLog: SharedWorkbookOptions = { headers, logs };\n if (usersTarget) {\n const usersEl = xlsx.doc.get(\n usersTarget.startsWith(\"/\") ? usersTarget.slice(1) : `xl/${usersTarget}`,\n );\n if (usersEl) {\n const users = usersDesc.parse(usersEl, readContext);\n if (users.users) revisionLog.users = users;\n }\n }\n opts.revisionLog = revisionLog;\n }\n }\n\n return opts as WorkbookOptions;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parse.mjs","names":[],"sources":["../src/parse.ts"],"sourcesContent":["/**\n * XLSX parsing — parse .xlsx files into structured data.\n *\n * @module\n */\nimport {\n appPropertiesDesc,\n customPropertiesDesc,\n parseArchive,\n parseCorePropsElement,\n} from \"@office-open/core\";\nimport type { ParsedArchive } from \"@office-open/core\";\nimport { toUint8Array } from \"@office-open/core\";\nimport type { DataType } from \"@office-open/core\";\nimport type { ReadContext } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { attr } from \"@office-open/xml\";\nimport { calcChainDesc } from \"@parts/calc-chain\";\nimport { chartsheetDesc } from \"@parts/chartsheet\";\nimport type { ChartsheetOptions } from \"@parts/chartsheet\";\nimport { commentsDesc } from \"@parts/comments\";\nimport { drawingDesc } from \"@parts/drawing\";\nimport { externalLinkDesc } from \"@parts/external-link\";\nimport type { ExternalLinkOptions } from \"@parts/external-link\";\nimport type { SharedWorkbookOptions, WorkbookOptions } from \"@parts/file\";\nimport { pivotCacheDefDesc, pivotCacheRecordsDesc } from \"@parts/pivot-cache\";\nimport type { PivotCacheDefParseResult, PivotCacheRecordsParseResult } from \"@parts/pivot-cache\";\nimport { pivotTableDesc } from \"@parts/pivot-table\";\nimport type { PivotTableParseResult } from \"@parts/pivot-table\";\nimport type { PivotTableOptions } from \"@parts/pivot/pivot-utils\";\nimport {\n revisionHeadersDesc,\n revisionLogDesc,\n usersDesc,\n type RevisionLogOptions,\n} from \"@parts/revision-log\";\nimport { sharedStringsDesc } from \"@parts/shared-strings\";\nimport type { SharedStringsDocOptions } from \"@parts/shared-strings\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { tableDesc } from \"@parts/table\";\nimport type { TableOptions } from \"@parts/table\";\nimport { workbookDesc } from \"@parts/workbook\";\nimport { worksheetDesc } from \"@parts/worksheet\";\nimport type {\n WorksheetChartOptions,\n WorksheetImageOptions,\n WorksheetOptions,\n} from \"@parts/worksheet\";\n\nimport { XlsxReadContext } from \"./context\";\n\nexport { parseArchive };\n\n// ── Low-level parse result ──\n\nexport interface XlsxPartRefs {\n worksheets: string[];\n charts: string[];\n media: string[];\n drawings: string[];\n}\n\nexport interface XlsxDocument {\n doc: ParsedArchive;\n /** xl/workbook.xml root element */\n workbook?: Element;\n /** Worksheet paths (xl/worksheets/sheet{n}.xml) */\n worksheets: string[];\n /** xl/styles.xml root element */\n styles?: Element;\n /** xl/sharedStrings.xml root element */\n sharedStrings?: Element;\n partRefs: XlsxPartRefs;\n /** docProps/core.xml path */\n coreProps?: string;\n /** docProps/app.xml path */\n appProps?: string;\n /** docProps/custom.xml path */\n customProps?: string;\n}\n\nfunction sortByNumber(paths: string[]): string[] {\n return paths.sort((a, b) => {\n const numA = parseInt(a.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n const numB = parseInt(b.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n return numA - numB;\n });\n}\n\n/** Derive the sibling rels path for an external link part.\n * \"xl/externalLinks/externalLink1.xml\" → \"xl/externalLinks/_rels/externalLink1.xml.rels\"\n */\nfunction externalLinkRelsPath(elPath: string): string {\n const idx = elPath.lastIndexOf(\"/\");\n const dir = elPath.substring(0, idx);\n const file = elPath.substring(idx + 1);\n return `${dir}/_rels/${file}.rels`;\n}\n\n/**\n * Parse raw .xlsx data into a low-level XlsxDocument.\n */\nexport function parseXlsx(data: DataType): XlsxDocument {\n const uint8 = toUint8Array(data);\n const doc = parseArchive(uint8);\n\n const workbook = doc.get(\"xl/workbook.xml\");\n const styles = doc.get(\"xl/styles.xml\");\n const sharedStrings = doc.get(\"xl/sharedStrings.xml\");\n\n // Resolve worksheet paths from workbook rels\n const worksheets: string[] = [];\n const charts: string[] = [];\n const drawings: string[] = [];\n const media: string[] = [];\n\n const wbRels = doc.get(\"xl/_rels/workbook.xml.rels\");\n if (wbRels) {\n for (const child of wbRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (!target) continue;\n\n if (type.includes(\"/worksheet\")) {\n worksheets.push(target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`);\n }\n }\n }\n sortByNumber(worksheets);\n\n // Scan for drawings, charts, media\n drawings.push(...doc.keys(\"xl/drawings/\").filter((k) => k.endsWith(\".xml\")));\n charts.push(...doc.keys(\"xl/charts/\").filter((k) => k.endsWith(\".xml\")));\n media.push(...doc.keys(\"xl/media/\"));\n sortByNumber(drawings);\n sortByNumber(charts);\n\n // Root rels → core/app props\n let coreProps: string | undefined;\n let appProps: string | undefined;\n let customProps: string | undefined;\n const rootRels = doc.get(\"_rels/.rels\");\n if (rootRels) {\n for (const child of rootRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (type.includes(\"/core-properties\")) coreProps = target;\n else if (type.includes(\"/extended-properties\")) appProps = target;\n else if (type.includes(\"/custom-properties\")) customProps = target;\n }\n }\n\n return {\n doc,\n workbook,\n worksheets,\n styles,\n sharedStrings,\n partRefs: { worksheets, charts, media, drawings },\n coreProps,\n appProps,\n customProps,\n };\n}\n\n// ── Shared strings helper ──\n\n/** Extract plain string array from sharedStringsDesc.parse() result. */\nfunction extractStringsFromEntries(parsed: SharedStringsDocOptions): string[] {\n const strings: string[] = [];\n for (const entry of parsed.entries) {\n if (typeof entry === \"string\") {\n strings.push(entry);\n } else if (entry.runs && entry.runs.length > 0) {\n // Rich text: concatenate run texts\n strings.push(entry.runs.map((r) => r.text).join(\"\"));\n }\n }\n return strings;\n}\n\n/**\n * Parse a .xlsx file and convert it into WorkbookOptions.\n *\n * The returned options can be passed to `new Workbook(parsed)`.\n */\nexport function parseWorkbook(data: DataType): WorkbookOptions {\n const xlsx = parseXlsx(data);\n\n const opts: Partial<WorkbookOptions> = {};\n\n // Core properties\n if (xlsx.coreProps) {\n const corePropsEl = xlsx.doc.get(xlsx.coreProps);\n if (corePropsEl) {\n const cp = parseCorePropsElement(corePropsEl);\n if (cp.title) opts.title = cp.title;\n if (cp.subject) opts.subject = cp.subject;\n if (cp.creator) opts.creator = cp.creator;\n if (cp.keywords) opts.keywords = cp.keywords;\n if (cp.description) opts.description = cp.description;\n if (cp.lastModifiedBy) opts.lastModifiedBy = cp.lastModifiedBy;\n if (cp.revision !== undefined) opts.revision = cp.revision;\n if (cp.lastPrinted) opts.lastPrinted = cp.lastPrinted;\n if (cp.created) opts.created = cp.created;\n if (cp.modified) opts.modified = cp.modified;\n }\n }\n\n // Extended (app) properties\n if (xlsx.appProps) {\n const appPropsEl = xlsx.doc.get(xlsx.appProps);\n if (appPropsEl) {\n const ap = appPropertiesDesc.parse(appPropsEl, {} as ReadContext);\n if (ap && Object.keys(ap).length > 0) opts.appProperties = ap;\n }\n }\n\n // Custom properties\n if (xlsx.customProps) {\n const customPropsEl = xlsx.doc.get(xlsx.customProps);\n if (customPropsEl) {\n const cp = customPropertiesDesc.parse(customPropsEl, {} as ReadContext);\n if (cp.properties?.length) opts.customProperties = cp.properties;\n }\n }\n\n // Shared strings — use descriptor.parse() for richer data, then extract strings for lookup\n let strings: string[] = [];\n if (xlsx.sharedStrings) {\n const parsed = sharedStringsDesc.parse(xlsx.sharedStrings, {} as never);\n strings = extractStringsFromEntries(parsed);\n }\n\n // Create read context for descriptor pipeline\n const readContext = new XlsxReadContext(xlsx, strings);\n\n // Parse styles (fonts, fills, borders, cellXfs)\n if (xlsx.styles) {\n const parsedStyles = stylesDesc.parse(xlsx.styles, readContext);\n readContext.parsedStyles = parsedStyles;\n\n // Expose styles sections onto the returned opts for round-trip. compiler.ts\n // re-emits dxfs from options; colors/tableStyles/cellStyles/styleExtensions\n // are surfaced here even though the compiler currently only consumes dxfs,\n // so callers retain the parsed data and the fields stay documented.\n if (parsedStyles.dxfs) opts.dxfs = parsedStyles.dxfs;\n if (parsedStyles.colors) opts.colors = parsedStyles.colors;\n if (parsedStyles.customCellStyles) opts.cellStyles = parsedStyles.customCellStyles;\n if (parsedStyles.styleExtensions) opts.styleExtensions = parsedStyles.styleExtensions;\n if (parsedStyles.tableStylesInfo?.tableStyles)\n opts.tableStyles = parsedStyles.tableStylesInfo.tableStyles;\n }\n\n // Parse workbook via descriptor for richer data\n let sheetNames: string[] = [];\n if (xlsx.workbook) {\n const wbData = workbookDesc.parse(xlsx.workbook, readContext);\n if (wbData.sheets) sheetNames = wbData.sheets.map((s) => s.name);\n\n // Workbook-level properties\n if (wbData.protection) opts.workbookProtection = wbData.protection;\n if (wbData.bookView) opts.bookView = wbData.bookView;\n if (wbData.calcPr) opts.calcPr = wbData.calcPr;\n if (wbData.customViews) opts.customWorkbookViews = wbData.customViews;\n if (wbData.fileRecoveryPr) opts.fileRecoveryPr = wbData.fileRecoveryPr;\n if (wbData.functionGroups) opts.functionGroups = wbData.functionGroups;\n if (wbData.webPublishing) opts.webPublishing = wbData.webPublishing;\n if (wbData.fileSharing) opts.fileSharing = wbData.fileSharing;\n if (wbData.workbookPr) opts.workbookPr = wbData.workbookPr;\n if (wbData.volTypes) opts.volTypes = wbData.volTypes;\n if (wbData.webPublishObjects) opts.webPublishObjects = wbData.webPublishObjects;\n }\n\n // Parse worksheets using descriptor pipeline\n const worksheets: WorksheetOptions[] = [];\n for (let i = 0; i < xlsx.worksheets.length; i++) {\n const wsPath = xlsx.worksheets[i];\n const wsEl = xlsx.doc.get(wsPath);\n if (!wsEl) continue;\n\n const wsOpts = worksheetDesc.parse(wsEl, readContext);\n if (sheetNames[i]) wsOpts.name = sheetNames[i];\n\n // ── Resolve sub-parts via worksheet relationships ──\n\n // Comments\n const commentRels = readContext.getWorksheetRelsByType(wsPath, \"/comments\");\n for (const cr of commentRels) {\n const commentEl = xlsx.doc.get(cr.target);\n if (!commentEl) continue;\n const commentData = commentsDesc.parse(commentEl, readContext);\n if (commentData.comments) {\n wsOpts.comments = commentData.comments;\n break; // one comments file per worksheet\n }\n }\n\n // Drawings (images + charts)\n const drawingRels = readContext.getWorksheetRelsByType(wsPath, \"/drawing\");\n for (const dr of drawingRels) {\n const drawingEl = xlsx.doc.get(dr.target);\n if (!drawingEl) continue;\n const drawingData = drawingDesc.parse(drawingEl, readContext);\n // drawingDesc.parse yields CT-layer shapes (rId-anchored DrawingImage/\n // DrawingChart), while WorksheetOptions.images/charts are the user-layer\n // shapes (data bytes / ChartSpace content). The shapes are not\n // interchangeable — round-trip drawings are lossy — these casts mark the\n // known impedance, same as wsOpts.pivotTables above.\n if (drawingData.images)\n wsOpts.images = drawingData.images as unknown as WorksheetImageOptions[];\n if (drawingData.charts)\n wsOpts.charts = drawingData.charts as unknown as WorksheetChartOptions[];\n break;\n }\n\n // Tables\n const tableRels = readContext.getWorksheetRelsByType(wsPath, \"/table\");\n if (tableRels.length > 0) {\n const tables: TableOptions[] = [];\n for (const tr of tableRels) {\n const tableEl = xlsx.doc.get(tr.target);\n if (!tableEl) continue;\n const tableData = tableDesc.parse(tableEl, readContext);\n tables.push(tableData);\n }\n if (tables.length > 0) wsOpts.tables = tables;\n }\n\n // Pivot tables\n const pivotRels = readContext.getWorksheetRelsByType(wsPath, \"/pivotTable\");\n if (pivotRels.length > 0) {\n const pivotTables: PivotTableParseResult[] = [];\n for (const pr of pivotRels) {\n const pivotEl = xlsx.doc.get(pr.target);\n if (!pivotEl) continue;\n const pivotData = pivotTableDesc.parse(pivotEl, readContext);\n pivotTables.push(pivotData);\n }\n // WorksheetOptions.pivotTables is PivotTableOptions[] (user-layer) for the\n // compiler's stringify; parse yields the CT-layer PivotTableParseResult.\n // The shapes are not interchangeable (index-based vs name-based), so\n // round-trip pivot tables are lossy — this cast marks the known impedance.\n if (pivotTables.length > 0)\n wsOpts.pivotTables = pivotTables as unknown as PivotTableOptions[];\n }\n\n // Resolve external hyperlink URLs\n const hyperlinks = wsOpts.hyperlinks;\n if (hyperlinks) {\n for (const hl of hyperlinks) {\n if (hl.target.type === \"external\") {\n const resolved = readContext.resolveWorksheetRel(wsPath, hl.target.url);\n if (resolved) hl.target.url = resolved;\n }\n }\n }\n\n worksheets.push(wsOpts as WorksheetOptions);\n }\n\n opts.worksheets = worksheets;\n\n // Chartsheets — parse chartsheet parts\n const chartsheetPaths = xlsx.doc.keys(\"xl/chartsheets/\").filter((k) => k.endsWith(\".xml\"));\n if (chartsheetPaths.length > 0) {\n const chartsheets: ChartsheetOptions[] = [];\n for (let i = 0; i < chartsheetPaths.length; i++) {\n const csEl = xlsx.doc.get(chartsheetPaths[i]);\n if (!csEl) continue;\n const csData = chartsheetDesc.parse(csEl, readContext);\n if (sheetNames[worksheets.length + i]) csData.name = sheetNames[worksheets.length + i];\n chartsheets.push(csData);\n }\n if (chartsheets.length > 0) opts.chartsheets = chartsheets;\n }\n\n // Pivot cache definitions and records\n const pivotCacheDefPaths = xlsx.doc\n .keys(\"xl/pivotCache/\")\n .filter((k) => k.includes(\"pivotCacheDefinition\"));\n if (pivotCacheDefPaths.length > 0) {\n const pivotCaches: PivotCacheDefParseResult[] = [];\n for (const pcdPath of pivotCacheDefPaths) {\n const pcdEl = xlsx.doc.get(pcdPath);\n if (!pcdEl) continue;\n const pcdData = pivotCacheDefDesc.parse(pcdEl, readContext);\n pivotCaches.push(pcdData);\n }\n if (pivotCaches.length > 0) opts.pivotCaches = pivotCaches;\n }\n\n const pivotCacheRecPaths = xlsx.doc\n .keys(\"xl/pivotCache/\")\n .filter((k) => k.includes(\"pivotCacheRecords\"));\n if (pivotCacheRecPaths.length > 0) {\n const pivotCacheRecords: PivotCacheRecordsParseResult[] = [];\n for (const pcrPath of pivotCacheRecPaths) {\n const pcrEl = xlsx.doc.get(pcrPath);\n if (!pcrEl) continue;\n const pcrData = pivotCacheRecordsDesc.parse(pcrEl, readContext);\n pivotCacheRecords.push(pcrData);\n }\n if (pivotCacheRecords.length > 0) opts.pivotCacheRecords = pivotCacheRecords;\n }\n\n // Calculation chain\n const calcChainEl = xlsx.doc.get(\"xl/calcChain.xml\");\n if (calcChainEl) {\n const calcData = calcChainDesc.parse(calcChainEl, readContext);\n if (calcData.cells) opts.calcChain = calcData.cells;\n }\n\n // External links\n const extLinkPaths = xlsx.doc.keys(\"xl/externalLinks/\").filter((k) => k.endsWith(\".xml\"));\n if (extLinkPaths.length > 0) {\n const externalLinks: ExternalLinkOptions[] = [];\n for (const elPath of extLinkPaths) {\n const elEl = xlsx.doc.get(elPath);\n if (!elEl) continue;\n const elData = externalLinkDesc.parse(elEl, readContext);\n\n // Resolve the external book target from the sibling rels file\n // (xl/externalLinks/_rels/externalLinkN.xml.rels), which compiler.ts writes.\n if (elData.externalBook) {\n const relsPath = externalLinkRelsPath(elPath);\n const relsEl = xlsx.doc.get(relsPath);\n if (relsEl) {\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n if (!type.includes(\"/externalLinkPath\")) continue;\n const target = attr(child, \"Target\");\n if (target) {\n elData.externalBook.target = target;\n break;\n }\n }\n }\n }\n\n externalLinks.push(elData);\n }\n if (externalLinks.length > 0) opts.externalLinks = externalLinks;\n }\n\n // Shared-workbook revisions: workbook.xml.rels → revisionHeaders/users;\n // revisionHeaders.xml.rels → per-header revision logs.\n const wbRelsEl2 = xlsx.doc.get(\"xl/_rels/workbook.xml.rels\");\n let revHeadersTarget: string | undefined;\n let usersTarget: string | undefined;\n if (wbRelsEl2) {\n for (const child of wbRelsEl2.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (type.includes(\"/revisionHeaders\")) revHeadersTarget = target;\n else if (type.includes(\"/users\")) usersTarget = target;\n }\n }\n if (revHeadersTarget) {\n const headersPath = revHeadersTarget.startsWith(\"/\")\n ? revHeadersTarget.slice(1)\n : `xl/${revHeadersTarget}`;\n const headersEl = xlsx.doc.get(headersPath);\n if (headersEl) {\n const headers = revisionHeadersDesc.parse(headersEl, readContext);\n const logs: RevisionLogOptions[] = [];\n const slash = headersPath.lastIndexOf(\"/\");\n const revHeadersRelsEl = xlsx.doc.get(\n `${headersPath.slice(0, slash)}/_rels/${headersPath.slice(slash + 1)}.rels`,\n );\n if (revHeadersRelsEl) {\n for (const child of revHeadersRelsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n if (!(attr(child, \"Type\") ?? \"\").includes(\"/revisionLog\")) continue;\n const t = attr(child, \"Target\");\n if (!t) continue;\n const logEl = xlsx.doc.get(t.startsWith(\"/\") ? t.slice(1) : `xl/${t}`);\n if (logEl) logs.push(revisionLogDesc.parse(logEl, readContext));\n }\n }\n const revisionLog: SharedWorkbookOptions = { headers, logs };\n if (usersTarget) {\n const usersEl = xlsx.doc.get(\n usersTarget.startsWith(\"/\") ? usersTarget.slice(1) : `xl/${usersTarget}`,\n );\n if (usersEl) {\n const users = usersDesc.parse(usersEl, readContext);\n if (users.users) revisionLog.users = users;\n }\n }\n opts.revisionLog = revisionLog;\n }\n }\n\n return opts as WorkbookOptions;\n}\n"],"mappings":"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"}
package/dist/patch.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { D as WorksheetOptions, o as CommentOptions } from "./worksheet-DgjBJg_S.mjs";
1
+ import { D as WorksheetOptions, o as CommentOptions } from "./worksheet-BANE0-5P.mjs";
2
2
  import { BasePatchOptions, CorePropertiesOptions, OutputByType, OutputType } from "@office-open/core";
3
3
 
4
4
  //#region src/patch.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"patch.d.mts","names":[],"sources":["../src/patch.ts"],"mappings":";;;;KA0CY,WAAA,+BAA0C,IAAI;AAAA,KAG9C,KAAA,GAAQ,WAAW;AAAA,UAEd,oBAAA,WACL,UAAA,GAAa,UAAA,UACf,gBAAA,CAAiB,CAAA;EAEzB,YAAA,GAAe,QAAA,CAAS,MAAA,SAAe,WAAA;EAEvC,WAAA,GAAc,QAAA,CAAS,MAAA,SAAe,WAAA;EAEtC,cAAA,GAAiB,OAAA,CAAQ,qBAAA;EAOzB,UAAA;IAEE,OAAA,GAAU,QAAA,CAAS,MAAA,SAAe,gBAAA;IAElC,MAAA,GAAS,QAAA,CAAS,gBAAA;EAAA;EAOpB,QAAA,GAAW,QAAA,CAAS,MAAA,SAAe,cAAA;AAAA;AAAA,cA4CxB,aAAA,aAAiC,UAAA,GAAa,UAAA;EAAY,UAAA;EAAA,IAAA;EAAA,YAAA;EAAA,WAAA;EAAA,cAAA;EAAA,UAAA;EAAA,QAAA;EAAA;AAAA,GASpE,oBAAA,CAAqB,CAAA,MAAK,OAAA,CAAQ,YAAA,CAAa,CAAA"}
1
+ {"version":3,"file":"patch.d.mts","names":[],"sources":["../src/patch.ts"],"mappings":";;;;KA6CY,WAAA,+BAA0C,IAAI;AAAA,KAG9C,KAAA,GAAQ,WAAW;AAAA,UAEd,oBAAA,WACL,UAAA,GAAa,UAAA,UACf,gBAAA,CAAiB,CAAA;EAEzB,YAAA,GAAe,QAAA,CAAS,MAAA,SAAe,WAAA;EAEvC,WAAA,GAAc,QAAA,CAAS,MAAA,SAAe,WAAA;EAEtC,cAAA,GAAiB,OAAA,CAAQ,qBAAA;EAOzB,UAAA;IAEE,OAAA,GAAU,QAAA,CAAS,MAAA,SAAe,gBAAA;IAElC,MAAA,GAAS,QAAA,CAAS,gBAAA;EAAA;EAOpB,QAAA,GAAW,QAAA,CAAS,MAAA,SAAe,cAAA;AAAA;AAAA,cA4CxB,aAAA,aAAiC,UAAA,GAAa,UAAA;EAAY,UAAA;EAAA,IAAA;EAAA,YAAA;EAAA,WAAA;EAAA,cAAA;EAAA,UAAA;EAAA,QAAA;EAAA;AAAA,GASpE,oBAAA,CAAqB,CAAA,MAAK,OAAA,CAAQ,YAAA,CAAa,CAAA"}
package/dist/patch.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import { a as SharedStrings, n as vmlNotesDesc, o as sharedStringsDesc, r as stringifyWorksheet, t as commentsDesc } from "./comments-CIu-wLTT.mjs";
1
+ import { a as SharedStrings, n as vmlNotesDesc, o as sharedStringsDesc, r as stringifyWorksheet, t as commentsDesc } from "./comments-CQ5dlj-4.mjs";
2
2
  import { js2xml } from "@office-open/xml";
3
- import { OoxmlMimeType, appendRelationship, applyCorePropertiesOverride, getNextRelationshipIndex, strFromU8, toJson, toUint8Array, unzipSync, zipAndConvert } from "@office-open/core";
3
+ import { OoxmlMimeType, appendContentType, appendOverride, appendRelationship, applyCorePropertiesOverride, getNextRelationshipIndex, nextNumericId, strFromU8, toJson, toUint8Array, unzipSync, zipAndConvert } from "@office-open/core";
4
4
  //#region src/patch.ts
5
5
  /**
6
6
  * XLSX patching — replace placeholders in existing .xlsx files.
@@ -300,15 +300,9 @@ function nextWorksheetNumber(xmlMap) {
300
300
  }
301
301
  return maxN + 1;
302
302
  }
303
- /** Largest numeric `sheetId` among existing `<sheet>` entries. */
304
- function maxSheetId(sheetsEl) {
305
- let maxId = 0;
306
- for (const child of sheetsEl?.elements ?? []) {
307
- if (localName(child) !== "sheet") continue;
308
- const id = Number(child.attributes?.["sheetId"]);
309
- if (Number.isFinite(id)) maxId = Math.max(maxId, id);
310
- }
311
- return maxId;
303
+ /** Next `sheetId` for an appended `<sheet>` entry. */
304
+ function nextSheetId(sheetsEl) {
305
+ return nextNumericId(sheetsEl, "sheet", "sheetId", 0);
312
306
  }
313
307
  /** Resolve a relationship `rId` to its Target via a rels part root. */
314
308
  function resolveRelTarget(relsRoot, rId) {
@@ -345,15 +339,12 @@ function appendWorksheetToMap(xmlMap, wsOpts, sharedStrings) {
345
339
  const newRId = getNextRelationshipIndex(wbRels);
346
340
  if (wbSheets) (wbSheets.elements ?? (wbSheets.elements = [])).push(makeElement("sheet", {
347
341
  name: sheetName,
348
- sheetId: String(maxSheetId(wbSheets) + 1),
342
+ sheetId: String(nextSheetId(wbSheets)),
349
343
  "r:id": `rId${newRId}`
350
344
  }));
351
345
  appendRelationship(wbRels, newRId, WORKSHEET_REL_TYPE, `worksheets/sheet${newN}.xml`);
352
- const typesRoot = rootOf(xmlMap.get("[Content_Types].xml"));
353
- if (typesRoot) (typesRoot.elements ?? (typesRoot.elements = [])).push(makeElement("Override", {
354
- PartName: `/${sheetPath}`,
355
- ContentType: WORKSHEET_CONTENT_TYPE
356
- }));
346
+ const contentTypes = xmlMap.get("[Content_Types].xml");
347
+ if (contentTypes) appendOverride(contentTypes, `/${sheetPath}`, WORKSHEET_CONTENT_TYPE);
357
348
  }
358
349
  /** Normalize a worksheet name to its full part path via workbook.xml + rels. */
359
350
  function resolveSheetPath(xmlMap, name) {
@@ -457,17 +448,10 @@ function appendCommentsToMap(xmlMap, vmlFiles, sheetName, commentOpts) {
457
448
  }
458
449
  const wsRoot = rootOf(xmlMap.get(sheetPath));
459
450
  if (wsRoot) insertLegacyDrawing(wsRoot, vmlRidRef);
460
- const typesRoot = rootOf(xmlMap.get("[Content_Types].xml"));
461
- if (typesRoot) {
462
- const els = typesRoot.elements ?? (typesRoot.elements = []);
463
- if (!existingPart) els.push(makeElement("Override", {
464
- PartName: `/${commentsPath}`,
465
- ContentType: COMMENTS_CONTENT_TYPE
466
- }));
467
- if (!els.some((e) => localName(e) === "Default" && e.attributes?.["Extension"] === "vml")) els.push(makeElement("Default", {
468
- Extension: "vml",
469
- ContentType: VML_CONTENT_TYPE
470
- }));
451
+ const contentTypes = xmlMap.get("[Content_Types].xml");
452
+ if (contentTypes) {
453
+ if (!existingPart) appendOverride(contentTypes, `/${commentsPath}`, COMMENTS_CONTENT_TYPE);
454
+ appendContentType(contentTypes, VML_CONTENT_TYPE, "vml");
471
455
  }
472
456
  }
473
457
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"patch.mjs","names":["buildWorksheetXml"],"sources":["../src/patch.ts"],"sourcesContent":["/**\n * XLSX patching — replace placeholders in existing .xlsx files.\n *\n * Unlike DOCX/PPTX (paragraph-based), XLSX patching targets cell values:\n * - String-valued patches substitute the placeholder text in place (shared\n * strings table or inline strings).\n * - Non-string-valued patches (number / boolean / Date) whose placeholder is\n * the entire cell content rewrite the cell to a typed value with the correct\n * cell type (`t`), so the result is a real number/boolean/date cell — not a\n * stringified copy.\n *\n * @module\n */\nimport {\n OoxmlMimeType,\n appendRelationship,\n applyCorePropertiesOverride,\n getNextRelationshipIndex,\n strFromU8,\n toJson,\n unzipSync,\n zipAndConvert,\n} from \"@office-open/core\";\nimport type {\n BasePatchOptions,\n CorePropertiesOptions,\n OutputByType,\n OutputType,\n} from \"@office-open/core\";\nimport { toUint8Array } from \"@office-open/core\";\nimport type { ReadContext, WriteContext } from \"@office-open/core/descriptor\";\nimport { js2xml } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { commentsDesc, vmlNotesDesc } from \"@parts/comments\";\nimport { SharedStrings, sharedStringsDesc } from \"@parts/shared-strings\";\nimport { buildWorksheetXml } from \"@parts/worksheet\";\nimport type { CommentOptions, WorksheetOptions } from \"@parts/worksheet\";\n\n/** Reusable TextEncoder (stateless, safe to share). */\nconst encoder = new TextEncoder();\n\n/** Scalar cell value accepted by {@link patchWorkbook}. */\nexport type ScalarValue = string | number | boolean | Date;\n\n/** A patch value is just a scalar. */\nexport type Patch = ScalarValue;\n\nexport interface PatchWorkbookOptions<\n T extends OutputType = OutputType,\n> extends BasePatchOptions<T> {\n /** Placeholder substitutions: `{{key}}` (per delimiters) → value. */\n placeholders?: Readonly<Record<string, ScalarValue>>;\n /** Literal find/replace: the find string → value (no delimiters added). */\n findReplace?: Readonly<Record<string, ScalarValue>>;\n /** Core-properties metadata override (merged over the existing docProps/core.xml). */\n coreProperties?: Partial<CorePropertiesOptions>;\n /**\n * Worksheet collection edits. The shared-strings table is rebuilt from the\n * template first, so appended/replaced worksheets continue indexing strings\n * at the correct offset. Cell styles are not supported on appended rows —\n * reference only styles already present in the template.\n */\n worksheets?: {\n /** Replace worksheets keyed by sheet name (as declared in workbook.xml). */\n replace?: Readonly<Record<string, WorksheetOptions>>;\n /** Append worksheets after the last existing sheet. */\n append?: Readonly<WorksheetOptions[]>;\n };\n /**\n * Cell comments (notes) to append per worksheet. Existing comments on the\n * target worksheet are merged — parsed, extended with the new entries, and\n * re-serialized. Keyed by worksheet name (as declared in workbook.xml).\n */\n comments?: Readonly<Record<string, CommentOptions[]>>;\n}\n\n// Excel serial-date epoch: 1899-12-30 accounts for the spurious 1900 leap year.\nconst EXCEL_EPOCH_MS = Date.UTC(1899, 11, 30);\nconst MS_PER_DAY = 86_400_000;\n\nconst WORKSHEET_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\";\nconst WORKSHEET_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\";\nconst COMMENTS_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\";\nconst VML_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\";\nconst COMMENTS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\";\nconst VML_CONTENT_TYPE = \"application/vnd.openxmlformats-officedocument.vmlDrawing\";\n\n/**\n * sharedStringsDesc.parse ignores its context, but its signature requires a\n * {@link ReadContext}. This stub satisfies the type without pulling in parse\n * machinery the patch path does not need.\n */\nconst STUB_READ_CTX: ReadContext = {\n resolveRelationship: () => undefined,\n getPart: () => undefined,\n getRaw: () => undefined,\n};\n\nconst toExcelSerial = (date: Date): number => (date.getTime() - EXCEL_EPOCH_MS) / MS_PER_DAY;\n\n/** Human-readable form for string-substitution (mixed-text) fallback. */\nconst toDisplayString = (value: Exclude<ScalarValue, string>): string => {\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (value instanceof Date) return value.toISOString().split(\"T\")[0];\n return String(value);\n};\n\n/**\n * Patch an existing .xlsx workbook by replacing placeholder text in cells.\n *\n * @publicApi\n */\nexport const patchWorkbook = async <T extends OutputType = OutputType>({\n outputType,\n data,\n placeholders,\n findReplace,\n coreProperties,\n worksheets,\n comments,\n placeholderDelimiters = { start: \"{{\", end: \"}}\" } as const,\n}: PatchWorkbookOptions<T>): Promise<OutputByType[T]> => {\n const { start, end } = placeholderDelimiters;\n if (!start.trim() || !end.trim()) {\n throw new Error(\"Both start and end delimiters must be non-empty strings.\");\n }\n\n const zipContent = unzipSync(toUint8Array(data));\n\n const xmlMap = new Map<string, Element>();\n const binaryMap = new Map<string, Uint8Array>();\n // VML parts are text XML under a .vml extension — kept out of xmlMap (which\n // only holds .xml/.rels) and serialized as raw text at the end.\n const vmlFiles = new Map<string, string>();\n\n // Separate XML files from binary files\n for (const [key, value] of Object.entries(zipContent)) {\n if (key.endsWith(\".xml\") || key.endsWith(\".rels\")) {\n xmlMap.set(key, toJson(strFromU8(value)));\n } else {\n binaryMap.set(key, value);\n }\n }\n\n // Unified patch map: placeholders are delimiter-wrapped, findReplace keys are\n // literal strings. Both feed the same Pass A (typed cells) / Pass B (text) engine.\n const patchMap = new Map<string, ScalarValue>();\n if (placeholders) {\n for (const [key, value] of Object.entries(placeholders)) {\n patchMap.set(`${start}${key}${end}`, value);\n }\n }\n if (findReplace) {\n for (const [key, value] of Object.entries(findReplace)) {\n patchMap.set(key, value);\n }\n }\n\n const sharedStrings = xmlMap.get(\"xl/sharedStrings.xml\");\n const sharedTextByIndex = buildSharedTextIndex(sharedStrings);\n\n const worksheetKeys = Object.keys(zipContent).filter(\n (k) => k.startsWith(\"xl/worksheets/sheet\") && k.endsWith(\".xml\"),\n );\n\n // Pass A: rewrite pure placeholder cells to typed values (number / boolean / Date)\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (ws) rewriteTypedCells(ws, patchMap, sharedTextByIndex);\n }\n\n // Pass B: text substitution in shared strings + inline strings\n // (string-valued patches, plus non-string patches embedded in mixed text)\n if (sharedStrings) patchSharedStrings(sharedStrings, patchMap);\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (!ws) continue;\n patchWorksheetInlineStrings(ws, patchMap);\n // Pass C: print headers/footers (oddHeader/oddFooter/… literal text)\n patchHeaderFooter(ws, patchMap);\n }\n\n // Worksheet collection edits — rebuild shared strings first so appended/\n // replaced worksheets continue indexing at the right offset, then serialize.\n if (worksheets) {\n const sharedStrings = rebuildSharedStrings(xmlMap);\n if (worksheets.replace) {\n for (const [name, wsOpts] of Object.entries(worksheets.replace)) {\n replaceWorksheetInMap(xmlMap, name, wsOpts, sharedStrings);\n }\n }\n if (worksheets.append) {\n for (const wsOpts of worksheets.append) {\n appendWorksheetToMap(xmlMap, wsOpts, sharedStrings);\n }\n }\n rewriteSharedStrings(xmlMap, sharedStrings);\n }\n\n // Cell comments — append per worksheet, merging with any existing comments.\n if (comments) {\n for (const [sheetName, commentOpts] of Object.entries(comments)) {\n appendCommentsToMap(xmlMap, vmlFiles, sheetName, commentOpts);\n }\n }\n\n // Rebuild ZIP\n const files: Record<string, Uint8Array> = {};\n const XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n for (const [key, value] of xmlMap) {\n files[key] =\n key === \"docProps/core.xml\" && coreProperties\n ? encoder.encode(XML_DECL + applyCorePropertiesOverride(value, coreProperties))\n : encoder.encode(js2xml(value));\n }\n for (const [key, value] of binaryMap) {\n files[key] = value;\n }\n for (const [key, value] of vmlFiles) {\n files[key] = encoder.encode(value);\n }\n\n return await zipAndConvert(files, outputType, OoxmlMimeType.XLSX);\n};\n\n/** Map each `<si>` shared-string index to its flattened text. */\nfunction buildSharedTextIndex(sst: Element | undefined): Map<number, string> {\n const map = new Map<number, string>();\n if (!sst) return map;\n const root = sst.name ? sst : sst.elements?.[0];\n let idx = 0;\n for (const si of root?.elements ?? []) {\n if (si.name !== \"si\") continue;\n map.set(idx, flattenText(si));\n idx++;\n }\n return map;\n}\n\n/**\n * Pass A — for each cell whose entire text is a non-string placeholder, rewrite\n * the cell to a typed value cell (`<v>` with the correct `t`).\n */\nfunction rewriteTypedCells(\n ws: Element,\n patchMap: Map<string, ScalarValue>,\n sharedTextByIndex: Map<number, string>,\n): void {\n const root = ws.name ? ws : ws.elements?.[0];\n const sheetData = root && findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n const text = effectiveCellText(cell, sharedTextByIndex);\n if (text === undefined) continue;\n\n for (const [placeholder, value] of patchMap) {\n if (typeof value === \"string\") continue; // Pass B handles string values\n if (text === placeholder) {\n rewriteCellToValue(cell, value);\n break; // a pure cell holds a single placeholder\n }\n }\n }\n }\n}\n\n/** Resolve the displayed text of a string/inline-string cell, else undefined. */\nfunction effectiveCellText(\n cell: Element,\n sharedTextByIndex: Map<number, string>,\n): string | undefined {\n const t = cell.attributes?.[\"t\"];\n if (t === \"inlineStr\") {\n const isEl = findLocalChild(cell, \"is\");\n return isEl ? flattenText(isEl) : undefined;\n }\n if (t === \"s\") {\n const v = findLocalChild(cell, \"v\");\n const raw = v?.elements?.[0]?.text;\n const idx = Number(raw);\n return Number.isNaN(idx) ? undefined : sharedTextByIndex.get(idx);\n }\n return undefined;\n}\n\n/** Rewrite a cell element to a typed value (`<v>` with the correct `t`). */\nfunction rewriteCellToValue(cell: Element, value: Exclude<ScalarValue, string>): void {\n const attrs = cell.attributes ?? (cell.attributes = {});\n let vText: string;\n if (typeof value === \"boolean\") {\n attrs[\"t\"] = \"b\";\n vText = value ? \"1\" : \"0\";\n } else if (value instanceof Date) {\n delete attrs[\"t\"]; // serial date is numeric\n vText = String(toExcelSerial(value));\n } else {\n delete attrs[\"t\"]; // plain numeric\n vText = String(value);\n }\n cell.elements = [{ type: \"element\", name: \"v\", elements: [{ type: \"text\", text: vText }] }];\n}\n\n/** Pass B — substitute placeholders in shared-string `<si>` text. */\nfunction patchSharedStrings(sst: Element, patchMap: Map<string, ScalarValue>): void {\n const root = sst.name ? sst : sst.elements?.[0];\n if (!root) return;\n\n for (const si of root.elements ?? []) {\n if (si.name !== \"si\") continue;\n\n // Simple: <si><t>text</t></si>\n const t = findLocalChild(si, \"t\");\n if (t) {\n patchTextElement(t, patchMap);\n } else {\n // Rich text: <si><r><t>text</t></r>...</si>\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findLocalChild(r, \"t\");\n if (rt) patchTextElement(rt, patchMap);\n }\n }\n }\n}\n\n/** Pass B — substitute placeholders in worksheet inline strings. */\nfunction patchWorksheetInlineStrings(ws: Element, patchMap: Map<string, ScalarValue>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n\n const sheetData = findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n\n // Inline strings: <c t=\"inlineStr\"><is><t>text</t></is></c>\n const isEl = findLocalChild(cell, \"is\");\n if (isEl) {\n const t = findLocalChild(isEl, \"t\");\n if (t) patchTextElement(t, patchMap);\n }\n }\n }\n}\n\nconst HEADER_FOOTER_NAMES = new Set([\n \"oddHeader\",\n \"oddFooter\",\n \"evenHeader\",\n \"evenFooter\",\n \"firstHeader\",\n \"firstFooter\",\n]);\n\n/**\n * Pass C — substitute placeholders in worksheet print header/footer text.\n * Header/footer children (oddHeader/oddFooter/…) carry their text directly\n * (not wrapped in `<t>`), so this is a substring substitution on the element's\n * own text node.\n */\nfunction patchHeaderFooter(ws: Element, patchMap: Map<string, ScalarValue>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n const headerFooter = findLocalChild(root, \"headerFooter\");\n if (!headerFooter) return;\n\n for (const part of headerFooter.elements ?? []) {\n if (part.type !== \"element\" || !HEADER_FOOTER_NAMES.has(localName(part))) continue;\n const textNode = part.elements?.[0];\n if (!textNode || typeof textNode.text !== \"string\") continue;\n\n let replaced = textNode.text;\n for (const [placeholder, value] of patchMap) {\n if (!replaced.includes(placeholder)) continue;\n const display = typeof value === \"string\" ? value : toDisplayString(value);\n replaced = replaced.split(placeholder).join(display);\n }\n if (replaced !== textNode.text) {\n part.elements![0] = { ...textNode, text: replaced };\n }\n }\n}\n\n/** Substitute any placeholder substring in a `<t>` element's text. */\nfunction patchTextElement(tEl: Element, patchMap: Map<string, ScalarValue>): void {\n const textNode = tEl.elements?.[0];\n const text = textNode?.text;\n if (typeof text !== \"string\") return;\n\n let replaced = text;\n for (const [placeholder, value] of patchMap) {\n if (!replaced.includes(placeholder)) continue;\n const display = typeof value === \"string\" ? value : toDisplayString(value);\n replaced = replaced.split(placeholder).join(display);\n }\n if (replaced !== text && tEl.elements) {\n tEl.elements[0] = { ...textNode, text: replaced };\n }\n}\n\n/** Flatten all descendant text of an element into a single string. */\nfunction flattenText(el: Element): string {\n let out = \"\";\n for (const child of el.elements ?? []) {\n if (child.type === \"text\") {\n out += child.text ?? \"\";\n } else if (child.type === \"element\") {\n out += flattenText(child);\n }\n }\n return out;\n}\n\nfunction localName(el: Element): string {\n const name = el.name ?? \"\";\n const colonIdx = name.indexOf(\":\");\n return colonIdx >= 0 ? name.slice(colonIdx + 1) : name;\n}\n\nfunction findLocalChild(parent: Element, name: string): Element | undefined {\n return (parent.elements ?? []).find((el) => localName(el) === name);\n}\n\n// ── Worksheet collection edits (append / replace) ──\n\n/** Unwrap the document element: a parsed part is `{ declaration, elements: [<root>] }`. */\nfunction rootOf(doc: Element | undefined): Element | undefined {\n return doc && (doc.name ? doc : doc.elements?.[0]);\n}\n\n/** Build a bare element node with the given attributes. */\nfunction makeElement(name: string, attributes: Record<string, string> = {}): Element {\n return { type: \"element\", name, attributes, elements: [] };\n}\n\n/** Empty `<Relationships>` part (wrapped for js2xml serialization). */\nfunction createRelationshipFile(): Element {\n return {\n declaration: { attributes: { encoding: \"UTF-8\", standalone: \"yes\", version: \"1.0\" } },\n elements: [\n {\n attributes: { xmlns: \"http://schemas.openxmlformats.org/package/2006/relationships\" },\n elements: [],\n name: \"Relationships\",\n type: \"element\",\n },\n ],\n };\n}\n\n/** Next 1-based worksheet file number given existing worksheet parts. */\nfunction nextWorksheetNumber(xmlMap: Map<string, Element>): number {\n let maxN = 0;\n for (const key of xmlMap.keys()) {\n const m = key.match(/^xl\\/worksheets\\/sheet(\\d+)\\.xml$/);\n if (m) maxN = Math.max(maxN, Number(m[1]));\n }\n return maxN + 1;\n}\n\n/** Largest numeric `sheetId` among existing `<sheet>` entries. */\nfunction maxSheetId(sheetsEl: Element | undefined): number {\n let maxId = 0;\n for (const child of sheetsEl?.elements ?? []) {\n if (localName(child) !== \"sheet\") continue;\n const id = Number(child.attributes?.[\"sheetId\"]);\n if (Number.isFinite(id)) maxId = Math.max(maxId, id);\n }\n return maxId;\n}\n\n/** Resolve a relationship `rId` to its Target via a rels part root. */\nfunction resolveRelTarget(relsRoot: Element | undefined, rId: string): string | undefined {\n for (const child of relsRoot?.elements ?? []) {\n if (localName(child) === \"Relationship\" && String(child.attributes?.[\"Id\"]) === rId) {\n const target = child.attributes?.[\"Target\"];\n return target !== undefined ? String(target) : undefined;\n }\n }\n return undefined;\n}\n\n/** Rebuild the shared-strings table from the template so new sheets extend it. */\nfunction rebuildSharedStrings(xmlMap: Map<string, Element>): SharedStrings {\n const ss = new SharedStrings();\n const sstRoot = rootOf(xmlMap.get(\"xl/sharedStrings.xml\"));\n if (sstRoot) {\n ss.loadEntries(sharedStringsDesc.parse(sstRoot, STUB_READ_CTX).entries);\n }\n return ss;\n}\n\n/** Re-serialize the shared-strings part (called after worksheets are built). */\nfunction rewriteSharedStrings(xmlMap: Map<string, Element>, ss: SharedStrings): void {\n if (ss.count === 0) return;\n xmlMap.set(\n \"xl/sharedStrings.xml\",\n toJson(`<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${ss.serialize()}`),\n );\n}\n\n/**\n * Append a worksheet: serialize it (registering strings into the shared-strings\n * table), then wire workbook `<sheets>` + workbook rels + content types.\n */\nfunction appendWorksheetToMap(\n xmlMap: Map<string, Element>,\n wsOpts: WorksheetOptions,\n sharedStrings: SharedStrings,\n): void {\n const newN = nextWorksheetNumber(xmlMap);\n const sheetPath = `xl/worksheets/sheet${newN}.xml`;\n const sheetName = wsOpts.name ?? `Sheet${newN}`;\n\n // Worksheet part (no XML declaration — matches generated worksheet parts)\n xmlMap.set(sheetPath, toJson(buildWorksheetXml(wsOpts, { sharedStrings })));\n\n // workbook.xml <sheets> + workbook.xml.rels (the new rId ties them)\n const wbRoot = rootOf(xmlMap.get(\"xl/workbook.xml\"));\n const wbSheets = wbRoot && findLocalChild(wbRoot, \"sheets\");\n const wbRels = xmlMap.get(\"xl/_rels/workbook.xml.rels\") ?? createRelationshipFile();\n xmlMap.set(\"xl/_rels/workbook.xml.rels\", wbRels);\n const newRId = getNextRelationshipIndex(wbRels);\n\n if (wbSheets) {\n const els = wbSheets.elements ?? (wbSheets.elements = []);\n els.push(\n makeElement(\"sheet\", {\n name: sheetName,\n sheetId: String(maxSheetId(wbSheets) + 1),\n \"r:id\": `rId${newRId}`,\n }),\n );\n }\n appendRelationship(wbRels, newRId, WORKSHEET_REL_TYPE, `worksheets/sheet${newN}.xml`);\n\n // [Content_Types].xml Override\n const typesRoot = rootOf(xmlMap.get(\"[Content_Types].xml\"));\n if (typesRoot) {\n const els = typesRoot.elements ?? (typesRoot.elements = []);\n els.push(\n makeElement(\"Override\", {\n PartName: `/${sheetPath}`,\n ContentType: WORKSHEET_CONTENT_TYPE,\n }),\n );\n }\n}\n\n/** Normalize a worksheet name to its full part path via workbook.xml + rels. */\nfunction resolveSheetPath(xmlMap: Map<string, Element>, name: string): string {\n const wbRoot = rootOf(xmlMap.get(\"xl/workbook.xml\"));\n const wbSheets = wbRoot && findLocalChild(wbRoot, \"sheets\");\n const sheetEls = (wbSheets?.elements ?? []).filter((e) => localName(e) === \"sheet\");\n const target = sheetEls.find((e) => String(e.attributes?.[\"name\"]) === name);\n if (!target?.attributes?.[\"r:id\"]) {\n throw new Error(`patchWorkbook: no worksheet named \"${name}\"`);\n }\n const relTarget = resolveRelTarget(\n rootOf(xmlMap.get(\"xl/_rels/workbook.xml.rels\")),\n String(target.attributes[\"r:id\"]),\n );\n if (!relTarget) {\n throw new Error(`patchWorkbook: worksheet \"${name}\" relationship target not found`);\n }\n if (relTarget.startsWith(\"/\")) return relTarget.slice(1);\n return relTarget.startsWith(\"xl/\") ? relTarget : `xl/${relTarget}`;\n}\n\n/**\n * Replace a worksheet by name: resolve the name to its part via workbook rels,\n * then rewrite only that part's content. Sheet identity, rId, and content types\n * are unchanged.\n */\nfunction replaceWorksheetInMap(\n xmlMap: Map<string, Element>,\n name: string,\n wsOpts: WorksheetOptions,\n sharedStrings: SharedStrings,\n): void {\n const sheetPath = resolveSheetPath(xmlMap, name);\n xmlMap.set(sheetPath, toJson(buildWorksheetXml(wsOpts, { sharedStrings })));\n}\n\n/** Build the rels part path for a given part path (…/_rels/<file>.rels). */\nfunction relsKeyFor(partPath: string): string {\n const slash = partPath.lastIndexOf(\"/\");\n return `${partPath.substring(0, slash)}/_rels/${partPath.substring(slash + 1)}.rels`;\n}\n\n/** Find an existing relationship of a type in a rels root: { id, target }. */\nfunction findRelByType(\n relsRoot: Element | undefined,\n type: string,\n): { id: string; target: string } | undefined {\n for (const child of relsRoot?.elements ?? []) {\n if (localName(child) === \"Relationship\" && String(child.attributes?.[\"Type\"]) === type) {\n const target = child.attributes?.[\"Target\"];\n if (target !== undefined) {\n return { id: String(child.attributes?.[\"Id\"]), target: String(target) };\n }\n }\n }\n return undefined;\n}\n\n/** Largest existing comments file number (xl/comments{n}.xml), for append offset. */\nfunction nextCommentsNumber(xmlMap: Map<string, Element>): number {\n let maxN = 0;\n for (const key of xmlMap.keys()) {\n const m = key.match(/^xl\\/comments(\\d+)\\.xml$/);\n if (m) maxN = Math.max(maxN, Number(m[1]));\n }\n return maxN + 1;\n}\n\n/**\n * Insert `<legacyDrawing>` into a worksheet, after `<drawing>` and before the\n * trailing collection elements (CT_Worksheet sequence order). Skipped when one\n * already exists.\n */\nfunction insertLegacyDrawing(wsRoot: Element, rId: string): void {\n const els = wsRoot.elements ?? (wsRoot.elements = []);\n if (els.some((e) => localName(e) === \"legacyDrawing\")) return;\n const legacy = makeElement(\"legacyDrawing\", { \"r:id\": rId });\n const afterLegacy = new Set([\n \"tableParts\",\n \"extLst\",\n \"oleObjects\",\n \"controls\",\n \"picture\",\n \"webPublishItems\",\n ]);\n let insertAt = els.length;\n for (let i = 0; i < els.length; i++) {\n if (afterLegacy.has(localName(els[i]))) {\n insertAt = i;\n break;\n }\n }\n els.splice(insertAt, 0, legacy);\n}\n\n/** commentsDesc.stringify ignores its context; this satisfies the WriteContext type. */\nconst STUB_WRITE_CTX = {} as unknown as WriteContext;\n\n/**\n * Append cell comments to a worksheet, merging with any existing comments part.\n * Wires commentsN.xml + vmlDrawingN.vml (reusing the existing pair when present),\n * the worksheet relationships, the `<legacyDrawing>` anchor, and content types.\n * VML text is written to {@link vmlFiles} (not xmlMap) because of its extension.\n */\nfunction appendCommentsToMap(\n xmlMap: Map<string, Element>,\n vmlFiles: Map<string, string>,\n sheetName: string,\n commentOpts: CommentOptions[],\n): void {\n const sheetPath = resolveSheetPath(xmlMap, sheetName);\n const wsRelsKey = relsKeyFor(sheetPath);\n const wsRels = xmlMap.get(wsRelsKey) ?? createRelationshipFile();\n xmlMap.set(wsRelsKey, wsRels);\n\n // Reuse the worksheet's existing comments/vmlDrawing relationships when present.\n const existingComments = findRelByType(rootOf(wsRels), COMMENTS_REL_TYPE);\n const existingVml = findRelByType(rootOf(wsRels), VML_REL_TYPE);\n\n const commentsN = existingComments\n ? Number((existingComments.target.match(/comments(\\d+)\\.xml$/) ?? [])[1]) ||\n nextCommentsNumber(xmlMap)\n : nextCommentsNumber(xmlMap);\n const commentsPath = `xl/comments${commentsN}.xml`;\n // Reuse the existing vmlDrawing path when present — its index can differ from\n // the comments index in third-party files.\n const vmlPath = existingVml\n ? `xl/drawings/${existingVml.target.slice(existingVml.target.lastIndexOf(\"/\") + 1)}`\n : `xl/drawings/vmlDrawing${commentsN}.vml`;\n\n // Merge with the existing comments part if it was already in the package.\n const existingPart = rootOf(xmlMap.get(commentsPath));\n let merged = commentOpts;\n if (existingPart) {\n merged = [...commentsDesc.parse(existingPart, STUB_READ_CTX).comments, ...commentOpts];\n }\n\n const commentsXml = commentsDesc.stringify({ comments: merged }, STUB_WRITE_CTX);\n if (commentsXml) {\n xmlMap.set(\n commentsPath,\n toJson(`<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${commentsXml}`),\n );\n }\n const vmlXml = vmlNotesDesc.stringify({ comments: merged }, STUB_WRITE_CTX);\n if (vmlXml) {\n vmlFiles.set(vmlPath, `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${vmlXml}`);\n }\n\n // Worksheet relationships — added only when the part is newly introduced.\n if (!existingComments) {\n const n = getNextRelationshipIndex(wsRels);\n appendRelationship(wsRels, n, COMMENTS_REL_TYPE, `../comments${commentsN}.xml`);\n }\n let vmlRidRef: string;\n if (existingVml) {\n vmlRidRef = existingVml.id;\n } else {\n const n = getNextRelationshipIndex(wsRels);\n appendRelationship(wsRels, n, VML_REL_TYPE, `../drawings/vmlDrawing${commentsN}.vml`);\n vmlRidRef = `rId${n}`;\n }\n\n // `<legacyDrawing>` anchor on the worksheet (deduped).\n const wsRoot = rootOf(xmlMap.get(sheetPath));\n if (wsRoot) insertLegacyDrawing(wsRoot, vmlRidRef);\n\n // Content types — comments Override (new part only) + vml Default (deduped).\n const typesRoot = rootOf(xmlMap.get(\"[Content_Types].xml\"));\n if (typesRoot) {\n const els = typesRoot.elements ?? (typesRoot.elements = []);\n if (!existingPart) {\n els.push(\n makeElement(\"Override\", {\n PartName: `/${commentsPath}`,\n ContentType: COMMENTS_CONTENT_TYPE,\n }),\n );\n }\n const hasVml = els.some(\n (e) => localName(e) === \"Default\" && e.attributes?.[\"Extension\"] === \"vml\",\n );\n if (!hasVml) {\n els.push(makeElement(\"Default\", { Extension: \"vml\", ContentType: VML_CONTENT_TYPE }));\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"patch.mjs","names":["buildWorksheetXml"],"sources":["../src/patch.ts"],"sourcesContent":["/**\n * XLSX patching — replace placeholders in existing .xlsx files.\n *\n * Unlike DOCX/PPTX (paragraph-based), XLSX patching targets cell values:\n * - String-valued patches substitute the placeholder text in place (shared\n * strings table or inline strings).\n * - Non-string-valued patches (number / boolean / Date) whose placeholder is\n * the entire cell content rewrite the cell to a typed value with the correct\n * cell type (`t`), so the result is a real number/boolean/date cell — not a\n * stringified copy.\n *\n * @module\n */\nimport {\n OoxmlMimeType,\n appendContentType,\n appendOverride,\n appendRelationship,\n applyCorePropertiesOverride,\n getNextRelationshipIndex,\n nextNumericId,\n strFromU8,\n toJson,\n unzipSync,\n zipAndConvert,\n} from \"@office-open/core\";\nimport type {\n BasePatchOptions,\n CorePropertiesOptions,\n OutputByType,\n OutputType,\n} from \"@office-open/core\";\nimport { toUint8Array } from \"@office-open/core\";\nimport type { ReadContext, WriteContext } from \"@office-open/core/descriptor\";\nimport { js2xml } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { commentsDesc, vmlNotesDesc } from \"@parts/comments\";\nimport { SharedStrings, sharedStringsDesc } from \"@parts/shared-strings\";\nimport { buildWorksheetXml } from \"@parts/worksheet\";\nimport type { CommentOptions, WorksheetOptions } from \"@parts/worksheet\";\n\n/** Reusable TextEncoder (stateless, safe to share). */\nconst encoder = new TextEncoder();\n\n/** Scalar cell value accepted by {@link patchWorkbook}. */\nexport type ScalarValue = string | number | boolean | Date;\n\n/** A patch value is just a scalar. */\nexport type Patch = ScalarValue;\n\nexport interface PatchWorkbookOptions<\n T extends OutputType = OutputType,\n> extends BasePatchOptions<T> {\n /** Placeholder substitutions: `{{key}}` (per delimiters) → value. */\n placeholders?: Readonly<Record<string, ScalarValue>>;\n /** Literal find/replace: the find string → value (no delimiters added). */\n findReplace?: Readonly<Record<string, ScalarValue>>;\n /** Core-properties metadata override (merged over the existing docProps/core.xml). */\n coreProperties?: Partial<CorePropertiesOptions>;\n /**\n * Worksheet collection edits. The shared-strings table is rebuilt from the\n * template first, so appended/replaced worksheets continue indexing strings\n * at the correct offset. Cell styles are not supported on appended rows —\n * reference only styles already present in the template.\n */\n worksheets?: {\n /** Replace worksheets keyed by sheet name (as declared in workbook.xml). */\n replace?: Readonly<Record<string, WorksheetOptions>>;\n /** Append worksheets after the last existing sheet. */\n append?: Readonly<WorksheetOptions[]>;\n };\n /**\n * Cell comments (notes) to append per worksheet. Existing comments on the\n * target worksheet are merged — parsed, extended with the new entries, and\n * re-serialized. Keyed by worksheet name (as declared in workbook.xml).\n */\n comments?: Readonly<Record<string, CommentOptions[]>>;\n}\n\n// Excel serial-date epoch: 1899-12-30 accounts for the spurious 1900 leap year.\nconst EXCEL_EPOCH_MS = Date.UTC(1899, 11, 30);\nconst MS_PER_DAY = 86_400_000;\n\nconst WORKSHEET_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\";\nconst WORKSHEET_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\";\nconst COMMENTS_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\";\nconst VML_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\";\nconst COMMENTS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\";\nconst VML_CONTENT_TYPE = \"application/vnd.openxmlformats-officedocument.vmlDrawing\";\n\n/**\n * sharedStringsDesc.parse ignores its context, but its signature requires a\n * {@link ReadContext}. This stub satisfies the type without pulling in parse\n * machinery the patch path does not need.\n */\nconst STUB_READ_CTX: ReadContext = {\n resolveRelationship: () => undefined,\n getPart: () => undefined,\n getRaw: () => undefined,\n};\n\nconst toExcelSerial = (date: Date): number => (date.getTime() - EXCEL_EPOCH_MS) / MS_PER_DAY;\n\n/** Human-readable form for string-substitution (mixed-text) fallback. */\nconst toDisplayString = (value: Exclude<ScalarValue, string>): string => {\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (value instanceof Date) return value.toISOString().split(\"T\")[0];\n return String(value);\n};\n\n/**\n * Patch an existing .xlsx workbook by replacing placeholder text in cells.\n *\n * @publicApi\n */\nexport const patchWorkbook = async <T extends OutputType = OutputType>({\n outputType,\n data,\n placeholders,\n findReplace,\n coreProperties,\n worksheets,\n comments,\n placeholderDelimiters = { start: \"{{\", end: \"}}\" } as const,\n}: PatchWorkbookOptions<T>): Promise<OutputByType[T]> => {\n const { start, end } = placeholderDelimiters;\n if (!start.trim() || !end.trim()) {\n throw new Error(\"Both start and end delimiters must be non-empty strings.\");\n }\n\n const zipContent = unzipSync(toUint8Array(data));\n\n const xmlMap = new Map<string, Element>();\n const binaryMap = new Map<string, Uint8Array>();\n // VML parts are text XML under a .vml extension — kept out of xmlMap (which\n // only holds .xml/.rels) and serialized as raw text at the end.\n const vmlFiles = new Map<string, string>();\n\n // Separate XML files from binary files\n for (const [key, value] of Object.entries(zipContent)) {\n if (key.endsWith(\".xml\") || key.endsWith(\".rels\")) {\n xmlMap.set(key, toJson(strFromU8(value)));\n } else {\n binaryMap.set(key, value);\n }\n }\n\n // Unified patch map: placeholders are delimiter-wrapped, findReplace keys are\n // literal strings. Both feed the same Pass A (typed cells) / Pass B (text) engine.\n const patchMap = new Map<string, ScalarValue>();\n if (placeholders) {\n for (const [key, value] of Object.entries(placeholders)) {\n patchMap.set(`${start}${key}${end}`, value);\n }\n }\n if (findReplace) {\n for (const [key, value] of Object.entries(findReplace)) {\n patchMap.set(key, value);\n }\n }\n\n const sharedStrings = xmlMap.get(\"xl/sharedStrings.xml\");\n const sharedTextByIndex = buildSharedTextIndex(sharedStrings);\n\n const worksheetKeys = Object.keys(zipContent).filter(\n (k) => k.startsWith(\"xl/worksheets/sheet\") && k.endsWith(\".xml\"),\n );\n\n // Pass A: rewrite pure placeholder cells to typed values (number / boolean / Date)\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (ws) rewriteTypedCells(ws, patchMap, sharedTextByIndex);\n }\n\n // Pass B: text substitution in shared strings + inline strings\n // (string-valued patches, plus non-string patches embedded in mixed text)\n if (sharedStrings) patchSharedStrings(sharedStrings, patchMap);\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (!ws) continue;\n patchWorksheetInlineStrings(ws, patchMap);\n // Pass C: print headers/footers (oddHeader/oddFooter/… literal text)\n patchHeaderFooter(ws, patchMap);\n }\n\n // Worksheet collection edits — rebuild shared strings first so appended/\n // replaced worksheets continue indexing at the right offset, then serialize.\n if (worksheets) {\n const sharedStrings = rebuildSharedStrings(xmlMap);\n if (worksheets.replace) {\n for (const [name, wsOpts] of Object.entries(worksheets.replace)) {\n replaceWorksheetInMap(xmlMap, name, wsOpts, sharedStrings);\n }\n }\n if (worksheets.append) {\n for (const wsOpts of worksheets.append) {\n appendWorksheetToMap(xmlMap, wsOpts, sharedStrings);\n }\n }\n rewriteSharedStrings(xmlMap, sharedStrings);\n }\n\n // Cell comments — append per worksheet, merging with any existing comments.\n if (comments) {\n for (const [sheetName, commentOpts] of Object.entries(comments)) {\n appendCommentsToMap(xmlMap, vmlFiles, sheetName, commentOpts);\n }\n }\n\n // Rebuild ZIP\n const files: Record<string, Uint8Array> = {};\n const XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n for (const [key, value] of xmlMap) {\n files[key] =\n key === \"docProps/core.xml\" && coreProperties\n ? encoder.encode(XML_DECL + applyCorePropertiesOverride(value, coreProperties))\n : encoder.encode(js2xml(value));\n }\n for (const [key, value] of binaryMap) {\n files[key] = value;\n }\n for (const [key, value] of vmlFiles) {\n files[key] = encoder.encode(value);\n }\n\n return await zipAndConvert(files, outputType, OoxmlMimeType.XLSX);\n};\n\n/** Map each `<si>` shared-string index to its flattened text. */\nfunction buildSharedTextIndex(sst: Element | undefined): Map<number, string> {\n const map = new Map<number, string>();\n if (!sst) return map;\n const root = sst.name ? sst : sst.elements?.[0];\n let idx = 0;\n for (const si of root?.elements ?? []) {\n if (si.name !== \"si\") continue;\n map.set(idx, flattenText(si));\n idx++;\n }\n return map;\n}\n\n/**\n * Pass A — for each cell whose entire text is a non-string placeholder, rewrite\n * the cell to a typed value cell (`<v>` with the correct `t`).\n */\nfunction rewriteTypedCells(\n ws: Element,\n patchMap: Map<string, ScalarValue>,\n sharedTextByIndex: Map<number, string>,\n): void {\n const root = ws.name ? ws : ws.elements?.[0];\n const sheetData = root && findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n const text = effectiveCellText(cell, sharedTextByIndex);\n if (text === undefined) continue;\n\n for (const [placeholder, value] of patchMap) {\n if (typeof value === \"string\") continue; // Pass B handles string values\n if (text === placeholder) {\n rewriteCellToValue(cell, value);\n break; // a pure cell holds a single placeholder\n }\n }\n }\n }\n}\n\n/** Resolve the displayed text of a string/inline-string cell, else undefined. */\nfunction effectiveCellText(\n cell: Element,\n sharedTextByIndex: Map<number, string>,\n): string | undefined {\n const t = cell.attributes?.[\"t\"];\n if (t === \"inlineStr\") {\n const isEl = findLocalChild(cell, \"is\");\n return isEl ? flattenText(isEl) : undefined;\n }\n if (t === \"s\") {\n const v = findLocalChild(cell, \"v\");\n const raw = v?.elements?.[0]?.text;\n const idx = Number(raw);\n return Number.isNaN(idx) ? undefined : sharedTextByIndex.get(idx);\n }\n return undefined;\n}\n\n/** Rewrite a cell element to a typed value (`<v>` with the correct `t`). */\nfunction rewriteCellToValue(cell: Element, value: Exclude<ScalarValue, string>): void {\n const attrs = cell.attributes ?? (cell.attributes = {});\n let vText: string;\n if (typeof value === \"boolean\") {\n attrs[\"t\"] = \"b\";\n vText = value ? \"1\" : \"0\";\n } else if (value instanceof Date) {\n delete attrs[\"t\"]; // serial date is numeric\n vText = String(toExcelSerial(value));\n } else {\n delete attrs[\"t\"]; // plain numeric\n vText = String(value);\n }\n cell.elements = [{ type: \"element\", name: \"v\", elements: [{ type: \"text\", text: vText }] }];\n}\n\n/** Pass B — substitute placeholders in shared-string `<si>` text. */\nfunction patchSharedStrings(sst: Element, patchMap: Map<string, ScalarValue>): void {\n const root = sst.name ? sst : sst.elements?.[0];\n if (!root) return;\n\n for (const si of root.elements ?? []) {\n if (si.name !== \"si\") continue;\n\n // Simple: <si><t>text</t></si>\n const t = findLocalChild(si, \"t\");\n if (t) {\n patchTextElement(t, patchMap);\n } else {\n // Rich text: <si><r><t>text</t></r>...</si>\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findLocalChild(r, \"t\");\n if (rt) patchTextElement(rt, patchMap);\n }\n }\n }\n}\n\n/** Pass B — substitute placeholders in worksheet inline strings. */\nfunction patchWorksheetInlineStrings(ws: Element, patchMap: Map<string, ScalarValue>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n\n const sheetData = findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n\n // Inline strings: <c t=\"inlineStr\"><is><t>text</t></is></c>\n const isEl = findLocalChild(cell, \"is\");\n if (isEl) {\n const t = findLocalChild(isEl, \"t\");\n if (t) patchTextElement(t, patchMap);\n }\n }\n }\n}\n\nconst HEADER_FOOTER_NAMES = new Set([\n \"oddHeader\",\n \"oddFooter\",\n \"evenHeader\",\n \"evenFooter\",\n \"firstHeader\",\n \"firstFooter\",\n]);\n\n/**\n * Pass C — substitute placeholders in worksheet print header/footer text.\n * Header/footer children (oddHeader/oddFooter/…) carry their text directly\n * (not wrapped in `<t>`), so this is a substring substitution on the element's\n * own text node.\n */\nfunction patchHeaderFooter(ws: Element, patchMap: Map<string, ScalarValue>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n const headerFooter = findLocalChild(root, \"headerFooter\");\n if (!headerFooter) return;\n\n for (const part of headerFooter.elements ?? []) {\n if (part.type !== \"element\" || !HEADER_FOOTER_NAMES.has(localName(part))) continue;\n const textNode = part.elements?.[0];\n if (!textNode || typeof textNode.text !== \"string\") continue;\n\n let replaced = textNode.text;\n for (const [placeholder, value] of patchMap) {\n if (!replaced.includes(placeholder)) continue;\n const display = typeof value === \"string\" ? value : toDisplayString(value);\n replaced = replaced.split(placeholder).join(display);\n }\n if (replaced !== textNode.text) {\n part.elements![0] = { ...textNode, text: replaced };\n }\n }\n}\n\n/** Substitute any placeholder substring in a `<t>` element's text. */\nfunction patchTextElement(tEl: Element, patchMap: Map<string, ScalarValue>): void {\n const textNode = tEl.elements?.[0];\n const text = textNode?.text;\n if (typeof text !== \"string\") return;\n\n let replaced = text;\n for (const [placeholder, value] of patchMap) {\n if (!replaced.includes(placeholder)) continue;\n const display = typeof value === \"string\" ? value : toDisplayString(value);\n replaced = replaced.split(placeholder).join(display);\n }\n if (replaced !== text && tEl.elements) {\n tEl.elements[0] = { ...textNode, text: replaced };\n }\n}\n\n/** Flatten all descendant text of an element into a single string. */\nfunction flattenText(el: Element): string {\n let out = \"\";\n for (const child of el.elements ?? []) {\n if (child.type === \"text\") {\n out += child.text ?? \"\";\n } else if (child.type === \"element\") {\n out += flattenText(child);\n }\n }\n return out;\n}\n\nfunction localName(el: Element): string {\n const name = el.name ?? \"\";\n const colonIdx = name.indexOf(\":\");\n return colonIdx >= 0 ? name.slice(colonIdx + 1) : name;\n}\n\nfunction findLocalChild(parent: Element, name: string): Element | undefined {\n return (parent.elements ?? []).find((el) => localName(el) === name);\n}\n\n// ── Worksheet collection edits (append / replace) ──\n\n/** Unwrap the document element: a parsed part is `{ declaration, elements: [<root>] }`. */\nfunction rootOf(doc: Element | undefined): Element | undefined {\n return doc && (doc.name ? doc : doc.elements?.[0]);\n}\n\n/** Build a bare element node with the given attributes. */\nfunction makeElement(name: string, attributes: Record<string, string> = {}): Element {\n return { type: \"element\", name, attributes, elements: [] };\n}\n\n/** Empty `<Relationships>` part (wrapped for js2xml serialization). */\nfunction createRelationshipFile(): Element {\n return {\n declaration: { attributes: { encoding: \"UTF-8\", standalone: \"yes\", version: \"1.0\" } },\n elements: [\n {\n attributes: { xmlns: \"http://schemas.openxmlformats.org/package/2006/relationships\" },\n elements: [],\n name: \"Relationships\",\n type: \"element\",\n },\n ],\n };\n}\n\n/** Next 1-based worksheet file number given existing worksheet parts. */\nfunction nextWorksheetNumber(xmlMap: Map<string, Element>): number {\n let maxN = 0;\n for (const key of xmlMap.keys()) {\n const m = key.match(/^xl\\/worksheets\\/sheet(\\d+)\\.xml$/);\n if (m) maxN = Math.max(maxN, Number(m[1]));\n }\n return maxN + 1;\n}\n\n/** Next `sheetId` for an appended `<sheet>` entry. */\nfunction nextSheetId(sheetsEl: Element | undefined): number {\n return nextNumericId(sheetsEl, \"sheet\", \"sheetId\", 0);\n}\n\n/** Resolve a relationship `rId` to its Target via a rels part root. */\nfunction resolveRelTarget(relsRoot: Element | undefined, rId: string): string | undefined {\n for (const child of relsRoot?.elements ?? []) {\n if (localName(child) === \"Relationship\" && String(child.attributes?.[\"Id\"]) === rId) {\n const target = child.attributes?.[\"Target\"];\n return target !== undefined ? String(target) : undefined;\n }\n }\n return undefined;\n}\n\n/** Rebuild the shared-strings table from the template so new sheets extend it. */\nfunction rebuildSharedStrings(xmlMap: Map<string, Element>): SharedStrings {\n const ss = new SharedStrings();\n const sstRoot = rootOf(xmlMap.get(\"xl/sharedStrings.xml\"));\n if (sstRoot) {\n ss.loadEntries(sharedStringsDesc.parse(sstRoot, STUB_READ_CTX).entries);\n }\n return ss;\n}\n\n/** Re-serialize the shared-strings part (called after worksheets are built). */\nfunction rewriteSharedStrings(xmlMap: Map<string, Element>, ss: SharedStrings): void {\n if (ss.count === 0) return;\n xmlMap.set(\n \"xl/sharedStrings.xml\",\n toJson(`<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${ss.serialize()}`),\n );\n}\n\n/**\n * Append a worksheet: serialize it (registering strings into the shared-strings\n * table), then wire workbook `<sheets>` + workbook rels + content types.\n */\nfunction appendWorksheetToMap(\n xmlMap: Map<string, Element>,\n wsOpts: WorksheetOptions,\n sharedStrings: SharedStrings,\n): void {\n const newN = nextWorksheetNumber(xmlMap);\n const sheetPath = `xl/worksheets/sheet${newN}.xml`;\n const sheetName = wsOpts.name ?? `Sheet${newN}`;\n\n // Worksheet part (no XML declaration — matches generated worksheet parts)\n xmlMap.set(sheetPath, toJson(buildWorksheetXml(wsOpts, { sharedStrings })));\n\n // workbook.xml <sheets> + workbook.xml.rels (the new rId ties them)\n const wbRoot = rootOf(xmlMap.get(\"xl/workbook.xml\"));\n const wbSheets = wbRoot && findLocalChild(wbRoot, \"sheets\");\n const wbRels = xmlMap.get(\"xl/_rels/workbook.xml.rels\") ?? createRelationshipFile();\n xmlMap.set(\"xl/_rels/workbook.xml.rels\", wbRels);\n const newRId = getNextRelationshipIndex(wbRels);\n\n if (wbSheets) {\n const els = wbSheets.elements ?? (wbSheets.elements = []);\n els.push(\n makeElement(\"sheet\", {\n name: sheetName,\n sheetId: String(nextSheetId(wbSheets)),\n \"r:id\": `rId${newRId}`,\n }),\n );\n }\n appendRelationship(wbRels, newRId, WORKSHEET_REL_TYPE, `worksheets/sheet${newN}.xml`);\n\n // [Content_Types].xml Override\n const contentTypes = xmlMap.get(\"[Content_Types].xml\");\n if (contentTypes) {\n appendOverride(contentTypes, `/${sheetPath}`, WORKSHEET_CONTENT_TYPE);\n }\n}\n\n/** Normalize a worksheet name to its full part path via workbook.xml + rels. */\nfunction resolveSheetPath(xmlMap: Map<string, Element>, name: string): string {\n const wbRoot = rootOf(xmlMap.get(\"xl/workbook.xml\"));\n const wbSheets = wbRoot && findLocalChild(wbRoot, \"sheets\");\n const sheetEls = (wbSheets?.elements ?? []).filter((e) => localName(e) === \"sheet\");\n const target = sheetEls.find((e) => String(e.attributes?.[\"name\"]) === name);\n if (!target?.attributes?.[\"r:id\"]) {\n throw new Error(`patchWorkbook: no worksheet named \"${name}\"`);\n }\n const relTarget = resolveRelTarget(\n rootOf(xmlMap.get(\"xl/_rels/workbook.xml.rels\")),\n String(target.attributes[\"r:id\"]),\n );\n if (!relTarget) {\n throw new Error(`patchWorkbook: worksheet \"${name}\" relationship target not found`);\n }\n if (relTarget.startsWith(\"/\")) return relTarget.slice(1);\n return relTarget.startsWith(\"xl/\") ? relTarget : `xl/${relTarget}`;\n}\n\n/**\n * Replace a worksheet by name: resolve the name to its part via workbook rels,\n * then rewrite only that part's content. Sheet identity, rId, and content types\n * are unchanged.\n */\nfunction replaceWorksheetInMap(\n xmlMap: Map<string, Element>,\n name: string,\n wsOpts: WorksheetOptions,\n sharedStrings: SharedStrings,\n): void {\n const sheetPath = resolveSheetPath(xmlMap, name);\n xmlMap.set(sheetPath, toJson(buildWorksheetXml(wsOpts, { sharedStrings })));\n}\n\n/** Build the rels part path for a given part path (…/_rels/<file>.rels). */\nfunction relsKeyFor(partPath: string): string {\n const slash = partPath.lastIndexOf(\"/\");\n return `${partPath.substring(0, slash)}/_rels/${partPath.substring(slash + 1)}.rels`;\n}\n\n/** Find an existing relationship of a type in a rels root: { id, target }. */\nfunction findRelByType(\n relsRoot: Element | undefined,\n type: string,\n): { id: string; target: string } | undefined {\n for (const child of relsRoot?.elements ?? []) {\n if (localName(child) === \"Relationship\" && String(child.attributes?.[\"Type\"]) === type) {\n const target = child.attributes?.[\"Target\"];\n if (target !== undefined) {\n return { id: String(child.attributes?.[\"Id\"]), target: String(target) };\n }\n }\n }\n return undefined;\n}\n\n/** Largest existing comments file number (xl/comments{n}.xml), for append offset. */\nfunction nextCommentsNumber(xmlMap: Map<string, Element>): number {\n let maxN = 0;\n for (const key of xmlMap.keys()) {\n const m = key.match(/^xl\\/comments(\\d+)\\.xml$/);\n if (m) maxN = Math.max(maxN, Number(m[1]));\n }\n return maxN + 1;\n}\n\n/**\n * Insert `<legacyDrawing>` into a worksheet, after `<drawing>` and before the\n * trailing collection elements (CT_Worksheet sequence order). Skipped when one\n * already exists.\n */\nfunction insertLegacyDrawing(wsRoot: Element, rId: string): void {\n const els = wsRoot.elements ?? (wsRoot.elements = []);\n if (els.some((e) => localName(e) === \"legacyDrawing\")) return;\n const legacy = makeElement(\"legacyDrawing\", { \"r:id\": rId });\n const afterLegacy = new Set([\n \"tableParts\",\n \"extLst\",\n \"oleObjects\",\n \"controls\",\n \"picture\",\n \"webPublishItems\",\n ]);\n let insertAt = els.length;\n for (let i = 0; i < els.length; i++) {\n if (afterLegacy.has(localName(els[i]))) {\n insertAt = i;\n break;\n }\n }\n els.splice(insertAt, 0, legacy);\n}\n\n/** commentsDesc.stringify ignores its context; this satisfies the WriteContext type. */\nconst STUB_WRITE_CTX = {} as unknown as WriteContext;\n\n/**\n * Append cell comments to a worksheet, merging with any existing comments part.\n * Wires commentsN.xml + vmlDrawingN.vml (reusing the existing pair when present),\n * the worksheet relationships, the `<legacyDrawing>` anchor, and content types.\n * VML text is written to {@link vmlFiles} (not xmlMap) because of its extension.\n */\nfunction appendCommentsToMap(\n xmlMap: Map<string, Element>,\n vmlFiles: Map<string, string>,\n sheetName: string,\n commentOpts: CommentOptions[],\n): void {\n const sheetPath = resolveSheetPath(xmlMap, sheetName);\n const wsRelsKey = relsKeyFor(sheetPath);\n const wsRels = xmlMap.get(wsRelsKey) ?? createRelationshipFile();\n xmlMap.set(wsRelsKey, wsRels);\n\n // Reuse the worksheet's existing comments/vmlDrawing relationships when present.\n const existingComments = findRelByType(rootOf(wsRels), COMMENTS_REL_TYPE);\n const existingVml = findRelByType(rootOf(wsRels), VML_REL_TYPE);\n\n const commentsN = existingComments\n ? Number((existingComments.target.match(/comments(\\d+)\\.xml$/) ?? [])[1]) ||\n nextCommentsNumber(xmlMap)\n : nextCommentsNumber(xmlMap);\n const commentsPath = `xl/comments${commentsN}.xml`;\n // Reuse the existing vmlDrawing path when present — its index can differ from\n // the comments index in third-party files.\n const vmlPath = existingVml\n ? `xl/drawings/${existingVml.target.slice(existingVml.target.lastIndexOf(\"/\") + 1)}`\n : `xl/drawings/vmlDrawing${commentsN}.vml`;\n\n // Merge with the existing comments part if it was already in the package.\n const existingPart = rootOf(xmlMap.get(commentsPath));\n let merged = commentOpts;\n if (existingPart) {\n merged = [...commentsDesc.parse(existingPart, STUB_READ_CTX).comments, ...commentOpts];\n }\n\n const commentsXml = commentsDesc.stringify({ comments: merged }, STUB_WRITE_CTX);\n if (commentsXml) {\n xmlMap.set(\n commentsPath,\n toJson(`<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${commentsXml}`),\n );\n }\n const vmlXml = vmlNotesDesc.stringify({ comments: merged }, STUB_WRITE_CTX);\n if (vmlXml) {\n vmlFiles.set(vmlPath, `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${vmlXml}`);\n }\n\n // Worksheet relationships — added only when the part is newly introduced.\n if (!existingComments) {\n const n = getNextRelationshipIndex(wsRels);\n appendRelationship(wsRels, n, COMMENTS_REL_TYPE, `../comments${commentsN}.xml`);\n }\n let vmlRidRef: string;\n if (existingVml) {\n vmlRidRef = existingVml.id;\n } else {\n const n = getNextRelationshipIndex(wsRels);\n appendRelationship(wsRels, n, VML_REL_TYPE, `../drawings/vmlDrawing${commentsN}.vml`);\n vmlRidRef = `rId${n}`;\n }\n\n // `<legacyDrawing>` anchor on the worksheet (deduped).\n const wsRoot = rootOf(xmlMap.get(sheetPath));\n if (wsRoot) insertLegacyDrawing(wsRoot, vmlRidRef);\n\n // Content types — comments Override (new part only) + vml Default (deduped).\n const contentTypes = xmlMap.get(\"[Content_Types].xml\");\n if (contentTypes) {\n if (!existingPart) {\n appendOverride(contentTypes, `/${commentsPath}`, COMMENTS_CONTENT_TYPE);\n }\n appendContentType(contentTypes, VML_CONTENT_TYPE, \"vml\");\n }\n}\n"],"mappings":"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"}