@office-kit/xlsx 0.13.0 → 0.14.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 (34) hide show
  1. package/dist/io.mjs +2 -2
  2. package/dist/iterparse-zWV-5vc6.mjs +164 -0
  3. package/dist/iterparse-zWV-5vc6.mjs.map +1 -0
  4. package/dist/{load-CJdGh50R.mjs → load-B16H5A3S.mjs} +3 -3
  5. package/dist/{load-CJdGh50R.mjs.map → load-B16H5A3S.mjs.map} +1 -1
  6. package/dist/node.mjs +8 -4
  7. package/dist/node.mjs.map +1 -1
  8. package/dist/{reader-BNaUTVCy.mjs → reader-DHMxLBQV.mjs} +81 -26
  9. package/dist/reader-DHMxLBQV.mjs.map +1 -0
  10. package/dist/{save-CjarR7Rp.mjs → save-I6GjvO1k.mjs} +83 -43
  11. package/dist/save-I6GjvO1k.mjs.map +1 -0
  12. package/dist/streaming.mjs +154 -60
  13. package/dist/streaming.mjs.map +1 -1
  14. package/dist/{stylesheet-writer-D7Uug85X.mjs → stylesheet-writer-BCS6PzWU.mjs} +66 -62
  15. package/dist/stylesheet-writer-BCS6PzWU.mjs.map +1 -0
  16. package/dist/utf8-OAkCDG5g.mjs +21 -0
  17. package/dist/utf8-OAkCDG5g.mjs.map +1 -0
  18. package/dist/worksheet/writer.d.ts +23 -4
  19. package/dist/{writer-Z7cF_CBk.mjs → writer-C38RBZCy.mjs} +2 -2
  20. package/dist/writer-C38RBZCy.mjs.map +1 -0
  21. package/dist/xml.mjs +2 -1
  22. package/dist/xml.mjs.map +1 -1
  23. package/dist/zip/decompression-guard.d.ts +22 -6
  24. package/dist/zip/inflate-cache.d.ts +22 -0
  25. package/dist/zip/reader.d.ts +11 -6
  26. package/dist/zip/writer.d.ts +6 -2
  27. package/dist/zip.mjs +2 -2
  28. package/package.json +1 -1
  29. package/dist/reader-BNaUTVCy.mjs.map +0 -1
  30. package/dist/save-CjarR7Rp.mjs.map +0 -1
  31. package/dist/stylesheet-writer-D7Uug85X.mjs.map +0 -1
  32. package/dist/utf8-Tn3nzyik.mjs +0 -143
  33. package/dist/utf8-Tn3nzyik.mjs.map +0 -1
  34. package/dist/writer-Z7cF_CBk.mjs.map +0 -1
package/dist/io.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { i as OpenXmlIoError } from "./exceptions-D-CFwxgm.mjs";
2
- import { t as loadWorkbook } from "./load-CJdGh50R.mjs";
3
- import { n as workbookToBytes, t as saveWorkbook } from "./save-CjarR7Rp.mjs";
2
+ import { t as loadWorkbook } from "./load-B16H5A3S.mjs";
3
+ import { n as workbookToBytes, t as saveWorkbook } from "./save-I6GjvO1k.mjs";
4
4
  //#region src/io/browser.ts
5
5
  /**
6
6
  * Wrap a Blob (or File, since File extends Blob) as an XlsxSource. The
@@ -0,0 +1,164 @@
1
+ import { o as OpenXmlSchemaError } from "./exceptions-D-CFwxgm.mjs";
2
+ import { jt as qname } from "./tree-BX-sRRVp.mjs";
3
+ import { SaxesParser } from "saxes";
4
+ //#region src/xml/iterparse.ts
5
+ const DOCTYPE_RE = /<!DOCTYPE\b/;
6
+ const ENTITY_RE = /<!ENTITY\b/;
7
+ /** Longest token {@link checkDoctype} matches, in code units. */
8
+ const DTD_TOKEN_LENGTH = 9;
9
+ const checkDoctype = (text) => {
10
+ if (DOCTYPE_RE.test(text)) throw new OpenXmlSchemaError("DTD declarations are not permitted in OOXML payloads");
11
+ if (ENTITY_RE.test(text)) throw new OpenXmlSchemaError("Entity declarations are not permitted in OOXML payloads");
12
+ };
13
+ const isReadableStream = (v) => {
14
+ return typeof v === "object" && v !== null && typeof v.getReader === "function";
15
+ };
16
+ const decoder = () => new TextDecoder("utf-8", { fatal: false });
17
+ /**
18
+ * Feed size, in code units. saxes runs its handlers synchronously inside
19
+ * `write()`, so one `write()` queues every event its argument produces before
20
+ * the consumer sees any of them. Capping the argument caps the queue.
21
+ *
22
+ * This bounds every input shape, including a `ReadableStream`, whose upstream
23
+ * chunk size is not ours to choose: the zip reader pushes 64 KB of *compressed*
24
+ * bytes per pull, and worksheet XML inflates roughly sevenfold, so its chunks
25
+ * arrive around 450 KB.
26
+ */
27
+ const FEED_CHUNK_SIZE = 64 * 1024;
28
+ /**
29
+ * Split text that exceeds the feed size. Boundaries fall on arbitrary offsets,
30
+ * which is safe because saxes holds back a lone high surrogate at the end of a
31
+ * `write()` and rejoins it with the next one, so a split codepoint still
32
+ * surfaces as a single text event.
33
+ */
34
+ function* atFeedSize(text) {
35
+ if (text.length === 0) return;
36
+ if (text.length <= FEED_CHUNK_SIZE) {
37
+ yield text;
38
+ return;
39
+ }
40
+ for (let i = 0; i < text.length; i += FEED_CHUNK_SIZE) yield text.slice(i, i + FEED_CHUNK_SIZE);
41
+ }
42
+ /**
43
+ * Decode bytes in feed-sized slices. Slicing before the decode rather than
44
+ * after it also bounds the decoder's output string, which matters when the
45
+ * producer hands over a whole part at once. UTF-8 never expands, so a slice of
46
+ * FEED_CHUNK_SIZE bytes decodes to at most that many code units and needs no
47
+ * second split.
48
+ *
49
+ * `stream: true` holds back a codepoint split across a slice boundary instead
50
+ * of emitting a replacement character for each half.
51
+ */
52
+ function* decodeAtFeedSize(bytes, td) {
53
+ for (let i = 0; i < bytes.byteLength; i += FEED_CHUNK_SIZE) {
54
+ const text = td.decode(bytes.subarray(i, Math.min(i + FEED_CHUNK_SIZE, bytes.byteLength)), { stream: true });
55
+ if (text.length > 0) yield text;
56
+ }
57
+ }
58
+ /** Decode any supported input into a sequence of feed-sized text chunks. */
59
+ async function* decodedChunks(input) {
60
+ if (typeof input === "string") {
61
+ yield* atFeedSize(input);
62
+ return;
63
+ }
64
+ const td = decoder();
65
+ if (input instanceof Uint8Array) yield* decodeAtFeedSize(input, td);
66
+ else if (isReadableStream(input)) {
67
+ const reader = input.getReader();
68
+ try {
69
+ for (;;) {
70
+ const { done, value } = await reader.read();
71
+ if (done) break;
72
+ yield* decodeAtFeedSize(value, td);
73
+ }
74
+ } finally {
75
+ await reader.cancel().catch(() => {});
76
+ reader.releaseLock();
77
+ }
78
+ } else throw new OpenXmlSchemaError("iterParse: unsupported input type");
79
+ const tail = td.decode();
80
+ if (tail.length > 0) yield tail;
81
+ }
82
+ const buildAttrsClark = (attrs) => {
83
+ const out = {};
84
+ for (const [, info] of Object.entries(attrs)) {
85
+ if (info.prefix === "xmlns" || info.prefix === "" && info.local === "xmlns") continue;
86
+ const key = qname(info.uri, info.local);
87
+ out[key] = info.value;
88
+ }
89
+ return out;
90
+ };
91
+ /**
92
+ * Parse the input as a stream of SAX events. Element / attribute names are
93
+ * returned in Clark notation (`{ns}local`).
94
+ */
95
+ async function* iterParse(input) {
96
+ const parser = new SaxesParser({
97
+ xmlns: true,
98
+ fragment: false
99
+ });
100
+ let queue = [];
101
+ let head = 0;
102
+ let pending;
103
+ parser.on("error", (err) => {
104
+ pending = new OpenXmlSchemaError(`Malformed XML: ${err.message}`, { cause: err });
105
+ });
106
+ parser.on("doctype", () => {
107
+ pending = new OpenXmlSchemaError("DTD declarations are not permitted in OOXML payloads");
108
+ });
109
+ parser.on("opentag", (node) => {
110
+ queue.push({
111
+ kind: "start",
112
+ name: qname(node.uri, node.local),
113
+ attrs: buildAttrsClark(node.attributes)
114
+ });
115
+ });
116
+ parser.on("closetag", (node) => {
117
+ queue.push({
118
+ kind: "end",
119
+ name: qname(node.uri, node.local)
120
+ });
121
+ });
122
+ parser.on("text", (text) => {
123
+ if (text.length > 0) queue.push({
124
+ kind: "text",
125
+ text
126
+ });
127
+ });
128
+ const drain = function* () {
129
+ for (;;) {
130
+ const ev = head < queue.length ? queue[head] : void 0;
131
+ if (ev === void 0) {
132
+ queue = [];
133
+ head = 0;
134
+ return;
135
+ }
136
+ head++;
137
+ yield ev;
138
+ }
139
+ };
140
+ const feed = (chunk) => {
141
+ parser.write(chunk);
142
+ if (pending !== void 0) throw pending;
143
+ };
144
+ const CARRY_LENGTH = DTD_TOKEN_LENGTH - 1;
145
+ let dtdCarry = "";
146
+ const scanForDtd = (chunk) => {
147
+ checkDoctype(chunk);
148
+ const window = dtdCarry + chunk.slice(0, CARRY_LENGTH);
149
+ if (dtdCarry.length > 0) checkDoctype(window);
150
+ dtdCarry = (chunk.length >= CARRY_LENGTH ? chunk : window).slice(-8);
151
+ };
152
+ for await (const chunk of decodedChunks(input)) {
153
+ scanForDtd(chunk);
154
+ feed(chunk);
155
+ yield* drain();
156
+ }
157
+ parser.close();
158
+ if (pending !== void 0) throw pending;
159
+ yield* drain();
160
+ }
161
+ //#endregion
162
+ export { iterParse as t };
163
+
164
+ //# sourceMappingURL=iterparse-zWV-5vc6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterparse-zWV-5vc6.mjs","names":[],"sources":["../src/xml/iterparse.ts"],"sourcesContent":["// SAX iterator over OOXML XML payloads. Wraps `saxes` (XMLNS-aware) and yields\n// a flat stream of {start | end | text} events with names already converted to\n// Clark notation (`{ns}local`) — same shape as the DOM parser produces for\n// static XmlNode trees, so consumers can switch between bulk and streaming\n// reads without retouching name comparison.\n//\n// Phase 1 §3 acceptance: 1 k–row sheetData walked end-to-end with cell counts\n// matching the source. The phase-4 read-only worksheet drives real-world use;\n// this layer just produces the events.\n//\n// DOCTYPE / external entity declarations are forbidden. saxes does not expand\n// external entities, but a prescan also rejects DTDs. Every input shape is fed\n// to the parser in chunks, and each chunk is prescanned before it is fed, so\n// the rejection happens before saxes sees the declaration.\n\nimport { SaxesParser } from 'saxes';\nimport { OpenXmlSchemaError } from '../utils/exceptions.js';\nimport { qname } from './namespaces.js';\n\nexport type SaxEvent =\n | { kind: 'start'; name: string; attrs: Record<string, string> }\n | { kind: 'end'; name: string }\n | { kind: 'text'; text: string };\n\n/**\n * Streamable input: `Uint8Array`, plain string, or a Web `ReadableStream` of\n * `Uint8Array` chunks (produced by xlsx zip entries via fflate, fetch, file\n * streams, etc.).\n */\nexport type SaxInput = Uint8Array | string | ReadableStream<Uint8Array>;\n\nconst DOCTYPE_RE = /<!DOCTYPE\\b/;\nconst ENTITY_RE = /<!ENTITY\\b/;\n\n/** Longest token {@link checkDoctype} matches, in code units. */\nconst DTD_TOKEN_LENGTH = '<!DOCTYPE'.length;\n\nconst checkDoctype = (text: string): void => {\n if (DOCTYPE_RE.test(text)) {\n throw new OpenXmlSchemaError('DTD declarations are not permitted in OOXML payloads');\n }\n if (ENTITY_RE.test(text)) {\n throw new OpenXmlSchemaError('Entity declarations are not permitted in OOXML payloads');\n }\n};\n\nconst isReadableStream = (v: unknown): v is ReadableStream<Uint8Array> => {\n return typeof v === 'object' && v !== null && typeof (v as ReadableStream).getReader === 'function';\n};\n\nconst decoder = (): TextDecoder => new TextDecoder('utf-8', { fatal: false });\n\n/**\n * Feed size, in code units. saxes runs its handlers synchronously inside\n * `write()`, so one `write()` queues every event its argument produces before\n * the consumer sees any of them. Capping the argument caps the queue.\n *\n * This bounds every input shape, including a `ReadableStream`, whose upstream\n * chunk size is not ours to choose: the zip reader pushes 64 KB of *compressed*\n * bytes per pull, and worksheet XML inflates roughly sevenfold, so its chunks\n * arrive around 450 KB.\n */\nconst FEED_CHUNK_SIZE = 64 * 1024;\n\n/**\n * Split text that exceeds the feed size. Boundaries fall on arbitrary offsets,\n * which is safe because saxes holds back a lone high surrogate at the end of a\n * `write()` and rejoins it with the next one, so a split codepoint still\n * surfaces as a single text event.\n */\nfunction* atFeedSize(text: string): IterableIterator<string> {\n if (text.length === 0) return;\n if (text.length <= FEED_CHUNK_SIZE) {\n yield text;\n return;\n }\n for (let i = 0; i < text.length; i += FEED_CHUNK_SIZE) {\n yield text.slice(i, i + FEED_CHUNK_SIZE);\n }\n}\n\n/**\n * Decode bytes in feed-sized slices. Slicing before the decode rather than\n * after it also bounds the decoder's output string, which matters when the\n * producer hands over a whole part at once. UTF-8 never expands, so a slice of\n * FEED_CHUNK_SIZE bytes decodes to at most that many code units and needs no\n * second split.\n *\n * `stream: true` holds back a codepoint split across a slice boundary instead\n * of emitting a replacement character for each half.\n */\nfunction* decodeAtFeedSize(bytes: Uint8Array, td: TextDecoder): IterableIterator<string> {\n for (let i = 0; i < bytes.byteLength; i += FEED_CHUNK_SIZE) {\n const text = td.decode(bytes.subarray(i, Math.min(i + FEED_CHUNK_SIZE, bytes.byteLength)), { stream: true });\n if (text.length > 0) yield text;\n }\n}\n\n/** Decode any supported input into a sequence of feed-sized text chunks. */\nasync function* decodedChunks(input: SaxInput): AsyncIterableIterator<string> {\n if (typeof input === 'string') {\n yield* atFeedSize(input);\n return;\n }\n const td = decoder();\n if (input instanceof Uint8Array) {\n yield* decodeAtFeedSize(input, td);\n } else if (isReadableStream(input)) {\n const reader = input.getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n yield* decodeAtFeedSize(value, td);\n }\n } finally {\n // Consumers abandon the iteration routinely (`iterRows({ maxRow })`\n // returns as soon as the band ends). Without this the source stays\n // locked and its `cancel()` never runs, which is what releases the zip\n // reader's inflate state. A cancel that rejects is cleanup on a stream\n // nobody will read again, and must not mask why we left the loop.\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n } else {\n throw new OpenXmlSchemaError('iterParse: unsupported input type');\n }\n const tail = td.decode();\n if (tail.length > 0) yield tail;\n}\n\ninterface SaxesOpenTag {\n name: string;\n uri: string;\n local: string;\n prefix: string;\n attributes: Record<string, { value: string; uri: string; local: string; prefix: string }>;\n isSelfClosing?: boolean;\n}\n\ninterface SaxesCloseTag {\n name: string;\n uri: string;\n local: string;\n prefix: string;\n}\n\nconst buildAttrsClark = (attrs: SaxesOpenTag['attributes']): Record<string, string> => {\n const out: Record<string, string> = {};\n for (const [, info] of Object.entries(attrs)) {\n // saxes already resolved the namespace when xmlns: true is set; raw xmlns /\n // xmlns:* declarations have prefix='xmlns' (or local==='xmlns' when\n // default) and we drop those — they're rebuilt by the serializer.\n if (info.prefix === 'xmlns' || (info.prefix === '' && info.local === 'xmlns')) continue;\n const key = qname(info.uri, info.local);\n out[key] = info.value;\n }\n return out;\n};\n\n/**\n * Parse the input as a stream of SAX events. Element / attribute names are\n * returned in Clark notation (`{ns}local`).\n */\nexport async function* iterParse(input: SaxInput): AsyncIterableIterator<SaxEvent> {\n // Set up the parser. xmlns: true gives us resolved {uri, local, prefix} on\n // every open / close tag and on every attribute.\n const parser = new SaxesParser({ xmlns: true, fragment: false });\n\n // Head-pointer ring instead of Array#shift: each saxes write() can produce\n // hundreds of events in a single synchronous batch (a `<row>` with dozens of\n // cells flushes one opentag + one text + one closetag per cell). `shift()`\n // is O(n) per element in V8, so a single-batch drain of N events would be\n // O(N²) before iteration. The head advances on yield; the queue is reset\n // (head + length) once it drains. Peak depth is one chunk's worth of events,\n // which is what keeps the queue bounded on a multi-GB sheet.\n let queue: SaxEvent[] = [];\n let head = 0;\n let pending: Error | undefined;\n\n parser.on('error', (err: Error) => {\n // saxes reports syntax errors as plain Error; consumers of this library\n // only ever see OpenXmlError subclasses.\n pending = new OpenXmlSchemaError(`Malformed XML: ${err.message}`, { cause: err });\n });\n parser.on('doctype', () => {\n pending = new OpenXmlSchemaError('DTD declarations are not permitted in OOXML payloads');\n });\n parser.on('opentag', (node: SaxesOpenTag) => {\n queue.push({ kind: 'start', name: qname(node.uri, node.local), attrs: buildAttrsClark(node.attributes) });\n });\n parser.on('closetag', (node: SaxesCloseTag) => {\n queue.push({ kind: 'end', name: qname(node.uri, node.local) });\n });\n parser.on('text', (text: string) => {\n if (text.length > 0) queue.push({ kind: 'text', text });\n });\n\n const drain = function* (): IterableIterator<SaxEvent> {\n for (;;) {\n const ev = head < queue.length ? queue[head] : undefined;\n if (ev === undefined) {\n // Reset rather than grow forever; the next batch starts at index 0.\n queue = [];\n head = 0;\n return;\n }\n head++;\n yield ev;\n }\n };\n\n const feed = (chunk: string): void => {\n parser.write(chunk);\n if (pending !== undefined) throw pending;\n };\n\n // Scan each chunk on its own, then a short window spanning the boundary, so\n // a `<!DOCTYPE` split across two chunks is still matched. Concatenating the\n // carry onto the whole chunk instead would make V8 flatten a fresh copy of\n // every chunk before the regex could run.\n const CARRY_LENGTH = DTD_TOKEN_LENGTH - 1;\n let dtdCarry = '';\n const scanForDtd = (chunk: string): void => {\n checkDoctype(chunk);\n // Chunks shorter than the carry can hide a token across three of them, so\n // the next carry comes off the joined window rather than the chunk.\n const window = dtdCarry + chunk.slice(0, CARRY_LENGTH);\n if (dtdCarry.length > 0) checkDoctype(window);\n dtdCarry = (chunk.length >= CARRY_LENGTH ? chunk : window).slice(-CARRY_LENGTH);\n };\n\n for await (const chunk of decodedChunks(input)) {\n scanForDtd(chunk);\n feed(chunk);\n yield* drain();\n }\n\n parser.close();\n if (pending !== undefined) throw pending;\n yield* drain();\n}\n"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { o as OpenXmlSchemaError } from "./exceptions-D-CFwxgm.mjs";
2
2
  import { h as loadImage } from "./drawing-ZJ3h4VHD.mjs";
3
3
  import { At as parseQName, a as findChildren, c as ARC_CONTENT_TYPES, f as ARC_ROOT_RELS, ft as SHEET_MAIN_NS, g as ARC_WORKBOOK, h as ARC_THEME, i as findChild, jt as qname, l as ARC_CORE, lt as REL_NS, m as ARC_STYLE, p as ARC_SHARED_STRINGS, q as MARKUP_COMPAT_NS, s as ARC_APP, u as ARC_CUSTOM } from "./tree-BX-sRRVp.mjs";
4
- import { D as findUserShapesRId, O as parseChartXml, T as parseChartExXml, _ as parseChartsheetXml, a as parseCommentsXml, b as parseWorksheetXml, c as NumberFormatSchema, d as BorderSchema, f as AlignmentSchema, h as parseDrawingXml, l as FontSchema, n as parseTableXml, p as collectRawRelIds, s as ProtectionSchema, u as fillFromTree, w as isChartExBytes, x as parseUserShapesXml } from "./stylesheet-writer-D7Uug85X.mjs";
4
+ import { D as findUserShapesRId, O as parseChartXml, T as parseChartExXml, _ as parseChartsheetXml, a as parseCommentsXml, b as parseWorksheetXml, c as NumberFormatSchema, d as BorderSchema, f as AlignmentSchema, h as parseDrawingXml, l as FontSchema, n as parseTableXml, p as collectRawRelIds, s as ProtectionSchema, u as fillFromTree, w as isChartExBytes, x as parseUserShapesXml } from "./stylesheet-writer-BCS6PzWU.mjs";
5
5
  import { n as parseXmlDocument, t as parseXml } from "./parser-By6RWZVW.mjs";
6
6
  import { t as fromTree } from "./serialize-BC2Wu3bR.mjs";
7
7
  import { B as corePropsFromBytes, Q as findById, _ as customPropsFromBytes, c as extendedPropsFromBytes, et as indexRelsById, nt as relsFromBytes, o as manifestFromBytes, tt as makeRelationships } from "./manifest-pLmx7KYh.mjs";
8
8
  import { en as stableStringify, ht as makeStylesheet } from "./cell-style-BFmJOmcx.mjs";
9
9
  import { k as parseSharedStringsXml, r as createWorkbook } from "./workbook-B15-T4cs.mjs";
10
10
  import { a as makeDefinedName } from "./defined-names-Ctu3F6ls.mjs";
11
- import { t as openZip } from "./reader-BNaUTVCy.mjs";
11
+ import { t as openZip } from "./reader-DHMxLBQV.mjs";
12
12
  //#region src/styles/stylesheet-reader.ts
13
13
  const STYLESHEET_TAG = qname(SHEET_MAIN_NS, "styleSheet");
14
14
  const FONTS_TAG = qname(SHEET_MAIN_NS, "fonts");
@@ -1169,4 +1169,4 @@ function capturePassthrough(archive, manifest, wb, roots, vml) {
1169
1169
  //#endregion
1170
1170
  export { parseStylesheetXml as i, parseDate1904 as n, resolveRelTarget as r, loadWorkbook as t };
1171
1171
 
1172
- //# sourceMappingURL=load-CJdGh50R.mjs.map
1172
+ //# sourceMappingURL=load-B16H5A3S.mjs.map