UNPKG

9.5 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', {
4 value: true
5});
6
7var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
8
9var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
10
11var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
12
13var _get = function get(_x4, _x5, _x6) { var _again = true; _function: while (_again) { var object = _x4, property = _x5, receiver = _x6; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x4 = parent; _x5 = property; _x6 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
14
15function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
16
17function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
18
19function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
20
21var _istanbul = require('istanbul');
22
23var _istanbul2 = _interopRequireDefault(_istanbul);
24
25var _babelCore = require('babel-core');
26
27var _esprima = require('esprima');
28
29var _esprima2 = _interopRequireDefault(_esprima);
30
31var _escodegen = require('escodegen');
32
33var _escodegen2 = _interopRequireDefault(_escodegen);
34
35var _sourceMap = require('source-map');
36
37var POSITIONS = ['start', 'end'];
38
39var Instrumenter = (function (_istanbul$Instrumenter) {
40 _inherits(Instrumenter, _istanbul$Instrumenter);
41
42 function Instrumenter() {
43 var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
44
45 _classCallCheck(this, Instrumenter);
46
47 _get(Object.getPrototypeOf(Instrumenter.prototype), 'constructor', this).call(this);
48
49 _istanbul2['default'].Instrumenter.call(this, options);
50
51 this.babelOptions = _extends({
52 sourceMap: true
53 }, options && options.babel || {});
54 }
55
56 _createClass(Instrumenter, [{
57 key: 'instrumentSync',
58 value: function instrumentSync(code, fileName) {
59
60 var result = this._r = (0, _babelCore.transform)(code, _extends({}, this.babelOptions, { filename: fileName }));
61 this._babelMap = new _sourceMap.SourceMapConsumer(result.map);
62
63 // PARSE
64 var program = _esprima2['default'].parse(result.code, {
65 loc: true,
66 range: true,
67 tokens: this.opts.preserveComments,
68 comment: true
69 });
70
71 if (this.opts.preserveComments) {
72 program = _escodegen2['default'].attachComments(program, program.comments, program.tokens);
73 }
74
75 return this.instrumentASTSync(program, fileName, code);
76 }
77 }, {
78 key: 'getPreamble',
79 value: function getPreamble(sourceCode, emitUseStrict) {
80 var _this = this;
81
82 [['s', 'statementMap'], ['f', 'fnMap'], ['b', 'branchMap']].forEach(function (_ref) {
83 var _ref2 = _slicedToArray(_ref, 2);
84
85 var metricName = _ref2[0];
86 var metricMapName = _ref2[1];
87 var metrics = _this.coverState[metricName];
88 var metricMap = _this.coverState[metricMapName];
89
90 var transformFctName = '_' + metricMapName + 'Transformer';
91 var transformedMetricMap = _this[transformFctName](metricMap, metrics);
92 _this.coverState[metricMapName] = transformedMetricMap;
93 });
94
95 return _get(Object.getPrototypeOf(Instrumenter.prototype), 'getPreamble', this).call(this, sourceCode, emitUseStrict);
96 }
97
98 ////
99
100 }, {
101 key: '_statementMapTransformer',
102 value: function _statementMapTransformer(metrics) {
103 var _this2 = this;
104
105 return Object.keys(metrics).map(function (index) {
106 return metrics[index];
107 }).map(function (statementMeta) {
108 var _getMetricOriginalLocations2 = _this2._getMetricOriginalLocations([statementMeta]);
109
110 var _getMetricOriginalLocations22 = _slicedToArray(_getMetricOriginalLocations2, 1);
111
112 var location = _getMetricOriginalLocations22[0];
113
114 return location;
115 }).reduce(this._arrayToArrayLikeObject, {});
116 }
117 }, {
118 key: '_fnMapTransformer',
119 value: function _fnMapTransformer(metrics) {
120 var _this3 = this;
121
122 return Object.keys(metrics).map(function (index) {
123 return metrics[index];
124 }).map(function (fnMeta) {
125 var _getMetricOriginalLocations3 = _this3._getMetricOriginalLocations([fnMeta.loc]);
126
127 var _getMetricOriginalLocations32 = _slicedToArray(_getMetricOriginalLocations3, 1);
128
129 var loc = _getMetricOriginalLocations32[0];
130
131 // Force remove the last skip key
132 if (fnMeta.skip === undefined) {
133 delete fnMeta.skip;
134 if (loc.skip !== undefined) {
135 fnMeta.skip = loc.skip;
136 }
137 }
138
139 return _extends({}, fnMeta, { loc: loc });
140 }).reduce(this._arrayToArrayLikeObject, {});
141 }
142 }, {
143 key: '_branchMapTransformer',
144 value: function _branchMapTransformer(metrics) {
145 var _this4 = this;
146
147 return Object.keys(metrics).map(function (index) {
148 return metrics[index];
149 }).map(function (branchMeta) {
150 return _extends({}, branchMeta, {
151 locations: _this4._getMetricOriginalLocations(branchMeta.locations)
152 });
153 }).reduce(this._arrayToArrayLikeObject, {});
154 }
155
156 ////
157
158 }, {
159 key: '_getMetricOriginalLocations',
160 value: function _getMetricOriginalLocations() {
161 var _this5 = this;
162
163 var metricLocations = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
164
165 var o = { line: 0, column: 0 };
166
167 return metricLocations.map(function (generatedPositions) {
168 return [_this5._getOriginalPositionsFor(generatedPositions), generatedPositions];
169 }).map(function (_ref3) {
170 var _ref32 = _slicedToArray(_ref3, 2);
171
172 var _ref32$0 = _ref32[0];
173 var start = _ref32$0.start;
174 var end = _ref32$0.end;
175 var generatedPosition = _ref32[1];
176
177 var postitions = [start.line, start.column, end.line, end.column];
178 var isValid = postitions.every(function (n) {
179 return n !== null;
180 });
181
182 // Matches behavior in _fnMapTransformer above.
183 if (generatedPosition.skip === undefined) {
184 delete generatedPosition.skip;
185 }
186
187 return isValid ? _extends({}, generatedPosition, { start: start, end: end }) : { start: o, end: o, skip: true };
188 });
189 }
190 }, {
191 key: '_getOriginalPositionsFor',
192 value: function _getOriginalPositionsFor() {
193 var _this6 = this;
194
195 var generatedPositions = arguments.length <= 0 || arguments[0] === undefined ? { start: {}, end: {} } : arguments[0];
196
197 return POSITIONS.map(function (position) {
198 return [generatedPositions[position], position];
199 }).reduce(function (originalPositions, _ref4) {
200 var _ref42 = _slicedToArray(_ref4, 2);
201
202 var generatedPosition = _ref42[0];
203 var position = _ref42[1];
204
205 var originalPosition = _this6._babelMap.originalPositionFor(generatedPosition);
206 // remove extra keys
207 delete originalPosition.name;
208 delete originalPosition.source;
209 originalPositions[position] = originalPosition;
210 return originalPositions;
211 }, {});
212 }
213 }, {
214 key: '_arrayToArrayLikeObject',
215 value: function _arrayToArrayLikeObject(arrayLikeObject, item, index) {
216 arrayLikeObject[index + 1] = item;
217 return arrayLikeObject;
218 }
219 }]);
220
221 return Instrumenter;
222})(_istanbul2['default'].Instrumenter);
223
224exports.Instrumenter = Instrumenter;
\No newline at end of file