xlsx-mini 0.0.0 → 0.0.1

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 (86) hide show
  1. package/README.md +418 -2
  2. package/dist/browser.d.ts +16 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +36 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/errors/index.d.ts +21 -0
  7. package/dist/errors/index.d.ts.map +1 -0
  8. package/dist/errors/index.js +23 -0
  9. package/dist/errors/index.js.map +1 -0
  10. package/dist/index.d.ts +8 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +5 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/opc/index.d.ts +8 -0
  15. package/dist/opc/index.d.ts.map +1 -0
  16. package/dist/opc/index.js +8 -0
  17. package/dist/opc/index.js.map +1 -0
  18. package/dist/opc/lib/compression.d.ts +17 -0
  19. package/dist/opc/lib/compression.d.ts.map +1 -0
  20. package/dist/opc/lib/compression.js +54 -0
  21. package/dist/opc/lib/compression.js.map +1 -0
  22. package/dist/opc/lib/crc32.d.ts +8 -0
  23. package/dist/opc/lib/crc32.d.ts.map +1 -0
  24. package/dist/opc/lib/crc32.js +58 -0
  25. package/dist/opc/lib/crc32.js.map +1 -0
  26. package/dist/opc/lib/zip.d.ts +13 -0
  27. package/dist/opc/lib/zip.d.ts.map +1 -0
  28. package/dist/opc/lib/zip.js +104 -0
  29. package/dist/opc/lib/zip.js.map +1 -0
  30. package/dist/shared-strings/index.d.ts +9 -0
  31. package/dist/shared-strings/index.d.ts.map +1 -0
  32. package/dist/shared-strings/index.js +27 -0
  33. package/dist/shared-strings/index.js.map +1 -0
  34. package/dist/styles/index.d.ts +32 -0
  35. package/dist/styles/index.d.ts.map +1 -0
  36. package/dist/styles/index.js +106 -0
  37. package/dist/styles/index.js.map +1 -0
  38. package/dist/workbook/index.d.ts +27 -0
  39. package/dist/workbook/index.d.ts.map +1 -0
  40. package/dist/workbook/index.js +75 -0
  41. package/dist/workbook/index.js.map +1 -0
  42. package/dist/workbook/lib/model.d.ts +11 -0
  43. package/dist/workbook/lib/model.d.ts.map +1 -0
  44. package/dist/workbook/lib/model.js +2 -0
  45. package/dist/workbook/lib/model.js.map +1 -0
  46. package/dist/workbook/lib/validate.d.ts +4 -0
  47. package/dist/workbook/lib/validate.d.ts.map +1 -0
  48. package/dist/workbook/lib/validate.js +38 -0
  49. package/dist/workbook/lib/validate.js.map +1 -0
  50. package/dist/worksheet/index.d.ts +16 -0
  51. package/dist/worksheet/index.d.ts.map +1 -0
  52. package/dist/worksheet/index.js +25 -0
  53. package/dist/worksheet/index.js.map +1 -0
  54. package/dist/worksheet/lib/cell-ref.d.ts +6 -0
  55. package/dist/worksheet/lib/cell-ref.d.ts.map +1 -0
  56. package/dist/worksheet/lib/cell-ref.js +19 -0
  57. package/dist/worksheet/lib/cell-ref.js.map +1 -0
  58. package/dist/worksheet/lib/from-objects.d.ts +53 -0
  59. package/dist/worksheet/lib/from-objects.d.ts.map +1 -0
  60. package/dist/worksheet/lib/from-objects.js +65 -0
  61. package/dist/worksheet/lib/from-objects.js.map +1 -0
  62. package/dist/worksheet/lib/layout.d.ts +12 -0
  63. package/dist/worksheet/lib/layout.d.ts.map +1 -0
  64. package/dist/worksheet/lib/layout.js +58 -0
  65. package/dist/worksheet/lib/layout.js.map +1 -0
  66. package/dist/worksheet/lib/model.d.ts +112 -0
  67. package/dist/worksheet/lib/model.d.ts.map +1 -0
  68. package/dist/worksheet/lib/model.js +2 -0
  69. package/dist/worksheet/lib/model.js.map +1 -0
  70. package/dist/worksheet/lib/render-rows.d.ts +23 -0
  71. package/dist/worksheet/lib/render-rows.d.ts.map +1 -0
  72. package/dist/worksheet/lib/render-rows.js +167 -0
  73. package/dist/worksheet/lib/render-rows.js.map +1 -0
  74. package/dist/worksheet/lib/serial.d.ts +11 -0
  75. package/dist/worksheet/lib/serial.d.ts.map +1 -0
  76. package/dist/worksheet/lib/serial.js +44 -0
  77. package/dist/worksheet/lib/serial.js.map +1 -0
  78. package/dist/write-xlsx.d.ts +29 -0
  79. package/dist/write-xlsx.d.ts.map +1 -0
  80. package/dist/write-xlsx.js +49 -0
  81. package/dist/write-xlsx.js.map +1 -0
  82. package/dist/xml/index.d.ts +24 -0
  83. package/dist/xml/index.d.ts.map +1 -0
  84. package/dist/xml/index.js +152 -0
  85. package/dist/xml/index.js.map +1 -0
  86. package/package.json +79 -7
@@ -0,0 +1,54 @@
1
+ /** STORE: bytes go in as they are. Byte-deterministic on every platform. */
2
+ export const store = {
3
+ method: 0,
4
+ compress: (data) => Promise.resolve(data),
5
+ };
6
+ /** DEFLATE through the web-standard `CompressionStream`, raw (no zlib or gzip wrapper), as zip requires. */
7
+ const deflateRaw = {
8
+ method: 8,
9
+ compress: (data) => drain(new CompressionStream("deflate-raw"), data),
10
+ };
11
+ /**
12
+ * Picks the strategy for a requested mode. Deflate is confirmed by constructing the stream, not by
13
+ * checking that the class exists: some runtimes list `deflate-raw` without implementing it. Where
14
+ * it is unavailable the package is written with STORE entries instead.
15
+ */
16
+ export function selectCompression(mode) {
17
+ if (mode === "none")
18
+ return store;
19
+ try {
20
+ void new CompressionStream("deflate-raw");
21
+ return deflateRaw;
22
+ }
23
+ catch {
24
+ return store;
25
+ }
26
+ }
27
+ /** Writes one chunk through a transform stream and gathers everything it emits. */
28
+ async function drain(stream, data) {
29
+ const writer = stream.writable.getWriter();
30
+ // Start the write without awaiting it: the readable side must be drained concurrently.
31
+ // Parts come from TextEncoder and are ArrayBuffer-backed; the stream API insists on that in its types.
32
+ const written = writer.write(data).then(() => writer.close());
33
+ const reader = stream.readable.getReader();
34
+ const chunks = [];
35
+ let total = 0;
36
+ for (;;) {
37
+ const { done, value } = await reader.read();
38
+ if (done)
39
+ break;
40
+ chunks.push(value);
41
+ total += value.byteLength;
42
+ }
43
+ await written;
44
+ if (chunks.length === 1)
45
+ return chunks[0];
46
+ const out = new Uint8Array(total);
47
+ let offset = 0;
48
+ for (const chunk of chunks) {
49
+ out.set(chunk, offset);
50
+ offset += chunk.byteLength;
51
+ }
52
+ return out;
53
+ }
54
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../../src/opc/lib/compression.ts"],"names":[],"mappings":"AAUA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,KAAK,GAAgB;IAChC,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;CAC1C,CAAC;AAEF,4GAA4G;AAC5G,MAAM,UAAU,GAAgB;IAC9B,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC;CACtE,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,CAAC;QACH,KAAK,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC1C,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,KAAK,UAAU,KAAK,CAAC,MAAyB,EAAE,IAAgB;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC3C,uFAAuF;IACvF,uGAAuG;IACvG,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAA+B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;IAC5B,CAAC;IACD,MAAM,OAAO,CAAC;IACd,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CRC-32 (IEEE 802.3, the polynomial zip uses) of a byte array, as an unsigned 32-bit integer.
3
+ * Slice-by-8: the tables are built on first use and shared afterwards.
4
+ *
5
+ * @example crc32(new TextEncoder().encode("123456789")) // 0xcbf43926
6
+ */
7
+ export declare function crc32(bytes: Uint8Array): number;
8
+ //# sourceMappingURL=crc32.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.d.ts","sourceRoot":"","sources":["../../../src/opc/lib/crc32.ts"],"names":[],"mappings":"AA4BA;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CA2B/C"}
@@ -0,0 +1,58 @@
1
+ const POLYNOMIAL = 0xedb88320;
2
+ const SLICES = 8;
3
+ let tables;
4
+ /**
5
+ * Eight 256-entry tables in one array: table k holds the CRC after the byte and k zero bytes, so
6
+ * eight bytes advance the checksum with eight independent lookups instead of eight dependent ones.
7
+ */
8
+ function buildTables() {
9
+ const built = new Uint32Array(SLICES * 256);
10
+ for (let n = 0; n < 256; n++) {
11
+ let c = n;
12
+ for (let k = 0; k < 8; k++) {
13
+ c = c & 1 ? POLYNOMIAL ^ (c >>> 1) : c >>> 1;
14
+ }
15
+ built[n] = c >>> 0;
16
+ }
17
+ for (let n = 0; n < 256; n++) {
18
+ let c = built[n];
19
+ for (let k = 1; k < SLICES; k++) {
20
+ c = (built[c & 0xff] ^ (c >>> 8)) >>> 0;
21
+ built[k * 256 + n] = c;
22
+ }
23
+ }
24
+ return built;
25
+ }
26
+ /**
27
+ * CRC-32 (IEEE 802.3, the polynomial zip uses) of a byte array, as an unsigned 32-bit integer.
28
+ * Slice-by-8: the tables are built on first use and shared afterwards.
29
+ *
30
+ * @example crc32(new TextEncoder().encode("123456789")) // 0xcbf43926
31
+ */
32
+ export function crc32(bytes) {
33
+ const t = (tables ??= buildTables());
34
+ const length = bytes.length;
35
+ let crc = 0xffffffff;
36
+ let i = 0;
37
+ // Indexes are in range by construction: every lookup masks to a byte within a 256-entry slice.
38
+ for (const end = length - (length % 8); i < end; i += 8) {
39
+ const low = (crc ^ (bytes[i] | (bytes[i + 1] << 8) | (bytes[i + 2] << 16) | (bytes[i + 3] << 24))) >>>
40
+ 0;
41
+ const high = (bytes[i + 4] | (bytes[i + 5] << 8) | (bytes[i + 6] << 16) | (bytes[i + 7] << 24)) >>> 0;
42
+ crc =
43
+ (t[1792 + (low & 0xff)] ^
44
+ t[1536 + ((low >>> 8) & 0xff)] ^
45
+ t[1280 + ((low >>> 16) & 0xff)] ^
46
+ t[1024 + (low >>> 24)] ^
47
+ t[768 + (high & 0xff)] ^
48
+ t[512 + ((high >>> 8) & 0xff)] ^
49
+ t[256 + ((high >>> 16) & 0xff)] ^
50
+ t[high >>> 24]) >>>
51
+ 0;
52
+ }
53
+ for (; i < length; i++) {
54
+ crc = (t[(crc ^ bytes[i]) & 0xff] ^ (crc >>> 8)) >>> 0;
55
+ }
56
+ return (crc ^ 0xffffffff) >>> 0;
57
+ }
58
+ //# sourceMappingURL=crc32.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.js","sourceRoot":"","sources":["../../../src/opc/lib/crc32.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Compression } from "./compression.js";
2
+ /** A file inside the package: its zip entry name (forward slashes, no leading slash) and bytes. */
3
+ export interface PackagePart {
4
+ readonly path: string;
5
+ readonly data: Uint8Array;
6
+ }
7
+ /**
8
+ * Packs parts into a zip archive in the order given, with a central directory and no data
9
+ * descriptors. Parts are compressed up front so every size and offset is known, and the archive
10
+ * is then written into one preallocated buffer.
11
+ */
12
+ export declare function createPackage(parts: readonly PackagePart[], compression: Compression): Promise<Uint8Array<ArrayBuffer>>;
13
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../../src/opc/lib/zip.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,mGAAmG;AACnG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAgBD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CA2FlC"}
@@ -0,0 +1,104 @@
1
+ import { XlsxMiniError } from "../../errors/index.js";
2
+ import { crc32 } from "./crc32.js";
3
+ const LOCAL_HEADER_SIGNATURE = 0x04034b50;
4
+ const CENTRAL_HEADER_SIGNATURE = 0x02014b50;
5
+ const END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50;
6
+ const LOCAL_HEADER_SIZE = 30;
7
+ const CENTRAL_HEADER_SIZE = 46;
8
+ const END_OF_CENTRAL_DIRECTORY_SIZE = 22;
9
+ const VERSION_2_0 = 20;
10
+ /** 1980-01-01 00:00:00, the DOS epoch. Fixed so identical input gives identical bytes. */
11
+ const DOS_TIME = 0x0000;
12
+ const DOS_DATE = 0x0021;
13
+ const MAX_32_BIT = 0xffffffff;
14
+ const encoder = new TextEncoder();
15
+ /**
16
+ * Packs parts into a zip archive in the order given, with a central directory and no data
17
+ * descriptors. Parts are compressed up front so every size and offset is known, and the archive
18
+ * is then written into one preallocated buffer.
19
+ */
20
+ export async function createPackage(parts, compression) {
21
+ const count = parts.length;
22
+ const names = [];
23
+ const payloads = [];
24
+ const checksums = new Uint32Array(count);
25
+ let localBytes = 0;
26
+ let centralBytes = 0;
27
+ for (let i = 0; i < count; i++) {
28
+ const part = parts[i];
29
+ const name = encoder.encode(part.path);
30
+ // Sequential on purpose: one part in flight keeps peak memory at one compressed copy.
31
+ const payload = await compression.compress(part.data);
32
+ names.push(name);
33
+ payloads.push(payload);
34
+ checksums[i] = crc32(part.data);
35
+ localBytes += LOCAL_HEADER_SIZE + name.length + payload.length;
36
+ centralBytes += CENTRAL_HEADER_SIZE + name.length;
37
+ }
38
+ const total = localBytes + centralBytes + END_OF_CENTRAL_DIRECTORY_SIZE;
39
+ if (total > MAX_32_BIT) {
40
+ throw new XlsxMiniError("PACKAGE_TOO_LARGE", "workbook", "The package exceeds the 4 GiB limit of a plain zip archive");
41
+ }
42
+ const out = new Uint8Array(total);
43
+ const view = new DataView(out.buffer);
44
+ const offsets = new Uint32Array(count);
45
+ const method = compression.method;
46
+ let cursor = 0;
47
+ for (let i = 0; i < count; i++) {
48
+ const part = parts[i];
49
+ const name = names[i];
50
+ const payload = payloads[i];
51
+ offsets[i] = cursor;
52
+ view.setUint32(cursor, LOCAL_HEADER_SIGNATURE, true);
53
+ view.setUint16(cursor + 4, VERSION_2_0, true);
54
+ view.setUint16(cursor + 6, 0, true); // general purpose flags
55
+ view.setUint16(cursor + 8, method, true);
56
+ view.setUint16(cursor + 10, DOS_TIME, true);
57
+ view.setUint16(cursor + 12, DOS_DATE, true);
58
+ view.setUint32(cursor + 14, checksums[i], true);
59
+ view.setUint32(cursor + 18, payload.length, true);
60
+ view.setUint32(cursor + 22, part.data.length, true);
61
+ view.setUint16(cursor + 26, name.length, true);
62
+ view.setUint16(cursor + 28, 0, true); // extra field length
63
+ cursor += LOCAL_HEADER_SIZE;
64
+ out.set(name, cursor);
65
+ cursor += name.length;
66
+ out.set(payload, cursor);
67
+ cursor += payload.length;
68
+ }
69
+ const centralDirectoryOffset = cursor;
70
+ for (let i = 0; i < count; i++) {
71
+ const part = parts[i];
72
+ const name = names[i];
73
+ view.setUint32(cursor, CENTRAL_HEADER_SIGNATURE, true);
74
+ view.setUint16(cursor + 4, VERSION_2_0, true); // version made by
75
+ view.setUint16(cursor + 6, VERSION_2_0, true); // version needed
76
+ view.setUint16(cursor + 8, 0, true); // general purpose flags
77
+ view.setUint16(cursor + 10, method, true);
78
+ view.setUint16(cursor + 12, DOS_TIME, true);
79
+ view.setUint16(cursor + 14, DOS_DATE, true);
80
+ view.setUint32(cursor + 16, checksums[i], true);
81
+ view.setUint32(cursor + 20, payloads[i].length, true);
82
+ view.setUint32(cursor + 24, part.data.length, true);
83
+ view.setUint16(cursor + 28, name.length, true);
84
+ view.setUint16(cursor + 30, 0, true); // extra field length
85
+ view.setUint16(cursor + 32, 0, true); // comment length
86
+ view.setUint16(cursor + 34, 0, true); // disk number start
87
+ view.setUint16(cursor + 36, 0, true); // internal attributes
88
+ view.setUint32(cursor + 38, 0, true); // external attributes
89
+ view.setUint32(cursor + 42, offsets[i], true);
90
+ cursor += CENTRAL_HEADER_SIZE;
91
+ out.set(name, cursor);
92
+ cursor += name.length;
93
+ }
94
+ view.setUint32(cursor, END_OF_CENTRAL_DIRECTORY_SIGNATURE, true);
95
+ view.setUint16(cursor + 4, 0, true); // this disk
96
+ view.setUint16(cursor + 6, 0, true); // disk with central directory
97
+ view.setUint16(cursor + 8, count, true);
98
+ view.setUint16(cursor + 10, count, true);
99
+ view.setUint32(cursor + 12, centralBytes, true);
100
+ view.setUint32(cursor + 16, centralDirectoryOffset, true);
101
+ view.setUint16(cursor + 20, 0, true); // comment length
102
+ return out;
103
+ }
104
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../../src/opc/lib/zip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** Interns cell text into the workbook's shared-strings table and renders that part. */
2
+ export interface StringTable {
3
+ /** Returns the zero-based index to reference from a cell, adding the text on first sight. */
4
+ intern(text: string): number;
5
+ /** Renders `xl/sharedStrings.xml`. Call once, after every sheet has been rendered. */
6
+ render(): string;
7
+ }
8
+ export declare function createStringTable(): StringTable;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared-strings/index.ts"],"names":[],"mappings":"AAEA,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,6FAA6F;IAC7F,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,sFAAsF;IACtF,MAAM,IAAI,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAmB/C"}
@@ -0,0 +1,27 @@
1
+ import { XML_DECLARATION, escapeXml, needsSpacePreserve } from "../xml/index.js";
2
+ export function createStringTable() {
3
+ const indexes = new Map();
4
+ const items = [];
5
+ let references = 0;
6
+ return {
7
+ intern(text) {
8
+ references++;
9
+ const existing = indexes.get(text);
10
+ if (existing !== undefined)
11
+ return existing;
12
+ const index = items.length;
13
+ indexes.set(text, index);
14
+ items.push(renderItem(text));
15
+ return index;
16
+ },
17
+ render() {
18
+ return `${XML_DECLARATION}<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="${references}" uniqueCount="${items.length}">${items.join("")}</sst>`;
19
+ },
20
+ };
21
+ }
22
+ function renderItem(text) {
23
+ return needsSpacePreserve(text)
24
+ ? `<si><t xml:space="preserve">${escapeXml(text)}</t></si>`
25
+ : `<si><t>${escapeXml(text)}</t></si>`;
26
+ }
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared-strings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAUjF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO;QACL,MAAM,CAAC,IAAI;YACT,UAAU,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,QAAQ,CAAC;YAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM;YACJ,OAAO,GAAG,eAAe,iFAAiF,UAAU,kBAAkB,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC;QAChL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,kBAAkB,CAAC,IAAI,CAAC;QAC7B,CAAC,CAAC,+BAA+B,SAAS,CAAC,IAAI,CAAC,WAAW;QAC3D,CAAC,CAAC,UAAU,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * How a cell looks. Set on a cell object or as a column's default; a cell's own properties win.
3
+ *
4
+ * @example
5
+ * const money: CellStyle = { numberFormat: '#,##0.00 "kr"' };
6
+ * const header: CellStyle = { bold: true };
7
+ */
8
+ export interface CellStyle {
9
+ readonly bold?: boolean;
10
+ /** An Excel format string such as `"0.0%"` or `"yyyy-mm-dd"`, or a built-in format id from 0 to 49. */
11
+ readonly numberFormat?: string | number;
12
+ }
13
+ /** Hands out cell-format indexes, deduplicated, and renders `xl/styles.xml` with exactly what was used. */
14
+ export interface StyleTable {
15
+ /**
16
+ * The index of the cell format for a cell style merged over a column style. `dateDefault` is the
17
+ * built-in number format a date-like value falls back to when neither style sets one, or 0.
18
+ */
19
+ indexFor(cell: CellStyle | undefined, column: CellStyle | undefined, dateDefault: number): number;
20
+ /** Throws `INVALID_NUMBER_FORMAT` for a format Excel would refuse, without registering anything. */
21
+ validate(style: CellStyle): void;
22
+ /** Renders the styles part. Call once, after every sheet has been rendered. */
23
+ render(): string;
24
+ }
25
+ /**
26
+ * Index 0 is always the default format. Fonts, custom number formats and cell formats are each
27
+ * registered once per distinct value. A style object seen again on its own is resolved through a
28
+ * WeakMap, so a column or header style reused across thousands of cells costs one lookup per cell.
29
+ * Excel expects fill 0 to be `none`, fill 1 to be `gray125`, and a `Normal` cell style.
30
+ */
31
+ export declare function createStyleTable(): StyleTable;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/styles/index.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,uGAAuG;IACvG,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzC;AAED,2GAA2G;AAC3G,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAClG,oGAAoG;IACpG,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,+EAA+E;IAC/E,MAAM,IAAI,MAAM,CAAC;CAClB;AAOD;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CA2G7C"}
@@ -0,0 +1,106 @@
1
+ import { XlsxMiniError } from "../errors/index.js";
2
+ import { XML_DECLARATION, escapeXml } from "../xml/index.js";
3
+ const GENERAL = 0;
4
+ const MAX_BUILT_IN_FORMAT = 49;
5
+ const FIRST_CUSTOM_FORMAT = 164;
6
+ const MAX_FORMAT_LENGTH = 255;
7
+ /**
8
+ * Index 0 is always the default format. Fonts, custom number formats and cell formats are each
9
+ * registered once per distinct value. A style object seen again on its own is resolved through a
10
+ * WeakMap, so a column or header style reused across thousands of cells costs one lookup per cell.
11
+ * Excel expects fill 0 to be `none`, fill 1 to be `gray125`, and a `Normal` cell style.
12
+ */
13
+ export function createStyleTable() {
14
+ const cellFormats = ['<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>'];
15
+ const byKey = new Map();
16
+ const bySingleObject = new WeakMap();
17
+ /** Cell-format index per built-in date format, for unstyled date cells: no key string per cell. */
18
+ const byDateDefault = [];
19
+ const customFormats = new Map();
20
+ let boldFont = 0;
21
+ const formatId = (format) => {
22
+ if (typeof format === "number") {
23
+ if (!Number.isInteger(format) || format < 0 || format > MAX_BUILT_IN_FORMAT) {
24
+ throw new XlsxMiniError("INVALID_NUMBER_FORMAT", "", `Built-in number formats are the integers 0 to ${MAX_BUILT_IN_FORMAT}, not ${format}`);
25
+ }
26
+ return format;
27
+ }
28
+ if (format.length === 0 || format.length > MAX_FORMAT_LENGTH) {
29
+ throw new XlsxMiniError("INVALID_NUMBER_FORMAT", "", `A number format string must be 1 to ${MAX_FORMAT_LENGTH} characters`);
30
+ }
31
+ const known = customFormats.get(format);
32
+ if (known !== undefined)
33
+ return known;
34
+ const id = FIRST_CUSTOM_FORMAT + customFormats.size;
35
+ customFormats.set(format, id);
36
+ return id;
37
+ };
38
+ const resolve = (bold, numberFormat) => {
39
+ if (!bold && numberFormat === GENERAL)
40
+ return 0;
41
+ const key = bold ? `b${numberFormat}` : `${numberFormat}`;
42
+ const known = byKey.get(key);
43
+ if (known !== undefined)
44
+ return known;
45
+ if (bold && boldFont === 0)
46
+ boldFont = 1;
47
+ const fontId = bold ? boldFont : 0;
48
+ const applies = (numberFormat === GENERAL ? "" : ' applyNumberFormat="1"') + (bold ? ' applyFont="1"' : "");
49
+ cellFormats.push(`<xf numFmtId="${numberFormat}" fontId="${fontId}" fillId="0" borderId="0" xfId="0"${applies}/>`);
50
+ const index = cellFormats.length - 1;
51
+ byKey.set(key, index);
52
+ return index;
53
+ };
54
+ const merge = (cell, column, dateDefault) => {
55
+ const bold = cell?.bold ?? column?.bold ?? false;
56
+ const format = cell?.numberFormat ?? column?.numberFormat;
57
+ return resolve(bold, format === undefined ? dateDefault : formatId(format));
58
+ };
59
+ return {
60
+ indexFor(cell, column, dateDefault) {
61
+ if (cell === undefined && column === undefined) {
62
+ if (dateDefault === GENERAL)
63
+ return 0;
64
+ return (byDateDefault[dateDefault] ??= resolve(false, dateDefault));
65
+ }
66
+ if (dateDefault === GENERAL) {
67
+ const single = column === undefined ? cell : cell === undefined ? column : undefined;
68
+ if (single !== undefined) {
69
+ const hit = bySingleObject.get(single);
70
+ if (hit !== undefined)
71
+ return hit;
72
+ const index = merge(single, undefined, GENERAL);
73
+ bySingleObject.set(single, index);
74
+ return index;
75
+ }
76
+ }
77
+ return merge(cell, column, dateDefault);
78
+ },
79
+ validate(style) {
80
+ if (style.numberFormat !== undefined)
81
+ formatId(style.numberFormat);
82
+ },
83
+ render() {
84
+ let numberFormats = "";
85
+ if (customFormats.size > 0) {
86
+ numberFormats = `<numFmts count="${customFormats.size}">`;
87
+ for (const [code, id] of customFormats)
88
+ numberFormats += `<numFmt numFmtId="${id}" formatCode="${escapeXml(code)}"/>`;
89
+ numberFormats += "</numFmts>";
90
+ }
91
+ const fonts = boldFont === 0
92
+ ? '<fonts count="1"><font><sz val="11"/><name val="Calibri"/><family val="2"/></font></fonts>'
93
+ : '<fonts count="2"><font><sz val="11"/><name val="Calibri"/><family val="2"/></font><font><b/><sz val="11"/><name val="Calibri"/><family val="2"/></font></fonts>';
94
+ return (`${XML_DECLARATION}<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">` +
95
+ numberFormats +
96
+ fonts +
97
+ '<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>' +
98
+ '<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>' +
99
+ '<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>' +
100
+ `<cellXfs count="${cellFormats.length}">${cellFormats.join("")}</cellXfs>` +
101
+ '<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>' +
102
+ "</styleSheet>");
103
+ },
104
+ };
105
+ }
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/styles/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type { Workbook } from "./lib/model.js";
2
+ export { validateWorkbook } from "./lib/validate.js";
3
+ /**
4
+ * The media type of an .xlsx file, for `Content-Type` headers and `Blob` construction. The main
5
+ * part of the package carries it with a `.main+xml` suffix.
6
+ *
7
+ * @example
8
+ * new Response(bytes, { headers: { "Content-Type": XLSX_MIME_TYPE } })
9
+ */
10
+ export declare const XLSX_MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
11
+ /** Renders `[Content_Types].xml`: one override per part, plus the defaults readers expect. */
12
+ export declare function renderContentTypes(sheetCount: number): string;
13
+ /** Renders `_rels/.rels`: the package points at the workbook part. */
14
+ export declare function renderRootRelationships(): string;
15
+ /** What the workbook part needs per sheet: its name and, when filtered, its autofilter range. */
16
+ export interface SheetEntry {
17
+ readonly name: string;
18
+ readonly filterRange: string | undefined;
19
+ }
20
+ /**
21
+ * Renders `xl/workbook.xml`: the sheet list in tab order, each pointing at its relationship, and
22
+ * the hidden `_xlnm._FilterDatabase` name Excel keeps for every autofilter.
23
+ */
24
+ export declare function renderWorkbook(entries: readonly SheetEntry[]): string;
25
+ /** Renders `xl/_rels/workbook.xml.rels`: sheets first (rId1..N), then styles and shared strings. */
26
+ export declare function renderWorkbookRelationships(sheetCount: number): string;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workbook/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAQrD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,sEAAsE,CAAC;AAElG,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAe7D;AAED,sEAAsE;AACtE,wBAAgB,uBAAuB,IAAI,MAAM,CAMhD;AAED,iGAAiG;AACjG,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAgBrE;AAYD,oGAAoG;AACpG,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAYtE"}
@@ -0,0 +1,75 @@
1
+ import { XML_DECLARATION, escapeXml } from "../xml/index.js";
2
+ export { validateWorkbook } from "./lib/validate.js";
3
+ const CONTENT_TYPES_NAMESPACE = "http://schemas.openxmlformats.org/package/2006/content-types";
4
+ const RELATIONSHIPS_NAMESPACE = "http://schemas.openxmlformats.org/package/2006/relationships";
5
+ const SPREADSHEET_NAMESPACE = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
6
+ const OFFICE_RELATIONSHIPS_NAMESPACE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
7
+ /**
8
+ * The media type of an .xlsx file, for `Content-Type` headers and `Blob` construction. The main
9
+ * part of the package carries it with a `.main+xml` suffix.
10
+ *
11
+ * @example
12
+ * new Response(bytes, { headers: { "Content-Type": XLSX_MIME_TYPE } })
13
+ */
14
+ export const XLSX_MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
15
+ /** Renders `[Content_Types].xml`: one override per part, plus the defaults readers expect. */
16
+ export function renderContentTypes(sheetCount) {
17
+ let overrides = "";
18
+ for (let i = 1; i <= sheetCount; i++) {
19
+ overrides += `<Override PartName="/xl/worksheets/sheet${i}.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>`;
20
+ }
21
+ return (`${XML_DECLARATION}<Types xmlns="${CONTENT_TYPES_NAMESPACE}">` +
22
+ '<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>' +
23
+ '<Default Extension="xml" ContentType="application/xml"/>' +
24
+ `<Override PartName="/xl/workbook.xml" ContentType="${XLSX_MIME_TYPE}.main+xml"/>` +
25
+ '<Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/>' +
26
+ '<Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>' +
27
+ overrides +
28
+ "</Types>");
29
+ }
30
+ /** Renders `_rels/.rels`: the package points at the workbook part. */
31
+ export function renderRootRelationships() {
32
+ return (`${XML_DECLARATION}<Relationships xmlns="${RELATIONSHIPS_NAMESPACE}">` +
33
+ `<Relationship Id="rId1" Type="${OFFICE_RELATIONSHIPS_NAMESPACE}/officeDocument" Target="xl/workbook.xml"/>` +
34
+ "</Relationships>");
35
+ }
36
+ /**
37
+ * Renders `xl/workbook.xml`: the sheet list in tab order, each pointing at its relationship, and
38
+ * the hidden `_xlnm._FilterDatabase` name Excel keeps for every autofilter.
39
+ */
40
+ export function renderWorkbook(entries) {
41
+ let sheets = "";
42
+ let definedNames = "";
43
+ for (let i = 0; i < entries.length; i++) {
44
+ const entry = entries[i];
45
+ sheets += `<sheet name="${escapeXml(entry.name)}" sheetId="${i + 1}" r:id="rId${i + 1}"/>`;
46
+ if (entry.filterRange !== undefined) {
47
+ definedNames += `<definedName name="_xlnm._FilterDatabase" localSheetId="${i}" hidden="1">${escapeXml(quoteSheetName(entry.name))}!${absolute(entry.filterRange)}</definedName>`;
48
+ }
49
+ }
50
+ return (`${XML_DECLARATION}<workbook xmlns="${SPREADSHEET_NAMESPACE}" xmlns:r="${OFFICE_RELATIONSHIPS_NAMESPACE}">` +
51
+ `<sheets>${sheets}</sheets>` +
52
+ (definedNames.length === 0 ? "" : `<definedNames>${definedNames}</definedNames>`) +
53
+ "</workbook>");
54
+ }
55
+ /** A sheet name as a formula reference: quoted, with apostrophes doubled. */
56
+ function quoteSheetName(name) {
57
+ return `'${name.replaceAll("'", "''")}'`;
58
+ }
59
+ /** `A1:C4` as `$A$1:$C$4`. */
60
+ function absolute(range) {
61
+ return range.replace(/([A-Z]+)(\d+)/g, "$$$1$$$2");
62
+ }
63
+ /** Renders `xl/_rels/workbook.xml.rels`: sheets first (rId1..N), then styles and shared strings. */
64
+ export function renderWorkbookRelationships(sheetCount) {
65
+ let relationships = "";
66
+ for (let i = 1; i <= sheetCount; i++) {
67
+ relationships += `<Relationship Id="rId${i}" Type="${OFFICE_RELATIONSHIPS_NAMESPACE}/worksheet" Target="worksheets/sheet${i}.xml"/>`;
68
+ }
69
+ relationships += `<Relationship Id="rId${sheetCount + 1}" Type="${OFFICE_RELATIONSHIPS_NAMESPACE}/styles" Target="styles.xml"/>`;
70
+ relationships += `<Relationship Id="rId${sheetCount + 2}" Type="${OFFICE_RELATIONSHIPS_NAMESPACE}/sharedStrings" Target="sharedStrings.xml"/>`;
71
+ return (`${XML_DECLARATION}<Relationships xmlns="${RELATIONSHIPS_NAMESPACE}">` +
72
+ relationships +
73
+ "</Relationships>");
74
+ }
75
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workbook/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Sheet } from "../../worksheet/index.js";
2
+ /**
3
+ * Everything `writeXlsx` needs: the sheets, in tab order.
4
+ *
5
+ * @example
6
+ * const workbook: Workbook = { sheets: [{ name: "Sheet1", rows: [["Hello", 42]] }] };
7
+ */
8
+ export interface Workbook {
9
+ readonly sheets: readonly Sheet[];
10
+ }
11
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/workbook/lib/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;CACnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/workbook/lib/model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { Workbook } from "./model.js";
2
+ /** Throws the first problem Excel would refuse: no sheets, a bad sheet name, a duplicate name. */
3
+ export declare function validateWorkbook(workbook: Workbook): void;
4
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/workbook/lib/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAqBzD"}