UNPKG

ff-unzip

Version:

基于 fflate 的零依赖轻量级 ZIP 解压工具,支持命令行使用和 Node.js API 调用。

3 lines (2 loc) 12 kB
#!/usr/bin/env node var bC=Object.create;var{getPrototypeOf:eC,defineProperty:l,getOwnPropertyNames:ZC,getOwnPropertyDescriptor:fC}=Object,IC=Object.prototype.hasOwnProperty;var AC=(H,C,J)=>{J=H!=null?bC(eC(H)):{};let K=C||!H||!H.__esModule?l(J,"default",{value:H,enumerable:!0}):J;for(let Q of ZC(H))if(!IC.call(K,Q))l(K,Q,{get:()=>H[Q],enumerable:!0});return K},TC=new WeakMap,cC=(H)=>{var C=TC.get(H),J;if(C)return C;if(C=l({},"__esModule",{value:!0}),H&&typeof H==="object"||typeof H==="function")ZC(H).map((K)=>!IC.call(C,K)&&l(C,K,{get:()=>H[K],enumerable:!(J=fC(H,K))||J.enumerable}));return TC.set(H,C),C};var aC=(H,C)=>{for(var J in C)l(H,J,{get:C[J],enumerable:!0,configurable:!0,set:(K)=>C[J]=()=>K})};var qH={};aC(qH,{fflatUnzip:()=>nC});module.exports=cC(qH);var h=AC(require("fs")),_=AC(require("path"));var DC=require("module"),lC=DC.createRequire("/"),CC,dC=";var __w=require('worker_threads');__w.parentPort.on('message',function(m){onmessage({data:m})}),postMessage=function(m,t){__w.parentPort.postMessage(m,t)},close=process.exit;self=global";try{CC=lC("worker_threads").Worker}catch(H){}var iC=CC?function(H,C,J,K,Q){var R=!1,N=new CC(H+dC,{eval:!0}).on("error",function(V){return Q(V,null)}).on("message",function(V){return Q(null,V)}).on("exit",function(V){if(V&&!R)Q(new Error("exited with code "+V),null)});return N.postMessage(J,K),N.terminate=function(){return R=!0,CC.prototype.terminate.call(N)},N}:function(H,C,J,K,Q){setImmediate(function(){return Q(new Error("async operations unsupported - update to Node 12+ (or Node 10-11 with the --experimental-worker CLI flag)"),null)});var R=function(){};return{terminate:R,postMessage:R}},q=Uint8Array,v=Uint16Array,gC=Int32Array,WC=new q([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,0,0,0]),BC=new q([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,0,0]),xC=new q([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),wC=function(H,C){var J=new v(31);for(var K=0;K<31;++K)J[K]=C+=1<<H[K-1];var Q=new gC(J[30]);for(var K=1;K<30;++K)for(var R=J[K];R<J[K+1];++R)Q[R]=R-J[K]<<5|K;return{b:J,r:Q}},zC=wC(WC,2),FC=zC.b,sC=zC.r;FC[28]=258,sC[258]=28;var yC=wC(BC,0),vC=yC.b,MH=yC.r,KC=new v(32768);for($=0;$<32768;++$)I=($&43690)>>1|($&21845)<<1,I=(I&52428)>>2|(I&13107)<<2,I=(I&61680)>>4|(I&3855)<<4,KC[$]=((I&65280)>>8|(I&255)<<8)>>1;var I,$,b=function(H,C,J){var K=H.length,Q=0,R=new v(C);for(;Q<K;++Q)if(H[Q])++R[H[Q]-1];var N=new v(C);for(Q=1;Q<C;++Q)N[Q]=N[Q-1]+R[Q-1]<<1;var V;if(J){V=new v(1<<C);var E=15-C;for(Q=0;Q<K;++Q)if(H[Q]){var Y=Q<<4|H[Q],W=C-H[Q],X=N[H[Q]-1]++<<W;for(var B=X|(1<<W)-1;X<=B;++X)V[KC[X]>>E]=Y}}else{V=new v(K);for(Q=0;Q<K;++Q)if(H[Q])V[Q]=KC[N[H[Q]-1]++]>>15-H[Q]}return V},i=new q(288);for($=0;$<144;++$)i[$]=8;var $;for($=144;$<256;++$)i[$]=9;var $;for($=256;$<280;++$)i[$]=7;var $;for($=280;$<288;++$)i[$]=8;var $,kC=new q(32);for($=0;$<32;++$)kC[$]=5;var $;var hC=b(i,9,1);var _C=b(kC,5,1),HC=function(H){var C=H[0];for(var J=1;J<H.length;++J)if(H[J]>C)C=H[J];return C},G=function(H,C,J){var K=C/8|0;return(H[K]|H[K+1]<<8)>>(C&7)&J},JC=function(H,C){var J=C/8|0;return(H[J]|H[J+1]<<8|H[J+2]<<16)>>(C&7)},mC=function(H){return(H+7)/8|0},k=function(H,C,J){if(C==null||C<0)C=0;if(J==null||J>H.length)J=H.length;return new q(H.subarray(C,J))};var uC=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],F=function(H,C,J){var K=new Error(C||uC[H]);if(K.code=H,Error.captureStackTrace)Error.captureStackTrace(K,F);if(!J)throw K;return K},qC=function(H,C,J,K){var Q=H.length,R=K?K.length:0;if(!Q||C.f&&!C.l)return J||new q(0);var N=!J,V=N||C.i!=2,E=C.i;if(N)J=new q(Q*3);var Y=function(jC){var GC=J.length;if(jC>GC){var PC=new q(Math.max(GC*2,jC));PC.set(J),J=PC}},W=C.f||0,X=C.p||0,B=C.b||0,A=C.l,j=C.d,g=C.m,D=C.n,x=Q*8;do{if(!A){W=G(H,X,1);var w=G(H,X+1,3);if(X+=3,!w){var M=mC(X)+4,z=H[M-4]|H[M-3]<<8,e=M+z;if(e>Q){if(E)F(0);break}if(V)Y(B+z);J.set(H.subarray(M,e),B),C.b=B+=z,C.p=X=e*8,C.f=W;continue}else if(w==1)A=hC,j=_C,g=9,D=5;else if(w==2){var m=G(H,X,31)+257,f=G(H,X+10,15)+4,c=m+G(H,X+5,31)+1;X+=14;var U=new q(c),L=new q(19);for(var O=0;O<f;++O)L[xC[O]]=G(H,X+O*3,7);X+=f*3;var u=HC(L),P=(1<<u)-1,S=b(L,u,1);for(var O=0;O<c;){var r=S[G(H,X,P)];X+=r&15;var M=r>>4;if(M<16)U[O++]=M;else{var T=0,y=0;if(M==16)y=3+G(H,X,3),X+=2,T=U[O-1];else if(M==17)y=3+G(H,X,7),X+=3;else if(M==18)y=11+G(H,X,127),X+=7;while(y--)U[O++]=T}}var s=U.subarray(0,m),Z=U.subarray(m);g=HC(s),D=HC(Z),A=b(s,g,1),j=b(Z,D,1)}else F(1);if(X>x){if(E)F(0);break}}if(V)Y(B+131072);var QC=(1<<g)-1,VC=(1<<D)-1,XC=X;for(;;XC=X){var T=A[JC(H,X)&QC],p=T>>4;if(X+=T&15,X>x){if(E)F(0);break}if(!T)F(2);if(p<256)J[B++]=p;else if(p==256){XC=X,A=null;break}else{var OC=p-254;if(p>264){var O=p-257,a=WC[O];OC=G(H,X,(1<<a)-1)+FC[O],X+=a}var YC=j[JC(H,X)&VC],$C=YC>>4;if(!YC)F(3);X+=YC&15;var Z=vC[$C];if($C>3){var a=BC[$C];Z+=JC(H,X)&(1<<a)-1,X+=a}if(X>x){if(E)F(0);break}if(V)Y(B+131072);var MC=B+OC;if(B<Z){var LC=R-Z,oC=Math.min(Z,MC);if(LC+B<0)F(3);for(;B<oC;++B)J[B]=K[LC+B]}for(;B<MC;++B)J[B]=J[B-Z]}}if(C.l=A,C.p=XC,C.b=B,C.f=W,A)W=1,C.m=g,C.d=j,C.n=D}while(!W);return B!=J.length&&N?k(J,0,B):J.subarray(0,B)};var d=new q(0);var tC=function(H,C){var J={};for(var K in H)J[K]=H[K];for(var K in C)J[K]=C[K];return J},UC=function(H,C,J){var K=H(),Q=H.toString(),R=Q.slice(Q.indexOf("[")+1,Q.lastIndexOf("]")).replace(/\s+/g,"").split(",");for(var N=0;N<K.length;++N){var V=K[N],E=R[N];if(typeof V=="function"){C+=";"+E+"=";var Y=V.toString();if(V.prototype)if(Y.indexOf("[native code]")!=-1){var W=Y.indexOf(" ",8)+1;C+=Y.slice(W,Y.indexOf("(",W))}else{C+=Y;for(var X in V.prototype)C+=";"+E+".prototype."+X+"="+V.prototype[X].toString()}else C+=Y}else J[E]=V}return C},t=[],CH=function(H){var C=[];for(var J in H)if(H[J].buffer)C.push((H[J]=new H[J].constructor(H[J])).buffer);return C},HH=function(H,C,J,K){if(!t[J]){var Q="",R={},N=H.length-1;for(var V=0;V<N;++V)Q=UC(H[V],Q,R);t[J]={c:UC(H[N],Q,R),e:R}}var E=tC({},t[J].e);return iC(t[J].c+";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage="+C.toString()+"}",J,E,CH(E),K)},JH=function(){return[q,v,gC,WC,BC,xC,FC,vC,hC,_C,KC,uC,b,HC,G,JC,mC,k,F,qC,$H,KH,QH]};var KH=function(H){return postMessage(H,[H.buffer])},QH=function(H){return H&&{out:H.size&&new q(H.size),dictionary:H.dictionary}};var SC=function(H){return H.ondata=function(C,J){return postMessage([C,J],[C.buffer])},function(C){if(C.data.length)H.push(C.data[0],C.data[1]),postMessage([C.data[0].length]);else H.flush()}},VH=function(H,C,J,K,Q,R,N){var V,E=HH(H,K,Q,function(Y,W){if(Y)E.terminate(),C.ondata.call(C,Y);else if(!Array.isArray(W))N(W);else if(W.length==1){if(C.queuedSize-=W[0],C.ondrain)C.ondrain(W[0])}else{if(W[1])E.terminate();C.ondata.call(C,Y,W[0],W[1])}});if(E.postMessage(J),C.queuedSize=0,C.push=function(Y,W){if(!C.ondata)F(5);if(V)C.ondata(F(4,0,1),null,!!W);C.queuedSize+=Y.length,E.postMessage([Y,V=W],[Y.buffer])},C.terminate=function(){E.terminate()},R)C.flush=function(){E.postMessage([])}},n=function(H,C){return H[C]|H[C+1]<<8},o=function(H,C){return(H[C]|H[C+1]<<8|H[C+2]<<16|H[C+3]<<24)>>>0},RC=function(H,C){return o(H,C)+o(H,C+4)*4294967296};function XH(H,C){if(typeof H=="function")C=H,H={};return this.ondata=C,H}var NC=function(){function H(C,J){if(typeof C=="function")J=C,C={};this.ondata=J;var K=C&&C.dictionary&&C.dictionary.subarray(-32768);if(this.s={i:0,b:K?K.length:0},this.o=new q(32768),this.p=new q(0),K)this.o.set(K)}return H.prototype.e=function(C){if(!this.ondata)F(5);if(this.d)F(4);if(!this.p.length)this.p=C;else if(C.length){var J=new q(this.p.length+C.length);J.set(this.p),J.set(C,this.p.length),this.p=J}},H.prototype.c=function(C){this.s.i=+(this.d=C||!1);var J=this.s.b,K=qC(this.p,this.s,this.o);this.ondata(k(K,J,this.s.b),this.d),this.o=k(K,this.s.b-32768),this.s.b=this.o.length,this.p=k(this.p,this.s.p/8|0),this.s.p&=7},H.prototype.push=function(C,J){this.e(C),this.c(J)},H}();var YH=function(){function H(C,J){VH([JH,function(){return[SC,NC]}],this,XH.call(this,C,J),function(K){var Q=new NC(K.data);onmessage=SC(Q)},7,0)}return H}();function $H(H,C){return qC(H,{i:2},C&&C.out,C&&C.dictionary)}var EC=typeof TextDecoder!="undefined"&&new TextDecoder,RH=0;try{EC.decode(d,{stream:!0}),RH=1}catch(H){}var NH=function(H){for(var C="",J=0;;){var K=H[J++],Q=(K>127)+(K>223)+(K>239);if(J+Q>H.length)return{s:C,r:k(H,J-1)};if(!Q)C+=String.fromCharCode(K);else if(Q==3)K=((K&15)<<18|(H[J++]&63)<<12|(H[J++]&63)<<6|H[J++]&63)-65536,C+=String.fromCharCode(55296|K>>10,56320|K&1023);else if(Q&1)C+=String.fromCharCode((K&31)<<6|H[J++]&63);else C+=String.fromCharCode((K&15)<<12|(H[J++]&63)<<6|H[J++]&63)}};function EH(H,C){if(C){var J="";for(var K=0;K<H.length;K+=16384)J+=String.fromCharCode.apply(null,H.subarray(K,K+16384));return J}else if(EC)return EC.decode(H);else{var Q=NH(H),R=Q.s,J=Q.r;if(J.length)F(8);return R}}var WH=function(H,C){for(;n(H,C)!=1;C+=4+n(H,C+2));return[RC(H,C+12),RC(H,C+4),RC(H,C+20)]};var BH=function(){function H(){}return H.prototype.push=function(C,J){this.ondata(null,C,J)},H.compression=0,H}();var rC=function(){function H(C,J){var K=this;if(J<320000)this.i=new NC(function(Q,R){K.ondata(null,Q,R)});else this.i=new YH(function(Q,R,N){K.ondata(Q,R,N)}),this.terminate=this.i.terminate}return H.prototype.push=function(C,J){if(this.i.terminate)C=k(C,0);this.i.push(C,J)},H.compression=8,H}();var pC=function(){function H(C){this.onfile=C,this.k=[],this.o={0:BH},this.p=d}return H.prototype.push=function(C,J){var K=this;if(!this.onfile)F(5);if(!this.p)F(4);if(this.c>0){var Q=Math.min(this.c,C.length),R=C.subarray(0,Q);if(this.c-=Q,this.d)this.d.push(R,!this.c);else this.k[0].push(R);if(C=C.subarray(Q),C.length)return this.push(C,J)}else{var N=0,V=0,E=void 0,Y=void 0;if(!this.p.length)Y=C;else if(!C.length)Y=this.p;else Y=new q(this.p.length+C.length),Y.set(this.p),Y.set(C,this.p.length);var W=Y.length,X=this.c,B=X&&this.d,A=function(){var x,w=o(Y,V);if(w==67324752){N=1,E=V,j.d=null,j.c=0;var M=n(Y,V+6),z=n(Y,V+8),e=M&2048,m=M&8,f=n(Y,V+26),c=n(Y,V+28);if(W>V+30+f+c){var U=[];j.k.unshift(U),N=2;var L=o(Y,V+18),O=o(Y,V+22),u=EH(Y.subarray(V+30,V+=30+f),!e);if(L==4294967295)x=m?[-2]:WH(Y,V),L=x[0],O=x[1];else if(m)L=-1;V+=c,j.c=L;var P,S={name:u,compression:z,start:function(){if(!S.ondata)F(5);if(!L)S.ondata(null,d,!0);else{var r=K.o[z];if(!r)S.ondata(F(14,"unknown compression type "+z,1),null,!1);P=L<0?new r(u):new r(u,L,O),P.ondata=function(Z,QC,VC){S.ondata(Z,QC,VC)};for(var T=0,y=U;T<y.length;T++){var s=y[T];P.push(s,!1)}if(K.k[0]==U&&K.c)K.d=P;else P.push(d,!0)}},terminate:function(){if(P&&P.terminate)P.terminate()}};if(L>=0)S.size=L,S.originalSize=O;j.onfile(S)}return"break"}else if(X){if(w==134695760)return E=V+=12+(X==-2&&8),N=3,j.c=0,"break";else if(w==33639248)return E=V-=4,N=3,j.c=0,"break"}},j=this;for(;V<W-4;++V){var g=A();if(g==="break")break}if(this.p=d,X<0){var D=N?Y.subarray(0,E-12-(X==-2&&8)-(o(Y,E-16)==134695760&&4)):Y.subarray(0,V);if(B)B.push(D,!!N);else this.k[+(N==2)].push(D)}if(N&2)return this.push(Y.subarray(V),J);this.p=Y.subarray(V)}if(J){if(this.c)F(13);this.p=null}},H.prototype.register=function(C){this.o[C.compression]=C},H}();async function nC(H,C){let J=new pC((Q)=>{let R=_.join(C,Q.name);if(Q.name.endsWith("/")){h.mkdirSync(R,{recursive:!0});return}h.mkdirSync(_.dirname(R),{recursive:!0});let N=h.createWriteStream(R);Q.ondata=(V,E,Y)=>{if(E?.length&&N.write(E),Y===!1)return},Q.start()});J.register(rC),h.createReadStream(H).on("data",(Q)=>{J.push(Q,!1)})}if(require.main==module)FH();function FH(){let H=process.argv.slice(2);if(H.length<3||H[1]!=="-d")console.error("用法: npx ff-unzip <tarPath> -d <destDir>"),process.exit(1);let C=_.resolve(H[0]),J=_.resolve(H[2]);nC(C,J).catch((K)=>{console.error("解压失败:",K.message),process.exit(1)})}