@office-kit/xlsx 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/THIRD_PARTY_NOTICES.md +56 -0
  4. package/dist/cell/cell.d.ts +234 -0
  5. package/dist/cell/index.d.ts +4 -0
  6. package/dist/cell/rich-text.d.ts +37 -0
  7. package/dist/cell-D9CaNKnU.mjs +320 -0
  8. package/dist/cell-D9CaNKnU.mjs.map +1 -0
  9. package/dist/cell-style-BEDjMX1y.mjs +1579 -0
  10. package/dist/cell-style-BEDjMX1y.mjs.map +1 -0
  11. package/dist/cell.mjs +2 -0
  12. package/dist/chart/chart-xml.d.ts +16 -0
  13. package/dist/chart/chart.d.ts +735 -0
  14. package/dist/chart/cx/chartex-xml.d.ts +6 -0
  15. package/dist/chart/cx/chartex.d.ts +279 -0
  16. package/dist/chart/index.d.ts +6 -0
  17. package/dist/chart/user-shapes-xml.d.ts +4 -0
  18. package/dist/chart/user-shapes.d.ts +61 -0
  19. package/dist/chart.mjs +232 -0
  20. package/dist/chart.mjs.map +1 -0
  21. package/dist/chartsheet/chartsheet-xml.d.ts +17 -0
  22. package/dist/chartsheet/chartsheet.d.ts +121 -0
  23. package/dist/chartsheet/index.d.ts +2 -0
  24. package/dist/chartsheet-C3-tqkPy.mjs +23 -0
  25. package/dist/chartsheet-C3-tqkPy.mjs.map +1 -0
  26. package/dist/chartsheet.mjs +2 -0
  27. package/dist/colors-ovWAwnZI.mjs +67 -0
  28. package/dist/colors-ovWAwnZI.mjs.map +1 -0
  29. package/dist/compat/numbers.d.ts +14 -0
  30. package/dist/coordinate-96Ecci4d.mjs +276 -0
  31. package/dist/coordinate-96Ecci4d.mjs.map +1 -0
  32. package/dist/datetime-B2ySVlXt.mjs +71 -0
  33. package/dist/datetime-B2ySVlXt.mjs.map +1 -0
  34. package/dist/defined-names-CviWmtQg.mjs +89 -0
  35. package/dist/defined-names-CviWmtQg.mjs.map +1 -0
  36. package/dist/differential-D4dg-qtZ.mjs +37 -0
  37. package/dist/differential-D4dg-qtZ.mjs.map +1 -0
  38. package/dist/drawing/anchor.d.ts +63 -0
  39. package/dist/drawing/dml/colors.d.ts +109 -0
  40. package/dist/drawing/dml/dml-xml.d.ts +35 -0
  41. package/dist/drawing/dml/effect.d.ts +92 -0
  42. package/dist/drawing/dml/fill.d.ts +115 -0
  43. package/dist/drawing/dml/geometry.d.ts +113 -0
  44. package/dist/drawing/dml/line.d.ts +41 -0
  45. package/dist/drawing/dml/shape-properties.d.ts +33 -0
  46. package/dist/drawing/dml/text.d.ts +218 -0
  47. package/dist/drawing/drawing-xml.d.ts +5 -0
  48. package/dist/drawing/drawing.d.ts +117 -0
  49. package/dist/drawing/image.d.ts +40 -0
  50. package/dist/drawing/index.d.ts +14 -0
  51. package/dist/drawing-BxzLuryn.mjs +415 -0
  52. package/dist/drawing-BxzLuryn.mjs.map +1 -0
  53. package/dist/drawing.mjs +119 -0
  54. package/dist/drawing.mjs.map +1 -0
  55. package/dist/escape-DFTE7ZJc.mjs +51 -0
  56. package/dist/escape-DFTE7ZJc.mjs.map +1 -0
  57. package/dist/exceptions-D-CFwxgm.mjs +37 -0
  58. package/dist/exceptions-D-CFwxgm.mjs.map +1 -0
  59. package/dist/formula/tokenizer.d.ts +61 -0
  60. package/dist/formula/translate.d.ts +67 -0
  61. package/dist/inference-B3ES3KEJ.mjs +42 -0
  62. package/dist/inference-B3ES3KEJ.mjs.map +1 -0
  63. package/dist/io/browser.d.ts +41 -0
  64. package/dist/io/index.d.ts +7 -0
  65. package/dist/io/load.d.ts +46 -0
  66. package/dist/io/node-fs.d.ts +62 -0
  67. package/dist/io/node-save.d.ts +3 -0
  68. package/dist/io/node.d.ts +17 -0
  69. package/dist/io/save.d.ts +14 -0
  70. package/dist/io/sink.d.ts +54 -0
  71. package/dist/io/source.d.ts +14 -0
  72. package/dist/io.mjs +212 -0
  73. package/dist/io.mjs.map +1 -0
  74. package/dist/load-D5cbhoGx.mjs +1069 -0
  75. package/dist/load-D5cbhoGx.mjs.map +1 -0
  76. package/dist/manifest-Dps1-OpP.mjs +801 -0
  77. package/dist/manifest-Dps1-OpP.mjs.map +1 -0
  78. package/dist/node.d.ts +3 -0
  79. package/dist/node.mjs +308 -0
  80. package/dist/node.mjs.map +1 -0
  81. package/dist/packaging/core.d.ts +45 -0
  82. package/dist/packaging/custom.d.ts +62 -0
  83. package/dist/packaging/extended.d.ts +45 -0
  84. package/dist/packaging/index.d.ts +10 -0
  85. package/dist/packaging/manifest.d.ts +24 -0
  86. package/dist/packaging/relationships.d.ts +30 -0
  87. package/dist/packaging.mjs +2 -0
  88. package/dist/parser-DuLejQy1.mjs +156 -0
  89. package/dist/parser-DuLejQy1.mjs.map +1 -0
  90. package/dist/reader-D1fNW9k1.mjs +534 -0
  91. package/dist/reader-D1fNW9k1.mjs.map +1 -0
  92. package/dist/save-RohQtgEZ.mjs +745 -0
  93. package/dist/save-RohQtgEZ.mjs.map +1 -0
  94. package/dist/schema/core.d.ts +133 -0
  95. package/dist/schema/index.d.ts +3 -0
  96. package/dist/schema/serialize.d.ts +6 -0
  97. package/dist/schema.mjs +2 -0
  98. package/dist/serialize-55EnT30e.mjs +254 -0
  99. package/dist/serialize-55EnT30e.mjs.map +1 -0
  100. package/dist/serializer-BwbgHYJV.mjs +116 -0
  101. package/dist/serializer-BwbgHYJV.mjs.map +1 -0
  102. package/dist/streaming/index.d.ts +2 -0
  103. package/dist/streaming/read-only.d.ts +38 -0
  104. package/dist/streaming/write-only.d.ts +47 -0
  105. package/dist/streaming.mjs +612 -0
  106. package/dist/streaming.mjs.map +1 -0
  107. package/dist/styles/alignment.d.ts +33 -0
  108. package/dist/styles/alignment.schema.d.ts +3 -0
  109. package/dist/styles/borders.d.ts +40 -0
  110. package/dist/styles/borders.schema.d.ts +4 -0
  111. package/dist/styles/cell-style.d.ts +270 -0
  112. package/dist/styles/colors.d.ts +128 -0
  113. package/dist/styles/colors.schema.d.ts +3 -0
  114. package/dist/styles/differential.d.ts +41 -0
  115. package/dist/styles/fills.d.ts +54 -0
  116. package/dist/styles/fills.schema.d.ts +6 -0
  117. package/dist/styles/fonts.d.ts +44 -0
  118. package/dist/styles/fonts.schema.d.ts +3 -0
  119. package/dist/styles/index.d.ts +21 -0
  120. package/dist/styles/named-styles.d.ts +52 -0
  121. package/dist/styles/numbers.d.ts +39 -0
  122. package/dist/styles/numbers.schema.d.ts +3 -0
  123. package/dist/styles/protection.d.ts +9 -0
  124. package/dist/styles/protection.schema.d.ts +3 -0
  125. package/dist/styles/stylesheet-reader.d.ts +7 -0
  126. package/dist/styles/stylesheet-writer.d.ts +3 -0
  127. package/dist/styles/stylesheet.d.ts +95 -0
  128. package/dist/styles.mjs +4 -0
  129. package/dist/stylesheet-writer-C2eRmn22.mjs +8624 -0
  130. package/dist/stylesheet-writer-C2eRmn22.mjs.map +1 -0
  131. package/dist/table-DkX6UniA.mjs +113 -0
  132. package/dist/table-DkX6UniA.mjs.map +1 -0
  133. package/dist/tree-Bbs1C8Rc.mjs +192 -0
  134. package/dist/tree-Bbs1C8Rc.mjs.map +1 -0
  135. package/dist/units-rOMQqXh2.mjs +41 -0
  136. package/dist/units-rOMQqXh2.mjs.map +1 -0
  137. package/dist/user-shapes-DfmCGKB0.mjs +252 -0
  138. package/dist/user-shapes-DfmCGKB0.mjs.map +1 -0
  139. package/dist/utf8-D91g1XTG.mjs +143 -0
  140. package/dist/utf8-D91g1XTG.mjs.map +1 -0
  141. package/dist/utils/coordinate.d.ts +103 -0
  142. package/dist/utils/css.d.ts +18 -0
  143. package/dist/utils/datetime.d.ts +38 -0
  144. package/dist/utils/escape.d.ts +34 -0
  145. package/dist/utils/exceptions.d.ts +34 -0
  146. package/dist/utils/index.d.ts +11 -0
  147. package/dist/utils/inference.d.ts +24 -0
  148. package/dist/utils/stable-stringify.d.ts +7 -0
  149. package/dist/utils/units.d.ts +14 -0
  150. package/dist/utils/utf8.d.ts +1 -0
  151. package/dist/utils.mjs +39 -0
  152. package/dist/utils.mjs.map +1 -0
  153. package/dist/workbook/calc-properties.d.ts +47 -0
  154. package/dist/workbook/defined-names.d.ts +121 -0
  155. package/dist/workbook/file-recovery.d.ts +11 -0
  156. package/dist/workbook/file-sharing.d.ts +14 -0
  157. package/dist/workbook/file-version.d.ts +13 -0
  158. package/dist/workbook/function-groups.d.ts +10 -0
  159. package/dist/workbook/index.d.ts +24 -0
  160. package/dist/workbook/protection.d.ts +35 -0
  161. package/dist/workbook/shared-strings.d.ts +57 -0
  162. package/dist/workbook/smart-tags.d.ts +13 -0
  163. package/dist/workbook/views.d.ts +89 -0
  164. package/dist/workbook/workbook-properties.d.ts +57 -0
  165. package/dist/workbook/workbook.d.ts +643 -0
  166. package/dist/workbook-HGYNRBlV.mjs +636 -0
  167. package/dist/workbook-HGYNRBlV.mjs.map +1 -0
  168. package/dist/workbook.mjs +58 -0
  169. package/dist/workbook.mjs.map +1 -0
  170. package/dist/worksheet/auto-filter.d.ts +34 -0
  171. package/dist/worksheet/cell-range.d.ts +121 -0
  172. package/dist/worksheet/comments-xml.d.ts +24 -0
  173. package/dist/worksheet/comments.d.ts +13 -0
  174. package/dist/worksheet/conditional-formatting.d.ts +150 -0
  175. package/dist/worksheet/custom-sheet-views.d.ts +43 -0
  176. package/dist/worksheet/data-consolidate.d.ts +29 -0
  177. package/dist/worksheet/data-validations.d.ts +72 -0
  178. package/dist/worksheet/dimensions.d.ts +40 -0
  179. package/dist/worksheet/errors.d.ts +40 -0
  180. package/dist/worksheet/hyperlinks.d.ts +42 -0
  181. package/dist/worksheet/index.d.ts +46 -0
  182. package/dist/worksheet/ole-objects.d.ts +37 -0
  183. package/dist/worksheet/page-setup.d.ts +173 -0
  184. package/dist/worksheet/phonetic.d.ts +11 -0
  185. package/dist/worksheet/properties.d.ts +34 -0
  186. package/dist/worksheet/protected-ranges.d.ts +19 -0
  187. package/dist/worksheet/protection.d.ts +44 -0
  188. package/dist/worksheet/reader.d.ts +38 -0
  189. package/dist/worksheet/scenarios.d.ts +36 -0
  190. package/dist/worksheet/smart-tags.d.ts +23 -0
  191. package/dist/worksheet/sort-state.d.ts +28 -0
  192. package/dist/worksheet/table-xml.d.ts +5 -0
  193. package/dist/worksheet/table.d.ts +80 -0
  194. package/dist/worksheet/views.d.ts +47 -0
  195. package/dist/worksheet/web-publish.d.ts +21 -0
  196. package/dist/worksheet/worksheet.d.ts +935 -0
  197. package/dist/worksheet/writer.d.ts +72 -0
  198. package/dist/worksheet-CmCNoIgD.mjs +1726 -0
  199. package/dist/worksheet-CmCNoIgD.mjs.map +1 -0
  200. package/dist/worksheet.mjs +247 -0
  201. package/dist/worksheet.mjs.map +1 -0
  202. package/dist/writer-DspzfkNA.mjs +221 -0
  203. package/dist/writer-DspzfkNA.mjs.map +1 -0
  204. package/dist/xml/index.d.ts +10 -0
  205. package/dist/xml/iterparse.d.ts +22 -0
  206. package/dist/xml/namespaces.d.ts +91 -0
  207. package/dist/xml/parser.d.ts +7 -0
  208. package/dist/xml/serializer.d.ts +14 -0
  209. package/dist/xml/stream-writer.d.ts +39 -0
  210. package/dist/xml/tree.d.ts +37 -0
  211. package/dist/xml.mjs +140 -0
  212. package/dist/xml.mjs.map +1 -0
  213. package/dist/zip/decompression-guard.d.ts +70 -0
  214. package/dist/zip/index.d.ts +6 -0
  215. package/dist/zip/random-access-reader.d.ts +16 -0
  216. package/dist/zip/reader.d.ts +45 -0
  217. package/dist/zip/writer.d.ts +65 -0
  218. package/dist/zip/zip64-patch.d.ts +12 -0
  219. package/dist/zip.mjs +3 -0
  220. package/package.json +147 -0
package/dist/io.mjs ADDED
@@ -0,0 +1,212 @@
1
+ import { i as OpenXmlIoError } from "./exceptions-D-CFwxgm.mjs";
2
+ import { t as loadWorkbook } from "./load-D5cbhoGx.mjs";
3
+ import { n as workbookToBytes, t as saveWorkbook } from "./save-RohQtgEZ.mjs";
4
+ //#region src/io/browser.ts
5
+ /**
6
+ * Wrap a Blob (or File, since File extends Blob) as an XlsxSource. The
7
+ * source materialises bytes lazily on the first {@link XlsxSource.toBytes}
8
+ * call.
9
+ */
10
+ function fromBlob(blob) {
11
+ if (!(blob instanceof Blob)) throw new OpenXmlIoError("fromBlob expects a Blob (or File)");
12
+ return {
13
+ async toBytes() {
14
+ try {
15
+ const ab = await blob.arrayBuffer();
16
+ return new Uint8Array(ab);
17
+ } catch (cause) {
18
+ throw new OpenXmlIoError("fromBlob: failed to read blob contents", { cause });
19
+ }
20
+ },
21
+ toStream() {
22
+ return blob.stream();
23
+ }
24
+ };
25
+ }
26
+ /**
27
+ * Wrap a fetch {@link Response} as an XlsxSource. `toBytes` collects
28
+ * the entire response body via `Response.arrayBuffer()`; `toStream`
29
+ * returns `response.body` directly so the ZIP reader can pull chunks
30
+ * lazily from the network. The Response can have been fetched with
31
+ * any method and content-type; this helper does no validation.
32
+ */
33
+ function fromResponse(response) {
34
+ if (!(response instanceof Response)) throw new OpenXmlIoError("fromResponse expects a fetch Response");
35
+ let bytes;
36
+ return {
37
+ async toBytes() {
38
+ if (bytes) return bytes;
39
+ bytes = (async () => {
40
+ try {
41
+ return new Uint8Array(await response.arrayBuffer());
42
+ } catch (cause) {
43
+ throw new OpenXmlIoError("fromResponse: failed to read response body", { cause });
44
+ }
45
+ })();
46
+ return bytes;
47
+ },
48
+ toStream() {
49
+ const body = response.body;
50
+ if (!body) return new ReadableStream({ start(controller) {
51
+ controller.close();
52
+ } });
53
+ return body;
54
+ }
55
+ };
56
+ }
57
+ /**
58
+ * Wrap a Web {@link ReadableStream} of bytes as an XlsxSource. `toStream`
59
+ * returns the stream directly; `toBytes` drains it once and caches the
60
+ * bytes. Streams can only be consumed once — calling `toBytes` after
61
+ * `toStream` (or vice versa) on the same source throws.
62
+ */
63
+ function fromStream(stream) {
64
+ if (!(stream instanceof ReadableStream)) throw new OpenXmlIoError("fromStream expects a ReadableStream<Uint8Array>");
65
+ let consumed = false;
66
+ let bytes;
67
+ return {
68
+ async toBytes() {
69
+ if (bytes) return bytes;
70
+ if (consumed) throw new OpenXmlIoError("fromStream: stream already consumed via toStream()");
71
+ consumed = true;
72
+ bytes = (async () => {
73
+ const chunks = [];
74
+ const reader = stream.getReader();
75
+ try {
76
+ while (true) {
77
+ const { done, value } = await reader.read();
78
+ if (done) break;
79
+ if (value) chunks.push(value);
80
+ }
81
+ } finally {
82
+ reader.releaseLock();
83
+ }
84
+ let total = 0;
85
+ for (const c of chunks) total += c.byteLength;
86
+ const out = new Uint8Array(total);
87
+ let off = 0;
88
+ for (const c of chunks) {
89
+ out.set(c, off);
90
+ off += c.byteLength;
91
+ }
92
+ return out;
93
+ })();
94
+ return bytes;
95
+ },
96
+ toStream() {
97
+ if (bytes) throw new OpenXmlIoError("fromStream: bytes already consumed via toBytes()");
98
+ if (consumed) throw new OpenXmlIoError("fromStream: stream already consumed");
99
+ consumed = true;
100
+ return stream;
101
+ }
102
+ };
103
+ }
104
+ /**
105
+ * Wrap an ArrayBuffer or Uint8Array. The bytes are referenced (Uint8Array
106
+ * input) or wrapped without copy (ArrayBuffer input).
107
+ */
108
+ function fromArrayBuffer(buf) {
109
+ let bytes;
110
+ if (buf instanceof Uint8Array) bytes = buf;
111
+ else if (buf instanceof ArrayBuffer) bytes = new Uint8Array(buf);
112
+ else throw new OpenXmlIoError("fromArrayBuffer expects an ArrayBuffer or Uint8Array");
113
+ return {
114
+ async toBytes() {
115
+ return bytes;
116
+ },
117
+ toStream() {
118
+ return new ReadableStream({ start(controller) {
119
+ controller.enqueue(bytes);
120
+ controller.close();
121
+ } });
122
+ }
123
+ };
124
+ }
125
+ const collectChunks = (chunks) => {
126
+ let total = 0;
127
+ for (const c of chunks) total += c.byteLength;
128
+ const out = new Uint8Array(total);
129
+ let off = 0;
130
+ for (const c of chunks) {
131
+ out.set(c, off);
132
+ off += c.byteLength;
133
+ }
134
+ return out;
135
+ };
136
+ /**
137
+ * In-memory Blob sink. Convenience `result()` returns the accumulated
138
+ * payload as a Blob with the supplied MIME type.
139
+ */
140
+ function toBlob(mime = "application/octet-stream") {
141
+ const chunks = [];
142
+ let finalised;
143
+ const finalise = () => {
144
+ if (finalised !== void 0) return finalised;
145
+ finalised = collectChunks(chunks);
146
+ chunks.length = 0;
147
+ return finalised;
148
+ };
149
+ return {
150
+ toBytes() {
151
+ return {
152
+ write(chunk) {
153
+ if (finalised !== void 0) throw new OpenXmlIoError("toBlob sink: write after finish");
154
+ if (!(chunk instanceof Uint8Array)) throw new OpenXmlIoError("toBlob sink: chunk is not a Uint8Array");
155
+ chunks.push(chunk);
156
+ },
157
+ async finish() {
158
+ return finalise();
159
+ },
160
+ abort() {
161
+ if (finalised !== void 0) return;
162
+ finalised = new Uint8Array(0);
163
+ chunks.length = 0;
164
+ }
165
+ };
166
+ },
167
+ result() {
168
+ const bytes = finalise();
169
+ return new Blob([bytes.slice()], { type: mime });
170
+ }
171
+ };
172
+ }
173
+ /** In-memory ArrayBuffer sink. */
174
+ function toArrayBuffer() {
175
+ const chunks = [];
176
+ let finalised;
177
+ const finalise = () => {
178
+ if (finalised !== void 0) return finalised;
179
+ finalised = collectChunks(chunks);
180
+ chunks.length = 0;
181
+ return finalised;
182
+ };
183
+ return {
184
+ toBytes() {
185
+ return {
186
+ write(chunk) {
187
+ if (finalised !== void 0) throw new OpenXmlIoError("toArrayBuffer sink: write after finish");
188
+ if (!(chunk instanceof Uint8Array)) throw new OpenXmlIoError("toArrayBuffer sink: chunk is not a Uint8Array");
189
+ chunks.push(chunk);
190
+ },
191
+ async finish() {
192
+ return finalise();
193
+ },
194
+ abort() {
195
+ if (finalised !== void 0) return;
196
+ finalised = new Uint8Array(0);
197
+ chunks.length = 0;
198
+ }
199
+ };
200
+ },
201
+ result() {
202
+ const bytes = finalise();
203
+ const out = new ArrayBuffer(bytes.byteLength);
204
+ new Uint8Array(out).set(bytes);
205
+ return out;
206
+ }
207
+ };
208
+ }
209
+ //#endregion
210
+ export { fromArrayBuffer, fromBlob, fromResponse, fromStream, loadWorkbook, saveWorkbook, toArrayBuffer, toBlob, workbookToBytes };
211
+
212
+ //# sourceMappingURL=io.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.mjs","names":[],"sources":["../src/io/browser.ts"],"sourcesContent":["// Browser-target I/O helpers. Phase-1 §1: synchronous in-memory paths.\n// Response / streaming-WritableStream bridges land alongside the\n// streaming ZIP work in §2.\n//\n// Node 18+ provides Blob / File / FormData / fetch / Web Streams natively,\n// so this module is also exercised by the Node-hosted vitest runner.\n\nimport { OpenXmlIoError } from '../utils/exceptions';\nimport type { BufferedSinkWriter, XlsxSink } from './sink';\nimport type { XlsxSource } from './source';\n\n/**\n * Wrap a Blob (or File, since File extends Blob) as an XlsxSource. The\n * source materialises bytes lazily on the first {@link XlsxSource.toBytes}\n * call.\n */\nexport function fromBlob(blob: Blob): XlsxSource {\n if (!(blob instanceof Blob)) {\n throw new OpenXmlIoError('fromBlob expects a Blob (or File)');\n }\n return {\n async toBytes() {\n try {\n const ab = await blob.arrayBuffer();\n return new Uint8Array(ab);\n } catch (cause) {\n throw new OpenXmlIoError('fromBlob: failed to read blob contents', { cause });\n }\n },\n toStream() {\n return blob.stream();\n },\n };\n}\n\n/**\n * Wrap a fetch {@link Response} as an XlsxSource. `toBytes` collects\n * the entire response body via `Response.arrayBuffer()`; `toStream`\n * returns `response.body` directly so the ZIP reader can pull chunks\n * lazily from the network. The Response can have been fetched with\n * any method and content-type; this helper does no validation.\n */\nexport function fromResponse(response: Response): XlsxSource {\n if (!(response instanceof Response)) {\n throw new OpenXmlIoError('fromResponse expects a fetch Response');\n }\n let bytes: Promise<Uint8Array> | undefined;\n return {\n async toBytes() {\n if (bytes) return bytes;\n bytes = (async () => {\n try {\n return new Uint8Array(await response.arrayBuffer());\n } catch (cause) {\n throw new OpenXmlIoError('fromResponse: failed to read response body', { cause });\n }\n })();\n return bytes;\n },\n toStream() {\n const body = response.body;\n if (!body) {\n // Bodyless responses (HEAD / 204 / 304) — return an empty stream.\n return new ReadableStream<Uint8Array>({\n start(controller) {\n controller.close();\n },\n });\n }\n return body;\n },\n };\n}\n\n/**\n * Wrap a Web {@link ReadableStream} of bytes as an XlsxSource. `toStream`\n * returns the stream directly; `toBytes` drains it once and caches the\n * bytes. Streams can only be consumed once — calling `toBytes` after\n * `toStream` (or vice versa) on the same source throws.\n */\nexport function fromStream(stream: ReadableStream<Uint8Array>): XlsxSource {\n if (!(stream instanceof ReadableStream)) {\n throw new OpenXmlIoError('fromStream expects a ReadableStream<Uint8Array>');\n }\n let consumed = false;\n let bytes: Promise<Uint8Array> | undefined;\n return {\n async toBytes() {\n if (bytes) return bytes;\n if (consumed) {\n throw new OpenXmlIoError('fromStream: stream already consumed via toStream()');\n }\n consumed = true;\n bytes = (async () => {\n const chunks: Uint8Array[] = [];\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n let total = 0;\n for (const c of chunks) total += c.byteLength;\n const out = new Uint8Array(total);\n let off = 0;\n for (const c of chunks) {\n out.set(c, off);\n off += c.byteLength;\n }\n return out;\n })();\n return bytes;\n },\n toStream() {\n if (bytes) {\n throw new OpenXmlIoError('fromStream: bytes already consumed via toBytes()');\n }\n if (consumed) {\n throw new OpenXmlIoError('fromStream: stream already consumed');\n }\n consumed = true;\n return stream;\n },\n };\n}\n\n/**\n * Wrap an ArrayBuffer or Uint8Array. The bytes are referenced (Uint8Array\n * input) or wrapped without copy (ArrayBuffer input).\n */\nexport function fromArrayBuffer(buf: ArrayBuffer | Uint8Array): XlsxSource {\n let bytes: Uint8Array;\n if (buf instanceof Uint8Array) {\n bytes = buf;\n } else if (buf instanceof ArrayBuffer) {\n bytes = new Uint8Array(buf);\n } else {\n throw new OpenXmlIoError('fromArrayBuffer expects an ArrayBuffer or Uint8Array');\n }\n return {\n async toBytes() {\n return bytes;\n },\n toStream() {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n },\n };\n}\n\nconst collectChunks = (chunks: Uint8Array[]): Uint8Array => {\n let total = 0;\n for (const c of chunks) total += c.byteLength;\n const out = new Uint8Array(total);\n let off = 0;\n for (const c of chunks) {\n out.set(c, off);\n off += c.byteLength;\n }\n return out;\n};\n\n/**\n * In-memory Blob sink. Convenience `result()` returns the accumulated\n * payload as a Blob with the supplied MIME type.\n */\nexport function toBlob(\n mime: string = 'application/octet-stream',\n): XlsxSink & { toBytes(): BufferedSinkWriter; result(): Blob } {\n const chunks: Uint8Array[] = [];\n let finalised: Uint8Array | undefined;\n\n const finalise = (): Uint8Array => {\n if (finalised !== undefined) return finalised;\n finalised = collectChunks(chunks);\n chunks.length = 0;\n return finalised;\n };\n\n return {\n toBytes(): BufferedSinkWriter {\n return {\n write(chunk: Uint8Array): void {\n if (finalised !== undefined) throw new OpenXmlIoError('toBlob sink: write after finish');\n if (!(chunk instanceof Uint8Array)) throw new OpenXmlIoError('toBlob sink: chunk is not a Uint8Array');\n chunks.push(chunk);\n },\n async finish(): Promise<Uint8Array> {\n return finalise();\n },\n abort(): void {\n if (finalised !== undefined) return;\n finalised = new Uint8Array(0);\n chunks.length = 0;\n },\n };\n },\n result(): Blob {\n // Copy the bytes' typed-array view into a fresh Blob to detach from\n // the writer's internal buffer.\n const bytes = finalise();\n return new Blob([bytes.slice()], { type: mime });\n },\n };\n}\n\n/** In-memory ArrayBuffer sink. */\nexport function toArrayBuffer(): XlsxSink & { toBytes(): BufferedSinkWriter; result(): ArrayBuffer } {\n const chunks: Uint8Array[] = [];\n let finalised: Uint8Array | undefined;\n\n const finalise = (): Uint8Array => {\n if (finalised !== undefined) return finalised;\n finalised = collectChunks(chunks);\n chunks.length = 0;\n return finalised;\n };\n\n return {\n toBytes(): BufferedSinkWriter {\n return {\n write(chunk: Uint8Array): void {\n if (finalised !== undefined) throw new OpenXmlIoError('toArrayBuffer sink: write after finish');\n if (!(chunk instanceof Uint8Array)) throw new OpenXmlIoError('toArrayBuffer sink: chunk is not a Uint8Array');\n chunks.push(chunk);\n },\n async finish(): Promise<Uint8Array> {\n return finalise();\n },\n abort(): void {\n if (finalised !== undefined) return;\n finalised = new Uint8Array(0);\n chunks.length = 0;\n },\n };\n },\n result(): ArrayBuffer {\n const bytes = finalise();\n // bytes' underlying buffer may be larger than its byteLength (slice\n // semantics on Uint8Array). Materialise an exactly-sized copy.\n const out = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(out).set(bytes);\n return out;\n },\n };\n}\n"],"mappings":"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"}