@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";
@@ -4731,6 +4733,21 @@
4731
4733
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4732
4734
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4733
4735
  const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4736
+ const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
4737
+ const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
4738
+ const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
4739
+ const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
4740
+ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4741
+ const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4742
+ const WARNING_APPENDED_DATA = "appended data";
4743
+ const WARNING_PREPENDED_DATA = "prepended data";
4744
+ const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4745
+ const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4746
+ const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4747
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4748
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4749
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
4750
+ const MAX_KNOWN_VERSION = 63;
4734
4751
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4735
4752
  const CHARSET_UTF8 = "utf-8";
4736
4753
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4781,6 +4798,7 @@
4781
4798
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
4782
4799
  throw new Error(ERR_BAD_FORMAT);
4783
4800
  }
4801
+ const warnings = zipReader.warnings = [];
4784
4802
  const strictness = getStrictness(options, zipReader.options);
4785
4803
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4786
4804
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
@@ -4804,8 +4822,12 @@
4804
4822
  const commentOffset = endOfDirectoryInfo.offset;
4805
4823
  const commentLength = getUint16$1(endOfDirectoryView, 20);
4806
4824
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4807
- if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4808
- throwAmbiguousArchive("appended data");
4825
+ const appendedDataLength = reader.size - appendedDataOffset;
4826
+ if (appendedDataLength > maxAppendedDataSize) {
4827
+ throwAmbiguousArchive(WARNING_APPENDED_DATA);
4828
+ }
4829
+ if (appendedDataLength > 0) {
4830
+ addWarning(warnings, WARNING_APPENDED_DATA);
4809
4831
  }
4810
4832
  let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4811
4833
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
@@ -4859,23 +4881,23 @@
4859
4881
  }
4860
4882
  if (lastDiskNumber == MAX_16_BITS) {
4861
4883
  lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4862
- } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4863
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4884
+ } else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4885
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4864
4886
  }
4865
4887
  if (diskNumber == MAX_16_BITS) {
4866
4888
  diskNumber = getUint32$1(endOfDirectoryView, 20);
4867
- } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4868
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4889
+ } else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4890
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4869
4891
  }
4870
4892
  if (filesLength == MAX_16_BITS) {
4871
4893
  filesLength = getBigUint64(endOfDirectoryView, 32);
4872
- } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
4873
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4894
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
4895
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4874
4896
  }
4875
4897
  if (directoryDataLength == MAX_32_BITS) {
4876
4898
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
4877
- } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4878
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4899
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4900
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4879
4901
  }
4880
4902
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4881
4903
  }
@@ -4944,14 +4966,22 @@
4944
4966
  declaredDirectoryDataLength = directoryArray.length;
4945
4967
  decryptedDirectory = true;
4946
4968
  }
4969
+ if (directoryEncryptionInfo && !decryptedDirectory &&
4970
+ (directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
4971
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
4972
+ }
4947
4973
  startOffset = directoryDataOffset;
4948
4974
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4949
4975
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
4950
- const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4976
+ const filenames = new Set();
4951
4977
  let duplicateFilename;
4978
+ let previousEntryPosition = -1;
4952
4979
  const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
4953
4980
  if (!filesLength && recoverWrappedFilesLength) {
4954
4981
  filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
4982
+ if (filesLength) {
4983
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
4984
+ }
4955
4985
  }
4956
4986
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4957
4987
  const fileEntry = new ZipEntry$1(reader, zipReader.options);
@@ -5030,15 +5060,26 @@
5030
5060
  filename,
5031
5061
  comment
5032
5062
  });
5033
- readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5063
+ if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5064
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5065
+ }
5034
5066
  fileEntry.offset += prependedDataLength;
5035
- startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
5036
- if (checkAmbiguity) {
5037
- if (filenames.has(fileEntry.filename)) {
5038
- duplicateFilename = true;
5039
- }
5040
- filenames.add(fileEntry.filename);
5067
+ const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
5068
+ startOffset = Math.min(entryPosition, startOffset);
5069
+ if (entryPosition < previousEntryPosition) {
5070
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
5071
+ }
5072
+ previousEntryPosition = entryPosition;
5073
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
5074
+ addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
5075
+ }
5076
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
5077
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
5078
+ }
5079
+ if (filenames.has(fileEntry.filename)) {
5080
+ duplicateFilename = true;
5041
5081
  }
5082
+ filenames.add(fileEntry.filename);
5042
5083
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
5043
5084
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
5044
5085
  fileEntry.unixMode = unixExternalUpper;
@@ -5076,7 +5117,11 @@
5076
5117
  };
5077
5118
  offset = endOffset;
5078
5119
  if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
5079
- filesLength += getWrappedFilesLength(directoryView, directoryArray, offset);
5120
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5121
+ if (wrappedFilesLength) {
5122
+ filesLength += wrappedFilesLength;
5123
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5124
+ }
5080
5125
  }
5081
5126
  const { onprogress } = options;
5082
5127
  if (onprogress) {
@@ -5102,18 +5147,22 @@
5102
5147
  zipReader.digitalSignature = digitalSignature;
5103
5148
  offsetAfterSignature = offset + 6 + digitalSignature.length;
5104
5149
  }
5105
- if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
5106
- throwAmbiguousArchive("trailing central directory data");
5150
+ if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
5151
+ (!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
5152
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
5107
5153
  }
5108
5154
  if (duplicateFilename) {
5109
- throwAmbiguousArchive("duplicate filename");
5155
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
5110
5156
  }
5111
5157
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5112
5158
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5113
5159
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5114
5160
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5115
5161
  if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5116
- throwAmbiguousArchive("prepended data");
5162
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5163
+ }
5164
+ if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5165
+ addWarning(warnings, WARNING_PREPENDED_DATA);
5117
5166
  }
5118
5167
  if (extractPrependedData) {
5119
5168
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
@@ -5183,6 +5232,28 @@
5183
5232
  }
5184
5233
  }
5185
5234
 
5235
+ async function isZipFile(reader, options = {}) {
5236
+ reader = new GenericReader(reader);
5237
+ await initStream(reader);
5238
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
5239
+ reader = new BlobReader(await streamToBlob(reader.readable));
5240
+ await initStream(reader);
5241
+ }
5242
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
5243
+ return false;
5244
+ }
5245
+ const strictness = getStrictness(options, {});
5246
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
5247
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
5248
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
5249
+ if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
5250
+ return false;
5251
+ }
5252
+ const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
5253
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
5254
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
5255
+ }
5256
+
5186
5257
  let ZipEntry$1 = class ZipEntry {
5187
5258
 
5188
5259
  constructor(reader, options) {
@@ -5214,6 +5285,7 @@
5214
5285
  dataDescriptor
5215
5286
  } = bitFlag;
5216
5287
  const localDirectory = fileEntry.localDirectory = {};
5288
+ const warnings = fileEntry.warnings = [];
5217
5289
  const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
5218
5290
  const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
5219
5291
  const dataView = getDataView(dataArray);
@@ -5254,10 +5326,10 @@
5254
5326
  if (checkLocalFilename) {
5255
5327
  localDirectory.rawFilename = rawLocalFilename;
5256
5328
  }
5257
- readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
5258
- if (checkLocalDirectory) {
5259
- validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
5329
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
5330
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
5260
5331
  }
5332
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
5261
5333
  const { lastAccessDate, creationDate, uid, gid } = localDirectory;
5262
5334
  if (lastAccessDate) {
5263
5335
  fileEntry.lastAccessDate = lastAccessDate;
@@ -5483,6 +5555,7 @@
5483
5555
  const extraField = directory.extraField = new Map();
5484
5556
  const rawExtraFieldView = getDataView(rawExtraField);
5485
5557
  let offsetExtraField = 0;
5558
+ let malformedExtraField = false;
5486
5559
  try {
5487
5560
  while (offsetExtraField < rawExtraField.length) {
5488
5561
  const type = getUint16$1(rawExtraFieldView, offsetExtraField);
@@ -5494,7 +5567,10 @@
5494
5567
  offsetExtraField += 4 + size;
5495
5568
  }
5496
5569
  } catch {
5497
- // ignored
5570
+ malformedExtraField = true;
5571
+ }
5572
+ if (offsetExtraField > rawExtraField.length) {
5573
+ malformedExtraField = true;
5498
5574
  }
5499
5575
  const compressionMethod = getUint16$1(dataView, offset + 4);
5500
5576
  Object.assign(directory, {
@@ -5562,6 +5638,7 @@
5562
5638
  if (extraFieldUSDZ) {
5563
5639
  directory.extraFieldUSDZ = extraFieldUSDZ;
5564
5640
  }
5641
+ return malformedExtraField;
5565
5642
  }
5566
5643
 
5567
5644
  function readExtraFieldZip64(extraFieldZip64, directory) {
@@ -6023,27 +6100,46 @@
6023
6100
  return UNDEFINED_VALUE;
6024
6101
  }
6025
6102
 
6026
- function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
6103
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
6027
6104
  const { rawFilename } = zipEntry;
6105
+ const reject = !warnings;
6028
6106
  const maskedLocalDirectory = zipEntry.decryptedDirectory &&
6029
6107
  (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
6030
6108
  if (checkLocalFilename && !maskedLocalDirectory &&
6031
6109
  (rawLocalFilename.length != rawFilename.length ||
6032
6110
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6033
- throwAmbiguousArchive("mismatched local file header (filename)");
6111
+ reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6034
6112
  }
6035
6113
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6036
- throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
6114
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
6037
6115
  }
6038
6116
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
6039
- throwAmbiguousArchive("mismatched local file header (compression method)");
6117
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
6040
6118
  }
6041
6119
  if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
6042
6120
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
6043
6121
  (localDirectory.crc32 != zipEntry.crc32 ||
6044
6122
  localDirectory.compressedSize != zipEntry.compressedSize ||
6045
6123
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
6046
- throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
6124
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
6125
+ }
6126
+ }
6127
+
6128
+ function reportAmbiguity(reject, warnings, reason) {
6129
+ if (reject) {
6130
+ throwAmbiguousArchive(reason);
6131
+ } else {
6132
+ addWarning(warnings, reason);
6133
+ }
6134
+ }
6135
+
6136
+ function addWarning(warnings, reason, filename) {
6137
+ if (!warnings.some(warning => warning.reason == reason)) {
6138
+ const warning = { reason };
6139
+ if (filename !== UNDEFINED_VALUE) {
6140
+ warning.filename = filename;
6141
+ }
6142
+ warnings.push(warning);
6047
6143
  }
6048
6144
  }
6049
6145
 
@@ -6120,8 +6216,23 @@
6120
6216
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6121
6217
  ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6122
6218
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6219
+ WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
6220
+ WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6221
+ WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6222
+ WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6223
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6224
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6225
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6226
+ WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6227
+ WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6228
+ WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6229
+ WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
6230
+ WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
6231
+ WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
6232
+ WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
6123
6233
  ZipReader: ZipReader,
6124
- ZipReaderStream: ZipReaderStream
6234
+ ZipReaderStream: ZipReaderStream,
6235
+ isZipFile: isZipFile
6125
6236
  });
6126
6237
 
6127
6238
  /*
@@ -6334,6 +6445,7 @@
6334
6445
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6335
6446
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6336
6447
  rawExtraField,
6448
+ rawCentralExtraField: EMPTY_UINT8_ARRAY,
6337
6449
  extendedTimestamp: false,
6338
6450
  headerArray,
6339
6451
  headerView
@@ -6507,7 +6619,6 @@
6507
6619
 
6508
6620
  async function addFileEntry(zipWriter, name, reader, options) {
6509
6621
  options = Object.assign({}, options);
6510
- name = name.trim();
6511
6622
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6512
6623
  name += DIRECTORY_SIGNATURE;
6513
6624
  }
@@ -6598,7 +6709,6 @@
6598
6709
  }
6599
6710
 
6600
6711
  function resolveAttributes(zipWriter, name, options) {
6601
- name = name.trim();
6602
6712
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6603
6713
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
6604
6714
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
@@ -6803,6 +6913,7 @@
6803
6913
  }
6804
6914
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6805
6915
  const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6916
+ const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
6806
6917
  return {
6807
6918
  comment,
6808
6919
  resolvedOptions: {
@@ -6838,7 +6949,8 @@
6838
6949
  dataDescriptor,
6839
6950
  zip64,
6840
6951
  rawExtraField,
6841
- rawLocalExtraField
6952
+ rawLocalExtraField,
6953
+ rawCentralExtraField
6842
6954
  }
6843
6955
  };
6844
6956
  }
@@ -6980,7 +7092,6 @@
6980
7092
  let { name } = entry;
6981
7093
  const { size } = entry;
6982
7094
  const options = Object.assign({}, entry.options);
6983
- name = name.trim();
6984
7095
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6985
7096
  name += DIRECTORY_SIGNATURE;
6986
7097
  }
@@ -7236,6 +7347,7 @@
7236
7347
  versionMadeBy,
7237
7348
  rawComment,
7238
7349
  rawExtraField,
7350
+ rawCentralExtraField,
7239
7351
  useWebWorkers,
7240
7352
  transferStreams,
7241
7353
  onstart,
@@ -7279,6 +7391,7 @@
7279
7391
  rawExtraFieldUnix,
7280
7392
  rawExtraFieldAES,
7281
7393
  rawExtraField,
7394
+ rawCentralExtraField,
7282
7395
  extendedTimestamp,
7283
7396
  msDosCompatible,
7284
7397
  internalFileAttributes,
@@ -7779,6 +7892,7 @@
7779
7892
  rawExtraFieldNTFS,
7780
7893
  rawExtraFieldUnix,
7781
7894
  rawExtraField,
7895
+ rawCentralExtraField,
7782
7896
  extendedTimestamp,
7783
7897
  extraFieldExtendedTimestampFlag,
7784
7898
  lastModDate,
@@ -7833,7 +7947,8 @@
7833
7947
  rawExtraFieldNTFS,
7834
7948
  rawExtraFieldUnix,
7835
7949
  rawExtraFieldTimestamp,
7836
- rawExtraField);
7950
+ rawExtraField,
7951
+ rawCentralExtraField);
7837
7952
  if (extraFieldLength > MAX_16_BITS) {
7838
7953
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7839
7954
  }
@@ -7861,6 +7976,7 @@
7861
7976
  rawExtraFieldNTFS,
7862
7977
  rawExtraFieldUnix,
7863
7978
  rawExtraField,
7979
+ rawCentralExtraField,
7864
7980
  rawComment,
7865
7981
  versionMadeBy,
7866
7982
  headerArray,
@@ -7875,7 +7991,7 @@
7875
7991
  uncompressedSize,
7876
7992
  compressedSize
7877
7993
  } = fileEntry;
7878
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
7994
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
7879
7995
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
7880
7996
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
7881
7997
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -7913,6 +8029,7 @@
7913
8029
  directoryRecord.writeBytes(rawExtraFieldNTFS);
7914
8030
  directoryRecord.writeBytes(rawExtraFieldUnix);
7915
8031
  directoryRecord.writeBytes(rawExtraField);
8032
+ directoryRecord.writeBytes(rawCentralExtraField);
7916
8033
  directoryRecord.writeBytes(rawComment);
7917
8034
  arraySet(directoryArray, directoryRecord.array, offset);
7918
8035
  offset += directoryRecordLength;
@@ -10372,6 +10489,20 @@
10372
10489
  exports.TextWriter = TextWriter;
10373
10490
  exports.Uint8ArrayReader = Uint8ArrayReader;
10374
10491
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
10492
+ exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
10493
+ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
10494
+ exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
10495
+ exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
10496
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
10497
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
10498
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
10499
+ exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
10500
+ exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
10501
+ exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
10502
+ exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
10503
+ exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
10504
+ exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
10505
+ exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
10375
10506
  exports.Writer = Writer;
10376
10507
  exports.ZipDirectoryEntry = ZipDirectoryEntry;
10377
10508
  exports.ZipEntry = ZipEntry;
@@ -10387,6 +10518,7 @@
10387
10518
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
10388
10519
  exports.fs = fs;
10389
10520
  exports.getMimeType = getMimeType;
10521
+ exports.isZipFile = isZipFile;
10390
10522
  exports.registerCodec = registerCodec;
10391
10523
  exports.resetConfiguration = resetConfiguration;
10392
10524
  exports.terminateWorkers = terminateWorkers;