@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.
@@ -105,7 +105,7 @@ async function getFileInfo(file, options) {
105
105
  name = file;
106
106
  resolvedName = resolvePath(name);
107
107
  }
108
- name = normalizePath(trimSlashes(name));
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 trimSlashes(url) {
158
- const match = url.match(/^(?:\/|\\)?(.*?)(?:\/|\\)?$/);
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
- return name.replace(/(\.+)(\/|\\)+/g, "");
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) {
@@ -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 iterator = this.getEntriesGenerator(options);
8331
- let result = iterator.next();
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 resolveLockUnbufferedWrite;
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.lockWrite || !options.dataDescriptor) {
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.lockWrite = Promise.resolve();
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 indexWrittenData = 0;
8961
- const blob = fileWriter.getData();
8972
+ let blob = fileWriter.getData();
8962
8973
  await lockPreviousFileEntry;
8963
- await lockWriterAccess();
8964
- fileEntry.writingBufferedData = true;
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
- indexWrittenData = headerLength;
8992
+ blob = blob.slice(headerLength);
8982
8993
  }
8983
- await writeBlob(writable, blob, indexWrittenData);
8984
- delete fileEntry.writingBufferedData;
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 && fileEntry.writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
9007
+ if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
8997
9008
  error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
8998
- if (fileEntry.uncompressedSize) {
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 (resolveLockUnbufferedWrite) {
9007
- resolveLockUnbufferedWrite();
9015
+ if (releaseLockWriter) {
9016
+ releaseLockWriter();
9008
9017
  }
9009
9018
  }
9010
9019
 
9011
- async function lockWriterAccess() {
9012
- if (zipWriter.lockWrite) {
9013
- await zipWriter.lockWrite.then(() => delete zipWriter.lockWrite);
9014
- await lockWriterAccess();
9020
+ async function lockWriter() {
9021
+ if (zipWriter.lockWriter) {
9022
+ await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
9023
+ await lockWriter();
9015
9024
  } else {
9016
- zipWriter.lockWrite = new Promise(resolve => resolveLockUnbufferedWrite = resolve);
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;