瀏覽代碼

Circular dependency checker

sebavan 6 年之前
父節點
當前提交
534dcaa8f4
共有 5 個文件被更改,包括 120 次插入2 次删除
  1. 1 0
      Tools/Config/core.json
  2. 1 0
      Tools/Config/loaders.json
  3. 3 2
      Tools/Gulp/gulpfile.js
  4. 114 0
      Tools/Gulp/tasks/gulpTasks-dependencies.js
  5. 1 0
      package.json

文件差異過大導致無法顯示
+ 1 - 0
Tools/Config/core.json


+ 1 - 0
Tools/Config/loaders.json

@@ -0,0 +1 @@
+{"../../loaders/src/glTF/1.0/glTFLoader.ts":["../../loaders/src/glTF/1.0/glTFLoaderExtension.ts"],"../../loaders/src/glTF/1.0/glTFLoaderExtension.ts":["../../loaders/src/glTF/1.0/glTFLoader.ts"]}

+ 3 - 2
Tools/Gulp/gulpfile.js

@@ -17,6 +17,7 @@ require("./tasks/gulpTasks-intellisense");
 require("./tasks/gulpTasks-tests");
 require("./tasks/gulpTasks-tests");
 require("./tasks/gulpTasks-remapPaths");
 require("./tasks/gulpTasks-remapPaths");
 require("./tasks/gulpTasks-npmPackages");
 require("./tasks/gulpTasks-npmPackages");
+require("./tasks/gulpTasks-dependencies");
 
 
 /**
 /**
  * Full TsLint.
  * Full TsLint.
@@ -31,7 +32,7 @@ gulp.task("importLint", gulp.series("typescript-libraries-importLint"));
 /**
 /**
  * Full Lint.
  * Full Lint.
  */
  */
-gulp.task("fullLint", gulp.series("tsLint", "importLint"));
+gulp.task("fullLint", gulp.series("tsLint", "importLint", "circularDependencies"));
 
 
 /**
 /**
  * Validate compile the code and check the comments and style case convention through typedoc
  * Validate compile the code and check the comments and style case convention through typedoc
@@ -61,4 +62,4 @@ gulp.task("npmPackages", gulp.series("npmPackages-all"));
 /**
 /**
  * The default task, concat and min the main BJS files.
  * The default task, concat and min the main BJS files.
  */
  */
-gulp.task("default", gulp.series("tsLint", "importLint", "typescript-all", "intellisense", "typedoc-all", "tests-all"));
+gulp.task("default", gulp.series("tsLint", "importLint", "circularDependencies", "typescript-all", "intellisense", "typedoc-all", "tests-all"));

+ 114 - 0
Tools/Gulp/tasks/gulpTasks-dependencies.js

@@ -0,0 +1,114 @@
+// Import Dependencies.
+const gulp = require("gulp");
+const path = require("path");
+const depcruise = require('dependency-cruiser');
+const colorConsole = require('../../NodeHelpers/colorConsole');
+
+// Read the full config.
+const config = require("../../Config/config.js");
+
+/*
+ * TsLint all typescript files from the src directory.
+ */
+const dependencies = function(settings, moduleName, cb) {
+    var cruiseResult = depcruise.cruise(
+        [path.relative(path.resolve("./"), settings.computed.mainDirectory)],
+        {
+            validate: true,
+            ruleSet: {
+                forbidden: [{
+                    name: 'no-circular',
+                    comment: 'circular dependencies will make you dizzy',
+                    severity: 'error',
+                    from: {},
+                    to: {
+                        circular: true
+                    }
+                }],
+                options: {
+                    doNotFollow: "node_modules",
+                    tsConfig: {
+                        fileName: settings.computed.tsConfigPath
+                    },
+                    webpackConfig: {
+                        fileName: settings.computed.webpackConfigPath
+                    }
+                }
+            }
+        });
+
+    if (cruiseResult.summary.error > 0) {
+        var errors = cruiseResult.summary.violations;
+
+        // Comparaison to remove once all done.
+        // Comparaison to remove once all done.
+        // Comparaison to remove once all done.
+        var comparaisonData = { };
+        for (let error of cruiseResult.summary.violations) {
+            comparaisonData[error.from] = comparaisonData[error.from] || [];
+            comparaisonData[error.from].push(error.to);
+        }
+
+        var fs = require("fs-extra");
+        var baseValidationFile = "../../Config/" + moduleName + ".json";
+        if (fs.existsSync(path.resolve(__dirname, baseValidationFile))) {
+            var baseValidation = require(baseValidationFile);
+            errors = [];
+            for (let error in comparaisonData) {
+                if (!baseValidation[error] || JSON.stringify(comparaisonData[error])!=JSON.stringify(baseValidation[error])) {
+                    errors.push({
+                        from: error.from,
+                        to: error.to
+                    });
+                }
+            }
+        }
+        else {
+            errors = cruiseResult.summary.violations;
+        }
+
+        var minimist = require("minimist");
+        var commandLineOptions = minimist(process.argv.slice(2), {
+            boolean: ["saveCircular"]
+        });
+        if (commandLineOptions.saveCircular) {
+            fs.writeJSONSync(path.resolve(__dirname, baseValidationFile), comparaisonData);
+        }
+        colorConsole.warn(`Still circular dependencies in ${moduleName.cyan}: ${("" + cruiseResult.summary.error).red}`);
+        cb();
+        return;
+        // End Comparaison to remove once all done.
+        // End Comparaison to remove once all done.
+        // End Comparaison to remove once all done.
+
+        colorConsole.error(`New circular dependencies in ${moduleName.cyan}: ${("" + cruiseResult.summary.error).red}`);
+        for (let error of errors) {
+            colorConsole.error(`    From: '${error.from.replace(/\.\.\//g, "").yellow}' To: '${error.to.replace(/\.\.\//g, "").yellow}'`);
+        }
+        process.exit(1);
+    }
+    
+    colorConsole.success("No New circular dependencies.");
+    cb();
+}
+
+/**
+ * Dynamic module linting for external library (mat, post processes, ...).
+ */
+config.lintModules.map(function(module) {
+    // Task will be like moduleName-circularDependencies
+    gulp.task(module + "-circularDependencies", function(cb) {
+        var settings = config[module];
+
+        dependencies(settings, module, cb);
+    });
+});
+
+/**
+ * Full Librairies tsLint.
+ */
+gulp.task("circularDependencies",
+    gulp.series(config.lintModules.map((module) => {
+        return module + "-circularDependencies";
+    })
+));

+ 1 - 0
package.json

@@ -56,6 +56,7 @@
         "color-support": "^1.1.3",
         "color-support": "^1.1.3",
         "css-loader": "^1.0.0",
         "css-loader": "^1.0.0",
         "del": "3.0.0",
         "del": "3.0.0",
+        "dependency-cruiser": "^4.9.0",
         "dts-bundle": "^0.7.3",
         "dts-bundle": "^0.7.3",
         "file-loader": "~2.0.0",
         "file-loader": "~2.0.0",
         "fs-extra": "^5.0.0",
         "fs-extra": "^5.0.0",