gulpTasks-dependencies.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Import Dependencies.
  2. const gulp = require("gulp");
  3. const path = require("path");
  4. const depcruise = require('dependency-cruiser');
  5. const colorConsole = require('../../NodeHelpers/colorConsole');
  6. // Read the full config.
  7. const config = require("../../Config/config.js");
  8. /*
  9. * TsLint all typescript files from the src directory.
  10. */
  11. const dependencies = function(settings, moduleName, cb) {
  12. var cruiseResult = depcruise.cruise(
  13. [path.relative(path.resolve("./"), settings.computed.mainDirectory)],
  14. {
  15. validate: true,
  16. ruleSet: {
  17. forbidden: [{
  18. name: 'no-circular',
  19. comment: 'circular dependencies will make you dizzy',
  20. severity: 'error',
  21. from: {},
  22. to: {
  23. circular: true
  24. }
  25. }],
  26. options: {
  27. doNotFollow: "node_modules",
  28. tsConfig: {
  29. fileName: settings.computed.tsConfigPath
  30. },
  31. webpackConfig: {
  32. fileName: settings.computed.webpackConfigPath
  33. }
  34. }
  35. }
  36. });
  37. if (cruiseResult.summary.error > 0) {
  38. var errors = cruiseResult.summary.violations;
  39. var errorCount = cruiseResult.summary.error;
  40. // Comparaison to remove once all done.
  41. // Comparaison to remove once all done.
  42. // Comparaison to remove once all done.
  43. var comparaisonData = { };
  44. for (let error of cruiseResult.summary.violations) {
  45. comparaisonData[error.from] = comparaisonData[error.from] || [];
  46. comparaisonData[error.from].push(error.to);
  47. }
  48. var fs = require("fs-extra");
  49. var baseValidationFile = "../../Config/tempCircularValidation/" + moduleName + ".json";
  50. if (fs.existsSync(path.resolve(__dirname, baseValidationFile))) {
  51. var baseValidation = require(baseValidationFile);
  52. errors = [];
  53. for (let error in comparaisonData) {
  54. if (!baseValidation[error]) {
  55. for (let errorTo of comparaisonData[error]) {
  56. errors.push({
  57. from: error,
  58. to: errorTo
  59. });
  60. }
  61. }
  62. else {
  63. if (JSON.stringify(comparaisonData[error])!=JSON.stringify(baseValidation[error])) {
  64. for (let errorTo of comparaisonData[error]) {
  65. if (baseValidation[error].indexOf(errorTo) === -1) {
  66. errors.push({
  67. from: error,
  68. to: errorTo
  69. });
  70. }
  71. }
  72. }
  73. }
  74. }
  75. errorCount = errors.length;
  76. if (errorCount === 0) {
  77. colorConsole.warn(`Still ${("" + cruiseResult.summary.error).yellow} to go.`);
  78. }
  79. }
  80. var minimist = require("minimist");
  81. var commandLineOptions = minimist(process.argv.slice(2), {
  82. boolean: ["saveCircular"]
  83. });
  84. if (commandLineOptions.saveCircular) {
  85. comparaisonData.errorCount = cruiseResult.summary.error;
  86. fs.writeJSONSync(path.resolve(__dirname, baseValidationFile), comparaisonData, {
  87. spaces: 4,
  88. EOL: '\n'
  89. });
  90. }
  91. // End Comparaison to remove once all done.
  92. // End Comparaison to remove once all done.
  93. // End Comparaison to remove once all done.
  94. if (errorCount > 0) {
  95. colorConsole.error(`New circular dependencies in ${moduleName.cyan}: ${("" + errorCount).red}`);
  96. for (let error of errors) {
  97. colorConsole.error(` From: '${error.from.replace(/\.\.\//g, "").yellow}' To: '${error.to.replace(/\.\.\//g, "").yellow}'`);
  98. }
  99. process.exit(1);
  100. }
  101. }
  102. colorConsole.success("No New circular dependencies.");
  103. cb();
  104. }
  105. /**
  106. * Dynamic module linting for external library (mat, post processes, ...).
  107. */
  108. config.lintModules.map(function(module) {
  109. // Task will be like moduleName-circularDependencies
  110. gulp.task(module + "-circularDependencies", function(cb) {
  111. var settings = config[module];
  112. dependencies(settings, module, cb);
  113. });
  114. });
  115. /**
  116. * Full Librairies tsLint.
  117. */
  118. gulp.task("circularDependencies",
  119. gulp.series(config.lintModules.map((module) => {
  120. return module + "-circularDependencies";
  121. })
  122. ));