@teamscale/javascript-instrumenter 0.0.1-beta.53 → 0.0.1-beta.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamscale/javascript-instrumenter",
3
- "version": "0.0.1-beta.53",
3
+ "version": "0.0.1-beta.54",
4
4
  "description": "JavaScript coverage instrumenter with coverage forwarding to a collector process",
5
5
  "main": "dist/src/main.js",
6
6
  "bin": "dist/src/main.js",
@@ -23,35 +23,35 @@
23
23
  "dist/**/*"
24
24
  ],
25
25
  "devDependencies": {
26
- "@babel/core": "^7.18.5",
27
- "@babel/plugin-transform-modules-commonjs": "^7.18.2",
28
- "@babel/preset-env": "^7.18.2",
26
+ "@babel/core": "^7.22.5",
27
+ "@babel/plugin-transform-modules-commonjs": "^7.22.5",
28
+ "@babel/preset-env": "^7.22.5",
29
29
  "@types/async": "^3.2.6",
30
30
  "@types/bunyan": "^1.8.8",
31
31
  "@types/convert-source-map": "^1.5.1",
32
32
  "@types/glob": "^7.1.3",
33
33
  "@types/istanbul-lib-instrument": "^1.7.4",
34
- "@types/jest": "^27.0.1",
34
+ "@types/jest": "^29.5.1",
35
35
  "@types/mkdirp": "^1.0.2",
36
36
  "@types/node": "^15.0.1",
37
37
  "@types/source-map": "^0.5.7",
38
38
  "@types/ws": "^7.4.4",
39
- "babel-jest": "^27.2.0",
39
+ "babel-jest": "^29.5.0",
40
40
  "esbuild": "^0.13.3",
41
41
  "esbuild-plugin-inline-worker": "^0.1.1",
42
- "jest": "^27.2.0",
42
+ "jest": "^29.5.0",
43
43
  "rimraf": "^3.0.2",
44
- "ts-jest": "^27.0.5",
44
+ "ts-jest": "^29.1.0",
45
45
  "ts-node": "^10.2.1",
46
46
  "tslib": "^2.2.0",
47
47
  "typescript": "^4.4.3"
48
48
  },
49
49
  "dependencies": {
50
- "@babel/generator": "^7.18.2",
51
- "@babel/parser": "^7.18.5",
52
- "@babel/traverse": "^7.18.6",
53
- "@babel/types": "^7.18.4",
54
- "@cqse/commons": "^0.0.1-beta.45",
50
+ "@babel/generator": "^7.22.5",
51
+ "@babel/parser": "^7.22.5",
52
+ "@babel/traverse": "^7.22.5",
53
+ "@babel/types": "^7.22.5",
54
+ "@cqse/commons": "0.0.1-beta.52",
55
55
  "@types/micromatch": "^4.0.2",
56
56
  "argparse": "^2.0.1",
57
57
  "async": "^3.2.4",
@@ -59,7 +59,7 @@
59
59
  "convert-source-map": "^1.7.0",
60
60
  "foreground-child": "^2.0.0",
61
61
  "glob": "^7.1.7",
62
- "istanbul-lib-instrument": "^5.2.0",
62
+ "istanbul-lib-instrument": "^5.2.1",
63
63
  "micromatch": "4.0.4",
64
64
  "mkdirp": "^1.0.4",
65
65
  "source-map": "0.7.4",
@@ -1 +1 @@
1
- {"version":3,"file":"Postprocessor.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/Postprocessor.ts"],"names":[],"mappings":"AAGA,OAAO,EAQN,cAAc,EASd,MAAM,cAAc,CAAC;AAqKtB;;;;;GAKG;AACH,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,EAClB,aAAa,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,OAAO,GAClD,MAAM,CAaR"}
1
+ {"version":3,"file":"Postprocessor.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/Postprocessor.ts"],"names":[],"mappings":"AAGA,OAAO,EAON,cAAc,EAUd,MAAM,cAAc,CAAC;AA4LtB;;;;;GAKG;AACH,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,EAClB,aAAa,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,OAAO,GAClD,MAAM,CAkBR"}
@@ -38,6 +38,9 @@ const fileIdSeqGenerator = (() => {
38
38
  }
39
39
  };
40
40
  })();
41
+ function isCoverageFunctionDefinition(path) {
42
+ return (0, types_1.isFunctionDeclaration)(path.node) && getIstanbulCoverageFunctionDeclarationName(path.node) !== undefined;
43
+ }
41
44
  function getIstanbulCoverageFunctionDeclarationName(node) {
42
45
  var _a;
43
46
  if (!(0, types_1.isFunctionDeclaration)(node)) {
@@ -55,25 +58,34 @@ function createFileIdMappingHandler() {
55
58
  const fileIdMap = new Map();
56
59
  return {
57
60
  enterPath(path) {
58
- var _a;
59
- if (!(0, types_1.isVariableDeclaration)(path.node)) {
61
+ if (!(0, types_1.isFunctionDeclaration)(path.node)) {
62
+ return;
63
+ }
64
+ const coverageFunctionName = getIstanbulCoverageFunctionDeclarationName(path.node);
65
+ if (!coverageFunctionName) {
60
66
  return;
61
67
  }
62
- const grandParentPath = (_a = path.parentPath) === null || _a === void 0 ? void 0 : _a.parentPath;
63
- const coverageFunctionName = getIstanbulCoverageFunctionDeclarationName(grandParentPath === null || grandParentPath === void 0 ? void 0 : grandParentPath.node);
64
- if (grandParentPath && coverageFunctionName) {
65
- const declaration = path.node;
66
- if (declaration.declarations.length === 1) {
67
- const declarator = declaration.declarations[0];
68
- if ((0, types_1.isIdentifier)(declarator.id) && declarator.id.name === 'hash') {
69
- // We take note of the hash that is stored within the `cov_*' function.
70
- const fileIdVarName = `_$f${fileIdSeqGenerator.next()}`;
71
- const fileId = declarator.init.value;
72
- fileIdMap.set(coverageFunctionName, fileIdVarName);
73
- grandParentPath.insertBefore(newStringConstDeclarationNode(fileIdVarName, fileId));
68
+ // From here onwards, we know that the path.node is a FunctionDeclaration
69
+ const body = path.node.body;
70
+ // Traverse the body of the function for VariableDeclarations
71
+ for (const statement of body.body) {
72
+ if ((0, types_1.isVariableDeclaration)(statement)) {
73
+ const declaration = statement;
74
+ if (declaration.declarations.length === 1) {
75
+ const declarator = declaration.declarations[0];
76
+ if ((0, types_1.isIdentifier)(declarator.id) && declarator.id.name === 'hash') {
77
+ // We take note of the hash that is stored within the `cov_*' function.
78
+ const fileIdVarName = `_$f${fileIdSeqGenerator.next()}`;
79
+ const fileId = declarator.init.value;
80
+ fileIdMap.set(coverageFunctionName, fileIdVarName);
81
+ const variableDeclaration = newStringConstDeclarationNode(fileIdVarName, fileId);
82
+ path.insertBefore(variableDeclaration);
83
+ }
74
84
  }
75
85
  }
76
86
  }
87
+ // Do not travers into the childs of this path.
88
+ path.skip();
77
89
  },
78
90
  getFileHashForCoverageObjectId(coverageObjectId) {
79
91
  return fileIdMap.get(coverageObjectId);
@@ -83,9 +95,6 @@ function createFileIdMappingHandler() {
83
95
  function createPartialInstrumentationHandler(fileIdMappingHandler) {
84
96
  return {
85
97
  enterPath(path, makeCoverable) {
86
- if (!(0, types_1.isUpdateExpression)(path.node)) {
87
- return;
88
- }
89
98
  const increment = extractCoverageIncrement(path.node);
90
99
  if (!increment) {
91
100
  return;
@@ -118,7 +127,13 @@ function cleanSourceCode(code, esModules, makeCoverable) {
118
127
  (0, traverse_1.default)(ast, {
119
128
  enter(path) {
120
129
  fileIdMappingHandler.enterPath(path);
121
- partialInstrumentationHandler.enterPath(path, makeCoverable);
130
+ if (isCoverageFunctionDefinition(path)) {
131
+ // Do try to instrument the coverage function (and save some time).
132
+ path.skip();
133
+ }
134
+ else {
135
+ partialInstrumentationHandler.enterPath(path, makeCoverable);
136
+ }
122
137
  }
123
138
  });
124
139
  return (0, generator_1.default)(ast, {}, code).code;
@@ -214,61 +229,71 @@ function newStatementCoverageIncrementExpression(fileIdVarName, increment) {
214
229
  * the given UpdateExpression is a branch coverage update expression.
215
230
  */
216
231
  function extractBranchCoverageIncrement(expr) {
217
- if (expr.operator === '++' &&
218
- (0, types_1.isMemberExpression)(expr.argument) &&
219
- (0, types_1.isMemberExpression)(expr.argument.object) &&
220
- (0, types_1.isMemberExpression)(expr.argument.object.object) &&
221
- (0, types_1.isCallExpression)(expr.argument.object.object.object) &&
222
- isCoverageObjectCall(expr.argument.object.object.object)) {
223
- const coverageObjectId = expr.argument.object.object.object.callee.name;
224
- const branchId = expr.argument.object.property.value;
225
- const locationId = expr.argument.property.value;
226
- return { type: 'branch', branchId, locationId, coverageObjectId };
232
+ const firstMemberExpr = expr.argument;
233
+ const secondMemberExpr = firstMemberExpr.object;
234
+ const thirdMemberExpr = secondMemberExpr.object;
235
+ if (!(0, types_1.isMemberExpression)(thirdMemberExpr)) {
236
+ return null;
227
237
  }
228
- return null;
238
+ const callExpr = thirdMemberExpr.object;
239
+ if (!(0, types_1.isCallExpression)(callExpr) || !isCoverageObjectCall(callExpr)) {
240
+ return null;
241
+ }
242
+ const coverageObjectId = callExpr.callee.name;
243
+ const branchId = secondMemberExpr.property.value;
244
+ const locationId = firstMemberExpr.property.value;
245
+ return { type: 'branch', branchId, locationId, coverageObjectId };
229
246
  }
230
247
  /**
231
248
  * Returns the call expression from `cov_104fq7oo4i().s[0]++;` if
232
249
  * the given UpdateExpression is a statement coverage update expression.
233
250
  */
234
251
  function extractStatementCoverageIncrement(expr) {
235
- if (expr.operator === '++' &&
236
- (0, types_1.isMemberExpression)(expr.argument) &&
237
- (0, types_1.isMemberExpression)(expr.argument.object) &&
238
- (0, types_1.isCallExpression)(expr.argument.object.object) &&
239
- (0, types_1.isIdentifier)(expr.argument.object.property) &&
240
- expr.argument.object.property.name === 's' &&
241
- isCoverageObjectCall(expr.argument.object.object)) {
242
- const coverageObjectId = expr.argument.object.object.callee.name;
243
- const statementId = expr.argument.property.value;
244
- return { type: 'statement', statementId, coverageObjectId };
252
+ const firstMemberExpr = expr.argument;
253
+ const secondMemberExpr = firstMemberExpr.object;
254
+ const callExpr = secondMemberExpr.object;
255
+ const argObjProp = secondMemberExpr.property;
256
+ if (!(0, types_1.isCallExpression)(callExpr) ||
257
+ !(0, types_1.isIdentifier)(argObjProp) ||
258
+ argObjProp.name !== 's' ||
259
+ !isCoverageObjectCall(callExpr)) {
260
+ return null;
245
261
  }
246
- return null;
262
+ const coverageObjectId = callExpr.callee.name;
263
+ const statementId = firstMemberExpr.property.value;
264
+ return { type: 'statement', statementId, coverageObjectId };
247
265
  }
248
266
  /**
249
267
  * Returns the call expression from `cov_104fq7oo4i().f[0]++;` if
250
268
  * the given UpdateExpression is a function coverage update expression.
251
269
  */
252
270
  function extractFunctionCoverageIncrement(expr) {
253
- if (expr.operator === '++' &&
254
- (0, types_1.isMemberExpression)(expr.argument) &&
255
- (0, types_1.isMemberExpression)(expr.argument.object) &&
256
- (0, types_1.isCallExpression)(expr.argument.object.object) &&
257
- (0, types_1.isIdentifier)(expr.argument.object.property) &&
258
- expr.argument.object.property.name === 'f' &&
259
- isCoverageObjectCall(expr.argument.object.object)) {
260
- const coverageObjectId = expr.argument.object.object.callee.name;
261
- const functionId = expr.argument.property.value;
262
- return { type: 'function', functionId, coverageObjectId };
271
+ const firstMemberExpr = expr.argument;
272
+ const secondMemberExpr = firstMemberExpr.object;
273
+ const callExpr = secondMemberExpr.object;
274
+ const argObjProp = secondMemberExpr.property;
275
+ if (!(0, types_1.isCallExpression)(callExpr) ||
276
+ !(0, types_1.isIdentifier)(argObjProp) ||
277
+ argObjProp.name !== 'f' ||
278
+ !isCoverageObjectCall(callExpr)) {
279
+ return null;
263
280
  }
264
- return null;
281
+ const coverageObjectId = callExpr.callee.name;
282
+ const functionId = firstMemberExpr.property.value;
283
+ return { type: 'function', functionId, coverageObjectId };
265
284
  }
266
285
  /**
267
- * Given an `UpdateExpression` extract the call expression returning the coverage object.
286
+ * Given an `IncrementExpression` extract the call expression returning the coverage object.
268
287
  */
269
- function extractCoverageIncrement(expr) {
288
+ function extractCoverageIncrement(node) {
270
289
  var _a, _b;
271
- return ((_b = (_a = extractBranchCoverageIncrement(expr)) !== null && _a !== void 0 ? _a : extractStatementCoverageIncrement(expr)) !== null && _b !== void 0 ? _b : extractFunctionCoverageIncrement(expr));
290
+ if ((0, types_1.isUpdateExpression)(node) &&
291
+ node.operator === '++' &&
292
+ (0, types_1.isMemberExpression)(node.argument) &&
293
+ (0, types_1.isMemberExpression)(node.argument.object)) {
294
+ return ((_b = (_a = extractBranchCoverageIncrement(node)) !== null && _a !== void 0 ? _a : extractStatementCoverageIncrement(node)) !== null && _b !== void 0 ? _b : extractFunctionCoverageIncrement(node));
295
+ }
296
+ return null;
272
297
  }
273
298
  /**
274
299
  * Check if the given call expression is a coverage call expression.
@@ -1,6 +1,6 @@
1
1
  import { InstrumentationTask, SourceMapReference } from './Task';
2
2
  /** The parameters the instrumenter can be configured by */
3
- export declare type ConfigurationParameters = {
3
+ export type ConfigurationParameters = {
4
4
  inputs?: string[];
5
5
  in_place?: boolean;
6
6
  debug?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"TaskBuilder.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/TaskBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,mBAAmB,EAGnB,kBAAkB,EAElB,MAAM,QAAQ,CAAC;AAMhB,2DAA2D;AAC3D,oBAAY,uBAAuB,GAAG;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAElB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAkBF;;GAEG;AACH,qBAAa,WAAW;IACvB,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAEzC,6CAA6C;IAC7C,OAAO,CAAC,SAAS,CAA4B;IAE7C,+BAA+B;IAC/B,OAAO,CAAC,2BAA2B,CAAuB;IAE1D,8BAA8B;IAC9B,OAAO,CAAC,2BAA2B,CAAuB;IAE1D,8BAA8B;IAC9B,OAAO,CAAC,yBAAyB,CAAuB;IAExD,mIAAmI;IACnI,OAAO,CAAC,eAAe,CAAqB;;IAO5C,0EAA0E;IAC1E,sBAAsB,CAAC,sBAAsB,EAAE,MAAM,GAAG,IAAI;IAM5D,gHAAgH;IAChH,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAKpE,kHAAkH;IAClH,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAKpE,qHAAqH;IACrH,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAK9D,yBAAyB;IACzB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAKlG;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAoCpD;;;;;;;OAOG;IACH,OAAO,CAAC,4CAA4C;IAgCpD;;;;;;OAMG;IACH,OAAO,CAAC,0BAA0B;IASlC;;OAEG;IACI,KAAK,IAAI,mBAAmB;CASnC"}
1
+ {"version":3,"file":"TaskBuilder.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/TaskBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,mBAAmB,EAGnB,kBAAkB,EAElB,MAAM,QAAQ,CAAC;AAMhB,2DAA2D;AAC3D,MAAM,MAAM,uBAAuB,GAAG;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAElB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAkBF;;GAEG;AACH,qBAAa,WAAW;IACvB,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAEzC,6CAA6C;IAC7C,OAAO,CAAC,SAAS,CAA4B;IAE7C,+BAA+B;IAC/B,OAAO,CAAC,2BAA2B,CAAuB;IAE1D,8BAA8B;IAC9B,OAAO,CAAC,2BAA2B,CAAuB;IAE1D,8BAA8B;IAC9B,OAAO,CAAC,yBAAyB,CAAuB;IAExD,mIAAmI;IACnI,OAAO,CAAC,eAAe,CAAqB;;IAO5C,0EAA0E;IAC1E,sBAAsB,CAAC,sBAAsB,EAAE,MAAM,GAAG,IAAI;IAM5D,gHAAgH;IAChH,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAKpE,kHAAkH;IAClH,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAKpE,qHAAqH;IACrH,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAK9D,yBAAyB;IACzB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAKlG;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAoCpD;;;;;;;OAOG;IACH,OAAO,CAAC,4CAA4C;IAgCpD;;;;;;OAMG;IACH,OAAO,CAAC,0BAA0B;IASlC;;OAEG;IACI,KAAK,IAAI,mBAAmB;CASnC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamscale/javascript-instrumenter",
3
- "version": "0.0.1-beta.53",
3
+ "version": "0.0.1-beta.54",
4
4
  "description": "JavaScript coverage instrumenter with coverage forwarding to a collector process",
5
5
  "main": "dist/src/main.js",
6
6
  "bin": "dist/src/main.js",
@@ -23,35 +23,35 @@
23
23
  "dist/**/*"
24
24
  ],
25
25
  "devDependencies": {
26
- "@babel/core": "^7.18.5",
27
- "@babel/plugin-transform-modules-commonjs": "^7.18.2",
28
- "@babel/preset-env": "^7.18.2",
26
+ "@babel/core": "^7.22.5",
27
+ "@babel/plugin-transform-modules-commonjs": "^7.22.5",
28
+ "@babel/preset-env": "^7.22.5",
29
29
  "@types/async": "^3.2.6",
30
30
  "@types/bunyan": "^1.8.8",
31
31
  "@types/convert-source-map": "^1.5.1",
32
32
  "@types/glob": "^7.1.3",
33
33
  "@types/istanbul-lib-instrument": "^1.7.4",
34
- "@types/jest": "^27.0.1",
34
+ "@types/jest": "^29.5.1",
35
35
  "@types/mkdirp": "^1.0.2",
36
36
  "@types/node": "^15.0.1",
37
37
  "@types/source-map": "^0.5.7",
38
38
  "@types/ws": "^7.4.4",
39
- "babel-jest": "^27.2.0",
39
+ "babel-jest": "^29.5.0",
40
40
  "esbuild": "^0.13.3",
41
41
  "esbuild-plugin-inline-worker": "^0.1.1",
42
- "jest": "^27.2.0",
42
+ "jest": "^29.5.0",
43
43
  "rimraf": "^3.0.2",
44
- "ts-jest": "^27.0.5",
44
+ "ts-jest": "^29.1.0",
45
45
  "ts-node": "^10.2.1",
46
46
  "tslib": "^2.2.0",
47
47
  "typescript": "^4.4.3"
48
48
  },
49
49
  "dependencies": {
50
- "@babel/generator": "^7.18.2",
51
- "@babel/parser": "^7.18.5",
52
- "@babel/traverse": "^7.18.6",
53
- "@babel/types": "^7.18.4",
54
- "@cqse/commons": "^0.0.1-beta.45",
50
+ "@babel/generator": "^7.22.5",
51
+ "@babel/parser": "^7.22.5",
52
+ "@babel/traverse": "^7.22.5",
53
+ "@babel/types": "^7.22.5",
54
+ "@cqse/commons": "0.0.1-beta.52",
55
55
  "@types/micromatch": "^4.0.2",
56
56
  "argparse": "^2.0.1",
57
57
  "async": "^3.2.4",
@@ -59,7 +59,7 @@
59
59
  "convert-source-map": "^1.7.0",
60
60
  "foreground-child": "^2.0.0",
61
61
  "glob": "^7.1.7",
62
- "istanbul-lib-instrument": "^5.2.0",
62
+ "istanbul-lib-instrument": "^5.2.1",
63
63
  "micromatch": "4.0.4",
64
64
  "mkdirp": "^1.0.4",
65
65
  "source-map": "0.7.4",