@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-fs.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";
@@ -4735,6 +4737,21 @@
4735
4737
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4736
4738
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4737
4739
  const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4740
+ const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
4741
+ const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
4742
+ const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
4743
+ const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
4744
+ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4745
+ const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4746
+ const WARNING_APPENDED_DATA = "appended data";
4747
+ const WARNING_PREPENDED_DATA = "prepended data";
4748
+ const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4749
+ const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4750
+ const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4751
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4752
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4753
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
4754
+ const MAX_KNOWN_VERSION = 63;
4738
4755
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4739
4756
  const CHARSET_UTF8 = "utf-8";
4740
4757
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4785,6 +4802,7 @@
4785
4802
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
4786
4803
  throw new Error(ERR_BAD_FORMAT);
4787
4804
  }
4805
+ const warnings = zipReader.warnings = [];
4788
4806
  const strictness = getStrictness(options, zipReader.options);
4789
4807
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4790
4808
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
@@ -4808,8 +4826,12 @@
4808
4826
  const commentOffset = endOfDirectoryInfo.offset;
4809
4827
  const commentLength = getUint16$1(endOfDirectoryView, 20);
4810
4828
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4811
- if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4812
- throwAmbiguousArchive("appended data");
4829
+ const appendedDataLength = reader.size - appendedDataOffset;
4830
+ if (appendedDataLength > maxAppendedDataSize) {
4831
+ throwAmbiguousArchive(WARNING_APPENDED_DATA);
4832
+ }
4833
+ if (appendedDataLength > 0) {
4834
+ addWarning(warnings, WARNING_APPENDED_DATA);
4813
4835
  }
4814
4836
  let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4815
4837
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
@@ -4863,23 +4885,23 @@
4863
4885
  }
4864
4886
  if (lastDiskNumber == MAX_16_BITS) {
4865
4887
  lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4866
- } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4867
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4888
+ } else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4889
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4868
4890
  }
4869
4891
  if (diskNumber == MAX_16_BITS) {
4870
4892
  diskNumber = getUint32$1(endOfDirectoryView, 20);
4871
- } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4872
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4893
+ } else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4894
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4873
4895
  }
4874
4896
  if (filesLength == MAX_16_BITS) {
4875
4897
  filesLength = getBigUint64(endOfDirectoryView, 32);
4876
- } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
4877
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4898
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
4899
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4878
4900
  }
4879
4901
  if (directoryDataLength == MAX_32_BITS) {
4880
4902
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
4881
- } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4882
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4903
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4904
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4883
4905
  }
4884
4906
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4885
4907
  }
@@ -4948,14 +4970,22 @@
4948
4970
  declaredDirectoryDataLength = directoryArray.length;
4949
4971
  decryptedDirectory = true;
4950
4972
  }
4973
+ if (directoryEncryptionInfo && !decryptedDirectory &&
4974
+ (directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
4975
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
4976
+ }
4951
4977
  startOffset = directoryDataOffset;
4952
4978
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4953
4979
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
4954
- const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4980
+ const filenames = new Set();
4955
4981
  let duplicateFilename;
4982
+ let previousEntryPosition = -1;
4956
4983
  const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
4957
4984
  if (!filesLength && recoverWrappedFilesLength) {
4958
4985
  filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
4986
+ if (filesLength) {
4987
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
4988
+ }
4959
4989
  }
4960
4990
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4961
4991
  const fileEntry = new ZipEntry$1(reader, zipReader.options);
@@ -5034,15 +5064,26 @@
5034
5064
  filename,
5035
5065
  comment
5036
5066
  });
5037
- readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5067
+ if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5068
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5069
+ }
5038
5070
  fileEntry.offset += prependedDataLength;
5039
- startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
5040
- if (checkAmbiguity) {
5041
- if (filenames.has(fileEntry.filename)) {
5042
- duplicateFilename = true;
5043
- }
5044
- filenames.add(fileEntry.filename);
5071
+ const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
5072
+ startOffset = Math.min(entryPosition, startOffset);
5073
+ if (entryPosition < previousEntryPosition) {
5074
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
5075
+ }
5076
+ previousEntryPosition = entryPosition;
5077
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
5078
+ addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
5079
+ }
5080
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
5081
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
5082
+ }
5083
+ if (filenames.has(fileEntry.filename)) {
5084
+ duplicateFilename = true;
5045
5085
  }
5086
+ filenames.add(fileEntry.filename);
5046
5087
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
5047
5088
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
5048
5089
  fileEntry.unixMode = unixExternalUpper;
@@ -5080,7 +5121,11 @@
5080
5121
  };
5081
5122
  offset = endOffset;
5082
5123
  if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
5083
- filesLength += getWrappedFilesLength(directoryView, directoryArray, offset);
5124
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5125
+ if (wrappedFilesLength) {
5126
+ filesLength += wrappedFilesLength;
5127
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5128
+ }
5084
5129
  }
5085
5130
  const { onprogress } = options;
5086
5131
  if (onprogress) {
@@ -5106,18 +5151,22 @@
5106
5151
  zipReader.digitalSignature = digitalSignature;
5107
5152
  offsetAfterSignature = offset + 6 + digitalSignature.length;
5108
5153
  }
5109
- if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
5110
- throwAmbiguousArchive("trailing central directory data");
5154
+ if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
5155
+ (!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
5156
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
5111
5157
  }
5112
5158
  if (duplicateFilename) {
5113
- throwAmbiguousArchive("duplicate filename");
5159
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
5114
5160
  }
5115
5161
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5116
5162
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5117
5163
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5118
5164
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5119
5165
  if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5120
- throwAmbiguousArchive("prepended data");
5166
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5167
+ }
5168
+ if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5169
+ addWarning(warnings, WARNING_PREPENDED_DATA);
5121
5170
  }
5122
5171
  if (extractPrependedData) {
5123
5172
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
@@ -5187,6 +5236,28 @@
5187
5236
  }
5188
5237
  }
5189
5238
 
5239
+ async function isZipFile(reader, options = {}) {
5240
+ reader = new GenericReader(reader);
5241
+ await initStream(reader);
5242
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
5243
+ reader = new BlobReader(await streamToBlob(reader.readable));
5244
+ await initStream(reader);
5245
+ }
5246
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
5247
+ return false;
5248
+ }
5249
+ const strictness = getStrictness(options, {});
5250
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
5251
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
5252
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
5253
+ if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
5254
+ return false;
5255
+ }
5256
+ const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
5257
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
5258
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
5259
+ }
5260
+
5190
5261
  let ZipEntry$1 = class ZipEntry {
5191
5262
 
5192
5263
  constructor(reader, options) {
@@ -5218,6 +5289,7 @@
5218
5289
  dataDescriptor
5219
5290
  } = bitFlag;
5220
5291
  const localDirectory = fileEntry.localDirectory = {};
5292
+ const warnings = fileEntry.warnings = [];
5221
5293
  const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
5222
5294
  const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
5223
5295
  const dataView = getDataView(dataArray);
@@ -5258,10 +5330,10 @@
5258
5330
  if (checkLocalFilename) {
5259
5331
  localDirectory.rawFilename = rawLocalFilename;
5260
5332
  }
5261
- readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
5262
- if (checkLocalDirectory) {
5263
- validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
5333
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
5334
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
5264
5335
  }
5336
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
5265
5337
  const { lastAccessDate, creationDate, uid, gid } = localDirectory;
5266
5338
  if (lastAccessDate) {
5267
5339
  fileEntry.lastAccessDate = lastAccessDate;
@@ -5487,6 +5559,7 @@
5487
5559
  const extraField = directory.extraField = new Map();
5488
5560
  const rawExtraFieldView = getDataView(rawExtraField);
5489
5561
  let offsetExtraField = 0;
5562
+ let malformedExtraField = false;
5490
5563
  try {
5491
5564
  while (offsetExtraField < rawExtraField.length) {
5492
5565
  const type = getUint16$1(rawExtraFieldView, offsetExtraField);
@@ -5498,7 +5571,10 @@
5498
5571
  offsetExtraField += 4 + size;
5499
5572
  }
5500
5573
  } catch {
5501
- // ignored
5574
+ malformedExtraField = true;
5575
+ }
5576
+ if (offsetExtraField > rawExtraField.length) {
5577
+ malformedExtraField = true;
5502
5578
  }
5503
5579
  const compressionMethod = getUint16$1(dataView, offset + 4);
5504
5580
  Object.assign(directory, {
@@ -5566,6 +5642,7 @@
5566
5642
  if (extraFieldUSDZ) {
5567
5643
  directory.extraFieldUSDZ = extraFieldUSDZ;
5568
5644
  }
5645
+ return malformedExtraField;
5569
5646
  }
5570
5647
 
5571
5648
  function readExtraFieldZip64(extraFieldZip64, directory) {
@@ -6027,27 +6104,46 @@
6027
6104
  return UNDEFINED_VALUE;
6028
6105
  }
6029
6106
 
6030
- function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
6107
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
6031
6108
  const { rawFilename } = zipEntry;
6109
+ const reject = !warnings;
6032
6110
  const maskedLocalDirectory = zipEntry.decryptedDirectory &&
6033
6111
  (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
6034
6112
  if (checkLocalFilename && !maskedLocalDirectory &&
6035
6113
  (rawLocalFilename.length != rawFilename.length ||
6036
6114
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6037
- throwAmbiguousArchive("mismatched local file header (filename)");
6115
+ reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6038
6116
  }
6039
6117
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6040
- throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
6118
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
6041
6119
  }
6042
6120
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
6043
- throwAmbiguousArchive("mismatched local file header (compression method)");
6121
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
6044
6122
  }
6045
6123
  if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
6046
6124
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
6047
6125
  (localDirectory.crc32 != zipEntry.crc32 ||
6048
6126
  localDirectory.compressedSize != zipEntry.compressedSize ||
6049
6127
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
6050
- throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
6128
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
6129
+ }
6130
+ }
6131
+
6132
+ function reportAmbiguity(reject, warnings, reason) {
6133
+ if (reject) {
6134
+ throwAmbiguousArchive(reason);
6135
+ } else {
6136
+ addWarning(warnings, reason);
6137
+ }
6138
+ }
6139
+
6140
+ function addWarning(warnings, reason, filename) {
6141
+ if (!warnings.some(warning => warning.reason == reason)) {
6142
+ const warning = { reason };
6143
+ if (filename !== UNDEFINED_VALUE) {
6144
+ warning.filename = filename;
6145
+ }
6146
+ warnings.push(warning);
6051
6147
  }
6052
6148
  }
6053
6149
 
@@ -6124,8 +6220,23 @@
6124
6220
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6125
6221
  ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6126
6222
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6223
+ WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
6224
+ WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6225
+ WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6226
+ WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6227
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6228
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6229
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6230
+ WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6231
+ WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6232
+ WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6233
+ WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
6234
+ WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
6235
+ WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
6236
+ WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
6127
6237
  ZipReader: ZipReader,
6128
- ZipReaderStream: ZipReaderStream
6238
+ ZipReaderStream: ZipReaderStream,
6239
+ isZipFile: isZipFile
6129
6240
  });
6130
6241
 
6131
6242
  /*
@@ -6338,6 +6449,7 @@
6338
6449
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6339
6450
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6340
6451
  rawExtraField,
6452
+ rawCentralExtraField: EMPTY_UINT8_ARRAY,
6341
6453
  extendedTimestamp: false,
6342
6454
  headerArray,
6343
6455
  headerView
@@ -6511,7 +6623,6 @@
6511
6623
 
6512
6624
  async function addFileEntry(zipWriter, name, reader, options) {
6513
6625
  options = Object.assign({}, options);
6514
- name = name.trim();
6515
6626
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6516
6627
  name += DIRECTORY_SIGNATURE;
6517
6628
  }
@@ -6602,7 +6713,6 @@
6602
6713
  }
6603
6714
 
6604
6715
  function resolveAttributes(zipWriter, name, options) {
6605
- name = name.trim();
6606
6716
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6607
6717
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
6608
6718
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
@@ -6807,6 +6917,7 @@
6807
6917
  }
6808
6918
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6809
6919
  const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6920
+ const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
6810
6921
  return {
6811
6922
  comment,
6812
6923
  resolvedOptions: {
@@ -6842,7 +6953,8 @@
6842
6953
  dataDescriptor,
6843
6954
  zip64,
6844
6955
  rawExtraField,
6845
- rawLocalExtraField
6956
+ rawLocalExtraField,
6957
+ rawCentralExtraField
6846
6958
  }
6847
6959
  };
6848
6960
  }
@@ -6984,7 +7096,6 @@
6984
7096
  let { name } = entry;
6985
7097
  const { size } = entry;
6986
7098
  const options = Object.assign({}, entry.options);
6987
- name = name.trim();
6988
7099
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6989
7100
  name += DIRECTORY_SIGNATURE;
6990
7101
  }
@@ -7240,6 +7351,7 @@
7240
7351
  versionMadeBy,
7241
7352
  rawComment,
7242
7353
  rawExtraField,
7354
+ rawCentralExtraField,
7243
7355
  useWebWorkers,
7244
7356
  transferStreams,
7245
7357
  onstart,
@@ -7283,6 +7395,7 @@
7283
7395
  rawExtraFieldUnix,
7284
7396
  rawExtraFieldAES,
7285
7397
  rawExtraField,
7398
+ rawCentralExtraField,
7286
7399
  extendedTimestamp,
7287
7400
  msDosCompatible,
7288
7401
  internalFileAttributes,
@@ -7783,6 +7896,7 @@
7783
7896
  rawExtraFieldNTFS,
7784
7897
  rawExtraFieldUnix,
7785
7898
  rawExtraField,
7899
+ rawCentralExtraField,
7786
7900
  extendedTimestamp,
7787
7901
  extraFieldExtendedTimestampFlag,
7788
7902
  lastModDate,
@@ -7837,7 +7951,8 @@
7837
7951
  rawExtraFieldNTFS,
7838
7952
  rawExtraFieldUnix,
7839
7953
  rawExtraFieldTimestamp,
7840
- rawExtraField);
7954
+ rawExtraField,
7955
+ rawCentralExtraField);
7841
7956
  if (extraFieldLength > MAX_16_BITS) {
7842
7957
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7843
7958
  }
@@ -7865,6 +7980,7 @@
7865
7980
  rawExtraFieldNTFS,
7866
7981
  rawExtraFieldUnix,
7867
7982
  rawExtraField,
7983
+ rawCentralExtraField,
7868
7984
  rawComment,
7869
7985
  versionMadeBy,
7870
7986
  headerArray,
@@ -7879,7 +7995,7 @@
7879
7995
  uncompressedSize,
7880
7996
  compressedSize
7881
7997
  } = fileEntry;
7882
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
7998
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
7883
7999
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
7884
8000
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
7885
8001
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -7917,6 +8033,7 @@
7917
8033
  directoryRecord.writeBytes(rawExtraFieldNTFS);
7918
8034
  directoryRecord.writeBytes(rawExtraFieldUnix);
7919
8035
  directoryRecord.writeBytes(rawExtraField);
8036
+ directoryRecord.writeBytes(rawCentralExtraField);
7920
8037
  directoryRecord.writeBytes(rawComment);
7921
8038
  arraySet(directoryArray, directoryRecord.array, offset);
7922
8039
  offset += directoryRecordLength;
@@ -10741,6 +10858,20 @@
10741
10858
  exports.TextWriter = TextWriter;
10742
10859
  exports.Uint8ArrayReader = Uint8ArrayReader;
10743
10860
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
10861
+ exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
10862
+ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
10863
+ exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
10864
+ exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
10865
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
10866
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
10867
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
10868
+ exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
10869
+ exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
10870
+ exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
10871
+ exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
10872
+ exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
10873
+ exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
10874
+ exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
10744
10875
  exports.Writer = Writer;
10745
10876
  exports.ZipDirectoryEntry = ZipDirectoryEntry;
10746
10877
  exports.ZipEntry = ZipEntry;
@@ -10756,6 +10887,7 @@
10756
10887
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
10757
10888
  exports.fs = fs;
10758
10889
  exports.getMimeType = getMimeType;
10890
+ exports.isZipFile = isZipFile;
10759
10891
  exports.registerCodec = registerCodec;
10760
10892
  exports.resetConfiguration = resetConfiguration;
10761
10893
  exports.terminateWorkers = terminateWorkersAndModule;