@zip.js/zip.js 2.11.4 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/deno.json +1 -1
  2. package/dist/zip-core-external.js +549 -139
  3. package/dist/zip-core-external.min.js +1 -1
  4. package/dist/zip-core.js +559 -136
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core-external.js +615 -260
  7. package/dist/zip-fs-core-external.min.js +1 -1
  8. package/dist/zip-fs-core.js +628 -257
  9. package/dist/zip-fs-core.min.js +1 -1
  10. package/dist/zip-fs-external.js +615 -260
  11. package/dist/zip-fs-external.min.js +1 -1
  12. package/dist/zip-fs-native.js +630 -259
  13. package/dist/zip-fs-native.min.js +1 -1
  14. package/dist/zip-fs.js +631 -260
  15. package/dist/zip-fs.min.js +1 -1
  16. package/dist/zip-legacy.js +561 -138
  17. package/dist/zip-legacy.min.js +1 -1
  18. package/dist/zip-native.js +561 -138
  19. package/dist/zip-native.min.js +1 -1
  20. package/dist/zip-web-worker-native.js +1 -1
  21. package/dist/zip-web-worker.js +1 -1
  22. package/dist/zip.js +562 -139
  23. package/dist/zip.min.js +1 -1
  24. package/index-native.cjs +630 -259
  25. package/index-native.min.js +1 -1
  26. package/index.cjs +631 -260
  27. package/index.d.cts +474 -59
  28. package/index.d.ts +474 -59
  29. package/index.min.js +1 -1
  30. package/lib/core/codec-worker-web.js +72 -22
  31. package/lib/core/codec-worker.js +18 -5
  32. package/lib/core/configuration.js +20 -5
  33. package/lib/core/constants.js +2 -0
  34. package/lib/core/io.js +13 -5
  35. package/lib/core/options.js +16 -0
  36. package/lib/core/streams/codec-stream.js +6 -0
  37. package/lib/core/util/error.js +35 -0
  38. package/lib/core/util/warnings.js +42 -0
  39. package/lib/core/version.js +1 -1
  40. package/lib/core/web-worker-base.js +46 -9
  41. package/lib/core/web-worker-inline-native.js +1 -1
  42. package/lib/core/web-worker-inline-wasm.js +1 -1
  43. package/lib/core/zip-entry.js +49 -1
  44. package/lib/core/zip-fs.js +45 -133
  45. package/lib/core/zip-reader.js +115 -52
  46. package/lib/core/zip-writer.js +244 -57
  47. package/lib/zip-core-base.js +9 -3
  48. package/lib/zip-core-reader.js +2 -0
  49. package/lib/zip-core-writer.js +6 -1
  50. package/lib/zip-module-wasm-base.js +2 -2
  51. package/package.json +5 -3
  52. package/worker-message-property-names.js +1 -1
@@ -134,6 +134,7 @@
134
134
  const BOOLEAN_TYPE = "boolean";
135
135
 
136
136
  const EMPTY_UINT8_ARRAY = new Uint8Array();
137
+ const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
137
138
 
138
139
  /*
139
140
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -178,6 +179,7 @@
178
179
  const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
179
180
  const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
180
181
  const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
182
+ const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
181
183
  const OPTION_CHECK_SIGNATURE = "checkSignature";
182
184
  const OPTION_CHECK_CRC32 = "checkCrc32";
183
185
  const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
@@ -208,15 +210,18 @@
208
210
  const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
209
211
  const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
210
212
  const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
213
+ const OPTION_ENTRY = "entry";
211
214
  const TEXT_TYPE_FILENAME = "filename";
212
215
  const TEXT_TYPE_COMMENT = "comment";
213
216
  const STRICTNESS_STRICT = "strict";
214
217
  const STRICTNESS_BALANCED = "balanced";
215
218
  const STRICTNESS_TOLERANT = "tolerant";
219
+ const PASS_THROUGH_COMPRESSED = "compressed";
216
220
 
217
221
  const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
218
222
  const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
219
223
  const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
224
+ const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
220
225
  const ERR_ABORTED = "The operation was aborted";
221
226
  const ABORT_ERROR_NAME = "AbortError";
222
227
 
@@ -246,6 +251,13 @@
246
251
  }
247
252
  }
248
253
 
254
+ function checkPassThroughOption(passThrough) {
255
+ if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
256
+ throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
257
+ }
258
+ return passThrough;
259
+ }
260
+
249
261
  function checkInteger(value, maxValue, errorMessage) {
250
262
  if (!Number.isInteger(value) || value < 0 || value > maxValue) {
251
263
  throw new Error(errorMessage);
@@ -295,6 +307,8 @@
295
307
  const MINIMUM_CHUNK_SIZE = 64;
296
308
  const MINIMUM_PROPERTY_VALUE = 1;
297
309
  const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
310
+ const ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
311
+ const ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
298
312
  let maxWorkers = 2;
299
313
  try {
300
314
  if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
@@ -319,9 +333,9 @@
319
333
  };
320
334
 
321
335
  const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
336
+ const PROPERTY_NAME_BASE_URI = "baseURI";
322
337
 
323
- const STRING_PROPERTY_NAMES = [
324
- "baseURI",
338
+ const URI_PROPERTY_NAMES = [
325
339
  "wasmURI",
326
340
  "workerURI"
327
341
  ];
@@ -345,7 +359,8 @@
345
359
  "DecompressionStreamFallback"
346
360
  ];
347
361
  const CONFIGURABLE_PROPERTY_NAMES = [
348
- ...STRING_PROPERTY_NAMES,
362
+ PROPERTY_NAME_BASE_URI,
363
+ ...URI_PROPERTY_NAMES,
349
364
  ...BOOLEAN_PROPERTY_NAMES,
350
365
  ...NUMBER_PROPERTY_NAMES,
351
366
  ...FUNCTION_PROPERTY_NAMES
@@ -389,6 +404,14 @@
389
404
  }
390
405
  } else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
391
406
  checkFunctionOption(propertyValue);
407
+ } else if (propertyName == PROPERTY_NAME_BASE_URI) {
408
+ if (propertyValue && typeof propertyValue != STRING_TYPE) {
409
+ throw new Error(ERR_INVALID_BASE_URI);
410
+ }
411
+ } else if (URI_PROPERTY_NAMES.includes(propertyName)) {
412
+ if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
413
+ throw new Error(ERR_INVALID_URI);
414
+ }
392
415
  }
393
416
  return propertyValue;
394
417
  }
@@ -422,7 +445,7 @@
422
445
  Object.assign(config, DEFAULT_CONFIGURATION);
423
446
  }
424
447
 
425
- const o=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],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],e=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],s=[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],r=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],n=new Uint8Array(288);n.fill(8,0,144),n.fill(9,144,256),n.fill(7,256,280),n.fill(8,280,288);const i=new Uint8Array(30).fill(5);function A(o){const t=new Uint16Array(16);for(const e of o)t[e]++;t[0]=0;const e=new Uint16Array(17);for(let o=1;o<=15;o++)e[o+1]=e[o]+t[o];const s=new Uint16Array(o.length);for(let t=0;t<o.length;t++)o[t]&&(s[e[o[t]]++]=t);return {o:t,symbols:s}}const g$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=(O=()=>function(g){let c=0,O=0,B=0,f=new Uint8Array(1024),C=0,u=0;for(;!u;){u=w(1);const o=w(2);if(0==o)m();else if(1==o)d(A(n),A(i));else {if(2!=o)throw new Error("invalid deflate block type");d(...p());}}return f.subarray(0,C);function q(){if(c>=g.length)throw new Error("unexpected end of deflate data");return g[c++]}function w(o){for(;B<o;)O|=q()<<B,B+=8;const t=O&(1<<o)-1;return O>>>=o,B-=o,t}function m(){O=0,B=0;const o=q()|q()<<8;c+=2,z(C+o);for(let t=0;t<o;t++)f[C++]=q();}function d(r,n){let i=F(r);for(;256!=i;){if(i<256)z(C+1),f[C++]=i;else {const r=i-257,A=o[r]+w(t[r]),g=F(n),c=e[g]+w(s[g]);z(C+A);const O=C-c;for(let o=0;o<A;o++)f[C++]=f[O+o];}i=F(r);}}function p(){const o=w(5)+257,t=w(5)+1,e=w(4)+4,s=new Uint8Array(19);for(let o=0;o<e;o++)s[r[o]]=w(3);const n=A(s),i=new Uint8Array(o+t);let g=0;for(;g<i.length;){const o=F(n);if(o<16)i[g++]=o;else if(16==o){const o=i[g-1];let t=w(2)+3;for(;t--;)i[g++]=o;}else g+=17==o?w(3)+3:w(7)+11;}return [A(i.subarray(0,o)),A(i.subarray(o))]}function F(o){const{o:t,symbols:e}=o;let s=0,r=0,n=0;for(let o=1;o<=15;o++){s|=w(1);const i=t[o];if(s-r<i)return e[n+(s-r)];n+=i,r=r+i<<1,s<<=1;}throw new Error("invalid huffman code")}function z(o){if(f.length<o){let t=2*f.length;for(;t<o;)t*=2;const e=new Uint8Array(t);e.set(f.subarray(0,C)),f=e;}}}(function(o){const t=(o=String(o).replace(/[^A-Za-z0-9+/=]/g,"")).length,e=[];for(let s=0;s<t;s+=4){const t=g$1.indexOf(o[s])<<18|g$1.indexOf(o[s+1])<<12|(63&g$1.indexOf(o[s+2]))<<6|63&g$1.indexOf(o[s+3]);e.push(t>>16&255),"="!==o[s+2]&&e.push(t>>8&255),"="!==o[s+3]&&e.push(255&t);}return new Uint8Array(e)}("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")),o=>o({workerURI:o=>{const t="text/javascript";let e=O();if("string"==typeof e&&(e=(new TextEncoder).encode(e)),o){const o=new Blob([e],{type:t});return URL.createObjectURL(o)}return "data:"+t+";base64,"+function(o){let t="";const e=o.length;let s=0;for(;s+2<e;s+=3){const e=o[s]<<16|o[s+1]<<8|o[s+2];t+=g$1[e>>18&63]+g$1[e>>12&63]+g$1[e>>6&63]+g$1[63&e];}const r=e-s;if(1===r){const e=o[s]<<16;t+=g$1[e>>18&63]+g$1[e>>12&63]+"==";}else if(2===r){const e=o[s]<<16|o[s+1]<<8;t+=g$1[e>>18&63]+g$1[e>>12&63]+g$1[e>>6&63]+"=";}return t}(e)}}));var O;
448
+ const t=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],o=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],r=[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],e=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],A=new Uint8Array(288);A.fill(8,0,144),A.fill(9,144,256),A.fill(7,256,280),A.fill(8,280,288);const s=new Uint8Array(30).fill(5);function B(t){const o=new Uint16Array(16);for(const r of t)o[r]++;o[0]=0;const r=new Uint16Array(17);for(let t=1;t<=15;t++)r[t+1]=r[t]+o[t];const e=new Uint16Array(t.length);for(let o=0;o<t.length;o++)t[o]&&(e[r[t[o]]++]=o);return {o:o,symbols:e}}const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=(z$1=()=>function(l){let i=0,z=0,V=0,w=new Uint8Array(1024),F=0,a=0;for(;!a;){a=d(1);const t=d(2);if(0==t)b();else if(1==t)f(B(A),B(s));else {if(2!=t)throw new Error("invalid deflate block type");f(...N());}}return w.subarray(0,F);function g(){if(i>=l.length)throw new Error("unexpected end of deflate data");return l[i++]}function d(t){for(;V<t;)z|=g()<<V,V+=8;const o=z&(1<<t)-1;return z>>>=t,V-=t,o}function b(){z=0,V=0;const t=g()|g()<<8;i+=2,v(F+t);for(let o=0;o<t;o++)w[F++]=g();}function f(n,A){let s=u(n);for(;256!=s;){if(s<256)v(F+1),w[F++]=s;else {const n=s-257,B=t[n]+d(o[n]),l=u(A),i=r[l]+d(e[l]);v(F+B);const z=F-i;for(let t=0;t<B;t++)w[F++]=w[z+t];}s=u(n);}}function N(){const t=d(5)+257,o=d(5)+1,r=d(4)+4,e=new Uint8Array(19);for(let t=0;t<r;t++)e[n[t]]=d(3);const A=B(e),s=new Uint8Array(t+o);let l=0;for(;l<s.length;){const t=u(A);if(t<16)s[l++]=t;else if(16==t){const t=s[l-1];let o=d(2)+3;for(;o--;)s[l++]=t;}else l+=17==t?d(3)+3:d(7)+11;}return [B(s.subarray(0,t)),B(s.subarray(t))]}function u(t){const{o:o,symbols:r}=t;let e=0,n=0,A=0;for(let t=1;t<=15;t++){e|=d(1);const s=o[t];if(e-n<s)return r[A+(e-n)];A+=s,n=n+s<<1,e<<=1;}throw new Error("invalid huffman code")}function v(t){if(w.length<t){let o=2*w.length;for(;o<t;)o*=2;const r=new Uint8Array(o);r.set(w.subarray(0,F)),w=r;}}}(function(t){const o=(t=String(t).replace(/[^A-Za-z0-9+/=]/g,"")).length,r=[];for(let e=0;e<o;e+=4){const o=l.indexOf(t[e])<<18|l.indexOf(t[e+1])<<12|(63&l.indexOf(t[e+2]))<<6|63&l.indexOf(t[e+3]);r.push(o>>16&255),"="!==t[e+2]&&r.push(o>>8&255),"="!==t[e+3]&&r.push(255&o);}return new Uint8Array(r)}("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")),t=>t({workerURI:t=>{const o="text/javascript";let r=z$1();if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:o});return URL.createObjectURL(t)}return "data:"+o+";base64,"+function(t){let o="";const r=t.length;let e=0;for(;e+2<r;e+=3){const r=t[e]<<16|t[e+1]<<8|t[e+2];o+=l[r>>18&63]+l[r>>12&63]+l[r>>6&63]+l[63&r];}const n=r-e;if(1===n){const r=t[e]<<16;o+=l[r>>18&63]+l[r>>12&63]+"==";}else if(2===n){const r=t[e]<<16|t[e+1]<<8;o+=l[r>>18&63]+l[r>>12&63]+l[r>>6&63]+"=";}return o}(r)}}));var z$1;
426
449
 
427
450
  /*
428
451
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -468,6 +491,39 @@
468
491
  return new DataView(array.buffer, array.byteOffset, array.byteLength);
469
492
  }
470
493
 
494
+ /*
495
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
496
+
497
+ Redistribution and use in source and binary forms, with or without
498
+ modification, are permitted provided that the following conditions are met:
499
+
500
+ 1. Redistributions of source code must retain the above copyright notice,
501
+ this list of conditions and the following disclaimer.
502
+
503
+ 2. Redistributions in binary form must reproduce the above copyright
504
+ notice, this list of conditions and the following disclaimer in
505
+ the documentation and/or other materials provided with the distribution.
506
+
507
+ 3. The names of the authors may not be used to endorse or promote products
508
+ derived from this software without specific prior written permission.
509
+
510
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
511
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
512
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
513
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
514
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
515
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
516
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
517
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
518
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
519
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
520
+ */
521
+
522
+
523
+ function isErrorObject(error) {
524
+ return Boolean(error) && typeof error == "object";
525
+ }
526
+
471
527
  /*
472
528
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
473
529
 
@@ -2607,6 +2663,7 @@
2607
2663
  constructor(chunkSize) {
2608
2664
  const pendingChunks = [];
2609
2665
  let pendingLength = 0;
2666
+ let outputSize = 0;
2610
2667
  if (!Number.isFinite(chunkSize) || chunkSize < 1) {
2611
2668
  chunkSize = DEFAULT_CHUNK_SIZE;
2612
2669
  }
@@ -2615,15 +2672,20 @@
2615
2672
  pendingChunks.push(chunk);
2616
2673
  pendingLength += chunk.length;
2617
2674
  while (pendingLength > chunkSize) {
2675
+ outputSize += chunkSize;
2618
2676
  controller.enqueue(shiftChunk());
2619
2677
  }
2620
2678
  },
2621
2679
  flush(controller) {
2622
2680
  if (pendingLength) {
2681
+ outputSize += pendingLength;
2623
2682
  controller.enqueue(concatChunks(pendingChunks, pendingLength));
2624
2683
  }
2625
2684
  }
2626
2685
  });
2686
+ Object.defineProperty(this, "outputSize", {
2687
+ get: () => outputSize
2688
+ });
2627
2689
 
2628
2690
  function shiftChunk() {
2629
2691
  const result = new Uint8Array(chunkSize);
@@ -2729,7 +2791,9 @@
2729
2791
 
2730
2792
  class CodecWorker {
2731
2793
 
2732
- constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI, createWorker }, onTaskFinished) {
2794
+ constructor(workerData, { readable, writable }, workerOptions, onTaskFinished) {
2795
+ const { options, config, streamOptions, useWebWorkers, transferStreams, workerURI } = workerOptions;
2796
+ let { createWorker } = workerOptions;
2733
2797
  const { signal } = streamOptions;
2734
2798
  if (createWorkerFailed) {
2735
2799
  createWorker = UNDEFINED_VALUE;
@@ -2742,6 +2806,7 @@
2742
2806
  .pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
2743
2807
  writable,
2744
2808
  options: Object.assign({}, options),
2809
+ workerOptions,
2745
2810
  workerURI,
2746
2811
  createWorker,
2747
2812
  transferStreams,
@@ -2823,8 +2888,8 @@
2823
2888
  };
2824
2889
  }
2825
2890
 
2826
- async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
2827
- let codecStream;
2891
+ async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
2892
+ let codecStream, chunkStream;
2828
2893
  try {
2829
2894
  if (options.compressed && !options.format) {
2830
2895
  const deflate = options.codecType.startsWith(CODEC_DEFLATE);
@@ -2847,9 +2912,10 @@
2847
2912
  }
2848
2913
  }
2849
2914
  codecStream = new CodecStream(options, config);
2915
+ chunkStream = new ChunkStream(getChunkSize(config));
2850
2916
  await readable
2851
2917
  .pipeThrough(codecStream)
2852
- .pipeThrough(new ChunkStream(getChunkSize(config)))
2918
+ .pipeThrough(chunkStream)
2853
2919
  .pipeTo(writable, { preventClose: true, preventAbort: true });
2854
2920
  const {
2855
2921
  crc32,
@@ -2863,7 +2929,15 @@
2863
2929
  };
2864
2930
  } catch (error) {
2865
2931
  if (codecStream) {
2866
- error.outputSize = codecStream.outputSize;
2932
+ const outputSize = chunkStream ? chunkStream.outputSize : 0;
2933
+ workerOptions.outputSize = outputSize;
2934
+ if (isErrorObject(error)) {
2935
+ try {
2936
+ error.outputSize = outputSize;
2937
+ } catch {
2938
+ // ignored
2939
+ }
2940
+ }
2867
2941
  }
2868
2942
  throw error;
2869
2943
  } finally {
@@ -2972,11 +3046,23 @@
2972
3046
  let resolveResult, rejectResult;
2973
3047
  const result = new Promise((resolve, reject) => {
2974
3048
  resolveResult = resolve;
2975
- rejectResult = reject;
3049
+ rejectResult = error => {
3050
+ const { outputSize, workerOptions } = workerData;
3051
+ workerOptions.outputSize = outputSize;
3052
+ if (isErrorObject(error) && error.outputSize === UNDEFINED_VALUE) {
3053
+ try {
3054
+ error.outputSize = outputSize;
3055
+ } catch {
3056
+ // ignored
3057
+ }
3058
+ }
3059
+ reject(error);
3060
+ };
2976
3061
  });
2977
3062
  Object.assign(workerData, {
2978
3063
  reader: null,
2979
3064
  writer: null,
3065
+ outputSize: 0,
2980
3066
  resolveResult,
2981
3067
  rejectResult,
2982
3068
  result
@@ -3237,21 +3323,15 @@
3237
3323
  }
3238
3324
 
3239
3325
  async function onMessage({ data }, workerData) {
3240
- const { type, value, messageId, result, error } = data;
3326
+ const { type, value, messageId, result, error, errorValue } = data;
3241
3327
  const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
3242
3328
  const stale = () => workerData.generation != generation;
3243
3329
  try {
3244
3330
  if (error) {
3245
- const { message, stack, code, name, outputSize, cause, codecImportFailed } = error;
3246
- const responseError = new Error(message);
3247
- Object.assign(responseError, { stack, code, name, outputSize });
3248
- if (cause) {
3249
- responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
3250
- }
3251
- if (codecImportFailed) {
3252
- responseError.codecImportFailed = true;
3331
+ if (error.outputSize !== UNDEFINED_VALUE) {
3332
+ workerData.outputSize = error.outputSize;
3253
3333
  }
3254
- close(responseError);
3334
+ fail(getResponseError(error, errorValue));
3255
3335
  } else {
3256
3336
  if (type == MESSAGE_PULL) {
3257
3337
  const { value, done } = await reader.read();
@@ -3260,39 +3340,82 @@
3260
3340
  }
3261
3341
  }
3262
3342
  if (type == MESSAGE_DATA) {
3343
+ const chunk = new Uint8Array(value);
3263
3344
  await writer.ready;
3264
- await writer.write(new Uint8Array(value));
3345
+ await writer.write(chunk);
3346
+ workerData.outputSize += chunk.length;
3265
3347
  if (!stale()) {
3266
3348
  sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
3267
3349
  }
3268
3350
  }
3269
3351
  if (type == MESSAGE_CLOSE) {
3270
- close(null, result);
3352
+ succeed(result);
3271
3353
  }
3272
3354
  }
3273
3355
  } catch (error) {
3274
3356
  if (!stale()) {
3275
3357
  terminateWorker$1(workerData);
3276
- close(error);
3358
+ fail(error);
3277
3359
  }
3278
3360
  }
3279
3361
 
3280
- function close(error, result) {
3281
- if (stale()) {
3282
- return;
3283
- }
3284
- if (error) {
3362
+ function fail(error) {
3363
+ if (!stale()) {
3285
3364
  rejectResult(error);
3286
- } else {
3365
+ releaseWriter();
3366
+ if (!(isErrorObject(error) && error.codecImportFailed)) {
3367
+ onTaskFinished();
3368
+ }
3369
+ }
3370
+ }
3371
+
3372
+ function succeed(result) {
3373
+ if (!stale()) {
3287
3374
  resolveResult(result);
3375
+ releaseWriter();
3376
+ onTaskFinished();
3288
3377
  }
3378
+ }
3379
+
3380
+ function releaseWriter() {
3289
3381
  if (writer) {
3290
3382
  writer.releaseLock();
3291
3383
  }
3292
- if (!(error && error.codecImportFailed)) {
3293
- onTaskFinished();
3384
+ }
3385
+ }
3386
+
3387
+ function getResponseError(errorData, errorValue) {
3388
+ const { message, stack, code, name, outputSize, cause, codecImportFailed } = errorData;
3389
+ let responseError;
3390
+ if (errorValue) {
3391
+ responseError = errorValue.value;
3392
+ } else {
3393
+ responseError = Object.assign(new Error(message), { stack, code, name });
3394
+ if (cause) {
3395
+ responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
3294
3396
  }
3295
3397
  }
3398
+ if (isErrorObject(responseError)) {
3399
+ try {
3400
+ if (outputSize !== UNDEFINED_VALUE) {
3401
+ responseError.outputSize = outputSize;
3402
+ }
3403
+ if (codecImportFailed) {
3404
+ responseError.codecImportFailed = true;
3405
+ }
3406
+ if (errorValue) {
3407
+ if (responseError.name !== name) {
3408
+ responseError.name = name;
3409
+ }
3410
+ if (responseError.code !== code) {
3411
+ responseError.code = code;
3412
+ }
3413
+ }
3414
+ } catch {
3415
+ // ignored
3416
+ }
3417
+ }
3418
+ return responseError;
3296
3419
  }
3297
3420
 
3298
3421
  /*
@@ -3569,10 +3692,13 @@
3569
3692
 
3570
3693
 
3571
3694
  const ERR_HTTP_STATUS = "HTTP error ";
3695
+ const MIN_SUCCESS_HTTP_STATUS = 200;
3696
+ const MAX_SUCCESS_HTTP_STATUS = 299;
3572
3697
  const ERR_HTTP_RANGE = "HTTP Range not supported";
3573
3698
  const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
3574
3699
  const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
3575
3700
  const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
3701
+ const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
3576
3702
 
3577
3703
  const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
3578
3704
  const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
@@ -3764,6 +3890,7 @@
3764
3890
  const reader = this;
3765
3891
  const { sourceBlob, size } = reader;
3766
3892
  const { offset = 0, size: readSize = size - offset } = options || {};
3893
+ // deno-lint-ignore valid-typeof
3767
3894
  if (typeof sourceBlob.stream == FUNCTION_TYPE) {
3768
3895
  if (!offset && readSize >= size) {
3769
3896
  return toCompatibleReadable(sourceBlob.stream());
@@ -4170,7 +4297,7 @@
4170
4297
 
4171
4298
  async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
4172
4299
  const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
4173
- if (response.status < 400) {
4300
+ if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
4174
4301
  return response;
4175
4302
  } else {
4176
4303
  throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
@@ -4181,7 +4308,7 @@
4181
4308
  return new Promise((resolve, reject) => {
4182
4309
  const request = new XMLHttpRequest();
4183
4310
  request.addEventListener("load", () => {
4184
- if (request.status < 400) {
4311
+ if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
4185
4312
  const headers = [];
4186
4313
  request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
4187
4314
  const splitHeader = header.trim().split(/\s*:\s*/);
@@ -4485,8 +4612,10 @@
4485
4612
  writable: toCompatibleWritable(writer)
4486
4613
  };
4487
4614
  }
4488
- if (writer.size === UNDEFINED_VALUE) {
4489
- writer.size = 0;
4615
+ try {
4616
+ writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
4617
+ } catch {
4618
+ throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
4490
4619
  }
4491
4620
  return writer;
4492
4621
  }
@@ -4534,6 +4663,45 @@
4534
4663
  }
4535
4664
  }
4536
4665
 
4666
+ /*
4667
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
4668
+
4669
+ Redistribution and use in source and binary forms, with or without
4670
+ modification, are permitted provided that the following conditions are met:
4671
+
4672
+ 1. Redistributions of source code must retain the above copyright notice,
4673
+ this list of conditions and the following disclaimer.
4674
+
4675
+ 2. Redistributions in binary form must reproduce the above copyright
4676
+ notice, this list of conditions and the following disclaimer in
4677
+ the documentation and/or other materials provided with the distribution.
4678
+
4679
+ 3. The names of the authors may not be used to endorse or promote products
4680
+ derived from this software without specific prior written permission.
4681
+
4682
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4683
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4684
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4685
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4686
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4687
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4688
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4689
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4690
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4691
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4692
+ */
4693
+
4694
+
4695
+ function addWarning(warnings, reason, filename) {
4696
+ if (!warnings.some(warning => warning.reason == reason)) {
4697
+ const warning = { reason };
4698
+ if (filename !== UNDEFINED_VALUE) {
4699
+ warning.filename = filename;
4700
+ }
4701
+ warnings.push(warning);
4702
+ }
4703
+ }
4704
+
4537
4705
  /*
4538
4706
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4539
4707
 
@@ -4562,6 +4730,7 @@
4562
4730
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4563
4731
  */
4564
4732
 
4733
+
4565
4734
  const PROPERTY_NAME_FILENAME = "filename";
4566
4735
  const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
4567
4736
  const PROPERTY_NAME_COMMENT = "comment";
@@ -4686,6 +4855,38 @@
4686
4855
 
4687
4856
  }
4688
4857
 
4858
+ const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
4859
+ EXTRAFIELD_TYPE_ZIP64,
4860
+ EXTRAFIELD_TYPE_AES,
4861
+ EXTRAFIELD_TYPE_NTFS,
4862
+ EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
4863
+ EXTRAFIELD_TYPE_UNICODE_PATH,
4864
+ EXTRAFIELD_TYPE_UNICODE_COMMENT,
4865
+ EXTRAFIELD_TYPE_USDZ,
4866
+ EXTRAFIELD_TYPE_INFOZIP,
4867
+ EXTRAFIELD_TYPE_UNIX,
4868
+ EXTRAFIELD_TYPE_UNIX_TYPE1,
4869
+ EXTRAFIELD_TYPE_PKWARE_UNIX
4870
+ ]);
4871
+
4872
+ function getUserExtraField(extraField) {
4873
+ if (extraField) {
4874
+ const userExtraField = new Map();
4875
+ extraField.forEach((field, type) => {
4876
+ if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
4877
+ userExtraField.set(type, field.data);
4878
+ }
4879
+ });
4880
+ if (userExtraField.size) {
4881
+ return userExtraField;
4882
+ }
4883
+ }
4884
+ }
4885
+
4886
+ function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
4887
+ return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
4888
+ }
4889
+
4689
4890
  /*
4690
4891
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4691
4892
 
@@ -4745,6 +4946,8 @@
4745
4946
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4746
4947
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4747
4948
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4949
+ const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
4950
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
4748
4951
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4749
4952
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4750
4953
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
@@ -4815,7 +5018,7 @@
4815
5018
  }
4816
5019
  }
4817
5020
  if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
4818
- throwAmbiguousArchive("multiple end of central directory records");
5021
+ throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
4819
5022
  }
4820
5023
  const endOfDirectoryView = getDataView(endOfDirectoryInfo);
4821
5024
  let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
@@ -5113,7 +5316,8 @@
5113
5316
  const writer = new TransformStream();
5114
5317
  const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
5115
5318
  arrayBufferPromise.catch(() => { });
5116
- await fileEntry.getData(writer, entry, zipReader.readRanges, options);
5319
+ await fileEntry.getData(writer, entry, zipReader.readRanges,
5320
+ Object.assign({}, options, { preventClose: false }));
5117
5321
  return arrayBufferPromise;
5118
5322
  };
5119
5323
  offset = endOffset;
@@ -5194,49 +5398,101 @@
5194
5398
  await reader.readable.cancel();
5195
5399
  }
5196
5400
  }
5401
+
5402
+ [SYMBOL_ASYNC_DISPOSE]() {
5403
+ return this.close();
5404
+ }
5197
5405
  }
5198
5406
 
5199
5407
  class ZipReaderStream {
5200
5408
 
5201
5409
  constructor(options = {}) {
5202
- const { readable, writable } = new TransformStream();
5203
- const gen = new ZipReader(readable, options).getEntriesGenerator();
5410
+ let sourceController;
5411
+ const { readable, writable } = new TransformStream({
5412
+ start(controller) {
5413
+ sourceController = controller;
5414
+ }
5415
+ });
5416
+ const zipReader = new ZipReader(readable, options);
5417
+ const gen = zipReader.getEntriesGenerator();
5418
+ const pendingEntries = new Set();
5204
5419
  this.readable = new ReadableStream({
5205
5420
  async pull(controller) {
5206
5421
  const { done, value } = await gen.next();
5207
5422
  if (done)
5208
5423
  return controller.close();
5209
- const entryReadable = (function () {
5210
- const { readable, writable } = new TransformStream();
5211
- if (value.getData) {
5212
- getData();
5213
- return readable;
5214
- }
5215
-
5216
- async function getData() {
5217
- try {
5218
- await value.getData(writable);
5219
- } catch (error) {
5220
- try {
5221
- await writable.abort(error);
5222
- } catch {
5223
- // ignored
5224
- }
5225
- }
5226
- }
5227
- })();
5424
+ const entryStream = createEntryStream(value, pendingEntries);
5228
5425
  const chunk = {
5229
5426
  ...value,
5230
- readable: entryReadable
5427
+ readable: entryStream.readable
5231
5428
  };
5232
5429
  delete chunk.getData;
5430
+ Object.defineProperties(chunk, {
5431
+ localDirectory: {
5432
+ get: () => value.localDirectory,
5433
+ enumerable: true
5434
+ },
5435
+ warnings: {
5436
+ get: () => value.warnings,
5437
+ enumerable: true
5438
+ }
5439
+ });
5233
5440
  controller.enqueue(chunk);
5441
+ },
5442
+ async cancel(reason) {
5443
+ const entryStreams = Array.from(pendingEntries);
5444
+ pendingEntries.clear();
5445
+ sourceController.error(reason);
5446
+ await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
5447
+ await Promise.allSettled([gen.return(), zipReader.close()]);
5234
5448
  }
5235
5449
  });
5236
5450
  this.writable = writable;
5237
5451
  }
5238
5452
  }
5239
5453
 
5454
+ function createEntryStream(entry, pendingEntries) {
5455
+ const { readable, writable } = new TransformStream();
5456
+ let dataReader;
5457
+ const entryStream = {
5458
+ cancel: async reason => {
5459
+ pendingEntries.delete(entryStream);
5460
+ await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
5461
+ }
5462
+ };
5463
+ entryStream.readable = new ReadableStream({
5464
+ async pull(controller) {
5465
+ if (!dataReader) {
5466
+ dataReader = readable.getReader();
5467
+ pendingEntries.add(entryStream);
5468
+ getData();
5469
+ }
5470
+ const { done, value } = await dataReader.read();
5471
+ if (done) {
5472
+ controller.close();
5473
+ } else {
5474
+ controller.enqueue(value);
5475
+ }
5476
+ },
5477
+ cancel: reason => entryStream.cancel(reason)
5478
+ }, { highWaterMark: 0 });
5479
+ return entryStream;
5480
+
5481
+ async function getData() {
5482
+ try {
5483
+ await entry.getData(writable, { preventClose: false });
5484
+ } catch (error) {
5485
+ try {
5486
+ await writable.abort(error);
5487
+ } catch {
5488
+ // ignored
5489
+ }
5490
+ } finally {
5491
+ pendingEntries.delete(entryStream);
5492
+ }
5493
+ }
5494
+ }
5495
+
5240
5496
  async function isZipFile(reader, options = {}) {
5241
5497
  reader = new GenericReader(reader);
5242
5498
  await initStream(reader);
@@ -5296,7 +5552,9 @@
5296
5552
  const dataView = getDataView(dataArray);
5297
5553
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
5298
5554
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
5299
- const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
5555
+ const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
5556
+ const passThroughCompression = Boolean(passThrough);
5557
+ const passThroughEncryption = passThrough === true;
5300
5558
  checkPasswordOption(password, rawPassword);
5301
5559
  password = password && password.length && password;
5302
5560
  rawPassword = rawPassword && rawPassword.length && rawPassword;
@@ -5317,7 +5575,9 @@
5317
5575
  const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
5318
5576
  const entryStrictness = getStrictness(options, zipEntry.options);
5319
5577
  const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
5320
- const checkLocalFilename = getCheckLocalFilename(checkLocalDirectoryOption, entryStrictness);
5578
+ const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
5579
+ const checkLocalFilename = getCheckLocalFilename(
5580
+ checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
5321
5581
  let rawLocalFilename = EMPTY_UINT8_ARRAY;
5322
5582
  if (checkLocalFilename && (filenameLength || extraFieldLength)) {
5323
5583
  const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
@@ -5348,16 +5608,17 @@
5348
5608
  if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
5349
5609
  fileEntry.gid = gid;
5350
5610
  }
5351
- const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
5611
+ const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5612
+ const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
5352
5613
  const zipCrypto = encrypted && !extraFieldAES;
5353
- if (!passThrough) {
5614
+ if (!passThroughEncryption) {
5354
5615
  fileEntry.zipCrypto = zipCrypto;
5355
5616
  }
5356
5617
  if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
5357
5618
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
5358
5619
  }
5359
- const registeredCodec = passThrough ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5360
- if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThrough) {
5620
+ const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5621
+ if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
5361
5622
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
5362
5623
  }
5363
5624
  if (encrypted) {
@@ -5374,15 +5635,16 @@
5374
5635
  const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5375
5636
  const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
5376
5637
  throwIfAborted(signal);
5377
- const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5378
5638
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
5379
5639
  const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
5380
5640
  if (checkOverlappingEntryOnly) {
5381
5641
  checkOverlappingEntry = true;
5382
5642
  }
5383
5643
  const { onstart, onprogress, onend } = options;
5384
- const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
5385
- const outputSize = passThrough ? compressedSize : uncompressedSize;
5644
+ const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
5645
+ const outputSize = passThroughCompression ?
5646
+ compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
5647
+ uncompressedSize;
5386
5648
  const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
5387
5649
  let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
5388
5650
  if (deflate64) {
@@ -5391,7 +5653,7 @@
5391
5653
  const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
5392
5654
  const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
5393
5655
  getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
5394
- checkCrc32Option) && !passThrough &&
5656
+ checkCrc32Option) && !passThroughCompression &&
5395
5657
  (!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
5396
5658
  const workerOptions = {
5397
5659
  options: {
@@ -5435,7 +5697,7 @@
5435
5697
  readRanges
5436
5698
  });
5437
5699
  }
5438
- let writable, abortError;
5700
+ let writable, abortError, aborted;
5439
5701
  try {
5440
5702
  if (!checkOverlappingEntryOnly) {
5441
5703
  if (checkPasswordOnly) {
@@ -5445,24 +5707,28 @@
5445
5707
  await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
5446
5708
  ({ writable } = writer);
5447
5709
  const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
5448
- writer.size += writtenSize;
5449
5710
  if (writtenSize != outputSize) {
5450
- throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
5711
+ throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
5451
5712
  }
5713
+ writer.size += writtenSize;
5452
5714
  }
5453
5715
  } catch (error) {
5454
- if (error.outputSize !== UNDEFINED_VALUE) {
5716
+ const { outputSize: failedOutputSize } = workerOptions;
5717
+ if (failedOutputSize !== UNDEFINED_VALUE) {
5718
+ writer.size += failedOutputSize;
5719
+ } else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
5455
5720
  writer.size += error.outputSize;
5456
5721
  }
5457
- if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
5722
+ if (!checkPasswordOnly || !isErrorObject(error) || error.message != ERR_ABORT_CHECK_PASSWORD) {
5458
5723
  abortError = error;
5724
+ aborted = true;
5459
5725
  throw error;
5460
5726
  }
5461
5727
  } finally {
5462
5728
  const preventClose = !ownsWritable(writer) && getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
5463
5729
  if (!preventClose && writable && !writable.locked) {
5464
5730
  const writableWriter = writable.getWriter();
5465
- if (abortError) {
5731
+ if (aborted) {
5466
5732
  try {
5467
5733
  await writableWriter.abort(abortError);
5468
5734
  } catch {
@@ -6114,7 +6380,7 @@
6114
6380
  if (checkLocalFilename && !maskedLocalDirectory &&
6115
6381
  (rawLocalFilename.length != rawFilename.length ||
6116
6382
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6117
- reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6383
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
6118
6384
  }
6119
6385
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6120
6386
  reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
@@ -6139,16 +6405,6 @@
6139
6405
  }
6140
6406
  }
6141
6407
 
6142
- function addWarning(warnings, reason, filename) {
6143
- if (!warnings.some(warning => warning.reason == reason)) {
6144
- const warning = { reason };
6145
- if (filename !== UNDEFINED_VALUE) {
6146
- warning.filename = filename;
6147
- }
6148
- warnings.push(warning);
6149
- }
6150
- }
6151
-
6152
6408
  function throwAmbiguousArchive(reason) {
6153
6409
  const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
6154
6410
  error.reason = reason;
@@ -6228,7 +6484,9 @@
6228
6484
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6229
6485
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6230
6486
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6487
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
6231
6488
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6489
+ WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
6232
6490
  WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6233
6491
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6234
6492
  WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
@@ -6281,7 +6539,7 @@
6281
6539
  const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
6282
6540
  const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
6283
6541
  const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
6284
- const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
6542
+ const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
6285
6543
  const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
6286
6544
  const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
6287
6545
  const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
@@ -6293,6 +6551,7 @@
6293
6551
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
6294
6552
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
6295
6553
  const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
6554
+ const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
6296
6555
  const ERR_UNDETERMINED_SIZE = "Undetermined size";
6297
6556
  const ERR_UNDEFINED_READER = "Undefined reader";
6298
6557
  const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
@@ -6306,14 +6565,21 @@
6306
6565
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
6307
6566
  const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
6308
6567
  const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
6568
+ const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
6569
+ const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
6570
+ const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
6571
+ const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
6309
6572
 
6310
6573
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
6311
6574
  const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
6312
6575
  const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
6313
6576
  const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
6577
+ const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
6578
+ const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
6314
6579
  const VENDOR_VERSION_AE_1 = 1;
6315
- const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
6580
+ const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
6316
6581
  const UNIX_EXTRA_FIELD_TYPE = "unix";
6582
+ const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
6317
6583
  const MAX_LEVEL = 9;
6318
6584
 
6319
6585
  let workers = 0;
@@ -6340,9 +6606,11 @@
6340
6606
  initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
6341
6607
  pendingAddFileCalls: new Set(),
6342
6608
  pendingErrors: [],
6609
+ warnings: [],
6343
6610
  bufferedWrites: 0,
6344
6611
  directWrites: 0,
6345
- lastFileEntry: UNDEFINED_VALUE
6612
+ lastFileEntry: UNDEFINED_VALUE,
6613
+ archiveClosed: false
6346
6614
  });
6347
6615
  }
6348
6616
 
@@ -6507,6 +6775,9 @@
6507
6775
  const zipWriter = this;
6508
6776
  const { pendingAddFileCalls, writer } = this;
6509
6777
  const { writable } = writer;
6778
+ if (zipWriter.archiveClosed) {
6779
+ return getWriterData(writer);
6780
+ }
6510
6781
  if (!(comment instanceof Uint8Array)) {
6511
6782
  throw new Error(ERR_INVALID_COMMENT_TYPE);
6512
6783
  }
@@ -6517,7 +6788,7 @@
6517
6788
  await Promise.allSettled(Array.from(pendingAddFileCalls));
6518
6789
  }
6519
6790
  await Promise.allSettled(zipWriter.pendingErrors.map(watcher => watcher.recorded));
6520
- const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.error && !watcher.observed);
6791
+ const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.failed && !watcher.observed);
6521
6792
  if (unobservedWatchers.length) {
6522
6793
  const unobservedErrors = unobservedWatchers.map(watcher => watcher.error);
6523
6794
  unobservedWatchers.forEach(watcher => watcher.observed = true);
@@ -6530,11 +6801,16 @@
6530
6801
  throw error;
6531
6802
  }
6532
6803
  await closeFile(zipWriter, comment, options);
6804
+ zipWriter.archiveClosed = true;
6533
6805
  const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
6534
6806
  if (!preventClose) {
6535
6807
  await writable.getWriter().close();
6536
6808
  }
6537
- return writer.getData ? writer.getData() : writable;
6809
+ return getWriterData(writer);
6810
+ }
6811
+
6812
+ [SYMBOL_ASYNC_DISPOSE]() {
6813
+ return this.close();
6538
6814
  }
6539
6815
  }
6540
6816
 
@@ -6613,11 +6889,16 @@
6613
6889
  }
6614
6890
  }
6615
6891
 
6892
+ function getWriterData(writer) {
6893
+ return writer.getData ? writer.getData() : writer.writable;
6894
+ }
6895
+
6616
6896
  function watchPromiseError(zipWriter, promise) {
6617
6897
  const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
6618
6898
  const watcher = {};
6619
6899
  watchedPromise.watcher = watcher;
6620
- watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE, error => watcher.error = error);
6900
+ watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE,
6901
+ error => Object.assign(watcher, { failed: true, error }));
6621
6902
  zipWriter.pendingErrors.push(watcher);
6622
6903
  return watchedPromise;
6623
6904
  }
@@ -6631,6 +6912,14 @@
6631
6912
 
6632
6913
  async function addFileEntry(zipWriter, name, reader, options) {
6633
6914
  options = Object.assign({}, options);
6915
+ const entry = options[OPTION_ENTRY];
6916
+ if (entry !== UNDEFINED_VALUE) {
6917
+ const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
6918
+ checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
6919
+ getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
6920
+ delete options[OPTION_ENTRY];
6921
+ options = Object.assign(entryOptions, passThroughOptions, options);
6922
+ }
6634
6923
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6635
6924
  name += DIRECTORY_SIGNATURE;
6636
6925
  }
@@ -6695,21 +6984,33 @@
6695
6984
  try {
6696
6985
  const { resolvedOptions } = metadataInfo;
6697
6986
  if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
6698
- !resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
6987
+ !resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
6699
6988
  resolvedOptions.level = 0;
6989
+ addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
6700
6990
  }
6701
6991
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
6702
6992
  ({ reader } = sizesInfo);
6703
6993
  const diskOffset = getDiskOffset(zipWriter.writer);
6704
6994
  const diskNumber = getDiskNumber(zipWriter.writer);
6995
+ let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
6996
+ const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
6997
+ if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
6998
+ crc32 = UNDEFINED_VALUE;
6999
+ }
7000
+ if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
7001
+ throw new Error(ERR_UNDEFINED_CRC32);
7002
+ }
6705
7003
  options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
6706
7004
  signature: options[PROPERTY_NAME_SIGNATURE],
6707
- crc32: options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32,
7005
+ crc32,
6708
7006
  offset: zipWriter.offset - diskOffset,
6709
7007
  diskNumberStart: diskNumber,
6710
7008
  [OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
6711
7009
  });
6712
7010
  const headerInfo = getHeaderInfo(options);
7011
+ if (headerInfo.lastModDateClamped) {
7012
+ addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
7013
+ }
6713
7014
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6714
7015
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6715
7016
  fileEntry = await getFileEntry(zipWriter, name, reader, {
@@ -6736,6 +7037,95 @@
6736
7037
  return new Entry(fileEntry);
6737
7038
  }
6738
7039
 
7040
+ function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
7041
+ if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
7042
+ throw new Error(ERR_INVALID_ENTRY);
7043
+ }
7044
+ const {
7045
+ externalFileAttributes,
7046
+ versionMadeBy,
7047
+ comment,
7048
+ lastModDate,
7049
+ rawLastModDate,
7050
+ creationDate,
7051
+ lastAccessDate,
7052
+ uncompressedSize,
7053
+ encrypted,
7054
+ zipCrypto,
7055
+ crc32,
7056
+ compressionMethod,
7057
+ extraFieldAES,
7058
+ extraFieldUnix,
7059
+ internalFileAttributes,
7060
+ extraField,
7061
+ bitFlag,
7062
+ directory,
7063
+ uid,
7064
+ gid
7065
+ } = entry;
7066
+ const entryOptions = {
7067
+ externalFileAttributes,
7068
+ versionMadeBy,
7069
+ comment,
7070
+ lastModDate,
7071
+ creationDate,
7072
+ lastAccessDate,
7073
+ internalFileAttributes,
7074
+ directory
7075
+ };
7076
+ if (bitFlag && bitFlag.languageEncodingFlag) {
7077
+ entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
7078
+ }
7079
+ const userExtraField = getUserExtraField(extraField);
7080
+ if (userExtraField) {
7081
+ entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
7082
+ }
7083
+ if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
7084
+ Object.assign(entryOptions, {
7085
+ uid,
7086
+ gid,
7087
+ unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
7088
+ });
7089
+ }
7090
+ const passThroughOptions = {};
7091
+ if (passThrough && !directory) {
7092
+ Object.assign(passThroughOptions, {
7093
+ uncompressedSize,
7094
+ crc32,
7095
+ compressionMethod
7096
+ });
7097
+ if (passThrough !== PASS_THROUGH_COMPRESSED) {
7098
+ Object.assign(passThroughOptions, {
7099
+ encrypted,
7100
+ zipCrypto,
7101
+ encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
7102
+ });
7103
+ }
7104
+ if (bitFlag) {
7105
+ passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
7106
+ passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
7107
+ }
7108
+ if (lastModDateOverride === UNDEFINED_VALUE) {
7109
+ passThroughOptions.rawLastModDate = rawLastModDate;
7110
+ } else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
7111
+ lastModDateOverride instanceof Date &&
7112
+ getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
7113
+ throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
7114
+ }
7115
+ }
7116
+ return { entryOptions, passThroughOptions };
7117
+ }
7118
+
7119
+ function getDosTimeHighByte(lastModDate) {
7120
+ let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
7121
+ if (dosLastModDate < MIN_DATE) {
7122
+ dosLastModDate = MIN_DATE;
7123
+ } else if (dosLastModDate > MAX_DATE) {
7124
+ dosLastModDate = MAX_DATE;
7125
+ }
7126
+ return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
7127
+ }
7128
+
6739
7129
  function resolveAttributes(zipWriter, name, options) {
6740
7130
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6741
7131
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
@@ -6750,7 +7140,7 @@
6750
7140
  checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
6751
7141
  checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
6752
7142
  checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
6753
- if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
7143
+ if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
6754
7144
  throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
6755
7145
  }
6756
7146
  if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
@@ -6758,7 +7148,7 @@
6758
7148
  throw new Error(ERR_INVALID_UNIX_ID_SIZE);
6759
7149
  }
6760
7150
  if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
6761
- unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
7151
+ unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
6762
7152
  }
6763
7153
  let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
6764
7154
  let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
@@ -6889,7 +7279,9 @@
6889
7279
  const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
6890
7280
  const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
6891
7281
  const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
6892
- const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
7282
+ const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
7283
+ const passThroughCompression = Boolean(passThrough);
7284
+ const passThroughEncryption = passThrough === true;
6893
7285
  const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
6894
7286
  const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
6895
7287
  checkPasswordOption(password, rawPassword);
@@ -6905,10 +7297,11 @@
6905
7297
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
6906
7298
  const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
6907
7299
  throwIfAborted(signal);
6908
- const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
7300
+ const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
7301
+ !isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
6909
7302
  const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
6910
- const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
6911
- if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
7303
+ const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
7304
+ if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
6912
7305
  compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
6913
7306
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
6914
7307
  }
@@ -6922,15 +7315,15 @@
6922
7315
  level = 0;
6923
7316
  }
6924
7317
  }
6925
- if (passThrough) {
6926
- level = UNDEFINED_VALUE;
7318
+ if (passThroughCompression) {
7319
+ level = toNumber(options[OPTION_LEVEL]);
6927
7320
  }
6928
7321
  let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
6929
7322
  let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
6930
7323
  if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
6931
7324
  dataDescriptor = false;
6932
7325
  }
6933
- if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThrough)) {
7326
+ if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
6934
7327
  dataDescriptor = true;
6935
7328
  }
6936
7329
  if (level !== UNDEFINED_VALUE && level != 6) {
@@ -6954,7 +7347,8 @@
6954
7347
  lastAccessDate,
6955
7348
  creationDate,
6956
7349
  internalFileAttributes,
6957
- passThrough,
7350
+ passThroughCompression,
7351
+ passThroughEncryption,
6958
7352
  password,
6959
7353
  rawPassword,
6960
7354
  encryptionStrength,
@@ -7015,7 +7409,7 @@
7015
7409
  }
7016
7410
 
7017
7411
  async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
7018
- if (metadata.passThrough && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7412
+ if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7019
7413
  throw new Error(ERR_UNDEFINED_READER);
7020
7414
  }
7021
7415
  let contentSize;
@@ -7031,12 +7425,12 @@
7031
7425
  }
7032
7426
 
7033
7427
  function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
7034
- const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7428
+ const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7035
7429
  let { dataDescriptor, zip64, level, compressionMethod } = metadata;
7036
7430
  let maximumCompressedSize = 0;
7037
7431
  let uncompressedSize = 0;
7038
7432
  let unknownSize = false;
7039
- if (passThrough && hasContent) {
7433
+ if (passThroughCompression && hasContent) {
7040
7434
  uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
7041
7435
  if (uncompressedSize === UNDEFINED_VALUE) {
7042
7436
  throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
@@ -7047,17 +7441,17 @@
7047
7441
  }
7048
7442
  const zip64Enabled = zip64 === true;
7049
7443
  const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
7050
- if (hasContent && passThrough && !encrypted && getLength(password, rawPassword)) {
7444
+ if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
7051
7445
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
7052
7446
  }
7053
- const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
7447
+ const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
7054
7448
  if (!hasContent) {
7055
7449
  level = 0;
7056
7450
  compressionMethod = COMPRESSION_METHOD_STORE;
7057
7451
  }
7058
- const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7452
+ const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
7059
7453
  if (hasContent) {
7060
- if (!passThrough) {
7454
+ if (!passThroughCompression) {
7061
7455
  if (contentSize === UNDEFINED_VALUE) {
7062
7456
  dataDescriptor = true;
7063
7457
  if (zip64 || zip64 === UNDEFINED_VALUE) {
@@ -7070,10 +7464,12 @@
7070
7464
  }
7071
7465
  } else {
7072
7466
  options.uncompressedSize = uncompressedSize;
7073
- maximumCompressedSize = contentSize === UNDEFINED_VALUE ? getMaximumCompressedSize(uncompressedSize) + encryptionOverhead : contentSize;
7467
+ maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
7468
+ getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
7469
+ contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
7074
7470
  }
7075
7471
  }
7076
- const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThrough)) && !isCompressed(compressionMethod, level);
7472
+ const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
7077
7473
  if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7078
7474
  dataDescriptor = false;
7079
7475
  }
@@ -7122,6 +7518,8 @@
7122
7518
  const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
7123
7519
  let offset = initialOffset;
7124
7520
  let minimumEntrySize = INFINITY_VALUE;
7521
+ const entrySizes = [];
7522
+ const entriesAlreadyZip64 = new Set();
7125
7523
  for (const entry of entries) {
7126
7524
  let { name } = entry;
7127
7525
  const { size } = entry;
@@ -7133,7 +7531,7 @@
7133
7531
  ({ name } = attributesInfo);
7134
7532
  const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
7135
7533
  if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
7136
- !metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
7534
+ !metadata.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
7137
7535
  metadata.level = 0;
7138
7536
  }
7139
7537
  const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
@@ -7141,7 +7539,7 @@
7141
7539
  throw new Error(ERR_UNDETERMINED_SIZE);
7142
7540
  }
7143
7541
  const { maximumCompressedSize, resolvedOptions: sizes } = resolveEntrySizes(zipWriter, hasContent, size, metadata, options);
7144
- if (hasContent && !metadata.passThrough && isCompressed(sizes.compressionMethod, sizes.level)) {
7542
+ if (hasContent && !metadata.passThroughCompression && isCompressed(sizes.compressionMethod, sizes.level)) {
7145
7543
  throw new Error(ERR_UNDETERMINED_SIZE);
7146
7544
  }
7147
7545
  const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
@@ -7161,10 +7559,15 @@
7161
7559
  compressedSize
7162
7560
  }));
7163
7561
  const entrySize = entryInfo.metadataSize + compressedSize;
7562
+ entrySizes.push(entrySize);
7563
+ entriesAlreadyZip64.add(Boolean(entryOptions.zip64Enabled ||
7564
+ entryOptions.uncompressedSize >= MAX_32_BITS || compressedSize >= MAX_32_BITS));
7164
7565
  minimumEntrySize = Math.min(minimumEntrySize, entrySize);
7165
7566
  offset += entrySize;
7166
7567
  }
7167
- const layoutDependsOnWriteOrder = files.size > 1 && (usdz || offset - minimumEntrySize >= MAX_32_BITS);
7568
+ const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
7569
+ (offset - minimumEntrySize >= MAX_32_BITS &&
7570
+ (entriesAlreadyZip64.size > 1 || countEntriesBefore4GB(entrySizes, initialOffset, true) != countEntriesBefore4GB(entrySizes, initialOffset, false))));
7168
7571
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
7169
7572
  throw new Error(ERR_UNDETERMINED_SIZE);
7170
7573
  }
@@ -7182,6 +7585,20 @@
7182
7585
  return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
7183
7586
  }
7184
7587
 
7588
+ function countEntriesBefore4GB(entrySizes, initialOffset, largestFirst) {
7589
+ const ordered = entrySizes.slice().sort((first, second) => largestFirst ? second - first : first - second);
7590
+ let position = initialOffset;
7591
+ let count = 0;
7592
+ for (const entrySize of ordered) {
7593
+ if (position >= MAX_32_BITS) {
7594
+ break;
7595
+ }
7596
+ position += entrySize;
7597
+ count++;
7598
+ }
7599
+ return count;
7600
+ }
7601
+
7185
7602
  async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7186
7603
  const {
7187
7604
  fileEntries,
@@ -7357,6 +7774,7 @@
7357
7774
  localExtraFieldZip64Length,
7358
7775
  rawExtraFieldExtendedTimestamp,
7359
7776
  extraFieldExtendedTimestampFlag,
7777
+ extraFieldExtendedTimestampTime,
7360
7778
  rawExtraFieldNTFS,
7361
7779
  rawExtraFieldUnix,
7362
7780
  rawExtraFieldAES,
@@ -7369,6 +7787,7 @@
7369
7787
  password,
7370
7788
  rawPassword,
7371
7789
  level,
7790
+ useUnicodeFileNames,
7372
7791
  zip64,
7373
7792
  zip64Enabled,
7374
7793
  zip64UncompressedSize,
@@ -7403,7 +7822,8 @@
7403
7822
  msdosAttributesRaw,
7404
7823
  msdosAttributes,
7405
7824
  useCompressionStream,
7406
- passThrough,
7825
+ passThroughCompression,
7826
+ passThroughEncryption,
7407
7827
  format,
7408
7828
  codecURI
7409
7829
  } = options;
@@ -7414,9 +7834,9 @@
7414
7834
  zip64Enabled,
7415
7835
  directory: Boolean(directory),
7416
7836
  executable: Boolean(executable),
7417
- filenameUTF8: true,
7837
+ filenameUTF8: Boolean(useUnicodeFileNames),
7418
7838
  rawFilename,
7419
- commentUTF8: true,
7839
+ commentUTF8: Boolean(useUnicodeFileNames),
7420
7840
  rawComment,
7421
7841
  rawExtraFieldZip64,
7422
7842
  localExtraFieldZip64Length,
@@ -7447,7 +7867,7 @@
7447
7867
  uncompressedSize
7448
7868
  } = options;
7449
7869
  let compressedSize = 0;
7450
- if (!passThrough) {
7870
+ if (!passThroughCompression) {
7451
7871
  uncompressedSize = 0;
7452
7872
  }
7453
7873
  const { writable } = writer;
@@ -7464,9 +7884,9 @@
7464
7884
  encryptionStrength,
7465
7885
  zipCrypto: encrypted && zipCrypto,
7466
7886
  passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
7467
- computeCrc32: !passThrough,
7468
- compressed: compressed && !passThrough,
7469
- encrypted: encrypted && !passThrough,
7887
+ computeCrc32: !passThroughCompression,
7888
+ compressed: compressed && !passThroughCompression,
7889
+ encrypted: encrypted && !passThroughEncryption,
7470
7890
  useWebWorkers,
7471
7891
  useCompressionStream,
7472
7892
  transferStreams,
@@ -7481,7 +7901,7 @@
7481
7901
  const result = await runWorker({ readable, writable }, workerOptions);
7482
7902
  compressedSize = result.outputSize;
7483
7903
  writer.size += compressedSize;
7484
- if (!passThrough) {
7904
+ if (!passThroughCompression) {
7485
7905
  uncompressedSize = result.inputSize;
7486
7906
  if (!encrypted || zipCrypto) {
7487
7907
  crc32 = result.crc32;
@@ -7492,7 +7912,10 @@
7492
7912
  throw new Error(ERR_UNSUPPORTED_FORMAT);
7493
7913
  }
7494
7914
  } catch (error) {
7495
- if (error.outputSize !== UNDEFINED_VALUE) {
7915
+ const { outputSize: failedOutputSize } = workerOptions;
7916
+ if (failedOutputSize !== UNDEFINED_VALUE) {
7917
+ writer.size += failedOutputSize;
7918
+ } else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
7496
7919
  writer.size += error.outputSize;
7497
7920
  }
7498
7921
  throw error;
@@ -7524,8 +7947,9 @@
7524
7947
  headerArray,
7525
7948
  headerView,
7526
7949
  signature: crc32,
7527
- crc32: encrypted && !zipCrypto && !passThrough ? UNDEFINED_VALUE : crc32,
7950
+ crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
7528
7951
  extraFieldExtendedTimestampFlag,
7952
+ extraFieldExtendedTimestampTime,
7529
7953
  zip64UncompressedSize,
7530
7954
  zip64CompressedSize
7531
7955
  });
@@ -7550,7 +7974,7 @@
7550
7974
  encryptionStrength,
7551
7975
  extendedTimestamp,
7552
7976
  ntfsTimestamp,
7553
- passThrough,
7977
+ passThroughCompression,
7554
7978
  encrypted,
7555
7979
  zip64UncompressedSize,
7556
7980
  zip64CompressedSize,
@@ -7561,7 +7985,7 @@
7561
7985
  let { version, compressionMethod } = options;
7562
7986
  const compressed = !directory && isCompressed(compressionMethod, level);
7563
7987
  let rawLocalExtraFieldZip64;
7564
- const uncompressedFile = passThrough || !compressed;
7988
+ const uncompressedFile = passThroughCompression || !compressed;
7565
7989
  const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
7566
7990
  const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
7567
7991
  if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
@@ -7573,8 +7997,8 @@
7573
7997
  if (zip64ExtraFieldComplete) {
7574
7998
  extraFieldZip64.writeUint64(uncompressedSize);
7575
7999
  if (uncompressedFile) {
7576
- const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7577
- extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
8000
+ const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
8001
+ extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
7578
8002
  }
7579
8003
  }
7580
8004
  } else {
@@ -7593,6 +8017,7 @@
7593
8017
  let rawExtraFieldNTFS;
7594
8018
  let rawExtraFieldExtendedTimestamp;
7595
8019
  let extraFieldExtendedTimestampFlag;
8020
+ let extraFieldExtendedTimestampTime;
7596
8021
  if (extendedTimestamp) {
7597
8022
  const lastModTimeUnix = getTimeUnix(lastModDate);
7598
8023
  const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
@@ -7600,6 +8025,7 @@
7600
8025
  const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
7601
8026
  const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
7602
8027
  extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
8028
+ extraFieldExtendedTimestampTime = lastModTimeUnix;
7603
8029
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7604
8030
  extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
7605
8031
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
@@ -7642,7 +8068,7 @@
7642
8068
  let rawExtraFieldUnix;
7643
8069
  try {
7644
8070
  const { uid, gid, unixExtraFieldType } = options;
7645
- if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE$1 && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
8071
+ if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7646
8072
  const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
7647
8073
  const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
7648
8074
  const payloadLength = 3 + uidBytes.length + gidBytes.length;
@@ -7683,7 +8109,7 @@
7683
8109
  }
7684
8110
  if (encrypted && !zipCrypto) {
7685
8111
  version = version > VERSION_AES ? version : VERSION_AES;
7686
- if (passThrough && crc32 !== UNDEFINED_VALUE) {
8112
+ if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
7687
8113
  rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
7688
8114
  }
7689
8115
  setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
@@ -7745,12 +8171,14 @@
7745
8171
  headerArray,
7746
8172
  headerView,
7747
8173
  lastModDate: storedLastModDate,
8174
+ lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
7748
8175
  rawLastModDate,
7749
8176
  encrypted,
7750
8177
  compressed,
7751
8178
  version,
7752
8179
  compressionMethod,
7753
8180
  extraFieldExtendedTimestampFlag,
8181
+ extraFieldExtendedTimestampTime,
7754
8182
  rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
7755
8183
  localExtraFieldZip64Length,
7756
8184
  rawExtraFieldExtendedTimestamp,
@@ -7853,7 +8281,7 @@
7853
8281
  }, {
7854
8282
  zip64,
7855
8283
  zipCrypto,
7856
- passThrough,
8284
+ passThroughCompression,
7857
8285
  dataDescriptor
7858
8286
  }) {
7859
8287
  const {
@@ -7864,7 +8292,7 @@
7864
8292
  dataDescriptorView,
7865
8293
  dataDescriptorOffset
7866
8294
  } = dataDescriptorInfo;
7867
- if ((!encrypted || zipCrypto || passThrough) && crc32 !== UNDEFINED_VALUE) {
8295
+ if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
7868
8296
  setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
7869
8297
  if (dataDescriptor) {
7870
8298
  setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
@@ -7895,9 +8323,9 @@
7895
8323
  uncompressedSize,
7896
8324
  zip64UncompressedSize,
7897
8325
  zip64CompressedSize
7898
- }, localHeaderView, { dataDescriptor, passThrough }) {
8326
+ }, localHeaderView, { dataDescriptor, passThroughCompression }) {
7899
8327
  if (!dataDescriptor) {
7900
- if (!encrypted || (passThrough && crc32 !== UNDEFINED_VALUE)) {
8328
+ if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
7901
8329
  setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
7902
8330
  }
7903
8331
  if (!zip64CompressedSize) {
@@ -7934,9 +8362,8 @@
7934
8362
  rawExtraFieldUnix,
7935
8363
  rawExtraField,
7936
8364
  rawCentralExtraField,
7937
- extendedTimestamp,
7938
8365
  extraFieldExtendedTimestampFlag,
7939
- lastModDate,
8366
+ extraFieldExtendedTimestampTime,
7940
8367
  zip64Enabled,
7941
8368
  uncompressedSize,
7942
8369
  compressedSize
@@ -7979,16 +8406,15 @@
7979
8406
  fileEntry.zip64Offset = zip64Offset;
7980
8407
  fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
7981
8408
  let rawExtraFieldTimestamp;
7982
- const lastModTimeUnix = getTimeUnix(lastModDate);
7983
- if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
8409
+ if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
8410
+ rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
8411
+ } else {
7984
8412
  const extraFieldTimestamp = createRecordWriter(9);
7985
8413
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7986
8414
  extraFieldTimestamp.writeUint16(5);
7987
8415
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
7988
- extraFieldTimestamp.writeUint32(lastModTimeUnix);
8416
+ extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
7989
8417
  rawExtraFieldTimestamp = extraFieldTimestamp.array;
7990
- } else {
7991
- rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
7992
8418
  }
7993
8419
  fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
7994
8420
  const extraFieldLength = getLength(
@@ -8488,6 +8914,11 @@
8488
8914
  };
8489
8915
  }
8490
8916
 
8917
+ function isPrintableASCIIText(rawText) {
8918
+ return rawText.every(characterCode =>
8919
+ characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
8920
+ }
8921
+
8491
8922
  function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
8492
8923
  let bitFlag = 0;
8493
8924
  if (useUnicodeFileNames) {
@@ -8649,7 +9080,7 @@
8649
9080
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8650
9081
  */
8651
9082
 
8652
- const VERSION = "2.11.4";
9083
+ const VERSION = "2.13.0";
8653
9084
 
8654
9085
  /*
8655
9086
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9168,7 +9599,10 @@
9168
9599
  const ERR_ENTRY_EXISTS = "Entry filename already exists";
9169
9600
  const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
9170
9601
  const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
9171
- const ERR_ANCESTOR_ENTRY = "Entry is a ancestor of target entry";
9602
+ const ERR_ANCESTOR_ENTRY = "Entry is an ancestor of target entry";
9603
+ const ERR_ROOT_DIRECTORY_NOT_MOVABLE = "Root directory cannot be moved";
9604
+ const ERR_TARGET_NOT_DIRECTORY = "Target entry is not a directory";
9605
+ const ERR_PARENT_NOT_DIRECTORY = "Parent entry is not a directory";
9172
9606
  const ERR_READABLE_CONSUMED = "Readable stream already consumed";
9173
9607
  const DUPLICATES_THROW = "throw";
9174
9608
  const DUPLICATES_KEEP_FIRST = "keep-first";
@@ -9176,22 +9610,8 @@
9176
9610
  const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
9177
9611
  const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
9178
9612
  const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
9179
- const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
9613
+ const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
9180
9614
  const ERR_ABORT_EXPORT = "zipjs-abort-export";
9181
- const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
9182
- const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
9183
- EXTRAFIELD_TYPE_ZIP64,
9184
- EXTRAFIELD_TYPE_AES,
9185
- EXTRAFIELD_TYPE_NTFS,
9186
- EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
9187
- EXTRAFIELD_TYPE_UNICODE_PATH,
9188
- EXTRAFIELD_TYPE_UNICODE_COMMENT,
9189
- EXTRAFIELD_TYPE_USDZ,
9190
- EXTRAFIELD_TYPE_INFOZIP,
9191
- EXTRAFIELD_TYPE_UNIX,
9192
- EXTRAFIELD_TYPE_UNIX_TYPE1,
9193
- EXTRAFIELD_TYPE_PKWARE_UNIX
9194
- ]);
9195
9615
 
9196
9616
  class ZipEntry {
9197
9617
 
@@ -9323,7 +9743,7 @@
9323
9743
  }));
9324
9744
  return true;
9325
9745
  } catch (error) {
9326
- if (error.message == ERR_INVALID_PASSWORD) {
9746
+ if (isErrorObject(error) && error.message == ERR_INVALID_PASSWORD) {
9327
9747
  return false;
9328
9748
  } else {
9329
9749
  throw error;
@@ -9563,6 +9983,7 @@
9563
9983
  await initStream(reader);
9564
9984
  zipReader = new ZipReader(reader, options);
9565
9985
  }
9986
+ checkPassThroughValue(options.passThrough);
9566
9987
  const duplicates = checkDuplicatesOption(options.duplicates);
9567
9988
  const importedEntries = [];
9568
9989
  const entries = await zipReader.getEntries(options);
@@ -9653,18 +10074,25 @@
9653
10074
 
9654
10075
  async exportZip(writer, options = {}) {
9655
10076
  const zipEntry = this;
10077
+ const zipWriterProvided = Boolean(writer) && typeof writer.add == FUNCTION_TYPE;
9656
10078
  options = Object.assign({}, options);
9657
- if (options.bufferedWrite === UNDEFINED_VALUE) {
10079
+ if (!zipWriterProvided && options.bufferedWrite === UNDEFINED_VALUE) {
9658
10080
  options.bufferedWrite = true;
9659
10081
  }
9660
- const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
9661
- const zipWriter = new ZipWriter(writer, options);
10082
+ const [readers] = await Promise.all([
10083
+ initReaders(zipEntry, checkReaderOptions(options.readerOptions)),
10084
+ zipWriterProvided ? UNDEFINED_VALUE : initStream(writer)
10085
+ ]);
10086
+ const zipWriter = zipWriterProvided ? writer : new ZipWriter(writer, options);
9662
10087
  await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
10088
+ if (zipWriterProvided) {
10089
+ return zipWriter;
10090
+ }
9663
10091
  await zipWriter.close(options.globalComment);
9664
10092
  return writer.getData ? writer.getData() : writer.writable;
9665
10093
  }
9666
10094
 
9667
- getExportedSize(options = {}) {
10095
+ async getExportedSize(options = {}) {
9668
10096
  const zipEntry = this;
9669
10097
  options = Object.assign({}, options);
9670
10098
  checkReaderOptions(options.readerOptions);
@@ -9679,7 +10107,7 @@
9679
10107
  const writeOrderGuaranteed = !options.bufferedWrite ||
9680
10108
  (entries.every(entry => entry.options.keepOrder !== false) &&
9681
10109
  children.every(child => isImplicitDirectory(child) || !child.children.length));
9682
- return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
10110
+ return await getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
9683
10111
  }
9684
10112
 
9685
10113
  getChildByName(name) {
@@ -9740,7 +10168,7 @@
9740
10168
 
9741
10169
  move(entry, destination) {
9742
10170
  if (entry == this.root) {
9743
- throw new Error("Root directory cannot be moved");
10171
+ throw new Error(ERR_ROOT_DIRECTORY_NOT_MOVABLE);
9744
10172
  } else {
9745
10173
  if (destination.directory) {
9746
10174
  if (!destination.isDescendantOf(entry)) {
@@ -9761,7 +10189,7 @@
9761
10189
  throw new Error(ERR_ANCESTOR_ENTRY);
9762
10190
  }
9763
10191
  } else {
9764
- throw new Error("Target entry is not a directory");
10192
+ throw new Error(ERR_TARGET_NOT_DIRECTORY);
9765
10193
  }
9766
10194
  }
9767
10195
  }
@@ -10074,70 +10502,11 @@
10074
10502
  let zipEntryMetadata = {};
10075
10503
  let passThroughOptions = {};
10076
10504
  if (child.data instanceof Entry) {
10077
- const {
10078
- externalFileAttributes,
10079
- versionMadeBy,
10080
- comment,
10081
- lastModDate,
10082
- rawLastModDate,
10083
- creationDate,
10084
- lastAccessDate,
10085
- uncompressedSize,
10086
- encrypted,
10087
- zipCrypto,
10088
- crc32,
10089
- compressionMethod,
10090
- extraFieldAES,
10091
- internalFileAttributes,
10092
- extraField,
10093
- bitFlag,
10094
- uid,
10095
- gid
10096
- } = child.data;
10097
- zipEntryMetadata = {
10098
- externalFileAttributes,
10099
- versionMadeBy,
10100
- comment,
10101
- lastModDate,
10102
- creationDate,
10103
- lastAccessDate,
10104
- internalFileAttributes
10105
- };
10106
- const userExtraField = getUserExtraField(extraField);
10107
- if (userExtraField) {
10108
- zipEntryMetadata.extraField = userExtraField;
10109
- }
10110
- if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
10111
- Object.assign(zipEntryMetadata, {
10112
- uid,
10113
- gid,
10114
- unixExtraFieldType: INFOZIP_EXTRA_FIELD_TYPE
10115
- });
10116
- }
10117
- if (isPassThrough(child, options)) {
10118
- let encryptionStrength;
10119
- if (extraFieldAES) {
10120
- encryptionStrength = extraFieldAES.strength;
10121
- }
10122
- passThroughOptions = {
10123
- passThrough: true,
10124
- encrypted,
10125
- zipCrypto,
10126
- crc32,
10127
- uncompressedSize,
10128
- encryptionStrength,
10129
- compressionMethod
10130
- };
10131
- if (bitFlag) {
10132
- passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
10133
- }
10134
- const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
10135
- if (lastModDateOverride === UNDEFINED_VALUE) {
10136
- passThroughOptions.rawLastModDate = rawLastModDate;
10137
- } else if (zipCrypto && (!bitFlag || bitFlag.dataDescriptor) && lastModDateOverride instanceof Date &&
10138
- getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
10139
- throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
10140
- }
10505
+ const passThrough = isPassThrough(child, options);
10506
+ const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
10507
+ ({ entryOptions: zipEntryMetadata, passThroughOptions } = getSourceEntryOptions(child.data, passThrough, lastModDateOverride));
10508
+ if (passThrough) {
10509
+ passThroughOptions.passThrough = true;
10141
10510
  }
10142
10511
  }
10143
10512
  const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
@@ -10147,16 +10516,6 @@
10147
10516
  return { name, entryOptions };
10148
10517
  }
10149
10518
 
10150
- function getDosTimeHighByte(lastModDate) {
10151
- let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
10152
- if (dosLastModDate < MIN_DATE) {
10153
- dosLastModDate = MIN_DATE;
10154
- } else if (dosLastModDate > MAX_DATE) {
10155
- dosLastModDate = MAX_DATE;
10156
- }
10157
- return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
10158
- }
10159
-
10160
10519
  function getDeterminedSize(child, passThrough) {
10161
10520
  const { reader } = child;
10162
10521
  if (reader && reader.size !== UNDEFINED_VALUE) {
@@ -10169,9 +10528,18 @@
10169
10528
  if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
10170
10529
  throw new Error(ERR_INVALID_READER_OPTIONS);
10171
10530
  }
10531
+ if (readerOptions) {
10532
+ checkPassThroughValue(readerOptions.passThrough);
10533
+ }
10172
10534
  return readerOptions;
10173
10535
  }
10174
10536
 
10537
+ function checkPassThroughValue(passThrough) {
10538
+ if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
10539
+ throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
10540
+ }
10541
+ }
10542
+
10175
10543
  function replaceContent(zipEntry, params) {
10176
10544
  const { uncompressedSize } = params;
10177
10545
  Object.assign(zipEntry, params, {
@@ -10200,20 +10568,6 @@
10200
10568
  return child.directory && child.data === null;
10201
10569
  }
10202
10570
 
10203
- function getUserExtraField(extraField) {
10204
- if (extraField) {
10205
- const userExtraField = new Map();
10206
- extraField.forEach((field, type) => {
10207
- if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
10208
- userExtraField.set(type, field.data);
10209
- }
10210
- });
10211
- if (userExtraField.size) {
10212
- return userExtraField;
10213
- }
10214
- }
10215
- }
10216
-
10217
10571
  async function exportZip(zipWriter, entry, totalSize, options, readers) {
10218
10572
  const { onstart, onprogress, onend, onentryprogress } = options;
10219
10573
  const selectedEntry = entry;
@@ -10316,6 +10670,7 @@
10316
10670
 
10317
10671
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
10318
10672
  const { onstart, onprogress, onend } = options;
10673
+ checkPassThroughValue(options.passThrough);
10319
10674
  const readerOptions = checkReaderOptions(options.readerOptions);
10320
10675
  const abortController = new AbortController();
10321
10676
  const { signal } = abortController;
@@ -10391,7 +10746,7 @@
10391
10746
  if (exportAborted || isExportAborted(signal.reason)) {
10392
10747
  return;
10393
10748
  }
10394
- throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
10749
+ throwIfAborted(signal);
10395
10750
  }
10396
10751
  try {
10397
10752
  if (child.directory) {
@@ -10524,7 +10879,7 @@
10524
10879
  }
10525
10880
  return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
10526
10881
  } else {
10527
- throw new Error("Parent entry is not a directory");
10882
+ throw new Error(ERR_PARENT_NOT_DIRECTORY);
10528
10883
  }
10529
10884
  }
10530
10885
 
@@ -10658,7 +11013,7 @@
10658
11013
  */
10659
11014
 
10660
11015
 
10661
- c(setDefaultConfiguration);
11016
+ i(setDefaultConfiguration);
10662
11017
 
10663
11018
  exports.BlobReader = BlobReader;
10664
11019
  exports.BlobWriter = BlobWriter;
@@ -10666,6 +11021,7 @@
10666
11021
  exports.Data64URIWriter = Data64URIWriter;
10667
11022
  exports.ERR_ABORTED = ERR_ABORTED;
10668
11023
  exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
11024
+ exports.ERR_ANCESTOR_ENTRY = ERR_ANCESTOR_ENTRY;
10669
11025
  exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
10670
11026
  exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
10671
11027
  exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
@@ -10679,7 +11035,9 @@
10679
11035
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
10680
11036
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
10681
11037
  exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
11038
+ exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
10682
11039
  exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
11040
+ exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
10683
11041
  exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
10684
11042
  exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
10685
11043
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
@@ -10689,6 +11047,7 @@
10689
11047
  exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
10690
11048
  exports.ERR_INVALID_DUPLICATES = ERR_INVALID_DUPLICATES;
10691
11049
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
11050
+ exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
10692
11051
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
10693
11052
  exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
10694
11053
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
@@ -10707,6 +11066,7 @@
10707
11066
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
10708
11067
  exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
10709
11068
  exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
11069
+ exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
10710
11070
  exports.ERR_INVALID_READER = ERR_INVALID_READER;
10711
11071
  exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
10712
11072
  exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
@@ -10717,14 +11077,19 @@
10717
11077
  exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
10718
11078
  exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
10719
11079
  exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
11080
+ exports.ERR_INVALID_URI = ERR_INVALID_URI;
10720
11081
  exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
10721
11082
  exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
10722
11083
  exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
10723
11084
  exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
11085
+ exports.ERR_PARENT_NOT_DIRECTORY = ERR_PARENT_NOT_DIRECTORY;
10724
11086
  exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
10725
11087
  exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
11088
+ exports.ERR_ROOT_DIRECTORY_NOT_MOVABLE = ERR_ROOT_DIRECTORY_NOT_MOVABLE;
10726
11089
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
11090
+ exports.ERR_TARGET_NOT_DIRECTORY = ERR_TARGET_NOT_DIRECTORY;
10727
11091
  exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
11092
+ exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
10728
11093
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
10729
11094
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
10730
11095
  exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
@@ -10736,10 +11101,12 @@
10736
11101
  exports.ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH;
10737
11102
  exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
10738
11103
  exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
11104
+ exports.ERR_UNSUPPORTED_PASS_THROUGH_VALUE = ERR_UNSUPPORTED_PASS_THROUGH_VALUE;
10739
11105
  exports.ERR_UNSUPPORTED_SPLIT_USDZ = ERR_UNSUPPORTED_SPLIT_USDZ;
10740
11106
  exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
10741
11107
  exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
10742
11108
  exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
11109
+ exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
10743
11110
  exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
10744
11111
  exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
10745
11112
  exports.HttpRangeReader = HttpRangeReader;
@@ -10753,13 +11120,17 @@
10753
11120
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
10754
11121
  exports.VERSION = VERSION;
10755
11122
  exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
11123
+ exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
10756
11124
  exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
11125
+ exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
10757
11126
  exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
10758
11127
  exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
10759
11128
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
10760
11129
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
10761
11130
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
11131
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
10762
11132
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
11133
+ exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
10763
11134
  exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
10764
11135
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
10765
11136
  exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;