# pizzip

> Create, read and edit .zip files synchronously with Javascript

Latest version **3.3.0** (published 2026-09-21) · (MIT OR GPL-3.0) license · 0 weekly downloads

## Install

```sh
npm install pizzip
pnpm add pizzip
yarn add pizzip
bun add pizzip
```

## Health

**Score 65/100 (B)** — status: active.

Positive: has types; no vulnerabilities; recently updated; high maintenance score; high quality score.

Warnings: low downloads; no esm support.

## Facts

| | |
|---|---|
| Version | 3.3.0 |
| Published | 2026-09-21 |
| First published | 2019-06-14 |
| Weekly downloads | 0 |
| License | (MIT OR GPL-3.0) |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 1 |
| Unpacked size | 813.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 65 |
| Author | Edgar Hipp |
| Maintainers | edi9999 |
| Keywords | zip, deflate, inflate |

## Links

- npm: https://www.npmjs.com/package/pizzip
- Repository: https://github.com/open-xml-templating/pizzip
- Homepage: https://github.com/open-xml-templating/pizzip#readme
- Issues: https://github.com/open-xml-templating/pizzip/issues
- npm.io page: https://npm.io/package/pizzip

## Dependencies (1)

- [pako](https://npm.io/package/pako.md) ^2.1.0

## Alternatives

- [lodash.startswith](https://npm.io/package/lodash.startswith.md) — 769.7K weekly downloads
- [@tarojs/service](https://npm.io/package/@tarojs/service.md) — 33.9K weekly downloads
- [io.extendreality.tilia.indicators.spatialtargets.unity](https://npm.io/package/io.extendreality.tilia.indicators.spatialtargets.unity.md) — 131 weekly downloads
- [@rtarojs/taro](https://npm.io/package/@rtarojs/taro.md) — 90 weekly downloads
- [node-branch-io](https://npm.io/package/node-branch-io.md) — 50 weekly downloads

## Recent versions

- 3.3.0 (latest) — 2026-09-21
- 3.2.0 — 2025-05-12
- 3.1.8 — 2025-01-24
- 3.1.7 — 2024-04-08
- 3.1.6 — 2024-01-23
- 3.1.5 — 2024-01-19
- 3.1.4 — 2022-12-12
- 3.1.3 — 2022-09-20
- 3.1.2 — 2022-09-19
- 3.1.1 — 2021-08-06
- 3.1.0 — 2021-08-05
- 3.0.6 — 2019-08-07
- 3.0.5 — 2019-07-24
- 3.0.4 — 2019-07-19
- 3.0.3 — 2019-07-17
- … 3 more at https://npm.io/package/pizzip/versions

## README

# PizZip

PizZip is a fork of JSZip version 2.x, because we want a synchronous Zip library.

A library for creating, reading and editing .zip files with Javascript, with a lovely and simple API.

```javascript
var zip = new PizZip();

zip.file("Hello.txt", "Hello World\n");

var img = zip.folder("images");
img.file("smile.gif", imgData, { base64: true });

var content = zip.generate({ type: "blob" });

// see FileSaver.js
saveAs(content, "example.zip");

/*
Results in a zip containing
Hello.txt
images/
    smile.gif
*/
```

## Node.js streaming output

Use `generateNodeStream()` to write an archive without allocating the final output buffer:

```javascript
const { pipeline } = require("node:stream/promises");
const { createWriteStream } = require("node:fs");
const PizZip = require("pizzip");

const zip = new PizZip();
zip.file("Hello.txt", "Hello World\n");

await pipeline(
  zip.generateNodeStream({ compression: "DEFLATE" }),
  createWriteStream("example.zip")
);
```

Streaming output supports classic ZIP archives; sizes, offsets, and entry counts that require ZIP64 are rejected.

`generateNodeStream()`, `loadFile()`, and filesystem storage are Node.js-only. The browser build (`dist/pizzip.js`) keeps the in-memory `load()` / `generate()` API.

For disk-backed input, use `new PizZip().loadFile(path)`. To store added or loaded entries on disk, use `new PizZip(undefined, { storage: { type: "filesystem" } })`. Call `dispose()` after all reads and output streams have finished to release file readers and temporary storage.

### Large images and disk-backed archives

`loadFile()` keeps entry contents in the source file. `generateNodeStream()` reads disk-backed entries in chunks, including when changing compression methods. Checksums and compression are processed incrementally, so a large image does not have to be read back into memory in full.

```javascript
const zip = new PizZip(undefined, {
  storage: { type: "filesystem" },
  chunkSize: 1024 * 1024, // Default: 1 MiB.
});

try {
  zip.loadFile("input.docx", { checkCRC32: true });
  await pipeline(
    zip.generateNodeStream({ compression: "DEFLATE" }),
    createWriteStream("output.docx")
  );
} finally {
  zip.dispose();
}
```

`chunkSize` controls file-data reads, compression chunks, and maximum output write size. It must be an integer from 64 to 2,147,483,647 bytes. The constructor setting applies to disk checksum checks and streaming generation; `loadFile()` and `generateNodeStream()` can override it for that operation. Output `highWaterMark` defaults to the chosen chunk size and can be set separately.

This is a chunk-size setting, not a total memory limit: several pipeline buffers, compression state, and entry metadata also occupy memory. Keep the source file available and unchanged until generation finishes. Supplying a ZIP or image as a buffer already uses memory; synchronous `generate()` and extraction helpers such as `asNodeBuffer()` still return complete in-memory results. Use `loadFile()` and pipe `generateNodeStream()` directly to a file or network destination for bounded file-data buffering.

## License

PizZip is dual-licensed. You may use it under the MIT license _or_ the GPLv3 license. See [LICENSE.markdown](LICENSE.markdown).

---
_Source: https://npm.io/package/pizzip · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
