@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/index-native.cjs CHANGED
@@ -489,7 +489,7 @@ function getDataView(array) {
489
489
  // Every table MUST stay a PACKED_SMI array: build with array literals (not `new Array(n)`,
490
490
  // which is HOLEY) and store the signed int32 XOR result (no `>>> 0`). An unsigned or holey
491
491
  // table becomes a V8 FixedDoubleArray whose every hot-loop lookup unboxes a double (~1.6x
492
- // slower). Signedness is irrelevant to the result — the reads mask/shift it and the final
492
+ // slower). Signedness is irrelevant to the result: the reads mask/shift it and the final
493
493
  // `~crc` normalizes it. Do NOT reintroduce `>>> 0` here or switch to `new Array(256)`.
494
494
  const T$1 = [[], [], [], [], [], [], [], []];
495
495
  for (let n = 0; n < 256; n++) {
@@ -3473,7 +3473,7 @@ async function terminateWorkers() {
3473
3473
 
3474
3474
  /* global TextDecoder */
3475
3475
 
3476
- const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
3476
+ 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("");
3477
3477
  const VALID_CP437 = CP437.length == 256;
3478
3478
 
3479
3479
  function decodeCP437(stringValue) {
@@ -4739,6 +4739,7 @@ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4739
4739
  const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4740
4740
  const WARNING_APPENDED_DATA = "appended data";
4741
4741
  const WARNING_PREPENDED_DATA = "prepended data";
4742
+ const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
4742
4743
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4743
4744
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4744
4745
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
@@ -4832,6 +4833,7 @@ class ZipReader {
4832
4833
  let diskNumber = getUint16$1(endOfDirectoryView, 6);
4833
4834
  let filesLength = getUint16$1(endOfDirectoryView, 10);
4834
4835
  let prependedDataLength = 0;
4836
+ let prependedCentralDirectory;
4835
4837
  let startOffset;
4836
4838
  let zip64EndOfDirectory;
4837
4839
  let zip64EndOfDirectoryVersion2;
@@ -4935,6 +4937,7 @@ class ZipReader {
4935
4937
  directoryDataOffset = expectedDirectoryDataOffset;
4936
4938
  if (directoryDataOffset > originalDirectoryDataOffset) {
4937
4939
  prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
4940
+ prependedCentralDirectory = storedPointsAtDirectory;
4938
4941
  }
4939
4942
  directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4940
4943
  directoryView = getDataView(directoryArray);
@@ -5162,6 +5165,9 @@ class ZipReader {
5162
5165
  if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5163
5166
  addWarning(warnings, WARNING_PREPENDED_DATA);
5164
5167
  }
5168
+ if (prependedCentralDirectory) {
5169
+ addWarning(warnings, WARNING_PREPENDED_CENTRAL_DIRECTORY);
5170
+ }
5165
5171
  if (extractPrependedData) {
5166
5172
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
5167
5173
  await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
@@ -6222,6 +6228,7 @@ var zipReader = /*#__PURE__*/Object.freeze({
6222
6228
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6223
6229
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6224
6230
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6231
+ WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6225
6232
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6226
6233
  WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6227
6234
  WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
@@ -6670,6 +6677,13 @@ async function addFile(zipWriter, name, reader, options) {
6670
6677
  const { comment } = metadataInfo;
6671
6678
  const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
6672
6679
  zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
6680
+ const previousFileEntry = zipWriter.lastFileEntry;
6681
+ const pendingFileEntry = {};
6682
+ let releaseLockFileEntry;
6683
+ if (metadataInfo.resolvedOptions.keepOrder) {
6684
+ pendingFileEntry.lockFileEntry = new Promise(resolve => releaseLockFileEntry = resolve);
6685
+ }
6686
+ zipWriter.lastFileEntry = pendingFileEntry;
6673
6687
  let fileEntry;
6674
6688
  try {
6675
6689
  const { resolvedOptions } = metadataInfo;
@@ -6691,10 +6705,21 @@ async function addFile(zipWriter, name, reader, options) {
6691
6705
  const headerInfo = getHeaderInfo(options);
6692
6706
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6693
6707
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6694
- fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
6708
+ fileEntry = await getFileEntry(zipWriter, name, reader, {
6709
+ headerInfo,
6710
+ dataDescriptorInfo,
6711
+ metadataSize,
6712
+ fileEntry: pendingFileEntry,
6713
+ previousFileEntry,
6714
+ releaseLockFileEntry
6715
+ }, options);
6695
6716
  } catch (error) {
6696
6717
  zipWriter.fileEntries.delete(name);
6697
6718
  throw error;
6719
+ } finally {
6720
+ if (releaseLockFileEntry) {
6721
+ releaseLockFileEntry(previousFileEntry && previousFileEntry.lockFileEntry);
6722
+ }
6698
6723
  }
6699
6724
  Object.assign(fileEntry, {
6700
6725
  name,
@@ -7082,7 +7107,6 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7082
7107
  }
7083
7108
  const usdz = writerOptions[OPTION_USDZ];
7084
7109
  const files = new Map();
7085
- let layoutDependsOnWriteOrder = Boolean(usdz);
7086
7110
  const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
7087
7111
  let offset = initialOffset;
7088
7112
  let minimumEntrySize = INFINITY_VALUE;
@@ -7128,9 +7152,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7128
7152
  minimumEntrySize = Math.min(minimumEntrySize, entrySize);
7129
7153
  offset += entrySize;
7130
7154
  }
7131
- if (files.size && offset - minimumEntrySize >= MAX_32_BITS) {
7132
- layoutDependsOnWriteOrder = true;
7133
- }
7155
+ const layoutDependsOnWriteOrder = files.size > 1 && (usdz || offset - minimumEntrySize >= MAX_32_BITS);
7134
7156
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
7135
7157
  throw new Error(ERR_UNDETERMINED_SIZE);
7136
7158
  }
@@ -7158,27 +7180,23 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7158
7180
  signal
7159
7181
  } = options;
7160
7182
  const {
7161
- headerInfo
7183
+ headerInfo,
7184
+ fileEntry: pendingFileEntry,
7185
+ previousFileEntry,
7186
+ releaseLockFileEntry
7162
7187
  } = entryInfo;
7163
7188
  const usdz = zipWriter.options[OPTION_USDZ];
7164
- const previousFileEntry = zipWriter.lastFileEntry;
7165
- let fileEntry = {};
7189
+ let fileEntry = pendingFileEntry;
7166
7190
  let bufferedWrite;
7167
7191
  let releaseLockWriter;
7168
- let releaseLockCurrentFileEntry;
7169
7192
  let writingBufferedEntryData;
7170
7193
  let writingEntryData;
7171
7194
  let writerSizeBeforeEntry;
7172
7195
  let flushedBufferedSize = 0;
7173
7196
  let fileWriter;
7197
+ const lockPreviousFileEntry = keepOrder && previousFileEntry ? previousFileEntry.lockFileEntry : UNDEFINED_VALUE;
7174
7198
  fileEntries.set(name, fileEntry);
7175
- zipWriter.lastFileEntry = fileEntry;
7176
7199
  try {
7177
- let lockPreviousFileEntry;
7178
- if (keepOrder) {
7179
- lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
7180
- requestLockCurrentFileEntry();
7181
- }
7182
7200
  if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || (!dataDescriptor && !emptyEntry)) {
7183
7201
  bufferedWrite = true;
7184
7202
  zipWriter.bufferedWrites++;
@@ -7191,6 +7209,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7191
7209
  await initStream(writer);
7192
7210
  } else {
7193
7211
  fileWriter = writer;
7212
+ await lockPreviousFileEntry;
7194
7213
  await requestLockWriter();
7195
7214
  }
7196
7215
  await initStream(fileWriter);
@@ -7203,7 +7222,6 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7203
7222
  }
7204
7223
  const { localHeaderArray } = headerInfo;
7205
7224
  if (!bufferedWrite) {
7206
- await lockPreviousFileEntry;
7207
7225
  await skipDiskIfNeeded();
7208
7226
  }
7209
7227
  const diskNumberStart = getDiskNumber(writer);
@@ -7268,8 +7286,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7268
7286
  if (bufferedWrite) {
7269
7287
  zipWriter.bufferedWrites--;
7270
7288
  }
7271
- if (releaseLockCurrentFileEntry) {
7272
- releaseLockCurrentFileEntry();
7289
+ if (releaseLockFileEntry) {
7290
+ releaseLockFileEntry(lockPreviousFileEntry);
7273
7291
  }
7274
7292
  if (releaseLockWriter) {
7275
7293
  releaseLockWriter();
@@ -7283,10 +7301,6 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7283
7301
  }
7284
7302
  }
7285
7303
 
7286
- function requestLockCurrentFileEntry() {
7287
- fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
7288
- }
7289
-
7290
7304
  async function requestLockWriter() {
7291
7305
  zipWriter.writerLocked = true;
7292
7306
  const { lockWriter } = zipWriter;
@@ -8606,7 +8620,7 @@ function formatSupported(StreamClass, format) {
8606
8620
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8607
8621
  */
8608
8622
 
8609
- const VERSION = "2.8.60";
8623
+ const VERSION = "2.9.0";
8610
8624
 
8611
8625
  /*
8612
8626
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9583,12 +9597,13 @@ class ZipDirectoryEntry extends ZipEntry {
9583
9597
  if (options.bufferedWrite === UNDEFINED_VALUE) {
9584
9598
  options.bufferedWrite = true;
9585
9599
  }
9586
- const writeOrderGuaranteed = !options.bufferedWrite ||
9587
- (options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
9588
- return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9600
+ const entries = zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9589
9601
  const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
9590
9602
  return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
9591
- }), writeOrderGuaranteed, options.globalComment);
9603
+ });
9604
+ const writeOrderGuaranteed = !options.bufferedWrite ||
9605
+ (entries.every(entry => entry.options.keepOrder !== false) && zipEntry.children.every(child => !child.children.length));
9606
+ return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
9592
9607
  }
9593
9608
 
9594
9609
  getChildByName(name) {
@@ -10602,6 +10617,7 @@ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL
10602
10617
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
10603
10618
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
10604
10619
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
10620
+ exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
10605
10621
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
10606
10622
  exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
10607
10623
  exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;