grunt-systemjs-builder
Version:
grunt task for building projects based on systemjs
100 lines (79 loc) • 2.93 kB
JavaScript
module.exports = function (grunt) {
"use strict";
//todo: allow Arithmetic builds - https://github.com/systemjs/builder#example---arithmetic-expressions
//todo: use trace api for more advanced builds - https://github.com/systemjs/builder#example---direct-trace-api
function task() {
var buildQuickSettings = ["minify", "sourceMaps"],
Builder = require("systemjs-builder"),
options = _getOptions.call(this, buildQuickSettings),
builder = new Builder(options.builder),
done = this.async();
if (options.baseURL) {
grunt.verbose.writeln("systemjs-builder-task - using base url: " + options.baseURL);
builder.config({baseURL: options.baseURL});
}
if (options.configFile) {
var ignoreBaseUrlInConfFile = !!options.baseURL;
builder.loadConfig(options.configFile, false, ignoreBaseUrlInConfFile) //load external config file if one specified - instr
.then(_build.bind(this, builder, options, done))
.catch(function (err) {
grunt.fail.fatal(err);
});
}
else {
_build.call(this, builder, options, done);
}
}
function _isUndefined(val) {
return typeof val === "undefined";
}
function _getOptions(buildQuickSettings) {
var options = this.options({
builder: {},
build: {},
sfx: false,
minify: false,
sourceMaps: true
});
buildQuickSettings.forEach(function (setting) { //make it easier to set build options
if (_isUndefined(options.build[setting] && !_isUndefined(options[setting]))) {
options.build[setting] = options[setting];
}
});
return options;
}
function _build(builder, options, done) {
var buildMethod = options.sfx ? "buildStatic" : "bundle",
counter = this.files.length,
data = {
builder: builder,
buildMethod: buildMethod,
options: options
};
grunt.verbose.writeln("systemjs-builder-task - running build method: " + buildMethod);
this.files.forEach(_buildSource.bind(this, data, function () {
counter -= 1;
if (counter === 0) {
done();
}
}));
}
function _buildSource(data, done, file) {
if (file.src.length > 1) { //todo: support multiple src files using "&" - https://github.com/systemjs/builder#example---common-bundles
grunt.fail.fatal("systemjs-builder-task - cant have more than one source file for the build process");
}
var builder = data.builder,
options = data.options,
src = file.src[0] || file.orig.src[0]; //falls back the this original string which may include arithmetic. if not it'll fail also
grunt.verbose.writeln("systemjs-builder-task - about to build source: " + src);
builder[data.buildMethod].call(builder, src, file.dest, options.build)
.then(function () {
grunt.verbose.writeln("systemjs-builder-task - finished building source: " + src);
done();
})
.catch(function (err) {
grunt.fail.fatal(err);
});
}
grunt.registerMultiTask("systemjs", "build project using systemjs builder", task);
};