jsExecutionTransformer.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. var debug = require('debug')('ylt:jsExecutionTransformer');
  2. var jsExecutionTransformer = function() {
  3. this.transform = function(data) {
  4. var javascriptExecutionTree = {};
  5. debug('Starting JS execution transformation');
  6. try {
  7. javascriptExecutionTree = JSON.parse(data.toolsResults.phantomas.offenders.javascriptExecutionTree[0]);
  8. if (javascriptExecutionTree.children) {
  9. javascriptExecutionTree.children.forEach(function(node) {
  10. // Mark abnormal things with a warning flag
  11. var contextLenght = (node.data.callDetails && node.data.callDetails.context) ? node.data.callDetails.context.length : null;
  12. if ((node.data.type === 'jQuery - bind' && contextLenght > 5) ||
  13. node.data.resultsNumber === 0 ||
  14. contextLenght === 0) {
  15. node.warning = true;
  16. }
  17. // Mark errors with an error flag
  18. if (node.data.type === 'error' || node.data.type === 'jQuery version change') {
  19. node.error = true;
  20. }
  21. // Mark a performance flag
  22. if (['domInteractive', 'domContentLoaded', 'domContentLoadedEnd', 'domComplete'].indexOf(node.data.type) >= 0) {
  23. node.windowPerformance = true;
  24. }
  25. // Read the execution tree and adjust the navigation timings (cause their not very well synchronised)
  26. switch(node.data.type) {
  27. case 'domInteractive':
  28. data.toolsResults.phantomas.metrics.domInteractive = node.data.timestamp;
  29. break;
  30. case 'domContentLoaded':
  31. data.toolsResults.phantomas.metrics.domContentLoaded = node.data.timestamp;
  32. break;
  33. case 'domContentLoadedEnd':
  34. data.toolsResults.phantomas.metrics.domContentLoadedEnd = node.data.timestamp;
  35. break;
  36. case 'domComplete':
  37. data.toolsResults.phantomas.metrics.domComplete = node.data.timestamp;
  38. break;
  39. }
  40. });
  41. }
  42. debug('JS execution transformation complete');
  43. } catch(err) {
  44. throw err;
  45. }
  46. return javascriptExecutionTree;
  47. };
  48. };
  49. module.exports = new jsExecutionTransformer();