1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 'use strict';
- const path = require('path');
- const BufferConstants = require('buffer').constants;
- const Vinyl = require('vinyl');
- const PluginError = require('plugin-error');
- const through = require('through2');
- const Yazl = require('yazl');
- const getStream = require('get-stream');
- module.exports = (filename, options) => {
- if (!filename) {
- throw new PluginError('gulp-zip', '`filename` required');
- }
- options = {
- compress: true,
- buffer: true,
- ...options
- };
- let firstFile;
- const zip = new Yazl.ZipFile();
- return through.obj((file, encoding, callback) => {
- if (!firstFile) {
- firstFile = file;
- }
- // Because Windows...
- const pathname = file.relative.replace(/\\/g, '/');
- if (!pathname) {
- callback();
- return;
- }
- if (file.isNull() && file.stat && file.stat.isDirectory && file.stat.isDirectory()) {
- zip.addEmptyDirectory(pathname, {
- mtime: options.modifiedTime || file.stat.mtime || new Date()
- // Do *not* pass a mode for a directory, because it creates platform-dependent
- // ZIP files (ZIP files created on Windows that cannot be opened on macOS).
- // Re-enable if this PR is resolved: https://github.com/thejoshwolfe/yazl/pull/59
- // mode: file.stat.mode
- });
- } else {
- const stat = {
- compress: options.compress,
- mtime: options.modifiedTime || (file.stat ? file.stat.mtime : new Date()),
- mode: file.stat ? file.stat.mode : null
- };
- if (file.isStream()) {
- zip.addReadStream(file.contents, pathname, stat);
- }
- if (file.isBuffer()) {
- zip.addBuffer(file.contents, pathname, stat);
- }
- }
- callback();
- }, function (callback) {
- if (!firstFile) {
- callback();
- return;
- }
- (async () => {
- let data;
- if (options.buffer) {
- try {
- data = await getStream.buffer(zip.outputStream, {maxBuffer: BufferConstants.MAX_LENGTH});
- } catch (error) {
- if (error instanceof getStream.MaxBufferError) {
- callback(new PluginError('gulp-zip', 'The output ZIP file is too big to store in a buffer (larger than Buffer MAX_LENGTH). To output a stream instead, set the gulp-zip buffer option to `false`.'));
- } else {
- callback(error);
- }
- return;
- }
- } else {
- data = zip.outputStream;
- }
- this.push(new Vinyl({
- cwd: firstFile.cwd,
- base: firstFile.base,
- path: path.join(firstFile.base, filename),
- contents: data
- }));
- callback();
- })();
- zip.end();
- });
- };
|