asset-packs
Version:
Grunt Plugin/Middleware for packing development source into production assets
97 lines (79 loc) • 3.04 kB
JavaScript
;
var path = require('path'),
cypto = require('crypto'),
async = require('async'),
fs = require('node-fs'),
AssetPacker = require('../lib/AssetPacker'),
UglifyJS = require("uglify-js");
function generateSha(content) {
var shasum = cypto.createHash('sha1');
shasum.update(content);
return shasum.digest('hex');
}
var fileHandlers = {
js: function(contents, pack, outputDir) {
var fileSha = generateSha(contents.content),
filename = pack.compiler.name + '-' + fileSha,
sourceMap = UglifyJS.SourceMap({
file: filename + '.js.map'
}),
compressor = UglifyJS.Compressor({
warnings: false
}),
toplevel = UglifyJS.parse(contents.content, {
filename: filename + '.js',
toplevel: null
}),
stream = UglifyJS.OutputStream({
source_map: sourceMap
});
toplevel.figure_out_scope();
toplevel = toplevel.transform(compressor);
if (pack.pack.mangleNames) {
toplevel.figure_out_scope();
toplevel.compute_char_frequency();
toplevel.mangle_names({
toplevel: true,
sort: true
});
}
toplevel.print(stream);
fs.writeFile(path.resolve(outputDir, filename + '.js'), contents.content, function() {});
fs.writeFile(path.resolve(outputDir, filename + '.min.js'), stream + '\n//@ sourceMappingURL=' + filename + '.js.map', function() {});
fs.writeFile(path.resolve(outputDir, filename + '.js.map'), sourceMap + '', function() {});
return filename + '.min.js';
}
};
module.exports = function(grunt) {
grunt.registerMultiTask('packs', 'Grunt Plugin for writing packs to disk', function() {
var outputDir = path.resolve(this.data.dest),
done = this.async(),
packs = [],
manifest = {};
if(!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, 511 /* 0777 */, true);
}
for(var list = this.filesSrc, i = 0; i < list.length; i++) {
packs.push(new AssetPacker({
pack: list[i],
base: path.dirname(list[i]),
autoWatch: false
}));
}
async.each(packs, function(pack, done) {
pack.getAllContent(function(content) {
var filename, p;
for(p in content) {
filename = fileHandlers[p](content[p], pack, outputDir);
if(!manifest[pack.compiler.base]) {
manifest[pack.compiler.base] = {};
}
manifest[pack.compiler.base][p] = filename;
}
done();
});
}, function() {
fs.writeFile(path.resolve(outputDir, 'manifest.json'), JSON.stringify(manifest), done);
});
});
};