diff --git a/package.json b/package.json index 2cc71f74b1d..924d42ab6f1 100644 --- a/package.json +++ b/package.json @@ -105,6 +105,7 @@ "karma-coverage": "^1.0.0", "karma-firefox-launcher": "^1.0.0", "karma-jasmine": "^1.0.2", + "madge": "^0.6.0", "node-sass": "^3.4.1", "npm-link-check": "^1.1.0", "open": "0.0.5", diff --git a/tasks/test_syntax.js b/tasks/test_syntax.js index 378c232ed1a..76d9f631f30 100644 --- a/tasks/test_syntax.js +++ b/tasks/test_syntax.js @@ -3,6 +3,7 @@ var fs = require('fs'); var falafel = require('falafel'); var glob = require('glob'); +var madge = require('madge'); var constants = require('./util/constants'); var srcGlob = path.join(constants.pathToSrc, '**/*.js'); @@ -14,6 +15,7 @@ var bundleTestGlob = path.join(constants.pathToJasmineBundleTests, '**/*.js'); assertJasmineSuites(); assertHeaders(); assertFileNames(); +assertCircularDeps(); // check for for focus and exclude jasmine blocks @@ -38,7 +40,7 @@ function assertJasmineSuites() { }); - log(logs); + log('no jasmine suites focus/exclude blocks', logs); }); } @@ -68,7 +70,7 @@ function assertHeaders() { } }); - log(logs); + log('correct headers in lib/ and src/', logs); }); } @@ -89,17 +91,38 @@ function assertFileNames() { } }); - log(logs); + log('lower case only file names', logs); }); } +// check circular dependencies +function assertCircularDeps() { + var dependencyObject = madge(constants.pathToSrc); + var circularDeps = dependencyObject.circular().getArray(); + var logs = []; + + // as of v1.17.0 - 2016/09/08 + // see https://github.com/plotly/plotly.js/milestone/9 + // for more details + var MAX_ALLOWED_CIRCULAR_DEPS = 33; + + if(circularDeps.length > MAX_ALLOWED_CIRCULAR_DEPS) { + logs.push('some new circular dependencies were added to src/'); + } + + log('circular dependencies', logs); +} + function combineGlobs(arr) { return '{' + arr.join(',') + '}'; } -function log(logs) { +function log(name, logs) { if(logs.length) { + console.error('test-syntax error [' + name + ']\n'); throw new Error('\n' + logs.join('\n') + '\n'); } + + console.log('ok ' + name); }