@zip.js/zip.js 2.8.49 → 2.8.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deno.json +1 -1
- package/dist/zip-core-external.js +333 -203
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +339 -203
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +567 -332
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +339 -547
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +567 -332
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +574 -332
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +574 -332
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +339 -203
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +339 -203
- package/dist/zip-native.min.js +1 -1
- package/dist/zip.js +339 -203
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +573 -331
- package/index-native.min.js +1 -1
- package/index.cjs +573 -331
- package/index.d.cts +167 -2
- package/index.d.ts +167 -2
- package/index.min.js +1 -1
- package/lib/core/codec-registry.js +2 -2
- package/lib/core/codec-worker-web.js +436 -0
- package/lib/core/codec-worker.js +23 -404
- package/lib/core/constants.js +5 -1
- package/lib/core/io.js +2 -1
- package/lib/core/options.js +8 -0
- package/lib/core/zip-fs.js +215 -110
- package/lib/core/zip-reader.js +90 -16
- package/lib/core/zip-writer.js +36 -13
- package/lib/zip-core-reader.js +6 -0
- package/lib/zip-core-writer.js +4 -0
- package/package.json +1 -1
package/index.cjs
CHANGED
|
@@ -111,6 +111,8 @@ const INFINITY_VALUE = Infinity;
|
|
|
111
111
|
const UNDEFINED_TYPE = "undefined";
|
|
112
112
|
const FUNCTION_TYPE = "function";
|
|
113
113
|
const OBJECT_TYPE = "object";
|
|
114
|
+
const STRING_TYPE = "string";
|
|
115
|
+
const NUMBER_TYPE = "number";
|
|
114
116
|
|
|
115
117
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
116
118
|
|
|
@@ -242,7 +244,7 @@ function resetConfiguration() {
|
|
|
242
244
|
const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:l,Promise:w,TextEncoder:u,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;256>t;t++){let e=t;for(let t=0;8>t;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;256>t;t++)for(let e=1;8>e;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[A,I,x,M,P,D,F,B]=C;class R{constructor(t){this.o=t||-1}append(t){let e=0|this.o;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;o>=s;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=B[255&t]^F[t>>>8&255]^D[t>>>16&255]^P[t>>>24&255]^M[255&n]^x[n>>>8&255]^I[n>>>16&255]^A[n>>>24&255]}}for(;n>s;s++)e=e>>>8^A[255&(e^t[s])];this.o=e}get(){return~this.o}}class U extends d{constructor(){let t;const e=new R;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}function W(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}function _(t){return new l(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=T.l(n);return 32===s?t.concat(e):T.h(e,s,0|n,t.slice(0,t.length-1))},bitLength(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+T.l(n)},m(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=T.S(e,t[n-1]&2147483648>>e-1,1)),t},S:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(e+o&31,e+o>32?n:s.pop(),1)),s}},V={bytes:{v(t){const e=T.bitLength(t)/8,n=new o(e);let s;for(let r=0;e>r;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},C(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(T.S(8*(3&n),s)),e}}},K=class{constructor(t){const e=this;e.blockSize=512,e.A=[1732584193,4023233417,2562383102,271733878,3285377520],e.I=[1518500249,1859775393,2400959708,3395469782],t?(e.M=t.M.slice(0),e.P=t.P.slice(0),e.D=t.D):e.reset()}reset(){const t=this;return t.M=t.A.slice(0),t.P=[],t.D=0,t}update(t){const e=this;"string"==typeof t&&(t=V.F.C(t));const n=e.P=T.concat(e.P,t),s=e.D,o=e.D=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e.B(c.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}R(){const t=this;let e=t.P;const n=t.M;e=T.concat(e,[T.S(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.D/4294967296)),e.push(0|t.D);e.length;)t.B(e.splice(0,16));return t.reset(),n}U(t,e,n,s){return t>19?t>39?t>59?t>79?void 0:e^n^s:e&n|e&s|n&s:e^n^s:e&n|~e&s}W(t,e){return e<<t|e>>>32-t}B(e){const n=this,r=n.M,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let c=r[0],i=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;79>=t;t++){16>t||(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,c)+n.U(t,i,a,f)+l+o[t]+n.I[s.floor(t/20)]|0;l=f,f=a,a=n.W(30,i),i=c,c=e}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,e,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,w;const u=new ArrayBuffer(o),h=new l(u);let p=0;const d=T;for(e=V.bytes.C(e),w=1;(o||1)>p;w++){for(c=i=t.encrypt(d.concat(e,[w])),a=1;n>a;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;(o||1)>p&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return u.slice(0,s/8)},_:class{constructor(t){const e=this,n=e.V=K,s=[[],[]];e.K=[new n,new n];const r=e.K[0].blockSize/32;t.length>r&&(t=(new n).update(t).R());for(let e=0;r>e;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.K[0].update(s[0]),e.K[1].update(s[1]),e.L=new n(e.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,e=t.L.R(),n=new t.V(t.K[1]).update(e).R();return t.reset(),n}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="Invalid signature",H=j,N="zipjs-abort-check-password";function q(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const G=16,J={name:"PBKDF2"},Q=e.assign({hash:{name:"HMAC"}},J),X=e.assign({iterations:1e3,hash:{name:"SHA-1"}},J),Y=["deriveBits"],Z=[8,12,16],$=[16,24,32],tt=10,et=[0,0,0,0],nt=typeof h!=b,st=nt&&h.subtle,rt=nt&&typeof st!=b,ot=V.bytes,ct=class{constructor(t){const e=this;e.j=[[[],[],[],[],[]],[[],[],[],[],[]]],e.j[0][0][0]||e.H();const n=e.j[0][4],s=e.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.I=[i=t.slice(0),a=[]],c=o;4*o+28>c;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const e=i[3&t?c:c-4];a[t]=4>=c||4>t?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],e=this.j[1],n=t[4],s=e[4],r=[],o=[];let c,i,a,f;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=c=0;!n[l];l^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[i=r[l]]];let w=16843009*f^65537*a^257*i^16843008*l,u=257*r[o]^16843008*o;for(let n=0;4>n;n++)t[n][l]=u=u<<24^u>>>8,e[n][o]=w=w<<24^w>>>8}for(let n=0;5>n;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.I[e],s=n.length/4-2,o=[0,0,0,0],c=this.j[e],i=c[0],a=c[1],f=c[2],l=c[3],w=c[4];let u,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],S=t[e?1:3]^n[3],g=4;for(let t=0;s>t;t++)u=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&S]^n[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^l[255&d]^n[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^l[255&y]^n[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[g+3],g+=4,d=u,y=h,m=p;for(let t=0;4>t;t++)o[e?3&-t:t]=w[d>>>24]<<24^w[y>>16&255]<<16^w[m>>8&255]<<8^w[255&S]^n[g++],u=d,d=y,y=m,m=S,S=u;return o}},it=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=T.bitLength(e);for(let r=0;s>r;r+=4){this.$(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return T.m(e,r)}},at=E._;let ft=nt&&rt&&typeof st.importKey==k,lt=nt&&rt&&typeof st.deriveBits==k;class wt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:c,strength:i,et:a,ready:f}=n;c?(await(async(t,e,n,s)=>{const o=await dt(t,e,n,mt(s,0,Z[e])),c=mt(s,Z[e]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)})(n,i,c,mt(t,0,Z[i]+2)),t=mt(t,Z[i]+2),s?e.error(new r(N)):a()):await f;const l=new o(t.length-tt-(t.length-tt)%G);e.enqueue(pt(n,t,l,0,tt,!0))},async flush(t){const{nt:e,st:n,pending:s,ready:o}=this;if(n&&e){await o;const i=mt(s,0,s.length-tt),a=mt(s,s.length-tt);let f=z;if(i.length){const t=gt(ot,i);n.update(t);const s=e.update(t);f=St(ot,s)}const l=mt(St(ot,n.digest()),0,tt);let w=s.length<tt?1:0;for(let t=0;tt>t;t++)w|=l[t]^a[t];if(w&&c)throw new r(H);t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,et:c,ready:i}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=q(new o(Z[e]));return W(s,await dt(t,e,n,s))})(n,r,s),c()):await i;const f=new o(a.length+t.length-t.length%G);f.set(a,0),e.enqueue(pt(n,t,f,a.length,0))},async flush(t){const{nt:e,st:n,pending:s,ready:r}=this;if(n&&e){await r;let o=z;if(s.length){const t=e.update(gt(ot,s));n.update(t),o=St(ot,t)}const c=St(ot,n.digest()).slice(0,tt);t.enqueue(W(o,c))}}})}}function ht(t,n,s,r){e.assign(t,{ready:new w(e=>t.et=e),password:yt(n,s),strength:r-1,pending:z})}function pt(t,e,n,s,r,c){const{nt:i,st:a,pending:f}=t;f.length&&(e=W(f,e));const l=e.length-r;let w;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%G)),w=0;l-G>=w;w+=G){const t=gt(ot,mt(e,w,w+G));c&&a.update(t);const r=i.update(t);c||a.update(r),n.set(St(ot,r),w+s)}return t.pending=mt(e,w),n}async function dt(n,s,r,c){n.password=null;const i=await(async(t,e,n,s,r)=>{if(!ft)return E.importKey(e);try{return await st.importKey("raw",e,n,!1,r)}catch{return ft=!1,E.importKey(e)}})(0,r,Q,0,Y),a=await(async(t,e,n)=>{if(!lt)return E.T(e,t.salt,X.iterations,n);try{return await st.deriveBits(t,e,n)}catch{return lt=!1,E.T(e,t.salt,X.iterations,n)}})(e.assign({salt:c},X),i,8*(2*$[s]+2)),f=new o(a),l=gt(ot,mt(f,0,$[s])),w=gt(ot,mt(f,$[s],2*$[s])),u=mt(f,2*$[s]);return e.assign(n,{keys:{key:l,ot:w,passwordVerification:u},nt:new it(new ct(l),t.from(et)),st:new at(w)}),u}function yt(t,e){return e===v?(t=>{if(typeof u==b){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new u).encode(t)})(t):e}function mt(t,e,n){return t.subarray(e,n)}function St(t,e){return t.v(e)}function gt(t,e){return t.C(e)}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=zt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e[11]^n.passwordVerification))throw new r(O);t=t.subarray(12)}s?e.error(new r(N)):e.enqueue(zt(n,t))}})}}class bt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=q(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(Ct(n,e),0),r=12}else s=new o(t.length),r=0;s.set(Ct(n,t),r),e.enqueue(s)}})}}function kt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,ct:new R(r[0]),it:new R(r[2])}),s)for(let e=0;e<s.length;e++)At(t,s[e]);else for(let e=0;e<n.length;e++)At(t,n.charCodeAt(e))})(t,n,s)}function zt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,n[s]);return n}function Ct(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,e[s]);return n}function At(t,e){let[,n]=t.keys;t.ct.append([e]);const r=~t.ct.get();n=Mt(s.imul(Mt(n+xt(r)),134775813)+1),t.it.append([n>>>24]);const o=~t.it.get();t.keys=[r,n,o]}function It(t){const e=2|t.keys[2];return xt(s.imul(e,1^e)>>>8)}function xt(t){return 255&t}function Mt(t){return 4294967295&t}const Pt=new f;function Dt(t){return Pt.get(t)}const Ft="Invalid uncompressed size",Bt=j,Rt="deflate-raw",Ut="gzip",Wt=[31,139,8];class _t extends d{constructor(t,{chunkSize:e,CompressionStreamFallback:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:w,format:u,compressionMethod:h}=t,p=this;let d,y,m,S=super.readable;const g=u&&Dt(u),v=a&&r&&!w&&!g&&(!o||i)&&!(!c||!s);if(o&&!i||!a||v||(d=new U,S=jt(S,d)),r)if(g)S=Ht(S,Lt(g.CompressionStream,u,{level:f,chunkSize:e,compressionMethod:h}));else if(v)m=new Tt,S=Ht(S,new s(Ut)),S=jt(S,m);else try{S=Ot(S,c,{level:f,chunkSize:e},s,n)}catch(t){let e;try{e=new s(Ut)}catch{throw t}S=Ht(S,e),S=jt(S,new Tt)}o&&(i?S=jt(S,new bt(t)):(y=new ut(t),S=jt(S,y))),Et(p,S,()=>{o&&!i||!a||(p.crc32=v?m.crc32:new l(d.value.buffer).getUint32(0))})}}class Tt extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const o=n.length+t.length;if(8>=o)return void(n=W(n,t));const c=o-8,i=s.min(c,n.length);r.enqueue(W(n.subarray(0,i),t.subarray(0,c-i))),n=W(n.subarray(i),t.subarray(c-i))},flush(){const e=_(n);t.crc32=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Vt extends d{constructor(t,{chunkSize:e,DecompressionStreamFallback:n,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:u,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=jt(C,new vt(t)):(z=new wt(t),C=jt(C,z))),u){const t=m&&Dt(m);if(t)C=Ht(C,Lt(t.DecompressionStream,m,{chunkSize:e,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Ot(C,h,{chunkSize:e,deflate64:p},s,n)}catch(t){if(p||b===v)throw t;let e;try{e=new s(Ut)}catch{throw t}C=((t,e,n)=>{const s=new R;let c,i,a,f=0,l=!1;const u=new w((t,e)=>{i=t,a=e});u.catch(()=>{}),n||i();const h=new d({start(t){const e=new o(10);e.set(Wt),t.enqueue(e)},transform(t,e){e.enqueue(t)},async flush(t){l=!0,y();try{await u}finally{m()}const e=new o(8),r=_(e);r.setUint32(0,s.get(),!0),r.setUint32(4,n,!0),t.enqueue(e)},cancel(t){a(t)}}),p=new d({transform(t,e){s.append(t),f+=t.length,n>f?l&&y():i(),e.enqueue(t)},cancel(t){a(t)}});return t=jt(t,h),jt(t=Ht(t,e),p);function y(){m(),c=setTimeout(()=>a(new r(Ft)),5e3)}function m(){clearTimeout(c)}})(C,e,b)}C=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(C)}a&&(k=new U,C=jt(C,k)),Et(this,C,()=>{if(a){const t=new l(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r(Bt)}})}}const Kt=new f;function Et(t,n,s){n=jt(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Lt(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function Ot(t,e,n,s,r){const o=e&&s?s:r||s,c=n.deflate64?"deflate64-raw":Rt;let i;try{i=new o(c,n)}catch(t){if(!e||!r||o==r)throw t;i=new r(c,n)}return Ht(t,i)}function jt(t,e){return(t=>{if(t instanceof y)return t;const e=t.getReader();return new y({async pull(t){const{value:n,done:s}=await e.read();s?t.close():t.enqueue(n)},cancel:t=>e.cancel(t)})})(t).pipeThrough(e)}function Ht(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const Nt="data",qt="close",Gt="deflate";class Jt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Gt)?c=_t:o.startsWith("inflate")&&(c=Vt),s.outputSize=0;let i=0;const a=new c(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(i+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:i})}}),w=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Ft)},flush(){const{crc32:t}=a;e.assign(s,{crc32:t,inputSize:i})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(w)})}}class Qt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;t>r;){const s=e[0],o=t-r;s.length>o?(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o):(n.set(s,r),r+=s.length,e.shift())}return s-=t,n}n.isFinite(t)&&t>=1||(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Xt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Xt=navigator.hardwareConcurrency)}catch{}const Yt=new f,Zt=new f;let $t,te,ee,ne,se,re,oe=0;async function ce(t){let e,o;try{const{options:c,config:i}=t;if(c.format)try{await(async(t,e)=>{!Pt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=k&&typeof s!=k)throw new r("Invalid codec module");Pt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!((t,e)=>{if(!t)return!1;let n=Kt.get(t);n||(n=new f,Kt.set(t,n));let s=n.get(e);if(s===v){try{new t(e),s=!0}catch{s=!1}n.set(e,s)}return s})(c.codecType.startsWith(Gt)?i.CompressionStream:i.DecompressionStream,Rt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},l=t.readable||new y({async pull(t){const e=new w(t=>Yt.set(oe,t));ie({type:"pull",messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable||new m({async write(t){let e;const s=new w(t=>e=t);Zt.set(oe,e),ie({type:Nt,value:t,messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Jt(c,i),$t=new AbortController;const{signal:u}=$t;await l.pipeThrough(e).pipeThrough(new Qt((t=>s.max(t.chunkSize,64))(i))).pipeTo(o,{signal:u,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=e;ie({type:qt,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}ae(t)}}function ie(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function ae(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:e,stack:n,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}function fe(t,e,n={}){if(!te){const t=new r("WASM module not loaded");throw t.cause=re,t}const c="number"==typeof n.level?n.level:-1,i="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.ft=ee(i),this.in=ee(a),this.inBufferSize=a,!this.ft||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=te.deflate_process,this.ut=te.deflate_last_consumed,this.ht=te.deflate_end,this.yt=te.deflate_new(),n="gzip"===e?te.deflate_init_gzip(this.yt,c):"deflate-raw"===e?te.deflate_init_raw(this.yt,c):te.deflate_init(this.yt,c)):"deflate64-raw"===e?(this.wt=te.inflate9_process,this.ut=te.inflate9_last_consumed,this.ht=te.inflate9_end,this.yt=te.inflate9_new(),n=te.inflate9_init_raw(this.yt)):(this.wt=te.inflate_process,this.ut=te.inflate_last_consumed,this.ht=te.inflate_end,this.yt=te.inflate_new(),n="deflate-raw"===e?te.inflate_init_raw(this.yt):"gzip"===e?te.inflate_init_gzip(this.yt):te.inflate_init(this.yt)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const c=e,a=new o(se.buffer),f=this.wt,l=this.ut,w=this.ft,u=this.lt;let h=0;for(;h<c.length;){const e=s.min(c.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&ne&&(ne(this.in),this.in=0),this.in=ee(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(c.subarray(h,h+e),this.in);const o=f(this.yt,this.in,e,w,i,0),p=16777215&o;if(p&&(u.set(a.subarray(w,w+p),0),n.enqueue(u.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(0>e)throw new r("process error:"+e)}const d=l(this.yt);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(se.buffer),s=this.wt,c=this.ft,a=this.lt;for(;;){const o=s(this.yt,0,0,c,i,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(0>t)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(c,c+f),0),e.enqueue(a.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.yt&&t.ht&&(e=t.ht(t.yt)),t.yt=0,t.in&&ne&&ne(t.in),t.in=0,t.ft&&ne&&ne(t.ft),t.ft=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&ce(t),e==Nt){const t=Yt.get(n);Yt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=Zt.get(n);Zt.delete(n),t()}e==qt&&$t.abort()}catch(t){ae(t)}}),p({type:"ready"});class le{constructor(t="deflate",e){return fe(!0,t,e)}}class we{constructor(t="deflate",e){return fe(!1,t,e)}}le.St=!0,we.St=!0;let ue=!1;((t={})=>{const{init:e}=t,n=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{e&&await e(t),n&&(t.CompressionStreamFallback=n),s&&(t.DecompressionStreamFallback=s)}})({CompressionStreamFallback:le,DecompressionStreamFallback:we,init:t=>(async(t,{baseURI:e})=>{if(!ue)try{await(async(t,e)=>{let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;s>t;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(te=t,({malloc:ee,free:ne,memory:se}=te),"function"!=typeof ee||"function"!=typeof ne||!se)throw te=ee=ne=se=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports)})(t,e),ue=!0}catch(t){throw(t=>{re=t})(t),t}})(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+(t=>{let n="";const s=t.length;let r=0;for(;s>r+2;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+e[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e[s>>18&63]+e[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+"=";}return n})(s)}});
|
|
243
245
|
|
|
244
246
|
/*
|
|
245
|
-
Copyright (c)
|
|
247
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
246
248
|
|
|
247
249
|
Redistribution and use in source and binary forms, with or without
|
|
248
250
|
modification, are permitted provided that the following conditions are met:
|
|
@@ -270,72 +272,19 @@ const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,2
|
|
|
270
272
|
*/
|
|
271
273
|
|
|
272
274
|
|
|
273
|
-
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const RESERVED_COMPRESSION_METHODS = [
|
|
279
|
-
COMPRESSION_METHOD_STORE,
|
|
280
|
-
COMPRESSION_METHOD_DEFLATE,
|
|
281
|
-
COMPRESSION_METHOD_DEFLATE_64,
|
|
282
|
-
COMPRESSION_METHOD_AES
|
|
283
|
-
];
|
|
284
|
-
|
|
285
|
-
const registeredCodecs = new Map();
|
|
286
|
-
const codecStreams = new Map();
|
|
287
|
-
|
|
288
|
-
function registerCodec(codec = {}) {
|
|
289
|
-
const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
|
|
290
|
-
if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
|
|
291
|
-
typeof format != STRING_TYPE || !format.length) {
|
|
292
|
-
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
293
|
-
}
|
|
294
|
-
if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
|
|
295
|
-
throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
|
|
296
|
-
}
|
|
297
|
-
const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
|
|
298
|
-
if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
|
|
299
|
-
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
300
|
-
}
|
|
301
|
-
registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
|
|
302
|
-
if (hasStreams) {
|
|
303
|
-
setCodecStreams(format, { CompressionStream, DecompressionStream });
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
function unregisterCodec(compressionMethod) {
|
|
308
|
-
const codec = registeredCodecs.get(compressionMethod);
|
|
309
|
-
if (codec) {
|
|
310
|
-
registeredCodecs.delete(compressionMethod);
|
|
311
|
-
let formatUsed;
|
|
312
|
-
registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
|
|
313
|
-
if (!formatUsed) {
|
|
314
|
-
codecStreams.delete(codec.format);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
function getRegisteredCodec(compressionMethod) {
|
|
320
|
-
return registeredCodecs.get(compressionMethod);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
function getCodecStreams(format) {
|
|
324
|
-
return codecStreams.get(format);
|
|
275
|
+
function concat(first, second) {
|
|
276
|
+
const result = new Uint8Array(first.length + second.length);
|
|
277
|
+
result.set(first);
|
|
278
|
+
result.set(second, first.length);
|
|
279
|
+
return result;
|
|
325
280
|
}
|
|
326
281
|
|
|
327
|
-
function
|
|
328
|
-
|
|
329
|
-
if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
|
|
330
|
-
throw new Error(ERR_INVALID_CODEC_MODULE);
|
|
331
|
-
}
|
|
332
|
-
codecStreams.set(format, { CompressionStream, DecompressionStream });
|
|
282
|
+
function toExactUint8Array(array) {
|
|
283
|
+
return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
|
|
333
284
|
}
|
|
334
285
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
|
|
338
|
-
}
|
|
286
|
+
function getDataView(array) {
|
|
287
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
339
288
|
}
|
|
340
289
|
|
|
341
290
|
/*
|
|
@@ -520,50 +469,6 @@ function encodeText(value) {
|
|
|
520
469
|
}
|
|
521
470
|
}
|
|
522
471
|
|
|
523
|
-
/*
|
|
524
|
-
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
525
|
-
|
|
526
|
-
Redistribution and use in source and binary forms, with or without
|
|
527
|
-
modification, are permitted provided that the following conditions are met:
|
|
528
|
-
|
|
529
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
530
|
-
this list of conditions and the following disclaimer.
|
|
531
|
-
|
|
532
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
533
|
-
notice, this list of conditions and the following disclaimer in
|
|
534
|
-
the documentation and/or other materials provided with the distribution.
|
|
535
|
-
|
|
536
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
537
|
-
derived from this software without specific prior written permission.
|
|
538
|
-
|
|
539
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
540
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
541
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
542
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
543
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
544
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
545
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
546
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
547
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
548
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
549
|
-
*/
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
function concat(first, second) {
|
|
553
|
-
const result = new Uint8Array(first.length + second.length);
|
|
554
|
-
result.set(first);
|
|
555
|
-
result.set(second, first.length);
|
|
556
|
-
return result;
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
function toExactUint8Array(array) {
|
|
560
|
-
return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
function getDataView(array) {
|
|
564
|
-
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
565
|
-
}
|
|
566
|
-
|
|
567
472
|
// Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
|
|
568
473
|
|
|
569
474
|
// deno-lint-ignore-file no-this-alias
|
|
@@ -1933,6 +1838,102 @@ function toCompatibleWritable(writable) {
|
|
|
1933
1838
|
});
|
|
1934
1839
|
}
|
|
1935
1840
|
|
|
1841
|
+
/*
|
|
1842
|
+
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
1843
|
+
|
|
1844
|
+
Redistribution and use in source and binary forms, with or without
|
|
1845
|
+
modification, are permitted provided that the following conditions are met:
|
|
1846
|
+
|
|
1847
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
1848
|
+
this list of conditions and the following disclaimer.
|
|
1849
|
+
|
|
1850
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
1851
|
+
notice, this list of conditions and the following disclaimer in
|
|
1852
|
+
the documentation and/or other materials provided with the distribution.
|
|
1853
|
+
|
|
1854
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
1855
|
+
derived from this software without specific prior written permission.
|
|
1856
|
+
|
|
1857
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
1858
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
1859
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
1860
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
1861
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
1862
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
1863
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
1864
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
1865
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
1866
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
1867
|
+
*/
|
|
1868
|
+
|
|
1869
|
+
|
|
1870
|
+
const ERR_INVALID_CODEC_DEFINITION = "Invalid codec definition";
|
|
1871
|
+
const ERR_RESERVED_COMPRESSION_METHOD = "Reserved compression method";
|
|
1872
|
+
const ERR_INVALID_CODEC_MODULE = "Invalid codec module";
|
|
1873
|
+
|
|
1874
|
+
const RESERVED_COMPRESSION_METHODS = [
|
|
1875
|
+
COMPRESSION_METHOD_STORE,
|
|
1876
|
+
COMPRESSION_METHOD_DEFLATE,
|
|
1877
|
+
COMPRESSION_METHOD_DEFLATE_64,
|
|
1878
|
+
COMPRESSION_METHOD_AES
|
|
1879
|
+
];
|
|
1880
|
+
|
|
1881
|
+
const registeredCodecs = new Map();
|
|
1882
|
+
const codecStreams = new Map();
|
|
1883
|
+
|
|
1884
|
+
function registerCodec(codec = {}) {
|
|
1885
|
+
const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
|
|
1886
|
+
if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
|
|
1887
|
+
typeof format != STRING_TYPE || !format.length) {
|
|
1888
|
+
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
1889
|
+
}
|
|
1890
|
+
if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
|
|
1891
|
+
throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
|
|
1892
|
+
}
|
|
1893
|
+
const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
|
|
1894
|
+
if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
|
|
1895
|
+
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
1896
|
+
}
|
|
1897
|
+
registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
|
|
1898
|
+
if (hasStreams) {
|
|
1899
|
+
setCodecStreams(format, { CompressionStream, DecompressionStream });
|
|
1900
|
+
}
|
|
1901
|
+
}
|
|
1902
|
+
|
|
1903
|
+
function unregisterCodec(compressionMethod) {
|
|
1904
|
+
const codec = registeredCodecs.get(compressionMethod);
|
|
1905
|
+
if (codec) {
|
|
1906
|
+
registeredCodecs.delete(compressionMethod);
|
|
1907
|
+
let formatUsed;
|
|
1908
|
+
registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
|
|
1909
|
+
if (!formatUsed) {
|
|
1910
|
+
codecStreams.delete(codec.format);
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
function getRegisteredCodec(compressionMethod) {
|
|
1916
|
+
return registeredCodecs.get(compressionMethod);
|
|
1917
|
+
}
|
|
1918
|
+
|
|
1919
|
+
function getCodecStreams(format) {
|
|
1920
|
+
return codecStreams.get(format);
|
|
1921
|
+
}
|
|
1922
|
+
|
|
1923
|
+
function setCodecStreams(format, streams) {
|
|
1924
|
+
const { CompressionStream, DecompressionStream } = streams;
|
|
1925
|
+
if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
|
|
1926
|
+
throw new Error(ERR_INVALID_CODEC_MODULE);
|
|
1927
|
+
}
|
|
1928
|
+
codecStreams.set(format, { CompressionStream, DecompressionStream });
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
async function ensureCodecStreams(format, codecURI) {
|
|
1932
|
+
if (!codecStreams.has(format) && codecURI) {
|
|
1933
|
+
setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
|
|
1934
|
+
}
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1936
1937
|
/*
|
|
1937
1938
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
1938
1939
|
|
|
@@ -2486,8 +2487,8 @@ class ChunkStream extends TransformStream {
|
|
|
2486
2487
|
1. Redistributions of source code must retain the above copyright notice,
|
|
2487
2488
|
this list of conditions and the following disclaimer.
|
|
2488
2489
|
|
|
2489
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
2490
|
-
notice, this list of conditions and the following disclaimer in
|
|
2490
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
2491
|
+
notice, this list of conditions and the following disclaimer in
|
|
2491
2492
|
the documentation and/or other materials provided with the distribution.
|
|
2492
2493
|
|
|
2493
2494
|
3. The names of the authors may not be used to endorse or promote products
|
|
@@ -2506,24 +2507,19 @@ class ChunkStream extends TransformStream {
|
|
|
2506
2507
|
*/
|
|
2507
2508
|
|
|
2508
2509
|
|
|
2509
|
-
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
2510
|
-
const ERROR_EVENT_TYPE = "error";
|
|
2511
|
-
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
2512
2510
|
const ERR_WORKER_STARTUP_TIMEOUT = "Worker startup timeout";
|
|
2513
2511
|
|
|
2514
|
-
let webWorkerSupported,
|
|
2515
|
-
let transferStreamsSupported = true;
|
|
2516
|
-
try {
|
|
2517
|
-
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
2518
|
-
} catch {
|
|
2519
|
-
// ignored
|
|
2520
|
-
}
|
|
2512
|
+
let webWorkerSupported, createWorkerFailed, webWorkerBackend;
|
|
2521
2513
|
let initModule$1 = () => { };
|
|
2522
2514
|
|
|
2523
2515
|
function configureWorker({ initModule: initModuleFunction }) {
|
|
2524
2516
|
initModule$1 = initModuleFunction;
|
|
2525
2517
|
}
|
|
2526
2518
|
|
|
2519
|
+
function setWebWorkerBackend(backend) {
|
|
2520
|
+
webWorkerBackend = backend;
|
|
2521
|
+
}
|
|
2522
|
+
|
|
2527
2523
|
async function supportsDeflate(config) {
|
|
2528
2524
|
const { CompressionStream: NativeStream, CompressionStreamFallback: FallbackStream } = config;
|
|
2529
2525
|
if (FallbackStream && !FallbackStream.requiresModule) {
|
|
@@ -2548,6 +2544,14 @@ function resetWebWorkerSupport() {
|
|
|
2548
2544
|
createWorkerFailed = false;
|
|
2549
2545
|
}
|
|
2550
2546
|
|
|
2547
|
+
function disableWebWorker(workerData) {
|
|
2548
|
+
if (workerData.createWorker) {
|
|
2549
|
+
createWorkerFailed = true;
|
|
2550
|
+
} else {
|
|
2551
|
+
webWorkerSupported = false;
|
|
2552
|
+
}
|
|
2553
|
+
}
|
|
2554
|
+
|
|
2551
2555
|
class CodecWorker {
|
|
2552
2556
|
|
|
2553
2557
|
constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI, createWorker }, onTaskFinished) {
|
|
@@ -2600,7 +2604,7 @@ class CodecWorker {
|
|
|
2600
2604
|
// deno-lint-ignore valid-typeof
|
|
2601
2605
|
webWorkerSupported = typeof Worker != UNDEFINED_TYPE;
|
|
2602
2606
|
}
|
|
2603
|
-
return (useWebWorkers && ((webWorkerSupported && workerURI) || createWorker) ?
|
|
2607
|
+
return (useWebWorkers && webWorkerBackend && ((webWorkerSupported && workerURI) || createWorker) ? webWorkerBackend : createWorkerInterface)(workerData, config);
|
|
2604
2608
|
}
|
|
2605
2609
|
}
|
|
2606
2610
|
|
|
@@ -2617,85 +2621,31 @@ class ProgressWatcherStream extends TransformStream {
|
|
|
2617
2621
|
async transform(chunk, controller) {
|
|
2618
2622
|
chunkOffset += chunk.length;
|
|
2619
2623
|
if (onprogress) {
|
|
2620
|
-
await callHandler(onprogress, chunkOffset, size);
|
|
2621
|
-
}
|
|
2622
|
-
controller.enqueue(chunk);
|
|
2623
|
-
},
|
|
2624
|
-
async flush() {
|
|
2625
|
-
if (onend) {
|
|
2626
|
-
await callHandler(onend, chunkOffset);
|
|
2627
|
-
}
|
|
2628
|
-
}
|
|
2629
|
-
});
|
|
2630
|
-
}
|
|
2631
|
-
}
|
|
2632
|
-
|
|
2633
|
-
async function callHandler(handler, ...parameters) {
|
|
2634
|
-
try {
|
|
2635
|
-
await handler(...parameters);
|
|
2636
|
-
} catch {
|
|
2637
|
-
// ignored
|
|
2638
|
-
}
|
|
2639
|
-
}
|
|
2640
|
-
|
|
2641
|
-
function createWorkerInterface(workerData, config) {
|
|
2642
|
-
return {
|
|
2643
|
-
run: () => runWorker$1(workerData, config)
|
|
2644
|
-
};
|
|
2645
|
-
}
|
|
2646
|
-
|
|
2647
|
-
function createWebWorkerInterface(workerData, config) {
|
|
2648
|
-
const { baseURI, chunkSize, workerStartupTimeout } = config;
|
|
2649
|
-
let { wasmURI } = config;
|
|
2650
|
-
|
|
2651
|
-
if (!workerData.interface) {
|
|
2652
|
-
// deno-lint-ignore valid-typeof
|
|
2653
|
-
if (typeof wasmURI == FUNCTION_TYPE) {
|
|
2654
|
-
wasmURI = wasmURI();
|
|
2655
|
-
}
|
|
2656
|
-
let worker;
|
|
2657
|
-
try {
|
|
2658
|
-
worker = getWebWorker(workerData.workerURI, baseURI, workerData);
|
|
2659
|
-
} catch {
|
|
2660
|
-
if (workerData.createWorker) {
|
|
2661
|
-
createWorkerFailed = true;
|
|
2662
|
-
} else {
|
|
2663
|
-
webWorkerSupported = false;
|
|
2664
|
-
}
|
|
2665
|
-
return createWorkerInterface(workerData, config);
|
|
2666
|
-
}
|
|
2667
|
-
Object.assign(workerData, {
|
|
2668
|
-
worker,
|
|
2669
|
-
workerAlive: false,
|
|
2670
|
-
terminated: false,
|
|
2671
|
-
interface: {
|
|
2672
|
-
run: async () => {
|
|
2673
|
-
try {
|
|
2674
|
-
return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
|
|
2675
|
-
} catch (error) {
|
|
2676
|
-
if (error && error.workerStartupFailed) {
|
|
2677
|
-
if (workerData.createWorker) {
|
|
2678
|
-
createWorkerFailed = true;
|
|
2679
|
-
} else {
|
|
2680
|
-
webWorkerSupported = false;
|
|
2681
|
-
}
|
|
2682
|
-
releaseWorkerStreams(workerData);
|
|
2683
|
-
return runWorker$1(workerData, config);
|
|
2684
|
-
}
|
|
2685
|
-
if (error && error.codecImportFailed) {
|
|
2686
|
-
if (workerData.reader) {
|
|
2687
|
-
releaseWorkerStreams(workerData);
|
|
2688
|
-
return runWorker$1(workerData, config);
|
|
2689
|
-
}
|
|
2690
|
-
workerData.onTaskFinished();
|
|
2691
|
-
}
|
|
2692
|
-
throw error;
|
|
2693
|
-
}
|
|
2624
|
+
await callHandler(onprogress, chunkOffset, size);
|
|
2625
|
+
}
|
|
2626
|
+
controller.enqueue(chunk);
|
|
2627
|
+
},
|
|
2628
|
+
async flush() {
|
|
2629
|
+
if (onend) {
|
|
2630
|
+
await callHandler(onend, chunkOffset);
|
|
2694
2631
|
}
|
|
2695
2632
|
}
|
|
2696
2633
|
});
|
|
2697
2634
|
}
|
|
2698
|
-
|
|
2635
|
+
}
|
|
2636
|
+
|
|
2637
|
+
async function callHandler(handler, ...parameters) {
|
|
2638
|
+
try {
|
|
2639
|
+
await handler(...parameters);
|
|
2640
|
+
} catch {
|
|
2641
|
+
// ignored
|
|
2642
|
+
}
|
|
2643
|
+
}
|
|
2644
|
+
|
|
2645
|
+
function createWorkerInterface(workerData, config) {
|
|
2646
|
+
return {
|
|
2647
|
+
run: () => runWorker$1(workerData, config)
|
|
2648
|
+
};
|
|
2699
2649
|
}
|
|
2700
2650
|
|
|
2701
2651
|
async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
|
|
@@ -2746,6 +2696,95 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
|
|
|
2746
2696
|
}
|
|
2747
2697
|
}
|
|
2748
2698
|
|
|
2699
|
+
/*
|
|
2700
|
+
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
2701
|
+
|
|
2702
|
+
Redistribution and use in source and binary forms, with or without
|
|
2703
|
+
modification, are permitted provided that the following conditions are met:
|
|
2704
|
+
|
|
2705
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
2706
|
+
this list of conditions and the following disclaimer.
|
|
2707
|
+
|
|
2708
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
2709
|
+
notice, this list of conditions and the following disclaimer in
|
|
2710
|
+
the documentation and/or other materials provided with the distribution.
|
|
2711
|
+
|
|
2712
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
2713
|
+
derived from this software without specific prior written permission.
|
|
2714
|
+
|
|
2715
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
2716
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
2717
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
2718
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
2719
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
2720
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
2721
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
2722
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
2723
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
2724
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
2725
|
+
*/
|
|
2726
|
+
|
|
2727
|
+
|
|
2728
|
+
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
2729
|
+
const ERROR_EVENT_TYPE = "error";
|
|
2730
|
+
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
2731
|
+
|
|
2732
|
+
let webWorkerSource, webWorkerURI, webWorkerOptions;
|
|
2733
|
+
let transferStreamsSupported = true;
|
|
2734
|
+
try {
|
|
2735
|
+
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
2736
|
+
} catch {
|
|
2737
|
+
// ignored
|
|
2738
|
+
}
|
|
2739
|
+
|
|
2740
|
+
setWebWorkerBackend(createWebWorkerInterface);
|
|
2741
|
+
|
|
2742
|
+
function createWebWorkerInterface(workerData, config) {
|
|
2743
|
+
const { baseURI, chunkSize, workerStartupTimeout } = config;
|
|
2744
|
+
let { wasmURI } = config;
|
|
2745
|
+
|
|
2746
|
+
if (!workerData.interface) {
|
|
2747
|
+
// deno-lint-ignore valid-typeof
|
|
2748
|
+
if (typeof wasmURI == FUNCTION_TYPE) {
|
|
2749
|
+
wasmURI = wasmURI();
|
|
2750
|
+
}
|
|
2751
|
+
let worker;
|
|
2752
|
+
try {
|
|
2753
|
+
worker = getWebWorker(workerData.workerURI, baseURI, workerData);
|
|
2754
|
+
} catch {
|
|
2755
|
+
disableWebWorker(workerData);
|
|
2756
|
+
return createWorkerInterface(workerData, config);
|
|
2757
|
+
}
|
|
2758
|
+
Object.assign(workerData, {
|
|
2759
|
+
worker,
|
|
2760
|
+
workerAlive: false,
|
|
2761
|
+
terminated: false,
|
|
2762
|
+
interface: {
|
|
2763
|
+
run: async () => {
|
|
2764
|
+
try {
|
|
2765
|
+
return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
|
|
2766
|
+
} catch (error) {
|
|
2767
|
+
if (error && error.workerStartupFailed) {
|
|
2768
|
+
disableWebWorker(workerData);
|
|
2769
|
+
releaseWorkerStreams(workerData);
|
|
2770
|
+
return runWorker$1(workerData, config);
|
|
2771
|
+
}
|
|
2772
|
+
if (error && error.codecImportFailed) {
|
|
2773
|
+
if (workerData.reader) {
|
|
2774
|
+
releaseWorkerStreams(workerData);
|
|
2775
|
+
return runWorker$1(workerData, config);
|
|
2776
|
+
}
|
|
2777
|
+
workerData.onTaskFinished();
|
|
2778
|
+
}
|
|
2779
|
+
throw error;
|
|
2780
|
+
}
|
|
2781
|
+
}
|
|
2782
|
+
}
|
|
2783
|
+
});
|
|
2784
|
+
}
|
|
2785
|
+
return workerData.interface;
|
|
2786
|
+
}
|
|
2787
|
+
|
|
2749
2788
|
async function runWebWorker(workerData, config) {
|
|
2750
2789
|
let resolveResult, rejectResult;
|
|
2751
2790
|
const result = new Promise((resolve, reject) => {
|
|
@@ -3622,7 +3661,7 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
|
|
|
3622
3661
|
forceRangeRequests,
|
|
3623
3662
|
combineSizeEocd
|
|
3624
3663
|
} = httpReader;
|
|
3625
|
-
if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest ==
|
|
3664
|
+
if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
|
|
3626
3665
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -END_OF_CENTRAL_DIR_LENGTH : undefined));
|
|
3627
3666
|
const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
|
|
3628
3667
|
if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
|
|
@@ -4475,9 +4514,13 @@ const OPTION_USDZ = "usdz";
|
|
|
4475
4514
|
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4476
4515
|
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4477
4516
|
const OPTION_STRICTNESS = "strictness";
|
|
4517
|
+
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4518
|
+
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4478
4519
|
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4479
4520
|
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4480
4521
|
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4522
|
+
const TEXT_TYPE_FILENAME = "filename";
|
|
4523
|
+
const TEXT_TYPE_COMMENT = "comment";
|
|
4481
4524
|
const STRICTNESS_STRICT = "strict";
|
|
4482
4525
|
const STRICTNESS_BALANCED = "balanced";
|
|
4483
4526
|
const STRICTNESS_TOLERANT = "tolerant";
|
|
@@ -4524,6 +4567,11 @@ const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
|
4524
4567
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4525
4568
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4526
4569
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4570
|
+
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
4571
|
+
const ERR_INVALID_STRICTNESS = "Invalid strictness (must be 'strict', 'balanced' or 'tolerant')";
|
|
4572
|
+
const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
|
|
4573
|
+
const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
|
|
4574
|
+
const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
|
|
4527
4575
|
const CHARSET_UTF8 = "utf-8";
|
|
4528
4576
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
4529
4577
|
const CHARSET_CP437 = "cp437";
|
|
@@ -4545,6 +4593,10 @@ const ZIP64_EXTRACTION = {
|
|
|
4545
4593
|
bytes: 8
|
|
4546
4594
|
}
|
|
4547
4595
|
};
|
|
4596
|
+
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4597
|
+
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4598
|
+
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4599
|
+
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
4548
4600
|
|
|
4549
4601
|
class ZipReader {
|
|
4550
4602
|
|
|
@@ -4573,6 +4625,8 @@ class ZipReader {
|
|
|
4573
4625
|
const checkAmbiguity = strictness == STRICTNESS_STRICT;
|
|
4574
4626
|
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
4575
4627
|
const maxAppendedDataSize = getMaxAppendedDataSize(getOptionValue$1(zipReader, options, OPTION_MAX_APPENDED_DATA_SIZE), strictness);
|
|
4628
|
+
const filenameValidation = getFilenameValidation(getOptionValue$1(zipReader, options, OPTION_FILENAME_VALIDATION), strictness);
|
|
4629
|
+
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4576
4630
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4577
4631
|
if (!endOfDirectoryInfo) {
|
|
4578
4632
|
const signatureArray = await readUint8Array(reader, 0, 4);
|
|
@@ -4766,11 +4820,22 @@ class ZipReader {
|
|
|
4766
4820
|
const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4767
4821
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4768
4822
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4769
|
-
let filename = decode(rawFilename, rawFilenameEncoding);
|
|
4823
|
+
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
4770
4824
|
if (filename === UNDEFINED_VALUE) {
|
|
4771
4825
|
filename = decodeText(rawFilename, rawFilenameEncoding);
|
|
4772
4826
|
}
|
|
4773
|
-
|
|
4827
|
+
if (normalizeFilename) {
|
|
4828
|
+
const normalizedFilename = normalizeFilename(filename);
|
|
4829
|
+
if (normalizedFilename !== UNDEFINED_VALUE) {
|
|
4830
|
+
filename = normalizedFilename;
|
|
4831
|
+
}
|
|
4832
|
+
}
|
|
4833
|
+
if (isUnsafeFilename(filename, filenameValidation)) {
|
|
4834
|
+
const error = new Error(ERR_UNSAFE_FILENAME);
|
|
4835
|
+
error.filename = filename;
|
|
4836
|
+
throw error;
|
|
4837
|
+
}
|
|
4838
|
+
let comment = decode(rawComment, rawCommentEncoding, TEXT_TYPE_COMMENT);
|
|
4774
4839
|
if (comment === UNDEFINED_VALUE) {
|
|
4775
4840
|
comment = decodeText(rawComment, rawCommentEncoding);
|
|
4776
4841
|
}
|
|
@@ -4831,10 +4896,10 @@ class ZipReader {
|
|
|
4831
4896
|
entry.getData = (writer, options) => fileEntry.getData(writer, entry, zipReader.readRanges, options);
|
|
4832
4897
|
entry.arrayBuffer = async options => {
|
|
4833
4898
|
const writer = new TransformStream();
|
|
4834
|
-
const
|
|
4835
|
-
|
|
4836
|
-
|
|
4837
|
-
return
|
|
4899
|
+
const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
|
|
4900
|
+
arrayBufferPromise.catch(() => { });
|
|
4901
|
+
await fileEntry.getData(writer, entry, zipReader.readRanges, options);
|
|
4902
|
+
return arrayBufferPromise;
|
|
4838
4903
|
};
|
|
4839
4904
|
offset = endOffset;
|
|
4840
4905
|
const { onprogress } = options;
|
|
@@ -5085,7 +5150,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5085
5150
|
readRanges
|
|
5086
5151
|
});
|
|
5087
5152
|
}
|
|
5088
|
-
let writable;
|
|
5153
|
+
let writable, abortError;
|
|
5089
5154
|
try {
|
|
5090
5155
|
if (!checkOverlappingEntryOnly) {
|
|
5091
5156
|
if (checkPasswordOnly) {
|
|
@@ -5105,12 +5170,22 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5105
5170
|
writer.size += error.outputSize;
|
|
5106
5171
|
}
|
|
5107
5172
|
if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
|
|
5173
|
+
abortError = error;
|
|
5108
5174
|
throw error;
|
|
5109
5175
|
}
|
|
5110
5176
|
} finally {
|
|
5111
5177
|
const preventClose = getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
|
|
5112
5178
|
if (!preventClose && writable && !writable.locked) {
|
|
5113
|
-
|
|
5179
|
+
const writableWriter = writable.getWriter();
|
|
5180
|
+
if (abortError) {
|
|
5181
|
+
try {
|
|
5182
|
+
await writableWriter.abort(abortError);
|
|
5183
|
+
} catch {
|
|
5184
|
+
// the error being propagated is more relevant; ignored
|
|
5185
|
+
}
|
|
5186
|
+
} else {
|
|
5187
|
+
await writableWriter.close();
|
|
5188
|
+
}
|
|
5114
5189
|
}
|
|
5115
5190
|
}
|
|
5116
5191
|
return checkPasswordOnly || checkOverlappingEntryOnly ? UNDEFINED_VALUE : writer.getData ? writer.getData() : writable;
|
|
@@ -5490,16 +5565,51 @@ function getDiskOffset$1(reader, diskNumber) {
|
|
|
5490
5565
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5491
5566
|
}
|
|
5492
5567
|
|
|
5568
|
+
function isStrictnessValue(value) {
|
|
5569
|
+
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5570
|
+
}
|
|
5571
|
+
|
|
5493
5572
|
function getStrictness(strictness, checkAmbiguity) {
|
|
5494
5573
|
if (strictness === UNDEFINED_VALUE) {
|
|
5495
5574
|
return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
|
|
5496
5575
|
}
|
|
5576
|
+
if (!isStrictnessValue(strictness)) {
|
|
5577
|
+
throw new Error(ERR_INVALID_STRICTNESS);
|
|
5578
|
+
}
|
|
5497
5579
|
return strictness;
|
|
5498
5580
|
}
|
|
5499
5581
|
|
|
5582
|
+
function getFilenameValidation(filenameValidation, strictness) {
|
|
5583
|
+
if (filenameValidation === UNDEFINED_VALUE) {
|
|
5584
|
+
return strictness;
|
|
5585
|
+
}
|
|
5586
|
+
if (!isStrictnessValue(filenameValidation)) {
|
|
5587
|
+
throw new Error(ERR_INVALID_FILENAME_VALIDATION);
|
|
5588
|
+
}
|
|
5589
|
+
return filenameValidation;
|
|
5590
|
+
}
|
|
5591
|
+
|
|
5592
|
+
function isUnsafeFilename(filename, filenameValidation) {
|
|
5593
|
+
if (filenameValidation == STRICTNESS_TOLERANT) {
|
|
5594
|
+
return false;
|
|
5595
|
+
}
|
|
5596
|
+
const pathParts = filename.split("/");
|
|
5597
|
+
if (pathParts.length > 1 && pathParts[pathParts.length - 1] === "") {
|
|
5598
|
+
pathParts.pop();
|
|
5599
|
+
}
|
|
5600
|
+
if (pathParts.includes("..") || filename.startsWith("/") || filename.startsWith("\\\\") || DRIVE_LETTER_REGEXP.test(filename)) {
|
|
5601
|
+
return true;
|
|
5602
|
+
}
|
|
5603
|
+
return filenameValidation == STRICTNESS_STRICT && (pathParts.includes(".") || pathParts.includes(""));
|
|
5604
|
+
}
|
|
5605
|
+
|
|
5500
5606
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5501
5607
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5502
|
-
|
|
5608
|
+
const size = toNumber$1(maxAppendedDataSize);
|
|
5609
|
+
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5610
|
+
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5611
|
+
}
|
|
5612
|
+
return size;
|
|
5503
5613
|
}
|
|
5504
5614
|
if (strictness == STRICTNESS_STRICT) {
|
|
5505
5615
|
return 0;
|
|
@@ -5510,12 +5620,6 @@ function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
|
5510
5620
|
return MAX_16_BITS;
|
|
5511
5621
|
}
|
|
5512
5622
|
|
|
5513
|
-
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
5514
|
-
|
|
5515
|
-
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
5516
|
-
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
5517
|
-
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
5518
|
-
|
|
5519
5623
|
async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
|
|
5520
5624
|
const { size } = reader;
|
|
5521
5625
|
const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
|
|
@@ -5651,6 +5755,10 @@ function getOptionValue$1(zipReader, options, name) {
|
|
|
5651
5755
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5652
5756
|
}
|
|
5653
5757
|
|
|
5758
|
+
function toNumber$1(value) {
|
|
5759
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
5760
|
+
}
|
|
5761
|
+
|
|
5654
5762
|
function getDate(timeRaw) {
|
|
5655
5763
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5656
5764
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5689,12 +5797,16 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
5689
5797
|
ERR_INVALID_AUTHENTICATION_CODE: ERR_INVALID_AUTHENTICATION_CODE,
|
|
5690
5798
|
ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
|
|
5691
5799
|
ERR_INVALID_CRC32: ERR_INVALID_CRC32,
|
|
5800
|
+
ERR_INVALID_FILENAME_VALIDATION: ERR_INVALID_FILENAME_VALIDATION,
|
|
5801
|
+
ERR_INVALID_MAX_APPENDED_DATA_SIZE: ERR_INVALID_MAX_APPENDED_DATA_SIZE,
|
|
5692
5802
|
ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
|
|
5693
5803
|
ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
|
|
5804
|
+
ERR_INVALID_STRICTNESS: ERR_INVALID_STRICTNESS,
|
|
5694
5805
|
ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
|
|
5695
5806
|
ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
|
|
5696
5807
|
ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
|
|
5697
5808
|
ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
|
|
5809
|
+
ERR_UNSAFE_FILENAME: ERR_UNSAFE_FILENAME,
|
|
5698
5810
|
ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
|
|
5699
5811
|
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
5700
5812
|
ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
|
|
@@ -5756,6 +5868,8 @@ const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be '
|
|
|
5756
5868
|
const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
|
|
5757
5869
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
5758
5870
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
5871
|
+
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
5872
|
+
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
5759
5873
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
5760
5874
|
|
|
5761
5875
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -5763,6 +5877,7 @@ const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
|
|
|
5763
5877
|
const VENDOR_VERSION_AE_1 = 1;
|
|
5764
5878
|
const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
|
|
5765
5879
|
const UNIX_EXTRA_FIELD_TYPE = "unix";
|
|
5880
|
+
const MAX_LEVEL = 9;
|
|
5766
5881
|
|
|
5767
5882
|
let workers = 0;
|
|
5768
5883
|
const pendingEntries = [];
|
|
@@ -5925,7 +6040,8 @@ class ZipWriter {
|
|
|
5925
6040
|
|
|
5926
6041
|
remove(entry) {
|
|
5927
6042
|
const { filenames, files } = this;
|
|
5928
|
-
|
|
6043
|
+
// deno-lint-ignore valid-typeof
|
|
6044
|
+
if (typeof entry == STRING_TYPE) {
|
|
5929
6045
|
entry = files.get(entry);
|
|
5930
6046
|
}
|
|
5931
6047
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
@@ -6063,20 +6179,20 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6063
6179
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6064
6180
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
|
|
6065
6181
|
const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
|
|
6066
|
-
const uid =
|
|
6067
|
-
const gid =
|
|
6068
|
-
let unixMode =
|
|
6182
|
+
const uid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UID);
|
|
6183
|
+
const gid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_GID);
|
|
6184
|
+
let unixMode = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
|
|
6069
6185
|
let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
|
|
6070
6186
|
let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
|
|
6071
6187
|
let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
|
|
6072
6188
|
let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
|
|
6073
|
-
if (uid !== UNDEFINED_VALUE && (uid < 0 || uid > MAX_32_BITS)) {
|
|
6189
|
+
if (uid !== UNDEFINED_VALUE && (!Number.isInteger(uid) || uid < 0 || uid > MAX_32_BITS)) {
|
|
6074
6190
|
throw new Error(ERR_INVALID_UID);
|
|
6075
6191
|
}
|
|
6076
|
-
if (gid !== UNDEFINED_VALUE && (gid < 0 || gid > MAX_32_BITS)) {
|
|
6192
|
+
if (gid !== UNDEFINED_VALUE && (!Number.isInteger(gid) || gid < 0 || gid > MAX_32_BITS)) {
|
|
6077
6193
|
throw new Error(ERR_INVALID_GID);
|
|
6078
6194
|
}
|
|
6079
|
-
if (unixMode !== UNDEFINED_VALUE && (unixMode < 0 || unixMode > MAX_16_BITS)) {
|
|
6195
|
+
if (unixMode !== UNDEFINED_VALUE && (!Number.isInteger(unixMode) || unixMode < 0 || unixMode > MAX_16_BITS)) {
|
|
6080
6196
|
throw new Error(ERR_INVALID_UNIX_MODE);
|
|
6081
6197
|
}
|
|
6082
6198
|
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
@@ -6188,7 +6304,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6188
6304
|
|
|
6189
6305
|
function resolveMetadata(zipWriter, name, options) {
|
|
6190
6306
|
const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
|
|
6191
|
-
let rawFilename = encode(name);
|
|
6307
|
+
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6192
6308
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6193
6309
|
rawFilename = encodeText(name);
|
|
6194
6310
|
}
|
|
@@ -6196,7 +6312,7 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6196
6312
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6197
6313
|
}
|
|
6198
6314
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6199
|
-
let rawComment = encode(comment);
|
|
6315
|
+
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6200
6316
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6201
6317
|
rawComment = encodeText(comment);
|
|
6202
6318
|
}
|
|
@@ -6216,8 +6332,11 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6216
6332
|
if (!passThrough) {
|
|
6217
6333
|
password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6218
6334
|
rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6335
|
+
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
6336
|
+
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6337
|
+
}
|
|
6219
6338
|
}
|
|
6220
|
-
const encryptionStrength =
|
|
6339
|
+
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6221
6340
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6222
6341
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
6223
6342
|
const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
|
|
@@ -6235,7 +6354,10 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6235
6354
|
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
6236
6355
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
6237
6356
|
}
|
|
6238
|
-
let level =
|
|
6357
|
+
let level = getNumberOptionValue(zipWriter, options, OPTION_LEVEL);
|
|
6358
|
+
if (level !== UNDEFINED_VALUE && (!Number.isInteger(level) || level < 0 || level > MAX_LEVEL)) {
|
|
6359
|
+
throw new Error(ERR_INVALID_LEVEL);
|
|
6360
|
+
}
|
|
6239
6361
|
if (zipWriter.options[OPTION_USDZ]) {
|
|
6240
6362
|
if (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) {
|
|
6241
6363
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_USDZ);
|
|
@@ -6256,7 +6378,7 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6256
6378
|
useCompressionStream = false;
|
|
6257
6379
|
}
|
|
6258
6380
|
const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
6259
|
-
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
6381
|
+
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(Number.isInteger(encryptionStrength) && encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
6260
6382
|
throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
|
|
6261
6383
|
}
|
|
6262
6384
|
const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
|
|
@@ -7450,6 +7572,14 @@ function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
|
7450
7572
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7451
7573
|
}
|
|
7452
7574
|
|
|
7575
|
+
function getNumberOptionValue(zipWriter, options, name, defaultValue) {
|
|
7576
|
+
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7577
|
+
}
|
|
7578
|
+
|
|
7579
|
+
function toNumber(value) {
|
|
7580
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7581
|
+
}
|
|
7582
|
+
|
|
7453
7583
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7454
7584
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
7455
7585
|
}
|
|
@@ -8467,6 +8597,9 @@ U(setDefaultConfiguration);
|
|
|
8467
8597
|
|
|
8468
8598
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
8469
8599
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
8600
|
+
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
8601
|
+
const ERR_ABORTED = "The operation was aborted";
|
|
8602
|
+
const ABORT_ERROR_NAME = "AbortError";
|
|
8470
8603
|
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
8471
8604
|
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
8472
8605
|
EXTRAFIELD_TYPE_ZIP64,
|
|
@@ -8575,8 +8708,9 @@ class ZipFileEntry extends ZipEntry {
|
|
|
8575
8708
|
const uncompressedSize = zipEntry.data ? zipEntry.data.uncompressedSize : reader.size;
|
|
8576
8709
|
await Promise.all([initStream(reader), initStream(writer, uncompressedSize)]);
|
|
8577
8710
|
const { readable } = reader;
|
|
8711
|
+
const { signal } = options;
|
|
8578
8712
|
zipEntry.uncompressedSize = reader.size;
|
|
8579
|
-
await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable));
|
|
8713
|
+
await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable), { signal });
|
|
8580
8714
|
return writer.getData ? writer.getData() : writer.writable;
|
|
8581
8715
|
}
|
|
8582
8716
|
}
|
|
@@ -8843,7 +8977,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8843
8977
|
for (const entry of entries) {
|
|
8844
8978
|
let parent = this;
|
|
8845
8979
|
try {
|
|
8846
|
-
const path = entry.filename.split("/");
|
|
8980
|
+
const path = entry.filename.split("/").filter(pathPart => pathPart != "" && pathPart != ".");
|
|
8847
8981
|
const name = path.pop();
|
|
8848
8982
|
path.forEach(pathPart => {
|
|
8849
8983
|
const previousParent = parent;
|
|
@@ -8918,6 +9052,10 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8918
9052
|
}
|
|
8919
9053
|
}
|
|
8920
9054
|
|
|
9055
|
+
getChildren(options = {}) {
|
|
9056
|
+
return collectChildren(this, options.recursive);
|
|
9057
|
+
}
|
|
9058
|
+
|
|
8921
9059
|
isPasswordProtected() {
|
|
8922
9060
|
const children = this.children;
|
|
8923
9061
|
for (let childIndex = 0; childIndex < children.length; childIndex++) {
|
|
@@ -9009,6 +9147,10 @@ class FS {
|
|
|
9009
9147
|
return this.root.getChildByName(name);
|
|
9010
9148
|
}
|
|
9011
9149
|
|
|
9150
|
+
getChildren(options) {
|
|
9151
|
+
return this.root.getChildren(options);
|
|
9152
|
+
}
|
|
9153
|
+
|
|
9012
9154
|
addDirectory(name, options) {
|
|
9013
9155
|
return this.root.addDirectory(name, options);
|
|
9014
9156
|
}
|
|
@@ -9218,6 +9360,39 @@ function detach(entry) {
|
|
|
9218
9360
|
}
|
|
9219
9361
|
}
|
|
9220
9362
|
|
|
9363
|
+
function forwardAbort(signal, abortController) {
|
|
9364
|
+
if (!signal) {
|
|
9365
|
+
return () => { };
|
|
9366
|
+
}
|
|
9367
|
+
if (signal.aborted) {
|
|
9368
|
+
abortController.abort(signal.reason);
|
|
9369
|
+
return () => { };
|
|
9370
|
+
}
|
|
9371
|
+
const abort = () => abortController.abort(signal.reason);
|
|
9372
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
9373
|
+
return () => signal.removeEventListener("abort", abort);
|
|
9374
|
+
}
|
|
9375
|
+
|
|
9376
|
+
function isExportAborted(error) {
|
|
9377
|
+
return Boolean(error) && error.message == ERR_ABORT_EXPORT;
|
|
9378
|
+
}
|
|
9379
|
+
|
|
9380
|
+
function aggregateEntryErrors(errors) {
|
|
9381
|
+
const [error] = errors;
|
|
9382
|
+
const otherErrors = errors
|
|
9383
|
+
.slice(1)
|
|
9384
|
+
.flatMap(otherError => [otherError, ...(otherError && otherError.entryErrors || [])])
|
|
9385
|
+
.filter(otherError => otherError !== error);
|
|
9386
|
+
if (otherErrors.length) {
|
|
9387
|
+
try {
|
|
9388
|
+
error.entryErrors = [...(error.entryErrors || []), ...otherErrors];
|
|
9389
|
+
} catch {
|
|
9390
|
+
// ignored
|
|
9391
|
+
}
|
|
9392
|
+
}
|
|
9393
|
+
return error;
|
|
9394
|
+
}
|
|
9395
|
+
|
|
9221
9396
|
function getUserExtraField(extraField) {
|
|
9222
9397
|
if (extraField) {
|
|
9223
9398
|
const userExtraField = new Map();
|
|
@@ -9235,111 +9410,110 @@ function getUserExtraField(extraField) {
|
|
|
9235
9410
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
9236
9411
|
const selectedEntry = entry;
|
|
9237
9412
|
const entryOffsets = new Map();
|
|
9238
|
-
|
|
9413
|
+
if (options.bufferedWrite) {
|
|
9414
|
+
await processChildren(entry);
|
|
9415
|
+
} else {
|
|
9416
|
+
for (const child of entry.getChildren({ recursive: true })) {
|
|
9417
|
+
await addChild(child);
|
|
9418
|
+
}
|
|
9419
|
+
}
|
|
9239
9420
|
|
|
9240
|
-
async function
|
|
9241
|
-
await
|
|
9421
|
+
async function processChildren(entry) {
|
|
9422
|
+
const results = await Promise.allSettled(entry.children.map(async child => {
|
|
9423
|
+
await addChild(child);
|
|
9424
|
+
await processChildren(child);
|
|
9425
|
+
}));
|
|
9426
|
+
const errorResult = results.find(result => result.status == "rejected");
|
|
9427
|
+
if (errorResult) {
|
|
9428
|
+
throw errorResult.reason;
|
|
9429
|
+
}
|
|
9430
|
+
}
|
|
9242
9431
|
|
|
9243
|
-
|
|
9244
|
-
|
|
9245
|
-
|
|
9246
|
-
|
|
9247
|
-
|
|
9248
|
-
|
|
9432
|
+
async function addChild(child) {
|
|
9433
|
+
const name = options.relativePath ? child.getRelativeName(selectedEntry) : child.getFullname();
|
|
9434
|
+
const childOptions = child.options || {};
|
|
9435
|
+
let zipEntryOptions = {};
|
|
9436
|
+
if (child.data instanceof Entry) {
|
|
9437
|
+
const {
|
|
9438
|
+
externalFileAttributes,
|
|
9439
|
+
versionMadeBy,
|
|
9440
|
+
comment,
|
|
9441
|
+
lastModDate,
|
|
9442
|
+
creationDate,
|
|
9443
|
+
lastAccessDate,
|
|
9444
|
+
uncompressedSize,
|
|
9445
|
+
encrypted,
|
|
9446
|
+
zipCrypto,
|
|
9447
|
+
crc32,
|
|
9448
|
+
compressionMethod,
|
|
9449
|
+
extraFieldAES,
|
|
9450
|
+
internalFileAttributes,
|
|
9451
|
+
extraField,
|
|
9452
|
+
uid,
|
|
9453
|
+
gid
|
|
9454
|
+
} = child.data;
|
|
9455
|
+
zipEntryOptions = {
|
|
9456
|
+
externalFileAttributes,
|
|
9457
|
+
versionMadeBy,
|
|
9458
|
+
comment,
|
|
9459
|
+
lastModDate,
|
|
9460
|
+
creationDate,
|
|
9461
|
+
lastAccessDate,
|
|
9462
|
+
internalFileAttributes
|
|
9463
|
+
};
|
|
9464
|
+
const userExtraField = getUserExtraField(extraField);
|
|
9465
|
+
if (userExtraField) {
|
|
9466
|
+
zipEntryOptions.extraField = userExtraField;
|
|
9467
|
+
}
|
|
9468
|
+
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
9469
|
+
Object.assign(zipEntryOptions, {
|
|
9470
|
+
uid,
|
|
9471
|
+
gid,
|
|
9472
|
+
unixExtraFieldType: options.unixExtraFieldType || INFOZIP_EXTRA_FIELD_TYPE
|
|
9473
|
+
});
|
|
9474
|
+
}
|
|
9475
|
+
if (child.passThrough) {
|
|
9476
|
+
let level, encryptionStrength;
|
|
9477
|
+
if (compressionMethod === 0) {
|
|
9478
|
+
level = 0;
|
|
9249
9479
|
}
|
|
9250
|
-
|
|
9251
|
-
|
|
9252
|
-
await processChild(child);
|
|
9480
|
+
if (extraFieldAES) {
|
|
9481
|
+
encryptionStrength = extraFieldAES.strength;
|
|
9253
9482
|
}
|
|
9254
|
-
|
|
9255
|
-
|
|
9256
|
-
|
|
9257
|
-
async function processChild(child) {
|
|
9258
|
-
const name = options.relativePath ? child.getRelativeName(selectedEntry) : child.getFullname();
|
|
9259
|
-
const childOptions = child.options || {};
|
|
9260
|
-
let zipEntryOptions = {};
|
|
9261
|
-
if (child.data instanceof Entry) {
|
|
9262
|
-
const {
|
|
9263
|
-
externalFileAttributes,
|
|
9264
|
-
versionMadeBy,
|
|
9265
|
-
comment,
|
|
9266
|
-
lastModDate,
|
|
9267
|
-
creationDate,
|
|
9268
|
-
lastAccessDate,
|
|
9269
|
-
uncompressedSize,
|
|
9483
|
+
zipEntryOptions = Object.assign(zipEntryOptions, {
|
|
9484
|
+
passThrough: true,
|
|
9270
9485
|
encrypted,
|
|
9271
9486
|
zipCrypto,
|
|
9272
9487
|
crc32,
|
|
9273
|
-
|
|
9274
|
-
|
|
9275
|
-
|
|
9276
|
-
|
|
9277
|
-
|
|
9278
|
-
gid
|
|
9279
|
-
} = child.data;
|
|
9280
|
-
zipEntryOptions = {
|
|
9281
|
-
externalFileAttributes,
|
|
9282
|
-
versionMadeBy,
|
|
9283
|
-
comment,
|
|
9284
|
-
lastModDate,
|
|
9285
|
-
creationDate,
|
|
9286
|
-
lastAccessDate,
|
|
9287
|
-
internalFileAttributes
|
|
9288
|
-
};
|
|
9289
|
-
const userExtraField = getUserExtraField(extraField);
|
|
9290
|
-
if (userExtraField) {
|
|
9291
|
-
zipEntryOptions.extraField = userExtraField;
|
|
9292
|
-
}
|
|
9293
|
-
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
9294
|
-
Object.assign(zipEntryOptions, {
|
|
9295
|
-
uid,
|
|
9296
|
-
gid,
|
|
9297
|
-
unixExtraFieldType: options.unixExtraFieldType || INFOZIP_EXTRA_FIELD_TYPE
|
|
9298
|
-
});
|
|
9299
|
-
}
|
|
9300
|
-
if (child.passThrough) {
|
|
9301
|
-
let level, encryptionStrength;
|
|
9302
|
-
if (compressionMethod === 0) {
|
|
9303
|
-
level = 0;
|
|
9304
|
-
}
|
|
9305
|
-
if (extraFieldAES) {
|
|
9306
|
-
encryptionStrength = extraFieldAES.strength;
|
|
9307
|
-
}
|
|
9308
|
-
zipEntryOptions = Object.assign(zipEntryOptions, {
|
|
9309
|
-
passThrough: true,
|
|
9310
|
-
encrypted,
|
|
9311
|
-
zipCrypto,
|
|
9312
|
-
crc32,
|
|
9313
|
-
uncompressedSize,
|
|
9314
|
-
level,
|
|
9315
|
-
encryptionStrength,
|
|
9316
|
-
compressionMethod
|
|
9317
|
-
});
|
|
9318
|
-
}
|
|
9488
|
+
uncompressedSize,
|
|
9489
|
+
level,
|
|
9490
|
+
encryptionStrength,
|
|
9491
|
+
compressionMethod
|
|
9492
|
+
});
|
|
9319
9493
|
}
|
|
9320
|
-
|
|
9321
|
-
|
|
9322
|
-
|
|
9323
|
-
|
|
9324
|
-
|
|
9325
|
-
|
|
9326
|
-
|
|
9327
|
-
|
|
9328
|
-
|
|
9329
|
-
|
|
9494
|
+
}
|
|
9495
|
+
await zipWriter.add(name, readers.get(child), Object.assign({}, options, zipEntryOptions, childOptions, {
|
|
9496
|
+
directory: child.directory,
|
|
9497
|
+
onprogress: async indexProgress => {
|
|
9498
|
+
if (options.onprogress) {
|
|
9499
|
+
entryOffsets.set(name, indexProgress);
|
|
9500
|
+
try {
|
|
9501
|
+
await options.onprogress(Array.from(entryOffsets.values()).reduce((previousValue, currentValue) => previousValue + currentValue), totalSize);
|
|
9502
|
+
} catch {
|
|
9503
|
+
// ignored
|
|
9330
9504
|
}
|
|
9331
9505
|
}
|
|
9332
|
-
}
|
|
9333
|
-
|
|
9334
|
-
}
|
|
9506
|
+
}
|
|
9507
|
+
}));
|
|
9335
9508
|
}
|
|
9336
9509
|
}
|
|
9337
9510
|
|
|
9338
9511
|
function addFileSystemHandle(zipEntry, handle, options) {
|
|
9339
9512
|
return addFile(zipEntry, handle, []);
|
|
9340
9513
|
|
|
9341
|
-
async function addFile(parentEntry, handle, addedEntries) {
|
|
9514
|
+
async function addFile(parentEntry, handle, addedEntries, parentName = "") {
|
|
9342
9515
|
if (handle) {
|
|
9516
|
+
const entryName = parentName ? parentName + "/" + handle.name : handle.name;
|
|
9343
9517
|
try {
|
|
9344
9518
|
if (handle.isFile || handle.isDirectory) {
|
|
9345
9519
|
handle = await transformToFileSystemhandle(handle);
|
|
@@ -9361,12 +9535,18 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9361
9535
|
const directoryEntry = parentEntry.addDirectory(handle.name);
|
|
9362
9536
|
addedEntries.push(directoryEntry);
|
|
9363
9537
|
for await (const childHandle of handle.values()) {
|
|
9364
|
-
await addFile(directoryEntry, childHandle, addedEntries);
|
|
9538
|
+
await addFile(directoryEntry, childHandle, addedEntries, entryName);
|
|
9365
9539
|
}
|
|
9366
9540
|
}
|
|
9367
9541
|
} catch (error) {
|
|
9368
|
-
|
|
9369
|
-
|
|
9542
|
+
try {
|
|
9543
|
+
if (error.entryName === UNDEFINED_VALUE) {
|
|
9544
|
+
error.entryName = entryName;
|
|
9545
|
+
}
|
|
9546
|
+
} catch {
|
|
9547
|
+
// ignored
|
|
9548
|
+
}
|
|
9549
|
+
throw error;
|
|
9370
9550
|
}
|
|
9371
9551
|
}
|
|
9372
9552
|
return addedEntries;
|
|
@@ -9376,15 +9556,33 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9376
9556
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
9377
9557
|
const totalSize = getTotalSize([zipEntry], "uncompressedSize");
|
|
9378
9558
|
const writtenSizes = new Map();
|
|
9379
|
-
|
|
9559
|
+
const abortController = new AbortController();
|
|
9560
|
+
const { signal } = abortController;
|
|
9561
|
+
const releaseSignal = forwardAbort(options.signal, abortController);
|
|
9562
|
+
const exportedEntryNames = [];
|
|
9563
|
+
let exportAborted = false;
|
|
9564
|
+
try {
|
|
9565
|
+
await exportChildren(zipEntry, directoryHandle);
|
|
9566
|
+
} catch (error) {
|
|
9567
|
+
try {
|
|
9568
|
+
error.exportedEntryNames = exportedEntryNames;
|
|
9569
|
+
} catch {
|
|
9570
|
+
// ignored
|
|
9571
|
+
}
|
|
9572
|
+
throw error;
|
|
9573
|
+
} finally {
|
|
9574
|
+
releaseSignal();
|
|
9575
|
+
}
|
|
9380
9576
|
return directoryHandle;
|
|
9381
9577
|
|
|
9382
9578
|
async function exportChildren(entry, parentHandle) {
|
|
9383
9579
|
if (options.concurrent) {
|
|
9384
9580
|
const results = await Promise.allSettled(entry.children.map(child => exportChild(child, parentHandle)));
|
|
9385
|
-
const
|
|
9386
|
-
if (
|
|
9387
|
-
|
|
9581
|
+
const rejectedResults = results.filter(result => result.status == "rejected");
|
|
9582
|
+
if (rejectedResults.length) {
|
|
9583
|
+
const failedResults = rejectedResults.filter(result => !isExportAborted(result.reason));
|
|
9584
|
+
const reportedResults = failedResults.length ? failedResults : rejectedResults;
|
|
9585
|
+
throw aggregateEntryErrors(reportedResults.map(result => result.reason));
|
|
9388
9586
|
}
|
|
9389
9587
|
} else {
|
|
9390
9588
|
for (const child of entry.children) {
|
|
@@ -9394,6 +9592,12 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
|
9394
9592
|
}
|
|
9395
9593
|
|
|
9396
9594
|
async function exportChild(child, parentHandle) {
|
|
9595
|
+
if (signal.aborted) {
|
|
9596
|
+
if (exportAborted || isExportAborted(signal.reason)) {
|
|
9597
|
+
return;
|
|
9598
|
+
}
|
|
9599
|
+
throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
|
|
9600
|
+
}
|
|
9397
9601
|
try {
|
|
9398
9602
|
if (child.directory) {
|
|
9399
9603
|
const childDirectoryHandle = await parentHandle.getDirectoryHandle(child.name, { create: true });
|
|
@@ -9401,21 +9605,37 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
|
9401
9605
|
} else {
|
|
9402
9606
|
const fileHandle = await parentHandle.getFileHandle(child.name, { create: true });
|
|
9403
9607
|
const writable = await fileHandle.createWritable();
|
|
9404
|
-
|
|
9405
|
-
|
|
9406
|
-
|
|
9407
|
-
|
|
9408
|
-
|
|
9409
|
-
|
|
9410
|
-
|
|
9411
|
-
|
|
9608
|
+
try {
|
|
9609
|
+
await child.getData({ writable }, Object.assign({}, options, {
|
|
9610
|
+
signal,
|
|
9611
|
+
onprogress: async progress => {
|
|
9612
|
+
if (options.onprogress) {
|
|
9613
|
+
writtenSizes.set(child.id, progress);
|
|
9614
|
+
try {
|
|
9615
|
+
await options.onprogress(Array.from(writtenSizes.values()).reduce((previousValue, currentValue) => previousValue + currentValue, 0), totalSize);
|
|
9616
|
+
} catch {
|
|
9617
|
+
// ignored
|
|
9618
|
+
}
|
|
9412
9619
|
}
|
|
9413
9620
|
}
|
|
9414
|
-
}
|
|
9415
|
-
})
|
|
9621
|
+
}));
|
|
9622
|
+
} catch (error) {
|
|
9623
|
+
throw exportAborted ? new Error(ERR_ABORT_EXPORT) : error;
|
|
9624
|
+
}
|
|
9625
|
+
exportedEntryNames.push(child.getRelativeName(zipEntry));
|
|
9416
9626
|
}
|
|
9417
9627
|
} catch (error) {
|
|
9418
|
-
|
|
9628
|
+
exportAborted = true;
|
|
9629
|
+
abortController.abort(new Error(ERR_ABORT_EXPORT));
|
|
9630
|
+
try {
|
|
9631
|
+
if (error.entryName === UNDEFINED_VALUE) {
|
|
9632
|
+
error.entryName = child.getRelativeName(zipEntry);
|
|
9633
|
+
error.entryId = child.id;
|
|
9634
|
+
}
|
|
9635
|
+
} catch {
|
|
9636
|
+
// ignored
|
|
9637
|
+
}
|
|
9638
|
+
throw error;
|
|
9419
9639
|
}
|
|
9420
9640
|
}
|
|
9421
9641
|
}
|
|
@@ -9477,6 +9697,21 @@ function resetFS(fs) {
|
|
|
9477
9697
|
fs.root = new ZipDirectoryEntry(fs);
|
|
9478
9698
|
}
|
|
9479
9699
|
|
|
9700
|
+
function collectChildren(directory, recursive) {
|
|
9701
|
+
const children = [];
|
|
9702
|
+
const pendingDirectories = [directory];
|
|
9703
|
+
let directoryIndex = 0;
|
|
9704
|
+
while (directoryIndex < pendingDirectories.length) {
|
|
9705
|
+
for (const child of pendingDirectories[directoryIndex++].children) {
|
|
9706
|
+
children.push(child);
|
|
9707
|
+
if (recursive) {
|
|
9708
|
+
pendingDirectories.push(child);
|
|
9709
|
+
}
|
|
9710
|
+
}
|
|
9711
|
+
}
|
|
9712
|
+
return children;
|
|
9713
|
+
}
|
|
9714
|
+
|
|
9480
9715
|
function registerEntries(fs, entry) {
|
|
9481
9716
|
const pendingEntries = [entry];
|
|
9482
9717
|
while (pendingEntries.length) {
|
|
@@ -9595,6 +9830,7 @@ exports.BlobReader = BlobReader;
|
|
|
9595
9830
|
exports.BlobWriter = BlobWriter;
|
|
9596
9831
|
exports.Data64URIReader = Data64URIReader;
|
|
9597
9832
|
exports.Data64URIWriter = Data64URIWriter;
|
|
9833
|
+
exports.ERR_ABORTED = ERR_ABORTED;
|
|
9598
9834
|
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
9599
9835
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
9600
9836
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
@@ -9618,12 +9854,17 @@ exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
|
9618
9854
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
9619
9855
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
9620
9856
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
9857
|
+
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
9621
9858
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
9859
|
+
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
9860
|
+
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
9622
9861
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
9623
9862
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
9624
9863
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
9864
|
+
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
9625
9865
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
9626
9866
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
9867
|
+
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
9627
9868
|
exports.ERR_INVALID_UID = ERR_INVALID_UID;
|
|
9628
9869
|
exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
|
|
9629
9870
|
exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
|
|
@@ -9638,6 +9879,7 @@ exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
|
9638
9879
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
9639
9880
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
9640
9881
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
9882
|
+
exports.ERR_UNSAFE_FILENAME = ERR_UNSAFE_FILENAME;
|
|
9641
9883
|
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
|
|
9642
9884
|
exports.ERR_UNSUPPORTED_CONTEXT = ERR_UNSUPPORTED_CONTEXT;
|
|
9643
9885
|
exports.ERR_UNSUPPORTED_CRYPTO_API = ERR_UNSUPPORTED_CRYPTO_API;
|