{"id":13728149,"url":"https://github.com/mikbry/anzip","last_synced_at":"2025-04-15T15:21:52.292Z","repository":{"id":36496202,"uuid":"226835294","full_name":"mikbry/anzip","owner":"mikbry","description":"Simple async unzip library for Node.js","archived":false,"fork":false,"pushed_at":"2023-01-06T13:57:23.000Z","size":242,"stargazers_count":61,"open_issues_count":15,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-28T21:51:06.581Z","etag":null,"topics":["async","es6","esm","import","javascript","nodejs","unzip"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mikbry.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-12-09T09:37:00.000Z","updated_at":"2025-02-25T00:49:13.000Z","dependencies_parsed_at":"2023-01-17T02:15:27.819Z","dependency_job_id":null,"html_url":"https://github.com/mikbry/anzip","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikbry%2Fanzip","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikbry%2Fanzip/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikbry%2Fanzip/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikbry%2Fanzip/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mikbry","download_url":"https://codeload.github.com/mikbry/anzip/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249095067,"owners_count":21211856,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","es6","esm","import","javascript","nodejs","unzip"],"created_at":"2024-08-03T02:00:37.886Z","updated_at":"2025-04-15T15:21:52.271Z","avatar_url":"https://github.com/mikbry.png","language":"JavaScript","funding_links":[],"categories":["Packages"],"sub_categories":["Compression"],"readme":"# Anzip\n\n[![Build Status][travis-image]][travis-url]\n[![codecov][codecov-image]][codecov-url]\n[![NPM version][npm-image]][npm-url]\n[![License][license-image]][license-url]\n\n[travis-image]: https://travis-ci.com/mikbry/anzip.svg?token=mRB1zwsyoRAKcamR2qpU\n[travis-url]: https://travis-ci.com/mikbry/anzip\n[codecov-image]: https://codecov.io/gh/mikbry/anzip/branch/master/graph/badge.svg?token=K4P0vnM5fh\n[codecov-url]: https://codecov.io/gh/mikbry/anzip\n[npm-image]: https://img.shields.io/npm/v/anzip.svg\n[npm-url]: https://npmjs.org/package/anzip\n[license-image]: https://img.shields.io/npm/l/anzip.svg\n[License-url]:./LICENSE\n\n\u003e Anzip is a library to unzip file archive for Node using only one async function.\n\n\n\n### Purpose\n- Simple to use\n- Modern ES6+ syntax (import instead of require, await/async, ...)\n- Unzip by [Yauzl](https://github.com/thejoshwolfe/yauzl/)\n- Follows [Node best practices](https://github.com/goldbergyoni/nodebestpractices)\n\n___\n\n### Requirements\n- Node \u003e= 12\n\n---\n\n### Install\n```bash\nyarn add anzip\n````\n\nOr using npm\n```bash\nnpm add anzip\n````\n\n---\n\n### Usage\n\u003e Now that ESM support is widely common, `require` should be forgotten.\n\n```javascript\nimport anzip from 'anzip';\n```\n\n\n\u003e Extract file.zip to current path\n\n```javascript\nawait anzip('file.zip');\n```\n\n\n\u003e Extract file.zip to the current path and get output\n\n```javascript\nconst output = await anzip('file.zip');\nconsole.log('duration=', output.duration);\nconsole.log('number of files=', output.files.length);\n```\n\n\u003e Extract only README.md from file.zip to current path\n\n```javascript\nconst output = await anzip('file.zip', { pattern: 'README.md', });\nconsole.log('duration=', output.duration);\nconsole.log('number of files=', output.files.length); // Should be one\n```\n\n\u003e Extract only README.md from file.zip to output content variable\n\n```javascript\nconst output = await anzip('file.zip', { pattern: 'README.md', outputContent: true });\nconsole.log('duration=', output.duration);\nconsole.log('content=', output.files[0].content);\n```\n\n\u003e Extract only README.md from file.zip to output content variable and currentpath\n\n```javascript\nconst output = await anzip('file.zip', { pattern: 'README.md', outputPath: './', outputContent: true });\nconsole.log('duration=', output.duration);\nconsole.log('content=', output.files[0].content);\n```\n\n\u003e Extract with an entryHandler to fliter entry\n\n```javascript\nconst outputPath = './path';\nconst entryHandler = async entry =\u003e {\n  let resp = true;\n  const fn = entry.name;\n  if (fn.endsWith('dummy.pdf')) {\n    try {\n      await entry.saveTo(outputPath);\n      resp = false;\n    } catch (e) {\n      //\n    }\n  }\n  return resp;\n};\nconst output = await anzip('file.zip',\n    outputPath,\n    { pattern: /(^(?!\\.))(.+(.png|.jpeg|.jpg|.svg|.pdf|.json))$/i,, outputPath: './', entryHandler, outputContent: true });\nconsole.log('duration=', output.duration);\n// ./path/dummy.pdf should be saved\n```\n\n\u003e Extract using 2 rules and an entryHandler in one to fliter entry\n\n```javascript\nconst outputPath = './path';\nconst entryHandler = async entry =\u003e {\n  let resp = true;\n  const fn = entry.name;\n  if (fn.endsWith('dummy.pdf')) {\n    try {\n      await entry.saveTo(outputPath);\n      resp = false;\n    } catch (e) {\n      //\n    }\n  }\n  return resp;\n};\nconst output = await anzip('file.zip',\n    outputPath,\n    pattern: /(^(?!\\.))(.+(.png|.jpeg|.jpg|.svg|.pdf|.json))$/i,\n    flattenPath: true,\n    disableSave: true,\n    disableOutput: true,\n    rules: [\n      { pattern: /(^(?!\\.))(test.json)$/i, outputContent: true },\n      { pattern: /(^(?!\\.))(.+(.png|.jpeg|.jpg|.svg|.pdf))$/i, entryHandler },\n    ],\n  });\nconsole.log('duration=', output.duration);\n// ./path/dummy.pdf should be saved\n```\n\n\n ---\n\n### Documentation\n\u003e One function to rule them all.\n\n`output = await anzip(filename, {opts})`\n\n**Function properties**\n\n| parameters | type | description |\n| ----------- | --- | ----------- |\n| filename     | mandatory string | containing zip path to + file |\n| opts            | optional object | containing optional parameters |\n| opts.outputPath | optional string | the directory where to to save extracted files |\n| opts.outputContent | optional boolean | if set to true, return file.content a Buffer containing file's content |\n| opts.disableSave | optional boolean | if set to true, don't save files |\n| opts.pattern | optional regex | if set only extract/proceed matching filenames |\n| opts.flattenPath | optional boolean | if set don't recreate zip's directories, all file are saved in outputPath |\n| opts.disableOutput | optional boolean | if set don't write files to output |\n| opts.entryHandler | optional promise | use it to add some extra processing to an entry, return true if stream is consumed otherwise false |\n| opts.rules | optional array | use it to add some fine tuned control how to handle each files |\n| opts.rules.pattern | mandatory regex | if it match entry will use rule's parameters instead of global's one |\n\n\n**Returned output is an object containing:**\n\n| parameters | type | description |\n| ----------- | --- | ----------- |\n| duration | number | how long it took to extract in seconds |\n| files | array | all files extracted or handled, otherwise empty |\n| files[x].name | string | the filename |\n| files[x].directory | string | the directory in archive (even if opts.flattenPath=true) |\n| files[x].saved | boolean | true if the file was saved to outputPath |\n| files[x].content | Buffer | the content of the file available if opts.outputContent=true or rule.outputContent=true |\n| files[x].error | Error | if an error occured |\n\n---\n## Contribution\n\nRead [Contributing Guide](CONTRIBUTING.md) for development setup instructions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikbry%2Fanzip","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmikbry%2Fanzip","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikbry%2Fanzip/lists"}