npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ts-unzip-stream

v0.3.9

Published

Process zip files using streaming API

Downloads

2

Readme

ts-unzip-stream

Streaming cross-platform unzip tool written in node.js.

This package is based on unzip-stream. Some of PRs opened in the original repo have been merged into this one. Also project was updated and converted to TypeScript.

Contributing

Any contributions are welcomed.

Project uses commitlint. This is necessary to determine the package version bump.

Rules for branch names:

  • fix/ISSUE-1_<short_description>
  • feat/ISSUE-1_<short_description>
  • chore/ISSUE-1_<short_description>

Rules for commit messages:

  • fix(ISSUE-1): <short_description>
  • feat(ISSUE-1): <short_description>
  • chore(ISSUE-1): <short_description>

Brief history

This package is based on unzip (and its fork unzipper) and provides simple APIs for parsing and extracting zip files. It uses new streaming engine which allows it to process also files which would fail with unzip. There are no added compiled dependencies - inflation is handled by node.js's built in zlib support.

Please note that the zip file format isn't really meant to be processed by streaming, though this library should succeed in most cases, if you do have complete zip file available, you should consider using other libraries which read zip files from the end - as originally intended (for example yauzl or decompress-zip).

Installation

> npm install ts-unzip-stream

Quick Examples

Parse zip file contents

Process each zip file entry or pipe entries to another stream.

Important: If you do not intend to consume an entry stream's raw data, call autodrain() to dispose of the entry's contents. Otherwise the stream will get stuck.

import fs from 'fs';
import { Parse } from 'ts-unzip-stream';

fs.createReadStream('path/to/archive.zip')
  .pipe(new Parse())
  .on('entry', (entry) => {
    const { path: filePath, type, size } = entry;
    if (filePath === `this IS the file I'm looking for`) {
      entry.pipe(fs.createWriteStream('output/path'));
    } else {
      entry.autodrain();
    }
  });

Parse zip by piping entries downstream

If you pipe from unzip-stream the downstream components will receive each entry for further processing. This allows for clean pipelines transforming zipfiles into unzipped data.

Example using stream.Transform:

import fs from 'fs';
import stream from 'stream';
import unzip from 'ts-unzip-stream';

fs.createReadStream('path/to/archive.zip')
  .pipe(new unzip.Parse())
  .pipe(stream.Transform({
    objectMode: true,
    transform: (entry, e, cb) => {
      const { path: filePath, type, size } = entry;

      if (filePath === `this IS the file I'm looking for`) {
        entry.pipe(fs.createWriteStream('output/path'))
          .on('finish', cb);
      } else {
        entry.autodrain();
        cb();
      }
    }
  });

Extract to a directory

import fs from 'fs';
import { Extract } from 'ts-unzip-stream';

fs.createReadStream('path/to/archive.zip').pipe(
  new Extract({ path: 'output/path' })
);

Extract will emit the close event when the archive is fully extracted, do NOT use the finish event, which can be emitted before the writing finishes.

Extra options

The Parse and Extract methods allow passing an object with decodeString property which will be used to decode non-utf8 file names in the archive. If not specified a fallback will be used.

Example with iconv-lite:

import { Parse } from 'ts-unzip-stream';
import iconvLite from 'iconv-lite';

let parser = new Parse({
  decodeString: (buffer) => {
    return iconvLite.decode(buffer, 'iso-8859-2');
  }
});
input.pipe(parser).pipe(...);

What's missing?

Currently ZIP files up to version 4.5 are supported (which includes Zip64 support - archives with 4GB+ files). There's no support for encrypted (password protected) zips, or symlinks.