71 lines
1.6 KiB
JavaScript
71 lines
1.6 KiB
JavaScript
'use strict';
|
|
var through = require('through2'),
|
|
uglify = require('uglify-js'),
|
|
merge = require('deepmerge'),
|
|
Vinyl = require('vinyl'),
|
|
uglifyError = require('./lib/error.js');
|
|
|
|
module.exports = function(opt) {
|
|
|
|
function minify(file, encoding, callback) {
|
|
/*jshint validthis:true */
|
|
|
|
if (file.isNull()) {
|
|
this.push(file);
|
|
return callback();
|
|
}
|
|
|
|
if (file.isStream()) {
|
|
return callback(uglifyError('Streaming not supported'));
|
|
}
|
|
|
|
var options = merge(opt || {}, {
|
|
fromString: true,
|
|
output: {}
|
|
});
|
|
|
|
var mangled,
|
|
map,
|
|
sourceMap;
|
|
|
|
if (options.outSourceMap === true) {
|
|
options.outSourceMap = file.relative + '.map';
|
|
}
|
|
|
|
if (options.preserveComments === 'all') {
|
|
options.output.comments = true;
|
|
} else if (options.preserveComments === 'some') {
|
|
// preserve comments with directives or that start with a bang (!)
|
|
options.output.comments = /^!|@preserve|@license|@cc_on/i;
|
|
} else if (typeof options.preserveComments === 'function') {
|
|
options.output.comments = options.preserveComments;
|
|
}
|
|
|
|
try {
|
|
mangled = uglify.minify(String(file.contents), options);
|
|
file.contents = new Buffer(mangled.code);
|
|
this.push(file);
|
|
} catch (e) {
|
|
console.warn('Error caught from uglify: ' + e.message + ' in ' + file.path + '. Returning unminifed code');
|
|
this.push(file);
|
|
return callback();
|
|
}
|
|
|
|
if (options.outSourceMap) {
|
|
sourceMap = JSON.parse(mangled.map);
|
|
sourceMap.sources = [ file.relative ];
|
|
map = new Vinyl({
|
|
cwd: file.cwd,
|
|
base: file.base,
|
|
path: file.path + '.map',
|
|
contents: new Buffer(JSON.stringify(sourceMap))
|
|
});
|
|
this.push(map);
|
|
}
|
|
|
|
callback();
|
|
}
|
|
|
|
return through.obj(minify);
|
|
};
|