Pure JavaScript ZIP extraction library for extracting archives into directories
npx @tessl/cli install tessl/npm-extract-zip@2.0.0Extract Zip is a pure JavaScript library for extracting ZIP archives into directories. It provides both programmatic API and command-line interface capabilities, using the yauzl ZIP parser for reliable extraction with support for custom file and directory permissions, entry-level processing hooks, and asynchronous operation patterns.
npm install extract-zipconst extract = require('extract-zip');For TypeScript:
import extract = require('extract-zip');const extract = require('extract-zip');
async function extractZip() {
try {
await extract('/path/to/archive.zip', { dir: '/path/to/destination' });
console.log('Extraction complete');
} catch (err) {
console.error('Extraction failed:', err);
}
}Extract Zip is built around several key components:
Main extraction function that extracts a ZIP archive to a specified directory.
/**
* Extract a ZIP archive to a directory
* @param zipPath - Path to the ZIP file to extract
* @param opts - Extraction options
* @returns Promise that resolves when extraction is complete
*/
async function extract(zipPath: string, opts: Options): Promise<void>;Configuration options for controlling the extraction process.
interface Options {
/** Target directory path (required, must be absolute) */
dir: string;
/** Default directory permissions (defaults to 0o755) */
defaultDirMode?: number;
/** Default file permissions (defaults to 0o644) */
defaultFileMode?: number;
/** Callback for each ZIP entry during extraction */
onEntry?: (entry: Entry, zipfile: ZipFile) => void;
}Optional callback function that receives each ZIP entry during extraction, allowing for custom processing or progress tracking.
/**
* Callback function called for each ZIP entry
* @param entry - yauzl Entry object representing the current ZIP entry
* @param zipfile - yauzl ZipFile object representing the opened ZIP file
*/
type OnEntryCallback = (entry: Entry, zipfile: ZipFile) => void;The package includes a CLI tool for extracting ZIP files from the command line.
# Extract ZIP to current directory
extract-zip foo.zip
# Extract ZIP to specific directory
extract-zip foo.zip <targetDirectory>import { Entry, ZipFile } from 'yauzl';
interface Options {
dir: string;
defaultDirMode?: number;
defaultFileMode?: number;
onEntry?: (entry: Entry, zipfile: ZipFile) => void;
}const extract = require('extract-zip');
async function main() {
await extract('my-archive.zip', { dir: '/tmp/extracted' });
}const extract = require('extract-zip');
async function main() {
await extract('my-archive.zip', {
dir: '/tmp/extracted',
defaultDirMode: 0o755,
defaultFileMode: 0o644
});
}const extract = require('extract-zip');
async function main() {
await extract('my-archive.zip', {
dir: '/tmp/extracted',
onEntry: (entry, zipfile) => {
console.log(`Extracting: ${entry.fileName}`);
}
});
}import extract = require('extract-zip');
async function extractWithTypes(): Promise<void> {
const options: extract.Options = {
dir: '/tmp/extracted',
defaultDirMode: 0o755,
onEntry: (entry, zipfile) => {
console.log(`Processing: ${entry.fileName}`);
}
};
await extract('archive.zip', options);
}The library throws errors in several scenarios:
const extract = require('extract-zip');
async function safeExtract() {
try {
await extract('archive.zip', { dir: '/absolute/path/to/destination' });
} catch (error) {
if (error.message.includes('Out of bound path')) {
console.error('Security error: ZIP contains path traversal attempt');
} else if (error.message === 'Target directory is expected to be absolute') {
console.error('Invalid target directory: must be absolute path');
} else {
console.error('Extraction failed:', error.message);
}
}
}
// CLI error handling (when using extract-zip command)
// CLI errors are prefixed with "error!" and cause process.exit(1)__MACOSX/ metadata entriesThe library automatically handles path normalization and directory creation:
fs.realpath() to resolve the target directory to its canonical path