@lp-labs/zip-save 0.0.0-stage → 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 +189 -3
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +7 -0
- package/package.json +33 -5
package/README.md
CHANGED
|
@@ -1,3 +1,189 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# @lp-labs/zip-save
|
|
2
|
+
|
|
3
|
+
Create ZIP archives, read their contents, and download files with one lightweight library. Inspired by the workflows of JSZip and FileSaver.js, without depending on either library or any other runtime package.
|
|
4
|
+
|
|
5
|
+
Framework-independent: use it with React, Vue, Angular, plain JavaScript, or Node.js. Includes ESM, CommonJS, and TypeScript declarations. Downloads require a browser; ZIP operations do not require a DOM.
|
|
6
|
+
|
|
7
|
+
The complete minified ESM build is approximately **6.6 KiB gzipped**, with zero runtime dependencies. Source maps and development tools are not part of the application bundle; size may vary between releases.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install @lp-labs/zip-save
|
|
13
|
+
```
|
|
14
|
+
|
|
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
|
+
|
|
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
|
+
|
|
21
|
+
## ZIP And Download
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import { zipAndSave } from '@lp-labs/zip-save';
|
|
25
|
+
|
|
26
|
+
await zipAndSave({
|
|
27
|
+
'hello.txt': 'Hello world!',
|
|
28
|
+
'reports/summary.json': JSON.stringify({ total: 42 }, null, 2),
|
|
29
|
+
}, 'reports.zip');
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
For files selected with an `<input type="file" multiple>`:
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
await zipAndSave(Array.from(fileInput.files), 'selected-files.zip');
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`File.webkitRelativePath` is preserved when a directory picker supplies it. File descriptors are also supported:
|
|
39
|
+
|
|
40
|
+
```js
|
|
41
|
+
await zipAndSave([
|
|
42
|
+
{ name: 'notes.txt', data: 'Some notes' },
|
|
43
|
+
{ name: 'image.png', data: imageBlob, options: { compression: 'STORE' } },
|
|
44
|
+
], 'bundle.zip', {
|
|
45
|
+
onUpdate: ({ percent, currentFile }) => console.log(percent, currentFile),
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Build An Archive
|
|
50
|
+
|
|
51
|
+
```js
|
|
52
|
+
import Zip from '@lp-labs/zip-save';
|
|
53
|
+
|
|
54
|
+
const zip = new Zip();
|
|
55
|
+
zip.comment = 'Monthly export';
|
|
56
|
+
zip.file('hello.txt', 'Hello world!');
|
|
57
|
+
zip.file('bytes.bin', new Uint8Array([0, 128, 255]));
|
|
58
|
+
zip.folder('reports').file('summary.json', JSON.stringify({ total: 42 }));
|
|
59
|
+
zip.folder('empty-directory');
|
|
60
|
+
|
|
61
|
+
await zip.saveAs('export.zip');
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Alternatively, generate an archive without downloading:
|
|
65
|
+
|
|
66
|
+
```js
|
|
67
|
+
const blob = await zip.generateAsync({ type: 'blob' });
|
|
68
|
+
const bytes = await zip.generateAsync({ type: 'uint8array', compression: 'STORE' });
|
|
69
|
+
const base64 = await zip.generateAsync({ type: 'base64' });
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Inputs accept strings, Blobs/Files, ArrayBuffers, typed-array views, and promises of those values. Strings are UTF-8 by default; set `{ base64: true }` for padded base64 or `{ binary: true }` for byte-valued strings.
|
|
73
|
+
|
|
74
|
+
### Files And Folders
|
|
75
|
+
|
|
76
|
+
| API | Behavior |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| `zip.file(name, data, options?)` | Add or replace an entry; returns the current ZIP/folder view |
|
|
79
|
+
| `zip.file(name)` | Get a file entry, or `null` |
|
|
80
|
+
| `zip.file(regexp)` | Get matching files using paths relative to the current view |
|
|
81
|
+
| `zip.folder(name)` | Create a directory and return a shared folder view |
|
|
82
|
+
| `zip.remove(name)` | Remove a file or a directory and its descendants |
|
|
83
|
+
| `zip.forEach((path, entry) => ...)` | Visit entries using paths relative to the current view |
|
|
84
|
+
| `zip.filter((path, entry) => ...)` | Return matching entries |
|
|
85
|
+
| `zip.files` | Snapshot of entries keyed by full archive paths |
|
|
86
|
+
| `zip.comment` | Archive comment |
|
|
87
|
+
|
|
88
|
+
`file` options: `date`, `comment`, `compression`, `base64`, `binary`, `dir`, and `createFolders` (default `true`). Folder views share the same archive; generating a folder view produces an archive with paths relative to that folder. Empty directories are retained. Entry dates use ZIP's local-time DOS format, with two-second precision and years clamped to 1980-2107.
|
|
89
|
+
|
|
90
|
+
## Read An Archive
|
|
91
|
+
|
|
92
|
+
```js
|
|
93
|
+
import Zip from '@lp-labs/zip-save';
|
|
94
|
+
|
|
95
|
+
const zip = await Zip.loadAsync(zipFile, { checkCRC32: true });
|
|
96
|
+
const entry = zip.file('hello.txt');
|
|
97
|
+
if (entry) {
|
|
98
|
+
const text = await entry.async('text');
|
|
99
|
+
console.log(text);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
zip.forEach((path, entry) => console.log(path, entry.dir));
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
`Zip.loadAsync(data, options?)` creates an archive. `existingZip.loadAsync(...)` merges validated entries into an existing archive, replacing entries with the same names. Loading is atomic: structural validation failures do not partially modify the destination.
|
|
106
|
+
|
|
107
|
+
`entry.async(type?, options?)` defaults to `uint8array`; options include `signal`, `maxSize` in bytes, and `mimeType` for Blob output. CRC32 and actual expanded size are checked whenever an imported entry is read. Set `checkCRC32: true` when loading to validate every entry immediately; otherwise decompression is lazy. Entry properties include `name`, `dir`, `date`, `comment`, and `compression`.
|
|
108
|
+
|
|
109
|
+
### Outputs
|
|
110
|
+
|
|
111
|
+
Archive generation supports `blob` (default), `uint8array`, `arraybuffer`, `base64`, `binarystring`, and `nodebuffer`. Entry reads additionally support UTF-8 `text` and `string`. Node buffer output is a real Buffer at runtime and typed as `Uint8Array` to avoid requiring Node types in browser projects.
|
|
112
|
+
|
|
113
|
+
## Save Individual Files
|
|
114
|
+
|
|
115
|
+
```js
|
|
116
|
+
import { saveAs } from '@lp-labs/zip-save';
|
|
117
|
+
|
|
118
|
+
await saveAs(new Blob(['Hello!'], { type: 'text/plain;charset=utf-8' }), 'hello.txt');
|
|
119
|
+
await saveAs(new Uint8Array([1, 2, 3]), 'bytes.bin');
|
|
120
|
+
await saveAs('/exports/report.pdf', 'report.pdf');
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
String and URL inputs to `saveAs` are **URLs**, not file contents. Wrap text in a Blob to download it. URL downloads use `fetch`, require a successful HTTP response, and require CORS permission for cross-origin resources. HTTP, HTTPS, and blob URLs are accepted; fetch uses the browser's default same-origin credential behavior. Use `saveAs(await response.blob(), filename)` yourself for custom authentication or headers.
|
|
124
|
+
|
|
125
|
+
`saveAs(data, filename?, options?)` options:
|
|
126
|
+
|
|
127
|
+
| Option | Default | Behavior |
|
|
128
|
+
| --- | --- | --- |
|
|
129
|
+
| `autoBom` | `false` | Prepend a UTF-8 BOM to explicitly UTF-8 text/XML/JSON Blobs |
|
|
130
|
+
| `mimeType` | `application/octet-stream` | MIME type for raw byte input; existing Blobs retain their type |
|
|
131
|
+
| `signal` | none | Abort fetching or preparation before download dispatch |
|
|
132
|
+
| `revokeAfter` | `40000` | Milliseconds before releasing the temporary object URL |
|
|
133
|
+
|
|
134
|
+
The filename is reduced to its leaf name and invalid/control characters are replaced. The helper removes its temporary anchor immediately and revokes its object URL later. Its promise resolves when the browser download is **dispatched**, not when writing to disk finishes. It cannot confirm download completion, choose a filesystem path, or cancel a download already dispatched.
|
|
135
|
+
|
|
136
|
+
Initiate downloads from user actions such as a button click. Browser policies, sandboxed frames, multiple-download limits, and mobile Safari may restrict asynchronous downloads or open a preview instead. For browsers that require immediate user activation, generate the Blob first and offer a separate download button. This package does not promise to bypass browser restrictions or provide legacy IE support.
|
|
137
|
+
|
|
138
|
+
## Compression And Progress
|
|
139
|
+
|
|
140
|
+
`generateAsync(options?, onUpdate?)` and `zip.saveAs(filename?, options?)` support:
|
|
141
|
+
|
|
142
|
+
| Option | Default | Behavior |
|
|
143
|
+
| --- | --- | --- |
|
|
144
|
+
| `compression` | `DEFLATE` | Native raw DEFLATE when available; `STORE` writes uncompressed data |
|
|
145
|
+
| `compressionFallback` | `STORE` | Use STORE without native compression; set `error` to require compression |
|
|
146
|
+
| `comment` | `zip.comment` | Archive comment |
|
|
147
|
+
| `mimeType` | `application/zip` | Blob output MIME type |
|
|
148
|
+
| `signal` | none | Abort native streams and stop between entries/input conversion stages |
|
|
149
|
+
|
|
150
|
+
Each file can override `compression`. Even when DEFLATE is requested, empty entries and data that would grow after compression use STORE. The platform selects compression settings; custom compression levels are not supported.
|
|
151
|
+
|
|
152
|
+
`onUpdate({ percent, currentFile })` reports entry-based progress, not byte-level progress. Pass it as the second argument to `generateAsync`, or in the options for `saveAs`/`zipAndSave`. `zipAndSave` returns the constructed Zip after dispatching the download.
|
|
153
|
+
|
|
154
|
+
```js
|
|
155
|
+
import { supports } from '@lp-labs/zip-save';
|
|
156
|
+
|
|
157
|
+
console.log(supports.compression, supports.decompression, supports.download);
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Reading DEFLATE requires native `DecompressionStream('deflate-raw')`. Without it, STORE archives can still be read, but reading a DEFLATE entry throws. Native support for `deflate` or `gzip` alone is not sufficient. No custom DEFLATE implementation is bundled.
|
|
161
|
+
|
|
162
|
+
## Limits And Compatibility
|
|
163
|
+
|
|
164
|
+
The package implements standard single-disk ZIP records with UTF-8/ASCII filenames, STORE and DEFLATE, comments, directories, and central-directory sizes, including ordinary data-descriptor archives. It is a focused alternative, **not a drop-in replacement** for every JSZip or FileSaver.js API.
|
|
165
|
+
|
|
166
|
+
Not supported: ZIP64, encryption/passwords, split archives, symbolic links, legacy non-UTF-8 filename encodings, other compression algorithms, filesystem extraction, streaming archive output, and automatic file-picker dialogs. ZIP extra fields and filesystem permissions are not preserved when regenerating archives. Entry names and comments are UTF-8; comments with invalid UTF-8 are rejected.
|
|
167
|
+
|
|
168
|
+
Unsafe paths (absolute paths, control characters, or traversal segments), duplicate normalized names, overlapping entries, inconsistent headers, and malformed structures are rejected. CRC32 detects corruption; it does not authenticate archives.
|
|
169
|
+
|
|
170
|
+
Default byte limits apply to both reading and generation:
|
|
171
|
+
|
|
172
|
+
| Option | Default |
|
|
173
|
+
| --- | --- |
|
|
174
|
+
| `maxArchiveSize` | 256 MiB |
|
|
175
|
+
| `maxEntrySize` | 128 MiB |
|
|
176
|
+
| `maxTotalSize` | 256 MiB uncompressed |
|
|
177
|
+
| `maxEntries` | 10,000 |
|
|
178
|
+
|
|
179
|
+
Override limits in `loadAsync`, `generateAsync`, or ZIP download options. Only nonnegative safe integers are accepted. Expanded data is bounded during decompression and checked against declared size. Entry reads inherit the loaded archive's per-entry bound unless overridden explicitly.
|
|
180
|
+
|
|
181
|
+
The implementation works in memory and can hold several copies of data during generation. These limits are not guarantees of peak memory usage. Archives must stay below ZIP32's 4 GiB field limits and 65,535 entries; use a different tool for very large archives. Cancellation cannot interrupt a synchronous conversion/CRC calculation or force an unresolved input promise to settle. Process large or untrusted archives in a worker and choose conservative limits appropriate to your application.
|
|
182
|
+
|
|
183
|
+
## Support
|
|
184
|
+
|
|
185
|
+
Support maintenance with a [donation via PayPal](https://www.paypal.me/LibinPrasanth).
|
|
186
|
+
|
|
187
|
+
## Author
|
|
188
|
+
|
|
189
|
+
Created by [Libin Prasanth](https://www.linkedin.com/in/libinprasanth/).
|
|
@@ -0,0 +1,2 @@
|
|
|
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.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/index.js", "../../src/binary.js", "../../src/compression.js", "../../src/archive.js", "../../src/save.js"],
|
|
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
|
+
"mappings": "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",
|
|
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"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export type BinaryInput = string | Blob | ArrayBuffer | ArrayBufferView;
|
|
2
|
+
export type DataInput = BinaryInput | PromiseLike<BinaryInput>;
|
|
3
|
+
export type Compression = 'STORE' | 'DEFLATE';
|
|
4
|
+
export interface OutputMap {
|
|
5
|
+
blob: Blob;
|
|
6
|
+
uint8array: Uint8Array;
|
|
7
|
+
arraybuffer: ArrayBuffer;
|
|
8
|
+
base64: string;
|
|
9
|
+
binarystring: string;
|
|
10
|
+
nodebuffer: Uint8Array;
|
|
11
|
+
text: string;
|
|
12
|
+
string: string;
|
|
13
|
+
}
|
|
14
|
+
export type ArchiveOutput = Exclude<keyof OutputMap, 'text' | 'string'>;
|
|
15
|
+
export interface Limits {
|
|
16
|
+
maxArchiveSize?: number;
|
|
17
|
+
maxEntrySize?: number;
|
|
18
|
+
maxTotalSize?: number;
|
|
19
|
+
maxEntries?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface FileOptions {
|
|
22
|
+
dir?: boolean;
|
|
23
|
+
date?: Date;
|
|
24
|
+
comment?: string;
|
|
25
|
+
compression?: Compression;
|
|
26
|
+
base64?: boolean;
|
|
27
|
+
binary?: boolean;
|
|
28
|
+
createFolders?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface EntryReadOptions {
|
|
31
|
+
signal?: AbortSignal;
|
|
32
|
+
maxSize?: number;
|
|
33
|
+
mimeType?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface Progress {
|
|
36
|
+
percent: number;
|
|
37
|
+
currentFile: string | null;
|
|
38
|
+
}
|
|
39
|
+
export interface GenerateOptions<T extends ArchiveOutput = 'blob'> extends Limits {
|
|
40
|
+
type?: T;
|
|
41
|
+
compression?: Compression;
|
|
42
|
+
compressionFallback?: 'STORE' | 'error';
|
|
43
|
+
comment?: string;
|
|
44
|
+
mimeType?: string;
|
|
45
|
+
signal?: AbortSignal;
|
|
46
|
+
}
|
|
47
|
+
export interface LoadOptions extends Limits {
|
|
48
|
+
base64?: boolean;
|
|
49
|
+
binary?: boolean;
|
|
50
|
+
checkCRC32?: boolean;
|
|
51
|
+
signal?: AbortSignal;
|
|
52
|
+
}
|
|
53
|
+
export interface SaveOptions {
|
|
54
|
+
autoBom?: boolean;
|
|
55
|
+
mimeType?: string;
|
|
56
|
+
signal?: AbortSignal;
|
|
57
|
+
revokeAfter?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface ZipSaveOptions extends Omit<GenerateOptions, 'type'>, SaveOptions {
|
|
60
|
+
onUpdate?: (progress: Progress) => void;
|
|
61
|
+
}
|
|
62
|
+
export class ZipEntry {
|
|
63
|
+
constructor(name: string, data: DataInput, options?: FileOptions);
|
|
64
|
+
readonly name: string;
|
|
65
|
+
readonly dir: boolean;
|
|
66
|
+
date: Date;
|
|
67
|
+
comment: string;
|
|
68
|
+
compression?: Compression;
|
|
69
|
+
async<T extends keyof OutputMap = 'uint8array'>(type?: T, options?: EntryReadOptions): Promise<OutputMap[T]>;
|
|
70
|
+
}
|
|
71
|
+
export class Zip {
|
|
72
|
+
constructor();
|
|
73
|
+
comment: string;
|
|
74
|
+
readonly files: Readonly<Record<string, ZipEntry>>;
|
|
75
|
+
file(name: string): ZipEntry | null;
|
|
76
|
+
file(pattern: RegExp): ZipEntry[];
|
|
77
|
+
file(name: string, data: DataInput, options?: FileOptions): this;
|
|
78
|
+
folder(name: string): Zip;
|
|
79
|
+
remove(name: string): this;
|
|
80
|
+
forEach(callback: (relativePath: string, entry: ZipEntry) => void): void;
|
|
81
|
+
filter(predicate: (relativePath: string, entry: ZipEntry) => boolean): ZipEntry[];
|
|
82
|
+
generateAsync<T extends ArchiveOutput = 'blob'>(options?: GenerateOptions<T>, onUpdate?: (progress: Progress) => void): Promise<OutputMap[T]>;
|
|
83
|
+
loadAsync(data: DataInput, options?: LoadOptions): Promise<this>;
|
|
84
|
+
static loadAsync(data: DataInput, options?: LoadOptions): Promise<Zip>;
|
|
85
|
+
saveAs(filename?: string, options?: ZipSaveOptions): Promise<void>;
|
|
86
|
+
}
|
|
87
|
+
export type DownloadData = Blob | ArrayBuffer | ArrayBufferView | string | URL;
|
|
88
|
+
export function saveAs(data: DownloadData | PromiseLike<DownloadData>, filename?: string, options?: SaveOptions): Promise<void>;
|
|
89
|
+
export interface FileDescriptor {
|
|
90
|
+
name: string;
|
|
91
|
+
data: DataInput;
|
|
92
|
+
options?: FileOptions;
|
|
93
|
+
}
|
|
94
|
+
export function zipAndSave(files: readonly (File | FileDescriptor)[] | Record<string, DataInput>, filename?: string, options?: ZipSaveOptions): Promise<Zip>;
|
|
95
|
+
export const supports: Readonly<{ compression: boolean; decompression: boolean; download: boolean }>;
|
|
96
|
+
export const DEFAULT_LIMITS: Readonly<Required<Limits>>;
|
|
97
|
+
export default Zip;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var Z=new TextEncoder,P=new TextDecoder("utf-8",{fatal:!0}),x=4294967295,te=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 j(n){let e=x;for(let t of n)e=te[(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 R(n,e){if(n>e)throw new RangeError("Input exceeds the configured size limit.")}function re(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 R(t.length/4*3-r,e),Uint8Array.from(atob(t),o=>o.codePointAt(0))}function ne(n,{base64:e,binary:t,maxSize:r}){return e?re(n,r):(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}):Z.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=ne(o,{base64:e,binary:t,maxSize:r});else if(o instanceof ArrayBuffer)R(o.byteLength,r),s=new Uint8Array(o).slice();else if(ArrayBuffer.isView(o))R(o.byteLength,r),s=new Uint8Array(o.buffer,o.byteOffset,o.byteLength).slice();else if(typeof Blob<"u"&&o instanceof Blob)R(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 R(s.length,r),s}function q(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 C(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 q(n);case"base64":return btoa(q(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 V(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 X(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 N(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 O(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 M(n,e){let t=new Uint8Array(n),r=new DataView(t.buffer);return r.setUint32(0,e,!0),{bytes:t,view:r}}function W(n,e){let t=Z.encode(n??"");if(t.length>65535)throw new RangeError(`${e} exceeds the ZIP UTF-8 length limit.`);return t}function oe(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 ie(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 N(e,{signal:o,maxSize:r.maxArchiveSize});return i.length<e.length?{payload:i,method:8}:{payload:e,method:0}}async function se(n,e,t,r){u(r);let o=W(n.name,"Filename"),s=W(n.comment,"Entry comment"),i=V(n.date),a=n.dir?new Uint8Array:await n._bytes({maxSize:t.maxEntrySize,signal:r});u(r);let l=await ie(n,a,e,t,r);return{entry:n,filename:o,comment:s,date:i,data:a,...l}}async function*ae(n,e,t,r){for(let o of n)yield se(o,e,t,r)}async function G(n,e={},t=void 0){let r=O(e),o=oe(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:S}of ae(n,o,r,e.signal)){if(p+=E.length,p>r.maxTotalSize)throw new RangeError("Uncompressed entries exceed maxTotalSize.");let z=j(E);if(E.length>=x||U.length>=x)throw new RangeError("ZIP64 entries are not supported.");let g=M(30,67324752);g.view.setUint16(4,20,!0),g.view.setUint16(6,2048,!0),g.view.setUint16(8,S,!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=M(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,S,!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=W(e.comment,"Archive comment"),m=D(i),h=M(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 ce(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 le({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 fe(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 ue({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 N(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(j(l)!==r)throw new Error(`CRC32 mismatch: ${o}`);return l}}function he(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 de(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 Y(n,e={}){let t=O(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}=ce(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),S=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(le(d,t),m+=T,m>t.maxTotalSize)throw new RangeError("Archive exceeds maxTotalSize.");o(c+46,E+U+S,s);let H=n.subarray(c+46,c+46+E),{name:I,dir:J}=de(H,y,z,T);if(p.has(I))throw new Error(`Duplicate ZIP entry: ${I}`);p.add(I);let{payload:K,range:Q}=fe(d,n,r,H,i,o);f.push(Q);let ee={name:I,dir:J,date:X(r.getUint16(c+14,!0),r.getUint16(c+12,!0)),comment:P.decode(n.subarray(c+46+E+U,c+46+E+U+S)),compression:w===8?"DEFLATE":"STORE",maxSize:t.maxEntrySize,read:ue({method:w,payload:K,size:T,checksum:b,name:I},t)};l.push(ee),c+=46+E+U+S}if(c!==s)throw new Error("ZIP entry count or central directory size does not match.");return he(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 me(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 pe(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 $(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=me(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&&pe(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 _e=Object.freeze({get compression(){return k()},get decompression(){return k(!0)},get download(){return typeof document<"u"&&typeof globalThis.URL?.createObjectURL=="function"}}),_=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 C(r,e,t.mimeType)}},B=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 _(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 _(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 _(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 G(o,{...e,comment:e.comment??this.comment},t);return C(s,r,e.mimeType??"application/zip")}async loadAsync(e,t={}){let r=O(t);u(t.signal);let o=await L(e,{base64:t.base64,binary:t.binary,maxSize:r.maxArchiveSize}),s=await Y(o,t);for(let i of s.entries){let a=this._prefix+i.name;this._state.entries.set(a,new _(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 $(a,e,{autoBom:o,revokeAfter:s,signal:t.signal})}};async function ze(n,e="archive.zip",t={}){let r=new B;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 Ie=B;export{F as DEFAULT_LIMITS,B as Zip,_ as ZipEntry,Ie as default,$ as saveAs,_e as supports,ze as zipAndSave};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/binary.js", "../src/compression.js", "../src/archive.js", "../src/save.js", "../src/index.js"],
|
|
4
|
+
"sourcesContent": ["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}", "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;"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["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"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,34 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@lp-labs/zip-save",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
1
|
+
{
|
|
2
|
+
"name": "@lp-labs/zip-save",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Create, read and download ZIP archives with native compression and no runtime dependencies.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/cjs/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"browser": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/cjs/index.js",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": ["dist", "README.md"],
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" },
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "node scripts/build.mjs",
|
|
23
|
+
"test": "node --test test/*.test.js",
|
|
24
|
+
"test:package": "node scripts/check-package.mjs",
|
|
25
|
+
"check": "tsc --noEmit",
|
|
26
|
+
"prepack": "npm run check && npm test && npm run build && npm run test:package"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"esbuild": "^0.25.0",
|
|
30
|
+
"typescript": "^5.7.0"
|
|
31
|
+
},
|
|
32
|
+
"engines": { "node": ">=18" },
|
|
33
|
+
"keywords": ["zip", "archive", "download", "file-saver", "compression", "browser"]
|
|
6
34
|
}
|