Files
react/grunt/tasks/browserify.js
2013-06-03 13:20:13 -04:00

67 lines
1.7 KiB
JavaScript

'use strict';
var browserify = require('browserify');
var grunt = require('grunt');
module.exports = function() {
var config = this.data;
// This task is async...
var done = this.async();
// More/better assertions
// grunt.config.requires('outfile');
// grunt.config.requires('entries');
config.transforms = config.transforms || [];
config.after = config.after || [];
if (typeof config.after === 'function') {
config.after = [config.after];
}
// create the bundle we'll work with
var entries = grunt.file.expand(config.entries);
var bundle = browserify(entries);
// Make sure the things that need to be exposed are.
var requires = config.requires || {};
if (requires instanceof Array) {
grunt.file.expand({
nonull: true, // Keep IDs that don't expand to anything.
cwd: "src"
}, requires).forEach(function(name) {
bundle.require("./build/modules/" + name, {
expose: name.replace(/\.js$/i, "")
});
});
} else if (typeof requires === "object") {
Object.keys(requires).forEach(function(name) {
bundle.require(requires[name], { expose: name });
});
}
// Extract other options
var options = {
debug: config.debug, // sourcemaps
standalone: config.standalone // global
};
// TODO: make sure this works, test with this too
config.transforms.forEach(bundle.transform, this);
// Actually bundle it up
var _this = this;
bundle.bundle(options, function(err, src) {
if (err) {
grunt.log.error(err);
done();
}
config.after.forEach(function(fn) {
src = fn.call(_this, src);
});
grunt.file.write(config.outfile, src);
done();
});
};