/
broccoli_build.js
68 lines (53 loc) · 2.16 KB
/
broccoli_build.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
* grunt-broccoli-build
* https://github.com/ericf/grunt-broccoli-build
*
* Copyright 2014 Yahoo! Inc.
* Licensed under the Yahoo! Inc. BSD license.
*/
'use strict';
module.exports = function (grunt) {
grunt.registerMultiTask('broccoli_build', 'Runs a Broccoli build.', function () {
var broccoli = require('broccoli');
var findup = require('findup-sync');
var ncp = require('ncp');
var path = require('path');
var done = this.async();
var dest = this.data.dest;
// TODO: Add upstream feature request to `broccoli` to support the:
// `loadBrocfile([ name ])` signature so this functionality doesn't
// have to be duplicated from Broccoli.
function loadBrocfile(brocfileName) {
var brocfile = findup(brocfileName || 'Brocfile.js', {nocase: true});
if (!brocfile) {
throw new Error('Brocfile.js not found');
}
// cwd into the Brocfile's dir so its deps are loaded correctly.
process.chdir(path.dirname(brocfile));
return require(brocfile);
}
if (typeof dest !== 'string') {
grunt.fatal('Target must be configured with a `dest` dir path.');
}
if (grunt.file.isDir(dest)) {
grunt.warn('Directory "' + dest + '" already exists.');
}
var tree = loadBrocfile(this.data.brocfile);
var builder = new broccoli.Builder(tree);
grunt.log.writeln('Broccoli building to "' + dest + '"');
builder.build().then(function (results) {
// Deal with differences in Broccoli versions.
var dir = typeof results === 'string' ? results : results.directory;
var buildTime = results.totalTime;
ncp(dir, dest, {dereference: true}, function (err) {
if (err) { throw err; }
if (buildTime) {
grunt.log.ok('built (' + Math.floor(buildTime / 1e6) + 'ms)');
} else {
grunt.log.ok('built');
}
builder.cleanup().then(done);
});
}).catch(done);
});
};