zip-writer 1.0.0 → 1.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 (45) hide show
  1. package/dist/constants.d.ts +21 -0
  2. package/dist/constants.d.ts.map +1 -0
  3. package/{src/constants.ts → dist/constants.js} +1 -5
  4. package/dist/constants.js.map +1 -0
  5. package/dist/crc-lookup.d.ts +6 -0
  6. package/dist/crc-lookup.d.ts.map +1 -0
  7. package/dist/crc-lookup.js +22 -0
  8. package/dist/crc-lookup.js.map +1 -0
  9. package/{src/crc.ts → dist/crc.d.ts} +2 -39
  10. package/dist/crc.d.ts.map +1 -0
  11. package/dist/crc.js +62 -0
  12. package/dist/crc.js.map +1 -0
  13. package/dist/index.d.ts +104 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +245 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/utils.d.ts +4 -0
  18. package/dist/utils.d.ts.map +1 -0
  19. package/dist/utils.js +12 -0
  20. package/dist/utils.js.map +1 -0
  21. package/dist/write-central-directory.d.ts +14 -0
  22. package/dist/write-central-directory.d.ts.map +1 -0
  23. package/dist/write-central-directory.js +279 -0
  24. package/dist/write-central-directory.js.map +1 -0
  25. package/dist/write-entry.d.ts +24 -0
  26. package/dist/write-entry.d.ts.map +1 -0
  27. package/dist/write-entry.js +173 -0
  28. package/dist/write-entry.js.map +1 -0
  29. package/package.json +12 -3
  30. package/.claude/settings.local.json +0 -11
  31. package/.github/workflows/test.yml +0 -36
  32. package/.husky/pre-commit +0 -1
  33. package/eslint.config.mjs +0 -9
  34. package/src/crc-lookup.ts +0 -27
  35. package/src/index.ts +0 -342
  36. package/src/utils.ts +0 -17
  37. package/src/write-central-directory.ts +0 -405
  38. package/src/write-entry.ts +0 -246
  39. package/test/commands.ts +0 -47
  40. package/test/crc.test.ts +0 -45
  41. package/test/integration.test.ts +0 -483
  42. package/test/utils.ts +0 -40
  43. package/tsconfig.json +0 -36
  44. package/tsconfig.node.json +0 -10
  45. package/vitest.config.ts +0 -46
@@ -0,0 +1,279 @@
1
+ import { CENTRAL_DIRECTORY_SIGNATURE, END_OF_CENTRAL_DIR_SIGNATURE, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE, VERSION_MADE_BY, VERSION_NEEDED_STANDARD, VERSION_NEEDED_ZIP64, GENERAL_PURPOSE_FLAGS, COMPRESSION_METHOD_STORE, COMPRESSION_METHOD_DEFLATE, ZIP64_LIMIT, CENTRAL_DIRECTORY_HEADER_SIZE, EOCD_SIZE, EOCD64_SIZE, EOCD64_LOCATOR_SIZE, } from "./constants.js";
2
+ import { getDosTime, getDosDate } from "./utils.js";
3
+ const textEncoder = new TextEncoder();
4
+ /**
5
+ * Generate the Central Directory File Header for the given entry info.
6
+ */
7
+ export function getCDFH(entryInfo) {
8
+ if (entryInfo.zip64) {
9
+ return getCDFHZip64(entryInfo);
10
+ }
11
+ else {
12
+ return getCDFHStandard(entryInfo);
13
+ }
14
+ }
15
+ function getCDFHStandard(entryInfo) {
16
+ const nameBytes = textEncoder.encode(entryInfo.name);
17
+ const commentBytes = entryInfo.comment
18
+ ? textEncoder.encode(entryInfo.comment)
19
+ : new Uint8Array(0);
20
+ const headerSize = CENTRAL_DIRECTORY_HEADER_SIZE + nameBytes.length + commentBytes.length;
21
+ const header = new Uint8Array(headerSize);
22
+ const view = new DataView(header.buffer);
23
+ let offset = 0;
24
+ // Central directory file header signature
25
+ view.setUint32(offset, CENTRAL_DIRECTORY_SIGNATURE);
26
+ offset += 4;
27
+ // Version made by
28
+ view.setUint16(offset, VERSION_MADE_BY, true);
29
+ offset += 2;
30
+ // Version needed to extract
31
+ view.setUint16(offset, VERSION_NEEDED_STANDARD, true);
32
+ offset += 2;
33
+ // General purpose bit flag
34
+ view.setUint16(offset, GENERAL_PURPOSE_FLAGS);
35
+ offset += 2;
36
+ // Compression method
37
+ view.setUint16(offset, entryInfo.store ? COMPRESSION_METHOD_STORE : COMPRESSION_METHOD_DEFLATE, true);
38
+ offset += 2;
39
+ // Last mod file time & date
40
+ const date = entryInfo.date || new Date();
41
+ view.setUint16(offset, getDosTime(date), true);
42
+ offset += 2;
43
+ view.setUint16(offset, getDosDate(date), true);
44
+ offset += 2;
45
+ // CRC-32
46
+ view.setUint32(offset, entryInfo.crc32, true);
47
+ offset += 4;
48
+ // Compressed size
49
+ view.setUint32(offset, entryInfo.compressedSize, true);
50
+ offset += 4;
51
+ // Uncompressed size
52
+ view.setUint32(offset, entryInfo.uncompressedSize, true);
53
+ offset += 4;
54
+ // File name length
55
+ view.setUint16(offset, nameBytes.length, true);
56
+ offset += 2;
57
+ // Extra field length
58
+ view.setUint16(offset, 0, true);
59
+ offset += 2;
60
+ // File comment length
61
+ view.setUint16(offset, commentBytes.length, true);
62
+ offset += 2;
63
+ // Disk number start
64
+ view.setUint16(offset, 0, true);
65
+ offset += 2;
66
+ // Internal file attributes
67
+ view.setUint16(offset, 0, true);
68
+ offset += 2;
69
+ // External file attributes (Unix permissions if provided)
70
+ const externalAttrs = entryInfo.mode ? entryInfo.mode << 16 : 0;
71
+ view.setUint32(offset, externalAttrs, true);
72
+ offset += 4;
73
+ // Relative offset of local header
74
+ view.setUint32(offset, entryInfo.startOffset, true);
75
+ offset += 4;
76
+ // File name
77
+ header.set(nameBytes, offset);
78
+ offset += nameBytes.length;
79
+ // File comment
80
+ if (commentBytes.length > 0) {
81
+ header.set(commentBytes, offset);
82
+ }
83
+ return header;
84
+ }
85
+ function getCDFHZip64(entryInfo) {
86
+ const nameBytes = textEncoder.encode(entryInfo.name);
87
+ const commentBytes = entryInfo.comment
88
+ ? textEncoder.encode(entryInfo.comment)
89
+ : new Uint8Array(0);
90
+ // Extra field for ZIP64
91
+ const extraField = new Uint8Array(28); // ZIP64 extra field
92
+ const extraView = new DataView(extraField.buffer);
93
+ extraView.setUint16(0, 0x0001, true); // ZIP64 extra field tag
94
+ extraView.setUint16(2, 24, true); // Size of extra field data (3x 8-byte fields)
95
+ extraView.setBigUint64(4, entryInfo.uncompressedSize, true); // Original size
96
+ extraView.setBigUint64(12, entryInfo.compressedSize, true); // Compressed size
97
+ extraView.setBigUint64(20, entryInfo.startOffset, true); // Relative header offset
98
+ const headerSize = CENTRAL_DIRECTORY_HEADER_SIZE +
99
+ nameBytes.length +
100
+ extraField.length +
101
+ commentBytes.length;
102
+ const header = new Uint8Array(headerSize);
103
+ const view = new DataView(header.buffer);
104
+ let offset = 0;
105
+ // Central directory file header signature
106
+ view.setUint32(offset, CENTRAL_DIRECTORY_SIGNATURE);
107
+ offset += 4;
108
+ // Version made by
109
+ view.setUint16(offset, VERSION_MADE_BY, true);
110
+ offset += 2;
111
+ // Version needed to extract
112
+ view.setUint16(offset, VERSION_NEEDED_ZIP64, true);
113
+ offset += 2;
114
+ // General purpose bit flag
115
+ view.setUint16(offset, GENERAL_PURPOSE_FLAGS);
116
+ offset += 2;
117
+ // Compression method
118
+ view.setUint16(offset, entryInfo.store ? COMPRESSION_METHOD_STORE : COMPRESSION_METHOD_DEFLATE, true);
119
+ offset += 2;
120
+ // Last mod file time & date
121
+ const date = entryInfo.date || new Date();
122
+ view.setUint16(offset, getDosTime(date), true);
123
+ offset += 2;
124
+ view.setUint16(offset, getDosDate(date), true);
125
+ offset += 2;
126
+ // CRC-32
127
+ view.setUint32(offset, entryInfo.crc32, true);
128
+ offset += 4;
129
+ // Compressed size (0xFFFFFFFF for ZIP64)
130
+ view.setUint32(offset, 0xffffffff, true);
131
+ offset += 4;
132
+ // Uncompressed size (0xFFFFFFFF for ZIP64)
133
+ view.setUint32(offset, 0xffffffff, true);
134
+ offset += 4;
135
+ // File name length
136
+ view.setUint16(offset, nameBytes.length, true);
137
+ offset += 2;
138
+ // Extra field length
139
+ view.setUint16(offset, extraField.length, true);
140
+ offset += 2;
141
+ // File comment length
142
+ view.setUint16(offset, commentBytes.length, true);
143
+ offset += 2;
144
+ // Disk number start
145
+ view.setUint16(offset, 0, true);
146
+ offset += 2;
147
+ // Internal file attributes
148
+ view.setUint16(offset, 0, true);
149
+ offset += 2;
150
+ // External file attributes (Unix permissions if provided)
151
+ const externalAttrs = entryInfo.mode ? entryInfo.mode << 16 : 0;
152
+ view.setUint32(offset, externalAttrs, true);
153
+ offset += 4;
154
+ // Relative offset of local header (0xFFFFFFFF for ZIP64)
155
+ view.setUint32(offset, 0xffffffff, true);
156
+ offset += 4;
157
+ // File name
158
+ header.set(nameBytes, offset);
159
+ offset += nameBytes.length;
160
+ // Extra field
161
+ header.set(extraField, offset);
162
+ offset += extraField.length;
163
+ // File comment
164
+ if (commentBytes.length > 0) {
165
+ header.set(commentBytes, offset);
166
+ }
167
+ return header;
168
+ }
169
+ /**
170
+ * Generate the End of Central Directory record with zip64 support.
171
+ */
172
+ export function getEOCDStandard(entriesCount, centralDirectoryOffset, centralDirectorySize) {
173
+ const eocd = new Uint8Array(EOCD_SIZE);
174
+ const view = new DataView(eocd.buffer);
175
+ let offset = 0;
176
+ // End of central dir signature
177
+ view.setUint32(offset, END_OF_CENTRAL_DIR_SIGNATURE);
178
+ offset += 4;
179
+ // Number of this disk
180
+ view.setUint16(offset, 0, true);
181
+ offset += 2;
182
+ // Disk where central directory starts
183
+ view.setUint16(offset, 0, true);
184
+ offset += 2;
185
+ // Number of central directory records on this disk
186
+ view.setUint16(offset, entriesCount, true);
187
+ offset += 2;
188
+ // Total number of central directory records
189
+ view.setUint16(offset, entriesCount, true);
190
+ offset += 2;
191
+ // Size of central directory
192
+ view.setUint32(offset, Number(centralDirectorySize), true);
193
+ offset += 4;
194
+ // Offset of start of central directory
195
+ view.setUint32(offset, Number(centralDirectoryOffset), true);
196
+ offset += 4;
197
+ // ZIP file comment length
198
+ view.setUint16(offset, 0, true);
199
+ return eocd;
200
+ }
201
+ /**
202
+ * Generate the ZIP64 End of Central Directory record.
203
+ */
204
+ export function getEOCDZip64(entriesCount, centralDirectoryOffset, centralDirectorySize) {
205
+ const totalSize = EOCD64_SIZE + EOCD64_LOCATOR_SIZE + EOCD_SIZE;
206
+ const buffer = new Uint8Array(totalSize);
207
+ const view = new DataView(buffer.buffer);
208
+ let offset = 0;
209
+ // === ZIP64 End of Central Directory Record ===
210
+ // Signature
211
+ view.setUint32(offset, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
212
+ offset += 4;
213
+ // Size of zip64 end of central directory record excluding the leading 12 bytes
214
+ view.setBigUint64(offset, BigInt(EOCD64_SIZE - 12), true);
215
+ offset += 8;
216
+ // Version made by
217
+ view.setUint16(offset, VERSION_MADE_BY, true);
218
+ offset += 2;
219
+ // Version needed to extract
220
+ view.setUint16(offset, VERSION_NEEDED_ZIP64, true);
221
+ offset += 2;
222
+ // Number of this disk
223
+ view.setUint32(offset, 0, true);
224
+ offset += 4;
225
+ // Disk where central directory starts
226
+ view.setUint32(offset, 0, true);
227
+ offset += 4;
228
+ // Number of central directory records on this disk
229
+ view.setBigUint64(offset, entriesCount, true);
230
+ offset += 8;
231
+ // Total number of central directory records
232
+ view.setBigUint64(offset, entriesCount, true);
233
+ offset += 8;
234
+ // Size of central directory
235
+ view.setBigUint64(offset, centralDirectorySize, true);
236
+ offset += 8;
237
+ // Offset of start of central directory
238
+ view.setBigUint64(offset, centralDirectoryOffset, true);
239
+ offset += 8;
240
+ // === ZIP64 End of Central Directory Locator ===
241
+ // Signature
242
+ view.setUint32(offset, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
243
+ offset += 4;
244
+ // Number of the disk with the start of the zip64 end of central directory
245
+ view.setUint32(offset, 0, true);
246
+ offset += 4;
247
+ // Relative offset of the zip64 end of central directory record
248
+ view.setBigUint64(offset, centralDirectoryOffset + centralDirectorySize, true);
249
+ offset += 8;
250
+ // Total number of disks
251
+ view.setUint32(offset, 1, true);
252
+ offset += 4;
253
+ // === Standard End of Central Directory Record ===
254
+ // Signature
255
+ view.setUint32(offset, END_OF_CENTRAL_DIR_SIGNATURE);
256
+ offset += 4;
257
+ // Number of this disk
258
+ view.setUint16(offset, 0xffff, true);
259
+ offset += 2;
260
+ // Disk where central directory starts
261
+ view.setUint16(offset, 0xffff, true);
262
+ offset += 2;
263
+ // Number of central directory records on this disk
264
+ view.setUint16(offset, 0xffff, true);
265
+ offset += 2;
266
+ // Total number of central directory records
267
+ view.setUint16(offset, 0xffff, true);
268
+ offset += 2;
269
+ // Size of central directory
270
+ view.setUint32(offset, 0xffffffff, true);
271
+ offset += 4;
272
+ // Offset of start of central directory
273
+ view.setUint32(offset, 0xffffffff, true);
274
+ offset += 4;
275
+ // ZIP file comment length
276
+ view.setUint16(offset, 0, true);
277
+ return buffer;
278
+ }
279
+ //# sourceMappingURL=write-central-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-central-directory.js","sourceRoot":"","sources":["../src/write-central-directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { EntryInfoStandard, EntryInfoZip64, EntryOptions } from "./index.js";
2
+ /**
3
+ * Write a zip entry to the given writer from the given reader.
4
+ */
5
+ export declare function writeZipEntry({ writer, reader, entryOptions, startOffset, }: {
6
+ /** Writer for the zip archive */
7
+ writer: WritableStreamDefaultWriter<Uint8Array<ArrayBuffer>>;
8
+ /** Reader for the entry data */
9
+ reader: ReadableStreamDefaultReader<Uint8Array<ArrayBuffer>>;
10
+ /** Options for the zip entry */
11
+ entryOptions: EntryOptions;
12
+ /** Offset in the zip archive where this entry starts */
13
+ startOffset: bigint;
14
+ }): Promise<EntryInfoZip64 | EntryInfoStandard>;
15
+ export declare function getLocalFileHeader(options: EntryOptions): Uint8Array<ArrayBuffer>;
16
+ export declare function getDataDescriptorStandard(entryInfo: {
17
+ uncompressedSize: number;
18
+ compressedSize: number;
19
+ }): Uint8Array<ArrayBuffer>;
20
+ export declare function getDataDescriptorZip64(entryInfo: {
21
+ uncompressedSize: bigint;
22
+ compressedSize: bigint;
23
+ }): Uint8Array<ArrayBuffer>;
24
+ //# sourceMappingURL=write-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-entry.d.ts","sourceRoot":"","sources":["../src/write-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,YAAY,EACb,MAAM,YAAY,CAAC;AAkBpB;;GAEG;AACH,wBAAsB,aAAa,CAAC,EAClC,MAAM,EACN,MAAM,EACN,YAAY,EACZ,WAAW,GACZ,EAAE;IACD,iCAAiC;IACjC,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,gCAAgC;IAChC,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,gCAAgC;IAChC,YAAY,EAAE,YAAY,CAAC;IAC3B,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;CACrB,+CAsFA;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,YAAY,GACpB,UAAU,CAAC,WAAW,CAAC,CA4DzB;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE;IACnD,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,UAAU,CAAC,WAAW,CAAC,CAuB1B;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE;IAChD,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,UAAU,CAAC,WAAW,CAAC,CAuB1B"}
@@ -0,0 +1,173 @@
1
+ import { LOCAL_FILE_HEADER_SIGNATURE, DATA_DESCRIPTOR_SIGNATURE, VERSION_NEEDED_STANDARD, GENERAL_PURPOSE_FLAGS, COMPRESSION_METHOD_STORE, COMPRESSION_METHOD_DEFLATE, LOCAL_FILE_HEADER_SIZE, ZIP64_LIMIT, DATA_DESCRIPTOR_SIZE, DATA_DESCRIPTOR_SIZE_ZIP64, } from "./constants.js";
2
+ import { getDosTime, getDosDate } from "./utils.js";
3
+ import { crc32 } from "./crc.js";
4
+ const textEncoder = new TextEncoder();
5
+ /**
6
+ * Write a zip entry to the given writer from the given reader.
7
+ */
8
+ export async function writeZipEntry({ writer, reader, entryOptions, startOffset, }) {
9
+ let uncompressedSize = BigInt(0);
10
+ let compressedSize = BigInt(0);
11
+ let crc = 0;
12
+ await writer.write(getLocalFileHeader(entryOptions));
13
+ if (entryOptions.store) {
14
+ // Store mode: no compression, direct copy
15
+ while (true) {
16
+ const { value, done } = await reader.read();
17
+ if (done)
18
+ break;
19
+ const byteLength = BigInt(value.byteLength);
20
+ uncompressedSize += byteLength;
21
+ compressedSize += byteLength;
22
+ crc = crc32(value, crc);
23
+ await writer.write(value);
24
+ }
25
+ }
26
+ else {
27
+ // Deflate mode: manual reader/writer loops to minimize overhead
28
+ const compressionStream = new CompressionStream("deflate-raw");
29
+ const compressionWriter = compressionStream.writable.getWriter();
30
+ const compressionReader = compressionStream.readable.getReader();
31
+ const writePromise = (async () => {
32
+ try {
33
+ while (true) {
34
+ const { value, done } = await reader.read();
35
+ if (done)
36
+ break;
37
+ uncompressedSize += BigInt(value.byteLength);
38
+ crc = crc32(value, crc);
39
+ await compressionWriter.write(value);
40
+ }
41
+ await compressionWriter.close();
42
+ }
43
+ catch (err) {
44
+ await compressionWriter.abort(err);
45
+ throw err;
46
+ }
47
+ })();
48
+ const readPromise = (async () => {
49
+ try {
50
+ while (true) {
51
+ const { value, done } = await compressionReader.read();
52
+ if (done)
53
+ break;
54
+ compressedSize += BigInt(value.byteLength);
55
+ await writer.write(value);
56
+ }
57
+ compressionReader.releaseLock();
58
+ }
59
+ catch (err) {
60
+ await compressionReader.cancel(err);
61
+ throw err;
62
+ }
63
+ })();
64
+ await Promise.all([writePromise, readPromise]);
65
+ }
66
+ const needsZip64 = uncompressedSize > ZIP64_LIMIT ||
67
+ compressedSize > ZIP64_LIMIT ||
68
+ startOffset > ZIP64_LIMIT;
69
+ if (needsZip64) {
70
+ const entryInfo = {
71
+ ...entryOptions,
72
+ startOffset,
73
+ crc32: crc,
74
+ uncompressedSize,
75
+ compressedSize,
76
+ zip64: true,
77
+ };
78
+ await writer.write(getDataDescriptorZip64(entryInfo));
79
+ return entryInfo;
80
+ }
81
+ else {
82
+ const entryInfo = {
83
+ ...entryOptions,
84
+ startOffset: Number(startOffset),
85
+ crc32: crc,
86
+ uncompressedSize: Number(uncompressedSize),
87
+ compressedSize: Number(compressedSize),
88
+ zip64: false,
89
+ };
90
+ await writer.write(getDataDescriptorStandard(entryInfo));
91
+ return entryInfo;
92
+ }
93
+ }
94
+ export function getLocalFileHeader(options) {
95
+ const nameBytes = textEncoder.encode(options.name);
96
+ const headerSize = LOCAL_FILE_HEADER_SIZE + nameBytes.length;
97
+ const header = new Uint8Array(headerSize);
98
+ const view = new DataView(header.buffer);
99
+ let offset = 0;
100
+ // Local file header signature
101
+ view.setUint32(offset, LOCAL_FILE_HEADER_SIGNATURE);
102
+ offset += 4;
103
+ // Version needed to extract
104
+ view.setUint16(offset, VERSION_NEEDED_STANDARD);
105
+ offset += 2;
106
+ // General purpose bit flag
107
+ view.setUint16(offset, GENERAL_PURPOSE_FLAGS);
108
+ offset += 2;
109
+ // Compression method
110
+ view.setUint16(offset, options.store ? COMPRESSION_METHOD_STORE : COMPRESSION_METHOD_DEFLATE, true);
111
+ offset += 2;
112
+ // Last mod file time & date (MS-DOS format)
113
+ const date = options.date || new Date();
114
+ view.setUint16(offset, getDosTime(date), true);
115
+ offset += 2;
116
+ view.setUint16(offset, getDosDate(date), true);
117
+ offset += 2;
118
+ // CRC-32 (0 when using data descriptor)
119
+ view.setUint32(offset, 0, true);
120
+ offset += 4;
121
+ // Compressed size (0 when using data descriptor)
122
+ view.setUint32(offset, 0, true);
123
+ offset += 4;
124
+ // Uncompressed size (0 when using data descriptor)
125
+ view.setUint32(offset, 0, true);
126
+ offset += 4;
127
+ // File name length
128
+ view.setUint16(offset, nameBytes.length, true);
129
+ offset += 2;
130
+ // Extra field length
131
+ view.setUint16(offset, 0, true);
132
+ offset += 2;
133
+ // File name
134
+ header.set(nameBytes, offset);
135
+ return header;
136
+ }
137
+ export function getDataDescriptorStandard(entryInfo) {
138
+ const descriptor = new Uint8Array(DATA_DESCRIPTOR_SIZE);
139
+ const view = new DataView(descriptor.buffer);
140
+ let offset = 0;
141
+ // Data descriptor signature
142
+ view.setUint32(offset, DATA_DESCRIPTOR_SIGNATURE);
143
+ offset += 4;
144
+ // CRC-32 (TODO: implement CRC calculation)
145
+ view.setUint32(offset, 0, true);
146
+ offset += 4;
147
+ // Compressed size (4 bytes)
148
+ view.setUint32(offset, entryInfo.compressedSize, true);
149
+ offset += 4;
150
+ // Uncompressed size (4 bytes)
151
+ view.setUint32(offset, entryInfo.uncompressedSize, true);
152
+ offset += 4;
153
+ return descriptor;
154
+ }
155
+ export function getDataDescriptorZip64(entryInfo) {
156
+ const descriptor = new Uint8Array(DATA_DESCRIPTOR_SIZE_ZIP64);
157
+ const view = new DataView(descriptor.buffer);
158
+ let offset = 0;
159
+ // Data descriptor signature
160
+ view.setUint32(offset, DATA_DESCRIPTOR_SIGNATURE);
161
+ offset += 4;
162
+ // CRC-32 (TODO: implement CRC calculation)
163
+ view.setUint32(offset, 0, true);
164
+ offset += 4;
165
+ // Compressed size (8 bytes for ZIP64)
166
+ view.setBigUint64(offset, entryInfo.compressedSize, true);
167
+ offset += 8;
168
+ // Uncompressed size (8 bytes for ZIP64)
169
+ view.setBigUint64(offset, entryInfo.uncompressedSize, true);
170
+ offset += 8;
171
+ return descriptor;
172
+ }
173
+ //# sourceMappingURL=write-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-entry.js","sourceRoot":"","sources":["../src/write-entry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "name": "zip-writer",
3
- "version": "1.0.0",
4
- "main": "index.js",
3
+ "version": "1.0.1",
4
+ "exports": {
5
+ ".": {
6
+ "types": "./dist/index.d.ts",
7
+ "import": "./dist/index.js"
8
+ }
9
+ },
5
10
  "type": "module",
6
11
  "scripts": {
7
12
  "test": "run-s test:types test:lint test:e2e",
@@ -9,8 +14,11 @@
9
14
  "test:types": "tsc --noEmit",
10
15
  "test:lint": "eslint .",
11
16
  "test:e2e": "vitest",
12
- "prepack": "tsc"
17
+ "prepack": "rimraf dist && tsc"
13
18
  },
19
+ "files": [
20
+ "dist"
21
+ ],
14
22
  "keywords": [],
15
23
  "author": "",
16
24
  "license": "ISC",
@@ -27,6 +35,7 @@
27
35
  "npm-run-all": "^4.1.5",
28
36
  "playwright": "^1.56.1",
29
37
  "prettier": "^3.6.2",
38
+ "rimraf": "^6.1.0",
30
39
  "typescript": "^5.9.3",
31
40
  "vitest": "^4.0.7",
32
41
  "yauzl-promise": "^4.0.0"
@@ -1,11 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npm test)",
5
- "Bash(mkdir:*)",
6
- "Bash(npm run test:e2e:*)"
7
- ],
8
- "deny": [],
9
- "ask": []
10
- }
11
- }
@@ -1,36 +0,0 @@
1
- name: Test
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
8
-
9
- jobs:
10
- test:
11
- strategy:
12
- matrix:
13
- os: [ubuntu-latest, windows-latest, macos-latest]
14
- runs-on: ${{ matrix.os }}
15
-
16
- steps:
17
- - uses: actions/checkout@v4
18
-
19
- - name: Setup Node.js
20
- uses: actions/setup-node@v4
21
- with:
22
- node-version: '20'
23
- cache: 'npm'
24
-
25
- - name: Install dependencies
26
- run: npm ci
27
-
28
- - name: Install Playwright browsers
29
- run: npx playwright install --with-deps chromium firefox
30
-
31
- - name: Install Playwright webkit (macOS only)
32
- if: runner.os == 'macOS'
33
- run: npx playwright install --with-deps webkit
34
-
35
- - name: Run tests
36
- run: npm test
package/.husky/pre-commit DELETED
@@ -1 +0,0 @@
1
- npm test
package/eslint.config.mjs DELETED
@@ -1,9 +0,0 @@
1
- import globals from "globals";
2
- import { defineConfig } from "eslint/config";
3
-
4
- export default defineConfig([
5
- {
6
- files: ["**/*.{js,mjs,cjs}"],
7
- languageOptions: { globals: { ...globals.browser, ...globals.node } },
8
- },
9
- ]);
package/src/crc-lookup.ts DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * From https://github.com/holepunchto/crc-universal/blob/main/lookup.js
3
- * Licensed under Apache-2.0
4
- */
5
-
6
- export const lookup = new Array(16) as Uint32Array<ArrayBuffer>[];
7
-
8
- for (let i = 0; i < 16; i++) {
9
- lookup[i] = new Uint32Array(0x100);
10
- }
11
-
12
- for (let i = 0; i <= 0xff; i++) {
13
- let crc = i;
14
-
15
- for (let j = 0; j < 8; j++) {
16
- crc = (crc >>> 1) ^ ((crc & 1) * 0xedb88320);
17
- }
18
-
19
- lookup[0][i] = crc;
20
- }
21
-
22
- for (let i = 0; i <= 0xff; i++) {
23
- for (let j = 1; j < 16; j++) {
24
- lookup[j][i] =
25
- (lookup[j - 1][i] >>> 8) ^ lookup[0][lookup[j - 1][i] & 0xff];
26
- }
27
- }