@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-core.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";
@@ -4709,6 +4711,21 @@
4709
4711
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4710
4712
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4711
4713
  const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4714
+ const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
4715
+ const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
4716
+ const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
4717
+ const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
4718
+ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4719
+ const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4720
+ const WARNING_APPENDED_DATA = "appended data";
4721
+ const WARNING_PREPENDED_DATA = "prepended data";
4722
+ const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4723
+ const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4724
+ const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4725
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4726
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4727
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
4728
+ const MAX_KNOWN_VERSION = 63;
4712
4729
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4713
4730
  const CHARSET_UTF8 = "utf-8";
4714
4731
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4759,6 +4776,7 @@
4759
4776
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
4760
4777
  throw new Error(ERR_BAD_FORMAT);
4761
4778
  }
4779
+ const warnings = zipReader.warnings = [];
4762
4780
  const strictness = getStrictness(options, zipReader.options);
4763
4781
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4764
4782
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
@@ -4782,8 +4800,12 @@
4782
4800
  const commentOffset = endOfDirectoryInfo.offset;
4783
4801
  const commentLength = getUint16$1(endOfDirectoryView, 20);
4784
4802
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4785
- if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4786
- throwAmbiguousArchive("appended data");
4803
+ const appendedDataLength = reader.size - appendedDataOffset;
4804
+ if (appendedDataLength > maxAppendedDataSize) {
4805
+ throwAmbiguousArchive(WARNING_APPENDED_DATA);
4806
+ }
4807
+ if (appendedDataLength > 0) {
4808
+ addWarning(warnings, WARNING_APPENDED_DATA);
4787
4809
  }
4788
4810
  let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4789
4811
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
@@ -4837,23 +4859,23 @@
4837
4859
  }
4838
4860
  if (lastDiskNumber == MAX_16_BITS) {
4839
4861
  lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4840
- } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4841
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4862
+ } else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4863
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4842
4864
  }
4843
4865
  if (diskNumber == MAX_16_BITS) {
4844
4866
  diskNumber = getUint32$1(endOfDirectoryView, 20);
4845
- } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4846
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4867
+ } else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4868
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4847
4869
  }
4848
4870
  if (filesLength == MAX_16_BITS) {
4849
4871
  filesLength = getBigUint64(endOfDirectoryView, 32);
4850
- } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
4851
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4872
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
4873
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4852
4874
  }
4853
4875
  if (directoryDataLength == MAX_32_BITS) {
4854
4876
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
4855
- } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4856
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4877
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4878
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4857
4879
  }
4858
4880
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4859
4881
  }
@@ -4922,14 +4944,22 @@
4922
4944
  declaredDirectoryDataLength = directoryArray.length;
4923
4945
  decryptedDirectory = true;
4924
4946
  }
4947
+ if (directoryEncryptionInfo && !decryptedDirectory &&
4948
+ (directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
4949
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
4950
+ }
4925
4951
  startOffset = directoryDataOffset;
4926
4952
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4927
4953
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
4928
- const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4954
+ const filenames = new Set();
4929
4955
  let duplicateFilename;
4956
+ let previousEntryPosition = -1;
4930
4957
  const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
4931
4958
  if (!filesLength && recoverWrappedFilesLength) {
4932
4959
  filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
4960
+ if (filesLength) {
4961
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
4962
+ }
4933
4963
  }
4934
4964
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4935
4965
  const fileEntry = new ZipEntry(reader, zipReader.options);
@@ -5008,15 +5038,26 @@
5008
5038
  filename,
5009
5039
  comment
5010
5040
  });
5011
- readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5041
+ if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5042
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5043
+ }
5012
5044
  fileEntry.offset += prependedDataLength;
5013
- startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
5014
- if (checkAmbiguity) {
5015
- if (filenames.has(fileEntry.filename)) {
5016
- duplicateFilename = true;
5017
- }
5018
- filenames.add(fileEntry.filename);
5045
+ const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
5046
+ startOffset = Math.min(entryPosition, startOffset);
5047
+ if (entryPosition < previousEntryPosition) {
5048
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
5049
+ }
5050
+ previousEntryPosition = entryPosition;
5051
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
5052
+ addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
5053
+ }
5054
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
5055
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
5056
+ }
5057
+ if (filenames.has(fileEntry.filename)) {
5058
+ duplicateFilename = true;
5019
5059
  }
5060
+ filenames.add(fileEntry.filename);
5020
5061
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
5021
5062
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
5022
5063
  fileEntry.unixMode = unixExternalUpper;
@@ -5054,7 +5095,11 @@
5054
5095
  };
5055
5096
  offset = endOffset;
5056
5097
  if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
5057
- filesLength += getWrappedFilesLength(directoryView, directoryArray, offset);
5098
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5099
+ if (wrappedFilesLength) {
5100
+ filesLength += wrappedFilesLength;
5101
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5102
+ }
5058
5103
  }
5059
5104
  const { onprogress } = options;
5060
5105
  if (onprogress) {
@@ -5080,18 +5125,22 @@
5080
5125
  zipReader.digitalSignature = digitalSignature;
5081
5126
  offsetAfterSignature = offset + 6 + digitalSignature.length;
5082
5127
  }
5083
- if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
5084
- throwAmbiguousArchive("trailing central directory data");
5128
+ if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
5129
+ (!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
5130
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
5085
5131
  }
5086
5132
  if (duplicateFilename) {
5087
- throwAmbiguousArchive("duplicate filename");
5133
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
5088
5134
  }
5089
5135
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5090
5136
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5091
5137
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5092
5138
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5093
5139
  if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5094
- throwAmbiguousArchive("prepended data");
5140
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5141
+ }
5142
+ if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5143
+ addWarning(warnings, WARNING_PREPENDED_DATA);
5095
5144
  }
5096
5145
  if (extractPrependedData) {
5097
5146
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
@@ -5161,6 +5210,28 @@
5161
5210
  }
5162
5211
  }
5163
5212
 
5213
+ async function isZipFile(reader, options = {}) {
5214
+ reader = new GenericReader(reader);
5215
+ await initStream(reader);
5216
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
5217
+ reader = new BlobReader(await streamToBlob(reader.readable));
5218
+ await initStream(reader);
5219
+ }
5220
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
5221
+ return false;
5222
+ }
5223
+ const strictness = getStrictness(options, {});
5224
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
5225
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
5226
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
5227
+ if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
5228
+ return false;
5229
+ }
5230
+ const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
5231
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
5232
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
5233
+ }
5234
+
5164
5235
  class ZipEntry {
5165
5236
 
5166
5237
  constructor(reader, options) {
@@ -5192,6 +5263,7 @@
5192
5263
  dataDescriptor
5193
5264
  } = bitFlag;
5194
5265
  const localDirectory = fileEntry.localDirectory = {};
5266
+ const warnings = fileEntry.warnings = [];
5195
5267
  const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
5196
5268
  const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
5197
5269
  const dataView = getDataView(dataArray);
@@ -5232,10 +5304,10 @@
5232
5304
  if (checkLocalFilename) {
5233
5305
  localDirectory.rawFilename = rawLocalFilename;
5234
5306
  }
5235
- readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
5236
- if (checkLocalDirectory) {
5237
- validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
5307
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
5308
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
5238
5309
  }
5310
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
5239
5311
  const { lastAccessDate, creationDate, uid, gid } = localDirectory;
5240
5312
  if (lastAccessDate) {
5241
5313
  fileEntry.lastAccessDate = lastAccessDate;
@@ -5461,6 +5533,7 @@
5461
5533
  const extraField = directory.extraField = new Map();
5462
5534
  const rawExtraFieldView = getDataView(rawExtraField);
5463
5535
  let offsetExtraField = 0;
5536
+ let malformedExtraField = false;
5464
5537
  try {
5465
5538
  while (offsetExtraField < rawExtraField.length) {
5466
5539
  const type = getUint16$1(rawExtraFieldView, offsetExtraField);
@@ -5472,7 +5545,10 @@
5472
5545
  offsetExtraField += 4 + size;
5473
5546
  }
5474
5547
  } catch {
5475
- // ignored
5548
+ malformedExtraField = true;
5549
+ }
5550
+ if (offsetExtraField > rawExtraField.length) {
5551
+ malformedExtraField = true;
5476
5552
  }
5477
5553
  const compressionMethod = getUint16$1(dataView, offset + 4);
5478
5554
  Object.assign(directory, {
@@ -5540,6 +5616,7 @@
5540
5616
  if (extraFieldUSDZ) {
5541
5617
  directory.extraFieldUSDZ = extraFieldUSDZ;
5542
5618
  }
5619
+ return malformedExtraField;
5543
5620
  }
5544
5621
 
5545
5622
  function readExtraFieldZip64(extraFieldZip64, directory) {
@@ -6001,27 +6078,46 @@
6001
6078
  return UNDEFINED_VALUE;
6002
6079
  }
6003
6080
 
6004
- function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
6081
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
6005
6082
  const { rawFilename } = zipEntry;
6083
+ const reject = !warnings;
6006
6084
  const maskedLocalDirectory = zipEntry.decryptedDirectory &&
6007
6085
  (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
6008
6086
  if (checkLocalFilename && !maskedLocalDirectory &&
6009
6087
  (rawLocalFilename.length != rawFilename.length ||
6010
6088
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6011
- throwAmbiguousArchive("mismatched local file header (filename)");
6089
+ reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6012
6090
  }
6013
6091
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6014
- throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
6092
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
6015
6093
  }
6016
6094
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
6017
- throwAmbiguousArchive("mismatched local file header (compression method)");
6095
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
6018
6096
  }
6019
6097
  if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
6020
6098
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
6021
6099
  (localDirectory.crc32 != zipEntry.crc32 ||
6022
6100
  localDirectory.compressedSize != zipEntry.compressedSize ||
6023
6101
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
6024
- throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
6102
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
6103
+ }
6104
+ }
6105
+
6106
+ function reportAmbiguity(reject, warnings, reason) {
6107
+ if (reject) {
6108
+ throwAmbiguousArchive(reason);
6109
+ } else {
6110
+ addWarning(warnings, reason);
6111
+ }
6112
+ }
6113
+
6114
+ function addWarning(warnings, reason, filename) {
6115
+ if (!warnings.some(warning => warning.reason == reason)) {
6116
+ const warning = { reason };
6117
+ if (filename !== UNDEFINED_VALUE) {
6118
+ warning.filename = filename;
6119
+ }
6120
+ warnings.push(warning);
6025
6121
  }
6026
6122
  }
6027
6123
 
@@ -6098,8 +6194,23 @@
6098
6194
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6099
6195
  ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6100
6196
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6197
+ WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
6198
+ WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6199
+ WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6200
+ WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6201
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6202
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6203
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6204
+ WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6205
+ WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6206
+ WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6207
+ WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
6208
+ WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
6209
+ WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
6210
+ WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
6101
6211
  ZipReader: ZipReader,
6102
- ZipReaderStream: ZipReaderStream
6212
+ ZipReaderStream: ZipReaderStream,
6213
+ isZipFile: isZipFile
6103
6214
  });
6104
6215
 
6105
6216
  /*
@@ -6312,6 +6423,7 @@
6312
6423
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6313
6424
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6314
6425
  rawExtraField,
6426
+ rawCentralExtraField: EMPTY_UINT8_ARRAY,
6315
6427
  extendedTimestamp: false,
6316
6428
  headerArray,
6317
6429
  headerView
@@ -6485,7 +6597,6 @@
6485
6597
 
6486
6598
  async function addFileEntry(zipWriter, name, reader, options) {
6487
6599
  options = Object.assign({}, options);
6488
- name = name.trim();
6489
6600
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6490
6601
  name += DIRECTORY_SIGNATURE;
6491
6602
  }
@@ -6576,7 +6687,6 @@
6576
6687
  }
6577
6688
 
6578
6689
  function resolveAttributes(zipWriter, name, options) {
6579
- name = name.trim();
6580
6690
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6581
6691
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
6582
6692
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
@@ -6781,6 +6891,7 @@
6781
6891
  }
6782
6892
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6783
6893
  const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6894
+ const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
6784
6895
  return {
6785
6896
  comment,
6786
6897
  resolvedOptions: {
@@ -6816,7 +6927,8 @@
6816
6927
  dataDescriptor,
6817
6928
  zip64,
6818
6929
  rawExtraField,
6819
- rawLocalExtraField
6930
+ rawLocalExtraField,
6931
+ rawCentralExtraField
6820
6932
  }
6821
6933
  };
6822
6934
  }
@@ -7135,6 +7247,7 @@
7135
7247
  versionMadeBy,
7136
7248
  rawComment,
7137
7249
  rawExtraField,
7250
+ rawCentralExtraField,
7138
7251
  useWebWorkers,
7139
7252
  transferStreams,
7140
7253
  onstart,
@@ -7178,6 +7291,7 @@
7178
7291
  rawExtraFieldUnix,
7179
7292
  rawExtraFieldAES,
7180
7293
  rawExtraField,
7294
+ rawCentralExtraField,
7181
7295
  extendedTimestamp,
7182
7296
  msDosCompatible,
7183
7297
  internalFileAttributes,
@@ -7678,6 +7792,7 @@
7678
7792
  rawExtraFieldNTFS,
7679
7793
  rawExtraFieldUnix,
7680
7794
  rawExtraField,
7795
+ rawCentralExtraField,
7681
7796
  extendedTimestamp,
7682
7797
  extraFieldExtendedTimestampFlag,
7683
7798
  lastModDate,
@@ -7732,7 +7847,8 @@
7732
7847
  rawExtraFieldNTFS,
7733
7848
  rawExtraFieldUnix,
7734
7849
  rawExtraFieldTimestamp,
7735
- rawExtraField);
7850
+ rawExtraField,
7851
+ rawCentralExtraField);
7736
7852
  if (extraFieldLength > MAX_16_BITS) {
7737
7853
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7738
7854
  }
@@ -7760,6 +7876,7 @@
7760
7876
  rawExtraFieldNTFS,
7761
7877
  rawExtraFieldUnix,
7762
7878
  rawExtraField,
7879
+ rawCentralExtraField,
7763
7880
  rawComment,
7764
7881
  versionMadeBy,
7765
7882
  headerArray,
@@ -7774,7 +7891,7 @@
7774
7891
  uncompressedSize,
7775
7892
  compressedSize
7776
7893
  } = fileEntry;
7777
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
7894
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
7778
7895
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
7779
7896
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
7780
7897
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -7812,6 +7929,7 @@
7812
7929
  directoryRecord.writeBytes(rawExtraFieldNTFS);
7813
7930
  directoryRecord.writeBytes(rawExtraFieldUnix);
7814
7931
  directoryRecord.writeBytes(rawExtraField);
7932
+ directoryRecord.writeBytes(rawCentralExtraField);
7815
7933
  directoryRecord.writeBytes(rawComment);
7816
7934
  arraySet(directoryArray, directoryRecord.array, offset);
7817
7935
  offset += directoryRecordLength;
@@ -8815,6 +8933,20 @@
8815
8933
  exports.TextWriter = TextWriter;
8816
8934
  exports.Uint8ArrayReader = Uint8ArrayReader;
8817
8935
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
8936
+ exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
8937
+ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
8938
+ exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
8939
+ exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
8940
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
8941
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
8942
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
8943
+ exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
8944
+ exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
8945
+ exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
8946
+ exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
8947
+ exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
8948
+ exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
8949
+ exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
8818
8950
  exports.Writer = Writer;
8819
8951
  exports.ZipReader = ZipReader;
8820
8952
  exports.ZipReaderStream = ZipReaderStream;
@@ -8825,6 +8957,7 @@
8825
8957
  exports.createOPFSTempStream = createOPFSTempStream;
8826
8958
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
8827
8959
  exports.getMimeType = getMimeType;
8960
+ exports.isZipFile = isZipFile;
8828
8961
  exports.registerCodec = registerCodec;
8829
8962
  exports.resetConfiguration = resetConfiguration;
8830
8963
  exports.terminateWorkers = terminateWorkers;