@zip.js/zip.js 2.8.58 → 2.8.59

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
@@ -83,6 +83,7 @@
83
83
  const BITFLAG_LEVEL_FAST_MASK = 0b100;
84
84
  const BITFLAG_LEVEL_SUPER_FAST_MASK = 0b110;
85
85
  const BITFLAG_DATA_DESCRIPTOR = 0b1000;
86
+ const BITFLAG_COMPRESSED_PATCHED_DATA = 0b100000;
86
87
  const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
87
88
  const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
88
89
  const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
@@ -200,6 +201,7 @@
200
201
  const OPTION_USDZ = "usdz";
201
202
  const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
202
203
  const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
204
+ const OPTION_CENTRAL_EXTRA_FIELD = "centralExtraField";
203
205
  const OPTION_STRICTNESS = "strictness";
204
206
  const OPTION_FILENAME_VALIDATION = "filenameValidation";
205
207
  const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
@@ -4715,6 +4717,21 @@
4715
4717
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4716
4718
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4717
4719
  const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4720
+ const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
4721
+ const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
4722
+ const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
4723
+ const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
4724
+ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4725
+ const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4726
+ const WARNING_APPENDED_DATA = "appended data";
4727
+ const WARNING_PREPENDED_DATA = "prepended data";
4728
+ const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4729
+ const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4730
+ const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4731
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4732
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4733
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
4734
+ const MAX_KNOWN_VERSION = 63;
4718
4735
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4719
4736
  const CHARSET_UTF8 = "utf-8";
4720
4737
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4765,6 +4782,7 @@
4765
4782
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
4766
4783
  throw new Error(ERR_BAD_FORMAT);
4767
4784
  }
4785
+ const warnings = zipReader.warnings = [];
4768
4786
  const strictness = getStrictness(options, zipReader.options);
4769
4787
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4770
4788
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
@@ -4788,8 +4806,12 @@
4788
4806
  const commentOffset = endOfDirectoryInfo.offset;
4789
4807
  const commentLength = getUint16$1(endOfDirectoryView, 20);
4790
4808
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4791
- if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4792
- throwAmbiguousArchive("appended data");
4809
+ const appendedDataLength = reader.size - appendedDataOffset;
4810
+ if (appendedDataLength > maxAppendedDataSize) {
4811
+ throwAmbiguousArchive(WARNING_APPENDED_DATA);
4812
+ }
4813
+ if (appendedDataLength > 0) {
4814
+ addWarning(warnings, WARNING_APPENDED_DATA);
4793
4815
  }
4794
4816
  let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4795
4817
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
@@ -4843,23 +4865,23 @@
4843
4865
  }
4844
4866
  if (lastDiskNumber == MAX_16_BITS) {
4845
4867
  lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4846
- } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4847
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4868
+ } else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4869
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4848
4870
  }
4849
4871
  if (diskNumber == MAX_16_BITS) {
4850
4872
  diskNumber = getUint32$1(endOfDirectoryView, 20);
4851
- } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4852
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4873
+ } else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4874
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4853
4875
  }
4854
4876
  if (filesLength == MAX_16_BITS) {
4855
4877
  filesLength = getBigUint64(endOfDirectoryView, 32);
4856
- } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
4857
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4878
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
4879
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4858
4880
  }
4859
4881
  if (directoryDataLength == MAX_32_BITS) {
4860
4882
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
4861
- } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4862
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4883
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4884
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4863
4885
  }
4864
4886
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4865
4887
  }
@@ -4928,14 +4950,22 @@
4928
4950
  declaredDirectoryDataLength = directoryArray.length;
4929
4951
  decryptedDirectory = true;
4930
4952
  }
4953
+ if (directoryEncryptionInfo && !decryptedDirectory &&
4954
+ (directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
4955
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
4956
+ }
4931
4957
  startOffset = directoryDataOffset;
4932
4958
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4933
4959
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
4934
- const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4960
+ const filenames = new Set();
4935
4961
  let duplicateFilename;
4962
+ let previousEntryPosition = -1;
4936
4963
  const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
4937
4964
  if (!filesLength && recoverWrappedFilesLength) {
4938
4965
  filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
4966
+ if (filesLength) {
4967
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
4968
+ }
4939
4969
  }
4940
4970
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4941
4971
  const fileEntry = new ZipEntry(reader, zipReader.options);
@@ -5014,15 +5044,26 @@
5014
5044
  filename,
5015
5045
  comment
5016
5046
  });
5017
- readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5047
+ if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5048
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5049
+ }
5018
5050
  fileEntry.offset += prependedDataLength;
5019
- startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
5020
- if (checkAmbiguity) {
5021
- if (filenames.has(fileEntry.filename)) {
5022
- duplicateFilename = true;
5023
- }
5024
- filenames.add(fileEntry.filename);
5051
+ const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
5052
+ startOffset = Math.min(entryPosition, startOffset);
5053
+ if (entryPosition < previousEntryPosition) {
5054
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
5055
+ }
5056
+ previousEntryPosition = entryPosition;
5057
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
5058
+ addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
5059
+ }
5060
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
5061
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
5062
+ }
5063
+ if (filenames.has(fileEntry.filename)) {
5064
+ duplicateFilename = true;
5025
5065
  }
5066
+ filenames.add(fileEntry.filename);
5026
5067
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
5027
5068
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
5028
5069
  fileEntry.unixMode = unixExternalUpper;
@@ -5060,7 +5101,11 @@
5060
5101
  };
5061
5102
  offset = endOffset;
5062
5103
  if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
5063
- filesLength += getWrappedFilesLength(directoryView, directoryArray, offset);
5104
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5105
+ if (wrappedFilesLength) {
5106
+ filesLength += wrappedFilesLength;
5107
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5108
+ }
5064
5109
  }
5065
5110
  const { onprogress } = options;
5066
5111
  if (onprogress) {
@@ -5086,18 +5131,22 @@
5086
5131
  zipReader.digitalSignature = digitalSignature;
5087
5132
  offsetAfterSignature = offset + 6 + digitalSignature.length;
5088
5133
  }
5089
- if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
5090
- throwAmbiguousArchive("trailing central directory data");
5134
+ if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
5135
+ (!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
5136
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
5091
5137
  }
5092
5138
  if (duplicateFilename) {
5093
- throwAmbiguousArchive("duplicate filename");
5139
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
5094
5140
  }
5095
5141
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5096
5142
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5097
5143
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5098
5144
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5099
5145
  if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5100
- throwAmbiguousArchive("prepended data");
5146
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5147
+ }
5148
+ if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5149
+ addWarning(warnings, WARNING_PREPENDED_DATA);
5101
5150
  }
5102
5151
  if (extractPrependedData) {
5103
5152
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
@@ -5167,6 +5216,28 @@
5167
5216
  }
5168
5217
  }
5169
5218
 
5219
+ async function isZipFile(reader, options = {}) {
5220
+ reader = new GenericReader(reader);
5221
+ await initStream(reader);
5222
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
5223
+ reader = new BlobReader(await streamToBlob(reader.readable));
5224
+ await initStream(reader);
5225
+ }
5226
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
5227
+ return false;
5228
+ }
5229
+ const strictness = getStrictness(options, {});
5230
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
5231
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
5232
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
5233
+ if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
5234
+ return false;
5235
+ }
5236
+ const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
5237
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
5238
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
5239
+ }
5240
+
5170
5241
  class ZipEntry {
5171
5242
 
5172
5243
  constructor(reader, options) {
@@ -5198,6 +5269,7 @@
5198
5269
  dataDescriptor
5199
5270
  } = bitFlag;
5200
5271
  const localDirectory = fileEntry.localDirectory = {};
5272
+ const warnings = fileEntry.warnings = [];
5201
5273
  const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
5202
5274
  const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
5203
5275
  const dataView = getDataView(dataArray);
@@ -5238,10 +5310,10 @@
5238
5310
  if (checkLocalFilename) {
5239
5311
  localDirectory.rawFilename = rawLocalFilename;
5240
5312
  }
5241
- readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
5242
- if (checkLocalDirectory) {
5243
- validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
5313
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
5314
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
5244
5315
  }
5316
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
5245
5317
  const { lastAccessDate, creationDate, uid, gid } = localDirectory;
5246
5318
  if (lastAccessDate) {
5247
5319
  fileEntry.lastAccessDate = lastAccessDate;
@@ -5467,6 +5539,7 @@
5467
5539
  const extraField = directory.extraField = new Map();
5468
5540
  const rawExtraFieldView = getDataView(rawExtraField);
5469
5541
  let offsetExtraField = 0;
5542
+ let malformedExtraField = false;
5470
5543
  try {
5471
5544
  while (offsetExtraField < rawExtraField.length) {
5472
5545
  const type = getUint16$1(rawExtraFieldView, offsetExtraField);
@@ -5478,7 +5551,10 @@
5478
5551
  offsetExtraField += 4 + size;
5479
5552
  }
5480
5553
  } catch {
5481
- // ignored
5554
+ malformedExtraField = true;
5555
+ }
5556
+ if (offsetExtraField > rawExtraField.length) {
5557
+ malformedExtraField = true;
5482
5558
  }
5483
5559
  const compressionMethod = getUint16$1(dataView, offset + 4);
5484
5560
  Object.assign(directory, {
@@ -5546,6 +5622,7 @@
5546
5622
  if (extraFieldUSDZ) {
5547
5623
  directory.extraFieldUSDZ = extraFieldUSDZ;
5548
5624
  }
5625
+ return malformedExtraField;
5549
5626
  }
5550
5627
 
5551
5628
  function readExtraFieldZip64(extraFieldZip64, directory) {
@@ -6007,27 +6084,46 @@
6007
6084
  return UNDEFINED_VALUE;
6008
6085
  }
6009
6086
 
6010
- function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
6087
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
6011
6088
  const { rawFilename } = zipEntry;
6089
+ const reject = !warnings;
6012
6090
  const maskedLocalDirectory = zipEntry.decryptedDirectory &&
6013
6091
  (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
6014
6092
  if (checkLocalFilename && !maskedLocalDirectory &&
6015
6093
  (rawLocalFilename.length != rawFilename.length ||
6016
6094
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6017
- throwAmbiguousArchive("mismatched local file header (filename)");
6095
+ reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6018
6096
  }
6019
6097
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6020
- throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
6098
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
6021
6099
  }
6022
6100
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
6023
- throwAmbiguousArchive("mismatched local file header (compression method)");
6101
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
6024
6102
  }
6025
6103
  if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
6026
6104
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
6027
6105
  (localDirectory.crc32 != zipEntry.crc32 ||
6028
6106
  localDirectory.compressedSize != zipEntry.compressedSize ||
6029
6107
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
6030
- throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
6108
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
6109
+ }
6110
+ }
6111
+
6112
+ function reportAmbiguity(reject, warnings, reason) {
6113
+ if (reject) {
6114
+ throwAmbiguousArchive(reason);
6115
+ } else {
6116
+ addWarning(warnings, reason);
6117
+ }
6118
+ }
6119
+
6120
+ function addWarning(warnings, reason, filename) {
6121
+ if (!warnings.some(warning => warning.reason == reason)) {
6122
+ const warning = { reason };
6123
+ if (filename !== UNDEFINED_VALUE) {
6124
+ warning.filename = filename;
6125
+ }
6126
+ warnings.push(warning);
6031
6127
  }
6032
6128
  }
6033
6129
 
@@ -6104,8 +6200,23 @@
6104
6200
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6105
6201
  ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6106
6202
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6203
+ WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
6204
+ WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6205
+ WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6206
+ WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6207
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6208
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6209
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6210
+ WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6211
+ WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6212
+ WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6213
+ WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
6214
+ WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
6215
+ WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
6216
+ WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
6107
6217
  ZipReader: ZipReader,
6108
- ZipReaderStream: ZipReaderStream
6218
+ ZipReaderStream: ZipReaderStream,
6219
+ isZipFile: isZipFile
6109
6220
  });
6110
6221
 
6111
6222
  /*
@@ -6318,6 +6429,7 @@
6318
6429
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6319
6430
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6320
6431
  rawExtraField,
6432
+ rawCentralExtraField: EMPTY_UINT8_ARRAY,
6321
6433
  extendedTimestamp: false,
6322
6434
  headerArray,
6323
6435
  headerView
@@ -6491,7 +6603,6 @@
6491
6603
 
6492
6604
  async function addFileEntry(zipWriter, name, reader, options) {
6493
6605
  options = Object.assign({}, options);
6494
- name = name.trim();
6495
6606
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6496
6607
  name += DIRECTORY_SIGNATURE;
6497
6608
  }
@@ -6582,7 +6693,6 @@
6582
6693
  }
6583
6694
 
6584
6695
  function resolveAttributes(zipWriter, name, options) {
6585
- name = name.trim();
6586
6696
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6587
6697
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
6588
6698
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
@@ -6787,6 +6897,7 @@
6787
6897
  }
6788
6898
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6789
6899
  const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6900
+ const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
6790
6901
  return {
6791
6902
  comment,
6792
6903
  resolvedOptions: {
@@ -6822,7 +6933,8 @@
6822
6933
  dataDescriptor,
6823
6934
  zip64,
6824
6935
  rawExtraField,
6825
- rawLocalExtraField
6936
+ rawLocalExtraField,
6937
+ rawCentralExtraField
6826
6938
  }
6827
6939
  };
6828
6940
  }
@@ -7141,6 +7253,7 @@
7141
7253
  versionMadeBy,
7142
7254
  rawComment,
7143
7255
  rawExtraField,
7256
+ rawCentralExtraField,
7144
7257
  useWebWorkers,
7145
7258
  transferStreams,
7146
7259
  onstart,
@@ -7184,6 +7297,7 @@
7184
7297
  rawExtraFieldUnix,
7185
7298
  rawExtraFieldAES,
7186
7299
  rawExtraField,
7300
+ rawCentralExtraField,
7187
7301
  extendedTimestamp,
7188
7302
  msDosCompatible,
7189
7303
  internalFileAttributes,
@@ -7684,6 +7798,7 @@
7684
7798
  rawExtraFieldNTFS,
7685
7799
  rawExtraFieldUnix,
7686
7800
  rawExtraField,
7801
+ rawCentralExtraField,
7687
7802
  extendedTimestamp,
7688
7803
  extraFieldExtendedTimestampFlag,
7689
7804
  lastModDate,
@@ -7738,7 +7853,8 @@
7738
7853
  rawExtraFieldNTFS,
7739
7854
  rawExtraFieldUnix,
7740
7855
  rawExtraFieldTimestamp,
7741
- rawExtraField);
7856
+ rawExtraField,
7857
+ rawCentralExtraField);
7742
7858
  if (extraFieldLength > MAX_16_BITS) {
7743
7859
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7744
7860
  }
@@ -7766,6 +7882,7 @@
7766
7882
  rawExtraFieldNTFS,
7767
7883
  rawExtraFieldUnix,
7768
7884
  rawExtraField,
7885
+ rawCentralExtraField,
7769
7886
  rawComment,
7770
7887
  versionMadeBy,
7771
7888
  headerArray,
@@ -7780,7 +7897,7 @@
7780
7897
  uncompressedSize,
7781
7898
  compressedSize
7782
7899
  } = fileEntry;
7783
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
7900
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
7784
7901
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
7785
7902
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
7786
7903
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -7818,6 +7935,7 @@
7818
7935
  directoryRecord.writeBytes(rawExtraFieldNTFS);
7819
7936
  directoryRecord.writeBytes(rawExtraFieldUnix);
7820
7937
  directoryRecord.writeBytes(rawExtraField);
7938
+ directoryRecord.writeBytes(rawCentralExtraField);
7821
7939
  directoryRecord.writeBytes(rawComment);
7822
7940
  arraySet(directoryArray, directoryRecord.array, offset);
7823
7941
  offset += directoryRecordLength;
@@ -9255,6 +9373,20 @@
9255
9373
  exports.TextWriter = TextWriter;
9256
9374
  exports.Uint8ArrayReader = Uint8ArrayReader;
9257
9375
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
9376
+ exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
9377
+ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
9378
+ exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
9379
+ exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
9380
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
9381
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
9382
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
9383
+ exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
9384
+ exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
9385
+ exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
9386
+ exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
9387
+ exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
9388
+ exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
9389
+ exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
9258
9390
  exports.Writer = Writer;
9259
9391
  exports.ZipReader = ZipReader;
9260
9392
  exports.ZipReaderStream = ZipReaderStream;
@@ -9265,6 +9397,7 @@
9265
9397
  exports.createOPFSTempStream = createOPFSTempStream;
9266
9398
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
9267
9399
  exports.getMimeType = getMimeType;
9400
+ exports.isZipFile = isZipFile;
9268
9401
  exports.registerCodec = registerCodec;
9269
9402
  exports.resetConfiguration = resetConfiguration;
9270
9403
  exports.terminateWorkers = terminateWorkersAndModule;