zip-writer 1.0.0 → 1.1.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.
- package/README.md +427 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/{src/constants.ts → dist/constants.js} +1 -5
- package/dist/constants.js.map +1 -0
- package/{src/crc.ts → dist/crc-browser.d.ts} +2 -39
- package/dist/crc-browser.d.ts.map +1 -0
- package/dist/crc-browser.js +82 -0
- package/dist/crc-browser.js.map +1 -0
- package/dist/crc-node.d.ts +2 -0
- package/dist/crc-node.d.ts.map +1 -0
- package/dist/crc-node.js +3 -0
- package/dist/crc-node.js.map +1 -0
- package/dist/index.d.ts +138 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +298 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +12 -0
- package/dist/utils.js.map +1 -0
- package/dist/write-central-directory.d.ts +14 -0
- package/dist/write-central-directory.d.ts.map +1 -0
- package/dist/write-central-directory.js +279 -0
- package/dist/write-central-directory.js.map +1 -0
- package/dist/write-entry.d.ts +26 -0
- package/dist/write-entry.d.ts.map +1 -0
- package/dist/write-entry.js +172 -0
- package/dist/write-entry.js.map +1 -0
- package/package.json +32 -5
- package/.claude/settings.local.json +0 -11
- package/.github/workflows/test.yml +0 -36
- package/.husky/pre-commit +0 -1
- package/eslint.config.mjs +0 -9
- package/src/crc-lookup.ts +0 -27
- package/src/index.ts +0 -342
- package/src/utils.ts +0 -17
- package/src/write-central-directory.ts +0 -405
- package/src/write-entry.ts +0 -246
- package/test/commands.ts +0 -47
- package/test/crc.test.ts +0 -45
- package/test/integration.test.ts +0 -483
- package/test/utils.ts +0 -40
- package/tsconfig.json +0 -36
- package/tsconfig.node.json +0 -10
- 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, 0, true);
|
|
259
|
+
offset += 2;
|
|
260
|
+
// Disk where central directory starts
|
|
261
|
+
view.setUint16(offset, 0, 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,26 @@
|
|
|
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, crc32, }: {
|
|
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
|
+
/** CRC32 function to use */
|
|
15
|
+
crc32: (data: Uint8Array<ArrayBuffer>, value?: number) => number;
|
|
16
|
+
}): Promise<EntryInfoZip64 | EntryInfoStandard>;
|
|
17
|
+
export declare function getLocalFileHeader(options: EntryOptions): Uint8Array<ArrayBuffer>;
|
|
18
|
+
export declare function getDataDescriptorStandard(entryInfo: {
|
|
19
|
+
uncompressedSize: number;
|
|
20
|
+
compressedSize: number;
|
|
21
|
+
}): Uint8Array<ArrayBuffer>;
|
|
22
|
+
export declare function getDataDescriptorZip64(entryInfo: {
|
|
23
|
+
uncompressedSize: bigint;
|
|
24
|
+
compressedSize: bigint;
|
|
25
|
+
}): Uint8Array<ArrayBuffer>;
|
|
26
|
+
//# 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;AAiBpB;;GAEG;AACH,wBAAsB,aAAa,CAAC,EAClC,MAAM,EACN,MAAM,EACN,YAAY,EACZ,WAAW,EACX,KAAK,GACN,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;IACpB,4BAA4B;IAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAClE,+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,172 @@
|
|
|
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
|
+
const textEncoder = new TextEncoder();
|
|
4
|
+
/**
|
|
5
|
+
* Write a zip entry to the given writer from the given reader.
|
|
6
|
+
*/
|
|
7
|
+
export async function writeZipEntry({ writer, reader, entryOptions, startOffset, crc32, }) {
|
|
8
|
+
let uncompressedSize = BigInt(0);
|
|
9
|
+
let compressedSize = BigInt(0);
|
|
10
|
+
let crc = 0;
|
|
11
|
+
await writer.write(getLocalFileHeader(entryOptions));
|
|
12
|
+
if (entryOptions.store) {
|
|
13
|
+
// Store mode: no compression, direct copy
|
|
14
|
+
while (true) {
|
|
15
|
+
const { value, done } = await reader.read();
|
|
16
|
+
if (done)
|
|
17
|
+
break;
|
|
18
|
+
const byteLength = BigInt(value.byteLength);
|
|
19
|
+
uncompressedSize += byteLength;
|
|
20
|
+
compressedSize += byteLength;
|
|
21
|
+
crc = crc32(value, crc);
|
|
22
|
+
await writer.write(value);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Deflate mode: manual reader/writer loops to minimize overhead
|
|
27
|
+
const compressionStream = new CompressionStream("deflate-raw");
|
|
28
|
+
const compressionWriter = compressionStream.writable.getWriter();
|
|
29
|
+
const compressionReader = compressionStream.readable.getReader();
|
|
30
|
+
const writePromise = (async () => {
|
|
31
|
+
try {
|
|
32
|
+
while (true) {
|
|
33
|
+
const { value, done } = await reader.read();
|
|
34
|
+
if (done)
|
|
35
|
+
break;
|
|
36
|
+
uncompressedSize += BigInt(value.byteLength);
|
|
37
|
+
crc = crc32(value, crc);
|
|
38
|
+
await compressionWriter.write(value);
|
|
39
|
+
}
|
|
40
|
+
await compressionWriter.close();
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
await compressionWriter.abort(err);
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
})();
|
|
47
|
+
const readPromise = (async () => {
|
|
48
|
+
try {
|
|
49
|
+
while (true) {
|
|
50
|
+
const { value, done } = await compressionReader.read();
|
|
51
|
+
if (done)
|
|
52
|
+
break;
|
|
53
|
+
compressedSize += BigInt(value.byteLength);
|
|
54
|
+
await writer.write(value);
|
|
55
|
+
}
|
|
56
|
+
compressionReader.releaseLock();
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
await compressionReader.cancel(err);
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
})();
|
|
63
|
+
await Promise.all([writePromise, readPromise]);
|
|
64
|
+
}
|
|
65
|
+
const needsZip64 = uncompressedSize > ZIP64_LIMIT ||
|
|
66
|
+
compressedSize > ZIP64_LIMIT ||
|
|
67
|
+
startOffset > ZIP64_LIMIT;
|
|
68
|
+
if (needsZip64) {
|
|
69
|
+
const entryInfo = {
|
|
70
|
+
...entryOptions,
|
|
71
|
+
startOffset,
|
|
72
|
+
crc32: crc,
|
|
73
|
+
uncompressedSize,
|
|
74
|
+
compressedSize,
|
|
75
|
+
zip64: true,
|
|
76
|
+
};
|
|
77
|
+
await writer.write(getDataDescriptorZip64(entryInfo));
|
|
78
|
+
return entryInfo;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const entryInfo = {
|
|
82
|
+
...entryOptions,
|
|
83
|
+
startOffset: Number(startOffset),
|
|
84
|
+
crc32: crc,
|
|
85
|
+
uncompressedSize: Number(uncompressedSize),
|
|
86
|
+
compressedSize: Number(compressedSize),
|
|
87
|
+
zip64: false,
|
|
88
|
+
};
|
|
89
|
+
await writer.write(getDataDescriptorStandard(entryInfo));
|
|
90
|
+
return entryInfo;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function getLocalFileHeader(options) {
|
|
94
|
+
const nameBytes = textEncoder.encode(options.name);
|
|
95
|
+
const headerSize = LOCAL_FILE_HEADER_SIZE + nameBytes.length;
|
|
96
|
+
const header = new Uint8Array(headerSize);
|
|
97
|
+
const view = new DataView(header.buffer);
|
|
98
|
+
let offset = 0;
|
|
99
|
+
// Local file header signature
|
|
100
|
+
view.setUint32(offset, LOCAL_FILE_HEADER_SIGNATURE);
|
|
101
|
+
offset += 4;
|
|
102
|
+
// Version needed to extract
|
|
103
|
+
view.setUint16(offset, VERSION_NEEDED_STANDARD);
|
|
104
|
+
offset += 2;
|
|
105
|
+
// General purpose bit flag
|
|
106
|
+
view.setUint16(offset, GENERAL_PURPOSE_FLAGS);
|
|
107
|
+
offset += 2;
|
|
108
|
+
// Compression method
|
|
109
|
+
view.setUint16(offset, options.store ? COMPRESSION_METHOD_STORE : COMPRESSION_METHOD_DEFLATE, true);
|
|
110
|
+
offset += 2;
|
|
111
|
+
// Last mod file time & date (MS-DOS format)
|
|
112
|
+
const date = options.date || new Date();
|
|
113
|
+
view.setUint16(offset, getDosTime(date), true);
|
|
114
|
+
offset += 2;
|
|
115
|
+
view.setUint16(offset, getDosDate(date), true);
|
|
116
|
+
offset += 2;
|
|
117
|
+
// CRC-32 (0 when using data descriptor)
|
|
118
|
+
view.setUint32(offset, 0, true);
|
|
119
|
+
offset += 4;
|
|
120
|
+
// Compressed size (0 when using data descriptor)
|
|
121
|
+
view.setUint32(offset, 0, true);
|
|
122
|
+
offset += 4;
|
|
123
|
+
// Uncompressed size (0 when using data descriptor)
|
|
124
|
+
view.setUint32(offset, 0, true);
|
|
125
|
+
offset += 4;
|
|
126
|
+
// File name length
|
|
127
|
+
view.setUint16(offset, nameBytes.length, true);
|
|
128
|
+
offset += 2;
|
|
129
|
+
// Extra field length
|
|
130
|
+
view.setUint16(offset, 0, true);
|
|
131
|
+
offset += 2;
|
|
132
|
+
// File name
|
|
133
|
+
header.set(nameBytes, offset);
|
|
134
|
+
return header;
|
|
135
|
+
}
|
|
136
|
+
export function getDataDescriptorStandard(entryInfo) {
|
|
137
|
+
const descriptor = new Uint8Array(DATA_DESCRIPTOR_SIZE);
|
|
138
|
+
const view = new DataView(descriptor.buffer);
|
|
139
|
+
let offset = 0;
|
|
140
|
+
// Data descriptor signature
|
|
141
|
+
view.setUint32(offset, DATA_DESCRIPTOR_SIGNATURE);
|
|
142
|
+
offset += 4;
|
|
143
|
+
// CRC-32 (TODO: implement CRC calculation)
|
|
144
|
+
view.setUint32(offset, 0, true);
|
|
145
|
+
offset += 4;
|
|
146
|
+
// Compressed size (4 bytes)
|
|
147
|
+
view.setUint32(offset, entryInfo.compressedSize, true);
|
|
148
|
+
offset += 4;
|
|
149
|
+
// Uncompressed size (4 bytes)
|
|
150
|
+
view.setUint32(offset, entryInfo.uncompressedSize, true);
|
|
151
|
+
offset += 4;
|
|
152
|
+
return descriptor;
|
|
153
|
+
}
|
|
154
|
+
export function getDataDescriptorZip64(entryInfo) {
|
|
155
|
+
const descriptor = new Uint8Array(DATA_DESCRIPTOR_SIZE_ZIP64);
|
|
156
|
+
const view = new DataView(descriptor.buffer);
|
|
157
|
+
let offset = 0;
|
|
158
|
+
// Data descriptor signature
|
|
159
|
+
view.setUint32(offset, DATA_DESCRIPTOR_SIGNATURE);
|
|
160
|
+
offset += 4;
|
|
161
|
+
// CRC-32 (TODO: implement CRC calculation)
|
|
162
|
+
view.setUint32(offset, 0, true);
|
|
163
|
+
offset += 4;
|
|
164
|
+
// Compressed size (8 bytes for ZIP64)
|
|
165
|
+
view.setBigUint64(offset, entryInfo.compressedSize, true);
|
|
166
|
+
offset += 8;
|
|
167
|
+
// Uncompressed size (8 bytes for ZIP64)
|
|
168
|
+
view.setBigUint64(offset, entryInfo.uncompressedSize, true);
|
|
169
|
+
offset += 8;
|
|
170
|
+
return descriptor;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=write-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-entry.js","sourceRoot":"","sources":["../src/write-entry.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,WAAW,EACX,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,MAAM,EACN,MAAM,EACN,YAAY,EACZ,WAAW,EACX,KAAK,GAYN;IACC,IAAI,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,MAAM,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;IAErD,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,0CAA0C;QAC1C,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC5C,gBAAgB,IAAI,UAAU,CAAC;YAC/B,cAAc,IAAI,UAAU,CAAC;YAC7B,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACxB,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,gEAAgE;QAChE,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC/D,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACjE,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAEjE,MAAM,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;YAC/B,IAAI,CAAC;gBACH,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC5C,IAAI,IAAI;wBAAE,MAAM;oBAChB,gBAAgB,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAC7C,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACxB,MAAM,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvC,CAAC;gBACD,MAAM,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnC,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9B,IAAI,CAAC;gBACH,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;oBACvD,IAAI,IAAI;wBAAE,MAAM;oBAChB,cAAc,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAC3C,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;gBACD,iBAAiB,CAAC,WAAW,EAAE,CAAC;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,UAAU,GACd,gBAAgB,GAAG,WAAW;QAC9B,cAAc,GAAG,WAAW;QAC5B,WAAW,GAAG,WAAW,CAAC;IAE5B,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,SAAS,GAAmB;YAChC,GAAG,YAAY;YACf,WAAW;YACX,KAAK,EAAE,GAAG;YACV,gBAAgB;YAChB,cAAc;YACd,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,MAAM,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAsB;YACnC,GAAG,YAAY;YACf,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;YAChC,KAAK,EAAE,GAAG;YACV,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC;YAC1C,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC;YACtC,KAAK,EAAE,KAAK;SACb,CAAC;QACF,MAAM,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC;QACzD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAqB;IAErB,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,sBAAsB,GAAG,SAAS,CAAC,MAAM,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,8BAA8B;IAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACpD,MAAM,IAAI,CAAC,CAAC;IAEZ,4BAA4B;IAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAChD,MAAM,IAAI,CAAC,CAAC;IAEZ,2BAA2B;IAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC9C,MAAM,IAAI,CAAC,CAAC;IAEZ,qBAAqB;IACrB,IAAI,CAAC,SAAS,CACZ,MAAM,EACN,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,0BAA0B,EACrE,IAAI,CACL,CAAC;IACF,MAAM,IAAI,CAAC,CAAC;IAEZ,4CAA4C;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,CAAC,CAAC;IACZ,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,CAAC,CAAC;IAEZ,wCAAwC;IACxC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,CAAC,CAAC;IAEZ,iDAAiD;IACjD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,CAAC,CAAC;IAEZ,mDAAmD;IACnD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,CAAC,CAAC;IAEZ,mBAAmB;IACnB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,CAAC,CAAC;IAEZ,qBAAqB;IACrB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,CAAC,CAAC;IAEZ,YAAY;IACZ,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAGzC;IACC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAE7C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,4BAA4B;IAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAClD,MAAM,IAAI,CAAC,CAAC;IAEZ,2CAA2C;IAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,CAAC,CAAC;IAEZ,4BAA4B;IAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,IAAI,CAAC,CAAC;IAEZ,8BAA8B;IAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,IAAI,CAAC,CAAC;IAEZ,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAGtC;IACC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,0BAA0B,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAE7C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,4BAA4B;IAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAClD,MAAM,IAAI,CAAC,CAAC;IAEZ,2CAA2C;IAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,CAAC,CAAC;IAEZ,sCAAsC;IACtC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,IAAI,CAAC,CAAC;IAEZ,wCAAwC;IACxC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,IAAI,CAAC,CAAC;IAEZ,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,61 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zip-writer",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"exports": {
|
|
5
|
+
".": {
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"import": "./dist/index.js"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"imports": {
|
|
11
|
+
"#crc32": {
|
|
12
|
+
"browser": "./src/crc-browser.ts",
|
|
13
|
+
"default": "./src/crc-node.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
5
16
|
"type": "module",
|
|
6
17
|
"scripts": {
|
|
7
|
-
"test": "run-s test:types test:lint test:
|
|
18
|
+
"test": "run-s test:types test:lint test:vitest",
|
|
8
19
|
"prepare": "husky",
|
|
9
20
|
"test:types": "tsc --noEmit",
|
|
10
21
|
"test:lint": "eslint .",
|
|
11
|
-
"test:
|
|
12
|
-
"
|
|
22
|
+
"test:vitest": "vitest",
|
|
23
|
+
"bench": "vitest bench",
|
|
24
|
+
"format": "prettier --write .",
|
|
25
|
+
"prepack": "rimraf dist && tsc"
|
|
13
26
|
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
14
30
|
"keywords": [],
|
|
15
31
|
"author": "",
|
|
16
32
|
"license": "ISC",
|
|
17
33
|
"description": "",
|
|
18
34
|
"devDependencies": {
|
|
35
|
+
"@node-rs/crc32": "^1.10.6",
|
|
36
|
+
"@types/archiver": "^7.0.0",
|
|
19
37
|
"@types/node": "^24.10.0",
|
|
20
38
|
"@types/yauzl-promise": "^4.0.1",
|
|
21
39
|
"@vitest/browser": "^4.0.7",
|
|
22
40
|
"@vitest/browser-playwright": "^4.0.7",
|
|
41
|
+
"@zip.js/zip.js": "^2.8.8",
|
|
42
|
+
"archiver": "^7.0.1",
|
|
23
43
|
"eslint": "^9.39.1",
|
|
44
|
+
"execa": "^9.6.0",
|
|
45
|
+
"fflate": "^0.8.2",
|
|
24
46
|
"globals": "^16.5.0",
|
|
25
47
|
"husky": "^9.1.7",
|
|
26
48
|
"lint-staged": "^16.2.6",
|
|
27
49
|
"npm-run-all": "^4.1.5",
|
|
28
50
|
"playwright": "^1.56.1",
|
|
29
51
|
"prettier": "^3.6.2",
|
|
52
|
+
"rimraf": "^6.1.0",
|
|
30
53
|
"typescript": "^5.9.3",
|
|
31
54
|
"vitest": "^4.0.7",
|
|
32
55
|
"yauzl-promise": "^4.0.0"
|
|
56
|
+
},
|
|
57
|
+
"lint-staged": {
|
|
58
|
+
"*.js": "eslint --cache --fix",
|
|
59
|
+
"*.{js,css,md}": "prettier --write"
|
|
33
60
|
}
|
|
34
61
|
}
|
|
@@ -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
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
|
-
}
|