zip-writer 1.1.1 → 2.0.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 +112 -132
- package/dist/index.d.ts +30 -57
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +141 -131
- package/dist/index.js.map +1 -1
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +20 -0
- package/dist/utils.js.map +1 -1
- package/dist/write-central-directory.d.ts +2 -2
- package/dist/write-central-directory.d.ts.map +1 -1
- package/dist/write-central-directory.js +5 -9
- package/dist/write-central-directory.js.map +1 -1
- package/dist/write-entry.d.ts +2 -17
- package/dist/write-entry.d.ts.map +1 -1
- package/dist/write-entry.js +4 -95
- package/dist/write-entry.js.map +1 -1
- package/package.json +28 -7
package/dist/write-entry.js
CHANGED
|
@@ -1,98 +1,7 @@
|
|
|
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,
|
|
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, DATA_DESCRIPTOR_SIZE, DATA_DESCRIPTOR_SIZE_ZIP64, LITTLE_ENDIAN, BIG_ENDIAN, } from "./constants.js";
|
|
2
2
|
import { getDosTime, getDosDate, writeDataView, UINT16, UINT32, UINT64, } 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 checksum = 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
|
-
checksum = crc32(value, checksum);
|
|
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
|
-
checksum = crc32(value, checksum);
|
|
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: checksum,
|
|
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: checksum,
|
|
85
|
-
uncompressedSize: Number(uncompressedSize),
|
|
86
|
-
compressedSize: Number(compressedSize),
|
|
87
|
-
zip64: false,
|
|
88
|
-
};
|
|
89
|
-
await writer.write(getDataDescriptorStandard(entryInfo));
|
|
90
|
-
return entryInfo;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
3
|
export function getLocalFileHeader(options) {
|
|
94
|
-
const
|
|
95
|
-
const headerSize = LOCAL_FILE_HEADER_SIZE + nameBytes.length;
|
|
4
|
+
const headerSize = LOCAL_FILE_HEADER_SIZE + options.nameBytes.length;
|
|
96
5
|
const header = new Uint8Array(headerSize);
|
|
97
6
|
const view = new DataView(header.buffer);
|
|
98
7
|
const date = options.date || new Date();
|
|
@@ -118,12 +27,12 @@ export function getLocalFileHeader(options) {
|
|
|
118
27
|
// Uncompressed size (0 when using data descriptor)
|
|
119
28
|
[UINT32, 0, LITTLE_ENDIAN],
|
|
120
29
|
// File name length
|
|
121
|
-
[UINT16, nameBytes.length, LITTLE_ENDIAN],
|
|
30
|
+
[UINT16, options.nameBytes.length, LITTLE_ENDIAN],
|
|
122
31
|
// Extra field length
|
|
123
32
|
[UINT16, 0, LITTLE_ENDIAN],
|
|
124
33
|
]);
|
|
125
34
|
// File name
|
|
126
|
-
header.set(nameBytes, offset);
|
|
35
|
+
header.set(options.nameBytes, offset);
|
|
127
36
|
return header;
|
|
128
37
|
}
|
|
129
38
|
export function getDataDescriptorStandard(entryInfo) {
|
package/dist/write-entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-entry.js","sourceRoot":"","sources":["../src/write-entry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"write-entry.js","sourceRoot":"","sources":["../src/write-entry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zip-writer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"exports": {
|
|
5
5
|
".": {
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
},
|
|
10
10
|
"imports": {
|
|
11
11
|
"#crc32": {
|
|
12
|
-
"browser": "./
|
|
13
|
-
"default": "./
|
|
12
|
+
"browser": "./dist/crc-browser.js",
|
|
13
|
+
"default": "./dist/crc-node.js"
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"type": "module",
|
|
@@ -21,16 +21,25 @@
|
|
|
21
21
|
"test:lint": "eslint .",
|
|
22
22
|
"test:vitest": "vitest",
|
|
23
23
|
"bench": "vitest bench",
|
|
24
|
+
"coverage": "vitest run --coverage",
|
|
24
25
|
"format": "prettier --write .",
|
|
25
26
|
"prepack": "rimraf dist && tsc"
|
|
26
27
|
},
|
|
27
28
|
"files": [
|
|
28
29
|
"dist"
|
|
29
30
|
],
|
|
30
|
-
"keywords": [
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
"keywords": [
|
|
32
|
+
"zip",
|
|
33
|
+
"archive",
|
|
34
|
+
"streaming",
|
|
35
|
+
"web streams",
|
|
36
|
+
"compression streams",
|
|
37
|
+
"javascript",
|
|
38
|
+
"typescript"
|
|
39
|
+
],
|
|
40
|
+
"author": "Gregor MacLennan <gmaclennan@gmail.com>",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"description": "A modern streaming ZIP archive writer for JavaScript that uses the Web Streams API and Compression Streams API.",
|
|
34
43
|
"devDependencies": {
|
|
35
44
|
"@node-rs/crc32": "^1.10.6",
|
|
36
45
|
"@types/archiver": "^7.0.0",
|
|
@@ -38,6 +47,7 @@
|
|
|
38
47
|
"@types/yauzl-promise": "^4.0.1",
|
|
39
48
|
"@vitest/browser": "^4.0.7",
|
|
40
49
|
"@vitest/browser-playwright": "^4.0.7",
|
|
50
|
+
"@vitest/coverage-istanbul": "^4.0.7",
|
|
41
51
|
"@zip.js/zip.js": "^2.8.8",
|
|
42
52
|
"archiver": "^7.0.1",
|
|
43
53
|
"eslint": "^9.39.1",
|
|
@@ -57,5 +67,16 @@
|
|
|
57
67
|
"lint-staged": {
|
|
58
68
|
"*.js": "eslint --cache --fix",
|
|
59
69
|
"*.{js,css,md}": "prettier --write"
|
|
70
|
+
},
|
|
71
|
+
"repository": {
|
|
72
|
+
"type": "git",
|
|
73
|
+
"url": "git+https://github.com/gmaclennan/zip-writer.git"
|
|
74
|
+
},
|
|
75
|
+
"bugs": {
|
|
76
|
+
"url": "https://github.com/gmaclennan/zip-writer/issues"
|
|
77
|
+
},
|
|
78
|
+
"homepage": "https://github.com/gmaclennan/zip-writer#readme",
|
|
79
|
+
"dependencies": {
|
|
80
|
+
"p-mutex": "^1.0.0"
|
|
60
81
|
}
|
|
61
82
|
}
|