@zip.js/zip.js 2.5.20 → 2.5.23
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/cli-deno/mc-zip.js +10 -4
- package/dist/zip-fs-full.js +48 -53
- package/dist/zip-fs-full.min.js +1 -1
- package/dist/zip-fs.js +48 -53
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-full.js +48 -53
- package/dist/zip-full.min.js +1 -1
- package/dist/zip-no-worker-deflate.min.js +1 -1
- package/dist/zip-no-worker-inflate.min.js +1 -1
- package/dist/zip-no-worker.min.js +1 -1
- package/dist/zip.js +48 -53
- package/dist/zip.min.js +1 -1
- package/index.d.ts +6 -0
- package/lib/core/zip-reader.js +16 -5
- package/lib/core/zip-writer.js +32 -48
- package/lib/zip-fs.js +3 -3
- package/lib/zip-full-fflate.js +3 -3
- package/lib/zip-full.js +3 -3
- package/lib/zip-no-worker-deflate.js +3 -3
- package/lib/zip-no-worker-fflate-deflate.js +3 -3
- package/lib/zip-no-worker-fflate-inflate.js +3 -3
- package/lib/zip-no-worker-fflate.js +3 -3
- package/lib/zip-no-worker-inflate.js +3 -3
- package/lib/zip-no-worker.js +3 -3
- package/lib/zip.js +3 -3
- package/package.json +1 -1
- package/rollup-fflate.config.js +3 -3
- package/tests/all/test-wrapped.js +8 -4
package/cli-deno/mc-zip.js
CHANGED
|
@@ -105,7 +105,7 @@ async function getFileInfo(file, options) {
|
|
|
105
105
|
name = file;
|
|
106
106
|
resolvedName = resolvePath(name);
|
|
107
107
|
}
|
|
108
|
-
name = normalizePath(
|
|
108
|
+
name = normalizePath(replaceSlashes(name));
|
|
109
109
|
if (resolvedName) {
|
|
110
110
|
if (options.preventParentDirectories) {
|
|
111
111
|
name = cleanFilename(name);
|
|
@@ -154,8 +154,9 @@ function getTextWriter(stdout) {
|
|
|
154
154
|
return textEncoderStream.writable.getWriter();
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
function
|
|
158
|
-
|
|
157
|
+
function replaceSlashes(url) {
|
|
158
|
+
url = url.replace(/\\/g, "/");
|
|
159
|
+
const match = url.match(/^(?:\/)?(.*?)(?:\/)?$/);
|
|
159
160
|
if (match) {
|
|
160
161
|
return match[1];
|
|
161
162
|
} else {
|
|
@@ -164,7 +165,12 @@ function trimSlashes(url) {
|
|
|
164
165
|
}
|
|
165
166
|
|
|
166
167
|
function cleanFilename(name) {
|
|
167
|
-
|
|
168
|
+
const result = replaceSlashes(("/" + name + "/").replace(/(\/|\\)+(\.+)(\/|\\)+/g, "/"));
|
|
169
|
+
if (result == name) {
|
|
170
|
+
return result;
|
|
171
|
+
} else {
|
|
172
|
+
return cleanFilename(result);
|
|
173
|
+
}
|
|
168
174
|
}
|
|
169
175
|
|
|
170
176
|
function toCamelCase(kebabCase) {
|
package/dist/zip-fs-full.js
CHANGED
|
@@ -8224,8 +8224,12 @@
|
|
|
8224
8224
|
const endOfDirectoryView = getDataView$1(endOfDirectoryInfo);
|
|
8225
8225
|
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
8226
8226
|
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
8227
|
+
const commentOffset = endOfDirectoryInfo.offset;
|
|
8228
|
+
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
8229
|
+
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
8227
8230
|
let filesLength = getUint16(endOfDirectoryView, 8);
|
|
8228
8231
|
let prependedDataLength = 0;
|
|
8232
|
+
let startOffset = 0;
|
|
8229
8233
|
if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS) {
|
|
8230
8234
|
const endOfDirectoryLocatorArray = await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH);
|
|
8231
8235
|
const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
|
|
@@ -8296,6 +8300,7 @@
|
|
|
8296
8300
|
commentUTF8: languageEncodingFlag,
|
|
8297
8301
|
rawExtraField: directoryArray.subarray(extraFieldOffset, commentOffset)
|
|
8298
8302
|
});
|
|
8303
|
+
startOffset = Math.max(fileEntry.offset, startOffset);
|
|
8299
8304
|
const endOffset = commentOffset + fileEntry.commentLength;
|
|
8300
8305
|
fileEntry.rawComment = directoryArray.subarray(commentOffset, endOffset);
|
|
8301
8306
|
const filenameEncoding = getOptionValue$1(zipReader, options, "filenameEncoding");
|
|
@@ -8322,16 +8327,22 @@
|
|
|
8322
8327
|
}
|
|
8323
8328
|
yield entry;
|
|
8324
8329
|
}
|
|
8330
|
+
const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
|
|
8331
|
+
const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
|
|
8332
|
+
if (extractPrependedData) {
|
|
8333
|
+
zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
|
|
8334
|
+
}
|
|
8335
|
+
zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
|
|
8336
|
+
if (extractAppendedData) {
|
|
8337
|
+
zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
|
|
8338
|
+
}
|
|
8325
8339
|
return true;
|
|
8326
8340
|
}
|
|
8327
8341
|
|
|
8328
8342
|
async getEntries(options = {}) {
|
|
8329
8343
|
const entries = [];
|
|
8330
|
-
const
|
|
8331
|
-
|
|
8332
|
-
while (!(await result).done) {
|
|
8333
|
-
entries.push((await result).value);
|
|
8334
|
-
result = iterator.next();
|
|
8344
|
+
for await (const entry of this.getEntriesGenerator(options)) {
|
|
8345
|
+
entries.push(entry);
|
|
8335
8346
|
}
|
|
8336
8347
|
return entries;
|
|
8337
8348
|
}
|
|
@@ -8779,7 +8790,7 @@
|
|
|
8779
8790
|
await Promise.all(Array.from(pendingAddFileCalls));
|
|
8780
8791
|
}
|
|
8781
8792
|
await closeFile(this, comment, options);
|
|
8782
|
-
if (!writer.preventClose) {
|
|
8793
|
+
if (!writer.preventClose && !options.preventClose) {
|
|
8783
8794
|
await writable.getWriter().close();
|
|
8784
8795
|
}
|
|
8785
8796
|
return writer.getData ? writer.getData() : writable;
|
|
@@ -8932,36 +8943,36 @@
|
|
|
8932
8943
|
const previousFileEntry = Array.from(files.values()).pop();
|
|
8933
8944
|
let fileEntry = {};
|
|
8934
8945
|
let bufferedWrite;
|
|
8935
|
-
let
|
|
8946
|
+
let releaseLockWriter;
|
|
8936
8947
|
let resolveLockCurrentFileEntry;
|
|
8948
|
+
let writingBufferedData;
|
|
8949
|
+
let fileWriter;
|
|
8937
8950
|
files.set(name, fileEntry);
|
|
8938
8951
|
try {
|
|
8939
8952
|
let lockPreviousFileEntry;
|
|
8940
|
-
let fileWriter;
|
|
8941
8953
|
if (options.keepOrder) {
|
|
8942
8954
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
8943
8955
|
}
|
|
8944
8956
|
fileEntry.lock = new Promise(resolve => resolveLockCurrentFileEntry = resolve);
|
|
8945
|
-
if (options.bufferedWrite || zipWriter.
|
|
8957
|
+
if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
|
|
8946
8958
|
fileWriter = new BlobWriter();
|
|
8947
8959
|
fileWriter.init();
|
|
8948
8960
|
bufferedWrite = true;
|
|
8949
8961
|
} else {
|
|
8950
|
-
zipWriter.
|
|
8962
|
+
zipWriter.lockWriter = Promise.resolve();
|
|
8951
8963
|
if (writer.init && !writer.initialized) {
|
|
8952
8964
|
await writer.init();
|
|
8953
8965
|
}
|
|
8954
8966
|
fileWriter = writer;
|
|
8955
8967
|
}
|
|
8956
|
-
fileEntry = await createFileEntry(reader, fileWriter.writable, zipWriter.config, options);
|
|
8968
|
+
fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
|
|
8957
8969
|
files.set(name, fileEntry);
|
|
8958
8970
|
fileEntry.filename = name;
|
|
8959
8971
|
if (bufferedWrite) {
|
|
8960
|
-
let
|
|
8961
|
-
const blob = fileWriter.getData();
|
|
8972
|
+
let blob = fileWriter.getData();
|
|
8962
8973
|
await lockPreviousFileEntry;
|
|
8963
|
-
await
|
|
8964
|
-
|
|
8974
|
+
await lockWriter();
|
|
8975
|
+
writingBufferedData = true;
|
|
8965
8976
|
const { writable } = writer;
|
|
8966
8977
|
if (!options.dataDescriptor) {
|
|
8967
8978
|
const headerLength = 26;
|
|
@@ -8978,10 +8989,10 @@
|
|
|
8978
8989
|
setUint32(arrayBufferView, 22, fileEntry.uncompressedSize);
|
|
8979
8990
|
}
|
|
8980
8991
|
await writeUint8Array(writable, new Uint8Array(arrayBuffer));
|
|
8981
|
-
|
|
8992
|
+
blob = blob.slice(headerLength);
|
|
8982
8993
|
}
|
|
8983
|
-
await
|
|
8984
|
-
|
|
8994
|
+
await blob.stream().pipeTo(writable, { preventClose: true });
|
|
8995
|
+
writingBufferedData = false;
|
|
8985
8996
|
}
|
|
8986
8997
|
fileEntry.offset = zipWriter.offset;
|
|
8987
8998
|
if (fileEntry.zip64) {
|
|
@@ -8993,32 +9004,30 @@
|
|
|
8993
9004
|
zipWriter.offset += fileEntry.length;
|
|
8994
9005
|
return fileEntry;
|
|
8995
9006
|
} catch (error) {
|
|
8996
|
-
if ((bufferedWrite &&
|
|
9007
|
+
if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
|
|
8997
9008
|
error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
|
|
8998
|
-
|
|
8999
|
-
zipWriter.offset += fileEntry.uncompressedSize;
|
|
9000
|
-
}
|
|
9009
|
+
zipWriter.offset += fileWriter.size;
|
|
9001
9010
|
}
|
|
9002
9011
|
files.delete(name);
|
|
9003
9012
|
throw error;
|
|
9004
9013
|
} finally {
|
|
9005
9014
|
resolveLockCurrentFileEntry();
|
|
9006
|
-
if (
|
|
9007
|
-
|
|
9015
|
+
if (releaseLockWriter) {
|
|
9016
|
+
releaseLockWriter();
|
|
9008
9017
|
}
|
|
9009
9018
|
}
|
|
9010
9019
|
|
|
9011
|
-
async function
|
|
9012
|
-
if (zipWriter.
|
|
9013
|
-
await zipWriter.
|
|
9014
|
-
await
|
|
9020
|
+
async function lockWriter() {
|
|
9021
|
+
if (zipWriter.lockWriter) {
|
|
9022
|
+
await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
|
|
9023
|
+
await lockWriter();
|
|
9015
9024
|
} else {
|
|
9016
|
-
zipWriter.
|
|
9025
|
+
zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
|
|
9017
9026
|
}
|
|
9018
9027
|
}
|
|
9019
9028
|
}
|
|
9020
9029
|
|
|
9021
|
-
async function createFileEntry(reader, writable, config, options) {
|
|
9030
|
+
async function createFileEntry(reader, pendingFileEntry, writable, config, options) {
|
|
9022
9031
|
const {
|
|
9023
9032
|
rawFilename,
|
|
9024
9033
|
lastAccessDate,
|
|
@@ -9168,7 +9177,7 @@
|
|
|
9168
9177
|
let compressedSize = 0;
|
|
9169
9178
|
if (reader) {
|
|
9170
9179
|
await writeUint8Array(writable, localHeaderArray);
|
|
9171
|
-
fileEntry.dataWritten = true;
|
|
9180
|
+
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
9172
9181
|
const size = () => reader.size;
|
|
9173
9182
|
const readable = reader.readable;
|
|
9174
9183
|
readable.size = size;
|
|
@@ -9196,7 +9205,7 @@
|
|
|
9196
9205
|
compressedSize = result.length;
|
|
9197
9206
|
} else {
|
|
9198
9207
|
await writeUint8Array(writable, localHeaderArray);
|
|
9199
|
-
fileEntry.dataWritten = true;
|
|
9208
|
+
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
9200
9209
|
}
|
|
9201
9210
|
let dataDescriptorArray = new Uint8Array();
|
|
9202
9211
|
let dataDescriptorView, dataDescriptorOffset = 0;
|
|
@@ -9272,13 +9281,6 @@
|
|
|
9272
9281
|
}
|
|
9273
9282
|
const directoryArray = new Uint8Array(directoryDataLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH));
|
|
9274
9283
|
const directoryView = getDataView(directoryArray);
|
|
9275
|
-
if (comment && comment.length) {
|
|
9276
|
-
if (comment.length <= MAX_16_BITS) {
|
|
9277
|
-
setUint16(directoryView, offset + 20, comment.length);
|
|
9278
|
-
} else {
|
|
9279
|
-
throw new Error(ERR_INVALID_COMMENT);
|
|
9280
|
-
}
|
|
9281
|
-
}
|
|
9282
9284
|
for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
|
|
9283
9285
|
const {
|
|
9284
9286
|
rawFilename,
|
|
@@ -9362,6 +9364,13 @@
|
|
|
9362
9364
|
setUint16(directoryView, offset + 10, filesLength);
|
|
9363
9365
|
setUint32(directoryView, offset + 12, directoryDataLength);
|
|
9364
9366
|
setUint32(directoryView, offset + 16, directoryOffset);
|
|
9367
|
+
if (comment && comment.length) {
|
|
9368
|
+
if (comment.length <= MAX_16_BITS) {
|
|
9369
|
+
setUint16(directoryView, offset + 20, comment.length);
|
|
9370
|
+
} else {
|
|
9371
|
+
throw new Error(ERR_INVALID_COMMENT);
|
|
9372
|
+
}
|
|
9373
|
+
}
|
|
9365
9374
|
const { writable } = zipWriter.writer;
|
|
9366
9375
|
await writeUint8Array(writable, directoryArray);
|
|
9367
9376
|
if (comment && comment.length) {
|
|
@@ -9377,20 +9386,6 @@
|
|
|
9377
9386
|
}
|
|
9378
9387
|
}
|
|
9379
9388
|
|
|
9380
|
-
async function writeBlob(writable, blob, start = 0) {
|
|
9381
|
-
const blockSize = 512 * 1024 * 1024;
|
|
9382
|
-
await writeSlice();
|
|
9383
|
-
|
|
9384
|
-
async function writeSlice() {
|
|
9385
|
-
if (start < blob.size) {
|
|
9386
|
-
const arrayBuffer = await sliceAsArrayBuffer(blob, start, start + blockSize);
|
|
9387
|
-
await writeUint8Array(writable, new Uint8Array(arrayBuffer));
|
|
9388
|
-
start += blockSize;
|
|
9389
|
-
await writeSlice();
|
|
9390
|
-
}
|
|
9391
|
-
}
|
|
9392
|
-
}
|
|
9393
|
-
|
|
9394
9389
|
async function writeUint8Array(writable, array) {
|
|
9395
9390
|
const streamWriter = writable.getWriter();
|
|
9396
9391
|
await streamWriter.ready;
|