@onereach/orest-input-cli
Version:
The tool for creating, serving, and publishing OREST Inputs
56 lines (46 loc) • 1.5 kB
JavaScript
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;