@zip.js/zip.js 2.8.49 → 2.8.50

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/index-native.cjs CHANGED
@@ -111,6 +111,8 @@ const INFINITY_VALUE = Infinity;
111
111
  const UNDEFINED_TYPE = "undefined";
112
112
  const FUNCTION_TYPE = "function";
113
113
  const OBJECT_TYPE = "object";
114
+ const STRING_TYPE = "string";
115
+ const NUMBER_TYPE = "number";
114
116
 
115
117
  const EMPTY_UINT8_ARRAY = new Uint8Array();
116
118
 
@@ -242,7 +244,7 @@ function resetConfiguration() {
242
244
  const r=[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],t=[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],n=[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],c=[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 j$1=new Uint8Array(30).fill(5);function z$1(r){const t=new Uint16Array(16);for(const f of r)t[f]++;t[0]=0;const f=new Uint16Array(17);for(let r=1;15>=r;r++)f[r+1]=f[r]+t[r];const n=new Uint16Array(r.length);for(let t=0;t<r.length;t++)r[t]&&(n[f[r[t]]++]=t);return {j:t,symbols:n}}const W$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p$1=(s=()=>(W=>{let p=0,s=0,o=0,Y=new Uint8Array(1024),l=0,B=0;for(;!B;){B=u(1);const r=u(2);if(0==r)T();else if(1==r)w(z$1(e),z$1(j$1));else {if(2!=r)throw Error("invalid deflate block type");w(...K());}}return Y.subarray(0,l);function S(){if(p>=W.length)throw Error("unexpected end of deflate data");return W[p++]}function u(r){for(;r>o;)s|=S()<<o,o+=8;const t=s&(1<<r)-1;return s>>>=r,o-=r,t}function T(){s=0,o=0;const r=S()|S()<<8;p+=2,D(l+r);for(let t=0;r>t;t++)Y[l++]=S();}function w(c,e){let j=q(c);for(;256!=j;){if(256>j)D(l+1),Y[l++]=j;else {const c=j-257,z=r[c]+u(t[c]),W=q(e),p=f[W]+u(n[W]);D(l+z);const s=l-p;for(let r=0;z>r;r++)Y[l++]=Y[s+r];}j=q(c);}}function K(){const r=u(5)+257,t=u(5)+1,f=u(4)+4,n=new Uint8Array(19);for(let r=0;f>r;r++)n[c[r]]=u(3);const e=z$1(n),j=new Uint8Array(r+t);let W=0;for(;W<j.length;){const r=q(e);if(16>r)j[W++]=r;else if(16==r){const r=j[W-1];let t=u(2)+3;for(;t--;)j[W++]=r;}else W+=17==r?u(3)+3:u(7)+11;}return [z$1(j.subarray(0,r)),z$1(j.subarray(r))]}function q(r){const{j:t,symbols:f}=r;let n=0,c=0,e=0;for(let r=1;15>=r;r++){n|=u(1);const j=t[r];if(j>n-c)return f[e+(n-c)];e+=j,c=c+j<<1,n<<=1;}throw Error("invalid huffman code")}function D(r){if(Y.length<r){let t=2*Y.length;for(;r>t;)t*=2;const f=new Uint8Array(t);f.set(Y.subarray(0,l)),Y=f;}}})((r=>{const t=(r=(r+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let n=0;t>n;n+=4){const t=W$1.indexOf(r[n])<<18|W$1.indexOf(r[n+1])<<12|(63&W$1.indexOf(r[n+2]))<<6|63&W$1.indexOf(r[n+3]);f.push(t>>16&255),"="!==r[n+2]&&f.push(t>>8&255),"="!==r[n+3]&&f.push(255&t);}return new Uint8Array(f)})("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")),r=>r({workerURI:r=>{const t="text/javascript";let f=s();if("string"==typeof f&&(f=(new TextEncoder).encode(f)),r){const r=new Blob([f],{type:t});return URL.createObjectURL(r)}return "data:"+t+";base64,"+(r=>{let t="";const f=r.length;let n=0;for(;f>n+2;n+=3){const f=r[n]<<16|r[n+1]<<8|r[n+2];t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+W$1[63&f];}const c=f-n;if(1===c){const f=r[n]<<16;t+=W$1[f>>18&63]+W$1[f>>12&63]+"==";}else if(2===c){const f=r[n]<<16|r[n+1]<<8;t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+"=";}return t})(f)}}));var s;
243
245
 
244
246
  /*
245
- Copyright (c) 2025 Gildas Lormeau. All rights reserved.
247
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
246
248
 
247
249
  Redistribution and use in source and binary forms, with or without
248
250
  modification, are permitted provided that the following conditions are met:
@@ -270,72 +272,19 @@ const r=[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,1
270
272
  */
271
273
 
272
274
 
273
- const ERR_INVALID_CODEC_DEFINITION = "Invalid codec definition";
274
- const ERR_RESERVED_COMPRESSION_METHOD = "Reserved compression method";
275
- const ERR_INVALID_CODEC_MODULE = "Invalid codec module";
276
-
277
- const STRING_TYPE = "string";
278
- const RESERVED_COMPRESSION_METHODS = [
279
- COMPRESSION_METHOD_STORE,
280
- COMPRESSION_METHOD_DEFLATE,
281
- COMPRESSION_METHOD_DEFLATE_64,
282
- COMPRESSION_METHOD_AES
283
- ];
284
-
285
- const registeredCodecs = new Map();
286
- const codecStreams = new Map();
287
-
288
- function registerCodec(codec = {}) {
289
- const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
290
- if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
291
- typeof format != STRING_TYPE || !format.length) {
292
- throw new Error(ERR_INVALID_CODEC_DEFINITION);
293
- }
294
- if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
295
- throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
296
- }
297
- const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
298
- if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
299
- throw new Error(ERR_INVALID_CODEC_DEFINITION);
300
- }
301
- registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
302
- if (hasStreams) {
303
- setCodecStreams(format, { CompressionStream, DecompressionStream });
304
- }
305
- }
306
-
307
- function unregisterCodec(compressionMethod) {
308
- const codec = registeredCodecs.get(compressionMethod);
309
- if (codec) {
310
- registeredCodecs.delete(compressionMethod);
311
- let formatUsed;
312
- registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
313
- if (!formatUsed) {
314
- codecStreams.delete(codec.format);
315
- }
316
- }
317
- }
318
-
319
- function getRegisteredCodec(compressionMethod) {
320
- return registeredCodecs.get(compressionMethod);
321
- }
322
-
323
- function getCodecStreams(format) {
324
- return codecStreams.get(format);
275
+ function concat(first, second) {
276
+ const result = new Uint8Array(first.length + second.length);
277
+ result.set(first);
278
+ result.set(second, first.length);
279
+ return result;
325
280
  }
326
281
 
327
- function setCodecStreams(format, streams) {
328
- const { CompressionStream, DecompressionStream } = streams;
329
- if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
330
- throw new Error(ERR_INVALID_CODEC_MODULE);
331
- }
332
- codecStreams.set(format, { CompressionStream, DecompressionStream });
282
+ function toExactUint8Array(array) {
283
+ return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
333
284
  }
334
285
 
335
- async function ensureCodecStreams(format, codecURI) {
336
- if (!codecStreams.has(format) && codecURI) {
337
- setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
338
- }
286
+ function getDataView(array) {
287
+ return new DataView(array.buffer, array.byteOffset, array.byteLength);
339
288
  }
340
289
 
341
290
  /*
@@ -520,50 +469,6 @@ function encodeText(value) {
520
469
  }
521
470
  }
522
471
 
523
- /*
524
- Copyright (c) 2026 Gildas Lormeau. All rights reserved.
525
-
526
- Redistribution and use in source and binary forms, with or without
527
- modification, are permitted provided that the following conditions are met:
528
-
529
- 1. Redistributions of source code must retain the above copyright notice,
530
- this list of conditions and the following disclaimer.
531
-
532
- 2. Redistributions in binary form must reproduce the above copyright
533
- notice, this list of conditions and the following disclaimer in
534
- the documentation and/or other materials provided with the distribution.
535
-
536
- 3. The names of the authors may not be used to endorse or promote products
537
- derived from this software without specific prior written permission.
538
-
539
- THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
540
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
541
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
542
- INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
543
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
544
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
545
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
546
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
547
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
548
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
549
- */
550
-
551
-
552
- function concat(first, second) {
553
- const result = new Uint8Array(first.length + second.length);
554
- result.set(first);
555
- result.set(second, first.length);
556
- return result;
557
- }
558
-
559
- function toExactUint8Array(array) {
560
- return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
561
- }
562
-
563
- function getDataView(array) {
564
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
565
- }
566
-
567
472
  // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
568
473
 
569
474
  // deno-lint-ignore-file no-this-alias
@@ -1933,6 +1838,102 @@ function toCompatibleWritable(writable) {
1933
1838
  });
1934
1839
  }
1935
1840
 
1841
+ /*
1842
+ Copyright (c) 2025 Gildas Lormeau. All rights reserved.
1843
+
1844
+ Redistribution and use in source and binary forms, with or without
1845
+ modification, are permitted provided that the following conditions are met:
1846
+
1847
+ 1. Redistributions of source code must retain the above copyright notice,
1848
+ this list of conditions and the following disclaimer.
1849
+
1850
+ 2. Redistributions in binary form must reproduce the above copyright
1851
+ notice, this list of conditions and the following disclaimer in
1852
+ the documentation and/or other materials provided with the distribution.
1853
+
1854
+ 3. The names of the authors may not be used to endorse or promote products
1855
+ derived from this software without specific prior written permission.
1856
+
1857
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
1858
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
1859
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
1860
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
1861
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1862
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
1863
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
1864
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
1865
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
1866
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1867
+ */
1868
+
1869
+
1870
+ const ERR_INVALID_CODEC_DEFINITION = "Invalid codec definition";
1871
+ const ERR_RESERVED_COMPRESSION_METHOD = "Reserved compression method";
1872
+ const ERR_INVALID_CODEC_MODULE = "Invalid codec module";
1873
+
1874
+ const RESERVED_COMPRESSION_METHODS = [
1875
+ COMPRESSION_METHOD_STORE,
1876
+ COMPRESSION_METHOD_DEFLATE,
1877
+ COMPRESSION_METHOD_DEFLATE_64,
1878
+ COMPRESSION_METHOD_AES
1879
+ ];
1880
+
1881
+ const registeredCodecs = new Map();
1882
+ const codecStreams = new Map();
1883
+
1884
+ function registerCodec(codec = {}) {
1885
+ const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
1886
+ if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
1887
+ typeof format != STRING_TYPE || !format.length) {
1888
+ throw new Error(ERR_INVALID_CODEC_DEFINITION);
1889
+ }
1890
+ if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
1891
+ throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
1892
+ }
1893
+ const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
1894
+ if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
1895
+ throw new Error(ERR_INVALID_CODEC_DEFINITION);
1896
+ }
1897
+ registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
1898
+ if (hasStreams) {
1899
+ setCodecStreams(format, { CompressionStream, DecompressionStream });
1900
+ }
1901
+ }
1902
+
1903
+ function unregisterCodec(compressionMethod) {
1904
+ const codec = registeredCodecs.get(compressionMethod);
1905
+ if (codec) {
1906
+ registeredCodecs.delete(compressionMethod);
1907
+ let formatUsed;
1908
+ registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
1909
+ if (!formatUsed) {
1910
+ codecStreams.delete(codec.format);
1911
+ }
1912
+ }
1913
+ }
1914
+
1915
+ function getRegisteredCodec(compressionMethod) {
1916
+ return registeredCodecs.get(compressionMethod);
1917
+ }
1918
+
1919
+ function getCodecStreams(format) {
1920
+ return codecStreams.get(format);
1921
+ }
1922
+
1923
+ function setCodecStreams(format, streams) {
1924
+ const { CompressionStream, DecompressionStream } = streams;
1925
+ if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
1926
+ throw new Error(ERR_INVALID_CODEC_MODULE);
1927
+ }
1928
+ codecStreams.set(format, { CompressionStream, DecompressionStream });
1929
+ }
1930
+
1931
+ async function ensureCodecStreams(format, codecURI) {
1932
+ if (!codecStreams.has(format) && codecURI) {
1933
+ setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
1934
+ }
1935
+ }
1936
+
1936
1937
  /*
1937
1938
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
1938
1939
 
@@ -2486,8 +2487,8 @@ class ChunkStream extends TransformStream {
2486
2487
  1. Redistributions of source code must retain the above copyright notice,
2487
2488
  this list of conditions and the following disclaimer.
2488
2489
 
2489
- 2. Redistributions in binary form must reproduce the above copyright
2490
- notice, this list of conditions and the following disclaimer in
2490
+ 2. Redistributions in binary form must reproduce the above copyright
2491
+ notice, this list of conditions and the following disclaimer in
2491
2492
  the documentation and/or other materials provided with the distribution.
2492
2493
 
2493
2494
  3. The names of the authors may not be used to endorse or promote products
@@ -2506,20 +2507,15 @@ class ChunkStream extends TransformStream {
2506
2507
  */
2507
2508
 
2508
2509
 
2509
- const MODULE_WORKER_OPTIONS = { type: "module" };
2510
- const ERROR_EVENT_TYPE = "error";
2511
- const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
2512
2510
  const ERR_WORKER_STARTUP_TIMEOUT = "Worker startup timeout";
2513
2511
 
2514
- let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions, createWorkerFailed;
2515
- let transferStreamsSupported = true;
2516
- try {
2517
- transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
2518
- } catch {
2519
- // ignored
2520
- }
2512
+ let webWorkerSupported, createWorkerFailed, webWorkerBackend;
2521
2513
  let initModule = () => { };
2522
2514
 
2515
+ function setWebWorkerBackend(backend) {
2516
+ webWorkerBackend = backend;
2517
+ }
2518
+
2523
2519
  async function supportsDeflate(config) {
2524
2520
  const { CompressionStream: NativeStream, CompressionStreamFallback: FallbackStream } = config;
2525
2521
  if (FallbackStream && !FallbackStream.requiresModule) {
@@ -2544,6 +2540,14 @@ function resetWebWorkerSupport() {
2544
2540
  createWorkerFailed = false;
2545
2541
  }
2546
2542
 
2543
+ function disableWebWorker(workerData) {
2544
+ if (workerData.createWorker) {
2545
+ createWorkerFailed = true;
2546
+ } else {
2547
+ webWorkerSupported = false;
2548
+ }
2549
+ }
2550
+
2547
2551
  class CodecWorker {
2548
2552
 
2549
2553
  constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI, createWorker }, onTaskFinished) {
@@ -2596,7 +2600,7 @@ class CodecWorker {
2596
2600
  // deno-lint-ignore valid-typeof
2597
2601
  webWorkerSupported = typeof Worker != UNDEFINED_TYPE;
2598
2602
  }
2599
- return (useWebWorkers && ((webWorkerSupported && workerURI) || createWorker) ? createWebWorkerInterface : createWorkerInterface)(workerData, config);
2603
+ return (useWebWorkers && webWorkerBackend && ((webWorkerSupported && workerURI) || createWorker) ? webWorkerBackend : createWorkerInterface)(workerData, config);
2600
2604
  }
2601
2605
  }
2602
2606
 
@@ -2640,60 +2644,6 @@ function createWorkerInterface(workerData, config) {
2640
2644
  };
2641
2645
  }
2642
2646
 
2643
- function createWebWorkerInterface(workerData, config) {
2644
- const { baseURI, chunkSize, workerStartupTimeout } = config;
2645
- let { wasmURI } = config;
2646
-
2647
- if (!workerData.interface) {
2648
- // deno-lint-ignore valid-typeof
2649
- if (typeof wasmURI == FUNCTION_TYPE) {
2650
- wasmURI = wasmURI();
2651
- }
2652
- let worker;
2653
- try {
2654
- worker = getWebWorker(workerData.workerURI, baseURI, workerData);
2655
- } catch {
2656
- if (workerData.createWorker) {
2657
- createWorkerFailed = true;
2658
- } else {
2659
- webWorkerSupported = false;
2660
- }
2661
- return createWorkerInterface(workerData, config);
2662
- }
2663
- Object.assign(workerData, {
2664
- worker,
2665
- workerAlive: false,
2666
- terminated: false,
2667
- interface: {
2668
- run: async () => {
2669
- try {
2670
- return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
2671
- } catch (error) {
2672
- if (error && error.workerStartupFailed) {
2673
- if (workerData.createWorker) {
2674
- createWorkerFailed = true;
2675
- } else {
2676
- webWorkerSupported = false;
2677
- }
2678
- releaseWorkerStreams(workerData);
2679
- return runWorker$1(workerData, config);
2680
- }
2681
- if (error && error.codecImportFailed) {
2682
- if (workerData.reader) {
2683
- releaseWorkerStreams(workerData);
2684
- return runWorker$1(workerData, config);
2685
- }
2686
- workerData.onTaskFinished();
2687
- }
2688
- throw error;
2689
- }
2690
- }
2691
- }
2692
- });
2693
- }
2694
- return workerData.interface;
2695
- }
2696
-
2697
2647
  async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
2698
2648
  let codecStream;
2699
2649
  try {
@@ -2742,6 +2692,95 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
2742
2692
  }
2743
2693
  }
2744
2694
 
2695
+ /*
2696
+ Copyright (c) 2025 Gildas Lormeau. All rights reserved.
2697
+
2698
+ Redistribution and use in source and binary forms, with or without
2699
+ modification, are permitted provided that the following conditions are met:
2700
+
2701
+ 1. Redistributions of source code must retain the above copyright notice,
2702
+ this list of conditions and the following disclaimer.
2703
+
2704
+ 2. Redistributions in binary form must reproduce the above copyright
2705
+ notice, this list of conditions and the following disclaimer in
2706
+ the documentation and/or other materials provided with the distribution.
2707
+
2708
+ 3. The names of the authors may not be used to endorse or promote products
2709
+ derived from this software without specific prior written permission.
2710
+
2711
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
2712
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
2713
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
2714
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
2715
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2716
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
2717
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2718
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2719
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
2720
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2721
+ */
2722
+
2723
+
2724
+ const MODULE_WORKER_OPTIONS = { type: "module" };
2725
+ const ERROR_EVENT_TYPE = "error";
2726
+ const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
2727
+
2728
+ let webWorkerSource, webWorkerURI, webWorkerOptions;
2729
+ let transferStreamsSupported = true;
2730
+ try {
2731
+ transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
2732
+ } catch {
2733
+ // ignored
2734
+ }
2735
+
2736
+ setWebWorkerBackend(createWebWorkerInterface);
2737
+
2738
+ function createWebWorkerInterface(workerData, config) {
2739
+ const { baseURI, chunkSize, workerStartupTimeout } = config;
2740
+ let { wasmURI } = config;
2741
+
2742
+ if (!workerData.interface) {
2743
+ // deno-lint-ignore valid-typeof
2744
+ if (typeof wasmURI == FUNCTION_TYPE) {
2745
+ wasmURI = wasmURI();
2746
+ }
2747
+ let worker;
2748
+ try {
2749
+ worker = getWebWorker(workerData.workerURI, baseURI, workerData);
2750
+ } catch {
2751
+ disableWebWorker(workerData);
2752
+ return createWorkerInterface(workerData, config);
2753
+ }
2754
+ Object.assign(workerData, {
2755
+ worker,
2756
+ workerAlive: false,
2757
+ terminated: false,
2758
+ interface: {
2759
+ run: async () => {
2760
+ try {
2761
+ return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
2762
+ } catch (error) {
2763
+ if (error && error.workerStartupFailed) {
2764
+ disableWebWorker(workerData);
2765
+ releaseWorkerStreams(workerData);
2766
+ return runWorker$1(workerData, config);
2767
+ }
2768
+ if (error && error.codecImportFailed) {
2769
+ if (workerData.reader) {
2770
+ releaseWorkerStreams(workerData);
2771
+ return runWorker$1(workerData, config);
2772
+ }
2773
+ workerData.onTaskFinished();
2774
+ }
2775
+ throw error;
2776
+ }
2777
+ }
2778
+ }
2779
+ });
2780
+ }
2781
+ return workerData.interface;
2782
+ }
2783
+
2745
2784
  async function runWebWorker(workerData, config) {
2746
2785
  let resolveResult, rejectResult;
2747
2786
  const result = new Promise((resolve, reject) => {
@@ -3618,7 +3657,7 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
3618
3657
  forceRangeRequests,
3619
3658
  combineSizeEocd
3620
3659
  } = httpReader;
3621
- if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == "undefined" || preventHeadRequest)) {
3660
+ if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
3622
3661
  const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -END_OF_CENTRAL_DIR_LENGTH : undefined));
3623
3662
  const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
3624
3663
  if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
@@ -4471,9 +4510,13 @@ const OPTION_USDZ = "usdz";
4471
4510
  const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
4472
4511
  const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
4473
4512
  const OPTION_STRICTNESS = "strictness";
4513
+ const OPTION_FILENAME_VALIDATION = "filenameValidation";
4514
+ const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
4474
4515
  const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
4475
4516
  const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
4476
4517
  const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
4518
+ const TEXT_TYPE_FILENAME = "filename";
4519
+ const TEXT_TYPE_COMMENT = "comment";
4477
4520
  const STRICTNESS_STRICT = "strict";
4478
4521
  const STRICTNESS_BALANCED = "balanced";
4479
4522
  const STRICTNESS_TOLERANT = "tolerant";
@@ -4520,6 +4563,11 @@ const ERR_SPLIT_ZIP_FILE = "Split zip file";
4520
4563
  const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
4521
4564
  const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
4522
4565
  const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
4566
+ const ERR_UNSAFE_FILENAME = "Unsafe filename";
4567
+ const ERR_INVALID_STRICTNESS = "Invalid strictness (must be 'strict', 'balanced' or 'tolerant')";
4568
+ const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4569
+ const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4570
+ const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4523
4571
  const CHARSET_UTF8 = "utf-8";
4524
4572
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
4525
4573
  const CHARSET_CP437 = "cp437";
@@ -4541,6 +4589,10 @@ const ZIP64_EXTRACTION = {
4541
4589
  bytes: 8
4542
4590
  }
4543
4591
  };
4592
+ const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
4593
+ const CENTRAL_DIRECTORY_UNREACHABLE = 0;
4594
+ const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
4595
+ const CENTRAL_DIRECTORY_REACHABLE = 2;
4544
4596
 
4545
4597
  class ZipReader {
4546
4598
 
@@ -4569,6 +4621,8 @@ class ZipReader {
4569
4621
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4570
4622
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
4571
4623
  const maxAppendedDataSize = getMaxAppendedDataSize(getOptionValue$1(zipReader, options, OPTION_MAX_APPENDED_DATA_SIZE), strictness);
4624
+ const filenameValidation = getFilenameValidation(getOptionValue$1(zipReader, options, OPTION_FILENAME_VALIDATION), strictness);
4625
+ const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
4572
4626
  const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
4573
4627
  if (!endOfDirectoryInfo) {
4574
4628
  const signatureArray = await readUint8Array(reader, 0, 4);
@@ -4762,11 +4816,22 @@ class ZipReader {
4762
4816
  const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
4763
4817
  const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
4764
4818
  const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
4765
- let filename = decode(rawFilename, rawFilenameEncoding);
4819
+ let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
4766
4820
  if (filename === UNDEFINED_VALUE) {
4767
4821
  filename = decodeText(rawFilename, rawFilenameEncoding);
4768
4822
  }
4769
- let comment = decode(rawComment, rawCommentEncoding);
4823
+ if (normalizeFilename) {
4824
+ const normalizedFilename = normalizeFilename(filename);
4825
+ if (normalizedFilename !== UNDEFINED_VALUE) {
4826
+ filename = normalizedFilename;
4827
+ }
4828
+ }
4829
+ if (isUnsafeFilename(filename, filenameValidation)) {
4830
+ const error = new Error(ERR_UNSAFE_FILENAME);
4831
+ error.filename = filename;
4832
+ throw error;
4833
+ }
4834
+ let comment = decode(rawComment, rawCommentEncoding, TEXT_TYPE_COMMENT);
4770
4835
  if (comment === UNDEFINED_VALUE) {
4771
4836
  comment = decodeText(rawComment, rawCommentEncoding);
4772
4837
  }
@@ -4827,10 +4892,10 @@ class ZipReader {
4827
4892
  entry.getData = (writer, options) => fileEntry.getData(writer, entry, zipReader.readRanges, options);
4828
4893
  entry.arrayBuffer = async options => {
4829
4894
  const writer = new TransformStream();
4830
- const [arrayBuffer] = await Promise.all([
4831
- streamToBlob(writer.readable).then(blob => blob.arrayBuffer()),
4832
- fileEntry.getData(writer, entry, zipReader.readRanges, options)]);
4833
- return arrayBuffer;
4895
+ const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
4896
+ arrayBufferPromise.catch(() => { });
4897
+ await fileEntry.getData(writer, entry, zipReader.readRanges, options);
4898
+ return arrayBufferPromise;
4834
4899
  };
4835
4900
  offset = endOffset;
4836
4901
  const { onprogress } = options;
@@ -5081,7 +5146,7 @@ let ZipEntry$1 = class ZipEntry {
5081
5146
  readRanges
5082
5147
  });
5083
5148
  }
5084
- let writable;
5149
+ let writable, abortError;
5085
5150
  try {
5086
5151
  if (!checkOverlappingEntryOnly) {
5087
5152
  if (checkPasswordOnly) {
@@ -5101,12 +5166,22 @@ let ZipEntry$1 = class ZipEntry {
5101
5166
  writer.size += error.outputSize;
5102
5167
  }
5103
5168
  if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
5169
+ abortError = error;
5104
5170
  throw error;
5105
5171
  }
5106
5172
  } finally {
5107
5173
  const preventClose = getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
5108
5174
  if (!preventClose && writable && !writable.locked) {
5109
- await writable.getWriter().close();
5175
+ const writableWriter = writable.getWriter();
5176
+ if (abortError) {
5177
+ try {
5178
+ await writableWriter.abort(abortError);
5179
+ } catch {
5180
+ // the error being propagated is more relevant; ignored
5181
+ }
5182
+ } else {
5183
+ await writableWriter.close();
5184
+ }
5110
5185
  }
5111
5186
  }
5112
5187
  return checkPasswordOnly || checkOverlappingEntryOnly ? UNDEFINED_VALUE : writer.getData ? writer.getData() : writable;
@@ -5486,16 +5561,51 @@ function getDiskOffset$1(reader, diskNumber) {
5486
5561
  return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
5487
5562
  }
5488
5563
 
5564
+ function isStrictnessValue(value) {
5565
+ return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
5566
+ }
5567
+
5489
5568
  function getStrictness(strictness, checkAmbiguity) {
5490
5569
  if (strictness === UNDEFINED_VALUE) {
5491
5570
  return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
5492
5571
  }
5572
+ if (!isStrictnessValue(strictness)) {
5573
+ throw new Error(ERR_INVALID_STRICTNESS);
5574
+ }
5493
5575
  return strictness;
5494
5576
  }
5495
5577
 
5578
+ function getFilenameValidation(filenameValidation, strictness) {
5579
+ if (filenameValidation === UNDEFINED_VALUE) {
5580
+ return strictness;
5581
+ }
5582
+ if (!isStrictnessValue(filenameValidation)) {
5583
+ throw new Error(ERR_INVALID_FILENAME_VALIDATION);
5584
+ }
5585
+ return filenameValidation;
5586
+ }
5587
+
5588
+ function isUnsafeFilename(filename, filenameValidation) {
5589
+ if (filenameValidation == STRICTNESS_TOLERANT) {
5590
+ return false;
5591
+ }
5592
+ const pathParts = filename.split("/");
5593
+ if (pathParts.length > 1 && pathParts[pathParts.length - 1] === "") {
5594
+ pathParts.pop();
5595
+ }
5596
+ if (pathParts.includes("..") || filename.startsWith("/") || filename.startsWith("\\\\") || DRIVE_LETTER_REGEXP.test(filename)) {
5597
+ return true;
5598
+ }
5599
+ return filenameValidation == STRICTNESS_STRICT && (pathParts.includes(".") || pathParts.includes(""));
5600
+ }
5601
+
5496
5602
  function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
5497
5603
  if (maxAppendedDataSize !== UNDEFINED_VALUE) {
5498
- return maxAppendedDataSize;
5604
+ const size = toNumber$1(maxAppendedDataSize);
5605
+ if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
5606
+ throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
5607
+ }
5608
+ return size;
5499
5609
  }
5500
5610
  if (strictness == STRICTNESS_STRICT) {
5501
5611
  return 0;
@@ -5506,12 +5616,6 @@ function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
5506
5616
  return MAX_16_BITS;
5507
5617
  }
5508
5618
 
5509
- const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
5510
-
5511
- const CENTRAL_DIRECTORY_UNREACHABLE = 0;
5512
- const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
5513
- const CENTRAL_DIRECTORY_REACHABLE = 2;
5514
-
5515
5619
  async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
5516
5620
  const { size } = reader;
5517
5621
  const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
@@ -5647,6 +5751,10 @@ function getOptionValue$1(zipReader, options, name) {
5647
5751
  return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
5648
5752
  }
5649
5753
 
5754
+ function toNumber$1(value) {
5755
+ return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
5756
+ }
5757
+
5650
5758
  function getDate(timeRaw) {
5651
5759
  const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
5652
5760
  return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
@@ -5685,12 +5793,16 @@ var zipReader = /*#__PURE__*/Object.freeze({
5685
5793
  ERR_INVALID_AUTHENTICATION_CODE: ERR_INVALID_AUTHENTICATION_CODE,
5686
5794
  ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
5687
5795
  ERR_INVALID_CRC32: ERR_INVALID_CRC32,
5796
+ ERR_INVALID_FILENAME_VALIDATION: ERR_INVALID_FILENAME_VALIDATION,
5797
+ ERR_INVALID_MAX_APPENDED_DATA_SIZE: ERR_INVALID_MAX_APPENDED_DATA_SIZE,
5688
5798
  ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
5689
5799
  ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
5800
+ ERR_INVALID_STRICTNESS: ERR_INVALID_STRICTNESS,
5690
5801
  ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
5691
5802
  ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
5692
5803
  ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
5693
5804
  ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
5805
+ ERR_UNSAFE_FILENAME: ERR_UNSAFE_FILENAME,
5694
5806
  ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
5695
5807
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
5696
5808
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
@@ -5752,6 +5864,8 @@ const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be '
5752
5864
  const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
5753
5865
  const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
5754
5866
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
5867
+ const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
5868
+ const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
5755
5869
  const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
5756
5870
 
5757
5871
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
@@ -5759,6 +5873,7 @@ const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
5759
5873
  const VENDOR_VERSION_AE_1 = 1;
5760
5874
  const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
5761
5875
  const UNIX_EXTRA_FIELD_TYPE = "unix";
5876
+ const MAX_LEVEL = 9;
5762
5877
 
5763
5878
  let workers = 0;
5764
5879
  const pendingEntries = [];
@@ -5921,7 +6036,8 @@ class ZipWriter {
5921
6036
 
5922
6037
  remove(entry) {
5923
6038
  const { filenames, files } = this;
5924
- if (typeof entry == "string") {
6039
+ // deno-lint-ignore valid-typeof
6040
+ if (typeof entry == STRING_TYPE) {
5925
6041
  entry = files.get(entry);
5926
6042
  }
5927
6043
  if (entry && entry.filename !== UNDEFINED_VALUE) {
@@ -6059,20 +6175,20 @@ function resolveAttributes(zipWriter, name, options) {
6059
6175
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6060
6176
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
6061
6177
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
6062
- const uid = getOptionValue(zipWriter, options, PROPERTY_NAME_UID);
6063
- const gid = getOptionValue(zipWriter, options, PROPERTY_NAME_GID);
6064
- let unixMode = getOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
6178
+ const uid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UID);
6179
+ const gid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_GID);
6180
+ let unixMode = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
6065
6181
  let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
6066
6182
  let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
6067
6183
  let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
6068
6184
  let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
6069
- if (uid !== UNDEFINED_VALUE && (uid < 0 || uid > MAX_32_BITS)) {
6185
+ if (uid !== UNDEFINED_VALUE && (!Number.isInteger(uid) || uid < 0 || uid > MAX_32_BITS)) {
6070
6186
  throw new Error(ERR_INVALID_UID);
6071
6187
  }
6072
- if (gid !== UNDEFINED_VALUE && (gid < 0 || gid > MAX_32_BITS)) {
6188
+ if (gid !== UNDEFINED_VALUE && (!Number.isInteger(gid) || gid < 0 || gid > MAX_32_BITS)) {
6073
6189
  throw new Error(ERR_INVALID_GID);
6074
6190
  }
6075
- if (unixMode !== UNDEFINED_VALUE && (unixMode < 0 || unixMode > MAX_16_BITS)) {
6191
+ if (unixMode !== UNDEFINED_VALUE && (!Number.isInteger(unixMode) || unixMode < 0 || unixMode > MAX_16_BITS)) {
6076
6192
  throw new Error(ERR_INVALID_UNIX_MODE);
6077
6193
  }
6078
6194
  if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
@@ -6184,7 +6300,7 @@ function resolveAttributes(zipWriter, name, options) {
6184
6300
 
6185
6301
  function resolveMetadata(zipWriter, name, options) {
6186
6302
  const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
6187
- let rawFilename = encode(name);
6303
+ let rawFilename = encode(name, TEXT_TYPE_FILENAME);
6188
6304
  if (rawFilename === UNDEFINED_VALUE) {
6189
6305
  rawFilename = encodeText(name);
6190
6306
  }
@@ -6192,7 +6308,7 @@ function resolveMetadata(zipWriter, name, options) {
6192
6308
  throw new Error(ERR_INVALID_ENTRY_NAME);
6193
6309
  }
6194
6310
  const comment = options[PROPERTY_NAME_COMMENT] || "";
6195
- let rawComment = encode(comment);
6311
+ let rawComment = encode(comment, TEXT_TYPE_COMMENT);
6196
6312
  if (rawComment === UNDEFINED_VALUE) {
6197
6313
  rawComment = encodeText(comment);
6198
6314
  }
@@ -6212,8 +6328,11 @@ function resolveMetadata(zipWriter, name, options) {
6212
6328
  if (!passThrough) {
6213
6329
  password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
6214
6330
  rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
6331
+ if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
6332
+ throw new Error(ERR_INVALID_PASSWORD_TYPE);
6333
+ }
6215
6334
  }
6216
- const encryptionStrength = getOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
6335
+ const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
6217
6336
  const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
6218
6337
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
6219
6338
  const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
@@ -6231,7 +6350,10 @@ function resolveMetadata(zipWriter, name, options) {
6231
6350
  compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
6232
6351
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
6233
6352
  }
6234
- let level = getOptionValue(zipWriter, options, OPTION_LEVEL);
6353
+ let level = getNumberOptionValue(zipWriter, options, OPTION_LEVEL);
6354
+ if (level !== UNDEFINED_VALUE && (!Number.isInteger(level) || level < 0 || level > MAX_LEVEL)) {
6355
+ throw new Error(ERR_INVALID_LEVEL);
6356
+ }
6235
6357
  if (zipWriter.options[OPTION_USDZ]) {
6236
6358
  if (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) {
6237
6359
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION_USDZ);
@@ -6252,7 +6374,7 @@ function resolveMetadata(zipWriter, name, options) {
6252
6374
  useCompressionStream = false;
6253
6375
  }
6254
6376
  const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
6255
- if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
6377
+ if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(Number.isInteger(encryptionStrength) && encryptionStrength >= 1 && encryptionStrength <= 3)) {
6256
6378
  throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
6257
6379
  }
6258
6380
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
@@ -7446,6 +7568,14 @@ function getOptionValue(zipWriter, options, name, defaultValue) {
7446
7568
  return result === UNDEFINED_VALUE ? defaultValue : result;
7447
7569
  }
7448
7570
 
7571
+ function getNumberOptionValue(zipWriter, options, name, defaultValue) {
7572
+ return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
7573
+ }
7574
+
7575
+ function toNumber(value) {
7576
+ return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
7577
+ }
7578
+
7449
7579
  function getMaximumCompressedSize(uncompressedSize) {
7450
7580
  return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
7451
7581
  }
@@ -8098,6 +8228,7 @@ setDefaultConfiguration({
8098
8228
 
8099
8229
  const ERR_ENTRY_EXISTS = "Entry filename already exists";
8100
8230
  const ERR_READABLE_CONSUMED = "Readable stream already consumed";
8231
+ const ERR_ABORT_EXPORT = "zipjs-abort-export";
8101
8232
  const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
8102
8233
  const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
8103
8234
  EXTRAFIELD_TYPE_ZIP64,
@@ -8206,8 +8337,9 @@ class ZipFileEntry extends ZipEntry {
8206
8337
  const uncompressedSize = zipEntry.data ? zipEntry.data.uncompressedSize : reader.size;
8207
8338
  await Promise.all([initStream(reader), initStream(writer, uncompressedSize)]);
8208
8339
  const { readable } = reader;
8340
+ const { signal } = options;
8209
8341
  zipEntry.uncompressedSize = reader.size;
8210
- await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable));
8342
+ await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable), { signal });
8211
8343
  return writer.getData ? writer.getData() : writer.writable;
8212
8344
  }
8213
8345
  }
@@ -8474,7 +8606,7 @@ class ZipDirectoryEntry extends ZipEntry {
8474
8606
  for (const entry of entries) {
8475
8607
  let parent = this;
8476
8608
  try {
8477
- const path = entry.filename.split("/");
8609
+ const path = entry.filename.split("/").filter(pathPart => pathPart != "" && pathPart != ".");
8478
8610
  const name = path.pop();
8479
8611
  path.forEach(pathPart => {
8480
8612
  const previousParent = parent;
@@ -8849,6 +8981,39 @@ function detach(entry) {
8849
8981
  }
8850
8982
  }
8851
8983
 
8984
+ function forwardAbort(signal, abortController) {
8985
+ if (!signal) {
8986
+ return () => { };
8987
+ }
8988
+ if (signal.aborted) {
8989
+ abortController.abort(signal.reason);
8990
+ return () => { };
8991
+ }
8992
+ const abort = () => abortController.abort(signal.reason);
8993
+ signal.addEventListener("abort", abort, { once: true });
8994
+ return () => signal.removeEventListener("abort", abort);
8995
+ }
8996
+
8997
+ function isExportAborted(error) {
8998
+ return Boolean(error) && error.message == ERR_ABORT_EXPORT;
8999
+ }
9000
+
9001
+ function aggregateEntryErrors(errors) {
9002
+ const [error] = errors;
9003
+ const otherErrors = errors
9004
+ .slice(1)
9005
+ .flatMap(otherError => [otherError, ...(otherError && otherError.entryErrors || [])])
9006
+ .filter(otherError => otherError !== error);
9007
+ if (otherErrors.length) {
9008
+ try {
9009
+ error.entryErrors = [...(error.entryErrors || []), ...otherErrors];
9010
+ } catch {
9011
+ // ignored
9012
+ }
9013
+ }
9014
+ return error;
9015
+ }
9016
+
8852
9017
  function getUserExtraField(extraField) {
8853
9018
  if (extraField) {
8854
9019
  const userExtraField = new Map();
@@ -8969,8 +9134,9 @@ async function exportZip(zipWriter, entry, totalSize, options, readers) {
8969
9134
  function addFileSystemHandle(zipEntry, handle, options) {
8970
9135
  return addFile(zipEntry, handle, []);
8971
9136
 
8972
- async function addFile(parentEntry, handle, addedEntries) {
9137
+ async function addFile(parentEntry, handle, addedEntries, parentName = "") {
8973
9138
  if (handle) {
9139
+ const entryName = parentName ? parentName + "/" + handle.name : handle.name;
8974
9140
  try {
8975
9141
  if (handle.isFile || handle.isDirectory) {
8976
9142
  handle = await transformToFileSystemhandle(handle);
@@ -8992,12 +9158,18 @@ function addFileSystemHandle(zipEntry, handle, options) {
8992
9158
  const directoryEntry = parentEntry.addDirectory(handle.name);
8993
9159
  addedEntries.push(directoryEntry);
8994
9160
  for await (const childHandle of handle.values()) {
8995
- await addFile(directoryEntry, childHandle, addedEntries);
9161
+ await addFile(directoryEntry, childHandle, addedEntries, entryName);
8996
9162
  }
8997
9163
  }
8998
9164
  } catch (error) {
8999
- const message = error.message + (handle ? " (" + handle.name + ")" : "");
9000
- throw new Error(message, { cause: error });
9165
+ try {
9166
+ if (error.entryName === UNDEFINED_VALUE) {
9167
+ error.entryName = entryName;
9168
+ }
9169
+ } catch {
9170
+ // ignored
9171
+ }
9172
+ throw error;
9001
9173
  }
9002
9174
  }
9003
9175
  return addedEntries;
@@ -9007,15 +9179,32 @@ function addFileSystemHandle(zipEntry, handle, options) {
9007
9179
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
9008
9180
  const totalSize = getTotalSize([zipEntry], "uncompressedSize");
9009
9181
  const writtenSizes = new Map();
9010
- await exportChildren(zipEntry, directoryHandle);
9182
+ const abortController = new AbortController();
9183
+ const { signal } = abortController;
9184
+ const releaseSignal = forwardAbort(options.signal, abortController);
9185
+ const exportedEntryNames = [];
9186
+ try {
9187
+ await exportChildren(zipEntry, directoryHandle);
9188
+ } catch (error) {
9189
+ try {
9190
+ error.exportedEntryNames = exportedEntryNames;
9191
+ } catch {
9192
+ // ignored
9193
+ }
9194
+ throw error;
9195
+ } finally {
9196
+ releaseSignal();
9197
+ }
9011
9198
  return directoryHandle;
9012
9199
 
9013
9200
  async function exportChildren(entry, parentHandle) {
9014
9201
  if (options.concurrent) {
9015
9202
  const results = await Promise.allSettled(entry.children.map(child => exportChild(child, parentHandle)));
9016
- const failedResult = results.find(result => result.status == "rejected");
9017
- if (failedResult) {
9018
- throw failedResult.reason;
9203
+ const rejectedResults = results.filter(result => result.status == "rejected");
9204
+ if (rejectedResults.length) {
9205
+ const failedResults = rejectedResults.filter(result => !isExportAborted(result.reason));
9206
+ const reportedResults = failedResults.length ? failedResults : rejectedResults;
9207
+ throw aggregateEntryErrors(reportedResults.map(result => result.reason));
9019
9208
  }
9020
9209
  } else {
9021
9210
  for (const child of entry.children) {
@@ -9025,6 +9214,12 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
9025
9214
  }
9026
9215
 
9027
9216
  async function exportChild(child, parentHandle) {
9217
+ if (signal.aborted) {
9218
+ if (isExportAborted(signal.reason)) {
9219
+ return;
9220
+ }
9221
+ throw signal.reason;
9222
+ }
9028
9223
  try {
9029
9224
  if (child.directory) {
9030
9225
  const childDirectoryHandle = await parentHandle.getDirectoryHandle(child.name, { create: true });
@@ -9033,6 +9228,7 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
9033
9228
  const fileHandle = await parentHandle.getFileHandle(child.name, { create: true });
9034
9229
  const writable = await fileHandle.createWritable();
9035
9230
  await child.getData({ writable }, Object.assign({}, options, {
9231
+ signal,
9036
9232
  onprogress: async progress => {
9037
9233
  if (options.onprogress) {
9038
9234
  writtenSizes.set(child.id, progress);
@@ -9044,9 +9240,19 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
9044
9240
  }
9045
9241
  }
9046
9242
  }));
9243
+ exportedEntryNames.push(child.getRelativeName(zipEntry));
9047
9244
  }
9048
9245
  } catch (error) {
9049
- throw new Error(error.message + (child ? " (" + child.name + ")" : ""), { cause: error });
9246
+ abortController.abort(new Error(ERR_ABORT_EXPORT));
9247
+ try {
9248
+ if (error.entryName === UNDEFINED_VALUE) {
9249
+ error.entryName = child.getRelativeName(zipEntry);
9250
+ error.entryId = child.id;
9251
+ }
9252
+ } catch {
9253
+ // ignored
9254
+ }
9255
+ throw error;
9050
9256
  }
9051
9257
  }
9052
9258
  }
@@ -9249,12 +9455,17 @@ exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
9249
9455
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
9250
9456
  exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
9251
9457
  exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
9458
+ exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
9252
9459
  exports.ERR_INVALID_GID = ERR_INVALID_GID;
9460
+ exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
9461
+ exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
9253
9462
  exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
9254
9463
  exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
9255
9464
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
9465
+ exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
9256
9466
  exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
9257
9467
  exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
9468
+ exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
9258
9469
  exports.ERR_INVALID_UID = ERR_INVALID_UID;
9259
9470
  exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
9260
9471
  exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
@@ -9269,6 +9480,7 @@ exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
9269
9480
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
9270
9481
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
9271
9482
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
9483
+ exports.ERR_UNSAFE_FILENAME = ERR_UNSAFE_FILENAME;
9272
9484
  exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
9273
9485
  exports.ERR_UNSUPPORTED_CONTEXT = ERR_UNSUPPORTED_CONTEXT;
9274
9486
  exports.ERR_UNSUPPORTED_CRYPTO_API = ERR_UNSUPPORTED_CRYPTO_API;