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

zip-saver

v0.1.1

Published

<h1 align="center"> Easy way to merge multiple files into one zip file in <code>javascript</code> </h1>

Downloads

128

Readme

NPM version ![Downloads per month]


online demo example

install

npm install zip-saver
# or
yarn add zip-saver
# or
pnpm add zip-saver

usage

  import { createZip, createZipStream } from 'zip-saver'


  // generate zip file directly
  const handleFileChange = async (event: Event) => {
    const files = (event.target as HTMLInputElement).files
    if (!files) return

    const fileList = Array.from(files)

    const zipBlob = await createZip(fileList)

    const a = document.createElement('a')
    a.href = URL.createObjectURL(zipBlob)
    a.download = 'example.zip'
    a.click()
  }

  // genetate zip file by stream
  const fetchTwoFileToZip = async () => {
    const {
      readableStream: zipStream,
      createFile,
      enqueue,
      closeFile,
      closeZip,
    } = createZipStream()

    const fileList = [
        { name: 'vite.svg', url: '/vite.svg' },
        { name: 'README.md', url: '/README.md' },
      ]

    for (const { name, url } of fileList) {
      const response = await fetch(url)
      const respStream = response.body
      if (!respStream) continue
      createFile({
        filename: name,
        lastModified: new Date().getTime(),
      })
      const reader = respStream.getReader()
      while (true) {
        const { done, value } = await reader.read()
        if (done) {
          closeFile()
          break
        }
        enqueue(value)
      }
    }
    closeZip()
    // zip stream to blob
    const zipBlob = await new Response(zipStream).blob()
    const a = document.createElement('a')
    a.href = URL.createObjectURL(zipBlob)
    a.download = 'example.zip'
    a.click()
  }

apis

  1. createZip(files: CreateZipOption[]): Promise<Blob>

    • param: CreateZipOption CreateZipOption can be one of the following:
      • one is just a File object, you can pass the File object directly
      • the other is an object with the following properties:
        • name: string the name of the file
        • lastModified: number the last modified time of the file
        • blob: Blob the blob of the file;
    • return: Promise<Blob> the zip file blob
  2. createZipStream(): ZIPStreamController

    • return: ZIPStreamController
      • ZIPStreamController is an object with the following properties:
        • readableStream: ReadableStream<Uint8Array> the readable stream of the zip file
        • createFile(file: CreateFileOption): void when you want to add a file to the zip, you must call this function first
          • param: CreateFileOption
            • CreateFileOption is an object with the following properties:
              • filename: string the name of the file
              • lastModified: number the last modified time of the file
        • enqueue(chunk: Uint8Array): void you must call this function to add the chunk of the file
          • param: Uint8Array the chunk of the file
        • closeFile(): void when you finish adding the file, you must call this function, otherwise a error will be thrown
        • closeZip(): void when you finish adding all the files, call this function to close the zip file

TODOs

  • [ ] encrypt compress
  • [ ] compression algorithm