@zip.js/zip.js 2.8.58 → 2.8.60

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.
Files changed (45) hide show
  1. package/deno.json +2 -2
  2. package/dist/zip-core-external.js +295 -57
  3. package/dist/zip-core-external.min.js +1 -1
  4. package/dist/zip-core.js +286 -40
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core-external.js +295 -58
  7. package/dist/zip-fs-core-external.min.js +1 -1
  8. package/dist/zip-fs-core.js +5867 -4360
  9. package/dist/zip-fs-core.min.js +1 -1
  10. package/dist/zip-fs-external.js +295 -58
  11. package/dist/zip-fs-external.min.js +1 -1
  12. package/dist/zip-fs-native.js +288 -43
  13. package/dist/zip-fs-native.min.js +1 -1
  14. package/dist/zip-fs.js +313 -58
  15. package/dist/zip-fs.min.js +1 -1
  16. package/dist/zip-legacy.js +288 -42
  17. package/dist/zip-legacy.min.js +1 -1
  18. package/dist/zip-native.js +288 -42
  19. package/dist/zip-native.min.js +1 -1
  20. package/dist/zip-web-worker-native.js +1 -1
  21. package/dist/zip-web-worker.js +1 -1
  22. package/dist/zip.js +313 -57
  23. package/dist/zip.min.js +1 -1
  24. package/index-native.cjs +288 -43
  25. package/index-native.min.js +1 -1
  26. package/index.cjs +313 -58
  27. package/index.d.cts +318 -2
  28. package/index.d.ts +318 -2
  29. package/index.min.js +1 -1
  30. package/lib/core/codec-registry.js +5 -0
  31. package/lib/core/compression-methods.js +93 -0
  32. package/lib/core/constants.js +2 -0
  33. package/lib/core/options.js +2 -0
  34. package/lib/core/streams/zip-entry-stream.js +7 -3
  35. package/lib/core/streams/zlib-wasm/zlib-streams.js +18 -8
  36. package/lib/core/version.js +31 -0
  37. package/lib/core/web-worker-inline-native.js +1 -1
  38. package/lib/core/web-worker-inline-wasm.js +1 -1
  39. package/lib/core/zip-reader.js +143 -33
  40. package/lib/core/zip-writer.js +14 -6
  41. package/lib/zip-core-base.js +7 -0
  42. package/lib/zip-core-reader.js +16 -1
  43. package/lib/zip-fs-core.js +32 -0
  44. package/package.json +3 -3
  45. package/sync-versions.js +26 -0
@@ -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";
@@ -412,7 +414,7 @@
412
414
  Object.assign(config, DEFAULT_CONFIGURATION);
413
415
  }
414
416
 
415
- const o=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],r=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],e=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],t=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],w=new Uint8Array(288);w.fill(8,0,144),w.fill(9,144,256),w.fill(7,256,280),w.fill(8,280,288);const U=new Uint8Array(30).fill(5);function s(o){const r=new Uint16Array(16);for(const e of o)r[e]++;r[0]=0;const e=new Uint16Array(17);for(let o=1;o<=15;o++)e[o+1]=e[o]+r[o];const t=new Uint16Array(o.length);for(let r=0;r<o.length;r++)o[r]&&(t[e[o[r]]++]=r);return {o:r,symbols:t}}const x="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=(B=()=>function(x){let c=0,B=0,q=0,C=new Uint8Array(1024),f=0,h=0;for(;!h;){h=Y(1);const o=Y(2);if(0==o)g();else if(1==o)u(s(w),s(U));else {if(2!=o)throw new Error("invalid deflate block type");u(...z());}}return C.subarray(0,f);function i(){if(c>=x.length)throw new Error("unexpected end of deflate data");return x[c++]}function Y(o){for(;q<o;)B|=i()<<q,q+=8;const r=B&(1<<o)-1;return B>>>=o,q-=o,r}function g(){B=0,q=0;const o=i()|i()<<8;c+=2,O(f+o);for(let r=0;r<o;r++)C[f++]=i();}function u(n,w){let U=l(n);for(;256!=U;){if(U<256)O(f+1),C[f++]=U;else {const n=U-257,s=o[n]+Y(r[n]),x=l(w),c=e[x]+Y(t[x]);O(f+s);const B=f-c;for(let o=0;o<s;o++)C[f++]=C[B+o];}U=l(n);}}function z(){const o=Y(5)+257,r=Y(5)+1,e=Y(4)+4,t=new Uint8Array(19);for(let o=0;o<e;o++)t[n[o]]=Y(3);const w=s(t),U=new Uint8Array(o+r);let x=0;for(;x<U.length;){const o=l(w);if(o<16)U[x++]=o;else if(16==o){const o=U[x-1];let r=Y(2)+3;for(;r--;)U[x++]=o;}else x+=17==o?Y(3)+3:Y(7)+11;}return [s(U.subarray(0,o)),s(U.subarray(o))]}function l(o){const{o:r,symbols:e}=o;let t=0,n=0,w=0;for(let o=1;o<=15;o++){t|=Y(1);const U=r[o];if(t-n<U)return e[w+(t-n)];w+=U,n=n+U<<1,t<<=1;}throw new Error("invalid huffman code")}function O(o){if(C.length<o){let r=2*C.length;for(;r<o;)r*=2;const e=new Uint8Array(r);e.set(C.subarray(0,f)),C=e;}}}(function(o){const r=(o=String(o).replace(/[^A-Za-z0-9+/=]/g,"")).length,e=[];for(let t=0;t<r;t+=4){const r=x.indexOf(o[t])<<18|x.indexOf(o[t+1])<<12|(63&x.indexOf(o[t+2]))<<6|63&x.indexOf(o[t+3]);e.push(r>>16&255),"="!==o[t+2]&&e.push(r>>8&255),"="!==o[t+3]&&e.push(255&r);}return new Uint8Array(e)}("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")),o=>o({workerURI:o=>{const r="text/javascript";let e=B();if("string"==typeof e&&(e=(new TextEncoder).encode(e)),o){const o=new Blob([e],{type:r});return URL.createObjectURL(o)}return "data:"+r+";base64,"+function(o){let r="";const e=o.length;let t=0;for(;t+2<e;t+=3){const e=o[t]<<16|o[t+1]<<8|o[t+2];r+=x[e>>18&63]+x[e>>12&63]+x[e>>6&63]+x[63&e];}const n=e-t;if(1===n){const e=o[t]<<16;r+=x[e>>18&63]+x[e>>12&63]+"==";}else if(2===n){const e=o[t]<<16|o[t+1]<<8;r+=x[e>>18&63]+x[e>>12&63]+x[e>>6&63]+"=";}return r}(e)}}));var B;
417
+ const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],o=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],r=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],t=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e=new Uint8Array(288);e.fill(8,0,144),e.fill(9,144,256),e.fill(7,256,280),e.fill(8,280,288);const V=new Uint8Array(30).fill(5);function i(n){const o=new Uint16Array(16);for(const f of n)o[f]++;o[0]=0;const f=new Uint16Array(17);for(let n=1;n<=15;n++)f[n+1]=f[n]+o[n];const r=new Uint16Array(n.length);for(let o=0;o<n.length;o++)n[o]&&(r[f[n[o]]++]=o);return {o:o,symbols:r}}const g$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=(B=()=>function(g){let s=0,B=0,A=0,q=new Uint8Array(1024),c=0,h=0;for(;!h;){h=u(1);const n=u(2);if(0==n)w();else if(1==n)E(i(e),i(V));else {if(2!=n)throw new Error("invalid deflate block type");E(...v());}}return q.subarray(0,c);function x(){if(s>=g.length)throw new Error("unexpected end of deflate data");return g[s++]}function u(n){for(;A<n;)B|=x()<<A,A+=8;const o=B&(1<<n)-1;return B>>>=n,A-=n,o}function w(){B=0,A=0;const n=x()|x()<<8;s+=2,G(c+n);for(let o=0;o<n;o++)q[c++]=x();}function E(t,e){let V=z(t);for(;256!=V;){if(V<256)G(c+1),q[c++]=V;else {const t=V-257,i=n[t]+u(o[t]),g=z(e),s=f[g]+u(r[g]);G(c+i);const B=c-s;for(let n=0;n<i;n++)q[c++]=q[B+n];}V=z(t);}}function v(){const n=u(5)+257,o=u(5)+1,f=u(4)+4,r=new Uint8Array(19);for(let n=0;n<f;n++)r[t[n]]=u(3);const e=i(r),V=new Uint8Array(n+o);let g=0;for(;g<V.length;){const n=z(e);if(n<16)V[g++]=n;else if(16==n){const n=V[g-1];let o=u(2)+3;for(;o--;)V[g++]=n;}else g+=17==n?u(3)+3:u(7)+11;}return [i(V.subarray(0,n)),i(V.subarray(n))]}function z(n){const{o:o,symbols:f}=n;let r=0,t=0,e=0;for(let n=1;n<=15;n++){r|=u(1);const V=o[n];if(r-t<V)return f[e+(r-t)];e+=V,t=t+V<<1,r<<=1;}throw new Error("invalid huffman code")}function G(n){if(q.length<n){let o=2*q.length;for(;o<n;)o*=2;const f=new Uint8Array(o);f.set(q.subarray(0,c)),q=f;}}}(function(n){const o=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let r=0;r<o;r+=4){const o=g$1.indexOf(n[r])<<18|g$1.indexOf(n[r+1])<<12|(63&g$1.indexOf(n[r+2]))<<6|63&g$1.indexOf(n[r+3]);f.push(o>>16&255),"="!==n[r+2]&&f.push(o>>8&255),"="!==n[r+3]&&f.push(255&o);}return new Uint8Array(f)}("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")),n=>n({workerURI:n=>{const o="text/javascript";let f=B();if("string"==typeof f&&(f=(new TextEncoder).encode(f)),n){const n=new Blob([f],{type:o});return URL.createObjectURL(n)}return "data:"+o+";base64,"+function(n){let o="";const f=n.length;let r=0;for(;r+2<f;r+=3){const f=n[r]<<16|n[r+1]<<8|n[r+2];o+=g$1[f>>18&63]+g$1[f>>12&63]+g$1[f>>6&63]+g$1[63&f];}const t=f-r;if(1===t){const f=n[r]<<16;o+=g$1[f>>18&63]+g$1[f>>12&63]+"==";}else if(2===t){const f=n[r]<<16|n[r+1]<<8;o+=g$1[f>>18&63]+g$1[f>>12&63]+g$1[f>>6&63]+"=";}return o}(f)}}));var B;
416
418
 
417
419
  /*
418
420
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -2082,6 +2084,10 @@
2082
2084
  return registeredCodecs.get(compressionMethod);
2083
2085
  }
2084
2086
 
2087
+ function getRegisteredCodecs() {
2088
+ return Array.from(registeredCodecs.values(), codec => Object.assign({}, codec, codecStreams.get(codec.format)));
2089
+ }
2090
+
2085
2091
  function getCodecStreams(format) {
2086
2092
  return codecStreams.get(format);
2087
2093
  }
@@ -2145,7 +2151,7 @@
2145
2151
 
2146
2152
  constructor(options, { chunkSize, CompressionStreamFallback, CompressionStream }) {
2147
2153
  super({});
2148
- const { compressed, encrypted, useCompressionStream, zipCrypto, computeCrc32, level, deflate64, format, compressionMethod } = options;
2154
+ const { compressed, encrypted, useCompressionStream, zipCrypto, computeCrc32, level, deflate64, format, compressionMethod, inputSize } = options;
2149
2155
  const stream = this;
2150
2156
  let crc32Stream, encryptionStream, gzipCrc32Stream;
2151
2157
  let readable = super.readable;
@@ -2158,7 +2164,7 @@
2158
2164
  }
2159
2165
  if (compressed) {
2160
2166
  if (codecStreams) {
2161
- readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.CompressionStream, format, { level, chunkSize, compressionMethod }));
2167
+ readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.CompressionStream, format, { level, chunkSize, compressionMethod, uncompressedSize: inputSize }));
2162
2168
  } else if (useGzipCrc32) {
2163
2169
  gzipCrc32Stream = new GzipToRawDeflateStream();
2164
2170
  readable = pipeThroughBackpressured(readable, new CompressionStream(FORMAT_GZIP));
@@ -4731,6 +4737,21 @@
4731
4737
  const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4732
4738
  const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4733
4739
  const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
4740
+ const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
4741
+ const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
4742
+ const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
4743
+ const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
4744
+ const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
4745
+ const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
4746
+ const WARNING_APPENDED_DATA = "appended data";
4747
+ const WARNING_PREPENDED_DATA = "prepended data";
4748
+ const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4749
+ const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4750
+ const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4751
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4752
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4753
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
4754
+ const MAX_KNOWN_VERSION = 63;
4734
4755
  const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4735
4756
  const CHARSET_UTF8 = "utf-8";
4736
4757
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
@@ -4781,6 +4802,7 @@
4781
4802
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
4782
4803
  throw new Error(ERR_BAD_FORMAT);
4783
4804
  }
4805
+ const warnings = zipReader.warnings = [];
4784
4806
  const strictness = getStrictness(options, zipReader.options);
4785
4807
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4786
4808
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
@@ -4804,8 +4826,12 @@
4804
4826
  const commentOffset = endOfDirectoryInfo.offset;
4805
4827
  const commentLength = getUint16$1(endOfDirectoryView, 20);
4806
4828
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4807
- if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4808
- throwAmbiguousArchive("appended data");
4829
+ const appendedDataLength = reader.size - appendedDataOffset;
4830
+ if (appendedDataLength > maxAppendedDataSize) {
4831
+ throwAmbiguousArchive(WARNING_APPENDED_DATA);
4832
+ }
4833
+ if (appendedDataLength > 0) {
4834
+ addWarning(warnings, WARNING_APPENDED_DATA);
4809
4835
  }
4810
4836
  let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4811
4837
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
@@ -4859,23 +4885,23 @@
4859
4885
  }
4860
4886
  if (lastDiskNumber == MAX_16_BITS) {
4861
4887
  lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4862
- } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4863
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4888
+ } else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4889
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4864
4890
  }
4865
4891
  if (diskNumber == MAX_16_BITS) {
4866
4892
  diskNumber = getUint32$1(endOfDirectoryView, 20);
4867
- } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4868
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4893
+ } else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4894
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4869
4895
  }
4870
4896
  if (filesLength == MAX_16_BITS) {
4871
4897
  filesLength = getBigUint64(endOfDirectoryView, 32);
4872
- } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
4873
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4898
+ } else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
4899
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4874
4900
  }
4875
4901
  if (directoryDataLength == MAX_32_BITS) {
4876
4902
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
4877
- } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4878
- throwAmbiguousArchive("mismatched zip64 end of central directory record");
4903
+ } else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
4904
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4879
4905
  }
4880
4906
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4881
4907
  }
@@ -4944,14 +4970,22 @@
4944
4970
  declaredDirectoryDataLength = directoryArray.length;
4945
4971
  decryptedDirectory = true;
4946
4972
  }
4973
+ if (directoryEncryptionInfo && !decryptedDirectory &&
4974
+ (directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
4975
+ addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
4976
+ }
4947
4977
  startOffset = directoryDataOffset;
4948
4978
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4949
4979
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
4950
- const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4980
+ const filenames = new Set();
4951
4981
  let duplicateFilename;
4982
+ let previousEntryPosition = -1;
4952
4983
  const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
4953
4984
  if (!filesLength && recoverWrappedFilesLength) {
4954
4985
  filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
4986
+ if (filesLength) {
4987
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
4988
+ }
4955
4989
  }
4956
4990
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4957
4991
  const fileEntry = new ZipEntry$1(reader, zipReader.options);
@@ -5030,15 +5064,26 @@
5030
5064
  filename,
5031
5065
  comment
5032
5066
  });
5033
- readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5067
+ if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5068
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5069
+ }
5034
5070
  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);
5071
+ const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
5072
+ startOffset = Math.min(entryPosition, startOffset);
5073
+ if (entryPosition < previousEntryPosition) {
5074
+ addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
5041
5075
  }
5076
+ previousEntryPosition = entryPosition;
5077
+ if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
5078
+ addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
5079
+ }
5080
+ if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
5081
+ addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
5082
+ }
5083
+ if (filenames.has(fileEntry.filename)) {
5084
+ duplicateFilename = true;
5085
+ }
5086
+ filenames.add(fileEntry.filename);
5042
5087
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
5043
5088
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
5044
5089
  fileEntry.unixMode = unixExternalUpper;
@@ -5076,7 +5121,11 @@
5076
5121
  };
5077
5122
  offset = endOffset;
5078
5123
  if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
5079
- filesLength += getWrappedFilesLength(directoryView, directoryArray, offset);
5124
+ const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
5125
+ if (wrappedFilesLength) {
5126
+ filesLength += wrappedFilesLength;
5127
+ addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
5128
+ }
5080
5129
  }
5081
5130
  const { onprogress } = options;
5082
5131
  if (onprogress) {
@@ -5102,18 +5151,22 @@
5102
5151
  zipReader.digitalSignature = digitalSignature;
5103
5152
  offsetAfterSignature = offset + 6 + digitalSignature.length;
5104
5153
  }
5105
- if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
5106
- throwAmbiguousArchive("trailing central directory data");
5154
+ if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
5155
+ (!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
5156
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
5107
5157
  }
5108
5158
  if (duplicateFilename) {
5109
- throwAmbiguousArchive("duplicate filename");
5159
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
5110
5160
  }
5111
5161
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
5112
5162
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5113
5163
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5114
5164
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5115
5165
  if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5116
- throwAmbiguousArchive("prepended data");
5166
+ throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5167
+ }
5168
+ if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5169
+ addWarning(warnings, WARNING_PREPENDED_DATA);
5117
5170
  }
5118
5171
  if (extractPrependedData) {
5119
5172
  zipReader.prependedData = startOffset > splitZipSignatureLength ?
@@ -5183,6 +5236,28 @@
5183
5236
  }
5184
5237
  }
5185
5238
 
5239
+ async function isZipFile(reader, options = {}) {
5240
+ reader = new GenericReader(reader);
5241
+ await initStream(reader);
5242
+ if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
5243
+ reader = new BlobReader(await streamToBlob(reader.readable));
5244
+ await initStream(reader);
5245
+ }
5246
+ if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
5247
+ return false;
5248
+ }
5249
+ const strictness = getStrictness(options, {});
5250
+ const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
5251
+ const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
5252
+ const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
5253
+ if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
5254
+ return false;
5255
+ }
5256
+ const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
5257
+ const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
5258
+ return reader.size - appendedDataOffset <= maxAppendedDataSize;
5259
+ }
5260
+
5186
5261
  let ZipEntry$1 = class ZipEntry {
5187
5262
 
5188
5263
  constructor(reader, options) {
@@ -5214,6 +5289,7 @@
5214
5289
  dataDescriptor
5215
5290
  } = bitFlag;
5216
5291
  const localDirectory = fileEntry.localDirectory = {};
5292
+ const warnings = fileEntry.warnings = [];
5217
5293
  const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
5218
5294
  const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
5219
5295
  const dataView = getDataView(dataArray);
@@ -5254,10 +5330,10 @@
5254
5330
  if (checkLocalFilename) {
5255
5331
  localDirectory.rawFilename = rawLocalFilename;
5256
5332
  }
5257
- readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
5258
- if (checkLocalDirectory) {
5259
- validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
5333
+ if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
5334
+ addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
5260
5335
  }
5336
+ validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
5261
5337
  const { lastAccessDate, creationDate, uid, gid } = localDirectory;
5262
5338
  if (lastAccessDate) {
5263
5339
  fileEntry.lastAccessDate = lastAccessDate;
@@ -5483,6 +5559,7 @@
5483
5559
  const extraField = directory.extraField = new Map();
5484
5560
  const rawExtraFieldView = getDataView(rawExtraField);
5485
5561
  let offsetExtraField = 0;
5562
+ let malformedExtraField = false;
5486
5563
  try {
5487
5564
  while (offsetExtraField < rawExtraField.length) {
5488
5565
  const type = getUint16$1(rawExtraFieldView, offsetExtraField);
@@ -5494,7 +5571,10 @@
5494
5571
  offsetExtraField += 4 + size;
5495
5572
  }
5496
5573
  } catch {
5497
- // ignored
5574
+ malformedExtraField = true;
5575
+ }
5576
+ if (offsetExtraField > rawExtraField.length) {
5577
+ malformedExtraField = true;
5498
5578
  }
5499
5579
  const compressionMethod = getUint16$1(dataView, offset + 4);
5500
5580
  Object.assign(directory, {
@@ -5562,6 +5642,7 @@
5562
5642
  if (extraFieldUSDZ) {
5563
5643
  directory.extraFieldUSDZ = extraFieldUSDZ;
5564
5644
  }
5645
+ return malformedExtraField;
5565
5646
  }
5566
5647
 
5567
5648
  function readExtraFieldZip64(extraFieldZip64, directory) {
@@ -6023,27 +6104,46 @@
6023
6104
  return UNDEFINED_VALUE;
6024
6105
  }
6025
6106
 
6026
- function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
6107
+ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
6027
6108
  const { rawFilename } = zipEntry;
6109
+ const reject = !warnings;
6028
6110
  const maskedLocalDirectory = zipEntry.decryptedDirectory &&
6029
6111
  (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
6030
6112
  if (checkLocalFilename && !maskedLocalDirectory &&
6031
6113
  (rawLocalFilename.length != rawFilename.length ||
6032
6114
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6033
- throwAmbiguousArchive("mismatched local file header (filename)");
6115
+ reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6034
6116
  }
6035
6117
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6036
- throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
6118
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
6037
6119
  }
6038
6120
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
6039
- throwAmbiguousArchive("mismatched local file header (compression method)");
6121
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
6040
6122
  }
6041
6123
  if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
6042
6124
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
6043
6125
  (localDirectory.crc32 != zipEntry.crc32 ||
6044
6126
  localDirectory.compressedSize != zipEntry.compressedSize ||
6045
6127
  localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
6046
- throwAmbiguousArchive("mismatched local file header (crc32 or sizes)");
6128
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
6129
+ }
6130
+ }
6131
+
6132
+ function reportAmbiguity(reject, warnings, reason) {
6133
+ if (reject) {
6134
+ throwAmbiguousArchive(reason);
6135
+ } else {
6136
+ addWarning(warnings, reason);
6137
+ }
6138
+ }
6139
+
6140
+ function addWarning(warnings, reason, filename) {
6141
+ if (!warnings.some(warning => warning.reason == reason)) {
6142
+ const warning = { reason };
6143
+ if (filename !== UNDEFINED_VALUE) {
6144
+ warning.filename = filename;
6145
+ }
6146
+ warnings.push(warning);
6047
6147
  }
6048
6148
  }
6049
6149
 
@@ -6120,8 +6220,23 @@
6120
6220
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
6121
6221
  ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
6122
6222
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
6223
+ WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
6224
+ WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6225
+ WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6226
+ WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6227
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6228
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6229
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6230
+ WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6231
+ WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6232
+ WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
6233
+ WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
6234
+ WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
6235
+ WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
6236
+ WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
6123
6237
  ZipReader: ZipReader,
6124
- ZipReaderStream: ZipReaderStream
6238
+ ZipReaderStream: ZipReaderStream,
6239
+ isZipFile: isZipFile
6125
6240
  });
6126
6241
 
6127
6242
  /*
@@ -6334,6 +6449,7 @@
6334
6449
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6335
6450
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6336
6451
  rawExtraField,
6452
+ rawCentralExtraField: EMPTY_UINT8_ARRAY,
6337
6453
  extendedTimestamp: false,
6338
6454
  headerArray,
6339
6455
  headerView
@@ -6507,7 +6623,6 @@
6507
6623
 
6508
6624
  async function addFileEntry(zipWriter, name, reader, options) {
6509
6625
  options = Object.assign({}, options);
6510
- name = name.trim();
6511
6626
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6512
6627
  name += DIRECTORY_SIGNATURE;
6513
6628
  }
@@ -6598,7 +6713,6 @@
6598
6713
  }
6599
6714
 
6600
6715
  function resolveAttributes(zipWriter, name, options) {
6601
- name = name.trim();
6602
6716
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6603
6717
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
6604
6718
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
@@ -6803,6 +6917,7 @@
6803
6917
  }
6804
6918
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
6805
6919
  const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
6920
+ const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
6806
6921
  return {
6807
6922
  comment,
6808
6923
  resolvedOptions: {
@@ -6838,7 +6953,8 @@
6838
6953
  dataDescriptor,
6839
6954
  zip64,
6840
6955
  rawExtraField,
6841
- rawLocalExtraField
6956
+ rawLocalExtraField,
6957
+ rawCentralExtraField
6842
6958
  }
6843
6959
  };
6844
6960
  }
@@ -6980,7 +7096,6 @@
6980
7096
  let { name } = entry;
6981
7097
  const { size } = entry;
6982
7098
  const options = Object.assign({}, entry.options);
6983
- name = name.trim();
6984
7099
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6985
7100
  name += DIRECTORY_SIGNATURE;
6986
7101
  }
@@ -7236,6 +7351,7 @@
7236
7351
  versionMadeBy,
7237
7352
  rawComment,
7238
7353
  rawExtraField,
7354
+ rawCentralExtraField,
7239
7355
  useWebWorkers,
7240
7356
  transferStreams,
7241
7357
  onstart,
@@ -7279,6 +7395,7 @@
7279
7395
  rawExtraFieldUnix,
7280
7396
  rawExtraFieldAES,
7281
7397
  rawExtraField,
7398
+ rawCentralExtraField,
7282
7399
  extendedTimestamp,
7283
7400
  msDosCompatible,
7284
7401
  internalFileAttributes,
@@ -7310,6 +7427,7 @@
7310
7427
  const workerOptions = {
7311
7428
  options: {
7312
7429
  codecType: CODEC_DEFLATE,
7430
+ inputSize: size,
7313
7431
  level,
7314
7432
  rawPassword,
7315
7433
  password,
@@ -7779,6 +7897,7 @@
7779
7897
  rawExtraFieldNTFS,
7780
7898
  rawExtraFieldUnix,
7781
7899
  rawExtraField,
7900
+ rawCentralExtraField,
7782
7901
  extendedTimestamp,
7783
7902
  extraFieldExtendedTimestampFlag,
7784
7903
  lastModDate,
@@ -7833,7 +7952,8 @@
7833
7952
  rawExtraFieldNTFS,
7834
7953
  rawExtraFieldUnix,
7835
7954
  rawExtraFieldTimestamp,
7836
- rawExtraField);
7955
+ rawExtraField,
7956
+ rawCentralExtraField);
7837
7957
  if (extraFieldLength > MAX_16_BITS) {
7838
7958
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
7839
7959
  }
@@ -7861,6 +7981,7 @@
7861
7981
  rawExtraFieldNTFS,
7862
7982
  rawExtraFieldUnix,
7863
7983
  rawExtraField,
7984
+ rawCentralExtraField,
7864
7985
  rawComment,
7865
7986
  versionMadeBy,
7866
7987
  headerArray,
@@ -7875,7 +7996,7 @@
7875
7996
  uncompressedSize,
7876
7997
  compressedSize
7877
7998
  } = fileEntry;
7878
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
7999
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
7879
8000
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
7880
8001
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
7881
8002
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -7913,6 +8034,7 @@
7913
8034
  directoryRecord.writeBytes(rawExtraFieldNTFS);
7914
8035
  directoryRecord.writeBytes(rawExtraFieldUnix);
7915
8036
  directoryRecord.writeBytes(rawExtraField);
8037
+ directoryRecord.writeBytes(rawCentralExtraField);
7916
8038
  directoryRecord.writeBytes(rawComment);
7917
8039
  arraySet(directoryArray, directoryRecord.array, offset);
7918
8040
  offset += directoryRecordLength;
@@ -8416,6 +8538,111 @@
8416
8538
  */
8417
8539
 
8418
8540
 
8541
+ function getSupportedCompressionMethods() {
8542
+ const { CompressionStream, DecompressionStream, CompressionStreamFallback, DecompressionStreamFallback } = getConfiguration();
8543
+ const supportedMethods = [{
8544
+ compressionMethod: COMPRESSION_METHOD_STORE,
8545
+ compression: true,
8546
+ decompression: true,
8547
+ registered: false
8548
+ }, {
8549
+ compressionMethod: COMPRESSION_METHOD_DEFLATE,
8550
+ compression: formatSupported(CompressionStreamFallback, FORMAT_DEFLATE_RAW) ||
8551
+ formatSupported(CompressionStream, FORMAT_DEFLATE_RAW) || formatSupported(CompressionStream, FORMAT_GZIP),
8552
+ decompression: formatSupported(DecompressionStreamFallback, FORMAT_DEFLATE_RAW) ||
8553
+ formatSupported(DecompressionStream, FORMAT_DEFLATE_RAW) || formatSupported(DecompressionStream, FORMAT_GZIP),
8554
+ registered: false
8555
+ }, {
8556
+ compressionMethod: COMPRESSION_METHOD_DEFLATE_64,
8557
+ compression: false,
8558
+ decompression: formatSupported(DecompressionStreamFallback, FORMAT_DEFLATE64_RAW) ||
8559
+ formatSupported(DecompressionStream, FORMAT_DEFLATE64_RAW),
8560
+ registered: false
8561
+ }];
8562
+ for (const codec of getRegisteredCodecs()) {
8563
+ const codecStreams = getCodecStreams(codec.format);
8564
+ supportedMethods.push({
8565
+ compressionMethod: codec.compressionMethod,
8566
+ // deno-lint-ignore valid-typeof
8567
+ compression: codecStreams ? typeof codecStreams.CompressionStream == FUNCTION_TYPE : UNDEFINED_VALUE,
8568
+ // deno-lint-ignore valid-typeof
8569
+ decompression: codecStreams ? typeof codecStreams.DecompressionStream == FUNCTION_TYPE : UNDEFINED_VALUE,
8570
+ registered: true
8571
+ });
8572
+ }
8573
+ return supportedMethods;
8574
+ }
8575
+
8576
+ function formatSupported(StreamClass, format) {
8577
+ if (!StreamClass) {
8578
+ return false;
8579
+ }
8580
+ const { supportedFormats } = StreamClass;
8581
+ if (supportedFormats) {
8582
+ return supportedFormats.includes(format);
8583
+ }
8584
+ return supportsFormat(StreamClass, format);
8585
+ }
8586
+
8587
+ /*
8588
+ Copyright (c) 2025 Gildas Lormeau. All rights reserved.
8589
+
8590
+ Redistribution and use in source and binary forms, with or without
8591
+ modification, are permitted provided that the following conditions are met:
8592
+
8593
+ 1. Redistributions of source code must retain the above copyright notice,
8594
+ this list of conditions and the following disclaimer.
8595
+
8596
+ 2. Redistributions in binary form must reproduce the above copyright
8597
+ notice, this list of conditions and the following disclaimer in
8598
+ the documentation and/or other materials provided with the distribution.
8599
+
8600
+ 3. The names of the authors may not be used to endorse or promote products
8601
+ derived from this software without specific prior written permission.
8602
+
8603
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
8604
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
8605
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
8606
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
8607
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8608
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
8609
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
8610
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
8611
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
8612
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8613
+ */
8614
+
8615
+ const VERSION = "2.8.60";
8616
+
8617
+ /*
8618
+ Copyright (c) 2025 Gildas Lormeau. All rights reserved.
8619
+
8620
+ Redistribution and use in source and binary forms, with or without
8621
+ modification, are permitted provided that the following conditions are met:
8622
+
8623
+ 1. Redistributions of source code must retain the above copyright notice,
8624
+ this list of conditions and the following disclaimer.
8625
+
8626
+ 2. Redistributions in binary form must reproduce the above copyright
8627
+ notice, this list of conditions and the following disclaimer in
8628
+ the documentation and/or other materials provided with the distribution.
8629
+
8630
+ 3. The names of the authors may not be used to endorse or promote products
8631
+ derived from this software without specific prior written permission.
8632
+
8633
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
8634
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
8635
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
8636
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
8637
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
8638
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
8639
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
8640
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
8641
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
8642
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8643
+ */
8644
+
8645
+
8419
8646
  const DEFAULT_THRESHOLD$2 = 1024 * 1024;
8420
8647
  const DEFAULT_DIRECTORY_NAME$1 = ".zip.js-temp";
8421
8648
 
@@ -10282,7 +10509,7 @@
10282
10509
  */
10283
10510
 
10284
10511
 
10285
- c(setDefaultConfiguration);
10512
+ s(setDefaultConfiguration);
10286
10513
 
10287
10514
  exports.BlobReader = BlobReader;
10288
10515
  exports.BlobWriter = BlobWriter;
@@ -10372,6 +10599,21 @@
10372
10599
  exports.TextWriter = TextWriter;
10373
10600
  exports.Uint8ArrayReader = Uint8ArrayReader;
10374
10601
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
10602
+ exports.VERSION = VERSION;
10603
+ exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
10604
+ exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
10605
+ exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
10606
+ exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
10607
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
10608
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
10609
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
10610
+ exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
10611
+ exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
10612
+ exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
10613
+ exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
10614
+ exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
10615
+ exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
10616
+ exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
10375
10617
  exports.Writer = Writer;
10376
10618
  exports.ZipDirectoryEntry = ZipDirectoryEntry;
10377
10619
  exports.ZipEntry = ZipEntry;
@@ -10387,6 +10629,9 @@
10387
10629
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
10388
10630
  exports.fs = fs;
10389
10631
  exports.getMimeType = getMimeType;
10632
+ exports.getRegisteredCodecs = getRegisteredCodecs;
10633
+ exports.getSupportedCompressionMethods = getSupportedCompressionMethods;
10634
+ exports.isZipFile = isZipFile;
10390
10635
  exports.registerCodec = registerCodec;
10391
10636
  exports.resetConfiguration = resetConfiguration;
10392
10637
  exports.terminateWorkers = terminateWorkers;