@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/deno.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zip-js/zip-js",
3
- "version": "2.8.58",
3
+ "version": "2.8.59",
4
4
  "exports": {
5
5
  ".": "./index.js",
6
6
  "./external": "./lib/zip-fs-external.js",
@@ -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";
@@ -4740,6 +4742,21 @@ const ERR_INVALID_STRICTNESS = "Invalid strictness (must be 'strict', 'balanced'
4740
4742
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4741
4743
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4742
4744
  const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4745
+ const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
4746
+ const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
4747
+ const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
4748
+ const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
4749
+ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4750
+ const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4751
+ const WARNING_APPENDED_DATA = "appended data";
4752
+ const WARNING_PREPENDED_DATA = "prepended data";
4753
+ const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4754
+ const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4755
+ const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4756
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4757
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4758
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
4759
+ const MAX_KNOWN_VERSION = 63;
4743
4760
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4744
4761
  const CHARSET_UTF8 = "utf-8";
4745
4762
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4790,6 +4807,7 @@ class ZipReader {
4790
4807
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
4791
4808
  throw new Error(ERR_BAD_FORMAT);
4792
4809
  }
4810
+ const warnings = zipReader.warnings = [];
4793
4811
  const strictness = getStrictness(options, zipReader.options);
4794
4812
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4795
4813
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
@@ -4813,8 +4831,12 @@ class ZipReader {
4813
4831
  const commentOffset = endOfDirectoryInfo.offset;
4814
4832
  const commentLength = getUint16$1(endOfDirectoryView, 20);
4815
4833
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4816
- if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4817
- throwAmbiguousArchive("appended data");
4834
+ const appendedDataLength = reader.size - appendedDataOffset;
4835
+ if (appendedDataLength > maxAppendedDataSize) {
4836
+ throwAmbiguousArchive(WARNING_APPENDED_DATA);
4837
+ }
4838
+ if (appendedDataLength > 0) {
4839
+ addWarning(warnings, WARNING_APPENDED_DATA);
4818
4840
  }
4819
4841
  let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4820
4842
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
@@ -4868,23 +4890,23 @@ class ZipReader {
4868
4890
  }
4869
4891
  if (lastDiskNumber == MAX_16_BITS) {
4870
4892
  lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4871
- } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4872
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4893
+ } else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4894
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4873
4895
  }
4874
4896
  if (diskNumber == MAX_16_BITS) {
4875
4897
  diskNumber = getUint32$1(endOfDirectoryView, 20);
4876
- } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4877
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4898
+ } else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4899
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4878
4900
  }
4879
4901
  if (filesLength == MAX_16_BITS) {
4880
4902
  filesLength = getBigUint64(endOfDirectoryView, 32);
4881
- } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
4882
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4903
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
4904
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4883
4905
  }
4884
4906
  if (directoryDataLength == MAX_32_BITS) {
4885
4907
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
4886
- } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4887
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4908
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4909
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4888
4910
  }
4889
4911
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4890
4912
  }
@@ -4953,14 +4975,22 @@ class ZipReader {
4953
4975
  declaredDirectoryDataLength = directoryArray.length;
4954
4976
  decryptedDirectory = true;
4955
4977
  }
4978
+ if (directoryEncryptionInfo && !decryptedDirectory &&
4979
+ (directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
4980
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
4981
+ }
4956
4982
  startOffset = directoryDataOffset;
4957
4983
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4958
4984
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
4959
- const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4985
+ const filenames = new Set();
4960
4986
  let duplicateFilename;
4987
+ let previousEntryPosition = -1;
4961
4988
  const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
4962
4989
  if (!filesLength && recoverWrappedFilesLength) {
4963
4990
  filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
4991
+ if (filesLength) {
4992
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
4993
+ }
4964
4994
  }
4965
4995
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4966
4996
  const fileEntry = new ZipEntry(reader, zipReader.options);
@@ -5039,15 +5069,26 @@ class ZipReader {
5039
5069
  filename,
5040
5070
  comment
5041
5071
  });
5042
- readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5072
+ if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5073
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5074
+ }
5043
5075
  fileEntry.offset += prependedDataLength;
5044
- startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
5045
- if (checkAmbiguity) {
5046
- if (filenames.has(fileEntry.filename)) {
5047
- duplicateFilename = true;
5048
- }
5049
- filenames.add(fileEntry.filename);
5076
+ const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
5077
+ startOffset = Math.min(entryPosition, startOffset);
5078
+ if (entryPosition < previousEntryPosition) {
5079
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
5080
+ }
5081
+ previousEntryPosition = entryPosition;
5082
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
5083
+ addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
5084
+ }
5085
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
5086
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
5087
+ }
5088
+ if (filenames.has(fileEntry.filename)) {
5089
+ duplicateFilename = true;
5050
5090
  }
5091
+ filenames.add(fileEntry.filename);
5051
5092
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
5052
5093
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
5053
5094
  fileEntry.unixMode = unixExternalUpper;
@@ -5085,7 +5126,11 @@ class ZipReader {
5085
5126
  };
5086
5127
  offset = endOffset;
5087
5128
  if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
5088
- filesLength += getWrappedFilesLength(directoryView, directoryArray, offset);
5129
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5130
+ if (wrappedFilesLength) {
5131
+ filesLength += wrappedFilesLength;
5132
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5133
+ }
5089
5134
  }
5090
5135
  const { onprogress } = options;
5091
5136
  if (onprogress) {
@@ -5111,18 +5156,22 @@ class ZipReader {
5111
5156
  zipReader.digitalSignature = digitalSignature;
5112
5157
  offsetAfterSignature = offset + 6 + digitalSignature.length;
5113
5158
  }
5114
- if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
5115
- throwAmbiguousArchive("trailing central directory data");
5159
+ if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
5160
+ (!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
5161
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
5116
5162
  }
5117
5163
  if (duplicateFilename) {
5118
- throwAmbiguousArchive("duplicate filename");
5164
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
5119
5165
  }
5120
5166
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5121
5167
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5122
5168
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5123
5169
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5124
5170
  if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5125
- throwAmbiguousArchive("prepended data");
5171
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5172
+ }
5173
+ if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5174
+ addWarning(warnings, WARNING_PREPENDED_DATA);
5126
5175
  }
5127
5176
  if (extractPrependedData) {
5128
5177
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
@@ -5192,6 +5241,28 @@ class ZipReaderStream {
5192
5241
  }
5193
5242
  }
5194
5243
 
5244
+ async function isZipFile(reader, options = {}) {
5245
+ reader = new GenericReader(reader);
5246
+ await initStream(reader);
5247
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
5248
+ reader = new BlobReader(await streamToBlob(reader.readable));
5249
+ await initStream(reader);
5250
+ }
5251
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
5252
+ return false;
5253
+ }
5254
+ const strictness = getStrictness(options, {});
5255
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
5256
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
5257
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
5258
+ if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
5259
+ return false;
5260
+ }
5261
+ const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
5262
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
5263
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
5264
+ }
5265
+
5195
5266
  class ZipEntry {
5196
5267
 
5197
5268
  constructor(reader, options) {
@@ -5223,6 +5294,7 @@ class ZipEntry {
5223
5294
  dataDescriptor
5224
5295
  } = bitFlag;
5225
5296
  const localDirectory = fileEntry.localDirectory = {};
5297
+ const warnings = fileEntry.warnings = [];
5226
5298
  const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
5227
5299
  const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
5228
5300
  const dataView = getDataView(dataArray);
@@ -5263,10 +5335,10 @@ class ZipEntry {
5263
5335
  if (checkLocalFilename) {
5264
5336
  localDirectory.rawFilename = rawLocalFilename;
5265
5337
  }
5266
- readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
5267
- if (checkLocalDirectory) {
5268
- validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
5338
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
5339
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
5269
5340
  }
5341
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
5270
5342
  const { lastAccessDate, creationDate, uid, gid } = localDirectory;
5271
5343
  if (lastAccessDate) {
5272
5344
  fileEntry.lastAccessDate = lastAccessDate;
@@ -5492,6 +5564,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5492
5564
  const extraField = directory.extraField = new Map();
5493
5565
  const rawExtraFieldView = getDataView(rawExtraField);
5494
5566
  let offsetExtraField = 0;
5567
+ let malformedExtraField = false;
5495
5568
  try {
5496
5569
  while (offsetExtraField < rawExtraField.length) {
5497
5570
  const type = getUint16$1(rawExtraFieldView, offsetExtraField);
@@ -5503,7 +5576,10 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5503
5576
  offsetExtraField += 4 + size;
5504
5577
  }
5505
5578
  } catch {
5506
- // ignored
5579
+ malformedExtraField = true;
5580
+ }
5581
+ if (offsetExtraField > rawExtraField.length) {
5582
+ malformedExtraField = true;
5507
5583
  }
5508
5584
  const compressionMethod = getUint16$1(dataView, offset + 4);
5509
5585
  Object.assign(directory, {
@@ -5571,6 +5647,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5571
5647
  if (extraFieldUSDZ) {
5572
5648
  directory.extraFieldUSDZ = extraFieldUSDZ;
5573
5649
  }
5650
+ return malformedExtraField;
5574
5651
  }
5575
5652
 
5576
5653
  function readExtraFieldZip64(extraFieldZip64, directory) {
@@ -6032,27 +6109,46 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
6032
6109
  return UNDEFINED_VALUE;
6033
6110
  }
6034
6111
 
6035
- function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
6112
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
6036
6113
  const { rawFilename } = zipEntry;
6114
+ const reject = !warnings;
6037
6115
  const maskedLocalDirectory = zipEntry.decryptedDirectory &&
6038
6116
  (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
6039
6117
  if (checkLocalFilename && !maskedLocalDirectory &&
6040
6118
  (rawLocalFilename.length != rawFilename.length ||
6041
6119
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6042
- throwAmbiguousArchive("mismatched local file header (filename)");
6120
+ reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6043
6121
  }
6044
6122
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6045
- throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
6123
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
6046
6124
  }
6047
6125
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
6048
- throwAmbiguousArchive("mismatched local file header (compression method)");
6126
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
6049
6127
  }
6050
6128
  if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
6051
6129
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
6052
6130
  (localDirectory.crc32 != zipEntry.crc32 ||
6053
6131
  localDirectory.compressedSize != zipEntry.compressedSize ||
6054
6132
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
6055
- throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
6133
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
6134
+ }
6135
+ }
6136
+
6137
+ function reportAmbiguity(reject, warnings, reason) {
6138
+ if (reject) {
6139
+ throwAmbiguousArchive(reason);
6140
+ } else {
6141
+ addWarning(warnings, reason);
6142
+ }
6143
+ }
6144
+
6145
+ function addWarning(warnings, reason, filename) {
6146
+ if (!warnings.some(warning => warning.reason == reason)) {
6147
+ const warning = { reason };
6148
+ if (filename !== UNDEFINED_VALUE) {
6149
+ warning.filename = filename;
6150
+ }
6151
+ warnings.push(warning);
6056
6152
  }
6057
6153
  }
6058
6154
 
@@ -6129,8 +6225,23 @@ var zipReader = /*#__PURE__*/Object.freeze({
6129
6225
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6130
6226
  ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6131
6227
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6228
+ WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
6229
+ WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6230
+ WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6231
+ WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6232
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6233
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6234
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6235
+ WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6236
+ WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6237
+ WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6238
+ WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
6239
+ WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
6240
+ WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
6241
+ WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
6132
6242
  ZipReader: ZipReader,
6133
- ZipReaderStream: ZipReaderStream
6243
+ ZipReaderStream: ZipReaderStream,
6244
+ isZipFile: isZipFile
6134
6245
  });
6135
6246
 
6136
6247
  /*
@@ -6343,6 +6454,7 @@ class ZipWriter {
6343
6454
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6344
6455
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6345
6456
  rawExtraField,
6457
+ rawCentralExtraField: EMPTY_UINT8_ARRAY,
6346
6458
  extendedTimestamp: false,
6347
6459
  headerArray,
6348
6460
  headerView
@@ -6516,7 +6628,6 @@ async function prependZipEntries(zipWriter, reader) {
6516
6628
 
6517
6629
  async function addFileEntry(zipWriter, name, reader, options) {
6518
6630
  options = Object.assign({}, options);
6519
- name = name.trim();
6520
6631
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6521
6632
  name += DIRECTORY_SIGNATURE;
6522
6633
  }
@@ -6607,7 +6718,6 @@ async function addFile(zipWriter, name, reader, options) {
6607
6718
  }
6608
6719
 
6609
6720
  function resolveAttributes(zipWriter, name, options) {
6610
- name = name.trim();
6611
6721
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6612
6722
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
6613
6723
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
@@ -6812,6 +6922,7 @@ function resolveMetadata(zipWriter, name, options) {
6812
6922
  }
6813
6923
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6814
6924
  const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6925
+ const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
6815
6926
  return {
6816
6927
  comment,
6817
6928
  resolvedOptions: {
@@ -6847,7 +6958,8 @@ function resolveMetadata(zipWriter, name, options) {
6847
6958
  dataDescriptor,
6848
6959
  zip64,
6849
6960
  rawExtraField,
6850
- rawLocalExtraField
6961
+ rawLocalExtraField,
6962
+ rawCentralExtraField
6851
6963
  }
6852
6964
  };
6853
6965
  }
@@ -7166,6 +7278,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7166
7278
  versionMadeBy,
7167
7279
  rawComment,
7168
7280
  rawExtraField,
7281
+ rawCentralExtraField,
7169
7282
  useWebWorkers,
7170
7283
  transferStreams,
7171
7284
  onstart,
@@ -7209,6 +7322,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
7209
7322
  rawExtraFieldUnix,
7210
7323
  rawExtraFieldAES,
7211
7324
  rawExtraField,
7325
+ rawCentralExtraField,
7212
7326
  extendedTimestamp,
7213
7327
  msDosCompatible,
7214
7328
  internalFileAttributes,
@@ -7709,6 +7823,7 @@ function createDirectoryRecords(files) {
7709
7823
  rawExtraFieldNTFS,
7710
7824
  rawExtraFieldUnix,
7711
7825
  rawExtraField,
7826
+ rawCentralExtraField,
7712
7827
  extendedTimestamp,
7713
7828
  extraFieldExtendedTimestampFlag,
7714
7829
  lastModDate,
@@ -7763,7 +7878,8 @@ function createDirectoryRecords(files) {
7763
7878
  rawExtraFieldNTFS,
7764
7879
  rawExtraFieldUnix,
7765
7880
  rawExtraFieldTimestamp,
7766
- rawExtraField);
7881
+ rawExtraField,
7882
+ rawCentralExtraField);
7767
7883
  if (extraFieldLength > MAX_16_BITS) {
7768
7884
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7769
7885
  }
@@ -7791,6 +7907,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7791
7907
  rawExtraFieldNTFS,
7792
7908
  rawExtraFieldUnix,
7793
7909
  rawExtraField,
7910
+ rawCentralExtraField,
7794
7911
  rawComment,
7795
7912
  versionMadeBy,
7796
7913
  headerArray,
@@ -7805,7 +7922,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7805
7922
  uncompressedSize,
7806
7923
  compressedSize
7807
7924
  } = fileEntry;
7808
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
7925
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
7809
7926
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
7810
7927
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
7811
7928
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -7843,6 +7960,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7843
7960
  directoryRecord.writeBytes(rawExtraFieldNTFS);
7844
7961
  directoryRecord.writeBytes(rawExtraFieldUnix);
7845
7962
  directoryRecord.writeBytes(rawExtraField);
7963
+ directoryRecord.writeBytes(rawCentralExtraField);
7846
7964
  directoryRecord.writeBytes(rawComment);
7847
7965
  arraySet(directoryArray, directoryRecord.array, offset);
7848
7966
  offset += directoryRecordLength;
@@ -9139,4 +9257,4 @@ function terminateWorkersAndModule() {
9139
9257
 
9140
9258
  configureExternalAssets();
9141
9259
 
9142
- export { BlobReader, BlobWriter, Data64URIReader, Data64URIWriter, 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_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_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_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_NOT_EMPTY, HttpRangeReader, HttpReader, Reader, SplitDataReader, SplitDataWriter, TextReader, TextWriter, Uint8ArrayReader, Uint8ArrayWriter, Writer, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, getMimeType, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };
9260
+ export { BlobReader, BlobWriter, Data64URIReader, Data64URIWriter, 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_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_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_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_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, ZipReader, ZipReaderStream, ZipWriter, ZipWriterStream, configure, createBlobTempStream, createOPFSTempStream, createSyncAccessHandleTempStream, getMimeType, isZipFile, registerCodec, resetConfiguration, terminateWorkersAndModule as terminateWorkers, unregisterCodec };