61 lines
1.4 KiB
JavaScript
Executable File
61 lines
1.4 KiB
JavaScript
Executable File
'use strict';
|
|
|
|
var through = require('through2');
|
|
var yazl = require('yazl');
|
|
var File = require('../vinyl-zip');
|
|
|
|
function zip(zipPath, options) {
|
|
if (!zipPath) throw new Error('No zip path specified.');
|
|
|
|
options = options || {};
|
|
|
|
var zip = new yazl.ZipFile();
|
|
var isEmpty = true;
|
|
|
|
var stream = through.obj(function(file, enc, cb) {
|
|
var stat = file.stat || {};
|
|
|
|
var opts = {
|
|
mtime: stat.mtime,
|
|
mode: stat.mode
|
|
};
|
|
|
|
opts.compress = options.compress;
|
|
|
|
var path = file.relative.replace(/\\/g, '/');
|
|
|
|
if (stat.isSymbolicLink && stat.isSymbolicLink()) {
|
|
zip.addBuffer(new Buffer(file.symlink), path, opts);
|
|
} else if (file.isDirectory()) {
|
|
// In Windows, directories have a 666 permissions. This doesn't go well
|
|
// on OS X and Linux, where directories are expected to be 755.
|
|
if (/win32/.test(process.platform)) {
|
|
opts.mode = 16877;
|
|
}
|
|
|
|
zip.addEmptyDirectory(path, opts);
|
|
} else if (file.isBuffer()) {
|
|
zip.addBuffer(file.contents, path, opts);
|
|
} else if (file.isStream()) {
|
|
zip.addReadStream(file.contents, path, opts);
|
|
}
|
|
|
|
isEmpty = false;
|
|
cb();
|
|
}, function(cb) {
|
|
if (isEmpty && options.unlessEmpty) {
|
|
return cb();
|
|
}
|
|
|
|
stream.push(new File({path: zipPath, contents: zip.outputStream}));
|
|
zip.end(function() {
|
|
cb();
|
|
});
|
|
});
|
|
|
|
stream.resume();
|
|
return stream;
|
|
}
|
|
|
|
module.exports = zip;
|