@lp-labs/zip-save 0.1.0 → 0.1.1
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/README.md
CHANGED
|
@@ -14,6 +14,10 @@ npm install @lp-labs/zip-save
|
|
|
14
14
|
|
|
15
15
|
Requires a modern browser or Node.js 18+. Native raw DEFLATE support varies by browser and Node version; inspect `supports.compression` and `supports.decompression` when needed. No polyfills are bundled.
|
|
16
16
|
|
|
17
|
+
### Browser Sandboxes
|
|
18
|
+
|
|
19
|
+
Version 0.1.1 uses `.js` entry points for compatibility with browser sandboxes and older package resolvers, while retaining both ESM and CommonJS support. If a sandbox reports a missing `dist/index.cjs` entry for version 0.1.0, update to version 0.1.1 or later and restart the sandbox to refresh its dependency cache.
|
|
20
|
+
|
|
17
21
|
## ZIP And Download
|
|
18
22
|
|
|
19
23
|
```js
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";var j=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var oe=Object.prototype.hasOwnProperty;var ie=(n,e)=>{for(var t in e)j(n,t,{get:e[t],enumerable:!0})},se=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ne(e))!oe.call(n,o)&&o!==t&&j(n,o,{get:()=>e[o],enumerable:!(r=re(e,o))||r.enumerable});return n};var ae=n=>se(j({},"__esModule",{value:!0}),n);var Se={};ie(Se,{DEFAULT_LIMITS:()=>F,Zip:()=>O,ZipEntry:()=>S,default:()=>Ae,saveAs:()=>Z,supports:()=>Te,zipAndSave:()=>ve});module.exports=ae(Se);var C=new TextEncoder,P=new TextDecoder("utf-8",{fatal:!0}),x=4294967295,ce=Uint32Array.from({length:256},(n,e)=>{let t=e;for(let r=0;r<8;r+=1)t=t&1?3988292384^t>>>1:t>>>1;return t>>>0});function N(n){let e=x;for(let t of n)e=ce[(e^t)&255]^e>>>8;return(e^x)>>>0}function u(n){if(n?.aborted)throw n.reason??new DOMException("The operation was aborted.","AbortError")}function A(n,e=!1){if(typeof n!="string"||!n||/[\x00-\x1f\x7f]/.test(n))throw new TypeError("An entry needs a nonempty name without control characters.");let t=n.replaceAll("\\","/");if(t.startsWith("/")||/^[a-z]:/i.test(t))throw new TypeError("Absolute ZIP paths are not allowed.");let r=t.split("/").filter(Boolean);if(!r.length||r.some(o=>o==="."||o===".."))throw new TypeError("ZIP paths cannot contain traversal segments.");return r.join("/")+(e||t.endsWith("/")?"/":"")}function _(n,e){if(n>e)throw new RangeError("Input exceeds the configured size limit.")}function le(n,e){let t=n.replace(/\s/g,"");if(!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(t))throw new TypeError("Invalid padded base64 input.");let r=t.endsWith("==")?2:Number(t.endsWith("="));return _(t.length/4*3-r,e),Uint8Array.from(atob(t),o=>o.codePointAt(0))}function fe(n,{base64:e,binary:t,maxSize:r}){return e?le(n,r):(_(n.length,r),t?Uint8Array.from(n,o=>{let s=o.codePointAt(0);if(s>255)throw new TypeError("A binary string may contain only byte-valued characters.");return s}):C.encode(n))}async function L(n,{base64:e=!1,binary:t=!1,maxSize:r=1/0}={}){let o=await n,s;if(typeof o=="string")s=fe(o,{base64:e,binary:t,maxSize:r});else if(o instanceof ArrayBuffer)_(o.byteLength,r),s=new Uint8Array(o).slice();else if(ArrayBuffer.isView(o))_(o.byteLength,r),s=new Uint8Array(o.buffer,o.byteOffset,o.byteLength).slice();else if(typeof Blob<"u"&&o instanceof Blob)_(o.size,r),s=new Uint8Array(await o.arrayBuffer());else throw new TypeError("Expected a string, Blob, ArrayBuffer, typed array, or a promise of one.");return _(s.length,r),s}function V(n){let e=[];for(let t=0;t<n.length;t+=32768)e.push(String.fromCodePoint(...n.subarray(t,t+32768)));return e.join("")}function M(n,e="uint8array",t="application/octet-stream"){switch(e){case"uint8array":return n.slice();case"arraybuffer":return n.slice().buffer;case"blob":return new Blob([n],{type:t});case"text":case"string":return P.decode(n);case"binarystring":return V(n);case"base64":return btoa(V(n));case"nodebuffer":{if(globalThis.Buffer===void 0)throw new Error("nodebuffer output is available only in Node.js.");return globalThis.Buffer.from(n)}default:throw new TypeError(`Unsupported output type: ${e}`)}}function D(n){let e=n.reduce((o,s)=>o+s.length,0);if(e>=x)throw new RangeError("ZIP64 is required for archives of 4 GiB or larger and is not supported.");let t=new Uint8Array(e),r=0;for(let o of n)t.set(o,r),r+=o.length;return t}function X(n){if(!(n instanceof Date)||!Number.isFinite(n.getTime()))throw new TypeError("Entry date must be a valid Date.");let e=Math.min(2107,Math.max(1980,n.getFullYear()));return{time:n.getHours()<<11|n.getMinutes()<<5|n.getSeconds()>>>1,date:e-1980<<9|n.getMonth()+1<<5|n.getDate()}}function G(n,e){return new Date(1980+(n>>>9),(n>>>5&15)-1,n&31,e>>>11,e>>>5&63,(e&31)*2)}function k(n=!1){let e=n?globalThis.DecompressionStream:globalThis.CompressionStream;if(!e)return!1;try{return new e("deflate-raw"),!0}catch{return!1}}async function W(n,{decompress:e=!1,maxSize:t=1/0,signal:r}={}){u(r);let o=e?globalThis.DecompressionStream:globalThis.CompressionStream,s;try{s=new o("deflate-raw")}catch{throw new Error(`Native raw DEFLATE ${e?"decompression":"compression"} is unavailable in this environment.`)}let i=new Blob([n]).stream().pipeThrough(s).getReader(),a=[],l=0,p=()=>{i.cancel(r.reason).catch(()=>{})};r?.addEventListener("abort",p,{once:!0});try{for(;;){u(r);let{done:f,value:c}=await i.read();if(u(r),f)break;if(l+=c.length,l>t){let m=e?"Expanded data exceeds the configured or declared size limit.":"Compressed data exceeds maxArchiveSize.";throw new RangeError(m)}a.push(c)}return D(a)}catch(f){throw await i.cancel().catch(()=>{}),f}finally{r?.removeEventListener("abort",p),i.releaseLock()}}var F=Object.freeze({maxArchiveSize:256*1024*1024,maxEntrySize:128*1024*1024,maxTotalSize:256*1024*1024,maxEntries:1e4});function B(n){let e={};for(let[t,r]of Object.entries(F)){let o=n[t]??r;if(!Number.isSafeInteger(o)||o<0)throw new RangeError(`${t} must be a nonnegative safe integer.`);e[t]=o}return e}function $(n,e){let t=new Uint8Array(n),r=new DataView(t.buffer);return r.setUint32(0,e,!0),{bytes:t,view:r}}function H(n,e){let t=C.encode(n??"");if(t.length>65535)throw new RangeError(`${e} exceeds the ZIP UTF-8 length limit.`);return t}function ue(n,e,t){if(n.length>=65535||n.length>t.maxEntries)throw new RangeError("Too many ZIP entries; ZIP64 is not supported.");let r=e.compression??"DEFLATE",o=e.compressionFallback??"STORE";if(!["STORE","DEFLATE"].includes(r))throw new TypeError("Compression must be STORE or DEFLATE.");if(!["STORE","error"].includes(o))throw new TypeError("compressionFallback must be STORE or error.");return{compression:r,fallback:o,nativeCompression:k()}}async function he(n,e,t,r,o){let s=n.compression??t.compression;if(!["STORE","DEFLATE"].includes(s))throw new TypeError("Compression must be STORE or DEFLATE.");if(n.dir||s!=="DEFLATE"||!e.length)return{payload:e,method:0};if(!t.nativeCompression){if(t.fallback==="error")throw new Error("Native raw DEFLATE compression is unavailable.");return{payload:e,method:0}}let i=await W(e,{signal:o,maxSize:r.maxArchiveSize});return i.length<e.length?{payload:i,method:8}:{payload:e,method:0}}async function de(n,e,t,r){u(r);let o=H(n.name,"Filename"),s=H(n.comment,"Entry comment"),i=X(n.date),a=n.dir?new Uint8Array:await n._bytes({maxSize:t.maxEntrySize,signal:r});u(r);let l=await he(n,a,e,t,r);return{entry:n,filename:o,comment:s,date:i,data:a,...l}}async function*me(n,e,t,r){for(let o of n)yield de(o,e,t,r)}async function Y(n,e={},t=void 0){let r=B(e),o=ue(n,e,r),s=[],i=[],a=0,l=0,p=0,f=0;t?.({percent:0,currentFile:null});for await(let{entry:w,filename:b,comment:v,date:T,data:E,payload:U,method:R}of me(n,o,r,e.signal)){if(p+=E.length,p>r.maxTotalSize)throw new RangeError("Uncompressed entries exceed maxTotalSize.");let z=N(E);if(E.length>=x||U.length>=x)throw new RangeError("ZIP64 entries are not supported.");let g=$(30,67324752);g.view.setUint16(4,20,!0),g.view.setUint16(6,2048,!0),g.view.setUint16(8,R,!0),g.view.setUint16(10,T.time,!0),g.view.setUint16(12,T.date,!0),g.view.setUint32(14,z,!0),g.view.setUint32(18,U.length,!0),g.view.setUint32(22,E.length,!0),g.view.setUint16(26,b.length,!0);let d=$(46,33639248);if(d.view.setUint16(4,20,!0),d.view.setUint16(6,20,!0),d.view.setUint16(8,2048,!0),d.view.setUint16(10,R,!0),d.view.setUint16(12,T.time,!0),d.view.setUint16(14,T.date,!0),d.view.setUint32(16,z,!0),d.view.setUint32(20,U.length,!0),d.view.setUint32(24,E.length,!0),d.view.setUint16(28,b.length,!0),d.view.setUint16(32,v.length,!0),d.view.setUint32(38,w.dir?16:0,!0),d.view.setUint32(42,a,!0),s.push(g.bytes,b,U),i.push(d.bytes,b,v),a+=g.bytes.length+b.length+U.length,l+=d.bytes.length+b.length+v.length,a+l+22>r.maxArchiveSize)throw new RangeError("Archive exceeds maxArchiveSize.");t?.({percent:++f/n.length*100,currentFile:w.name})}u(e.signal);let c=H(e.comment,"Archive comment"),m=D(i),h=$(22,101010256);if(h.view.setUint16(8,n.length,!0),h.view.setUint16(10,n.length,!0),h.view.setUint32(12,m.length,!0),h.view.setUint32(16,a,!0),h.view.setUint16(20,c.length,!0),a+m.length+22+c.length>r.maxArchiveSize)throw new RangeError("Archive exceeds maxArchiveSize.");let y=D([...s,m,h.bytes,c]);return n.length||t?.({percent:100,currentFile:null}),y}function pe(n,e,t,r){let o=-1;for(let l=n.length-22;l>=Math.max(0,n.length-65557);l-=1)if(e.getUint32(l,!0)===101010256&&l+22+e.getUint16(l+20,!0)===n.length){o=l;break}if(o<0)throw new Error("ZIP end-of-central-directory record was not found.");let s=e.getUint16(o+10,!0),i=e.getUint32(o+12,!0),a=e.getUint32(o+16,!0);if(e.getUint16(o+4,!0)||e.getUint16(o+6,!0)||e.getUint16(o+8,!0)!==s)throw new Error("Multi-disk ZIP archives are not supported.");if(s===65535||i===x||a===x)throw new Error("ZIP64 archives are not supported.");if(s>t.maxEntries)throw new RangeError("Archive exceeds maxEntries.");if(r(a,i,o),a+i!==o)throw new Error("Unsupported or invalid ZIP central directory.");return{endOffset:o,centralOffset:a,count:s}}function we({flags:n,method:e,size:t,compressedSize:r,localOffset:o,external:s,disk:i},a){if(i)throw new Error("Multi-disk ZIP archives are not supported.");if(t===x||r===x||o===x)throw new Error("ZIP64 entries are not supported.");if(n&-2063)throw new Error("Encrypted ZIP entries or unsupported ZIP flags are not supported.");if(e!==0&&e!==8)throw new Error(`Unsupported ZIP compression method: ${e}`);if((s>>>16&61440)===40960)throw new Error("Symbolic-link ZIP entries are not supported.");if(t>a.maxEntrySize)throw new RangeError("Entry exceeds maxEntrySize.");if(e===0&&t!==r)throw new Error("Stored ZIP entry has inconsistent sizes.")}function ge(n,e,t,r,o,s){let{localOffset:i,flags:a,method:l,checksum:p,compressedSize:f,size:c}=n;if(s(i,30,o),t.getUint32(i,!0)!==67324752||t.getUint16(i+6,!0)!==a||t.getUint16(i+8,!0)!==l)throw new Error("ZIP local and central headers disagree.");let m=t.getUint16(i+26,!0),h=t.getUint16(i+28,!0);s(i+30,m+h,o);let y=e.subarray(i+30,i+30+m);if(r.length!==y.length||!r.every((b,v)=>b===y[v]))throw new Error("ZIP local and central filenames disagree.");if(!(a&8)&&(t.getUint32(i+14,!0)!==p||t.getUint32(i+18,!0)!==f||t.getUint32(i+22,!0)!==c))throw new Error("ZIP local and central sizes or checksums disagree.");let w=i+30+m+h;return s(w,f,o),{payload:e.subarray(w,w+f),range:[i,w+f]}}function ye({method:n,payload:e,size:t,checksum:r,name:o},s){return async({maxSize:i=s.maxEntrySize,signal:a}={})=>{if(u(a),t>i)throw new RangeError("Entry exceeds the configured size limit.");let l=n===0?e:await W(e,{decompress:!0,maxSize:Math.min(i,t),signal:a});if(l.length!==t)throw new Error(`Expanded ZIP entry size does not match: ${o}`);if(N(l)!==r)throw new Error(`CRC32 mismatch: ${o}`);return l}}function be(n){n.sort((e,t)=>e[0]-t[0]);for(let e=1;e<n.length;e+=1)if(n[e][0]<n[e-1][1])throw new Error("Overlapping ZIP entries are not supported.")}function Ee(n,e,t,r){if(!(e&2048)&&n.some(a=>a>127))throw new Error("Legacy non-UTF-8 ZIP filenames are not supported.");let o=P.decode(n),s=o.endsWith("/")||!!(t&16)||(t>>>16&61440)===16384,i=A(o,s);if(s&&r!==0)throw new Error("Directory entries cannot contain file data.");return{name:i,dir:s}}async function J(n,e={}){let t=B(e);if(n.length>t.maxArchiveSize)throw new RangeError("Archive exceeds maxArchiveSize.");u(e.signal);let r=new DataView(n.buffer,n.byteOffset,n.byteLength),o=(h,y,w=n.length)=>{if(!Number.isSafeInteger(h)||h<0||y<0||h+y>w)throw new Error("Truncated or invalid ZIP structure.")},{endOffset:s,centralOffset:i,count:a}=pe(n,r,t,o),l=[],p=new Set,f=[],c=i,m=0;for(let h=0;h<a;h+=1){if(u(e.signal),o(c,46,s),r.getUint32(c,!0)!==33639248)throw new Error("Invalid ZIP central directory signature.");let y=r.getUint16(c+8,!0),w=r.getUint16(c+10,!0),b=r.getUint32(c+16,!0),v=r.getUint32(c+20,!0),T=r.getUint32(c+24,!0),E=r.getUint16(c+28,!0),U=r.getUint16(c+30,!0),R=r.getUint16(c+32,!0),z=r.getUint32(c+38,!0),g=r.getUint32(c+42,!0),d={flags:y,method:w,checksum:b,compressedSize:v,size:T,localOffset:g,external:z,disk:r.getUint16(c+34,!0)};if(we(d,t),m+=T,m>t.maxTotalSize)throw new RangeError("Archive exceeds maxTotalSize.");o(c+46,E+U+R,s);let q=n.subarray(c+46,c+46+E),{name:I,dir:K}=Ee(q,y,z,T);if(p.has(I))throw new Error(`Duplicate ZIP entry: ${I}`);p.add(I);let{payload:Q,range:ee}=ge(d,n,r,q,i,o);f.push(ee);let te={name:I,dir:K,date:G(r.getUint16(c+14,!0),r.getUint16(c+12,!0)),comment:P.decode(n.subarray(c+46+E+U,c+46+E+U+R)),compression:w===8?"DEFLATE":"STORE",maxSize:t.maxEntrySize,read:ye({method:w,payload:Q,size:T,checksum:b,name:I},t)};l.push(te),c+=46+E+U+R}if(c!==s)throw new Error("ZIP entry count or central directory size does not match.");return be(f),e.checkCRC32&&await l.reduce((h,y)=>h.then(()=>y.read({signal:e.signal})),Promise.resolve()),u(e.signal),{entries:l,comment:P.decode(n.subarray(s+22))}}function xe(n="download"){if(typeof n!="string")throw new TypeError("Download filename must be a string.");let t=n.replaceAll("\\","/").split("/").pop().replace(/[\x00-\x1f\x7f<>:"|?*]/g,"_"),r=t.length;for(;r>0&&(t[r-1]==="."||t[r-1]===" ");)r-=1;let o=t.slice(0,r);if(!o||o==="."||o==="..")throw new TypeError("Download filename cannot be empty.");return o}function Ue(n){let[e,...t]=n.toLowerCase().split(";").map(o=>o.trim());return(e.startsWith("text/")||e==="application/json"||e==="application/xml"||e.startsWith("application/")&&e.endsWith("+xml"))&&t.some(o=>{let[s,i]=o.split("=").map(a=>a.trim());return s==="charset"&&i?.replaceAll('"',"")==="utf-8"})}async function Z(n,e="download",{autoBom:t=!1,mimeType:r="application/octet-stream",signal:o,revokeAfter:s=4e4}={}){if(typeof document>"u"||typeof globalThis.URL?.createObjectURL!="function")throw new Error("saveAs requires a browser document and object URL support.");if(!Number.isFinite(s)||s<0||s>2147483647)throw new RangeError("revokeAfter must be between 0 and 2147483647 milliseconds.");let i=xe(e);u(o);let a,l=await n;if(typeof l=="string"||l instanceof URL){let c=new URL(String(l),document.baseURI);if(!["http:","https:","blob:"].includes(c.protocol))throw new TypeError("Download URLs must use HTTP, HTTPS, or blob protocols.");let m=await fetch(c,{signal:o});if(!m.ok)throw new Error(`Download request failed: HTTP ${m.status}`);a=await m.blob()}else a=l instanceof Blob?l:new Blob([await L(l)],{type:r});u(o),t&&Ue(a.type)&&(a=new Blob(["\uFEFF",a],{type:a.type}));let p=URL.createObjectURL(a),f;try{f=document.createElement("a"),f.href=p,f.download=i,f.rel="noopener",f.style.display="none",(document.body??document.documentElement).appendChild(f),u(o),f.click()}catch(c){throw URL.revokeObjectURL(p),c}finally{f?.remove()}setTimeout(()=>URL.revokeObjectURL(p),s)}var Te=Object.freeze({get compression(){return k()},get decompression(){return k(!0)},get download(){return typeof document<"u"&&typeof globalThis.URL?.createObjectURL=="function"}}),S=class{constructor(e,t,r={},o=void 0){if(this.name=e,this.dir=!!(r.dir||e.endsWith("/")),this.date=r.date?new Date(r.date):new Date,!Number.isFinite(this.date.getTime()))throw new TypeError("Entry date must be valid.");this.comment=r.comment??"",this.compression=r.compression,this._data=t,this._inputOptions={base64:r.base64,binary:r.binary},this._read=o,this._maxSize=r.maxSize??F.maxEntrySize}async _bytes({maxSize:e=this._maxSize,signal:t}={}){if(!Number.isSafeInteger(e)||e<0)throw new RangeError("maxSize must be a nonnegative safe integer.");u(t);let r=this._read?await this._read({maxSize:e,signal:t}):await L(this._data,{...this._inputOptions,maxSize:e});if(u(t),r.length>e)throw new RangeError("Entry exceeds the configured size limit.");return r}async async(e="uint8array",t={}){let r=this.dir?new Uint8Array:await this._bytes(t);return M(r,e,t.mimeType)}},O=class n{constructor(){this._state={entries:new Map,comment:""},this._prefix=""}get comment(){return this._state.comment}set comment(e){if(typeof e!="string")throw new TypeError("Archive comment must be a string.");this._state.comment=e}get files(){return Object.fromEntries([...this._state.entries].filter(([e])=>e.startsWith(this._prefix)&&e!==this._prefix))}_parents(e){let t=e.split("/");for(let r=1;r<t.length;r+=1){let o=t.slice(0,r).join("/")+"/";this._state.entries.has(o)||this._state.entries.set(o,new S(o,"",{dir:!0}))}}file(e,t,r={}){if(e instanceof RegExp){if(arguments.length>1)throw new TypeError("A regular expression can only retrieve files.");return this.filter((i,a)=>(e.lastIndex=0,!a.dir&&e.test(i)))}if(arguments.length===1){let i=this._state.entries.get(this._prefix+A(e));return i&&!i.dir?i:null}let o=this._prefix+A(e,r.dir);if(r.compression&&!["STORE","DEFLATE"].includes(r.compression))throw new TypeError("Compression must be STORE or DEFLATE.");let s=new S(o,o.endsWith("/")?"":t,r);return r.createFolders!==!1&&this._parents(o),this._state.entries.set(o,s),this}folder(e){let t=this._prefix+A(e,!0);this._parents(t),this._state.entries.has(t)||this._state.entries.set(t,new S(t,"",{dir:!0}));let r=new n;return r._state=this._state,r._prefix=t,r}remove(e){let t=this._prefix+A(e),r=t.endsWith("/")?t:t+"/";for(let o of this._state.entries.keys())(o===t||o.startsWith(r))&&this._state.entries.delete(o);return this}forEach(e){for(let[t,r]of this._state.entries)t.startsWith(this._prefix)&&t!==this._prefix&&e(t.slice(this._prefix.length),r)}filter(e){let t=[];return this.forEach((r,o)=>{e(r,o)&&t.push(o)}),t}async generateAsync(e={},t=void 0){let r=e.type??"blob";if(!["blob","uint8array","arraybuffer","base64","binarystring","nodebuffer"].includes(r))throw new TypeError(`Unsupported archive output type: ${r}`);let o=this.filter(()=>!0).map(i=>({name:i.name.slice(this._prefix.length),dir:i.dir,date:new Date(i.date),comment:i.comment,compression:i.compression,_bytes:i._bytes.bind(i)})),s=await Y(o,{...e,comment:e.comment??this.comment},t);return M(s,r,e.mimeType??"application/zip")}async loadAsync(e,t={}){let r=B(t);u(t.signal);let o=await L(e,{base64:t.base64,binary:t.binary,maxSize:r.maxArchiveSize}),s=await J(o,t);for(let i of s.entries){let a=this._prefix+i.name;this._state.entries.set(a,new S(a,null,i,i.read))}return this.comment=s.comment,this}static async loadAsync(e,t){return new n().loadAsync(e,t)}async saveAs(e="archive.zip",t={}){let{onUpdate:r,autoBom:o,revokeAfter:s,...i}=t,a=await this.generateAsync({...i,type:"blob"},r);await Z(a,e,{autoBom:o,revokeAfter:s,signal:t.signal})}};async function ve(n,e="archive.zip",t={}){let r=new O;if(Array.isArray(n))for(let o of n)if(typeof File<"u"&&o instanceof File)r.file(o.webkitRelativePath||o.name,o);else if(o&&typeof o=="object"&&"name"in o&&"data"in o)r.file(o.name,o.data,o.options);else throw new TypeError("Each file must be a File or an object containing name and data.");else if(n&&typeof n=="object")for(let[o,s]of Object.entries(n))r.file(o,s);else throw new TypeError("Files must be a file array or a filename-to-data object.");return await r.saveAs(e,t),r}var Ae=O;
|
|
2
|
-
//# sourceMappingURL=index.
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../src/index.js", "../../src/binary.js", "../../src/compression.js", "../../src/archive.js", "../../src/save.js"],
|
|
4
4
|
"sourcesContent": ["import { checkAbort, output, safePath, toBytes } from './binary.js';\r\nimport { DEFAULT_LIMITS, limitsFor, readArchive, writeArchive } from './archive.js';\r\nimport { supportsRawCompression } from './compression.js';\r\nimport { saveAs } from './save.js';\r\n\r\nexport { saveAs } from './save.js';\r\nexport { DEFAULT_LIMITS } from './archive.js';\r\nexport const supports = Object.freeze({\r\n get compression() { return supportsRawCompression(); },\r\n get decompression() { return supportsRawCompression(true); },\r\n get download() { return typeof document !== 'undefined' && typeof globalThis.URL?.createObjectURL === 'function'; },\r\n});\r\n\r\nexport class ZipEntry {\r\n constructor(name, data, options = {}, read = undefined) {\r\n this.name = name;\r\n this.dir = Boolean(options.dir || name.endsWith('/'));\r\n this.date = options.date ? new Date(options.date) : new Date();\r\n if (!Number.isFinite(this.date.getTime())) throw new TypeError('Entry date must be valid.');\r\n this.comment = options.comment ?? '';\r\n this.compression = options.compression;\r\n this._data = data;\r\n this._inputOptions = { base64: options.base64, binary: options.binary };\r\n this._read = read;\r\n this._maxSize = options.maxSize ?? DEFAULT_LIMITS.maxEntrySize;\r\n }\r\n\r\n async _bytes({ maxSize = this._maxSize, signal } = {}) {\r\n if (!Number.isSafeInteger(maxSize) || maxSize < 0) throw new RangeError('maxSize must be a nonnegative safe integer.');\r\n checkAbort(signal);\r\n const bytes = this._read ? await this._read({ maxSize, signal }) : await toBytes(this._data, { ...this._inputOptions, maxSize });\r\n checkAbort(signal);\r\n if (bytes.length > maxSize) throw new RangeError('Entry exceeds the configured size limit.');\r\n return bytes;\r\n }\r\n\r\n async async(type = 'uint8array', options = {}) {\r\n const bytes = this.dir ? new Uint8Array() : await this._bytes(options);\r\n return output(bytes, type, options.mimeType);\r\n }\r\n}\r\n\r\nexport class Zip {\r\n constructor() {\r\n this._state = { entries: new Map(), comment: '' };\r\n this._prefix = '';\r\n }\r\n\r\n get comment() { return this._state.comment; }\r\n set comment(value) {\r\n if (typeof value !== 'string') throw new TypeError('Archive comment must be a string.');\r\n this._state.comment = value;\r\n }\r\n\r\n get files() {\r\n return Object.fromEntries([...this._state.entries].filter(([name]) => name.startsWith(this._prefix) && name !== this._prefix));\r\n }\r\n\r\n _parents(name) {\r\n const parts = name.split('/');\r\n for (let index = 1; index < parts.length; index += 1) {\r\n const parent = parts.slice(0, index).join('/') + '/';\r\n if (!this._state.entries.has(parent)) this._state.entries.set(parent, new ZipEntry(parent, '', { dir: true }));\r\n }\r\n }\r\n\r\n file(name, data, options = {}) {\r\n if (name instanceof RegExp) {\r\n if (arguments.length > 1) throw new TypeError('A regular expression can only retrieve files.');\r\n return this.filter((relativePath, entry) => {\r\n name.lastIndex = 0;\r\n return !entry.dir && name.test(relativePath);\r\n });\r\n }\r\n if (arguments.length === 1) {\r\n const entry = this._state.entries.get(this._prefix + safePath(name));\r\n return entry && !entry.dir ? entry : null;\r\n }\r\n const path = this._prefix + safePath(name, options.dir);\r\n if (options.compression && !['STORE', 'DEFLATE'].includes(options.compression)) throw new TypeError('Compression must be STORE or DEFLATE.');\r\n const entry = new ZipEntry(path, path.endsWith('/') ? '' : data, options);\r\n if (options.createFolders !== false) this._parents(path);\r\n this._state.entries.set(path, entry);\r\n return this;\r\n }\r\n\r\n folder(name) {\r\n const path = this._prefix + safePath(name, true);\r\n this._parents(path);\r\n if (!this._state.entries.has(path)) this._state.entries.set(path, new ZipEntry(path, '', { dir: true }));\r\n const folder = new Zip();\r\n folder._state = this._state;\r\n folder._prefix = path;\r\n return folder;\r\n }\r\n\r\n remove(name) {\r\n const path = this._prefix + safePath(name);\r\n const folder = path.endsWith('/') ? path : path + '/';\r\n for (const key of this._state.entries.keys()) if (key === path || key.startsWith(folder)) this._state.entries.delete(key);\r\n return this;\r\n }\r\n\r\n forEach(callback) {\r\n for (const [name, entry] of this._state.entries) if (name.startsWith(this._prefix) && name !== this._prefix) callback(name.slice(this._prefix.length), entry);\r\n }\r\n\r\n filter(predicate) {\r\n const entries = [];\r\n this.forEach((name, entry) => { if (predicate(name, entry)) entries.push(entry); });\r\n return entries;\r\n }\r\n\r\n async generateAsync(options = {}, onUpdate = undefined) {\r\n const type = options.type ?? 'blob';\r\n if (!['blob', 'uint8array', 'arraybuffer', 'base64', 'binarystring', 'nodebuffer'].includes(type)) throw new TypeError(`Unsupported archive output type: ${type}`);\r\n const entries = this.filter(() => true).map((entry) => ({\r\n name: entry.name.slice(this._prefix.length), dir: entry.dir, date: new Date(entry.date),\r\n comment: entry.comment, compression: entry.compression, _bytes: entry._bytes.bind(entry),\r\n }));\r\n const bytes = await writeArchive(entries, { ...options, comment: options.comment ?? this.comment }, onUpdate);\r\n return output(bytes, type, options.mimeType ?? 'application/zip');\r\n }\r\n\r\n async loadAsync(data, options = {}) {\r\n const limits = limitsFor(options);\r\n checkAbort(options.signal);\r\n const bytes = await toBytes(data, { base64: options.base64, binary: options.binary, maxSize: limits.maxArchiveSize });\r\n const archive = await readArchive(bytes, options);\r\n for (const item of archive.entries) {\r\n const name = this._prefix + item.name;\r\n this._state.entries.set(name, new ZipEntry(name, null, item, item.read));\r\n }\r\n this.comment = archive.comment;\r\n return this;\r\n }\r\n\r\n static async loadAsync(data, options) { return new Zip().loadAsync(data, options); }\r\n\r\n async saveAs(filename = 'archive.zip', options = {}) {\r\n const { onUpdate, autoBom, revokeAfter, ...generateOptions } = options;\r\n const blob = await this.generateAsync({ ...generateOptions, type: 'blob' }, onUpdate);\r\n await saveAs(blob, filename, { autoBom, revokeAfter, signal: options.signal });\r\n }\r\n}\r\n\r\nexport async function zipAndSave(files, filename = 'archive.zip', options = {}) {\r\n const zip = new Zip();\r\n if (Array.isArray(files)) {\r\n for (const file of files) {\r\n if (typeof File !== 'undefined' && file instanceof File) zip.file(file.webkitRelativePath || file.name, file);\r\n else if (file && typeof file === 'object' && 'name' in file && 'data' in file) zip.file(file.name, file.data, file.options);\r\n else throw new TypeError('Each file must be a File or an object containing name and data.');\r\n }\r\n } else if (files && typeof files === 'object') {\r\n for (const [name, data] of Object.entries(files)) zip.file(name, data);\r\n } else throw new TypeError('Files must be a file array or a filename-to-data object.');\r\n await zip.saveAs(filename, options);\r\n return zip;\r\n}\r\n\r\nexport default Zip;", "export const encoder = new TextEncoder();\r\nexport const decoder = new TextDecoder('utf-8', { fatal: true });\r\nexport const MAX_UINT32 = 0xffffffff;\r\n\r\nconst crcTable = Uint32Array.from({ length: 256 }, (_, value) => {\r\n let checksum = value;\r\n for (let bit = 0; bit < 8; bit += 1) checksum = checksum & 1 ? 0xedb88320 ^ (checksum >>> 1) : checksum >>> 1;\r\n return checksum >>> 0;\r\n});\r\n\r\nexport function crc32(bytes) {\r\n let checksum = MAX_UINT32;\r\n for (const byte of bytes) checksum = crcTable[(checksum ^ byte) & 255] ^ (checksum >>> 8);\r\n return (checksum ^ MAX_UINT32) >>> 0;\r\n}\r\n\r\nexport function checkAbort(signal) {\r\n if (signal?.aborted) throw signal.reason ?? new DOMException('The operation was aborted.', 'AbortError');\r\n}\r\n\r\nexport function safePath(name, directory = false) {\r\n if (typeof name !== 'string' || !name || /[\\x00-\\x1f\\x7f]/.test(name)) throw new TypeError('An entry needs a nonempty name without control characters.');\r\n const path = name.replaceAll('\\\\', '/');\r\n if (path.startsWith('/') || /^[a-z]:/i.test(path)) throw new TypeError('Absolute ZIP paths are not allowed.');\r\n const parts = path.split('/').filter(Boolean);\r\n if (!parts.length || parts.some((part) => part === '.' || part === '..')) throw new TypeError('ZIP paths cannot contain traversal segments.');\r\n return parts.join('/') + (directory || path.endsWith('/') ? '/' : '');\r\n}\r\n\r\nfunction checkSize(size, limit) {\r\n if (size > limit) throw new RangeError('Input exceeds the configured size limit.');\r\n}\r\n\r\nfunction decodeBase64(value, maxSize) {\r\n const clean = value.replace(/\\s/g, '');\r\n if (!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(clean)) throw new TypeError('Invalid padded base64 input.');\r\n const padding = clean.endsWith('==') ? 2 : Number(clean.endsWith('='));\r\n checkSize(clean.length / 4 * 3 - padding, maxSize);\r\n return Uint8Array.from(atob(clean), (character) => character.codePointAt(0));\r\n}\r\n\r\nfunction encodeString(value, { base64, binary, maxSize }) {\r\n if (base64) return decodeBase64(value, maxSize);\r\n checkSize(value.length, maxSize);\r\n if (!binary) return encoder.encode(value);\r\n return Uint8Array.from(value, (character) => {\r\n const code = character.codePointAt(0);\r\n if (code > 255) throw new TypeError('A binary string may contain only byte-valued characters.');\r\n return code;\r\n });\r\n}\r\n\r\nexport async function toBytes(input, { base64 = false, binary = false, maxSize = Infinity } = {}) {\r\n const value = await input;\r\n let bytes;\r\n if (typeof value === 'string') bytes = encodeString(value, { base64, binary, maxSize });\r\n else if (value instanceof ArrayBuffer) {\r\n checkSize(value.byteLength, maxSize);\r\n bytes = new Uint8Array(value).slice();\r\n } else if (ArrayBuffer.isView(value)) {\r\n checkSize(value.byteLength, maxSize);\r\n bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength).slice();\r\n } else if (typeof Blob !== 'undefined' && value instanceof Blob) {\r\n checkSize(value.size, maxSize);\r\n bytes = new Uint8Array(await value.arrayBuffer());\r\n } else throw new TypeError('Expected a string, Blob, ArrayBuffer, typed array, or a promise of one.');\r\n checkSize(bytes.length, maxSize);\r\n return bytes;\r\n}\r\n\r\nexport function binaryString(bytes) {\r\n const chunks = [];\r\n for (let offset = 0; offset < bytes.length; offset += 32768) chunks.push(String.fromCodePoint(...bytes.subarray(offset, offset + 32768)));\r\n return chunks.join('');\r\n}\r\n\r\nexport function output(bytes, type = 'uint8array', mimeType = 'application/octet-stream') {\r\n switch (type) {\r\n case 'uint8array': return bytes.slice();\r\n case 'arraybuffer': return bytes.slice().buffer;\r\n case 'blob': return new Blob([bytes], { type: mimeType });\r\n case 'text': case 'string': return decoder.decode(bytes);\r\n case 'binarystring': return binaryString(bytes);\r\n case 'base64': return btoa(binaryString(bytes));\r\n case 'nodebuffer': {\r\n if (globalThis.Buffer === undefined) throw new Error('nodebuffer output is available only in Node.js.');\r\n return globalThis.Buffer.from(bytes);\r\n }\r\n default: throw new TypeError(`Unsupported output type: ${type}`);\r\n }\r\n}\r\n\r\nexport function joinBytes(chunks) {\r\n const length = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\r\n if (length >= MAX_UINT32) throw new RangeError('ZIP64 is required for archives of 4 GiB or larger and is not supported.');\r\n const result = new Uint8Array(length);\r\n let offset = 0;\r\n for (const chunk of chunks) { result.set(chunk, offset); offset += chunk.length; }\r\n return result;\r\n}\r\n\r\nexport function dosDate(date) {\r\n if (!(date instanceof Date) || !Number.isFinite(date.getTime())) throw new TypeError('Entry date must be a valid Date.');\r\n const year = Math.min(2107, Math.max(1980, date.getFullYear()));\r\n return {\r\n time: (date.getHours() << 11) | (date.getMinutes() << 5) | (date.getSeconds() >>> 1),\r\n date: ((year - 1980) << 9) | ((date.getMonth() + 1) << 5) | date.getDate(),\r\n };\r\n}\r\n\r\nexport function readDate(date, time) {\r\n return new Date(1980 + (date >>> 9), ((date >>> 5) & 15) - 1, date & 31, time >>> 11, (time >>> 5) & 63, (time & 31) * 2);\r\n}", "import { checkAbort, joinBytes } from './binary.js';\r\n\r\nexport function supportsRawCompression(decompress = false) {\r\n const Constructor = decompress ? globalThis.DecompressionStream : globalThis.CompressionStream;\r\n if (!Constructor) return false;\r\n try { new Constructor('deflate-raw'); return true; } catch { return false; }\r\n}\r\n\r\nexport async function transformBytes(bytes, { decompress = false, maxSize = Infinity, signal } = {}) {\r\n checkAbort(signal);\r\n const Constructor = decompress ? globalThis.DecompressionStream : globalThis.CompressionStream;\r\n let transformer;\r\n try { transformer = new Constructor('deflate-raw'); }\r\n catch { throw new Error(`Native raw DEFLATE ${decompress ? 'decompression' : 'compression'} is unavailable in this environment.`); }\r\n const reader = new Blob([bytes]).stream().pipeThrough(transformer).getReader();\r\n const chunks = [];\r\n let size = 0;\r\n const abort = () => { reader.cancel(signal.reason).catch(() => {}); };\r\n signal?.addEventListener('abort', abort, { once: true });\r\n try {\r\n while (true) {\r\n checkAbort(signal);\r\n const { done, value } = await reader.read();\r\n checkAbort(signal);\r\n if (done) break;\r\n size += value.length;\r\n if (size > maxSize) {\r\n const message = decompress ? 'Expanded data exceeds the configured or declared size limit.' : 'Compressed data exceeds maxArchiveSize.';\r\n throw new RangeError(message);\r\n }\r\n chunks.push(value);\r\n }\r\n return joinBytes(chunks);\r\n } catch (error) {\r\n await reader.cancel().catch(() => {});\r\n throw error;\r\n } finally {\r\n signal?.removeEventListener('abort', abort);\r\n reader.releaseLock();\r\n }\r\n}", "import { MAX_UINT32, checkAbort, crc32, decoder, dosDate, encoder, joinBytes, readDate, safePath } from './binary.js';\r\nimport { supportsRawCompression, transformBytes } from './compression.js';\r\n\r\nexport const DEFAULT_LIMITS = Object.freeze({ maxArchiveSize: 256 * 1024 * 1024, maxEntrySize: 128 * 1024 * 1024, maxTotalSize: 256 * 1024 * 1024, maxEntries: 10000 });\r\n\r\nexport function limitsFor(options) {\r\n const limits = {};\r\n for (const [key, fallback] of Object.entries(DEFAULT_LIMITS)) {\r\n const value = options[key] ?? fallback;\r\n if (!Number.isSafeInteger(value) || value < 0) throw new RangeError(`${key} must be a nonnegative safe integer.`);\r\n limits[key] = value;\r\n }\r\n return limits;\r\n}\r\n\r\nfunction record(length, signature) {\r\n const bytes = new Uint8Array(length);\r\n const view = new DataView(bytes.buffer);\r\n view.setUint32(0, signature, true);\r\n return { bytes, view };\r\n}\r\n\r\nfunction textBytes(text, label) {\r\n const bytes = encoder.encode(text ?? '');\r\n if (bytes.length > 65535) throw new RangeError(`${label} exceeds the ZIP UTF-8 length limit.`);\r\n return bytes;\r\n}\r\n\r\nfunction writeSettings(entries, options, limits) {\r\n if (entries.length >= 65535 || entries.length > limits.maxEntries) throw new RangeError('Too many ZIP entries; ZIP64 is not supported.');\r\n const compression = options.compression ?? 'DEFLATE';\r\n const fallback = options.compressionFallback ?? 'STORE';\r\n if (!['STORE', 'DEFLATE'].includes(compression)) throw new TypeError('Compression must be STORE or DEFLATE.');\r\n if (!['STORE', 'error'].includes(fallback)) throw new TypeError('compressionFallback must be STORE or error.');\r\n return { compression, fallback, nativeCompression: supportsRawCompression() };\r\n}\r\n\r\nasync function compressedPayload(entry, data, settings, limits, signal) {\r\n const requested = entry.compression ?? settings.compression;\r\n if (!['STORE', 'DEFLATE'].includes(requested)) throw new TypeError('Compression must be STORE or DEFLATE.');\r\n if (entry.dir || requested !== 'DEFLATE' || !data.length) return { payload: data, method: 0 };\r\n if (!settings.nativeCompression) {\r\n if (settings.fallback === 'error') throw new Error('Native raw DEFLATE compression is unavailable.');\r\n return { payload: data, method: 0 };\r\n }\r\n const compressed = await transformBytes(data, { signal, maxSize: limits.maxArchiveSize });\r\n return compressed.length < data.length ? { payload: compressed, method: 8 } : { payload: data, method: 0 };\r\n}\r\n\r\nasync function prepareEntry(entry, settings, limits, signal) {\r\n checkAbort(signal);\r\n const filename = textBytes(entry.name, 'Filename');\r\n const comment = textBytes(entry.comment, 'Entry comment');\r\n const date = dosDate(entry.date);\r\n const data = entry.dir ? new Uint8Array() : await entry._bytes({ maxSize: limits.maxEntrySize, signal });\r\n checkAbort(signal);\r\n const compressed = await compressedPayload(entry, data, settings, limits, signal);\r\n return { entry, filename, comment, date, data, ...compressed };\r\n}\r\n\r\nasync function* pendingEntries(entries, settings, limits, signal) {\r\n for (const entry of entries) yield prepareEntry(entry, settings, limits, signal);\r\n}\r\n\r\nexport async function writeArchive(entries, options = {}, onUpdate = undefined) {\r\n const limits = limitsFor(options);\r\n const settings = writeSettings(entries, options, limits);\r\n const chunks = [];\r\n const central = [];\r\n let offset = 0;\r\n let centralSize = 0;\r\n let expanded = 0;\r\n let completed = 0;\r\n onUpdate?.({ percent: 0, currentFile: null });\r\n for await (const { entry, filename, comment, date, data, payload, method } of pendingEntries(entries, settings, limits, options.signal)) {\r\n expanded += data.length;\r\n if (expanded > limits.maxTotalSize) throw new RangeError('Uncompressed entries exceed maxTotalSize.');\r\n const checksum = crc32(data);\r\n if (data.length >= MAX_UINT32 || payload.length >= MAX_UINT32) throw new RangeError('ZIP64 entries are not supported.');\r\n const local = record(30, 0x04034b50);\r\n local.view.setUint16(4, 20, true);\r\n local.view.setUint16(6, 0x0800, true);\r\n local.view.setUint16(8, method, true);\r\n local.view.setUint16(10, date.time, true);\r\n local.view.setUint16(12, date.date, true);\r\n local.view.setUint32(14, checksum, true);\r\n local.view.setUint32(18, payload.length, true);\r\n local.view.setUint32(22, data.length, true);\r\n local.view.setUint16(26, filename.length, true);\r\n const directory = record(46, 0x02014b50);\r\n directory.view.setUint16(4, 20, true);\r\n directory.view.setUint16(6, 20, true);\r\n directory.view.setUint16(8, 0x0800, true);\r\n directory.view.setUint16(10, method, true);\r\n directory.view.setUint16(12, date.time, true);\r\n directory.view.setUint16(14, date.date, true);\r\n directory.view.setUint32(16, checksum, true);\r\n directory.view.setUint32(20, payload.length, true);\r\n directory.view.setUint32(24, data.length, true);\r\n directory.view.setUint16(28, filename.length, true);\r\n directory.view.setUint16(32, comment.length, true);\r\n directory.view.setUint32(38, entry.dir ? 0x10 : 0, true);\r\n directory.view.setUint32(42, offset, true);\r\n chunks.push(local.bytes, filename, payload);\r\n central.push(directory.bytes, filename, comment);\r\n offset += local.bytes.length + filename.length + payload.length;\r\n centralSize += directory.bytes.length + filename.length + comment.length;\r\n if (offset + centralSize + 22 > limits.maxArchiveSize) throw new RangeError('Archive exceeds maxArchiveSize.');\r\n onUpdate?.({ percent: ++completed / entries.length * 100, currentFile: entry.name });\r\n }\r\n checkAbort(options.signal);\r\n const archiveComment = textBytes(options.comment, 'Archive comment');\r\n const centralBytes = joinBytes(central);\r\n const end = record(22, 0x06054b50);\r\n end.view.setUint16(8, entries.length, true);\r\n end.view.setUint16(10, entries.length, true);\r\n end.view.setUint32(12, centralBytes.length, true);\r\n end.view.setUint32(16, offset, true);\r\n end.view.setUint16(20, archiveComment.length, true);\r\n if (offset + centralBytes.length + 22 + archiveComment.length > limits.maxArchiveSize) throw new RangeError('Archive exceeds maxArchiveSize.');\r\n const result = joinBytes([...chunks, centralBytes, end.bytes, archiveComment]);\r\n if (!entries.length) onUpdate?.({ percent: 100, currentFile: null });\r\n return result;\r\n}\r\n\r\nfunction findDirectory(bytes, view, limits, requireRange) {\r\n let endOffset = -1;\r\n for (let offset = bytes.length - 22; offset >= Math.max(0, bytes.length - 65557); offset -= 1) {\r\n if (view.getUint32(offset, true) === 0x06054b50 && offset + 22 + view.getUint16(offset + 20, true) === bytes.length) { endOffset = offset; break; }\r\n }\r\n if (endOffset < 0) throw new Error('ZIP end-of-central-directory record was not found.');\r\n const count = view.getUint16(endOffset + 10, true);\r\n const centralSize = view.getUint32(endOffset + 12, true);\r\n const centralOffset = view.getUint32(endOffset + 16, true);\r\n if (view.getUint16(endOffset + 4, true) || view.getUint16(endOffset + 6, true) || view.getUint16(endOffset + 8, true) !== count) throw new Error('Multi-disk ZIP archives are not supported.');\r\n if (count === 65535 || centralSize === MAX_UINT32 || centralOffset === MAX_UINT32) throw new Error('ZIP64 archives are not supported.');\r\n if (count > limits.maxEntries) throw new RangeError('Archive exceeds maxEntries.');\r\n requireRange(centralOffset, centralSize, endOffset);\r\n if (centralOffset + centralSize !== endOffset) throw new Error('Unsupported or invalid ZIP central directory.');\r\n return { endOffset, centralOffset, count };\r\n}\r\n\r\nfunction validateEntry({ flags, method, size, compressedSize, localOffset, external, disk }, limits) {\r\n if (disk) throw new Error('Multi-disk ZIP archives are not supported.');\r\n if (size === MAX_UINT32 || compressedSize === MAX_UINT32 || localOffset === MAX_UINT32) throw new Error('ZIP64 entries are not supported.');\r\n if (flags & ~0x080e) throw new Error('Encrypted ZIP entries or unsupported ZIP flags are not supported.');\r\n if (method !== 0 && method !== 8) throw new Error(`Unsupported ZIP compression method: ${method}`);\r\n if (((external >>> 16) & 0xf000) === 0xa000) throw new Error('Symbolic-link ZIP entries are not supported.');\r\n if (size > limits.maxEntrySize) throw new RangeError('Entry exceeds maxEntrySize.');\r\n if (method === 0 && size !== compressedSize) throw new Error('Stored ZIP entry has inconsistent sizes.');\r\n}\r\n\r\nfunction localPayload(metadata, bytes, view, nameBytes, centralOffset, requireRange) {\r\n const { localOffset, flags, method, checksum, compressedSize, size } = metadata;\r\n requireRange(localOffset, 30, centralOffset);\r\n if (view.getUint32(localOffset, true) !== 0x04034b50 || view.getUint16(localOffset + 6, true) !== flags || view.getUint16(localOffset + 8, true) !== method) throw new Error('ZIP local and central headers disagree.');\r\n const localNameSize = view.getUint16(localOffset + 26, true);\r\n const localExtraSize = view.getUint16(localOffset + 28, true);\r\n requireRange(localOffset + 30, localNameSize + localExtraSize, centralOffset);\r\n const localName = bytes.subarray(localOffset + 30, localOffset + 30 + localNameSize);\r\n if (nameBytes.length !== localName.length || !nameBytes.every((byte, position) => byte === localName[position])) throw new Error('ZIP local and central filenames disagree.');\r\n if (!(flags & 8) && (view.getUint32(localOffset + 14, true) !== checksum || view.getUint32(localOffset + 18, true) !== compressedSize || view.getUint32(localOffset + 22, true) !== size)) throw new Error('ZIP local and central sizes or checksums disagree.');\r\n const dataOffset = localOffset + 30 + localNameSize + localExtraSize;\r\n requireRange(dataOffset, compressedSize, centralOffset);\r\n return { payload: bytes.subarray(dataOffset, dataOffset + compressedSize), range: [localOffset, dataOffset + compressedSize] };\r\n}\r\n\r\nfunction entryReader({ method, payload, size, checksum, name }, limits) {\r\n return async ({ maxSize = limits.maxEntrySize, signal } = {}) => {\r\n checkAbort(signal);\r\n if (size > maxSize) throw new RangeError('Entry exceeds the configured size limit.');\r\n const data = method === 0 ? payload : await transformBytes(payload, { decompress: true, maxSize: Math.min(maxSize, size), signal });\r\n if (data.length !== size) throw new Error(`Expanded ZIP entry size does not match: ${name}`);\r\n if (crc32(data) !== checksum) throw new Error(`CRC32 mismatch: ${name}`);\r\n return data;\r\n };\r\n}\r\n\r\nfunction checkRanges(ranges) {\r\n ranges.sort((left, right) => left[0] - right[0]);\r\n for (let index = 1; index < ranges.length; index += 1) if (ranges[index][0] < ranges[index - 1][1]) throw new Error('Overlapping ZIP entries are not supported.');\r\n}\r\n\r\nfunction entryPath(nameBytes, flags, external, size) {\r\n if (!(flags & 0x0800) && nameBytes.some((byte) => byte > 127)) throw new Error('Legacy non-UTF-8 ZIP filenames are not supported.');\r\n const rawName = decoder.decode(nameBytes);\r\n const dir = rawName.endsWith('/') || Boolean(external & 0x10) || ((external >>> 16) & 0xf000) === 0x4000;\r\n const name = safePath(rawName, dir);\r\n if (dir && size !== 0) throw new Error('Directory entries cannot contain file data.');\r\n return { name, dir };\r\n}\r\n\r\nexport async function readArchive(bytes, options = {}) {\r\n const limits = limitsFor(options);\r\n if (bytes.length > limits.maxArchiveSize) throw new RangeError('Archive exceeds maxArchiveSize.');\r\n checkAbort(options.signal);\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n const requireRange = (offset, length, boundary = bytes.length) => {\r\n if (!Number.isSafeInteger(offset) || offset < 0 || length < 0 || offset + length > boundary) throw new Error('Truncated or invalid ZIP structure.');\r\n };\r\n const { endOffset, centralOffset, count } = findDirectory(bytes, view, limits, requireRange);\r\n const entries = [];\r\n const names = new Set();\r\n const ranges = [];\r\n let cursor = centralOffset;\r\n let expanded = 0;\r\n for (let index = 0; index < count; index += 1) {\r\n checkAbort(options.signal);\r\n requireRange(cursor, 46, endOffset);\r\n if (view.getUint32(cursor, true) !== 0x02014b50) throw new Error('Invalid ZIP central directory signature.');\r\n const flags = view.getUint16(cursor + 8, true);\r\n const method = view.getUint16(cursor + 10, true);\r\n const checksum = view.getUint32(cursor + 16, true);\r\n const compressedSize = view.getUint32(cursor + 20, true);\r\n const size = view.getUint32(cursor + 24, true);\r\n const nameSize = view.getUint16(cursor + 28, true);\r\n const extraSize = view.getUint16(cursor + 30, true);\r\n const commentSize = view.getUint16(cursor + 32, true);\r\n const external = view.getUint32(cursor + 38, true);\r\n const localOffset = view.getUint32(cursor + 42, true);\r\n const metadata = { flags, method, checksum, compressedSize, size, localOffset, external, disk: view.getUint16(cursor + 34, true) };\r\n validateEntry(metadata, limits);\r\n expanded += size;\r\n if (expanded > limits.maxTotalSize) throw new RangeError('Archive exceeds maxTotalSize.');\r\n requireRange(cursor + 46, nameSize + extraSize + commentSize, endOffset);\r\n const nameBytes = bytes.subarray(cursor + 46, cursor + 46 + nameSize);\r\n const { name, dir } = entryPath(nameBytes, flags, external, size);\r\n if (names.has(name)) throw new Error(`Duplicate ZIP entry: ${name}`);\r\n names.add(name);\r\n const { payload, range } = localPayload(metadata, bytes, view, nameBytes, centralOffset, requireRange);\r\n ranges.push(range);\r\n const entry = {\r\n name, dir, date: readDate(view.getUint16(cursor + 14, true), view.getUint16(cursor + 12, true)),\r\n comment: decoder.decode(bytes.subarray(cursor + 46 + nameSize + extraSize, cursor + 46 + nameSize + extraSize + commentSize)),\r\n compression: method === 8 ? 'DEFLATE' : 'STORE',\r\n maxSize: limits.maxEntrySize,\r\n read: entryReader({ method, payload, size, checksum, name }, limits),\r\n };\r\n entries.push(entry);\r\n cursor += 46 + nameSize + extraSize + commentSize;\r\n }\r\n if (cursor !== endOffset) throw new Error('ZIP entry count or central directory size does not match.');\r\n checkRanges(ranges);\r\n if (options.checkCRC32) await entries.reduce((pending, entry) => pending.then(() => entry.read({ signal: options.signal })), Promise.resolve());\r\n checkAbort(options.signal);\r\n return { entries, comment: decoder.decode(bytes.subarray(endOffset + 22)) };\r\n}", "import { checkAbort, toBytes } from './binary.js';\r\n\r\nexport function downloadName(name = 'download') {\r\n if (typeof name !== 'string') throw new TypeError('Download filename must be a string.');\r\n const leaf = name.replaceAll('\\\\', '/').split('/').pop();\r\n const cleaned = leaf.replace(/[\\x00-\\x1f\\x7f<>:\"|?*]/g, '_');\r\n let end = cleaned.length;\r\n while (end > 0 && (cleaned[end - 1] === '.' || cleaned[end - 1] === ' ')) end -= 1;\r\n const safe = cleaned.slice(0, end);\r\n if (!safe || safe === '.' || safe === '..') throw new TypeError('Download filename cannot be empty.');\r\n return safe;\r\n}\r\n\r\nfunction needsBom(type) {\r\n const [mediaType, ...parameters] = type.toLowerCase().split(';').map((part) => part.trim());\r\n const text = mediaType.startsWith('text/') || mediaType === 'application/json' || mediaType === 'application/xml' || (mediaType.startsWith('application/') && mediaType.endsWith('+xml'));\r\n return text && parameters.some((parameter) => {\r\n const [name, value] = parameter.split('=').map((part) => part.trim());\r\n return name === 'charset' && value?.replaceAll('\"', '') === 'utf-8';\r\n });\r\n}\r\n\r\nexport async function saveAs(data, filename = 'download', { autoBom = false, mimeType = 'application/octet-stream', signal, revokeAfter = 40000 } = {}) {\r\n if (typeof document === 'undefined' || typeof globalThis.URL?.createObjectURL !== 'function') throw new Error('saveAs requires a browser document and object URL support.');\r\n if (!Number.isFinite(revokeAfter) || revokeAfter < 0 || revokeAfter > 2147483647) throw new RangeError('revokeAfter must be between 0 and 2147483647 milliseconds.');\r\n const name = downloadName(filename);\r\n checkAbort(signal);\r\n let blob;\r\n const resolved = await data;\r\n if (typeof resolved === 'string' || resolved instanceof URL) {\r\n const url = new URL(String(resolved), document.baseURI);\r\n if (!['http:', 'https:', 'blob:'].includes(url.protocol)) throw new TypeError('Download URLs must use HTTP, HTTPS, or blob protocols.');\r\n const response = await fetch(url, { signal });\r\n if (!response.ok) throw new Error(`Download request failed: HTTP ${response.status}`);\r\n blob = await response.blob();\r\n } else {\r\n blob = resolved instanceof Blob ? resolved : new Blob([await toBytes(resolved)], { type: mimeType });\r\n }\r\n checkAbort(signal);\r\n if (autoBom && needsBom(blob.type)) blob = new Blob(['\\ufeff', blob], { type: blob.type });\r\n const url = URL.createObjectURL(blob);\r\n let anchor;\r\n try {\r\n anchor = document.createElement('a');\r\n anchor.href = url;\r\n anchor.download = name;\r\n anchor.rel = 'noopener';\r\n anchor.style.display = 'none';\r\n (document.body ?? document.documentElement).appendChild(anchor);\r\n checkAbort(signal);\r\n anchor.click();\r\n } catch (error) {\r\n URL.revokeObjectURL(url);\r\n throw error;\r\n } finally {\r\n anchor?.remove();\r\n }\r\n setTimeout(() => URL.revokeObjectURL(url), revokeAfter);\r\n}"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["index_exports", "__export", "DEFAULT_LIMITS", "Zip", "ZipEntry", "index_default", "saveAs", "supports", "zipAndSave", "__toCommonJS", "encoder", "decoder", "MAX_UINT32", "crcTable", "_", "value", "checksum", "bit", "crc32", "bytes", "byte", "checkAbort", "signal", "safePath", "name", "directory", "path", "parts", "part", "checkSize", "size", "limit", "decodeBase64", "maxSize", "clean", "padding", "character", "encodeString", "base64", "binary", "code", "toBytes", "input", "binaryString", "chunks", "offset", "output", "type", "mimeType", "joinBytes", "length", "sum", "chunk", "result", "dosDate", "date", "year", "readDate", "time", "supportsRawCompression", "decompress", "Constructor", "transformBytes", "bytes", "maxSize", "signal", "checkAbort", "transformer", "reader", "chunks", "size", "abort", "done", "value", "message", "joinBytes", "error", "DEFAULT_LIMITS", "limitsFor", "options", "limits", "key", "fallback", "value", "record", "length", "signature", "bytes", "view", "textBytes", "text", "label", "encoder", "writeSettings", "entries", "compression", "supportsRawCompression", "compressedPayload", "entry", "data", "settings", "signal", "requested", "compressed", "transformBytes", "prepareEntry", "checkAbort", "filename", "comment", "date", "dosDate", "pendingEntries", "writeArchive", "onUpdate", "chunks", "central", "offset", "centralSize", "expanded", "completed", "payload", "method", "checksum", "crc32", "MAX_UINT32", "local", "directory", "archiveComment", "centralBytes", "joinBytes", "end", "result", "findDirectory", "requireRange", "endOffset", "count", "centralOffset", "validateEntry", "flags", "size", "compressedSize", "localOffset", "external", "disk", "localPayload", "metadata", "nameBytes", "localNameSize", "localExtraSize", "localName", "byte", "position", "dataOffset", "entryReader", "name", "maxSize", "checkRanges", "ranges", "left", "right", "index", "entryPath", "rawName", "decoder", "dir", "safePath", "readArchive", "boundary", "names", "cursor", "nameSize", "extraSize", "commentSize", "range", "readDate", "pending", "downloadName", "name", "cleaned", "end", "safe", "needsBom", "type", "mediaType", "parameters", "part", "parameter", "value", "saveAs", "data", "filename", "autoBom", "mimeType", "signal", "revokeAfter", "checkAbort", "blob", "resolved", "url", "response", "toBytes", "anchor", "error", "supports", "supportsRawCompression", "ZipEntry", "name", "data", "options", "read", "DEFAULT_LIMITS", "maxSize", "signal", "checkAbort", "bytes", "toBytes", "type", "output", "Zip", "_Zip", "value", "parts", "index", "parent", "relativePath", "entry", "safePath", "path", "folder", "key", "callback", "predicate", "entries", "onUpdate", "writeArchive", "limits", "limitsFor", "archive", "readArchive", "item", "filename", "autoBom", "revokeAfter", "generateOptions", "blob", "saveAs", "zipAndSave", "files", "zip", "file", "index_default"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lp-labs/zip-save",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Create, read and download ZIP archives with native compression and no runtime dependencies.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/index.
|
|
6
|
+
"main": "./dist/cjs/index.js",
|
|
7
7
|
"module": "./dist/index.js",
|
|
8
|
+
"browser": "./dist/index.js",
|
|
8
9
|
"types": "./dist/index.d.ts",
|
|
9
10
|
"exports": {
|
|
10
11
|
".": {
|
|
11
12
|
"types": "./dist/index.d.ts",
|
|
12
13
|
"import": "./dist/index.js",
|
|
13
|
-
"require": "./dist/index.
|
|
14
|
+
"require": "./dist/cjs/index.js",
|
|
15
|
+
"default": "./dist/index.js"
|
|
14
16
|
}
|
|
15
17
|
},
|
|
16
18
|
"files": ["dist", "README.md"],
|
|
@@ -19,8 +21,9 @@
|
|
|
19
21
|
"scripts": {
|
|
20
22
|
"build": "node scripts/build.mjs",
|
|
21
23
|
"test": "node --test test/*.test.js",
|
|
24
|
+
"test:package": "node scripts/check-package.mjs",
|
|
22
25
|
"check": "tsc --noEmit",
|
|
23
|
-
"prepack": "npm run check && npm test && npm run build"
|
|
26
|
+
"prepack": "npm run check && npm test && npm run build && npm run test:package"
|
|
24
27
|
},
|
|
25
28
|
"devDependencies": {
|
|
26
29
|
"esbuild": "^0.25.0",
|