@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.
@@ -4,7 +4,7 @@
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.zip = {}));
5
5
  })(this, (function (exports) { 'use strict';
6
6
 
7
- const { Array, Object, String, Number, BigInt, Math, Date, Map, Set, Response, URL, Error, Uint8Array, Uint16Array, Uint32Array, DataView, Blob, Promise, TextEncoder, TextDecoder, document, crypto, btoa, TransformStream, ReadableStream, WritableStream, CompressionStream, DecompressionStream, navigator, Worker } = typeof globalThis !== 'undefined' ? globalThis : this || self;
7
+ const { Array, Object, String, Number, BigInt, Math, Date, Map, Set, Response, URL, Error, Uint8Array, Uint16Array, Uint32Array, DataView, Blob, Promise, TextEncoder, TextDecoder, document, crypto, btoa, TransformStream, ReadableStream, WritableStream, CompressionStream, DecompressionStream, navigator, Worker, Symbol, setTimeout, clearTimeout, structuredClone } = typeof globalThis !== 'undefined' ? globalThis : this || self;
8
8
 
9
9
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
10
10
  /*
@@ -117,6 +117,8 @@
117
117
  const UNDEFINED_TYPE = "undefined";
118
118
  const FUNCTION_TYPE = "function";
119
119
  const OBJECT_TYPE = "object";
120
+ const STRING_TYPE = "string";
121
+ const NUMBER_TYPE = "number";
120
122
 
121
123
  const EMPTY_UINT8_ARRAY = new Uint8Array();
122
124
 
@@ -248,7 +250,7 @@
248
250
  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;
249
251
 
250
252
  /*
251
- Copyright (c) 2025 Gildas Lormeau. All rights reserved.
253
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
252
254
 
253
255
  Redistribution and use in source and binary forms, with or without
254
256
  modification, are permitted provided that the following conditions are met:
@@ -276,72 +278,19 @@
276
278
  */
277
279
 
278
280
 
279
- const ERR_INVALID_CODEC_DEFINITION = "Invalid codec definition";
280
- const ERR_RESERVED_COMPRESSION_METHOD = "Reserved compression method";
281
- const ERR_INVALID_CODEC_MODULE = "Invalid codec module";
282
-
283
- const STRING_TYPE = "string";
284
- const RESERVED_COMPRESSION_METHODS = [
285
- COMPRESSION_METHOD_STORE,
286
- COMPRESSION_METHOD_DEFLATE,
287
- COMPRESSION_METHOD_DEFLATE_64,
288
- COMPRESSION_METHOD_AES
289
- ];
290
-
291
- const registeredCodecs = new Map();
292
- const codecStreams = new Map();
293
-
294
- function registerCodec(codec = {}) {
295
- const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
296
- if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
297
- typeof format != STRING_TYPE || !format.length) {
298
- throw new Error(ERR_INVALID_CODEC_DEFINITION);
299
- }
300
- if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
301
- throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
302
- }
303
- const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
304
- if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
305
- throw new Error(ERR_INVALID_CODEC_DEFINITION);
306
- }
307
- registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
308
- if (hasStreams) {
309
- setCodecStreams(format, { CompressionStream, DecompressionStream });
310
- }
311
- }
312
-
313
- function unregisterCodec(compressionMethod) {
314
- const codec = registeredCodecs.get(compressionMethod);
315
- if (codec) {
316
- registeredCodecs.delete(compressionMethod);
317
- let formatUsed;
318
- registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
319
- if (!formatUsed) {
320
- codecStreams.delete(codec.format);
321
- }
322
- }
323
- }
324
-
325
- function getRegisteredCodec(compressionMethod) {
326
- return registeredCodecs.get(compressionMethod);
327
- }
328
-
329
- function getCodecStreams(format) {
330
- return codecStreams.get(format);
281
+ function concat(first, second) {
282
+ const result = new Uint8Array(first.length + second.length);
283
+ result.set(first);
284
+ result.set(second, first.length);
285
+ return result;
331
286
  }
332
287
 
333
- function setCodecStreams(format, streams) {
334
- const { CompressionStream, DecompressionStream } = streams;
335
- if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
336
- throw new Error(ERR_INVALID_CODEC_MODULE);
337
- }
338
- codecStreams.set(format, { CompressionStream, DecompressionStream });
288
+ function toExactUint8Array(array) {
289
+ return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
339
290
  }
340
291
 
341
- async function ensureCodecStreams(format, codecURI) {
342
- if (!codecStreams.has(format) && codecURI) {
343
- setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
344
- }
292
+ function getDataView(array) {
293
+ return new DataView(array.buffer, array.byteOffset, array.byteLength);
345
294
  }
346
295
 
347
296
  /*
@@ -526,50 +475,6 @@
526
475
  }
527
476
  }
528
477
 
529
- /*
530
- Copyright (c) 2026 Gildas Lormeau. All rights reserved.
531
-
532
- Redistribution and use in source and binary forms, with or without
533
- modification, are permitted provided that the following conditions are met:
534
-
535
- 1. Redistributions of source code must retain the above copyright notice,
536
- this list of conditions and the following disclaimer.
537
-
538
- 2. Redistributions in binary form must reproduce the above copyright
539
- notice, this list of conditions and the following disclaimer in
540
- the documentation and/or other materials provided with the distribution.
541
-
542
- 3. The names of the authors may not be used to endorse or promote products
543
- derived from this software without specific prior written permission.
544
-
545
- THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
546
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
547
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
548
- INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
549
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
550
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
551
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
552
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
553
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
554
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
555
- */
556
-
557
-
558
- function concat(first, second) {
559
- const result = new Uint8Array(first.length + second.length);
560
- result.set(first);
561
- result.set(second, first.length);
562
- return result;
563
- }
564
-
565
- function toExactUint8Array(array) {
566
- return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
567
- }
568
-
569
- function getDataView(array) {
570
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
571
- }
572
-
573
478
  // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
574
479
 
575
480
  // deno-lint-ignore-file no-this-alias
@@ -1939,6 +1844,102 @@
1939
1844
  });
1940
1845
  }
1941
1846
 
1847
+ /*
1848
+ Copyright (c) 2025 Gildas Lormeau. All rights reserved.
1849
+
1850
+ Redistribution and use in source and binary forms, with or without
1851
+ modification, are permitted provided that the following conditions are met:
1852
+
1853
+ 1. Redistributions of source code must retain the above copyright notice,
1854
+ this list of conditions and the following disclaimer.
1855
+
1856
+ 2. Redistributions in binary form must reproduce the above copyright
1857
+ notice, this list of conditions and the following disclaimer in
1858
+ the documentation and/or other materials provided with the distribution.
1859
+
1860
+ 3. The names of the authors may not be used to endorse or promote products
1861
+ derived from this software without specific prior written permission.
1862
+
1863
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
1864
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
1865
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
1866
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
1867
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1868
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
1869
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
1870
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
1871
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
1872
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1873
+ */
1874
+
1875
+
1876
+ const ERR_INVALID_CODEC_DEFINITION = "Invalid codec definition";
1877
+ const ERR_RESERVED_COMPRESSION_METHOD = "Reserved compression method";
1878
+ const ERR_INVALID_CODEC_MODULE = "Invalid codec module";
1879
+
1880
+ const RESERVED_COMPRESSION_METHODS = [
1881
+ COMPRESSION_METHOD_STORE,
1882
+ COMPRESSION_METHOD_DEFLATE,
1883
+ COMPRESSION_METHOD_DEFLATE_64,
1884
+ COMPRESSION_METHOD_AES
1885
+ ];
1886
+
1887
+ const registeredCodecs = new Map();
1888
+ const codecStreams = new Map();
1889
+
1890
+ function registerCodec(codec = {}) {
1891
+ const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
1892
+ if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
1893
+ typeof format != STRING_TYPE || !format.length) {
1894
+ throw new Error(ERR_INVALID_CODEC_DEFINITION);
1895
+ }
1896
+ if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
1897
+ throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
1898
+ }
1899
+ const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
1900
+ if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
1901
+ throw new Error(ERR_INVALID_CODEC_DEFINITION);
1902
+ }
1903
+ registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
1904
+ if (hasStreams) {
1905
+ setCodecStreams(format, { CompressionStream, DecompressionStream });
1906
+ }
1907
+ }
1908
+
1909
+ function unregisterCodec(compressionMethod) {
1910
+ const codec = registeredCodecs.get(compressionMethod);
1911
+ if (codec) {
1912
+ registeredCodecs.delete(compressionMethod);
1913
+ let formatUsed;
1914
+ registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
1915
+ if (!formatUsed) {
1916
+ codecStreams.delete(codec.format);
1917
+ }
1918
+ }
1919
+ }
1920
+
1921
+ function getRegisteredCodec(compressionMethod) {
1922
+ return registeredCodecs.get(compressionMethod);
1923
+ }
1924
+
1925
+ function getCodecStreams(format) {
1926
+ return codecStreams.get(format);
1927
+ }
1928
+
1929
+ function setCodecStreams(format, streams) {
1930
+ const { CompressionStream, DecompressionStream } = streams;
1931
+ if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
1932
+ throw new Error(ERR_INVALID_CODEC_MODULE);
1933
+ }
1934
+ codecStreams.set(format, { CompressionStream, DecompressionStream });
1935
+ }
1936
+
1937
+ async function ensureCodecStreams(format, codecURI) {
1938
+ if (!codecStreams.has(format) && codecURI) {
1939
+ setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
1940
+ }
1941
+ }
1942
+
1942
1943
  /*
1943
1944
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
1944
1945
 
@@ -2492,8 +2493,8 @@
2492
2493
  1. Redistributions of source code must retain the above copyright notice,
2493
2494
  this list of conditions and the following disclaimer.
2494
2495
 
2495
- 2. Redistributions in binary form must reproduce the above copyright
2496
- notice, this list of conditions and the following disclaimer in
2496
+ 2. Redistributions in binary form must reproduce the above copyright
2497
+ notice, this list of conditions and the following disclaimer in
2497
2498
  the documentation and/or other materials provided with the distribution.
2498
2499
 
2499
2500
  3. The names of the authors may not be used to endorse or promote products
@@ -2512,20 +2513,15 @@
2512
2513
  */
2513
2514
 
2514
2515
 
2515
- const MODULE_WORKER_OPTIONS = { type: "module" };
2516
- const ERROR_EVENT_TYPE = "error";
2517
- const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
2518
2516
  const ERR_WORKER_STARTUP_TIMEOUT = "Worker startup timeout";
2519
2517
 
2520
- let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions, createWorkerFailed;
2521
- let transferStreamsSupported = true;
2522
- try {
2523
- transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
2524
- } catch {
2525
- // ignored
2526
- }
2518
+ let webWorkerSupported, createWorkerFailed, webWorkerBackend;
2527
2519
  let initModule = () => { };
2528
2520
 
2521
+ function setWebWorkerBackend(backend) {
2522
+ webWorkerBackend = backend;
2523
+ }
2524
+
2529
2525
  async function supportsDeflate(config) {
2530
2526
  const { CompressionStream: NativeStream, CompressionStreamFallback: FallbackStream } = config;
2531
2527
  if (FallbackStream && !FallbackStream.requiresModule) {
@@ -2550,6 +2546,14 @@
2550
2546
  createWorkerFailed = false;
2551
2547
  }
2552
2548
 
2549
+ function disableWebWorker(workerData) {
2550
+ if (workerData.createWorker) {
2551
+ createWorkerFailed = true;
2552
+ } else {
2553
+ webWorkerSupported = false;
2554
+ }
2555
+ }
2556
+
2553
2557
  class CodecWorker {
2554
2558
 
2555
2559
  constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI, createWorker }, onTaskFinished) {
@@ -2602,7 +2606,7 @@
2602
2606
  // deno-lint-ignore valid-typeof
2603
2607
  webWorkerSupported = typeof Worker != UNDEFINED_TYPE;
2604
2608
  }
2605
- return (useWebWorkers && ((webWorkerSupported && workerURI) || createWorker) ? createWebWorkerInterface : createWorkerInterface)(workerData, config);
2609
+ return (useWebWorkers && webWorkerBackend && ((webWorkerSupported && workerURI) || createWorker) ? webWorkerBackend : createWorkerInterface)(workerData, config);
2606
2610
  }
2607
2611
  }
2608
2612
 
@@ -2646,60 +2650,6 @@
2646
2650
  };
2647
2651
  }
2648
2652
 
2649
- function createWebWorkerInterface(workerData, config) {
2650
- const { baseURI, chunkSize, workerStartupTimeout } = config;
2651
- let { wasmURI } = config;
2652
-
2653
- if (!workerData.interface) {
2654
- // deno-lint-ignore valid-typeof
2655
- if (typeof wasmURI == FUNCTION_TYPE) {
2656
- wasmURI = wasmURI();
2657
- }
2658
- let worker;
2659
- try {
2660
- worker = getWebWorker(workerData.workerURI, baseURI, workerData);
2661
- } catch {
2662
- if (workerData.createWorker) {
2663
- createWorkerFailed = true;
2664
- } else {
2665
- webWorkerSupported = false;
2666
- }
2667
- return createWorkerInterface(workerData, config);
2668
- }
2669
- Object.assign(workerData, {
2670
- worker,
2671
- workerAlive: false,
2672
- terminated: false,
2673
- interface: {
2674
- run: async () => {
2675
- try {
2676
- return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
2677
- } catch (error) {
2678
- if (error && error.workerStartupFailed) {
2679
- if (workerData.createWorker) {
2680
- createWorkerFailed = true;
2681
- } else {
2682
- webWorkerSupported = false;
2683
- }
2684
- releaseWorkerStreams(workerData);
2685
- return runWorker$1(workerData, config);
2686
- }
2687
- if (error && error.codecImportFailed) {
2688
- if (workerData.reader) {
2689
- releaseWorkerStreams(workerData);
2690
- return runWorker$1(workerData, config);
2691
- }
2692
- workerData.onTaskFinished();
2693
- }
2694
- throw error;
2695
- }
2696
- }
2697
- }
2698
- });
2699
- }
2700
- return workerData.interface;
2701
- }
2702
-
2703
2653
  async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
2704
2654
  let codecStream;
2705
2655
  try {
@@ -2748,6 +2698,95 @@
2748
2698
  }
2749
2699
  }
2750
2700
 
2701
+ /*
2702
+ Copyright (c) 2025 Gildas Lormeau. All rights reserved.
2703
+
2704
+ Redistribution and use in source and binary forms, with or without
2705
+ modification, are permitted provided that the following conditions are met:
2706
+
2707
+ 1. Redistributions of source code must retain the above copyright notice,
2708
+ this list of conditions and the following disclaimer.
2709
+
2710
+ 2. Redistributions in binary form must reproduce the above copyright
2711
+ notice, this list of conditions and the following disclaimer in
2712
+ the documentation and/or other materials provided with the distribution.
2713
+
2714
+ 3. The names of the authors may not be used to endorse or promote products
2715
+ derived from this software without specific prior written permission.
2716
+
2717
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
2718
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
2719
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
2720
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
2721
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2722
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
2723
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2724
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2725
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
2726
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2727
+ */
2728
+
2729
+
2730
+ const MODULE_WORKER_OPTIONS = { type: "module" };
2731
+ const ERROR_EVENT_TYPE = "error";
2732
+ const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
2733
+
2734
+ let webWorkerSource, webWorkerURI, webWorkerOptions;
2735
+ let transferStreamsSupported = true;
2736
+ try {
2737
+ transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
2738
+ } catch {
2739
+ // ignored
2740
+ }
2741
+
2742
+ setWebWorkerBackend(createWebWorkerInterface);
2743
+
2744
+ function createWebWorkerInterface(workerData, config) {
2745
+ const { baseURI, chunkSize, workerStartupTimeout } = config;
2746
+ let { wasmURI } = config;
2747
+
2748
+ if (!workerData.interface) {
2749
+ // deno-lint-ignore valid-typeof
2750
+ if (typeof wasmURI == FUNCTION_TYPE) {
2751
+ wasmURI = wasmURI();
2752
+ }
2753
+ let worker;
2754
+ try {
2755
+ worker = getWebWorker(workerData.workerURI, baseURI, workerData);
2756
+ } catch {
2757
+ disableWebWorker(workerData);
2758
+ return createWorkerInterface(workerData, config);
2759
+ }
2760
+ Object.assign(workerData, {
2761
+ worker,
2762
+ workerAlive: false,
2763
+ terminated: false,
2764
+ interface: {
2765
+ run: async () => {
2766
+ try {
2767
+ return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
2768
+ } catch (error) {
2769
+ if (error && error.workerStartupFailed) {
2770
+ disableWebWorker(workerData);
2771
+ releaseWorkerStreams(workerData);
2772
+ return runWorker$1(workerData, config);
2773
+ }
2774
+ if (error && error.codecImportFailed) {
2775
+ if (workerData.reader) {
2776
+ releaseWorkerStreams(workerData);
2777
+ return runWorker$1(workerData, config);
2778
+ }
2779
+ workerData.onTaskFinished();
2780
+ }
2781
+ throw error;
2782
+ }
2783
+ }
2784
+ }
2785
+ });
2786
+ }
2787
+ return workerData.interface;
2788
+ }
2789
+
2751
2790
  async function runWebWorker(workerData, config) {
2752
2791
  let resolveResult, rejectResult;
2753
2792
  const result = new Promise((resolve, reject) => {
@@ -3624,7 +3663,7 @@
3624
3663
  forceRangeRequests,
3625
3664
  combineSizeEocd
3626
3665
  } = httpReader;
3627
- if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == "undefined" || preventHeadRequest)) {
3666
+ if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
3628
3667
  const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -END_OF_CENTRAL_DIR_LENGTH : undefined));
3629
3668
  const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
3630
3669
  if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
@@ -4477,9 +4516,13 @@
4477
4516
  const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
4478
4517
  const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
4479
4518
  const OPTION_STRICTNESS = "strictness";
4519
+ const OPTION_FILENAME_VALIDATION = "filenameValidation";
4520
+ const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
4480
4521
  const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
4481
4522
  const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
4482
4523
  const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
4524
+ const TEXT_TYPE_FILENAME = "filename";
4525
+ const TEXT_TYPE_COMMENT = "comment";
4483
4526
  const STRICTNESS_STRICT = "strict";
4484
4527
  const STRICTNESS_BALANCED = "balanced";
4485
4528
  const STRICTNESS_TOLERANT = "tolerant";
@@ -4526,6 +4569,11 @@
4526
4569
  const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
4527
4570
  const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
4528
4571
  const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
4572
+ const ERR_UNSAFE_FILENAME = "Unsafe filename";
4573
+ const ERR_INVALID_STRICTNESS = "Invalid strictness (must be 'strict', 'balanced' or 'tolerant')";
4574
+ const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
4575
+ const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
4576
+ const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
4529
4577
  const CHARSET_UTF8 = "utf-8";
4530
4578
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
4531
4579
  const CHARSET_CP437 = "cp437";
@@ -4547,6 +4595,10 @@
4547
4595
  bytes: 8
4548
4596
  }
4549
4597
  };
4598
+ const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
4599
+ const CENTRAL_DIRECTORY_UNREACHABLE = 0;
4600
+ const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
4601
+ const CENTRAL_DIRECTORY_REACHABLE = 2;
4550
4602
 
4551
4603
  class ZipReader {
4552
4604
 
@@ -4575,6 +4627,8 @@
4575
4627
  const checkAmbiguity = strictness == STRICTNESS_STRICT;
4576
4628
  const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
4577
4629
  const maxAppendedDataSize = getMaxAppendedDataSize(getOptionValue$1(zipReader, options, OPTION_MAX_APPENDED_DATA_SIZE), strictness);
4630
+ const filenameValidation = getFilenameValidation(getOptionValue$1(zipReader, options, OPTION_FILENAME_VALIDATION), strictness);
4631
+ const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
4578
4632
  const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
4579
4633
  if (!endOfDirectoryInfo) {
4580
4634
  const signatureArray = await readUint8Array(reader, 0, 4);
@@ -4768,11 +4822,22 @@
4768
4822
  const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
4769
4823
  const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
4770
4824
  const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
4771
- let filename = decode(rawFilename, rawFilenameEncoding);
4825
+ let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
4772
4826
  if (filename === UNDEFINED_VALUE) {
4773
4827
  filename = decodeText(rawFilename, rawFilenameEncoding);
4774
4828
  }
4775
- let comment = decode(rawComment, rawCommentEncoding);
4829
+ if (normalizeFilename) {
4830
+ const normalizedFilename = normalizeFilename(filename);
4831
+ if (normalizedFilename !== UNDEFINED_VALUE) {
4832
+ filename = normalizedFilename;
4833
+ }
4834
+ }
4835
+ if (isUnsafeFilename(filename, filenameValidation)) {
4836
+ const error = new Error(ERR_UNSAFE_FILENAME);
4837
+ error.filename = filename;
4838
+ throw error;
4839
+ }
4840
+ let comment = decode(rawComment, rawCommentEncoding, TEXT_TYPE_COMMENT);
4776
4841
  if (comment === UNDEFINED_VALUE) {
4777
4842
  comment = decodeText(rawComment, rawCommentEncoding);
4778
4843
  }
@@ -4833,10 +4898,10 @@
4833
4898
  entry.getData = (writer, options) => fileEntry.getData(writer, entry, zipReader.readRanges, options);
4834
4899
  entry.arrayBuffer = async options => {
4835
4900
  const writer = new TransformStream();
4836
- const [arrayBuffer] = await Promise.all([
4837
- streamToBlob(writer.readable).then(blob => blob.arrayBuffer()),
4838
- fileEntry.getData(writer, entry, zipReader.readRanges, options)]);
4839
- return arrayBuffer;
4901
+ const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
4902
+ arrayBufferPromise.catch(() => { });
4903
+ await fileEntry.getData(writer, entry, zipReader.readRanges, options);
4904
+ return arrayBufferPromise;
4840
4905
  };
4841
4906
  offset = endOffset;
4842
4907
  const { onprogress } = options;
@@ -5087,7 +5152,7 @@
5087
5152
  readRanges
5088
5153
  });
5089
5154
  }
5090
- let writable;
5155
+ let writable, abortError;
5091
5156
  try {
5092
5157
  if (!checkOverlappingEntryOnly) {
5093
5158
  if (checkPasswordOnly) {
@@ -5107,12 +5172,22 @@
5107
5172
  writer.size += error.outputSize;
5108
5173
  }
5109
5174
  if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
5175
+ abortError = error;
5110
5176
  throw error;
5111
5177
  }
5112
5178
  } finally {
5113
5179
  const preventClose = getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
5114
5180
  if (!preventClose && writable && !writable.locked) {
5115
- await writable.getWriter().close();
5181
+ const writableWriter = writable.getWriter();
5182
+ if (abortError) {
5183
+ try {
5184
+ await writableWriter.abort(abortError);
5185
+ } catch {
5186
+ // the error being propagated is more relevant; ignored
5187
+ }
5188
+ } else {
5189
+ await writableWriter.close();
5190
+ }
5116
5191
  }
5117
5192
  }
5118
5193
  return checkPasswordOnly || checkOverlappingEntryOnly ? UNDEFINED_VALUE : writer.getData ? writer.getData() : writable;
@@ -5492,16 +5567,51 @@
5492
5567
  return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
5493
5568
  }
5494
5569
 
5570
+ function isStrictnessValue(value) {
5571
+ return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
5572
+ }
5573
+
5495
5574
  function getStrictness(strictness, checkAmbiguity) {
5496
5575
  if (strictness === UNDEFINED_VALUE) {
5497
5576
  return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
5498
5577
  }
5578
+ if (!isStrictnessValue(strictness)) {
5579
+ throw new Error(ERR_INVALID_STRICTNESS);
5580
+ }
5499
5581
  return strictness;
5500
5582
  }
5501
5583
 
5584
+ function getFilenameValidation(filenameValidation, strictness) {
5585
+ if (filenameValidation === UNDEFINED_VALUE) {
5586
+ return strictness;
5587
+ }
5588
+ if (!isStrictnessValue(filenameValidation)) {
5589
+ throw new Error(ERR_INVALID_FILENAME_VALIDATION);
5590
+ }
5591
+ return filenameValidation;
5592
+ }
5593
+
5594
+ function isUnsafeFilename(filename, filenameValidation) {
5595
+ if (filenameValidation == STRICTNESS_TOLERANT) {
5596
+ return false;
5597
+ }
5598
+ const pathParts = filename.split("/");
5599
+ if (pathParts.length > 1 && pathParts[pathParts.length - 1] === "") {
5600
+ pathParts.pop();
5601
+ }
5602
+ if (pathParts.includes("..") || filename.startsWith("/") || filename.startsWith("\\\\") || DRIVE_LETTER_REGEXP.test(filename)) {
5603
+ return true;
5604
+ }
5605
+ return filenameValidation == STRICTNESS_STRICT && (pathParts.includes(".") || pathParts.includes(""));
5606
+ }
5607
+
5502
5608
  function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
5503
5609
  if (maxAppendedDataSize !== UNDEFINED_VALUE) {
5504
- return maxAppendedDataSize;
5610
+ const size = toNumber$1(maxAppendedDataSize);
5611
+ if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
5612
+ throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
5613
+ }
5614
+ return size;
5505
5615
  }
5506
5616
  if (strictness == STRICTNESS_STRICT) {
5507
5617
  return 0;
@@ -5512,12 +5622,6 @@
5512
5622
  return MAX_16_BITS;
5513
5623
  }
5514
5624
 
5515
- const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
5516
-
5517
- const CENTRAL_DIRECTORY_UNREACHABLE = 0;
5518
- const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
5519
- const CENTRAL_DIRECTORY_REACHABLE = 2;
5520
-
5521
5625
  async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
5522
5626
  const { size } = reader;
5523
5627
  const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
@@ -5653,6 +5757,10 @@
5653
5757
  return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
5654
5758
  }
5655
5759
 
5760
+ function toNumber$1(value) {
5761
+ return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
5762
+ }
5763
+
5656
5764
  function getDate(timeRaw) {
5657
5765
  const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
5658
5766
  return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
@@ -5691,12 +5799,16 @@
5691
5799
  ERR_INVALID_AUTHENTICATION_CODE: ERR_INVALID_AUTHENTICATION_CODE,
5692
5800
  ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
5693
5801
  ERR_INVALID_CRC32: ERR_INVALID_CRC32,
5802
+ ERR_INVALID_FILENAME_VALIDATION: ERR_INVALID_FILENAME_VALIDATION,
5803
+ ERR_INVALID_MAX_APPENDED_DATA_SIZE: ERR_INVALID_MAX_APPENDED_DATA_SIZE,
5694
5804
  ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
5695
5805
  ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
5806
+ ERR_INVALID_STRICTNESS: ERR_INVALID_STRICTNESS,
5696
5807
  ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
5697
5808
  ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
5698
5809
  ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
5699
5810
  ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
5811
+ ERR_UNSAFE_FILENAME: ERR_UNSAFE_FILENAME,
5700
5812
  ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
5701
5813
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
5702
5814
  ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
@@ -5758,6 +5870,8 @@
5758
5870
  const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
5759
5871
  const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
5760
5872
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
5873
+ const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
5874
+ const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
5761
5875
  const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
5762
5876
 
5763
5877
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
@@ -5765,6 +5879,7 @@
5765
5879
  const VENDOR_VERSION_AE_1 = 1;
5766
5880
  const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
5767
5881
  const UNIX_EXTRA_FIELD_TYPE = "unix";
5882
+ const MAX_LEVEL = 9;
5768
5883
 
5769
5884
  let workers = 0;
5770
5885
  const pendingEntries = [];
@@ -5927,7 +6042,8 @@
5927
6042
 
5928
6043
  remove(entry) {
5929
6044
  const { filenames, files } = this;
5930
- if (typeof entry == "string") {
6045
+ // deno-lint-ignore valid-typeof
6046
+ if (typeof entry == STRING_TYPE) {
5931
6047
  entry = files.get(entry);
5932
6048
  }
5933
6049
  if (entry && entry.filename !== UNDEFINED_VALUE) {
@@ -6065,20 +6181,20 @@
6065
6181
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6066
6182
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
6067
6183
  const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
6068
- const uid = getOptionValue(zipWriter, options, PROPERTY_NAME_UID);
6069
- const gid = getOptionValue(zipWriter, options, PROPERTY_NAME_GID);
6070
- let unixMode = getOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
6184
+ const uid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UID);
6185
+ const gid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_GID);
6186
+ let unixMode = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
6071
6187
  let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
6072
6188
  let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
6073
6189
  let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
6074
6190
  let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
6075
- if (uid !== UNDEFINED_VALUE && (uid < 0 || uid > MAX_32_BITS)) {
6191
+ if (uid !== UNDEFINED_VALUE && (!Number.isInteger(uid) || uid < 0 || uid > MAX_32_BITS)) {
6076
6192
  throw new Error(ERR_INVALID_UID);
6077
6193
  }
6078
- if (gid !== UNDEFINED_VALUE && (gid < 0 || gid > MAX_32_BITS)) {
6194
+ if (gid !== UNDEFINED_VALUE && (!Number.isInteger(gid) || gid < 0 || gid > MAX_32_BITS)) {
6079
6195
  throw new Error(ERR_INVALID_GID);
6080
6196
  }
6081
- if (unixMode !== UNDEFINED_VALUE && (unixMode < 0 || unixMode > MAX_16_BITS)) {
6197
+ if (unixMode !== UNDEFINED_VALUE && (!Number.isInteger(unixMode) || unixMode < 0 || unixMode > MAX_16_BITS)) {
6082
6198
  throw new Error(ERR_INVALID_UNIX_MODE);
6083
6199
  }
6084
6200
  if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
@@ -6190,7 +6306,7 @@
6190
6306
 
6191
6307
  function resolveMetadata(zipWriter, name, options) {
6192
6308
  const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
6193
- let rawFilename = encode(name);
6309
+ let rawFilename = encode(name, TEXT_TYPE_FILENAME);
6194
6310
  if (rawFilename === UNDEFINED_VALUE) {
6195
6311
  rawFilename = encodeText(name);
6196
6312
  }
@@ -6198,7 +6314,7 @@
6198
6314
  throw new Error(ERR_INVALID_ENTRY_NAME);
6199
6315
  }
6200
6316
  const comment = options[PROPERTY_NAME_COMMENT] || "";
6201
- let rawComment = encode(comment);
6317
+ let rawComment = encode(comment, TEXT_TYPE_COMMENT);
6202
6318
  if (rawComment === UNDEFINED_VALUE) {
6203
6319
  rawComment = encodeText(comment);
6204
6320
  }
@@ -6218,8 +6334,11 @@
6218
6334
  if (!passThrough) {
6219
6335
  password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
6220
6336
  rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
6337
+ if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
6338
+ throw new Error(ERR_INVALID_PASSWORD_TYPE);
6339
+ }
6221
6340
  }
6222
- const encryptionStrength = getOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
6341
+ const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
6223
6342
  const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
6224
6343
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
6225
6344
  const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
@@ -6237,7 +6356,10 @@
6237
6356
  compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
6238
6357
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
6239
6358
  }
6240
- let level = getOptionValue(zipWriter, options, OPTION_LEVEL);
6359
+ let level = getNumberOptionValue(zipWriter, options, OPTION_LEVEL);
6360
+ if (level !== UNDEFINED_VALUE && (!Number.isInteger(level) || level < 0 || level > MAX_LEVEL)) {
6361
+ throw new Error(ERR_INVALID_LEVEL);
6362
+ }
6241
6363
  if (zipWriter.options[OPTION_USDZ]) {
6242
6364
  if (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) {
6243
6365
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION_USDZ);
@@ -6258,7 +6380,7 @@
6258
6380
  useCompressionStream = false;
6259
6381
  }
6260
6382
  const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
6261
- if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
6383
+ if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(Number.isInteger(encryptionStrength) && encryptionStrength >= 1 && encryptionStrength <= 3)) {
6262
6384
  throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
6263
6385
  }
6264
6386
  const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
@@ -7452,6 +7574,14 @@
7452
7574
  return result === UNDEFINED_VALUE ? defaultValue : result;
7453
7575
  }
7454
7576
 
7577
+ function getNumberOptionValue(zipWriter, options, name, defaultValue) {
7578
+ return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
7579
+ }
7580
+
7581
+ function toNumber(value) {
7582
+ return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
7583
+ }
7584
+
7455
7585
  function getMaximumCompressedSize(uncompressedSize) {
7456
7586
  return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
7457
7587
  }
@@ -8104,6 +8234,7 @@
8104
8234
 
8105
8235
  const ERR_ENTRY_EXISTS = "Entry filename already exists";
8106
8236
  const ERR_READABLE_CONSUMED = "Readable stream already consumed";
8237
+ const ERR_ABORT_EXPORT = "zipjs-abort-export";
8107
8238
  const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
8108
8239
  const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
8109
8240
  EXTRAFIELD_TYPE_ZIP64,
@@ -8212,8 +8343,9 @@
8212
8343
  const uncompressedSize = zipEntry.data ? zipEntry.data.uncompressedSize : reader.size;
8213
8344
  await Promise.all([initStream(reader), initStream(writer, uncompressedSize)]);
8214
8345
  const { readable } = reader;
8346
+ const { signal } = options;
8215
8347
  zipEntry.uncompressedSize = reader.size;
8216
- await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable));
8348
+ await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable), { signal });
8217
8349
  return writer.getData ? writer.getData() : writer.writable;
8218
8350
  }
8219
8351
  }
@@ -8480,7 +8612,7 @@
8480
8612
  for (const entry of entries) {
8481
8613
  let parent = this;
8482
8614
  try {
8483
- const path = entry.filename.split("/");
8615
+ const path = entry.filename.split("/").filter(pathPart => pathPart != "" && pathPart != ".");
8484
8616
  const name = path.pop();
8485
8617
  path.forEach(pathPart => {
8486
8618
  const previousParent = parent;
@@ -8855,6 +8987,39 @@
8855
8987
  }
8856
8988
  }
8857
8989
 
8990
+ function forwardAbort(signal, abortController) {
8991
+ if (!signal) {
8992
+ return () => { };
8993
+ }
8994
+ if (signal.aborted) {
8995
+ abortController.abort(signal.reason);
8996
+ return () => { };
8997
+ }
8998
+ const abort = () => abortController.abort(signal.reason);
8999
+ signal.addEventListener("abort", abort, { once: true });
9000
+ return () => signal.removeEventListener("abort", abort);
9001
+ }
9002
+
9003
+ function isExportAborted(error) {
9004
+ return Boolean(error) && error.message == ERR_ABORT_EXPORT;
9005
+ }
9006
+
9007
+ function aggregateEntryErrors(errors) {
9008
+ const [error] = errors;
9009
+ const otherErrors = errors
9010
+ .slice(1)
9011
+ .flatMap(otherError => [otherError, ...(otherError && otherError.entryErrors || [])])
9012
+ .filter(otherError => otherError !== error);
9013
+ if (otherErrors.length) {
9014
+ try {
9015
+ error.entryErrors = [...(error.entryErrors || []), ...otherErrors];
9016
+ } catch {
9017
+ // ignored
9018
+ }
9019
+ }
9020
+ return error;
9021
+ }
9022
+
8858
9023
  function getUserExtraField(extraField) {
8859
9024
  if (extraField) {
8860
9025
  const userExtraField = new Map();
@@ -8975,8 +9140,9 @@
8975
9140
  function addFileSystemHandle(zipEntry, handle, options) {
8976
9141
  return addFile(zipEntry, handle, []);
8977
9142
 
8978
- async function addFile(parentEntry, handle, addedEntries) {
9143
+ async function addFile(parentEntry, handle, addedEntries, parentName = "") {
8979
9144
  if (handle) {
9145
+ const entryName = parentName ? parentName + "/" + handle.name : handle.name;
8980
9146
  try {
8981
9147
  if (handle.isFile || handle.isDirectory) {
8982
9148
  handle = await transformToFileSystemhandle(handle);
@@ -8998,12 +9164,18 @@
8998
9164
  const directoryEntry = parentEntry.addDirectory(handle.name);
8999
9165
  addedEntries.push(directoryEntry);
9000
9166
  for await (const childHandle of handle.values()) {
9001
- await addFile(directoryEntry, childHandle, addedEntries);
9167
+ await addFile(directoryEntry, childHandle, addedEntries, entryName);
9002
9168
  }
9003
9169
  }
9004
9170
  } catch (error) {
9005
- const message = error.message + (handle ? " (" + handle.name + ")" : "");
9006
- throw new Error(message, { cause: error });
9171
+ try {
9172
+ if (error.entryName === UNDEFINED_VALUE) {
9173
+ error.entryName = entryName;
9174
+ }
9175
+ } catch {
9176
+ // ignored
9177
+ }
9178
+ throw error;
9007
9179
  }
9008
9180
  }
9009
9181
  return addedEntries;
@@ -9013,15 +9185,32 @@
9013
9185
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
9014
9186
  const totalSize = getTotalSize([zipEntry], "uncompressedSize");
9015
9187
  const writtenSizes = new Map();
9016
- await exportChildren(zipEntry, directoryHandle);
9188
+ const abortController = new AbortController();
9189
+ const { signal } = abortController;
9190
+ const releaseSignal = forwardAbort(options.signal, abortController);
9191
+ const exportedEntryNames = [];
9192
+ try {
9193
+ await exportChildren(zipEntry, directoryHandle);
9194
+ } catch (error) {
9195
+ try {
9196
+ error.exportedEntryNames = exportedEntryNames;
9197
+ } catch {
9198
+ // ignored
9199
+ }
9200
+ throw error;
9201
+ } finally {
9202
+ releaseSignal();
9203
+ }
9017
9204
  return directoryHandle;
9018
9205
 
9019
9206
  async function exportChildren(entry, parentHandle) {
9020
9207
  if (options.concurrent) {
9021
9208
  const results = await Promise.allSettled(entry.children.map(child => exportChild(child, parentHandle)));
9022
- const failedResult = results.find(result => result.status == "rejected");
9023
- if (failedResult) {
9024
- throw failedResult.reason;
9209
+ const rejectedResults = results.filter(result => result.status == "rejected");
9210
+ if (rejectedResults.length) {
9211
+ const failedResults = rejectedResults.filter(result => !isExportAborted(result.reason));
9212
+ const reportedResults = failedResults.length ? failedResults : rejectedResults;
9213
+ throw aggregateEntryErrors(reportedResults.map(result => result.reason));
9025
9214
  }
9026
9215
  } else {
9027
9216
  for (const child of entry.children) {
@@ -9031,6 +9220,12 @@
9031
9220
  }
9032
9221
 
9033
9222
  async function exportChild(child, parentHandle) {
9223
+ if (signal.aborted) {
9224
+ if (isExportAborted(signal.reason)) {
9225
+ return;
9226
+ }
9227
+ throw signal.reason;
9228
+ }
9034
9229
  try {
9035
9230
  if (child.directory) {
9036
9231
  const childDirectoryHandle = await parentHandle.getDirectoryHandle(child.name, { create: true });
@@ -9039,6 +9234,7 @@
9039
9234
  const fileHandle = await parentHandle.getFileHandle(child.name, { create: true });
9040
9235
  const writable = await fileHandle.createWritable();
9041
9236
  await child.getData({ writable }, Object.assign({}, options, {
9237
+ signal,
9042
9238
  onprogress: async progress => {
9043
9239
  if (options.onprogress) {
9044
9240
  writtenSizes.set(child.id, progress);
@@ -9050,9 +9246,19 @@
9050
9246
  }
9051
9247
  }
9052
9248
  }));
9249
+ exportedEntryNames.push(child.getRelativeName(zipEntry));
9053
9250
  }
9054
9251
  } catch (error) {
9055
- throw new Error(error.message + (child ? " (" + child.name + ")" : ""), { cause: error });
9252
+ abortController.abort(new Error(ERR_ABORT_EXPORT));
9253
+ try {
9254
+ if (error.entryName === UNDEFINED_VALUE) {
9255
+ error.entryName = child.getRelativeName(zipEntry);
9256
+ error.entryId = child.id;
9257
+ }
9258
+ } catch {
9259
+ // ignored
9260
+ }
9261
+ throw error;
9056
9262
  }
9057
9263
  }
9058
9264
  }
@@ -9255,12 +9461,17 @@
9255
9461
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
9256
9462
  exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
9257
9463
  exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
9464
+ exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
9258
9465
  exports.ERR_INVALID_GID = ERR_INVALID_GID;
9466
+ exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
9467
+ exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
9259
9468
  exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
9260
9469
  exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
9261
9470
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
9471
+ exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
9262
9472
  exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
9263
9473
  exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
9474
+ exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
9264
9475
  exports.ERR_INVALID_UID = ERR_INVALID_UID;
9265
9476
  exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
9266
9477
  exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
@@ -9275,6 +9486,7 @@
9275
9486
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
9276
9487
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
9277
9488
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
9489
+ exports.ERR_UNSAFE_FILENAME = ERR_UNSAFE_FILENAME;
9278
9490
  exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
9279
9491
  exports.ERR_UNSUPPORTED_CONTEXT = ERR_UNSUPPORTED_CONTEXT;
9280
9492
  exports.ERR_UNSUPPORTED_CRYPTO_API = ERR_UNSUPPORTED_CRYPTO_API;