@zip.js/zip.js 2.19.0 → 2.20.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.js CHANGED
@@ -4789,6 +4789,8 @@
4789
4789
  const WARNING_PREPENDED_DATA = "prepended data";
4790
4790
  const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
4791
4791
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4792
+ const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
4793
+ const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
4792
4794
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4793
4795
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4794
4796
  const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
@@ -4951,6 +4953,8 @@
4951
4953
  reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4952
4954
  }
4953
4955
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4956
+ } else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
4957
+ throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
4954
4958
  }
4955
4959
  }
4956
4960
  let declaredDirectoryDataLength = directoryDataLength;
@@ -4973,25 +4977,44 @@
4973
4977
  if (directoryArray.length < 4) {
4974
4978
  throw new Error(ERR_BAD_FORMAT);
4975
4979
  }
4976
- const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
4980
+ let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
4977
4981
  if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
4978
4982
  const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
4979
4983
  Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
4980
4984
  detectEncryptedCentralDirectory(directoryView);
4981
4985
  let reconcile = !storedPointsAtDirectory;
4982
- if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
4983
- const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
4984
- reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4986
+ if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
4987
+ const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
4988
+ if (storedPointsAtDirectory) {
4989
+ reconcile = expectedPointsAtDirectory;
4990
+ } else if (!expectedPointsAtDirectory) {
4991
+ const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
4992
+ const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
4993
+ if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
4994
+ await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
4995
+ expectedDirectoryDataOffset = signedDirectoryDataOffset;
4996
+ }
4997
+ }
4985
4998
  }
4986
4999
  if (reconcile) {
4987
5000
  const originalDirectoryDataOffset = directoryDataOffset;
4988
5001
  directoryDataOffset = expectedDirectoryDataOffset;
5002
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
5003
+ directoryView = getDataView(directoryArray);
4989
5004
  if (directoryDataOffset > originalDirectoryDataOffset) {
4990
5005
  prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
4991
5006
  prependedCentralDirectory = storedPointsAtDirectory;
5007
+ } else {
5008
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
5009
+ const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
5010
+ if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
5011
+ const localHeaderOffset = getUint32$1(directoryView, 42);
5012
+ if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
5013
+ await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
5014
+ prependedDataLength += offsetDelta;
5015
+ }
5016
+ }
4992
5017
  }
4993
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4994
- directoryView = getDataView(directoryArray);
4995
5018
  }
4996
5019
  }
4997
5020
  }
@@ -5102,7 +5125,16 @@
5102
5125
  filename,
5103
5126
  comment
5104
5127
  });
5105
- const malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5128
+ let malformedExtraField;
5129
+ try {
5130
+ malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5131
+ } catch (error) {
5132
+ if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
5133
+ throw error;
5134
+ }
5135
+ fileEntry.zip64ExtraFieldMissing = true;
5136
+ addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
5137
+ }
5106
5138
  filename = fileEntry.filename;
5107
5139
  if (normalizeFilename) {
5108
5140
  const normalizedFilename = normalizeFilename(filename);
@@ -5144,11 +5176,12 @@
5144
5176
  const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
5145
5177
  const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
5146
5178
  const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
5147
- const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
5148
- ? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
5149
- : (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
5150
5179
  const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
5151
5180
  const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
5181
+ const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
5182
+ const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
5183
+ ? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
5184
+ : (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
5152
5185
  Object.assign(fileEntry, {
5153
5186
  setuid,
5154
5187
  setgid,
@@ -5156,7 +5189,7 @@
5156
5189
  symlink,
5157
5190
  unixExternalUpper,
5158
5191
  executable,
5159
- directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE),
5192
+ directory,
5160
5193
  zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
5161
5194
  });
5162
5195
  const entry = new Entry(fileEntry);
@@ -5212,10 +5245,10 @@
5212
5245
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5213
5246
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5214
5247
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5215
- if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5248
+ if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
5216
5249
  throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5217
5250
  }
5218
- if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5251
+ if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5219
5252
  addWarning(warnings, WARNING_PREPENDED_DATA);
5220
5253
  }
5221
5254
  if (prependedCentralDirectory) {
@@ -5375,6 +5408,9 @@
5375
5408
 
5376
5409
  async getData(writer, fileEntry, readRanges, options = {}) {
5377
5410
  const zipEntry = this;
5411
+ if (zipEntry.zip64ExtraFieldMissing) {
5412
+ throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
5413
+ }
5378
5414
  const config = getConfiguration();
5379
5415
  const {
5380
5416
  reader,
@@ -5612,6 +5648,30 @@
5612
5648
  return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
5613
5649
  }
5614
5650
 
5651
+ function pointsAtDirectory(reader, offset) {
5652
+ return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
5653
+ }
5654
+
5655
+ async function startsWithSignature(reader, offset, signature) {
5656
+ if (offset < 0 || offset + 4 > reader.size) {
5657
+ return false;
5658
+ }
5659
+ const signatureArray = await readUint8Array(reader, offset, 4);
5660
+ return getUint32$1(getDataView(signatureArray), 0) == signature;
5661
+ }
5662
+
5663
+ async function findDigitalSignatureRecordOffset(reader, endOffset) {
5664
+ const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
5665
+ const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
5666
+ const tailView = getDataView(tailArray);
5667
+ for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
5668
+ if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
5669
+ indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
5670
+ return startOffset + indexByte;
5671
+ }
5672
+ }
5673
+ }
5674
+
5615
5675
  function readDigitalSignature(signatureRecordArray) {
5616
5676
  if (signatureRecordArray.length >= 6) {
5617
5677
  const signatureRecordView = getDataView(signatureRecordArray);
@@ -5743,6 +5803,11 @@
5743
5803
  readExtraFieldUnixDates(extraFieldUnixType1, directory);
5744
5804
  directory.extraFieldUnixType1 = extraFieldUnixType1;
5745
5805
  }
5806
+ const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5807
+ if (extraFieldExtendedTimestamp) {
5808
+ readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
5809
+ directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
5810
+ }
5746
5811
  const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
5747
5812
  if (extraFieldNTFS) {
5748
5813
  readExtraFieldNTFS(extraFieldNTFS, directory);
@@ -5759,11 +5824,6 @@
5759
5824
  readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
5760
5825
  directory.extraFieldUnix = extraFieldUnix;
5761
5826
  }
5762
- const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5763
- if (extraFieldExtendedTimestamp) {
5764
- readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
5765
- directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
5766
- }
5767
5827
  const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
5768
5828
  if (extraFieldUSDZ) {
5769
5829
  directory.extraFieldUSDZ = extraFieldUSDZ;
@@ -6402,11 +6462,13 @@
6402
6462
  WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6403
6463
  WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6404
6464
  WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6465
+ WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
6405
6466
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6406
6467
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6407
6468
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6408
6469
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
6409
6470
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6471
+ WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
6410
6472
  WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
6411
6473
  WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6412
6474
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
@@ -6539,13 +6601,14 @@
6539
6601
  return watchPromiseError(this, prependZipEntries(this, reader));
6540
6602
  }
6541
6603
 
6542
- appendZip(reader) {
6543
- return watchPromiseError(this, this.appendZipEntries(reader));
6604
+ appendZip(reader, options = {}) {
6605
+ return watchPromiseError(this, this.appendZipEntries(reader, options));
6544
6606
  }
6545
6607
 
6546
- async appendZipEntries(reader) {
6608
+ async appendZipEntries(reader, options = {}) {
6547
6609
  const zipWriter = this;
6548
6610
  const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
6611
+ const filter = checkFunctionOption(options.filter);
6549
6612
  while (pendingAddFileCalls.size) {
6550
6613
  await Promise.allSettled(Array.from(pendingAddFileCalls));
6551
6614
  }
@@ -6564,10 +6627,16 @@
6564
6627
  const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
6565
6628
  const zipReader$1 = new ZipReader(reader);
6566
6629
  const entries = await zipReader$1.getEntries();
6630
+ const keptEntries = [];
6631
+ for (const entry of entries) {
6632
+ if (!filter || await filter(entry)) {
6633
+ keptEntries.push(entry);
6634
+ }
6635
+ }
6567
6636
  await zipReader$1.close();
6568
6637
  await initStream(zipWriter.writer);
6569
6638
  const { directoryOffset } = zipReader$1;
6570
- entries.forEach(({ filename }) => {
6639
+ keptEntries.forEach(({ filename }) => {
6571
6640
  if (filenames.has(filename)) {
6572
6641
  throw new Error(ERR_DUPLICATED_NAME);
6573
6642
  }
@@ -6588,8 +6657,8 @@
6588
6657
  zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
6589
6658
  }
6590
6659
  }
6591
- const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
6592
- entries.forEach(entry => {
6660
+ const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
6661
+ keptEntries.forEach(entry => {
6593
6662
  const {
6594
6663
  version,
6595
6664
  rawLastModDate,
@@ -8502,26 +8571,42 @@
8502
8571
  return rawExtraField;
8503
8572
  }
8504
8573
 
8505
- async function copyZipData(zipWriter, reader, entries, directoryOffset) {
8574
+ async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
8506
8575
  const { writer } = zipWriter;
8507
8576
  const entryPositions = new Map();
8508
- if (writer.closeDisk) {
8577
+ if (writer.closeDisk || compact) {
8509
8578
  const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
8510
8579
  getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
8511
- let copiedLength = 0;
8512
- for (const entry of sortedEntries) {
8513
- const sourceOffset = getSourceOffset(reader, entry);
8514
- await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
8515
- if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
8516
- await writer.closeDisk();
8517
- }
8518
- entryPositions.set(entry, {
8519
- offset: getSegmentOffset(zipWriter, writer),
8520
- diskNumberStart: getDiskNumber(writer)
8521
- });
8522
- copiedLength = sourceOffset;
8580
+ const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
8581
+ const keptEntrySet = new Set(keptEntries);
8582
+ let copiedOffset = 0;
8583
+ let lastPosition;
8584
+ for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
8585
+ const entry = sortedEntries[indexEntry];
8586
+ if (keptEntrySet.has(entry)) {
8587
+ const sourceOffset = getSourceOffset(reader, entry);
8588
+ if (sourceOffset < copiedOffset) {
8589
+ entryPositions.set(entry, lastPosition);
8590
+ } else {
8591
+ if (!compact) {
8592
+ await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
8593
+ }
8594
+ if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
8595
+ await writer.closeDisk();
8596
+ }
8597
+ lastPosition = {
8598
+ offset: getSegmentOffset(zipWriter, writer),
8599
+ diskNumberStart: getDiskNumber(writer)
8600
+ };
8601
+ entryPositions.set(entry, lastPosition);
8602
+ await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
8603
+ copiedOffset = regionEnds[indexEntry];
8604
+ }
8605
+ }
8606
+ }
8607
+ if (!compact) {
8608
+ await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
8523
8609
  }
8524
- await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
8525
8610
  } else {
8526
8611
  const baseOffset = zipWriter.offset;
8527
8612
  await copyData(zipWriter, reader, 0, directoryOffset);
@@ -8533,6 +8618,20 @@
8533
8618
  return entryPositions;
8534
8619
  }
8535
8620
 
8621
+ function getRegionEnds(reader, sortedEntries, directoryOffset) {
8622
+ const regionEnds = new Array(sortedEntries.length);
8623
+ let regionEnd = directoryOffset;
8624
+ for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
8625
+ const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
8626
+ const nextEntry = sortedEntries[indexEntry + 1];
8627
+ if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
8628
+ regionEnd = getSourceOffset(reader, nextEntry);
8629
+ }
8630
+ regionEnds[indexEntry] = regionEnd;
8631
+ }
8632
+ return regionEnds;
8633
+ }
8634
+
8536
8635
  async function copyData(zipWriter, reader, offset, size) {
8537
8636
  if (size > 0) {
8538
8637
  const { writer } = zipWriter;
@@ -8910,7 +9009,7 @@
8910
9009
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8911
9010
  */
8912
9011
 
8913
- const VERSION = "2.19.0";
9012
+ const VERSION = "2.20.0";
8914
9013
 
8915
9014
  /*
8916
9015
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -10074,11 +10173,13 @@
10074
10173
  exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
10075
10174
  exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
10076
10175
  exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
10176
+ exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
10077
10177
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
10078
10178
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
10079
10179
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
10080
10180
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
10081
10181
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
10182
+ exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
10082
10183
  exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
10083
10184
  exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
10084
10185
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;