UNPKG

@onereach/orest-input-cli

Version:

The tool for creating, serving, and publishing OREST Inputs

56 lines (46 loc) 1.5 kB
const fs = require('fs'); const path = require('path'); const archiver = require('archiver'); function directorySize(item, size = 0) { return new Promise((resolve, reject) => { fs.lstat(item, function (err, stats) { if (err) return reject(err); if (!stats.isDirectory()) return resolve(size + stats.size); fs.readdir(item, function (err, files) { if (err) return reject(err); Promise.all( files.map(file => directorySize(path.join(item, file), size)) ).then(sizes => { resolve(sizes.reduce((itemSize, acc) => acc + itemSize, size)); }); }); }); }); } async function zipDirectory({ dir, dest, subDir = '/', onProgress }) { const totalSize = await directorySize(dir); return new Promise((resolve, reject) => { const output = fs.createWriteStream(dest); const archive = archiver('zip', { zlib: { level: 9 } }); if (onProgress) { archive.on('progress', function (progress) { onProgress((progress.fs.processedBytes * 100) / totalSize); }); } output.on('close', function () { resolve({ contentLength: archive.pointer(), filePath: dest }); }); archive.on('warning', function (err) { if (err.code === 'ENOENT') { console.warn(err); } else { reject(err); } }); archive.on('error', reject); archive.pipe(output); archive.directory(dir, subDir); archive.finalize(); }); } module.exports = zipDirectory;