@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/index-native.cjs CHANGED
@@ -4795,6 +4795,8 @@ const WARNING_APPENDED_DATA = "appended data";
4795
4795
  const WARNING_PREPENDED_DATA = "prepended data";
4796
4796
  const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
4797
4797
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4798
+ const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
4799
+ const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
4798
4800
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4799
4801
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4800
4802
  const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
@@ -4957,6 +4959,8 @@ class ZipReader {
4957
4959
  reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4958
4960
  }
4959
4961
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4962
+ } else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
4963
+ throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
4960
4964
  }
4961
4965
  }
4962
4966
  let declaredDirectoryDataLength = directoryDataLength;
@@ -4979,25 +4983,44 @@ class ZipReader {
4979
4983
  if (directoryArray.length < 4) {
4980
4984
  throw new Error(ERR_BAD_FORMAT);
4981
4985
  }
4982
- const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
4986
+ let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
4983
4987
  if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
4984
4988
  const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
4985
4989
  Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
4986
4990
  detectEncryptedCentralDirectory(directoryView);
4987
4991
  let reconcile = !storedPointsAtDirectory;
4988
- if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
4989
- const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
4990
- reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4992
+ if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
4993
+ const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
4994
+ if (storedPointsAtDirectory) {
4995
+ reconcile = expectedPointsAtDirectory;
4996
+ } else if (!expectedPointsAtDirectory) {
4997
+ const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
4998
+ const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
4999
+ if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
5000
+ await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
5001
+ expectedDirectoryDataOffset = signedDirectoryDataOffset;
5002
+ }
5003
+ }
4991
5004
  }
4992
5005
  if (reconcile) {
4993
5006
  const originalDirectoryDataOffset = directoryDataOffset;
4994
5007
  directoryDataOffset = expectedDirectoryDataOffset;
5008
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
5009
+ directoryView = getDataView(directoryArray);
4995
5010
  if (directoryDataOffset > originalDirectoryDataOffset) {
4996
5011
  prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
4997
5012
  prependedCentralDirectory = storedPointsAtDirectory;
5013
+ } else {
5014
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
5015
+ const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
5016
+ if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
5017
+ const localHeaderOffset = getUint32$1(directoryView, 42);
5018
+ if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
5019
+ await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
5020
+ prependedDataLength += offsetDelta;
5021
+ }
5022
+ }
4998
5023
  }
4999
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
5000
- directoryView = getDataView(directoryArray);
5001
5024
  }
5002
5025
  }
5003
5026
  }
@@ -5108,7 +5131,16 @@ class ZipReader {
5108
5131
  filename,
5109
5132
  comment
5110
5133
  });
5111
- const malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5134
+ let malformedExtraField;
5135
+ try {
5136
+ malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5137
+ } catch (error) {
5138
+ if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
5139
+ throw error;
5140
+ }
5141
+ fileEntry.zip64ExtraFieldMissing = true;
5142
+ addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
5143
+ }
5112
5144
  filename = fileEntry.filename;
5113
5145
  if (normalizeFilename) {
5114
5146
  const normalizedFilename = normalizeFilename(filename);
@@ -5150,11 +5182,12 @@ class ZipReader {
5150
5182
  const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
5151
5183
  const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
5152
5184
  const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
5153
- const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
5154
- ? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
5155
- : (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
5156
5185
  const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
5157
5186
  const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
5187
+ const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
5188
+ const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
5189
+ ? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
5190
+ : (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
5158
5191
  Object.assign(fileEntry, {
5159
5192
  setuid,
5160
5193
  setgid,
@@ -5162,7 +5195,7 @@ class ZipReader {
5162
5195
  symlink,
5163
5196
  unixExternalUpper,
5164
5197
  executable,
5165
- directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE),
5198
+ directory,
5166
5199
  zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
5167
5200
  });
5168
5201
  const entry = new Entry(fileEntry);
@@ -5218,10 +5251,10 @@ class ZipReader {
5218
5251
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5219
5252
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5220
5253
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5221
- if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5254
+ if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
5222
5255
  throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5223
5256
  }
5224
- if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5257
+ if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5225
5258
  addWarning(warnings, WARNING_PREPENDED_DATA);
5226
5259
  }
5227
5260
  if (prependedCentralDirectory) {
@@ -5381,6 +5414,9 @@ let ZipEntry$1 = class ZipEntry {
5381
5414
 
5382
5415
  async getData(writer, fileEntry, readRanges, options = {}) {
5383
5416
  const zipEntry = this;
5417
+ if (zipEntry.zip64ExtraFieldMissing) {
5418
+ throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
5419
+ }
5384
5420
  const config = getConfiguration();
5385
5421
  const {
5386
5422
  reader,
@@ -5618,6 +5654,30 @@ function getWrappedFilesLength(directoryView, directoryArray, offset) {
5618
5654
  return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
5619
5655
  }
5620
5656
 
5657
+ function pointsAtDirectory(reader, offset) {
5658
+ return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
5659
+ }
5660
+
5661
+ async function startsWithSignature(reader, offset, signature) {
5662
+ if (offset < 0 || offset + 4 > reader.size) {
5663
+ return false;
5664
+ }
5665
+ const signatureArray = await readUint8Array(reader, offset, 4);
5666
+ return getUint32$1(getDataView(signatureArray), 0) == signature;
5667
+ }
5668
+
5669
+ async function findDigitalSignatureRecordOffset(reader, endOffset) {
5670
+ const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
5671
+ const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
5672
+ const tailView = getDataView(tailArray);
5673
+ for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
5674
+ if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
5675
+ indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
5676
+ return startOffset + indexByte;
5677
+ }
5678
+ }
5679
+ }
5680
+
5621
5681
  function readDigitalSignature(signatureRecordArray) {
5622
5682
  if (signatureRecordArray.length >= 6) {
5623
5683
  const signatureRecordView = getDataView(signatureRecordArray);
@@ -5749,6 +5809,11 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5749
5809
  readExtraFieldUnixDates(extraFieldUnixType1, directory);
5750
5810
  directory.extraFieldUnixType1 = extraFieldUnixType1;
5751
5811
  }
5812
+ const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5813
+ if (extraFieldExtendedTimestamp) {
5814
+ readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
5815
+ directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
5816
+ }
5752
5817
  const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
5753
5818
  if (extraFieldNTFS) {
5754
5819
  readExtraFieldNTFS(extraFieldNTFS, directory);
@@ -5765,11 +5830,6 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5765
5830
  readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
5766
5831
  directory.extraFieldUnix = extraFieldUnix;
5767
5832
  }
5768
- const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5769
- if (extraFieldExtendedTimestamp) {
5770
- readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
5771
- directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
5772
- }
5773
5833
  const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
5774
5834
  if (extraFieldUSDZ) {
5775
5835
  directory.extraFieldUSDZ = extraFieldUSDZ;
@@ -6408,11 +6468,13 @@ var zipReader = /*#__PURE__*/Object.freeze({
6408
6468
  WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6409
6469
  WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6410
6470
  WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6471
+ WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
6411
6472
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6412
6473
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6413
6474
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6414
6475
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
6415
6476
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6477
+ WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
6416
6478
  WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
6417
6479
  WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6418
6480
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
@@ -6545,13 +6607,14 @@ class ZipWriter {
6545
6607
  return watchPromiseError(this, prependZipEntries(this, reader));
6546
6608
  }
6547
6609
 
6548
- appendZip(reader) {
6549
- return watchPromiseError(this, this.appendZipEntries(reader));
6610
+ appendZip(reader, options = {}) {
6611
+ return watchPromiseError(this, this.appendZipEntries(reader, options));
6550
6612
  }
6551
6613
 
6552
- async appendZipEntries(reader) {
6614
+ async appendZipEntries(reader, options = {}) {
6553
6615
  const zipWriter = this;
6554
6616
  const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
6617
+ const filter = checkFunctionOption(options.filter);
6555
6618
  while (pendingAddFileCalls.size) {
6556
6619
  await Promise.allSettled(Array.from(pendingAddFileCalls));
6557
6620
  }
@@ -6570,10 +6633,16 @@ class ZipWriter {
6570
6633
  const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
6571
6634
  const zipReader$1 = new ZipReader(reader);
6572
6635
  const entries = await zipReader$1.getEntries();
6636
+ const keptEntries = [];
6637
+ for (const entry of entries) {
6638
+ if (!filter || await filter(entry)) {
6639
+ keptEntries.push(entry);
6640
+ }
6641
+ }
6573
6642
  await zipReader$1.close();
6574
6643
  await initStream(zipWriter.writer);
6575
6644
  const { directoryOffset } = zipReader$1;
6576
- entries.forEach(({ filename }) => {
6645
+ keptEntries.forEach(({ filename }) => {
6577
6646
  if (filenames.has(filename)) {
6578
6647
  throw new Error(ERR_DUPLICATED_NAME);
6579
6648
  }
@@ -6594,8 +6663,8 @@ class ZipWriter {
6594
6663
  zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
6595
6664
  }
6596
6665
  }
6597
- const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
6598
- entries.forEach(entry => {
6666
+ const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
6667
+ keptEntries.forEach(entry => {
6599
6668
  const {
6600
6669
  version,
6601
6670
  rawLastModDate,
@@ -8606,26 +8675,42 @@ function removeExtraFieldZip64(rawExtraField) {
8606
8675
  return rawExtraField;
8607
8676
  }
8608
8677
 
8609
- async function copyZipData(zipWriter, reader, entries, directoryOffset) {
8678
+ async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
8610
8679
  const { writer } = zipWriter;
8611
8680
  const entryPositions = new Map();
8612
- if (writer.closeDisk) {
8681
+ if (writer.closeDisk || compact) {
8613
8682
  const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
8614
8683
  getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
8615
- let copiedLength = 0;
8616
- for (const entry of sortedEntries) {
8617
- const sourceOffset = getSourceOffset(reader, entry);
8618
- await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
8619
- if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
8620
- await writer.closeDisk();
8621
- }
8622
- entryPositions.set(entry, {
8623
- offset: getSegmentOffset(zipWriter, writer),
8624
- diskNumberStart: getDiskNumber(writer)
8625
- });
8626
- copiedLength = sourceOffset;
8684
+ const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
8685
+ const keptEntrySet = new Set(keptEntries);
8686
+ let copiedOffset = 0;
8687
+ let lastPosition;
8688
+ for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
8689
+ const entry = sortedEntries[indexEntry];
8690
+ if (keptEntrySet.has(entry)) {
8691
+ const sourceOffset = getSourceOffset(reader, entry);
8692
+ if (sourceOffset < copiedOffset) {
8693
+ entryPositions.set(entry, lastPosition);
8694
+ } else {
8695
+ if (!compact) {
8696
+ await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
8697
+ }
8698
+ if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
8699
+ await writer.closeDisk();
8700
+ }
8701
+ lastPosition = {
8702
+ offset: getSegmentOffset(zipWriter, writer),
8703
+ diskNumberStart: getDiskNumber(writer)
8704
+ };
8705
+ entryPositions.set(entry, lastPosition);
8706
+ await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
8707
+ copiedOffset = regionEnds[indexEntry];
8708
+ }
8709
+ }
8710
+ }
8711
+ if (!compact) {
8712
+ await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
8627
8713
  }
8628
- await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
8629
8714
  } else {
8630
8715
  const baseOffset = zipWriter.offset;
8631
8716
  await copyData(zipWriter, reader, 0, directoryOffset);
@@ -8637,6 +8722,20 @@ async function copyZipData(zipWriter, reader, entries, directoryOffset) {
8637
8722
  return entryPositions;
8638
8723
  }
8639
8724
 
8725
+ function getRegionEnds(reader, sortedEntries, directoryOffset) {
8726
+ const regionEnds = new Array(sortedEntries.length);
8727
+ let regionEnd = directoryOffset;
8728
+ for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
8729
+ const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
8730
+ const nextEntry = sortedEntries[indexEntry + 1];
8731
+ if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
8732
+ regionEnd = getSourceOffset(reader, nextEntry);
8733
+ }
8734
+ regionEnds[indexEntry] = regionEnd;
8735
+ }
8736
+ return regionEnds;
8737
+ }
8738
+
8640
8739
  async function copyData(zipWriter, reader, offset, size) {
8641
8740
  if (size > 0) {
8642
8741
  const { writer } = zipWriter;
@@ -9014,7 +9113,7 @@ function formatSupported(StreamClass, format) {
9014
9113
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9015
9114
  */
9016
9115
 
9017
- const VERSION = "2.19.0";
9116
+ const VERSION = "2.20.0";
9018
9117
 
9019
9118
  /*
9020
9119
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -11208,11 +11307,13 @@ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
11208
11307
  exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
11209
11308
  exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
11210
11309
  exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
11310
+ exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
11211
11311
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
11212
11312
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
11213
11313
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
11214
11314
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
11215
11315
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
11316
+ exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
11216
11317
  exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
11217
11318
  exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
11218
11319
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;