@zip.js/zip.js 2.18.2 → 2.20.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 (45) hide show
  1. package/BENCHMARKS.md +172 -144
  2. package/deno.json +1 -1
  3. package/dist/zip-core-external.js +192 -120
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +193 -119
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +192 -120
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +193 -119
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +192 -120
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +195 -121
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +194 -120
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +195 -121
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-native.js +195 -121
  20. package/dist/zip-native.min.js +1 -1
  21. package/dist/zip-web-worker-native.js +1 -1
  22. package/dist/zip-web-worker.js +1 -1
  23. package/dist/zip.js +194 -120
  24. package/dist/zip.min.js +1 -1
  25. package/index-native.cjs +195 -121
  26. package/index-native.min.js +1 -1
  27. package/index.cjs +194 -120
  28. package/index.d.cts +95 -26
  29. package/index.d.ts +95 -26
  30. package/index.min.js +1 -1
  31. package/lib/core/codec-pool.js +1 -2
  32. package/lib/core/codec-worker-web.js +11 -39
  33. package/lib/core/codec-worker.js +1 -2
  34. package/lib/core/configuration.js +1 -1
  35. package/lib/core/options.js +0 -2
  36. package/lib/core/streams/codec-stream.js +1 -1
  37. package/lib/core/version.js +1 -1
  38. package/lib/core/web-worker-base.js +2 -3
  39. package/lib/core/web-worker-inline-native.js +1 -1
  40. package/lib/core/web-worker-inline-wasm.js +1 -1
  41. package/lib/core/zip-reader.js +100 -40
  42. package/lib/core/zip-writer.js +75 -34
  43. package/lib/zip-core-reader.js +2 -0
  44. package/package.json +1 -1
  45. package/worker-message-property-names.js +1 -1
@@ -185,7 +185,6 @@
185
185
  const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
186
186
  const OPTION_USE_WEB_WORKERS = "useWebWorkers";
187
187
  const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
188
- const OPTION_TRANSFER_STREAMS = "transferStreams";
189
188
  const OPTION_PREVENT_CLOSE = "preventClose";
190
189
  const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
191
190
  const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
@@ -303,7 +302,7 @@
303
302
  */
304
303
 
305
304
 
306
- const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
305
+ const DEFAULT_CHUNK_SIZE$1 = 256 * 1024;
307
306
  const MINIMUM_CHUNK_SIZE = 64;
308
307
  const MINIMUM_PROPERTY_VALUE = 1;
309
308
  const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
@@ -445,7 +444,7 @@
445
444
  Object.assign(config, DEFAULT_CONFIGURATION);
446
445
  }
447
446
 
448
- const r=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],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],t=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],n=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],e=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],i=new Uint8Array(288);i.fill(8,0,144),i.fill(9,144,256),i.fill(7,256,280),i.fill(8,280,288);const w=new Uint8Array(30).fill(5);function L(r){const o=new Uint16Array(16);for(const t of r)o[t]++;o[0]=0;const t=new Uint16Array(17);for(let r=1;r<=15;r++)t[r+1]=t[r]+o[r];const n=new Uint16Array(r.length);for(let o=0;o<r.length;o++)r[o]&&(n[t[r[o]]++]=o);return {lengthCounts:o,symbols:n}}const u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",f=(U=()=>function(u){let f=0,U=0,g=0,l=new Uint8Array(1024),d=0,s=0;for(;!s;){s=N(1);const r=N(2);if(0==r)C();else if(1==r)K(L(i),L(w));else {if(2!=r)throw new Error("invalid deflate block type");K(...V());}}return l.subarray(0,d);function q(){if(f>=u.length)throw new Error("unexpected end of deflate data");return u[f++]}function N(r){for(;g<r;)U|=q()<<g,g+=8;const o=U&(1<<r)-1;return U>>>=r,g-=r,o}function C(){U=0,g=0;const r=q()|q()<<8;f+=2,a(d+r);for(let o=0;o<r;o++)l[d++]=q();}function K(e,i){let w=c(e);for(;256!=w;){if(w<256)a(d+1),l[d++]=w;else {const e=w-257,L=r[e]+N(o[e]),u=c(i),f=t[u]+N(n[u]);a(d+L);const U=d-f;for(let r=0;r<L;r++)l[d++]=l[U+r];}w=c(e);}}function V(){const r=N(5)+257,o=N(5)+1,t=N(4)+4,n=new Uint8Array(19);for(let r=0;r<t;r++)n[e[r]]=N(3);const i=L(n),w=new Uint8Array(r+o);let u=0;for(;u<w.length;){const r=c(i);if(r<16)w[u++]=r;else if(16==r){const r=w[u-1];let o=N(2)+3;for(;o--;)w[u++]=r;}else u+=17==r?N(3)+3:N(7)+11;}return [L(w.subarray(0,r)),L(w.subarray(r))]}function c(r){const{lengthCounts:o,symbols:t}=r;let n=0,e=0,i=0;for(let r=1;r<=15;r++){n|=N(1);const w=o[r];if(n-e<w)return t[i+(n-e)];i+=w,e=e+w<<1,n<<=1;}throw new Error("invalid huffman code")}function a(r){if(l.length<r){let o=2*l.length;for(;o<r;)o*=2;const t=new Uint8Array(o);t.set(l.subarray(0,d)),l=t;}}}(function(r){const o=(r=String(r).replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let n=0;n<o;n+=4){const o=u.indexOf(r[n])<<18|u.indexOf(r[n+1])<<12|(63&u.indexOf(r[n+2]))<<6|63&u.indexOf(r[n+3]);t.push(o>>16&255),"="!==r[n+2]&&t.push(o>>8&255),"="!==r[n+3]&&t.push(255&o);}return new Uint8Array(t)}("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")),r=>r({workerURI:r=>{const o="text/javascript";let t=U();if("string"==typeof t&&(t=(new TextEncoder).encode(t)),r){const r=new Blob([t],{type:o});return URL.createObjectURL(r)}return "data:"+o+";base64,"+function(r){let o="";const t=r.length;let n=0;for(;n+2<t;n+=3){const t=r[n]<<16|r[n+1]<<8|r[n+2];o+=u[t>>18&63]+u[t>>12&63]+u[t>>6&63]+u[63&t];}const e=t-n;if(1===e){const t=r[n]<<16;o+=u[t>>18&63]+u[t>>12&63]+"==";}else if(2===e){const t=r[n]<<16|r[n+1]<<8;o+=u[t>>18&63]+u[t>>12&63]+u[t>>6&63]+"=";}return o}(t)}}));var U;
447
+ const r=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],l=[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],s=[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],f=new Uint8Array(288);f.fill(8,0,144),f.fill(9,144,256),f.fill(7,256,280),f.fill(8,280,288);const t=new Uint8Array(30).fill(5);function o(r){const l=new Uint16Array(16);for(const s of r)l[s]++;l[0]=0;const s=new Uint16Array(17);for(let r=1;r<=15;r++)s[r+1]=s[r]+l[r];const e=new Uint16Array(r.length);for(let l=0;l<r.length;l++)r[l]&&(e[s[r[l]]++]=l);return {lengthCounts:l,symbols:e}}const c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",g$1=(a=()=>function(c){let g=0,a=0,W=0,y=new Uint8Array(1024),U=0,d=0;for(;!d;){d=F(1);const r=F(2);if(0==r)J();else if(1==r)i(o(f),o(t));else {if(2!=r)throw new Error("invalid deflate block type");i(...V());}}return y.subarray(0,U);function q(){if(g>=c.length)throw new Error("unexpected end of deflate data");return c[g++]}function F(r){for(;W<r;)a|=q()<<W,W+=8;const l=a&(1<<r)-1;return a>>>=r,W-=r,l}function J(){a=0,W=0;const r=q()|q()<<8;g+=2,Y(U+r);for(let l=0;l<r;l++)y[U++]=q();}function i(n,f){let t=T(n);for(;256!=t;){if(t<256)Y(U+1),y[U++]=t;else {const n=t-257,o=r[n]+F(l[n]),c=T(f),g=s[c]+F(e[c]);Y(U+o);const a=U-g;for(let r=0;r<o;r++)y[U++]=y[a+r];}t=T(n);}}function V(){const r=F(5)+257,l=F(5)+1,s=F(4)+4,e=new Uint8Array(19);for(let r=0;r<s;r++)e[n[r]]=F(3);const f=o(e),t=new Uint8Array(r+l);let c=0;for(;c<t.length;){const r=T(f);if(r<16)t[c++]=r;else if(16==r){const r=t[c-1];let l=F(2)+3;for(;l--;)t[c++]=r;}else c+=17==r?F(3)+3:F(7)+11;}return [o(t.subarray(0,r)),o(t.subarray(r))]}function T(r){const{lengthCounts:l,symbols:s}=r;let e=0,n=0,f=0;for(let r=1;r<=15;r++){e|=F(1);const t=l[r];if(e-n<t)return s[f+(e-n)];f+=t,n=n+t<<1,e<<=1;}throw new Error("invalid huffman code")}function Y(r){if(y.length<r){let l=2*y.length;for(;l<r;)l*=2;const s=new Uint8Array(l);s.set(y.subarray(0,U)),y=s;}}}(function(r){const l=(r=String(r).replace(/[^A-Za-z0-9+/=]/g,"")).length,s=[];for(let e=0;e<l;e+=4){const l=c.indexOf(r[e])<<18|c.indexOf(r[e+1])<<12|(63&c.indexOf(r[e+2]))<<6|63&c.indexOf(r[e+3]);s.push(l>>16&255),"="!==r[e+2]&&s.push(l>>8&255),"="!==r[e+3]&&s.push(255&l);}return new Uint8Array(s)}("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")),r=>r({workerURI:r=>{const l="text/javascript";let s=a();if("string"==typeof s&&(s=(new TextEncoder).encode(s)),r){const r=new Blob([s],{type:l});return URL.createObjectURL(r)}return "data:"+l+";base64,"+function(r){let l="";const s=r.length;let e=0;for(;e+2<s;e+=3){const s=r[e]<<16|r[e+1]<<8|r[e+2];l+=c[s>>18&63]+c[s>>12&63]+c[s>>6&63]+c[63&s];}const n=s-e;if(1===n){const s=r[e]<<16;l+=c[s>>18&63]+c[s>>12&63]+"==";}else if(2===n){const s=r[e]<<16|r[e+1]<<8;l+=c[s>>18&63]+c[s>>12&63]+c[s>>6&63]+"=";}return l}(s)}}));var a;
449
448
 
450
449
  /*
451
450
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -2394,7 +2393,7 @@
2394
2393
  */
2395
2394
 
2396
2395
 
2397
- const DEFAULT_CHUNK_SIZE = 64 * 1024;
2396
+ const DEFAULT_CHUNK_SIZE = 256 * 1024;
2398
2397
  const MESSAGE_EVENT_TYPE = "message";
2399
2398
  const MESSAGE_START = "start";
2400
2399
  const MESSAGE_PULL = "pull";
@@ -2600,7 +2599,7 @@
2600
2599
  class CodecWorker {
2601
2600
 
2602
2601
  constructor(workerData, { readable, writable }, workerOptions, onTaskFinished) {
2603
- const { options, config, streamOptions, useWebWorkers, transferStreams, workerURI } = workerOptions;
2602
+ const { options, config, streamOptions, useWebWorkers, workerURI } = workerOptions;
2604
2603
  let { createWorker } = workerOptions;
2605
2604
  const { signal } = streamOptions;
2606
2605
  if (createWorkerFailed) {
@@ -2617,7 +2616,6 @@
2617
2616
  workerOptions,
2618
2617
  workerURI,
2619
2618
  createWorker,
2620
- transferStreams,
2621
2619
  terminate() {
2622
2620
  return new Promise(resolve => {
2623
2621
  const { worker, busy } = workerData;
@@ -2795,12 +2793,6 @@
2795
2793
  const ABORT_EVENT_TYPE = "abort";
2796
2794
 
2797
2795
  let webWorkerSource, webWorkerURI, webWorkerOptions;
2798
- let transferStreamsSupported = true;
2799
- try {
2800
- transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
2801
- } catch {
2802
- // ignored
2803
- }
2804
2796
 
2805
2797
  setWebWorkerBackend(createWebWorkerInterface);
2806
2798
 
@@ -2887,14 +2879,11 @@
2887
2879
  });
2888
2880
  const { readable, options } = workerData;
2889
2881
  const { writable, closed, abortPipe } = watchClosedStream(workerData.writable, workerData);
2890
- let streamsTransferred;
2891
2882
  try {
2892
- streamsTransferred = sendMessage({
2883
+ sendMessage({
2893
2884
  type: MESSAGE_START,
2894
2885
  options,
2895
- config,
2896
- readable,
2897
- writable
2886
+ config
2898
2887
  }, workerData);
2899
2888
  } catch (error) {
2900
2889
  abortPipe();
@@ -2906,12 +2895,10 @@
2906
2895
  workerData.onTaskFinished();
2907
2896
  throw error;
2908
2897
  }
2909
- if (!streamsTransferred) {
2910
- Object.assign(workerData, {
2911
- reader: readable.getReader(),
2912
- writer: writable.getWriter()
2913
- });
2914
- }
2898
+ Object.assign(workerData, {
2899
+ reader: readable.getReader(),
2900
+ writer: writable.getWriter()
2901
+ });
2915
2902
  const { workerStartupTimeout } = config;
2916
2903
  if (!workerData.workerAlive && Number.isFinite(workerStartupTimeout) && workerStartupTimeout >= 0) {
2917
2904
  workerData.startupTimeout = setTimeout(() => onStartupTimeout(workerData), workerStartupTimeout);
@@ -2944,7 +2931,7 @@
2944
2931
  }
2945
2932
 
2946
2933
  async function closeWritable() {
2947
- if (!streamsTransferred && !writable.locked) {
2934
+ if (!writable.locked) {
2948
2935
  try {
2949
2936
  await writable.getWriter().close();
2950
2937
  } catch {
@@ -3135,31 +3122,14 @@
3135
3122
  }
3136
3123
  }
3137
3124
 
3138
- function sendMessage(message, { worker, writer, transferStreams, workerAlive }) {
3125
+ function sendMessage(message, { worker, writer }) {
3139
3126
  try {
3140
- const { value, readable, writable } = message;
3141
- const transferables = [];
3127
+ const { value } = message;
3142
3128
  if (value) {
3143
3129
  message.value = toExactUint8Array(value);
3144
- transferables.push(message.value.buffer);
3145
- }
3146
- if (transferStreams && transferStreamsSupported && workerAlive) {
3147
- if (readable) {
3148
- transferables.push(readable);
3149
- }
3150
- if (writable) {
3151
- transferables.push(writable);
3152
- }
3153
- } else {
3154
- message.readable = message.writable = null;
3155
- }
3156
- if (transferables.length) {
3157
3130
  try {
3158
- worker.postMessage(message, transferables);
3159
- return true;
3131
+ worker.postMessage(message, [message.value.buffer]);
3160
3132
  } catch {
3161
- transferStreamsSupported = false;
3162
- message.readable = message.writable = null;
3163
3133
  worker.postMessage(message);
3164
3134
  }
3165
3135
  } else {
@@ -3308,7 +3278,7 @@
3308
3278
 
3309
3279
  async function runWorker(stream, workerOptions) {
3310
3280
  const { options, config } = workerOptions;
3311
- const { transferStreams, useWebWorkers, useCompressionStream, compressed, checkCrc32, computeCrc32, encrypted, format, codecURI } = options;
3281
+ const { useWebWorkers, useCompressionStream, compressed, checkCrc32, computeCrc32, encrypted, format, codecURI } = options;
3312
3282
  const { workerURI, createWorker, maxWorkers } = config;
3313
3283
  if (format) {
3314
3284
  if (codecURI) {
@@ -3316,7 +3286,6 @@
3316
3286
  }
3317
3287
  await ensureCodecStreams(format, options.codecURI);
3318
3288
  }
3319
- workerOptions.transferStreams = !format && (transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams));
3320
3289
  const streamCopy = !compressed && !checkCrc32 && !computeCrc32 && !encrypted;
3321
3290
  const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
3322
3291
  workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
@@ -4812,6 +4781,8 @@
4812
4781
  const WARNING_PREPENDED_DATA = "prepended data";
4813
4782
  const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
4814
4783
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4784
+ const WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = "mismatched central directory offset";
4785
+ const WARNING_MISSING_ZIP64_EXTRA_FIELD = "missing zip64 extra field";
4815
4786
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4816
4787
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4817
4788
  const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
@@ -4974,6 +4945,8 @@
4974
4945
  reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
4975
4946
  }
4976
4947
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4948
+ } else if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || diskNumber == MAX_16_BITS) {
4949
+ throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
4977
4950
  }
4978
4951
  }
4979
4952
  let declaredDirectoryDataLength = directoryDataLength;
@@ -4996,25 +4969,44 @@
4996
4969
  if (directoryArray.length < 4) {
4997
4970
  throw new Error(ERR_BAD_FORMAT);
4998
4971
  }
4999
- const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
4972
+ let expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
5000
4973
  if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
5001
4974
  const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
5002
4975
  Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
5003
4976
  detectEncryptedCentralDirectory(directoryView);
5004
4977
  let reconcile = !storedPointsAtDirectory;
5005
- if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
5006
- const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
5007
- reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4978
+ if (expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
4979
+ const expectedPointsAtDirectory = await pointsAtDirectory(reader, expectedDirectoryDataOffset);
4980
+ if (storedPointsAtDirectory) {
4981
+ reconcile = expectedPointsAtDirectory;
4982
+ } else if (!expectedPointsAtDirectory) {
4983
+ const signatureRecordOffset = await findDigitalSignatureRecordOffset(reader, centralDirectoryEndOffset);
4984
+ const signedDirectoryDataOffset = signatureRecordOffset - directoryDataLength;
4985
+ if (signatureRecordOffset !== UNDEFINED_VALUE && signedDirectoryDataOffset >= 0 &&
4986
+ await pointsAtDirectory(reader, signedDirectoryDataOffset)) {
4987
+ expectedDirectoryDataOffset = signedDirectoryDataOffset;
4988
+ }
4989
+ }
5008
4990
  }
5009
4991
  if (reconcile) {
5010
4992
  const originalDirectoryDataOffset = directoryDataOffset;
5011
4993
  directoryDataOffset = expectedDirectoryDataOffset;
4994
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4995
+ directoryView = getDataView(directoryArray);
5012
4996
  if (directoryDataOffset > originalDirectoryDataOffset) {
5013
4997
  prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
5014
4998
  prependedCentralDirectory = storedPointsAtDirectory;
4999
+ } else {
5000
+ reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET);
5001
+ const offsetDelta = directoryDataOffset - originalDirectoryDataOffset;
5002
+ if (directoryArray.length >= CENTRAL_FILE_HEADER_LENGTH) {
5003
+ const localHeaderOffset = getUint32$1(directoryView, 42);
5004
+ if (!await startsWithSignature(reader, localHeaderOffset, LOCAL_FILE_HEADER_SIGNATURE) &&
5005
+ await startsWithSignature(reader, localHeaderOffset + offsetDelta, LOCAL_FILE_HEADER_SIGNATURE)) {
5006
+ prependedDataLength += offsetDelta;
5007
+ }
5008
+ }
5015
5009
  }
5016
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
5017
- directoryView = getDataView(directoryArray);
5018
5010
  }
5019
5011
  }
5020
5012
  }
@@ -5098,17 +5090,6 @@
5098
5090
  if (filename === UNDEFINED_VALUE) {
5099
5091
  filename = decodeText(rawFilename, rawFilenameEncoding);
5100
5092
  }
5101
- if (normalizeFilename) {
5102
- const normalizedFilename = normalizeFilename(filename);
5103
- if (normalizedFilename !== UNDEFINED_VALUE) {
5104
- filename = normalizedFilename;
5105
- }
5106
- }
5107
- if (isUnsafeFilename(filename, filenameValidation)) {
5108
- const error = new Error(ERR_UNSAFE_FILENAME);
5109
- error.filename = filename;
5110
- throw error;
5111
- }
5112
5093
  let comment = decode(rawComment, rawCommentEncoding, TEXT_TYPE_COMMENT);
5113
5094
  if (comment === UNDEFINED_VALUE) {
5114
5095
  comment = decodeText(rawComment, rawCommentEncoding);
@@ -5136,7 +5117,29 @@
5136
5117
  filename,
5137
5118
  comment
5138
5119
  });
5139
- if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
5120
+ let malformedExtraField;
5121
+ try {
5122
+ malformedExtraField = readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
5123
+ } catch (error) {
5124
+ if (checkAmbiguity || error.message != ERR_EXTRAFIELD_ZIP64_NOT_FOUND) {
5125
+ throw error;
5126
+ }
5127
+ fileEntry.zip64ExtraFieldMissing = true;
5128
+ addWarning(warnings, WARNING_MISSING_ZIP64_EXTRA_FIELD, fileEntry.filename);
5129
+ }
5130
+ filename = fileEntry.filename;
5131
+ if (normalizeFilename) {
5132
+ const normalizedFilename = normalizeFilename(filename);
5133
+ if (normalizedFilename !== UNDEFINED_VALUE) {
5134
+ filename = fileEntry.filename = normalizedFilename;
5135
+ }
5136
+ }
5137
+ if (isUnsafeFilename(filename, filenameValidation)) {
5138
+ const error = new Error(ERR_UNSAFE_FILENAME);
5139
+ error.filename = filename;
5140
+ throw error;
5141
+ }
5142
+ if (malformedExtraField) {
5140
5143
  addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
5141
5144
  }
5142
5145
  fileEntry.offset += prependedDataLength;
@@ -5165,11 +5168,12 @@
5165
5168
  const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
5166
5169
  const unixType = fileEntry.unixMode === UNDEFINED_VALUE ? unixExternalUpper : fileEntry.unixMode;
5167
5170
  const symlink = (unixType & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_SYMLINK;
5168
- const executable = !symlink && ((fileEntry.unixMode !== UNDEFINED_VALUE)
5169
- ? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
5170
- : (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
5171
5171
  const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
5172
5172
  const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
5173
+ const directory = modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE);
5174
+ const executable = !symlink && !directory && ((fileEntry.unixMode !== UNDEFINED_VALUE)
5175
+ ? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
5176
+ : (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)));
5173
5177
  Object.assign(fileEntry, {
5174
5178
  setuid,
5175
5179
  setgid,
@@ -5177,7 +5181,7 @@
5177
5181
  symlink,
5178
5182
  unixExternalUpper,
5179
5183
  executable,
5180
- directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || fileEntry.filename.endsWith(DIRECTORY_SIGNATURE),
5184
+ directory,
5181
5185
  zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
5182
5186
  });
5183
5187
  const entry = new Entry(fileEntry);
@@ -5233,10 +5237,10 @@
5233
5237
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5234
5238
  const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5235
5239
  startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5236
- if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5240
+ if (checkAmbiguity && (prependedDataLength > 0 || (filesLength && startOffset > splitZipSignatureLength))) {
5237
5241
  throwAmbiguousArchive(WARNING_PREPENDED_DATA);
5238
5242
  }
5239
- if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5243
+ if (prependedDataLength > 0 || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
5240
5244
  addWarning(warnings, WARNING_PREPENDED_DATA);
5241
5245
  }
5242
5246
  if (prependedCentralDirectory) {
@@ -5396,6 +5400,9 @@
5396
5400
 
5397
5401
  async getData(writer, fileEntry, readRanges, options = {}) {
5398
5402
  const zipEntry = this;
5403
+ if (zipEntry.zip64ExtraFieldMissing) {
5404
+ throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
5405
+ }
5399
5406
  const config = getConfiguration();
5400
5407
  const {
5401
5408
  reader,
@@ -5540,7 +5547,6 @@
5540
5547
  encrypted,
5541
5548
  useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
5542
5549
  useCompressionStream,
5543
- transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
5544
5550
  deflate64,
5545
5551
  format: registeredCodec ? registeredCodec.format : UNDEFINED_VALUE,
5546
5552
  codecURI: registeredCodec ? registeredCodec.codecURI : UNDEFINED_VALUE,
@@ -5634,6 +5640,30 @@
5634
5640
  return wrappedFilesLength % (MAX_16_BITS + 1) ? 0 : wrappedFilesLength;
5635
5641
  }
5636
5642
 
5643
+ function pointsAtDirectory(reader, offset) {
5644
+ return startsWithSignature(reader, offset, CENTRAL_FILE_HEADER_SIGNATURE);
5645
+ }
5646
+
5647
+ async function startsWithSignature(reader, offset, signature) {
5648
+ if (offset < 0 || offset + 4 > reader.size) {
5649
+ return false;
5650
+ }
5651
+ const signatureArray = await readUint8Array(reader, offset, 4);
5652
+ return getUint32$1(getDataView(signatureArray), 0) == signature;
5653
+ }
5654
+
5655
+ async function findDigitalSignatureRecordOffset(reader, endOffset) {
5656
+ const startOffset = Math.max(0, endOffset - (6 + MAX_16_BITS));
5657
+ const tailArray = await readUint8Array(reader, startOffset, endOffset - startOffset);
5658
+ const tailView = getDataView(tailArray);
5659
+ for (let indexByte = tailArray.length - 6; indexByte >= 0; indexByte--) {
5660
+ if (getUint32$1(tailView, indexByte) == DIGITAL_SIGNATURE_RECORD_SIGNATURE &&
5661
+ indexByte + 6 + getUint16$1(tailView, indexByte + 4) == tailArray.length) {
5662
+ return startOffset + indexByte;
5663
+ }
5664
+ }
5665
+ }
5666
+
5637
5667
  function readDigitalSignature(signatureRecordArray) {
5638
5668
  if (signatureRecordArray.length >= 6) {
5639
5669
  const signatureRecordView = getDataView(signatureRecordArray);
@@ -5765,29 +5795,27 @@
5765
5795
  readExtraFieldUnixDates(extraFieldUnixType1, directory);
5766
5796
  directory.extraFieldUnixType1 = extraFieldUnixType1;
5767
5797
  }
5798
+ const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5799
+ if (extraFieldExtendedTimestamp) {
5800
+ readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
5801
+ directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
5802
+ }
5768
5803
  const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
5769
5804
  if (extraFieldNTFS) {
5770
5805
  readExtraFieldNTFS(extraFieldNTFS, directory);
5771
5806
  directory.extraFieldNTFS = extraFieldNTFS;
5772
5807
  }
5773
- const extraFieldUnix = extraField.get(EXTRAFIELD_TYPE_UNIX);
5808
+ const extraFieldInfoZip = extraField.get(EXTRAFIELD_TYPE_INFOZIP);
5774
5809
  let unixIdsRead;
5810
+ if (extraFieldInfoZip) {
5811
+ unixIdsRead = readExtraFieldUnix(extraFieldInfoZip, directory, true);
5812
+ directory.extraFieldInfoZip = extraFieldInfoZip;
5813
+ }
5814
+ const extraFieldUnix = extraField.get(EXTRAFIELD_TYPE_UNIX);
5775
5815
  if (extraFieldUnix) {
5776
- unixIdsRead = readExtraFieldUnix(extraFieldUnix, directory, false);
5816
+ readExtraFieldUnix(extraFieldUnix, unixIdsRead ? {} : directory, false);
5777
5817
  directory.extraFieldUnix = extraFieldUnix;
5778
5818
  }
5779
- if (!unixIdsRead) {
5780
- const extraFieldInfoZip = extraField.get(EXTRAFIELD_TYPE_INFOZIP);
5781
- if (extraFieldInfoZip) {
5782
- readExtraFieldUnix(extraFieldInfoZip, directory, true);
5783
- directory.extraFieldInfoZip = extraFieldInfoZip;
5784
- }
5785
- }
5786
- const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5787
- if (extraFieldExtendedTimestamp) {
5788
- readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
5789
- directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
5790
- }
5791
5819
  const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
5792
5820
  if (extraFieldUSDZ) {
5793
5821
  directory.extraFieldUSDZ = extraFieldUSDZ;
@@ -6426,11 +6454,13 @@
6426
6454
  WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
6427
6455
  WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
6428
6456
  WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
6457
+ WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET: WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET,
6429
6458
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6430
6459
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6431
6460
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6432
6461
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
6433
6462
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6463
+ WARNING_MISSING_ZIP64_EXTRA_FIELD: WARNING_MISSING_ZIP64_EXTRA_FIELD,
6434
6464
  WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
6435
6465
  WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6436
6466
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
@@ -6563,13 +6593,14 @@
6563
6593
  return watchPromiseError(this, prependZipEntries(this, reader));
6564
6594
  }
6565
6595
 
6566
- appendZip(reader) {
6567
- return watchPromiseError(this, this.appendZipEntries(reader));
6596
+ appendZip(reader, options = {}) {
6597
+ return watchPromiseError(this, this.appendZipEntries(reader, options));
6568
6598
  }
6569
6599
 
6570
- async appendZipEntries(reader) {
6600
+ async appendZipEntries(reader, options = {}) {
6571
6601
  const zipWriter = this;
6572
6602
  const { pendingAddFileCalls, filenames, fileEntries } = zipWriter;
6603
+ const filter = checkFunctionOption(options.filter);
6573
6604
  while (pendingAddFileCalls.size) {
6574
6605
  await Promise.allSettled(Array.from(pendingAddFileCalls));
6575
6606
  }
@@ -6588,10 +6619,16 @@
6588
6619
  const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
6589
6620
  const zipReader$1 = new ZipReader(reader);
6590
6621
  const entries = await zipReader$1.getEntries();
6622
+ const keptEntries = [];
6623
+ for (const entry of entries) {
6624
+ if (!filter || await filter(entry)) {
6625
+ keptEntries.push(entry);
6626
+ }
6627
+ }
6591
6628
  await zipReader$1.close();
6592
6629
  await initStream(zipWriter.writer);
6593
6630
  const { directoryOffset } = zipReader$1;
6594
- entries.forEach(({ filename }) => {
6631
+ keptEntries.forEach(({ filename }) => {
6595
6632
  if (filenames.has(filename)) {
6596
6633
  throw new Error(ERR_DUPLICATED_NAME);
6597
6634
  }
@@ -6612,8 +6649,8 @@
6612
6649
  zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
6613
6650
  }
6614
6651
  }
6615
- const entryPositions = await copyZipData(zipWriter, reader, entries, directoryOffset);
6616
- entries.forEach(entry => {
6652
+ const entryPositions = await copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, Boolean(filter));
6653
+ keptEntries.forEach(entry => {
6617
6654
  const {
6618
6655
  version,
6619
6656
  rawLastModDate,
@@ -6669,6 +6706,7 @@
6669
6706
  rawExtraFieldExtendedTimestamp: EMPTY_UINT8_ARRAY,
6670
6707
  rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
6671
6708
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6709
+ rawCentralExtraFieldUnix: EMPTY_UINT8_ARRAY,
6672
6710
  rawExtraField,
6673
6711
  rawCentralExtraField: EMPTY_UINT8_ARRAY,
6674
6712
  headerArray,
@@ -7237,7 +7275,6 @@
7237
7275
  const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
7238
7276
  const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
7239
7277
  const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
7240
- const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
7241
7278
  const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
7242
7279
  const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
7243
7280
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
@@ -7303,7 +7340,6 @@
7303
7340
  ntfsTimestamp,
7304
7341
  keepOrder,
7305
7342
  useWebWorkers,
7306
- transferStreams,
7307
7343
  bufferedWrite,
7308
7344
  createTempStream,
7309
7345
  dataDescriptorSignature,
@@ -7362,7 +7398,7 @@
7362
7398
  if (reader) {
7363
7399
  reader = new GenericReader(reader);
7364
7400
  await initStream(reader);
7365
- if (!reader.readable && !reader.readUint8Array) {
7401
+ if (!reader.readUint8Array && !reader.readable) {
7366
7402
  throw new Error(ERR_INVALID_READER);
7367
7403
  }
7368
7404
  ({ size: contentSize } = reader);
@@ -7625,6 +7661,7 @@
7625
7661
  extraFieldExtendedTimestampTime,
7626
7662
  rawExtraFieldNTFS,
7627
7663
  rawExtraFieldUnix,
7664
+ rawCentralExtraFieldUnix,
7628
7665
  rawExtraFieldAES,
7629
7666
  } = headerInfo;
7630
7667
  const { dataDescriptorArray } = dataDescriptorInfo;
@@ -7649,7 +7686,6 @@
7649
7686
  rawExtraField,
7650
7687
  rawCentralExtraField,
7651
7688
  useWebWorkers,
7652
- transferStreams,
7653
7689
  onstart,
7654
7690
  onprogress,
7655
7691
  onend,
@@ -7691,6 +7727,7 @@
7691
7727
  rawExtraFieldExtendedTimestamp,
7692
7728
  rawExtraFieldNTFS,
7693
7729
  rawExtraFieldUnix,
7730
+ rawCentralExtraFieldUnix,
7694
7731
  rawExtraFieldAES,
7695
7732
  rawExtraField,
7696
7733
  rawCentralExtraField,
@@ -7737,7 +7774,6 @@
7737
7774
  encrypted: encrypted && !passThroughEncryption,
7738
7775
  useWebWorkers,
7739
7776
  useCompressionStream,
7740
- transferStreams,
7741
7777
  format,
7742
7778
  codecURI,
7743
7779
  compressionMethod
@@ -7915,6 +7951,7 @@
7915
7951
  rawExtraFieldNTFS = rawExtraFieldExtendedTimestamp = EMPTY_UINT8_ARRAY;
7916
7952
  }
7917
7953
  let rawExtraFieldUnix;
7954
+ let rawCentralExtraFieldUnix;
7918
7955
  try {
7919
7956
  const { uid, gid, unixExtraFieldType } = options;
7920
7957
  if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
@@ -7929,7 +7966,7 @@
7929
7966
  extraFieldUnix.writeBytes(uidBytes);
7930
7967
  extraFieldUnix.writeUint8(gidBytes.length);
7931
7968
  extraFieldUnix.writeBytes(gidBytes);
7932
- rawExtraFieldUnix = extraFieldUnix.array;
7969
+ rawExtraFieldUnix = rawCentralExtraFieldUnix = extraFieldUnix.array;
7933
7970
  } else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7934
7971
  const extraFieldUnix = createRecordWriter(8);
7935
7972
  extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
@@ -7937,11 +7974,15 @@
7937
7974
  extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
7938
7975
  extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
7939
7976
  rawExtraFieldUnix = extraFieldUnix.array;
7977
+ const centralExtraFieldUnix = createRecordWriter(4);
7978
+ centralExtraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
7979
+ centralExtraFieldUnix.writeUint16(0);
7980
+ rawCentralExtraFieldUnix = centralExtraFieldUnix.array;
7940
7981
  } else {
7941
- rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
7982
+ rawExtraFieldUnix = rawCentralExtraFieldUnix = EMPTY_UINT8_ARRAY;
7942
7983
  }
7943
7984
  } catch {
7944
- rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
7985
+ rawExtraFieldUnix = rawCentralExtraFieldUnix = EMPTY_UINT8_ARRAY;
7945
7986
  }
7946
7987
  if (compressionMethod === UNDEFINED_VALUE) {
7947
7988
  compressionMethod = compressed ? COMPRESSION_METHOD_DEFLATE : COMPRESSION_METHOD_STORE;
@@ -8033,6 +8074,7 @@
8033
8074
  rawExtraFieldExtendedTimestamp,
8034
8075
  rawExtraFieldNTFS,
8035
8076
  rawExtraFieldUnix,
8077
+ rawCentralExtraFieldUnix,
8036
8078
  rawExtraFieldAES,
8037
8079
  extraFieldLength
8038
8080
  };
@@ -8208,7 +8250,7 @@
8208
8250
  rawExtraFieldAES,
8209
8251
  rawComment,
8210
8252
  rawExtraFieldNTFS,
8211
- rawExtraFieldUnix,
8253
+ rawCentralExtraFieldUnix,
8212
8254
  rawExtraField,
8213
8255
  rawCentralExtraField,
8214
8256
  extraFieldExtendedTimestampFlag,
@@ -8270,7 +8312,7 @@
8270
8312
  rawExtraFieldZip64,
8271
8313
  rawExtraFieldAES,
8272
8314
  rawExtraFieldNTFS,
8273
- rawExtraFieldUnix,
8315
+ rawCentralExtraFieldUnix,
8274
8316
  rawExtraFieldTimestamp,
8275
8317
  rawExtraField,
8276
8318
  rawCentralExtraField);
@@ -8299,7 +8341,7 @@
8299
8341
  rawExtraFieldAES,
8300
8342
  rawExtraFieldExtendedTimestamp,
8301
8343
  rawExtraFieldNTFS,
8302
- rawExtraFieldUnix,
8344
+ rawCentralExtraFieldUnix,
8303
8345
  rawExtraField,
8304
8346
  rawCentralExtraField,
8305
8347
  rawComment,
@@ -8316,7 +8358,7 @@
8316
8358
  uncompressedSize,
8317
8359
  compressedSize
8318
8360
  } = fileEntry;
8319
- const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
8361
+ const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawCentralExtraFieldUnix, rawExtraField, rawCentralExtraField);
8320
8362
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
8321
8363
  if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
8322
8364
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
@@ -8352,7 +8394,7 @@
8352
8394
  directoryRecord.writeBytes(rawExtraFieldAES);
8353
8395
  directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
8354
8396
  directoryRecord.writeBytes(rawExtraFieldNTFS);
8355
- directoryRecord.writeBytes(rawExtraFieldUnix);
8397
+ directoryRecord.writeBytes(rawCentralExtraFieldUnix);
8356
8398
  directoryRecord.writeBytes(rawExtraField);
8357
8399
  directoryRecord.writeBytes(rawCentralExtraField);
8358
8400
  directoryRecord.writeBytes(rawComment);
@@ -8521,26 +8563,42 @@
8521
8563
  return rawExtraField;
8522
8564
  }
8523
8565
 
8524
- async function copyZipData(zipWriter, reader, entries, directoryOffset) {
8566
+ async function copyZipData(zipWriter, reader, entries, keptEntries, directoryOffset, compact) {
8525
8567
  const { writer } = zipWriter;
8526
8568
  const entryPositions = new Map();
8527
- if (writer.closeDisk) {
8569
+ if (writer.closeDisk || compact) {
8528
8570
  const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
8529
8571
  getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
8530
- let copiedLength = 0;
8531
- for (const entry of sortedEntries) {
8532
- const sourceOffset = getSourceOffset(reader, entry);
8533
- await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
8534
- if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
8535
- await writer.closeDisk();
8536
- }
8537
- entryPositions.set(entry, {
8538
- offset: getSegmentOffset(zipWriter, writer),
8539
- diskNumberStart: getDiskNumber(writer)
8540
- });
8541
- copiedLength = sourceOffset;
8572
+ const regionEnds = getRegionEnds(reader, sortedEntries, directoryOffset);
8573
+ const keptEntrySet = new Set(keptEntries);
8574
+ let copiedOffset = 0;
8575
+ let lastPosition;
8576
+ for (let indexEntry = 0; indexEntry < sortedEntries.length; indexEntry++) {
8577
+ const entry = sortedEntries[indexEntry];
8578
+ if (keptEntrySet.has(entry)) {
8579
+ const sourceOffset = getSourceOffset(reader, entry);
8580
+ if (sourceOffset < copiedOffset) {
8581
+ entryPositions.set(entry, lastPosition);
8582
+ } else {
8583
+ if (!compact) {
8584
+ await copyData(zipWriter, reader, copiedOffset, sourceOffset - copiedOffset);
8585
+ }
8586
+ if (writer.closeDisk && exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
8587
+ await writer.closeDisk();
8588
+ }
8589
+ lastPosition = {
8590
+ offset: getSegmentOffset(zipWriter, writer),
8591
+ diskNumberStart: getDiskNumber(writer)
8592
+ };
8593
+ entryPositions.set(entry, lastPosition);
8594
+ await copyData(zipWriter, reader, sourceOffset, regionEnds[indexEntry] - sourceOffset);
8595
+ copiedOffset = regionEnds[indexEntry];
8596
+ }
8597
+ }
8598
+ }
8599
+ if (!compact) {
8600
+ await copyData(zipWriter, reader, copiedOffset, directoryOffset - copiedOffset);
8542
8601
  }
8543
- await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
8544
8602
  } else {
8545
8603
  const baseOffset = zipWriter.offset;
8546
8604
  await copyData(zipWriter, reader, 0, directoryOffset);
@@ -8552,6 +8610,20 @@
8552
8610
  return entryPositions;
8553
8611
  }
8554
8612
 
8613
+ function getRegionEnds(reader, sortedEntries, directoryOffset) {
8614
+ const regionEnds = new Array(sortedEntries.length);
8615
+ let regionEnd = directoryOffset;
8616
+ for (let indexEntry = sortedEntries.length - 1; indexEntry >= 0; indexEntry--) {
8617
+ const sourceOffset = getSourceOffset(reader, sortedEntries[indexEntry]);
8618
+ const nextEntry = sortedEntries[indexEntry + 1];
8619
+ if (nextEntry && getSourceOffset(reader, nextEntry) > sourceOffset) {
8620
+ regionEnd = getSourceOffset(reader, nextEntry);
8621
+ }
8622
+ regionEnds[indexEntry] = regionEnd;
8623
+ }
8624
+ return regionEnds;
8625
+ }
8626
+
8555
8627
  async function copyData(zipWriter, reader, offset, size) {
8556
8628
  if (size > 0) {
8557
8629
  const { writer } = zipWriter;
@@ -8929,7 +9001,7 @@
8929
9001
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8930
9002
  */
8931
9003
 
8932
- const VERSION = "2.18.2";
9004
+ const VERSION = "2.20.0";
8933
9005
 
8934
9006
  /*
8935
9007
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9445,7 +9517,7 @@
9445
9517
  */
9446
9518
 
9447
9519
 
9448
- f(setDefaultConfiguration);
9520
+ g$1(setDefaultConfiguration);
9449
9521
 
9450
9522
  exports.BlobReader = BlobReader;
9451
9523
  exports.BlobWriter = BlobWriter;
@@ -9547,11 +9619,13 @@
9547
9619
  exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
9548
9620
  exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
9549
9621
  exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
9622
+ exports.WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET = WARNING_MISMATCHED_CENTRAL_DIRECTORY_OFFSET;
9550
9623
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
9551
9624
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
9552
9625
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
9553
9626
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
9554
9627
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
9628
+ exports.WARNING_MISSING_ZIP64_EXTRA_FIELD = WARNING_MISSING_ZIP64_EXTRA_FIELD;
9555
9629
  exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
9556
9630
  exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
9557
9631
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;