@zip.js/zip.js 2.8.60 → 2.9.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/dist/zip-fs.js CHANGED
@@ -495,7 +495,7 @@
495
495
  // Every table MUST stay a PACKED_SMI array: build with array literals (not `new Array(n)`,
496
496
  // which is HOLEY) and store the signed int32 XOR result (no `>>> 0`). An unsigned or holey
497
497
  // table becomes a V8 FixedDoubleArray whose every hot-loop lookup unboxes a double (~1.6x
498
- // slower). Signedness is irrelevant to the result — the reads mask/shift it and the final
498
+ // slower). Signedness is irrelevant to the result: the reads mask/shift it and the final
499
499
  // `~crc` normalizes it. Do NOT reintroduce `>>> 0` here or switch to `new Array(256)`.
500
500
  const T = [[], [], [], [], [], [], [], []];
501
501
  for (let n = 0; n < 256; n++) {
@@ -3483,7 +3483,7 @@
3483
3483
 
3484
3484
  /* global TextDecoder */
3485
3485
 
3486
- const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
3486
+ const CP437 = "\0\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\u00B6\u00A7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7\u00EA\u00EB\u00E8\u00EF\u00EE\u00EC\u00C4\u00C5\u00C9\u00E6\u00C6\u00F4\u00F6\u00F2\u00FB\u00F9\u00FF\u00D6\u00DC\u00A2\u00A3\u00A5\u20A7\u0192\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA\u00BF\u2310\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0".split("");
3487
3487
  const VALID_CP437 = CP437.length == 256;
3488
3488
 
3489
3489
  function decodeCP437(stringValue) {
@@ -4749,6 +4749,7 @@
4749
4749
  const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4750
4750
  const WARNING_APPENDED_DATA = "appended data";
4751
4751
  const WARNING_PREPENDED_DATA = "prepended data";
4752
+ const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
4752
4753
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4753
4754
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4754
4755
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
@@ -4842,6 +4843,7 @@
4842
4843
  let diskNumber = getUint16$1(endOfDirectoryView, 6);
4843
4844
  let filesLength = getUint16$1(endOfDirectoryView, 10);
4844
4845
  let prependedDataLength = 0;
4846
+ let prependedCentralDirectory;
4845
4847
  let startOffset;
4846
4848
  let zip64EndOfDirectory;
4847
4849
  let zip64EndOfDirectoryVersion2;
@@ -4945,6 +4947,7 @@
4945
4947
  directoryDataOffset = expectedDirectoryDataOffset;
4946
4948
  if (directoryDataOffset > originalDirectoryDataOffset) {
4947
4949
  prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
4950
+ prependedCentralDirectory = storedPointsAtDirectory;
4948
4951
  }
4949
4952
  directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4950
4953
  directoryView = getDataView(directoryArray);
@@ -5172,6 +5175,9 @@
5172
5175
  if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5173
5176
  addWarning(warnings, WARNING_PREPENDED_DATA);
5174
5177
  }
5178
+ if (prependedCentralDirectory) {
5179
+ addWarning(warnings, WARNING_PREPENDED_CENTRAL_DIRECTORY);
5180
+ }
5175
5181
  if (extractPrependedData) {
5176
5182
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
5177
5183
  await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
@@ -6232,6 +6238,7 @@
6232
6238
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6233
6239
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6234
6240
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6241
+ WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6235
6242
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6236
6243
  WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6237
6244
  WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
@@ -6680,6 +6687,13 @@
6680
6687
  const { comment } = metadataInfo;
6681
6688
  const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
6682
6689
  zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
6690
+ const previousFileEntry = zipWriter.lastFileEntry;
6691
+ const pendingFileEntry = {};
6692
+ let releaseLockFileEntry;
6693
+ if (metadataInfo.resolvedOptions.keepOrder) {
6694
+ pendingFileEntry.lockFileEntry = new Promise(resolve => releaseLockFileEntry = resolve);
6695
+ }
6696
+ zipWriter.lastFileEntry = pendingFileEntry;
6683
6697
  let fileEntry;
6684
6698
  try {
6685
6699
  const { resolvedOptions } = metadataInfo;
@@ -6701,10 +6715,21 @@
6701
6715
  const headerInfo = getHeaderInfo(options);
6702
6716
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6703
6717
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6704
- fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
6718
+ fileEntry = await getFileEntry(zipWriter, name, reader, {
6719
+ headerInfo,
6720
+ dataDescriptorInfo,
6721
+ metadataSize,
6722
+ fileEntry: pendingFileEntry,
6723
+ previousFileEntry,
6724
+ releaseLockFileEntry
6725
+ }, options);
6705
6726
  } catch (error) {
6706
6727
  zipWriter.fileEntries.delete(name);
6707
6728
  throw error;
6729
+ } finally {
6730
+ if (releaseLockFileEntry) {
6731
+ releaseLockFileEntry(previousFileEntry && previousFileEntry.lockFileEntry);
6732
+ }
6708
6733
  }
6709
6734
  Object.assign(fileEntry, {
6710
6735
  name,
@@ -7092,7 +7117,6 @@
7092
7117
  }
7093
7118
  const usdz = writerOptions[OPTION_USDZ];
7094
7119
  const files = new Map();
7095
- let layoutDependsOnWriteOrder = Boolean(usdz);
7096
7120
  const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
7097
7121
  let offset = initialOffset;
7098
7122
  let minimumEntrySize = INFINITY_VALUE;
@@ -7138,9 +7162,7 @@
7138
7162
  minimumEntrySize = Math.min(minimumEntrySize, entrySize);
7139
7163
  offset += entrySize;
7140
7164
  }
7141
- if (files.size && offset - minimumEntrySize >= MAX_32_BITS) {
7142
- layoutDependsOnWriteOrder = true;
7143
- }
7165
+ const layoutDependsOnWriteOrder = files.size > 1 && (usdz || offset - minimumEntrySize >= MAX_32_BITS);
7144
7166
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
7145
7167
  throw new Error(ERR_UNDETERMINED_SIZE);
7146
7168
  }
@@ -7168,27 +7190,23 @@
7168
7190
  signal
7169
7191
  } = options;
7170
7192
  const {
7171
- headerInfo
7193
+ headerInfo,
7194
+ fileEntry: pendingFileEntry,
7195
+ previousFileEntry,
7196
+ releaseLockFileEntry
7172
7197
  } = entryInfo;
7173
7198
  const usdz = zipWriter.options[OPTION_USDZ];
7174
- const previousFileEntry = zipWriter.lastFileEntry;
7175
- let fileEntry = {};
7199
+ let fileEntry = pendingFileEntry;
7176
7200
  let bufferedWrite;
7177
7201
  let releaseLockWriter;
7178
- let releaseLockCurrentFileEntry;
7179
7202
  let writingBufferedEntryData;
7180
7203
  let writingEntryData;
7181
7204
  let writerSizeBeforeEntry;
7182
7205
  let flushedBufferedSize = 0;
7183
7206
  let fileWriter;
7207
+ const lockPreviousFileEntry = keepOrder && previousFileEntry ? previousFileEntry.lockFileEntry : UNDEFINED_VALUE;
7184
7208
  fileEntries.set(name, fileEntry);
7185
- zipWriter.lastFileEntry = fileEntry;
7186
7209
  try {
7187
- let lockPreviousFileEntry;
7188
- if (keepOrder) {
7189
- lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
7190
- requestLockCurrentFileEntry();
7191
- }
7192
7210
  if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || (!dataDescriptor && !emptyEntry)) {
7193
7211
  bufferedWrite = true;
7194
7212
  zipWriter.bufferedWrites++;
@@ -7201,6 +7219,7 @@
7201
7219
  await initStream(writer);
7202
7220
  } else {
7203
7221
  fileWriter = writer;
7222
+ await lockPreviousFileEntry;
7204
7223
  await requestLockWriter();
7205
7224
  }
7206
7225
  await initStream(fileWriter);
@@ -7213,7 +7232,6 @@
7213
7232
  }
7214
7233
  const { localHeaderArray } = headerInfo;
7215
7234
  if (!bufferedWrite) {
7216
- await lockPreviousFileEntry;
7217
7235
  await skipDiskIfNeeded();
7218
7236
  }
7219
7237
  const diskNumberStart = getDiskNumber(writer);
@@ -7278,8 +7296,8 @@
7278
7296
  if (bufferedWrite) {
7279
7297
  zipWriter.bufferedWrites--;
7280
7298
  }
7281
- if (releaseLockCurrentFileEntry) {
7282
- releaseLockCurrentFileEntry();
7299
+ if (releaseLockFileEntry) {
7300
+ releaseLockFileEntry(lockPreviousFileEntry);
7283
7301
  }
7284
7302
  if (releaseLockWriter) {
7285
7303
  releaseLockWriter();
@@ -7293,10 +7311,6 @@
7293
7311
  }
7294
7312
  }
7295
7313
 
7296
- function requestLockCurrentFileEntry() {
7297
- fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
7298
- }
7299
-
7300
7314
  async function requestLockWriter() {
7301
7315
  zipWriter.writerLocked = true;
7302
7316
  const { lockWriter } = zipWriter;
@@ -8616,7 +8630,7 @@
8616
8630
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8617
8631
  */
8618
8632
 
8619
- const VERSION = "2.8.60";
8633
+ const VERSION = "2.9.0";
8620
8634
 
8621
8635
  /*
8622
8636
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9968,12 +9982,13 @@
9968
9982
  if (options.bufferedWrite === UNDEFINED_VALUE) {
9969
9983
  options.bufferedWrite = true;
9970
9984
  }
9971
- const writeOrderGuaranteed = !options.bufferedWrite ||
9972
- (options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
9973
- return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9985
+ const entries = zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9974
9986
  const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
9975
9987
  return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
9976
- }), writeOrderGuaranteed, options.globalComment);
9988
+ });
9989
+ const writeOrderGuaranteed = !options.bufferedWrite ||
9990
+ (entries.every(entry => entry.options.keepOrder !== false) && zipEntry.children.every(child => !child.children.length));
9991
+ return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
9977
9992
  }
9978
9993
 
9979
9994
  getChildByName(name) {
@@ -10987,6 +11002,7 @@
10987
11002
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
10988
11003
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
10989
11004
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
11005
+ exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
10990
11006
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
10991
11007
  exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
10992
11008
  exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;