@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.
@@ -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";
@@ -4711,6 +4713,21 @@
4711
4713
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4712
4714
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4713
4715
  const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4716
+ const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
4717
+ const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
4718
+ const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
4719
+ const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
4720
+ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4721
+ const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4722
+ const WARNING_APPENDED_DATA = "appended data";
4723
+ const WARNING_PREPENDED_DATA = "prepended data";
4724
+ const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4725
+ const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4726
+ const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4727
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4728
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4729
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
4730
+ const MAX_KNOWN_VERSION = 63;
4714
4731
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4715
4732
  const CHARSET_UTF8 = "utf-8";
4716
4733
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4761,6 +4778,7 @@
4761
4778
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
4762
4779
  throw new Error(ERR_BAD_FORMAT);
4763
4780
  }
4781
+ const warnings = zipReader.warnings = [];
4764
4782
  const strictness = getStrictness(options, zipReader.options);
4765
4783
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4766
4784
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
@@ -4784,8 +4802,12 @@
4784
4802
  const commentOffset = endOfDirectoryInfo.offset;
4785
4803
  const commentLength = getUint16$1(endOfDirectoryView, 20);
4786
4804
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4787
- if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4788
- throwAmbiguousArchive("appended data");
4805
+ const appendedDataLength = reader.size - appendedDataOffset;
4806
+ if (appendedDataLength > maxAppendedDataSize) {
4807
+ throwAmbiguousArchive(WARNING_APPENDED_DATA);
4808
+ }
4809
+ if (appendedDataLength > 0) {
4810
+ addWarning(warnings, WARNING_APPENDED_DATA);
4789
4811
  }
4790
4812
  let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4791
4813
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
@@ -4839,23 +4861,23 @@
4839
4861
  }
4840
4862
  if (lastDiskNumber == MAX_16_BITS) {
4841
4863
  lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4842
- } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4843
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4864
+ } else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4865
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4844
4866
  }
4845
4867
  if (diskNumber == MAX_16_BITS) {
4846
4868
  diskNumber = getUint32$1(endOfDirectoryView, 20);
4847
- } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4848
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4869
+ } else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4870
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4849
4871
  }
4850
4872
  if (filesLength == MAX_16_BITS) {
4851
4873
  filesLength = getBigUint64(endOfDirectoryView, 32);
4852
- } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
4853
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4874
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
4875
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4854
4876
  }
4855
4877
  if (directoryDataLength == MAX_32_BITS) {
4856
4878
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
4857
- } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4858
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4879
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4880
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4859
4881
  }
4860
4882
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4861
4883
  }
@@ -4924,14 +4946,22 @@
4924
4946
  declaredDirectoryDataLength = directoryArray.length;
4925
4947
  decryptedDirectory = true;
4926
4948
  }
4949
+ if (directoryEncryptionInfo && !decryptedDirectory &&
4950
+ (directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
4951
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
4952
+ }
4927
4953
  startOffset = directoryDataOffset;
4928
4954
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4929
4955
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
4930
- const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4956
+ const filenames = new Set();
4931
4957
  let duplicateFilename;
4958
+ let previousEntryPosition = -1;
4932
4959
  const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
4933
4960
  if (!filesLength && recoverWrappedFilesLength) {
4934
4961
  filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
4962
+ if (filesLength) {
4963
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
4964
+ }
4935
4965
  }
4936
4966
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4937
4967
  const fileEntry = new ZipEntry(reader, zipReader.options);
@@ -5010,15 +5040,26 @@
5010
5040
  filename,
5011
5041
  comment
5012
5042
  });
5013
- readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5043
+ if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5044
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5045
+ }
5014
5046
  fileEntry.offset += prependedDataLength;
5015
- startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
5016
- if (checkAmbiguity) {
5017
- if (filenames.has(fileEntry.filename)) {
5018
- duplicateFilename = true;
5019
- }
5020
- filenames.add(fileEntry.filename);
5047
+ const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
5048
+ startOffset = Math.min(entryPosition, startOffset);
5049
+ if (entryPosition < previousEntryPosition) {
5050
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
5051
+ }
5052
+ previousEntryPosition = entryPosition;
5053
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
5054
+ addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
5055
+ }
5056
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
5057
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
5058
+ }
5059
+ if (filenames.has(fileEntry.filename)) {
5060
+ duplicateFilename = true;
5021
5061
  }
5062
+ filenames.add(fileEntry.filename);
5022
5063
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
5023
5064
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
5024
5065
  fileEntry.unixMode = unixExternalUpper;
@@ -5056,7 +5097,11 @@
5056
5097
  };
5057
5098
  offset = endOffset;
5058
5099
  if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
5059
- filesLength += getWrappedFilesLength(directoryView, directoryArray, offset);
5100
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5101
+ if (wrappedFilesLength) {
5102
+ filesLength += wrappedFilesLength;
5103
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5104
+ }
5060
5105
  }
5061
5106
  const { onprogress } = options;
5062
5107
  if (onprogress) {
@@ -5082,18 +5127,22 @@
5082
5127
  zipReader.digitalSignature = digitalSignature;
5083
5128
  offsetAfterSignature = offset + 6 + digitalSignature.length;
5084
5129
  }
5085
- if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
5086
- throwAmbiguousArchive("trailing central directory data");
5130
+ if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
5131
+ (!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
5132
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
5087
5133
  }
5088
5134
  if (duplicateFilename) {
5089
- throwAmbiguousArchive("duplicate filename");
5135
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
5090
5136
  }
5091
5137
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5092
5138
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5093
5139
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5094
5140
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5095
5141
  if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5096
- throwAmbiguousArchive("prepended data");
5142
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5143
+ }
5144
+ if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5145
+ addWarning(warnings, WARNING_PREPENDED_DATA);
5097
5146
  }
5098
5147
  if (extractPrependedData) {
5099
5148
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
@@ -5163,6 +5212,28 @@
5163
5212
  }
5164
5213
  }
5165
5214
 
5215
+ async function isZipFile(reader, options = {}) {
5216
+ reader = new GenericReader(reader);
5217
+ await initStream(reader);
5218
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
5219
+ reader = new BlobReader(await streamToBlob(reader.readable));
5220
+ await initStream(reader);
5221
+ }
5222
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
5223
+ return false;
5224
+ }
5225
+ const strictness = getStrictness(options, {});
5226
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
5227
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
5228
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
5229
+ if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
5230
+ return false;
5231
+ }
5232
+ const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
5233
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
5234
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
5235
+ }
5236
+
5166
5237
  class ZipEntry {
5167
5238
 
5168
5239
  constructor(reader, options) {
@@ -5194,6 +5265,7 @@
5194
5265
  dataDescriptor
5195
5266
  } = bitFlag;
5196
5267
  const localDirectory = fileEntry.localDirectory = {};
5268
+ const warnings = fileEntry.warnings = [];
5197
5269
  const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
5198
5270
  const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
5199
5271
  const dataView = getDataView(dataArray);
@@ -5234,10 +5306,10 @@
5234
5306
  if (checkLocalFilename) {
5235
5307
  localDirectory.rawFilename = rawLocalFilename;
5236
5308
  }
5237
- readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
5238
- if (checkLocalDirectory) {
5239
- validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
5309
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
5310
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
5240
5311
  }
5312
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
5241
5313
  const { lastAccessDate, creationDate, uid, gid } = localDirectory;
5242
5314
  if (lastAccessDate) {
5243
5315
  fileEntry.lastAccessDate = lastAccessDate;
@@ -5463,6 +5535,7 @@
5463
5535
  const extraField = directory.extraField = new Map();
5464
5536
  const rawExtraFieldView = getDataView(rawExtraField);
5465
5537
  let offsetExtraField = 0;
5538
+ let malformedExtraField = false;
5466
5539
  try {
5467
5540
  while (offsetExtraField < rawExtraField.length) {
5468
5541
  const type = getUint16$1(rawExtraFieldView, offsetExtraField);
@@ -5474,7 +5547,10 @@
5474
5547
  offsetExtraField += 4 + size;
5475
5548
  }
5476
5549
  } catch {
5477
- // ignored
5550
+ malformedExtraField = true;
5551
+ }
5552
+ if (offsetExtraField > rawExtraField.length) {
5553
+ malformedExtraField = true;
5478
5554
  }
5479
5555
  const compressionMethod = getUint16$1(dataView, offset + 4);
5480
5556
  Object.assign(directory, {
@@ -5542,6 +5618,7 @@
5542
5618
  if (extraFieldUSDZ) {
5543
5619
  directory.extraFieldUSDZ = extraFieldUSDZ;
5544
5620
  }
5621
+ return malformedExtraField;
5545
5622
  }
5546
5623
 
5547
5624
  function readExtraFieldZip64(extraFieldZip64, directory) {
@@ -6003,27 +6080,46 @@
6003
6080
  return UNDEFINED_VALUE;
6004
6081
  }
6005
6082
 
6006
- function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
6083
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
6007
6084
  const { rawFilename } = zipEntry;
6085
+ const reject = !warnings;
6008
6086
  const maskedLocalDirectory = zipEntry.decryptedDirectory &&
6009
6087
  (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
6010
6088
  if (checkLocalFilename && !maskedLocalDirectory &&
6011
6089
  (rawLocalFilename.length != rawFilename.length ||
6012
6090
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6013
- throwAmbiguousArchive("mismatched local file header (filename)");
6091
+ reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6014
6092
  }
6015
6093
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6016
- throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
6094
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
6017
6095
  }
6018
6096
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
6019
- throwAmbiguousArchive("mismatched local file header (compression method)");
6097
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
6020
6098
  }
6021
6099
  if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
6022
6100
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
6023
6101
  (localDirectory.crc32 != zipEntry.crc32 ||
6024
6102
  localDirectory.compressedSize != zipEntry.compressedSize ||
6025
6103
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
6026
- throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
6104
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
6105
+ }
6106
+ }
6107
+
6108
+ function reportAmbiguity(reject, warnings, reason) {
6109
+ if (reject) {
6110
+ throwAmbiguousArchive(reason);
6111
+ } else {
6112
+ addWarning(warnings, reason);
6113
+ }
6114
+ }
6115
+
6116
+ function addWarning(warnings, reason, filename) {
6117
+ if (!warnings.some(warning => warning.reason == reason)) {
6118
+ const warning = { reason };
6119
+ if (filename !== UNDEFINED_VALUE) {
6120
+ warning.filename = filename;
6121
+ }
6122
+ warnings.push(warning);
6027
6123
  }
6028
6124
  }
6029
6125
 
@@ -6100,8 +6196,23 @@
6100
6196
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6101
6197
  ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6102
6198
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6199
+ WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
6200
+ WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6201
+ WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6202
+ WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6203
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6204
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6205
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6206
+ WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6207
+ WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6208
+ WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6209
+ WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
6210
+ WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
6211
+ WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
6212
+ WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
6103
6213
  ZipReader: ZipReader,
6104
- ZipReaderStream: ZipReaderStream
6214
+ ZipReaderStream: ZipReaderStream,
6215
+ isZipFile: isZipFile
6105
6216
  });
6106
6217
 
6107
6218
  /*
@@ -6314,6 +6425,7 @@
6314
6425
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6315
6426
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6316
6427
  rawExtraField,
6428
+ rawCentralExtraField: EMPTY_UINT8_ARRAY,
6317
6429
  extendedTimestamp: false,
6318
6430
  headerArray,
6319
6431
  headerView
@@ -6487,7 +6599,6 @@
6487
6599
 
6488
6600
  async function addFileEntry(zipWriter, name, reader, options) {
6489
6601
  options = Object.assign({}, options);
6490
- name = name.trim();
6491
6602
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6492
6603
  name += DIRECTORY_SIGNATURE;
6493
6604
  }
@@ -6578,7 +6689,6 @@
6578
6689
  }
6579
6690
 
6580
6691
  function resolveAttributes(zipWriter, name, options) {
6581
- name = name.trim();
6582
6692
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6583
6693
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
6584
6694
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
@@ -6783,6 +6893,7 @@
6783
6893
  }
6784
6894
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6785
6895
  const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6896
+ const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
6786
6897
  return {
6787
6898
  comment,
6788
6899
  resolvedOptions: {
@@ -6818,7 +6929,8 @@
6818
6929
  dataDescriptor,
6819
6930
  zip64,
6820
6931
  rawExtraField,
6821
- rawLocalExtraField
6932
+ rawLocalExtraField,
6933
+ rawCentralExtraField
6822
6934
  }
6823
6935
  };
6824
6936
  }
@@ -7137,6 +7249,7 @@
7137
7249
  versionMadeBy,
7138
7250
  rawComment,
7139
7251
  rawExtraField,
7252
+ rawCentralExtraField,
7140
7253
  useWebWorkers,
7141
7254
  transferStreams,
7142
7255
  onstart,
@@ -7180,6 +7293,7 @@
7180
7293
  rawExtraFieldUnix,
7181
7294
  rawExtraFieldAES,
7182
7295
  rawExtraField,
7296
+ rawCentralExtraField,
7183
7297
  extendedTimestamp,
7184
7298
  msDosCompatible,
7185
7299
  internalFileAttributes,
@@ -7680,6 +7794,7 @@
7680
7794
  rawExtraFieldNTFS,
7681
7795
  rawExtraFieldUnix,
7682
7796
  rawExtraField,
7797
+ rawCentralExtraField,
7683
7798
  extendedTimestamp,
7684
7799
  extraFieldExtendedTimestampFlag,
7685
7800
  lastModDate,
@@ -7734,7 +7849,8 @@
7734
7849
  rawExtraFieldNTFS,
7735
7850
  rawExtraFieldUnix,
7736
7851
  rawExtraFieldTimestamp,
7737
- rawExtraField);
7852
+ rawExtraField,
7853
+ rawCentralExtraField);
7738
7854
  if (extraFieldLength > MAX_16_BITS) {
7739
7855
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7740
7856
  }
@@ -7762,6 +7878,7 @@
7762
7878
  rawExtraFieldNTFS,
7763
7879
  rawExtraFieldUnix,
7764
7880
  rawExtraField,
7881
+ rawCentralExtraField,
7765
7882
  rawComment,
7766
7883
  versionMadeBy,
7767
7884
  headerArray,
@@ -7776,7 +7893,7 @@
7776
7893
  uncompressedSize,
7777
7894
  compressedSize
7778
7895
  } = fileEntry;
7779
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
7896
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
7780
7897
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
7781
7898
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
7782
7899
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -7814,6 +7931,7 @@
7814
7931
  directoryRecord.writeBytes(rawExtraFieldNTFS);
7815
7932
  directoryRecord.writeBytes(rawExtraFieldUnix);
7816
7933
  directoryRecord.writeBytes(rawExtraField);
7934
+ directoryRecord.writeBytes(rawCentralExtraField);
7817
7935
  directoryRecord.writeBytes(rawComment);
7818
7936
  arraySet(directoryArray, directoryRecord.array, offset);
7819
7937
  offset += directoryRecordLength;
@@ -8848,6 +8966,20 @@
8848
8966
  exports.TextWriter = TextWriter;
8849
8967
  exports.Uint8ArrayReader = Uint8ArrayReader;
8850
8968
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
8969
+ exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
8970
+ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
8971
+ exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
8972
+ exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
8973
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
8974
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
8975
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
8976
+ exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
8977
+ exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
8978
+ exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
8979
+ exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
8980
+ exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
8981
+ exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
8982
+ exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
8851
8983
  exports.Writer = Writer;
8852
8984
  exports.ZipReader = ZipReader;
8853
8985
  exports.ZipReaderStream = ZipReaderStream;
@@ -8858,6 +8990,7 @@
8858
8990
  exports.createOPFSTempStream = createOPFSTempStream;
8859
8991
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
8860
8992
  exports.getMimeType = getMimeType;
8993
+ exports.isZipFile = isZipFile;
8861
8994
  exports.registerCodec = registerCodec;
8862
8995
  exports.resetConfiguration = resetConfiguration;
8863
8996
  exports.terminateWorkers = terminateWorkers;