UNPKG

dc.graph

Version:

Graph visualizations integrated with crossfilter and dc.js

421 lines (413 loc) 15.5 kB
module.exports = function (grunt) { 'use strict'; require('load-grunt-tasks')(grunt, { pattern: ['grunt-*'] }); require('time-grunt')(grunt); var config = { src: 'src', spec: 'spec', web: 'web', pkg: require('./package.json'), banner: grunt.file.read('./LICENSE_BANNER'), jsFiles: module.exports.jsFiles, colaWorkerFiles: [ 'src/core.js', 'src/generate_objects.js', 'src/graphviz_attrs.js', 'src/cola_layout.js', 'src/webworker_message.js' ], dagreWorkerFiles: [ 'src/core.js', 'src/generate_objects.js', 'src/graphviz_attrs.js', 'src/dagre_layout.js', 'src/webworker_message.js' ], d3v4ForceWorkerFiles: [ 'src/core.js', 'src/generate_objects.js', 'src/graphviz_attrs.js', 'src/d3v4_force_layout.js', 'src/webworker_message.js' ], d3ForceWorkerFiles: [ 'src/core.js', 'src/generate_objects.js', 'src/graphviz_attrs.js', 'src/d3_force_layout.js', 'src/webworker_message.js' ] }; grunt.initConfig({ conf: config, concat: { options : { process: true, sourceMap: true, banner : '<%= conf.banner %>' }, main: { src: '<%= conf.jsFiles %>', dest: '<%= conf.pkg.name %>.js' }, colaWorker: { src: '<%= conf.colaWorkerFiles %>', dest: '<%= conf.pkg.name %>.cola.worker.js' }, dagreWorker: { src: '<%= conf.dagreWorkerFiles %>', dest: '<%= conf.pkg.name %>.dagre.worker.js' }, d3v4ForceWorker: { src: '<%= conf.d3v4ForceWorkerFiles %>', dest: '<%= conf.pkg.name %>.d3v4-force.worker.js' }, d3ForceWorker: { src: '<%= conf.d3ForceWorkerFiles %>', dest: '<%= conf.pkg.name %>.d3-force.worker.js' } }, uglify: { jsmin: { options: { mangle: true, compress: true, sourceMap: true, banner : '<%= conf.banner %>' }, src: '<%= conf.pkg.name %>.js', dest: '<%= conf.pkg.name %>.min.js' } }, jscs: { old: { src: ['<%= conf.spec %>/**/*.js'], options: { validateIndentation: 4 } }, source: { src: ['<%= conf.src %>/**/*.js', '!<%= conf.src %>/{banner,footer}.js', 'Gruntfile.js', 'grunt/*.js', '<%= conf.web %>/stock.js'], options: { config: '.jscsrc' } } }, jshint: { source: { src: ['<%= conf.src %>/**/*.js', 'Gruntfile.js', 'grunt/*.js', '<%= conf.web %>/stock.js'], options: { jshintrc: '.jshintrc', ignores: ['<%= conf.src %>/banner.js', '<%= conf.src %>/footer.js'] } } }, watch: { scripts: { files: ['<%= conf.src %>/**/*.js', '*.js', 'dc.graph.css'], tasks: ['build', 'copy'] }, docs: { files: ['welcome.md', '<%= conf.src %>/**/*.js', 'dc.graph.css'], tasks: ['docs'] }, reload: { files: ['<%= conf.pkg.name %>.js', '<%= conf.pkg.name %>css', '<%= conf.web %>/js/<%= conf.pkg.name %>.js', '<%= conf.web %>/css/<%= conf.pkg.name %>.css', '<%= conf.pkg.name %>.min.js'], options: { livereload: true } } }, connect: { server: { options: { port: process.env.PORT || 8888, base: '.' } } }, jsdoc: { dist: { src: ['welcome.md', '<%= conf.src %>/**/*.js', '!<%= conf.src %>/{banner,footer}.js'], options: { destination: 'web/docs/html', template: 'node_modules/ink-docstrap/template', configure: 'jsdoc.conf.json' } } }, jsdoc2md: { dist: { src: 'dc.graph.js', dest: 'web/docs/api-latest.md' } }, copy: { 'dc-to-gh': { files: [ { nonull: true, expand: true, flatten: true, src: [ '<%= conf.pkg.name %>.css', 'node_modules/bootstrap/dist/css/bootstrap.css', 'node_modules/dc/dc.css', 'node_modules/jquery-ui-dist/jquery-ui.css', 'node_modules/x-editable/dist/jqueryui-editable/css/jqueryui-editable.css' ], dest: '<%= conf.web %>/css/' }, { expand: true, flatten: true, nonull: true, src: [ 'node_modules/jquery-ui-dist/images/*' ], dest: '<%= conf.web %>/css/images' }, { expand: true, flatten: true, nonull: true, src: [ 'node_modules/x-editable/dist/jqueryui-editable/img/*' ], dest: '<%= conf.web %>/img' }, { expand: true, flatten: true, nonull: true, src: [ 'node_modules/ionicons/dist/ionicons/svg/md-*' ], dest: '<%= conf.web %>/img/ionicons' }, { nonull: true, expand: true, flatten: true, src: [ '<%= conf.pkg.name %>.js', '<%= conf.pkg.name %>.js.map', '<%= conf.pkg.name %>.min.js', '<%= conf.pkg.name %>.min.js.map', '<%= conf.pkg.name %>.cola.worker.js', '<%= conf.pkg.name %>.cola.worker.js.map', '<%= conf.pkg.name %>.dagre.worker.js', '<%= conf.pkg.name %>.dagre.worker.js.map', '<%= conf.pkg.name %>.d3v4-force.worker.js', '<%= conf.pkg.name %>.d3v4-force.worker.js.map', '<%= conf.pkg.name %>.d3-force.worker.js', '<%= conf.pkg.name %>.d3-force.worker.js.map', 'd3.flexdivs.js', 'dc.graph.tracker.domain.js', 'd3v4-force.js', 'lysenko-interval-tree.js', 'yoga-layout.js', 'querystring.js', 'sync-url-options.js', 'chart.registry.js', 'timeline.js', 'node_modules/bootstrap/dist/js/bootstrap.js', 'node_modules/crossfilter2/crossfilter.js', 'node_modules/css-layout/dist/css-layout.js', 'node_modules/d3/d3.js', 'node_modules/dc/dc.js', 'node_modules/graphlib-dot/dist/graphlib-dot.js', 'node_modules/jquery/dist/jquery.js', 'node_modules/jquery-ui-dist/jquery-ui.js', 'node_modules/lodash/lodash.js', 'node_modules/metagraph/metagraph.js', 'node_modules/queue-async/build/queue.js', 'node_modules/dagre/dist/dagre.js', 'node_modules/webcola/WebCola/cola.js', 'node_modules/viz.js/viz.js', 'node_modules/x-editable/dist/jqueryui-editable/js/jqueryui-editable.js' ], dest: '<%= conf.web %>/js/' }, { nonull: true, src: 'node_modules/promise-polyfill/dist/polyfill.js', dest: '<%= conf.web %>/js/promise-polyfill.js' }, { nonull: true, src: 'node_modules/classlist-polyfill/src/index.js', dest: '<%= conf.web %>/js/classlist-polyfill.js' }, { nonull: true, src: 'node_modules/@fortawesome/fontawesome-free/css/all.css', dest: '<%= conf.web %>/css/fontawesome-all.css' }, { expand: true, flatten: true, src: [ 'node_modules/@fortawesome/fontawesome-free/webfonts/*' ], dest: '<%= conf.web %>/webfonts/' }, { nonull: true, src: 'node_modules/d3-tip/index.js', dest: '<%= conf.web %>/js/d3-tip.js' }, { nonull: true, src: 'node_modules/d3-tip/examples/example-styles.css', dest: '<%= conf.web %>/css/d3-tip.css' } ] } }, 'gh-pages': { options: { base: '<%= conf.web %>', message: 'Synced from from master branch.' }, src: ['**'] }, shell: { merge: { command: function (pr) { return [ 'git fetch origin', 'git checkout master', 'git reset --hard origin/master', 'git fetch origin', 'git merge --no-ff origin/pr/' + pr + ' -m \'Merge pull request #' + pr + '\'' ].join('&&'); }, options: { stdout: true, failOnError: true } }, amend: { command: 'git commit -a --amend --no-edit', options: { stdout: true, failOnError: true } }, hooks: { command: 'cp -n scripts/pre-commit.sh .git/hooks/pre-commit' + ' || echo \'Cowardly refusing to overwrite your existing git pre-commit hook.\'' } } }); // custom tasks grunt.registerTask('merge', 'Merge a github pull request.', function (pr) { grunt.log.writeln('Merge Github Pull Request #' + pr); grunt.task.run(['shell:merge:' + pr, 'test' , 'shell:amend']); }); grunt.registerTask('test-stock-example', 'Test a new rendering of the stock example web page against a ' + 'baseline rendering', function (option) { require('./regression/stock-regression-test.js').testStockExample(this.async(), option === 'diff'); }); grunt.registerTask('update-stock-example', 'Update the baseline stock example web page.', function () { require('./regression/stock-regression-test.js').updateStockExample(this.async()); }); // task aliases grunt.registerTask('build', ['concat', 'uglify']); grunt.registerTask('docs', ['build', 'copy', 'jsdoc', 'jsdoc2md']); grunt.registerTask('web', ['docs', 'gh-pages']); grunt.registerTask('server', ['build', 'copy', 'connect:server', 'watch:scripts']); grunt.registerTask('server:docs', ['docs', 'connect:server', 'watch:docs']); grunt.registerTask('lint', ['build', 'jshint', 'jscs']); grunt.registerTask('default', ['build', 'shell:hooks']); grunt.registerTask('doc-debug', ['build', 'jsdoc', 'jsdoc2md', 'connect:server', 'watch:docs']); }; module.exports.jsFiles = [ 'src/banner.js', // NOTE: keep this first 'src/core.js', 'src/utils.js', 'src/depth_first_traversal.js', 'src/generate_objects.js', 'src/shape.js', 'src/arrows.js', 'src/node_contents.js', 'src/diagram.js', 'src/render_svg.js', 'src/render_webgl.js', 'src/engine.js', 'src/webworker_layout.js', 'src/graphviz_attrs.js', 'src/cola_layout.js', 'src/dagre_layout.js', 'src/tree_layout.js', 'src/graphviz_layout.js', 'src/d3_force_layout.js', 'src/d3v4_force_layout.js', 'src/flexbox_layout.js', 'src/manual_layout.js', 'src/layered_layout.js', 'src/place_ports.js', 'src/grid.js', 'src/annotate_layers.js', 'src/troubleshoot.js', 'src/validate.js', 'src/legend.js', 'src/constraint_pattern.js', 'src/tree_positions.js', 'src/tree_constraints.js', 'src/mode.js', 'src/tip.js', 'src/dropdown.js', 'src/keyboard.js', 'src/edit_text.js', 'src/brush.js', 'src/select_things.js', 'src/select_nodes.js', 'src/select_edges.js', 'src/select_ports.js', 'src/move_nodes.js', 'src/fix_nodes.js', 'src/filter_selection.js', 'src/delete_things.js', 'src/delete_nodes.js', 'src/label_things.js', 'src/label_nodes.js', 'src/label_edges.js', 'src/highlight_things_group.js', 'src/highlight_things.js', 'src/highlight_neighbors_group.js', 'src/highlight_neighbors.js', 'src/highlight_radius.js', 'src/highlight_paths_group.js', 'src/highlight_paths.js', 'src/spline_paths.js', 'src/draw_clusters.js', 'src/expand_collapse.js', 'src/shown_hidden.js', 'src/expanded_hidden.js', 'src/draw_graphs.js', 'src/match_ports.js', 'src/match_opposites.js', 'src/wildcard_ports.js', 'src/symbol_port_style.js', 'src/load_graph.js', 'src/munge_graph.js', 'src/flat_group.js', 'src/convert.js', 'src/transform.js', 'src/path_reader.js', 'src/path_selector.js', 'src/generate.js', 'src/supergraph.js', 'src/line_breaks.js', 'src/type_graph.js', 'src/footer.js' // NOTE: keep this last ];