# Introduction zip.js is a JavaScript open-source library (BSD-3-Clause license) for compressing and decompressing zip files. It has been designed to handle large amounts of data. It supports notably multi-core compression, native compression with compression streams, archives larger than 4GB with Zip64, split zip files, data encryption, and Deflate64 decompression. # Demo See https://gildas-lormeau.github.io/zip-manager # Documentation See here for more info: https://gildas-lormeau.github.io/zip.js/ # Examples ## Hello world ```js import { BlobReader, BlobWriter, TextReader, TextWriter, ZipReader, ZipWriter } from "@zip-js/zip-js"; // Prefix "@zip-js/zip-js" with "jsr:" for Deno // ---- // Write the zip file // ---- // Creates a BlobWriter object where the zip content will be written. const zipFileWriter = new BlobWriter(); // Creates a TextReader object storing the text of the entry to add in the zip // (i.e. "Hello world!"). const helloWorldReader = new TextReader("Hello world!"); // Creates a ZipWriter object writing data via `zipFileWriter`, adds the entry // "hello.txt" containing the text "Hello world!" via `helloWorldReader`, and // closes the writer. const zipWriter = new ZipWriter(zipFileWriter); await zipWriter.add("hello.txt", helloWorldReader); await zipWriter.close(); // Retrieves the Blob object containing the zip content into `zipFileBlob`. It // is also returned by zipWriter.close() for more convenience. const zipFileBlob = await zipFileWriter.getData(); // ---- // Read the zip file // ---- // Creates a BlobReader object used to read `zipFileBlob`. const zipFileReader = new BlobReader(zipFileBlob); // Creates a TextWriter object where the content of the first entry in the zip // will be written. const helloWorldWriter = new TextWriter(); // Creates a ZipReader object reading the zip content via `zipFileReader`, // retrieves metadata (name, dates, etc.) of the first entry, retrieves its // content via `helloWorldWriter`, and closes the reader. const zipReader = new ZipReader(zipFileReader); const firstEntry = (await zipReader.getEntries()).shift(); const helloWorldText = await firstEntry.getData(helloWorldWriter); await zipReader.close(); // Displays "Hello world!". console.log(helloWorldText); ``` Run the code on JSFiddle: https://jsfiddle.net/tm9fhvab/ ## Hello world with Streams ```js import { BlobReader, ZipReader, ZipWriter } from "@zip-js/zip-js"; // Prefix "@zip-js/zip-js" with "jsr:" for Deno // ---- // Write the zip file // ---- // Creates a TransformStream object, the zip content will be written in the // `writable` property. const zipFileStream = new TransformStream(); // Creates a Promise object resolved to the zip content returned as a Blob // object retrieved from `zipFileStream.readable`. const zipFileBlobPromise = new Response(zipFileStream.readable).blob(); // Creates a ReadableStream object storing the text of the entry to add in the // zip (i.e. "Hello world!"). const helloWorldReadable = new Blob(["Hello world!"]).stream(); // Creates a ZipWriter object writing data into `zipFileStream.writable`, adds // the entry "hello.txt" containing the text "Hello world!" retrieved from // `helloWorldReadable`, and closes the writer. const zipWriter = new ZipWriter(zipFileStream.writable); await zipWriter.add("hello.txt", helloWorldReadable); await zipWriter.close(); // Retrieves the Blob object containing the zip content into `zipFileBlob`. const zipFileBlob = await zipFileBlobPromise; // ---- // Read the zip file // ---- // Creates a BlobReader object used to read `zipFileBlob`. const zipFileReader = new BlobReader(zipFileBlob); // Creates a TransformStream object, the content of the first entry in the zip // will be written in the `writable` property. const helloWorldStream = new TransformStream(); // Creates a Promise object resolved to the content of the first entry returned // as text from `helloWorldStream.readable`. const helloWorldTextPromise = new Response(helloWorldStream.readable).text(); // Creates a ZipReader object reading the zip content via `zipFileReader`, // retrieves metadata (name, dates, etc.) of the first entry, retrieves its // content into `helloWorldStream.writable`, and closes the reader. const zipReader = new ZipReader(zipFileReader); const firstEntry = (await zipReader.getEntries()).shift(); await firstEntry.getData(helloWorldStream.writable); await zipReader.close(); // Displays "Hello world!". const helloWorldText = await helloWorldTextPromise; console.log(helloWorldText); ``` Run the code on JSFiddle: https://jsfiddle.net/aw3d6f4o/ ## Adding concurrently multiple entries in a zip file ```js import { BlobWriter, HttpReader, TextReader, ZipWriter, } from "@zip-js/zip-js"; // Prefix "@zip-js/zip-js" with "jsr:" for Deno const README_URL = "https://unpkg.com/@zip.js/zip.js/README.md"; getZipFileBlob() .then(downloadFile); async function getZipFileBlob() { const zipWriter = new ZipWriter(new BlobWriter("application/zip")); await Promise.all([ zipWriter.add("hello.txt", new TextReader("Hello world!")), zipWriter.add("README.md", new HttpReader(README_URL)), ]); return zipWriter.close(); } function downloadFile(blob) { document.body.appendChild(Object.assign(document.createElement("a"), { download: "hello.zip", href: URL.createObjectURL(blob), textContent: "Download zip file", })); } ``` Run the code on Plunker: https://plnkr.co/edit/4sVljNIpqSUE9HCA?preview ## Tests See https://github.com/gildas-lormeau/zip.js/tree/master/tests/all