@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.
@@ -74,6 +74,7 @@ const BITFLAG_LEVEL_MAX_MASK = 0b010;
74
74
  const BITFLAG_LEVEL_FAST_MASK = 0b100;
75
75
  const BITFLAG_LEVEL_SUPER_FAST_MASK = 0b110;
76
76
  const BITFLAG_DATA_DESCRIPTOR = 0b1000;
77
+ const BITFLAG_COMPRESSED_PATCHED_DATA = 0b100000;
77
78
  const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
78
79
  const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
79
80
  const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
@@ -191,6 +192,7 @@ const OPTION_OFFSET = "offset";
191
192
  const OPTION_USDZ = "usdz";
192
193
  const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
193
194
  const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
195
+ const OPTION_CENTRAL_EXTRA_FIELD = "centralExtraField";
194
196
  const OPTION_STRICTNESS = "strictness";
195
197
  const OPTION_FILENAME_VALIDATION = "filenameValidation";
196
198
  const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
@@ -4760,6 +4762,21 @@ const ERR_INVALID_STRICTNESS = "Invalid strictness (must be 'strict', 'balanced'
4760
4762
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4761
4763
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4762
4764
  const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4765
+ const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
4766
+ const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
4767
+ const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
4768
+ const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
4769
+ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4770
+ const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4771
+ const WARNING_APPENDED_DATA = "appended data";
4772
+ const WARNING_PREPENDED_DATA = "prepended data";
4773
+ const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4774
+ const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4775
+ const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4776
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4777
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4778
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
4779
+ const MAX_KNOWN_VERSION = 63;
4763
4780
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4764
4781
  const CHARSET_UTF8 = "utf-8";
4765
4782
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4810,6 +4827,7 @@ class ZipReader {
4810
4827
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
4811
4828
  throw new Error(ERR_BAD_FORMAT);
4812
4829
  }
4830
+ const warnings = zipReader.warnings = [];
4813
4831
  const strictness = getStrictness(options, zipReader.options);
4814
4832
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4815
4833
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
@@ -4833,8 +4851,12 @@ class ZipReader {
4833
4851
  const commentOffset = endOfDirectoryInfo.offset;
4834
4852
  const commentLength = getUint16$1(endOfDirectoryView, 20);
4835
4853
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4836
- if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4837
- throwAmbiguousArchive("appended data");
4854
+ const appendedDataLength = reader.size - appendedDataOffset;
4855
+ if (appendedDataLength > maxAppendedDataSize) {
4856
+ throwAmbiguousArchive(WARNING_APPENDED_DATA);
4857
+ }
4858
+ if (appendedDataLength > 0) {
4859
+ addWarning(warnings, WARNING_APPENDED_DATA);
4838
4860
  }
4839
4861
  let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4840
4862
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
@@ -4888,23 +4910,23 @@ class ZipReader {
4888
4910
  }
4889
4911
  if (lastDiskNumber == MAX_16_BITS) {
4890
4912
  lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4891
- } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4892
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4913
+ } else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4914
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4893
4915
  }
4894
4916
  if (diskNumber == MAX_16_BITS) {
4895
4917
  diskNumber = getUint32$1(endOfDirectoryView, 20);
4896
- } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4897
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4918
+ } else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4919
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4898
4920
  }
4899
4921
  if (filesLength == MAX_16_BITS) {
4900
4922
  filesLength = getBigUint64(endOfDirectoryView, 32);
4901
- } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
4902
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4923
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
4924
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4903
4925
  }
4904
4926
  if (directoryDataLength == MAX_32_BITS) {
4905
4927
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
4906
- } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4907
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4928
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4929
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4908
4930
  }
4909
4931
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4910
4932
  }
@@ -4973,14 +4995,22 @@ class ZipReader {
4973
4995
  declaredDirectoryDataLength = directoryArray.length;
4974
4996
  decryptedDirectory = true;
4975
4997
  }
4998
+ if (directoryEncryptionInfo && !decryptedDirectory &&
4999
+ (directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
5000
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
5001
+ }
4976
5002
  startOffset = directoryDataOffset;
4977
5003
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4978
5004
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
4979
- const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
5005
+ const filenames = new Set();
4980
5006
  let duplicateFilename;
5007
+ let previousEntryPosition = -1;
4981
5008
  const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
4982
5009
  if (!filesLength && recoverWrappedFilesLength) {
4983
5010
  filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5011
+ if (filesLength) {
5012
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5013
+ }
4984
5014
  }
4985
5015
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4986
5016
  const fileEntry = new ZipEntry$1(reader, zipReader.options);
@@ -5059,15 +5089,26 @@ class ZipReader {
5059
5089
  filename,
5060
5090
  comment
5061
5091
  });
5062
- readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5092
+ if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5093
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5094
+ }
5063
5095
  fileEntry.offset += prependedDataLength;
5064
- startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
5065
- if (checkAmbiguity) {
5066
- if (filenames.has(fileEntry.filename)) {
5067
- duplicateFilename = true;
5068
- }
5069
- filenames.add(fileEntry.filename);
5096
+ const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
5097
+ startOffset = Math.min(entryPosition, startOffset);
5098
+ if (entryPosition < previousEntryPosition) {
5099
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
5100
+ }
5101
+ previousEntryPosition = entryPosition;
5102
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
5103
+ addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
5104
+ }
5105
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
5106
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
5107
+ }
5108
+ if (filenames.has(fileEntry.filename)) {
5109
+ duplicateFilename = true;
5070
5110
  }
5111
+ filenames.add(fileEntry.filename);
5071
5112
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
5072
5113
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
5073
5114
  fileEntry.unixMode = unixExternalUpper;
@@ -5105,7 +5146,11 @@ class ZipReader {
5105
5146
  };
5106
5147
  offset = endOffset;
5107
5148
  if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
5108
- filesLength += getWrappedFilesLength(directoryView, directoryArray, offset);
5149
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5150
+ if (wrappedFilesLength) {
5151
+ filesLength += wrappedFilesLength;
5152
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5153
+ }
5109
5154
  }
5110
5155
  const { onprogress } = options;
5111
5156
  if (onprogress) {
@@ -5131,18 +5176,22 @@ class ZipReader {
5131
5176
  zipReader.digitalSignature = digitalSignature;
5132
5177
  offsetAfterSignature = offset + 6 + digitalSignature.length;
5133
5178
  }
5134
- if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
5135
- throwAmbiguousArchive("trailing central directory data");
5179
+ if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
5180
+ (!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
5181
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
5136
5182
  }
5137
5183
  if (duplicateFilename) {
5138
- throwAmbiguousArchive("duplicate filename");
5184
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
5139
5185
  }
5140
5186
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5141
5187
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5142
5188
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5143
5189
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5144
5190
  if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5145
- throwAmbiguousArchive("prepended data");
5191
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5192
+ }
5193
+ if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5194
+ addWarning(warnings, WARNING_PREPENDED_DATA);
5146
5195
  }
5147
5196
  if (extractPrependedData) {
5148
5197
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
@@ -5212,6 +5261,28 @@ class ZipReaderStream {
5212
5261
  }
5213
5262
  }
5214
5263
 
5264
+ async function isZipFile(reader, options = {}) {
5265
+ reader = new GenericReader(reader);
5266
+ await initStream(reader);
5267
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
5268
+ reader = new BlobReader(await streamToBlob(reader.readable));
5269
+ await initStream(reader);
5270
+ }
5271
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
5272
+ return false;
5273
+ }
5274
+ const strictness = getStrictness(options, {});
5275
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
5276
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
5277
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
5278
+ if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
5279
+ return false;
5280
+ }
5281
+ const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
5282
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
5283
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
5284
+ }
5285
+
5215
5286
  let ZipEntry$1 = class ZipEntry {
5216
5287
 
5217
5288
  constructor(reader, options) {
@@ -5243,6 +5314,7 @@ let ZipEntry$1 = class ZipEntry {
5243
5314
  dataDescriptor
5244
5315
  } = bitFlag;
5245
5316
  const localDirectory = fileEntry.localDirectory = {};
5317
+ const warnings = fileEntry.warnings = [];
5246
5318
  const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
5247
5319
  const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
5248
5320
  const dataView = getDataView(dataArray);
@@ -5283,10 +5355,10 @@ let ZipEntry$1 = class ZipEntry {
5283
5355
  if (checkLocalFilename) {
5284
5356
  localDirectory.rawFilename = rawLocalFilename;
5285
5357
  }
5286
- readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
5287
- if (checkLocalDirectory) {
5288
- validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
5358
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
5359
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
5289
5360
  }
5361
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
5290
5362
  const { lastAccessDate, creationDate, uid, gid } = localDirectory;
5291
5363
  if (lastAccessDate) {
5292
5364
  fileEntry.lastAccessDate = lastAccessDate;
@@ -5512,6 +5584,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5512
5584
  const extraField = directory.extraField = new Map();
5513
5585
  const rawExtraFieldView = getDataView(rawExtraField);
5514
5586
  let offsetExtraField = 0;
5587
+ let malformedExtraField = false;
5515
5588
  try {
5516
5589
  while (offsetExtraField < rawExtraField.length) {
5517
5590
  const type = getUint16$1(rawExtraFieldView, offsetExtraField);
@@ -5523,7 +5596,10 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5523
5596
  offsetExtraField += 4 + size;
5524
5597
  }
5525
5598
  } catch {
5526
- // ignored
5599
+ malformedExtraField = true;
5600
+ }
5601
+ if (offsetExtraField > rawExtraField.length) {
5602
+ malformedExtraField = true;
5527
5603
  }
5528
5604
  const compressionMethod = getUint16$1(dataView, offset + 4);
5529
5605
  Object.assign(directory, {
@@ -5591,6 +5667,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5591
5667
  if (extraFieldUSDZ) {
5592
5668
  directory.extraFieldUSDZ = extraFieldUSDZ;
5593
5669
  }
5670
+ return malformedExtraField;
5594
5671
  }
5595
5672
 
5596
5673
  function readExtraFieldZip64(extraFieldZip64, directory) {
@@ -6052,27 +6129,46 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
6052
6129
  return UNDEFINED_VALUE;
6053
6130
  }
6054
6131
 
6055
- function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
6132
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
6056
6133
  const { rawFilename } = zipEntry;
6134
+ const reject = !warnings;
6057
6135
  const maskedLocalDirectory = zipEntry.decryptedDirectory &&
6058
6136
  (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
6059
6137
  if (checkLocalFilename && !maskedLocalDirectory &&
6060
6138
  (rawLocalFilename.length != rawFilename.length ||
6061
6139
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6062
- throwAmbiguousArchive("mismatched local file header (filename)");
6140
+ reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6063
6141
  }
6064
6142
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6065
- throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
6143
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
6066
6144
  }
6067
6145
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
6068
- throwAmbiguousArchive("mismatched local file header (compression method)");
6146
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
6069
6147
  }
6070
6148
  if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
6071
6149
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
6072
6150
  (localDirectory.crc32 != zipEntry.crc32 ||
6073
6151
  localDirectory.compressedSize != zipEntry.compressedSize ||
6074
6152
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
6075
- throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
6153
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
6154
+ }
6155
+ }
6156
+
6157
+ function reportAmbiguity(reject, warnings, reason) {
6158
+ if (reject) {
6159
+ throwAmbiguousArchive(reason);
6160
+ } else {
6161
+ addWarning(warnings, reason);
6162
+ }
6163
+ }
6164
+
6165
+ function addWarning(warnings, reason, filename) {
6166
+ if (!warnings.some(warning => warning.reason == reason)) {
6167
+ const warning = { reason };
6168
+ if (filename !== UNDEFINED_VALUE) {
6169
+ warning.filename = filename;
6170
+ }
6171
+ warnings.push(warning);
6076
6172
  }
6077
6173
  }
6078
6174
 
@@ -6149,8 +6245,23 @@ var zipReader = /*#__PURE__*/Object.freeze({
6149
6245
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6150
6246
  ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6151
6247
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6248
+ WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
6249
+ WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6250
+ WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6251
+ WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6252
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6253
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6254
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6255
+ WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6256
+ WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6257
+ WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6258
+ WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
6259
+ WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
6260
+ WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
6261
+ WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
6152
6262
  ZipReader: ZipReader,
6153
- ZipReaderStream: ZipReaderStream
6263
+ ZipReaderStream: ZipReaderStream,
6264
+ isZipFile: isZipFile
6154
6265
  });
6155
6266
 
6156
6267
  /*
@@ -6363,6 +6474,7 @@ class ZipWriter {
6363
6474
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6364
6475
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6365
6476
  rawExtraField,
6477
+ rawCentralExtraField: EMPTY_UINT8_ARRAY,
6366
6478
  extendedTimestamp: false,
6367
6479
  headerArray,
6368
6480
  headerView
@@ -6536,7 +6648,6 @@ async function prependZipEntries(zipWriter, reader) {
6536
6648
 
6537
6649
  async function addFileEntry(zipWriter, name, reader, options) {
6538
6650
  options = Object.assign({}, options);
6539
- name = name.trim();
6540
6651
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6541
6652
  name += DIRECTORY_SIGNATURE;
6542
6653
  }
@@ -6627,7 +6738,6 @@ async function addFile(zipWriter, name, reader, options) {
6627
6738
  }
6628
6739
 
6629
6740
  function resolveAttributes(zipWriter, name, options) {
6630
- name = name.trim();
6631
6741
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6632
6742
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
6633
6743
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
@@ -6832,6 +6942,7 @@ function resolveMetadata(zipWriter, name, options) {
6832
6942
  }
6833
6943
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6834
6944
  const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6945
+ const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
6835
6946
  return {
6836
6947
  comment,
6837
6948
  resolvedOptions: {
@@ -6867,7 +6978,8 @@ function resolveMetadata(zipWriter, name, options) {
6867
6978
  dataDescriptor,
6868
6979
  zip64,
6869
6980
  rawExtraField,
6870
- rawLocalExtraField
6981
+ rawLocalExtraField,
6982
+ rawCentralExtraField
6871
6983
  }
6872
6984
  };
6873
6985
  }
@@ -7009,7 +7121,6 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7009
7121
  let { name } = entry;
7010
7122
  const { size } = entry;
7011
7123
  const options = Object.assign({}, entry.options);
7012
- name = name.trim();
7013
7124
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
7014
7125
  name += DIRECTORY_SIGNATURE;
7015
7126
  }
@@ -7265,6 +7376,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7265
7376
  versionMadeBy,
7266
7377
  rawComment,
7267
7378
  rawExtraField,
7379
+ rawCentralExtraField,
7268
7380
  useWebWorkers,
7269
7381
  transferStreams,
7270
7382
  onstart,
@@ -7308,6 +7420,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7308
7420
  rawExtraFieldUnix,
7309
7421
  rawExtraFieldAES,
7310
7422
  rawExtraField,
7423
+ rawCentralExtraField,
7311
7424
  extendedTimestamp,
7312
7425
  msDosCompatible,
7313
7426
  internalFileAttributes,
@@ -7808,6 +7921,7 @@ function createDirectoryRecords(files) {
7808
7921
  rawExtraFieldNTFS,
7809
7922
  rawExtraFieldUnix,
7810
7923
  rawExtraField,
7924
+ rawCentralExtraField,
7811
7925
  extendedTimestamp,
7812
7926
  extraFieldExtendedTimestampFlag,
7813
7927
  lastModDate,
@@ -7862,7 +7976,8 @@ function createDirectoryRecords(files) {
7862
7976
  rawExtraFieldNTFS,
7863
7977
  rawExtraFieldUnix,
7864
7978
  rawExtraFieldTimestamp,
7865
- rawExtraField);
7979
+ rawExtraField,
7980
+ rawCentralExtraField);
7866
7981
  if (extraFieldLength > MAX_16_BITS) {
7867
7982
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7868
7983
  }
@@ -7890,6 +8005,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7890
8005
  rawExtraFieldNTFS,
7891
8006
  rawExtraFieldUnix,
7892
8007
  rawExtraField,
8008
+ rawCentralExtraField,
7893
8009
  rawComment,
7894
8010
  versionMadeBy,
7895
8011
  headerArray,
@@ -7904,7 +8020,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7904
8020
  uncompressedSize,
7905
8021
  compressedSize
7906
8022
  } = fileEntry;
7907
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
8023
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
7908
8024
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
7909
8025
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
7910
8026
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -7942,6 +8058,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7942
8058
  directoryRecord.writeBytes(rawExtraFieldNTFS);
7943
8059
  directoryRecord.writeBytes(rawExtraFieldUnix);
7944
8060
  directoryRecord.writeBytes(rawExtraField);
8061
+ directoryRecord.writeBytes(rawCentralExtraField);
7945
8062
  directoryRecord.writeBytes(rawComment);
7946
8063
  arraySet(directoryArray, directoryRecord.array, offset);
7947
8064
  offset += directoryRecordLength;
@@ -10619,4 +10736,4 @@ function decodeMimeTypes(data) {
10619
10736
  return mimeTypes;
10620
10737
  }
10621
10738
 
10622
- export { BlobReader, BlobWriter, Data64URIReader, Data64URIWriter, ERR_ABORTED, ERR_AMBIGUOUS_ARCHIVE, ERR_BAD_FORMAT, ERR_CENTRAL_DIRECTORY_NOT_FOUND, ERR_DUPLICATED_NAME, ERR_ENCRYPTED, ERR_ENCRYPTED_CENTRAL_DIRECTORY, ERR_ENTRY_DATA_OUT_OF_BOUNDS, ERR_ENTRY_EXISTS, ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND, ERR_EOCDR_NOT_FOUND, ERR_EXTRAFIELD_ZIP64_NOT_FOUND, ERR_HTTP_RANGE, ERR_HTTP_RESOURCE_CHANGED, ERR_INVALID_AUTHENTICATION_CODE, ERR_INVALID_CODEC_DEFINITION, ERR_INVALID_CODEC_MODULE, ERR_INVALID_COMMENT, ERR_INVALID_COMMENT_TYPE, ERR_INVALID_COMPRESSED_DATA, ERR_INVALID_CRC32, ERR_INVALID_DATE, ERR_INVALID_ENCRYPTION_STRENGTH, ERR_INVALID_ENTRY_COMMENT, ERR_INVALID_ENTRY_COMMENT_TYPE, ERR_INVALID_ENTRY_NAME, ERR_INVALID_EXTRAFIELD, ERR_INVALID_EXTRAFIELD_DATA, ERR_INVALID_EXTRAFIELD_DATA_TYPE, ERR_INVALID_EXTRAFIELD_TYPE, ERR_INVALID_FILENAME_VALIDATION, ERR_INVALID_FUNCTION_OPTION, ERR_INVALID_GID, ERR_INVALID_LEVEL, ERR_INVALID_MAX_APPENDED_DATA_SIZE, ERR_INVALID_MAX_WORKERS, ERR_INVALID_MSDOS_ATTRIBUTES, ERR_INVALID_MSDOS_DATA, ERR_INVALID_PASSWORD, ERR_INVALID_PASSWORD_TYPE, ERR_INVALID_PASS_THROUGH, ERR_INVALID_READER_OPTIONS, ERR_INVALID_SIGNAL, ERR_INVALID_SIGNATURE, ERR_INVALID_SIGNATURE_DATA, ERR_INVALID_STRICTNESS, ERR_INVALID_UID, ERR_INVALID_UNCOMPRESSED_SIZE, ERR_INVALID_UNIX_EXTRA_FIELD_TYPE, ERR_INVALID_UNIX_ID_SIZE, ERR_INVALID_UNIX_MODE, ERR_INVALID_VERSION, ERR_ITERATOR_COMPLETED_TOO_SOON, ERR_LOCAL_FILE_HEADER_NOT_FOUND, ERR_OVERLAPPING_ENTRY, ERR_READABLE_CONSUMED, ERR_RESERVED_COMPRESSION_METHOD, ERR_SPLIT_ZIP_FILE, ERR_UNDEFINED_COMPRESSION_METHOD, ERR_UNDEFINED_READER, ERR_UNDEFINED_UNCOMPRESSED_SIZE, ERR_UNDETERMINED_SIZE, ERR_UNSAFE_FILENAME, ERR_UNSUPPORTED_COMPRESSION$1 as ERR_UNSUPPORTED_COMPRESSION, ERR_UNSUPPORTED_CONTEXT, ERR_UNSUPPORTED_CRYPTO_API, ERR_UNSUPPORTED_ENCRYPTION, ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH, ERR_UNSUPPORTED_ENCRYPTION_USDZ, ERR_UNSUPPORTED_FORMAT, ERR_UNSUPPORTED_UINT64, ERR_WORKER_STARTUP_TIMEOUT, ERR_WRITER_NOT_INITIALIZED, ERR_ZIP_CRYPTO_LAST_MOD_DATE, ERR_ZIP_NOT_EMPTY, HttpRangeReader, HttpReader, Reader, SplitDataReader, SplitDataWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8ArrayWriter, Writer, ZipDirectoryEntry, ZipEntry, ZipFS, ZipFileEntry, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, fs, getMimeType, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };
10739
+ export { BlobReader, BlobWriter, Data64URIReader, Data64URIWriter, ERR_ABORTED, ERR_AMBIGUOUS_ARCHIVE, ERR_BAD_FORMAT, ERR_CENTRAL_DIRECTORY_NOT_FOUND, ERR_DUPLICATED_NAME, ERR_ENCRYPTED, ERR_ENCRYPTED_CENTRAL_DIRECTORY, ERR_ENTRY_DATA_OUT_OF_BOUNDS, ERR_ENTRY_EXISTS, ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND, ERR_EOCDR_NOT_FOUND, ERR_EXTRAFIELD_ZIP64_NOT_FOUND, ERR_HTTP_RANGE, ERR_HTTP_RESOURCE_CHANGED, ERR_INVALID_AUTHENTICATION_CODE, ERR_INVALID_CODEC_DEFINITION, ERR_INVALID_CODEC_MODULE, ERR_INVALID_COMMENT, ERR_INVALID_COMMENT_TYPE, ERR_INVALID_COMPRESSED_DATA, ERR_INVALID_CRC32, ERR_INVALID_DATE, ERR_INVALID_ENCRYPTION_STRENGTH, ERR_INVALID_ENTRY_COMMENT, ERR_INVALID_ENTRY_COMMENT_TYPE, ERR_INVALID_ENTRY_NAME, ERR_INVALID_EXTRAFIELD, ERR_INVALID_EXTRAFIELD_DATA, ERR_INVALID_EXTRAFIELD_DATA_TYPE, ERR_INVALID_EXTRAFIELD_TYPE, ERR_INVALID_FILENAME_VALIDATION, ERR_INVALID_FUNCTION_OPTION, ERR_INVALID_GID, ERR_INVALID_LEVEL, ERR_INVALID_MAX_APPENDED_DATA_SIZE, ERR_INVALID_MAX_WORKERS, ERR_INVALID_MSDOS_ATTRIBUTES, ERR_INVALID_MSDOS_DATA, ERR_INVALID_PASSWORD, ERR_INVALID_PASSWORD_TYPE, ERR_INVALID_PASS_THROUGH, ERR_INVALID_READER_OPTIONS, ERR_INVALID_SIGNAL, ERR_INVALID_SIGNATURE, ERR_INVALID_SIGNATURE_DATA, ERR_INVALID_STRICTNESS, ERR_INVALID_UID, ERR_INVALID_UNCOMPRESSED_SIZE, ERR_INVALID_UNIX_EXTRA_FIELD_TYPE, ERR_INVALID_UNIX_ID_SIZE, ERR_INVALID_UNIX_MODE, ERR_INVALID_VERSION, ERR_ITERATOR_COMPLETED_TOO_SOON, ERR_LOCAL_FILE_HEADER_NOT_FOUND, ERR_OVERLAPPING_ENTRY, ERR_READABLE_CONSUMED, ERR_RESERVED_COMPRESSION_METHOD, ERR_SPLIT_ZIP_FILE, ERR_UNDEFINED_COMPRESSION_METHOD, ERR_UNDEFINED_READER, ERR_UNDEFINED_UNCOMPRESSED_SIZE, ERR_UNDETERMINED_SIZE, ERR_UNSAFE_FILENAME, ERR_UNSUPPORTED_COMPRESSION$1 as ERR_UNSUPPORTED_COMPRESSION, ERR_UNSUPPORTED_CONTEXT, ERR_UNSUPPORTED_CRYPTO_API, ERR_UNSUPPORTED_ENCRYPTION, ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH, ERR_UNSUPPORTED_ENCRYPTION_USDZ, ERR_UNSUPPORTED_FORMAT, ERR_UNSUPPORTED_UINT64, ERR_WORKER_STARTUP_TIMEOUT, ERR_WRITER_NOT_INITIALIZED, ERR_ZIP_CRYPTO_LAST_MOD_DATE, ERR_ZIP_NOT_EMPTY, HttpRangeReader, HttpReader, Reader, SplitDataReader, SplitDataWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8ArrayWriter, WARNING_APPENDED_DATA, WARNING_COMPRESSED_PATCHED_DATA, WARNING_DUPLICATE_FILENAME, WARNING_MALFORMED_EXTRA_FIELD, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY, WARNING_PREPENDED_DATA, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA, WARNING_UNKNOWN_VERSION, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA, WARNING_UNSORTED_CENTRAL_DIRECTORY, WARNING_WRAPPED_ENTRIES_COUNT, Writer, ZipDirectoryEntry, ZipEntry, ZipFS, ZipFileEntry, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, fs, getMimeType, isZipFile, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };