import * as fs from 'fs-extra' import * as path from 'path' import * as yauzl from 'yauzl' export async function unzipArchive( zipFilePath: string, outputDir: string ): Promise { return new Promise((resolve, reject) => { yauzl.open(zipFilePath, { lazyEntries: true }, (err, zipfile) => { if (err) return reject(err) zipfile.on('entry', async (entry) => { const entryPath = path.join(outputDir, entry.fileName) if (/\/$/.test(entry.fileName)) { // Directory entry await fs.ensureDir(entryPath) zipfile.readEntry() } else { // File entry zipfile.openReadStream(entry, async (err, readStream) => { if (err) return reject(err) await fs.ensureDir(path.dirname(entryPath)) const writeStream = fs.createWriteStream(entryPath) readStream.pipe(writeStream) readStream.on('end', () => { zipfile.readEntry() }) readStream.on('error', reject) }) } }) zipfile.on('end', resolve) zipfile.on('error', reject) zipfile.readEntry() }) }) }