gulp-yuicompressor
Version:
Minify files with yuicompressor
115 lines (92 loc) • 2.36 kB
JavaScript
var spawn = require('child_process').spawn,
fs = require('fs'),
path = require('path'),
jar,
exists = fs.exists || path.exists,
lists = fs.readdirSync(path.join(__dirname, './lib'));
lists.some(function(item) {
if (path.extname(item) === '.jar') {
jar = path.join(__dirname, './lib/', item);
return true;
}
});
exports.jar = jar;
var defaultOptions = {
charset: 'utf8',
type: 'js'
};
var validOptions = {
charset: 1,
type: 1,
'line-break': 1,
nomunge: 1,
'preserve-semi': 1,
'disable-optimizations': 1
};
var getString = function(str, callback, options) {
exists(str, function(y) {
if (y) {
var ext = (path.extname(str)).replace('.', '');
fs.readFile(str, 'utf8', function(err, data) {
//Set the type from the file name
options.type = ext;
callback(err, data, options);
});
} else {
callback(null, str, options);
}
});
};
var filterOptions = function(options) {
Object.keys(options).forEach(function(key) {
if (!validOptions[key]) {
delete options[key];
}
});
options.type = options.type || 'js';
options.charset = options.charset || 'utf8';
return options;
};
var compressString = function(str, options, callback) {
//Now we have a string, spawn and pipe it in.
options = filterOptions(options);
var args = [
'-jar',
exports.jar
], buffer = '', errBuffer = '', child;
Object.keys(options).forEach(function(key) {
args.push('--' + key);
if (options[key] && options[key] !== true) {
args.push(options[key]);
}
});
child = spawn('java', args, {
stdio: ['pipe', 'pipe', 'pipe']
});
child.stdin.write(str);
child.stdin.end();
child.stdout.on('data', function(chunk) {
buffer += chunk;
});
child.stderr.on('data', function(chunk) {
errBuffer += chunk;
});
child.on('exit', function() {
var err = null;
if (errBuffer.indexOf('[ERROR]') > -1) {
err = errBuffer;
}
callback(err, buffer, errBuffer);
});
};
var compress = function(str, options, callback) {
if (typeof options === 'function') {
callback = options;
options = defaultOptions;
}
getString(str, function(err, str, options) {
compressString(str, options, callback);
}, options);
};
exports.compress = compress;
exports.compressString = compressString;