bpmn-js/Gruntfile.js

292 lines
7.0 KiB
JavaScript

module.exports = function(grunt) {
require('load-grunt-tasks')(grunt);
require('time-grunt')(grunt);
/* global Buffer,process*/
// configures browsers to run test against
// any of [ 'PhantomJS', 'Chrome', 'Firefox', 'IE']
var TEST_BROWSERS = ((process.env.TEST_BROWSERS || '').replace(/^\s+|\s+$/, '') || 'PhantomJS').split(/\s*,\s*/g);
function bundleAlias(components) {
var alias = [];
if (components.indexOf('libs-external') >= 0) {
alias.push('node_modules/jquery:jquery');
alias.push('node_modules/lodash:lodash');
}
if (components.indexOf('libs-local') >= 0) {
alias.push('node_modules/bpmn-moddle:bpmn-moddle');
}
if (components.indexOf('viewer') >= 0) {
alias.push('index.js:bpmn-js');
}
if (components.indexOf('modeler') >= 0) {
alias.push('<%= config.sources %>/Modeler.js:bpmn-js/Modeler');
}
return alias;
}
function extractSourceMap(file) {
var content = grunt.file.read(file, { encoding: 'utf-8' });
var match = /\/\/# sourceMappingURL=data:application\/json;base64,(.*)/.exec(content);
if (match) {
var b = new Buffer(match[1] + '==', 'base64');
var s = b.toString();
s = s.replace(/\\\\/g, '/'); // convert \\ -> /
var dir = __dirname;
var dirPattern = dir.replace(/\\/g, '/').replace(/\./g, '\\.') + '/';
var pattern = new RegExp(dirPattern, 'g');
s = s.replace(pattern, '');
grunt.file.write('tmp/sourceMap.json', s, { encoding: 'utf-8' });
return 'tmp/sourceMap.json';
} else {
return null;
}
}
// project configuration
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
config: {
sources: 'lib',
tests: 'test',
dist: 'dist',
bowerDist: '../bower-bpmn-js'
},
jshint: {
src: [
['<%=config.sources %>']
],
gruntfile: [
'Gruntfile.js'
],
options: {
jshintrc: true
}
},
release: {
options: {
tagName: 'v<%= version %>',
commitMessage: 'chore(project): release v<%= version %>',
tagMessage: 'chore(project): tag v<%= version %>'
}
},
karma: {
options: {
configFile: '<%= config.tests %>/config/karma.unit.js'
},
single: {
singleRun: true,
autoWatch: false,
browsers: TEST_BROWSERS
},
unit: {
browsers: TEST_BROWSERS
}
},
browserify: {
options: {
browserifyOptions: {
builtins: false
},
bundleOptions: {
detectGlobals: false,
insertGlobalVars: [],
debug: true
}
},
watch: {
files: {
'<%= config.dist %>/bpmn.js': [ '<%= config.sources %>/**/*.js' ],
'<%= config.dist %>/bpmn-viewer.js': [ '<%= config.sources %>/Viewer.js' ]
},
options: {
watch: true,
alias: bundleAlias([
'viewer',
'modeler',
'libs-external',
'libs-local'
])
}
},
bowerViewer: {
files: {
'<%= config.bowerDist %>/bpmn-viewer.js': [ '<%= config.sources %>/Viewer.js' ]
},
options: {
browserifyOptions: {
builtins: false
},
bundleOptions: {
standalone: 'BpmnJS',
detectGlobals: false,
insertGlobalVars: [],
debug: false
},
transform: [
[ 'exposify', {
global: true,
expose: {
sax: 'sax',
snapsvg: 'Snap',
lodash: '_',
jquery: '$',
'jquery-mousewheel': '$'
}
} ]
]
}
},
standaloneViewer: {
files: {
'<%= config.dist %>/bpmn-viewer.js': [ '<%= config.sources %>/Viewer.js' ]
},
options: {
alias: bundleAlias([
'viewer',
'libs-external',
'libs-local'
])
}
},
standaloneModeler: {
files: {
'<%= config.dist %>/bpmn.js': [ '<%= config.sources %>/**/*.js' ],
},
options: {
alias: bundleAlias([
'viewer',
'modeler',
'libs-external',
'libs-local'
])
}
}
},
watch: {
standaloneModeler: {
files: [ '<%= config.dist %>/bpmn.js' ],
tasks: [ 'uglify:standaloneModeler' ]
},
standaloneViewer: {
files: [ '<%= config.dist %>/bpmn-viewer.js' ],
tasks: [ 'uglify:standaloneViewer' ]
},
bowerViewer: {
files: [ '<%= config.bowerDist %>/bpmn-viewer.js' ],
tasks: [ 'uglify:bowerViewer' ]
}
},
jsdoc: {
dist: {
src: [ '<%= config.sources %>/**/*.js' ],
options: {
destination: 'docs/api',
plugins: [ 'plugins/markdown' ]
}
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
'<%= grunt.template.today("yyyy-mm-dd") %> - ' +
'http://bpmn.io/license - ' +
'https://github.com/bpmn-io/bpmn-js */',
sourceMap: true,
sourceMapIncludeSources: true,
sourceMapIn: function(file) {
return extractSourceMap(file);
}
},
bowerViewer: {
files: {
'<%= config.bowerDist %>/bpmn-viewer.min.js': [ '<%= config.bowerDist %>/bpmn-viewer.js' ]
}
},
standaloneModeler: {
files: {
'<%= config.dist %>/bpmn.min.js': [ '<%= config.dist %>/bpmn.js' ]
}
},
standaloneViewer: {
files: {
'<%= config.dist %>/bpmn-viewer.min.js': [ '<%= config.dist %>/bpmn-viewer.js' ]
}
}
}
});
// tasks
grunt.registerTask('test', [ 'karma:single' ]);
/////
//
// the main build task that bundles bpmn-js files
//
// valid executions are
//
// * build -> build:all
// * build:all -> build:lib, build:bower
// * build:lib -> { packages library files as standalone bundle }
// * build:lib -> { packages library files as bower bundle }
//
grunt.registerTask('build', function(target, mode) {
mode = mode || 'prod';
if (target === 'bower') {
return grunt.task.run(['browserify:bowerViewer', 'uglify:bowerViewer']);
}
if (target === 'lib') {
var tasks = [];
if (mode !== 'dev') {
tasks.push('uglify:standaloneModeler', 'uglify:standaloneViewer');
}
return grunt.task.run(['browserify:standaloneViewer', 'browserify:standaloneModeler'].concat(tasks));
}
if (!target || target === 'all') {
return grunt.task.run(['build:lib:' + mode, 'build:bower' ]);
}
});
grunt.registerTask('auto-build', [
'browserify:watch',
'watch'
]);
grunt.registerTask('auto-test', [ 'karma:unit' ]);
grunt.registerTask('default', [ 'jshint', 'test', 'build', 'jsdoc' ]);
};