Skip to content

Commit 2ec8682

Browse files
chore(build): add bundling grunt task
1 parent 0acce77 commit 2ec8682

File tree

4 files changed

+194
-2
lines changed

4 files changed

+194
-2
lines changed

Gruntfile.js

+18-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ module.exports = function(grunt) {
1919
config: {
2020
sources: 'lib',
2121
tests: 'test',
22-
dist: '../bower-bpmn-js/dist'
22+
dist: 'dist'
2323
},
2424

2525
jshint: {
@@ -54,6 +54,19 @@ module.exports = function(grunt) {
5454
}
5555
},
5656

57+
bundle: {
58+
viewer: {
59+
name: 'dmn-viewer',
60+
src: '<%= config.sources %>/Viewer.js',
61+
dest: '<%= config.dist %>'
62+
},
63+
modeler: {
64+
name: 'dmn-modeler',
65+
src: '<%= config.sources %>/Modeler.js',
66+
dest: '<%= config.dist %>'
67+
}
68+
},
69+
5770
jsdoc: {
5871
dist: {
5972
src: [ '<%= config.sources %>/**/*.js' ],
@@ -65,10 +78,13 @@ module.exports = function(grunt) {
6578
}
6679
});
6780
// tasks
81+
grunt.loadTasks('tasks');
6882

6983
grunt.registerTask('test', [ 'karma:single' ]);
7084

7185
grunt.registerTask('auto-test', [ 'karma:unit' ]);
7286

73-
grunt.registerTask('default', [ 'jshint', 'test', 'jsdoc' ]);
87+
grunt.registerTask('build', [ 'bundle' ]);
88+
89+
grunt.registerTask('default', [ 'jshint', 'test', 'build', 'jsdoc' ]);
7490
};

tasks/banner-min.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/*! <%= pkg.name %> - <%= config.variant %> v<%= pkg.version %> | (c) 2015 camunda Services GmbH | bpmn.io/license */

tasks/banner.txt

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*!
2+
* <%= pkg.name %> - <%= config.variant %> v<%= pkg.version %>
3+
4+
* Copyright 2015 camunda Services GmbH and other contributors
5+
*
6+
* Released under the bpmn.io license
7+
* http://bpmn.io/license
8+
*
9+
* Source Code: https://github.com/dmn-io/dmn-js
10+
*
11+
* Date: <%= grunt.template.today("yyyy-mm-dd") %>
12+
*/

tasks/bundle.js

+163
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
'use strict';
2+
3+
var browserify = require('browserify'),
4+
derequire = require('browserify-derequire'),
5+
UglifyJS = require('uglify-js'),
6+
collapse = require('bundle-collapser/plugin'),
7+
concat = require('source-map-concat'),
8+
fs = require('fs'),
9+
path = require('path');
10+
11+
12+
var BANNER = fs.readFileSync(__dirname + '/banner.txt', 'utf8'),
13+
BANNER_MIN = fs.readFileSync(__dirname + '/banner-min.txt', 'utf8');
14+
15+
16+
function extractSourceMap(content) {
17+
18+
var SOURCE_MAP_HEADER = '//# sourceMappingURL=data:application/json;base64,';
19+
20+
var idx = content.indexOf(SOURCE_MAP_HEADER),
21+
map, code;
22+
23+
if (idx !== -1) {
24+
code = content.substring(0, idx);
25+
map = content.substring(idx + SOURCE_MAP_HEADER.length);
26+
27+
map = new Buffer(map, 'base64').toString();
28+
29+
map = map.replace(/\\\\/g, '/'); // convert \\ -> /
30+
31+
var dir = __dirname;
32+
33+
var dirPattern = dir.replace(/\\/g, '/').replace(/\./g, '\\.') + '/';
34+
35+
var pattern = new RegExp(dirPattern, 'g');
36+
37+
map = map.replace(pattern, '');
38+
39+
return {
40+
code: code,
41+
map: JSON.parse(map)
42+
};
43+
} else {
44+
throw new Error('no attached source map');
45+
}
46+
}
47+
48+
49+
function uglify(bundle, preamble) {
50+
return UglifyJS.minify(bundle.code, {
51+
fromString: true,
52+
output: {
53+
preamble: preamble
54+
}
55+
});
56+
}
57+
58+
59+
function Timer() {
60+
this.reset();
61+
}
62+
63+
Timer.prototype.done = function(message) {
64+
console.log(message, '[' + (this.now() - this.start) + 'ms]');
65+
this.reset();
66+
};
67+
68+
Timer.prototype.reset = function() {
69+
this.start = this.now();
70+
};
71+
72+
Timer.prototype.now = function() {
73+
return new Date().getTime();
74+
};
75+
76+
77+
module.exports = function(grunt) {
78+
79+
grunt.registerMultiTask('bundle', function(target) {
80+
81+
var data = this.data,
82+
variant = data.name,
83+
dest = data.dest,
84+
src = path.resolve(data.src);
85+
86+
grunt.config.set('config.variant', variant);
87+
88+
var done = this.async();
89+
90+
var browserifyOptions = {
91+
standalone: 'DmnJS',
92+
debug: true,
93+
builtins: false,
94+
insertGlobalVars: {
95+
process: function () {
96+
return 'undefined';
97+
},
98+
Buffer: function () {
99+
return 'undefined';
100+
}
101+
}
102+
};
103+
104+
var timer = new Timer();
105+
106+
var targetFileBase = path.join(dest, variant);
107+
108+
var banner = grunt.template.process(BANNER, grunt.config.get()),
109+
bannerMin = grunt.template.process(BANNER_MIN, grunt.config.get());
110+
111+
browserify(browserifyOptions)
112+
.plugin(derequire)
113+
.plugin(collapse)
114+
.add(src)
115+
.bundle(function(err, result) {
116+
117+
timer.done('bundled');
118+
119+
if (err) {
120+
return done(err);
121+
}
122+
123+
var bundled, minified;
124+
125+
bundled = extractSourceMap(result.toString('utf8'));
126+
127+
timer.done('extracted source map');
128+
129+
try {
130+
minified = uglify(bundled, bannerMin);
131+
} catch (e) {
132+
return done(e);
133+
}
134+
135+
timer.done('minified');
136+
137+
var bannerBundled;
138+
139+
try {
140+
bannerBundled = concat([ bundled ])
141+
.prepend(banner + '\n')
142+
.add('//# sourceMappingURL=' + variant + '.js.map')
143+
.toStringWithSourceMap();
144+
} catch (e) {
145+
console.error(e.stack);
146+
throw e;
147+
}
148+
149+
timer.done('added banner');
150+
151+
grunt.file.write(targetFileBase + '.js', bannerBundled.code, 'utf8');
152+
grunt.file.write(targetFileBase + '.js.map', bannerBundled.map, 'utf8');
153+
154+
grunt.file.write(targetFileBase + '.min.js', minified.code, 'utf8');
155+
156+
timer.done('all saved');
157+
158+
done();
159+
});
160+
161+
});
162+
163+
};

0 commit comments

Comments
 (0)