runner.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. var Q = require('q');
  2. var debug = require('debug')('ylt:runner');
  3. var phantomasWrapper = require('./tools/phantomas/phantomasWrapper');
  4. var colorDiff = require('./tools/colorDiff');
  5. var domAccessAgregator = require('./tools/domAccessAgregator');
  6. var mediaQueriesChecker = require('./tools/mediaQueriesChecker');
  7. var redownload = require('./tools/redownload/redownload');
  8. var rulesChecker = require('./rulesChecker');
  9. var scoreCalculator = require('./scoreCalculator');
  10. var Runner = function(params) {
  11. 'use strict';
  12. var deferred = Q.defer();
  13. // The pivot format
  14. var data = {
  15. params: params,
  16. toolsResults: {}
  17. };
  18. // Execute Phantomas first
  19. phantomasWrapper.execute(data)
  20. // For the progress bar
  21. .progress(function(event) {
  22. if (event === 'domReady') {
  23. deferred.notify({
  24. estimatedProgress: 0.15,
  25. milestone: 'domReady'
  26. });
  27. }
  28. if (event === 'domComplete') {
  29. deferred.notify({
  30. estimatedProgress: 0.25,
  31. milestone: 'domComplete'
  32. });
  33. }
  34. })
  35. .then(function(phantomasResults) {
  36. // For the progress bar
  37. deferred.notify({
  38. estimatedProgress: 0.4,
  39. milestone: 'phantomas'
  40. });
  41. data.toolsResults.phantomas = phantomasResults;
  42. // Mix all DOM Access metrics together
  43. data = domAccessAgregator.agregate(data);
  44. // Compare colors
  45. data = colorDiff.compareAllColors(data);
  46. // Check media queries
  47. data = mediaQueriesChecker.analyzeMediaQueries(data);
  48. // Redownload every file
  49. return redownload.recheckAllFiles(data)
  50. .progress(function(redownloadedProgress) {
  51. deferred.notify({
  52. estimatedProgress: 0.4 + redownloadedProgress * 0.55,
  53. milestone: 'phantomas'
  54. });
  55. });
  56. })
  57. .then(function(data) {
  58. // For the progress bar
  59. deferred.notify({
  60. estimatedProgress: 0.99,
  61. milestone: 'redownload'
  62. });
  63. // Fix: don't display Unicode ranges if the module is not present in Phantomas
  64. if (!data.toolsResults.phantomas.metrics.differentCharacters) {
  65. delete data.toolsResults.redownload.metrics.unusedUnicodeRanges;
  66. delete data.toolsResults.redownload.offenders.unusedUnicodeRanges;
  67. }
  68. // Rules checker
  69. var policies = require('./metadata/policies');
  70. data.rules = rulesChecker.check(data, policies);
  71. // Scores calculator
  72. var scoreProfileGeneric = require('./metadata/scoreProfileGeneric.json');
  73. data.scoreProfiles = {
  74. generic : scoreCalculator.calculate(data, scoreProfileGeneric, true)
  75. };
  76. // Calculate "If you fix this issue, your new score is..." on each rule
  77. debug('Calculate "If you fix this issue..." scores');
  78. Object.keys(data.rules).forEach(function(ruleName) {
  79. // Save current values
  80. var oldScore = data.rules[ruleName].score;
  81. var oldAbnormalityScore = data.rules[ruleName].abnormalityScore;
  82. // Simulate a 100/100 score on a specific rule
  83. data.rules[ruleName].score = 100;
  84. data.rules[ruleName].abnormalityScore = 0;
  85. // Calculate new score
  86. data.rules[ruleName].globalScoreIfFixed = scoreCalculator.calculate(data, scoreProfileGeneric, false).globalScore;
  87. // Revert values
  88. data.rules[ruleName].score = oldScore;
  89. data.rules[ruleName].abnormalityScore = oldAbnormalityScore;
  90. });
  91. debug('Calculating is finished');
  92. if (data.toolsResults.phantomas.offenders.blockedRequests) {
  93. data.blockedRequests = data.toolsResults.phantomas.offenders.blockedRequests;
  94. }
  95. // Report WordPress detection
  96. if (data.toolsResults.redownload.metrics.isWordPress === true) {
  97. data.frameworks = {isWordPress: true};
  98. }
  99. // Finished!
  100. deferred.resolve(data);
  101. })
  102. .fail(function(err) {
  103. debug('Run failed');
  104. debug(err);
  105. deferred.reject(err);
  106. });
  107. return deferred.promise;
  108. };
  109. module.exports = Runner;