1 | 1 | var parseAndModify = (typeof exports === 'undefined' ? window.falafel : require("/Users/alexsouthern/Dropbox/blanket/lib/./falafel").falafel); |
2 | | |
3 | 1 | (typeof exports === 'undefined' ? window : exports).blanket = (function(){ |
4 | 1 | var linesToAddTracking = [ |
5 | | "ExpressionStatement", |
6 | | "LabeledStatement" , |
7 | | "BreakStatement" , |
8 | | "ContinueStatement" , |
9 | | "VariableDeclaration", |
10 | | "ReturnStatement" , |
11 | | "ThrowStatement" , |
12 | | "Line", |
13 | | "TryStatement" , |
14 | | "FunctionDeclaration" , |
15 | | "IfStatement" , |
16 | | "WhileStatement" , |
17 | | "DoWhileStatement" , |
18 | | "ForStatement" , |
19 | | "ForInStatement" , |
20 | | "SwitchStatement" , |
21 | | "WithStatement" |
22 | | ], |
23 | | linesToAddBrackets = [ |
24 | | "IfStatement" , |
25 | | |
26 | | "WhileStatement" , |
27 | | "DoWhileStatement" , |
28 | | "ForStatement" , |
29 | | "ForInStatement" , |
30 | | "WithStatement" |
31 | | ], |
32 | | covVar = (typeof window === 'undefined' ? "_$jscoverage" : "window._$blanket" ), |
33 | | blanket = { |
34 | | loadOnly: "", |
35 | | instrument: function(config, next){ |
36 | 2 | var inFile = config.inputFile, |
37 | | inFileName = config.inputFileName; |
38 | 2 | var sourceArray = this._prepareSource(inFile); |
39 | 2 | blanket._trackingArraySetup=[]; |
40 | 2 | var instrumented = parseAndModify(inFile,{loc:true,comment:true}, this._addTracking,inFileName); |
41 | 2 | instrumented = this._trackingSetup(inFileName,sourceArray)+instrumented; |
42 | 2 | next(instrumented); |
43 | | }, |
44 | | _trackingArraySetup: [], |
45 | | _prepareSource: function(source){ |
46 | 3 | return source.replace(/'/g,"\'").replace(/(
|
|
)/gm,"
").split('
'); |
47 | | }, |
48 | | _trackingSetup: function(filename,sourceArray){ |
49 | | |
50 | 3 | var sourceString = sourceArray.join("',
'"); |
51 | 3 | var intro = "if (typeof "+covVar+" === 'undefined') "+covVar+" = {};
"; |
52 | 3 | intro += "if (typeof "+covVar+"['"+filename+"'] === 'undefined'){"; |
53 | | |
54 | 3 | intro += covVar+"['"+filename+"']=[];
"; |
55 | 3 | intro += covVar+"['"+filename+"'].source=['"+sourceString+"'];
"; |
56 | 1 | //initialize array values |
57 | 3 | blanket._trackingArraySetup.sort().forEach(function(item){ |
58 | 12 | intro += covVar+"['"+filename+"']["+item+"]=0;
"; |
59 | | }); |
60 | | |
61 | 3 | intro += "}"; |
62 | 3 | return intro; |
63 | | }, |
64 | | _blockifyIf: function(node){ |
65 | | |
66 | 87 | if (linesToAddBrackets.indexOf(node.type) > -1){ |
67 | 7 | var bracketsExistObject = node.consequent || node.body; |
68 | 7 | var bracketsExistAlt = node.alternate; |
69 | 7 | if( bracketsExistAlt && bracketsExistAlt.type != "BlockStatement") { |
70 | 2 | bracketsExistAlt.update("{
"+bracketsExistAlt.source()+"}
"); |
71 | | } |
72 | 7 | if( bracketsExistObject && bracketsExistObject.type != "BlockStatement") { |
73 | 6 | bracketsExistObject.update("{
"+bracketsExistObject.source()+"}
"); |
74 | | } |
75 | | } |
76 | | }, |
77 | | _addTracking: function (node,filename) { |
78 | 87 | blanket._blockifyIf(node); |
79 | 87 | if (linesToAddTracking.indexOf(node.type) > -1){ |
80 | 23 | if (node.type == "VariableDeclaration" && |
81 | | (node.parent.type == "ForStatement" || node.parent.type == "ForInStatement")){ |
82 | 0 | return; |
83 | | } |
84 | 23 | if (node.loc && node.loc.start){ |
85 | 23 | node.update(covVar+"['"+filename+"']["+node.loc.start.line+"]++;
"+node.source()); |
86 | 23 | blanket._trackingArraySetup.push(node.loc.start.line); |
87 | | }else{ |
88 | 1 | //I don't think we can handle a node with no location |
89 | 0 | throw new Error("The instrumenter encountered a node with no location: "+Object.keys(node)); |
90 | | } |
91 | | |
92 | | } |
93 | | }, |
94 | | report: function(coverage_data){ |
95 | 0 | coverage_data.files = (typeof window === 'undefined' ? _$jscoverage : window._$blanket ); |
96 | 0 | Reporter(coverage_data); |
97 | | } |
98 | | }; |
99 | 1 | return blanket; |
100 | | })(); |
101 | | |
102 | | |
103 | | |