@teamscale/javascript-instrumenter 0.0.1-beta.36 → 0.0.1-beta.40
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 +9 -9
- package/dist/src/App.d.ts.map +1 -1
- package/dist/src/App.js +3 -0
- package/dist/src/instrumenter/Cleaner.d.ts.map +1 -1
- package/dist/src/instrumenter/Cleaner.js +9 -4
- package/dist/src/instrumenter/Instrumenter.d.ts +6 -1
- package/dist/src/instrumenter/Instrumenter.d.ts.map +1 -1
- package/dist/src/instrumenter/Instrumenter.js +28 -3
- package/dist/src/instrumenter/Task.d.ts +2 -1
- package/dist/src/instrumenter/Task.d.ts.map +1 -1
- package/dist/src/instrumenter/Task.js +2 -1
- package/dist/src/instrumenter/TaskBuilder.d.ts +3 -0
- package/dist/src/instrumenter/TaskBuilder.d.ts.map +1 -1
- package/dist/src/instrumenter/TaskBuilder.js +2 -1
- package/dist/vaccine.js +1 -1
- package/package.json +9 -9
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teamscale/javascript-instrumenter",
|
|
3
|
-
"version": "0.0.1-beta.
|
|
3
|
+
"version": "0.0.1-beta.40",
|
|
4
4
|
"description": "Istanbul-based coverage instrumenter with coverage forwarding via WebSockets",
|
|
5
5
|
"main": "dist/src/main.js",
|
|
6
6
|
"bin": "dist/src/main.js",
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"dist/**/*"
|
|
24
24
|
],
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@babel/core": "^7.
|
|
27
|
-
"@babel/plugin-transform-modules-commonjs": "^7.
|
|
28
|
-
"@babel/preset-env": "^7.
|
|
26
|
+
"@babel/core": "^7.18.5",
|
|
27
|
+
"@babel/plugin-transform-modules-commonjs": "^7.18.2",
|
|
28
|
+
"@babel/preset-env": "^7.18.2",
|
|
29
29
|
"@types/async": "^3.2.6",
|
|
30
30
|
"@types/bunyan": "^1.8.8",
|
|
31
31
|
"@types/convert-source-map": "^1.5.1",
|
|
@@ -47,14 +47,14 @@
|
|
|
47
47
|
"typescript": "^4.4.3"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@babel/generator": "^7.
|
|
51
|
-
"@babel/parser": "^7.
|
|
52
|
-
"@babel/traverse": "^7.
|
|
53
|
-
"@babel/types": "^7.
|
|
50
|
+
"@babel/generator": "^7.18.2",
|
|
51
|
+
"@babel/parser": "^7.18.5",
|
|
52
|
+
"@babel/traverse": "^7.18.5",
|
|
53
|
+
"@babel/types": "^7.18.4",
|
|
54
54
|
"@cqse/commons": "^0.0.1-beta.1",
|
|
55
55
|
"@types/micromatch": "^4.0.2",
|
|
56
56
|
"argparse": "^2.0.1",
|
|
57
|
-
"async": "^3.2.
|
|
57
|
+
"async": "^3.2.4",
|
|
58
58
|
"bunyan": "^1.8.15",
|
|
59
59
|
"convert-source-map": "^1.7.0",
|
|
60
60
|
"foreground-child": "^2.0.0",
|
package/dist/src/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/App.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtE,OAAO,EAAE,uBAAuB,EAAe,MAAM,4BAA4B,CAAC;AAKlF,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,qBAAa,GAAG;IACf;;;OAGG;WACiB,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;IAa9C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/App.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtE,OAAO,EAAE,uBAAuB,EAAe,MAAM,4BAA4B,CAAC;AAKlF,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,qBAAa,GAAG;IACf;;;OAGG;WACiB,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;IAa9C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAqC1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IA8B1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAI/B;;;;;OAKG;WACW,qBAAqB,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAO1G,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAIxC,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAajC"}
|
package/dist/src/App.js
CHANGED
|
@@ -85,6 +85,9 @@ class App {
|
|
|
85
85
|
nargs: '*',
|
|
86
86
|
help: 'Glob pattern(s) of files in the source origin to produce coverage for. Multiple patterns can be separated by space.'
|
|
87
87
|
});
|
|
88
|
+
parser.add_argument('-p', '--dump-origins-to', {
|
|
89
|
+
help: 'Optional location specifying where to dump possible origins from the source map as a json file'
|
|
90
|
+
});
|
|
88
91
|
parser.add_argument('inputs', { nargs: '+', help: 'The input file(s) to instrument.' });
|
|
89
92
|
return parser;
|
|
90
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cleaner.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/Cleaner.ts"],"names":[],"mappings":"AAGA,OAAO,EAKN,cAAc,EAEd,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Cleaner.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/Cleaner.ts"],"names":[],"mappings":"AAGA,OAAO,EAKN,cAAc,EAEd,MAAM,cAAc,CAAC;AAMtB;;;;;GAKG;AACH,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,EAClB,aAAa,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,OAAO,GAClD,MAAM,CAcR"}
|
|
@@ -8,6 +8,9 @@ const parser_1 = require("@babel/parser");
|
|
|
8
8
|
const generator_1 = __importDefault(require("@babel/generator"));
|
|
9
9
|
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
10
10
|
const types_1 = require("@babel/types");
|
|
11
|
+
function isUpdateExpressionPath(path) {
|
|
12
|
+
return path.node.type === 'UpdateExpression';
|
|
13
|
+
}
|
|
11
14
|
/**
|
|
12
15
|
* Remove IstanbulJs instrumentations based on the given
|
|
13
16
|
* hook `makeCoverable`.
|
|
@@ -17,10 +20,12 @@ const types_1 = require("@babel/types");
|
|
|
17
20
|
function cleanSourceCode(code, esModules, makeCoverable) {
|
|
18
21
|
const ast = (0, parser_1.parse)(code, { sourceType: esModules ? 'module' : 'script' });
|
|
19
22
|
(0, traverse_1.default)(ast, {
|
|
20
|
-
|
|
21
|
-
if (
|
|
22
|
-
if (
|
|
23
|
-
path.
|
|
23
|
+
enter(path) {
|
|
24
|
+
if (isUpdateExpressionPath(path)) {
|
|
25
|
+
if (isCoverageIncrementNode(path)) {
|
|
26
|
+
if (path.node.loc && !makeCoverable(path.node.loc)) {
|
|
27
|
+
path.remove();
|
|
28
|
+
}
|
|
24
29
|
}
|
|
25
30
|
}
|
|
26
31
|
}
|
|
@@ -37,8 +37,9 @@ export declare class IstanbulInstrumenter implements IInstrumenter {
|
|
|
37
37
|
* @param collector - The collector to send the coverage information to.
|
|
38
38
|
* @param taskElement - The task element to perform the instrumentation for.
|
|
39
39
|
* @param sourcePattern - A pattern to restrict the instrumentation to only a fraction of the task element.
|
|
40
|
+
* @param dumpOriginsFile - A file path where all origins from the source map should be dumped in json format, or undefined if no origins should be dumped
|
|
40
41
|
*/
|
|
41
|
-
instrumentOne(collector: CollectorSpecifier, taskElement: TaskElement, sourcePattern: OriginSourcePattern): Promise<TaskResult>;
|
|
42
|
+
instrumentOne(collector: CollectorSpecifier, taskElement: TaskElement, sourcePattern: OriginSourcePattern, dumpOriginsFile: string | undefined): Promise<TaskResult>;
|
|
42
43
|
private removeUnwantedInstrumentation;
|
|
43
44
|
private loadSourceMap;
|
|
44
45
|
/**
|
|
@@ -73,5 +74,9 @@ export declare class IstanbulInstrumenter implements IInstrumenter {
|
|
|
73
74
|
* @param externalSourceMapFile - An external source map file to consider.
|
|
74
75
|
*/
|
|
75
76
|
private loadInputSourceMap;
|
|
77
|
+
/** Appends all origins from the source map to a given file. Creates the file if it does not exist yet. */
|
|
78
|
+
private dumpOrigins;
|
|
79
|
+
/** Clears the dump origins file if it exists, such that it is now ready to be appended for every instrumented file. */
|
|
80
|
+
private clearDumpOriginsFileIfNeeded;
|
|
76
81
|
}
|
|
77
82
|
//# sourceMappingURL=Instrumenter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Instrumenter.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/Instrumenter.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EAGnB,WAAW,EACX,UAAU,EACV,MAAM,QAAQ,CAAC;AAUhB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,eAAO,MAAM,qBAAqB,8CAA8C,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACzD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAS;gBAEX,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IASnD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"Instrumenter.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/Instrumenter.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EAGnB,WAAW,EACX,UAAU,EACV,MAAM,QAAQ,CAAC;AAUhB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,eAAO,MAAM,qBAAqB,8CAA8C,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACzD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAS;gBAEX,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IASnD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IAqBhE;;;;;;;OAOG;IACG,aAAa,CAClB,SAAS,EAAE,kBAAkB,EAC7B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,mBAAmB,EAClC,eAAe,EAAE,MAAM,GAAG,SAAS,GACjC,OAAO,CAAC,UAAU,CAAC;YAoGR,6BAA6B;YAmC7B,aAAa;IAe3B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAMnB;;;;;;;OAOG;IACH,OAAO,CAAC,gCAAgC;IAQxC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IAcpC;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAgB1B,0GAA0G;IAC1G,OAAO,CAAC,WAAW;IASnB,uHAAuH;IACvH,OAAO,CAAC,4BAA4B;CASpC"}
|
|
@@ -52,11 +52,12 @@ class IstanbulInstrumenter {
|
|
|
52
52
|
* {@inheritDoc #IInstrumenter.instrument}
|
|
53
53
|
*/
|
|
54
54
|
async instrument(task) {
|
|
55
|
+
this.clearDumpOriginsFileIfNeeded(task.dumpOriginsFile);
|
|
55
56
|
// We limit the number of instrumentations in parallel to one to
|
|
56
57
|
// not overuse memory (NodeJS has only limited mem to use).
|
|
57
58
|
return async_1.default
|
|
58
59
|
.mapLimit(task.elements, 1, async (taskElement) => {
|
|
59
|
-
return await this.instrumentOne(task.collector, taskElement, task.originSourcePattern);
|
|
60
|
+
return await this.instrumentOne(task.collector, taskElement, task.originSourcePattern, task.dumpOriginsFile);
|
|
60
61
|
})
|
|
61
62
|
.then(results => {
|
|
62
63
|
return results.reduce((prev, curr) => {
|
|
@@ -70,8 +71,9 @@ class IstanbulInstrumenter {
|
|
|
70
71
|
* @param collector - The collector to send the coverage information to.
|
|
71
72
|
* @param taskElement - The task element to perform the instrumentation for.
|
|
72
73
|
* @param sourcePattern - A pattern to restrict the instrumentation to only a fraction of the task element.
|
|
74
|
+
* @param dumpOriginsFile - A file path where all origins from the source map should be dumped in json format, or undefined if no origins should be dumped
|
|
73
75
|
*/
|
|
74
|
-
async instrumentOne(collector, taskElement, sourcePattern) {
|
|
76
|
+
async instrumentOne(collector, taskElement, sourcePattern, dumpOriginsFile) {
|
|
75
77
|
var _a, _b;
|
|
76
78
|
const inputFileSource = fs.readFileSync(taskElement.fromFile, 'utf8');
|
|
77
79
|
// We skip files that we have already instrumented
|
|
@@ -103,6 +105,9 @@ class IstanbulInstrumenter {
|
|
|
103
105
|
// and use the original code instead and write it to the target path.
|
|
104
106
|
//
|
|
105
107
|
const originSourceFiles = (_a = inputSourceMap === null || inputSourceMap === void 0 ? void 0 : inputSourceMap.sources) !== null && _a !== void 0 ? _a : [];
|
|
108
|
+
if (dumpOriginsFile) {
|
|
109
|
+
this.dumpOrigins(dumpOriginsFile, originSourceFiles);
|
|
110
|
+
}
|
|
106
111
|
if (this.shouldExcludeFromInstrumentation(sourcePattern, taskElement.fromFile, originSourceFiles)) {
|
|
107
112
|
writeToFile(taskElement.toFile, inputFileSource);
|
|
108
113
|
return new Task_1.TaskResult(0, 1, 0, 0, 0, 0, 0);
|
|
@@ -110,7 +115,7 @@ class IstanbulInstrumenter {
|
|
|
110
115
|
// The main instrumentation (adding coverage statements) is performed now:
|
|
111
116
|
instrumentedSource = instrumenter
|
|
112
117
|
.instrumentSync(inputFileSource, taskElement.fromFile, inputSourceMap)
|
|
113
|
-
.replace(/
|
|
118
|
+
.replace(/actualCoverage\s*=\s*coverage\[path\]/g, 'actualCoverage=makeCoverageInterceptor(coverage[path])')
|
|
114
119
|
.replace(/new Function\("return this"\)\(\)/g, "typeof window === 'object' ? window : this");
|
|
115
120
|
this.logger.debug('Instrumentation source maps to:', (_b = instrumenter.lastSourceMap()) === null || _b === void 0 ? void 0 : _b.sources);
|
|
116
121
|
// In case of a bundle, the initial instrumentation step might have added
|
|
@@ -230,6 +235,26 @@ class IstanbulInstrumenter {
|
|
|
230
235
|
return sourceMapFromCodeComment(inputSourceCode, taskFile);
|
|
231
236
|
}
|
|
232
237
|
}
|
|
238
|
+
/** Appends all origins from the source map to a given file. Creates the file if it does not exist yet. */
|
|
239
|
+
dumpOrigins(dumpOriginsFile, originSourceFiles) {
|
|
240
|
+
const jsonContent = JSON.stringify(originSourceFiles, null, 2);
|
|
241
|
+
fs.writeFile(dumpOriginsFile, jsonContent + '\n', { flag: 'a' }, error => {
|
|
242
|
+
if (error) {
|
|
243
|
+
this.logger.warn('Could not dump origins file');
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/** Clears the dump origins file if it exists, such that it is now ready to be appended for every instrumented file. */
|
|
248
|
+
clearDumpOriginsFileIfNeeded(dumpOriginsFile) {
|
|
249
|
+
if (dumpOriginsFile && fs.existsSync(dumpOriginsFile)) {
|
|
250
|
+
try {
|
|
251
|
+
fs.unlinkSync(dumpOriginsFile);
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
this.logger.warn('Could not clear origins file: ' + err);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
233
258
|
}
|
|
234
259
|
exports.IstanbulInstrumenter = IstanbulInstrumenter;
|
|
235
260
|
/**
|
|
@@ -87,7 +87,8 @@ export declare class InstrumentationTask {
|
|
|
87
87
|
* based on the original file names the code was transpiled from.
|
|
88
88
|
*/
|
|
89
89
|
readonly originSourcePattern: OriginSourcePattern;
|
|
90
|
-
|
|
90
|
+
readonly dumpOriginsFile: string | undefined;
|
|
91
|
+
constructor(collector: CollectorSpecifier, elements: TaskElement[], originSourcePattern: OriginSourcePattern, dumpOriginsFile: string | undefined);
|
|
91
92
|
/**
|
|
92
93
|
* @returns the elements of the task.
|
|
93
94
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/Task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAK/C;;GAEG;AACH,8BAAsB,kBAAkB;CAAG;AAE3C;;;GAGG;AACH,qBAAa,WAAW;IACvB,sBAAsB;IACtB,SAAgB,QAAQ,EAAE,MAAM,CAAC;IAEjC,2BAA2B;IAC3B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,gEAAgE;IAChE,SAAgB,qBAAqB,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;gBAExD,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,kBAAkB;IAMpF;;OAEG;IACI,SAAS,IAAI,OAAO;CAK3B;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC9B,oEAAoE;IACpE,SAAgB,GAAG,EAAE,MAAM,CAAC;gBAEhB,SAAS,EAAE,MAAM;CAW7B;AAED;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC/B,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAE/C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS;IAKxE;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;;;;;;;;OAWG;IACI,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO;IAqBpD,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAQnC,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B,OAAO,CAAC,MAAM,CAAC,+BAA+B;IAO9C,OAAO,CAAC,MAAM,CAAC,YAAY;CAM3B;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC/B;;OAEG;IACH,SAAgB,SAAS,EAAE,kBAAkB,CAAC;IAE9C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAE1C;;;OAGG;IACH,SAAgB,mBAAmB,EAAE,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/Task.ts"],"names":[],"mappings":"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"}
|
|
@@ -135,10 +135,11 @@ exports.OriginSourcePattern = OriginSourcePattern;
|
|
|
135
135
|
* The actual instrumentation task.
|
|
136
136
|
*/
|
|
137
137
|
class InstrumentationTask {
|
|
138
|
-
constructor(collector, elements, originSourcePattern) {
|
|
138
|
+
constructor(collector, elements, originSourcePattern, dumpOriginsFile) {
|
|
139
139
|
this.collector = commons_1.Contract.requireDefined(collector);
|
|
140
140
|
this.originSourcePattern = commons_1.Contract.requireDefined(originSourcePattern);
|
|
141
141
|
this._elements = commons_1.Contract.requireDefined(elements).slice();
|
|
142
|
+
this.dumpOriginsFile = dumpOriginsFile;
|
|
142
143
|
}
|
|
143
144
|
/**
|
|
144
145
|
* @returns the elements of the task.
|
|
@@ -9,6 +9,7 @@ export declare type ConfigurationParameters = {
|
|
|
9
9
|
collector: string;
|
|
10
10
|
include_origin?: string[];
|
|
11
11
|
exclude_origin?: string[];
|
|
12
|
+
dump_origins_to?: string;
|
|
12
13
|
};
|
|
13
14
|
/**
|
|
14
15
|
* A builder for an instrumentation task.
|
|
@@ -22,6 +23,8 @@ export declare class TaskBuilder {
|
|
|
22
23
|
private originSourceIncludePatterns;
|
|
23
24
|
/** An exclude pattern. */
|
|
24
25
|
private originSourceExcludePatterns;
|
|
26
|
+
/** File path where all origins from the source map should be dumped in json format, or undefined if no origins should be dumped */
|
|
27
|
+
private dumpOriginsFile;
|
|
25
28
|
constructor();
|
|
26
29
|
/** Set the collector by extracting the information from a given string */
|
|
27
30
|
setCollectorFromString(collectorSpecification: string): this;
|
|
@@ -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;
|
|
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,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,0BAA0B;IAC1B,OAAO,CAAC,2BAA2B,CAAuB;IAE1D,0BAA0B;IAC1B,OAAO,CAAC,2BAA2B,CAAuB;IAE1D,mIAAmI;IACnI,OAAO,CAAC,eAAe,CAAqB;;IAO5C,0EAA0E;IAC1E,sBAAsB,CAAC,sBAAsB,EAAE,MAAM,GAAG,IAAI;IAM5D,yGAAyG;IACzG,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAKpE,2GAA2G;IAC3G,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAKpE,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;IAmCpD;;;;;;;OAOG;IACH,OAAO,CAAC,4CAA4C;IAgCpD;;;;;;OAMG;IACH,OAAO,CAAC,0BAA0B;IASlC;;OAEG;IACI,KAAK,IAAI,mBAAmB;CASnC"}
|
|
@@ -84,6 +84,7 @@ class TaskBuilder {
|
|
|
84
84
|
const inPlace = (_b = config.in_place) !== null && _b !== void 0 ? _b : true;
|
|
85
85
|
const target = config.to;
|
|
86
86
|
const sourceMap = config.source_map;
|
|
87
|
+
this.dumpOriginsFile = config.dump_origins_to;
|
|
87
88
|
this.setCollectorFromString(config.collector);
|
|
88
89
|
this.setOriginSourceIncludePatterns(config.include_origin);
|
|
89
90
|
this.setOriginSourceExcludePatterns(config.exclude_origin);
|
|
@@ -164,7 +165,7 @@ class TaskBuilder {
|
|
|
164
165
|
*/
|
|
165
166
|
build() {
|
|
166
167
|
const pattern = new Task_1.OriginSourcePattern(this.originSourceIncludePatterns, this.originSourceExcludePatterns);
|
|
167
|
-
return new Task_1.InstrumentationTask(commons_1.Contract.requireDefined(this.collector), this.elements, pattern);
|
|
168
|
+
return new Task_1.InstrumentationTask(commons_1.Contract.requireDefined(this.collector), this.elements, pattern, this.dumpOriginsFile);
|
|
168
169
|
}
|
|
169
170
|
}
|
|
170
171
|
exports.TaskBuilder = TaskBuilder;
|
package/dist/vaccine.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var
|
|
1
|
+
(()=>{var L=Object.create;var p=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty;var P=e=>p(e,"__esModule",{value:!0});var E=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var j=(e,t,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of H(t))!B.call(e,r)&&r!=="default"&&p(e,r,{get:()=>t[r],enumerable:!(n=D(t,r))||n.enumerable});return e},S=e=>j(P(p(e!=null?L(U(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var O=E((re,R)=>{R.exports=!1});var $=E(()=>{});function m(e){let t=new Blob([e],{type:"text/javascript"}),n=URL.createObjectURL(t),r=new Worker(n);return URL.revokeObjectURL(n),r}function g(){return m('var a=class{constructor(e){this.cachedMessages=[];this.url=e,this.socket=this.createSocket()}createSocket(){let e=new WebSocket(this.url);return e.onopen=()=>this.onopen(),e.onclose=()=>this.onclose(),e}onclose(){this.socket=this.createSocket()}onopen(){console.log("Connection to Coverage Collector established."),this.cachedMessages.forEach(e=>this.socket.send(e)),this.cachedMessages=[]}send(e){this.socket.readyState===WebSocket.OPEN?this.socket.send(e):(this.cachedMessages.push(e),this.cachedMessages.length%500===0&&console.log(`More than ${this.cachedMessages.length} messages are queued to be sent.`))}};var E=20,v=1e3,g=class{constructor(e,t){this.milliseconds=e;this.onCountedToZero=t;this.timerHandle=null}restartCountdown(){this.stopCountdown(),this.timerHandle=self.setTimeout(()=>{this.stopCountdown(),this.onCountedToZero()},this.milliseconds)}stopCountdown(){this.timerHandle!==null&&(self.clearTimeout(this.timerHandle),this.timerHandle=null)}},c=class{constructor(e){this.socket=e,this.cachedCoveredRanges=new Map,this.numberOfCachedPositions=0,this.flushCountdown=new g(v,()=>this.flush())}addRange(e,t){let o=this.cachedCoveredRanges.get(e);o||(o=new Set,this.cachedCoveredRanges.set(e,o)),o.add(t),this.numberOfCachedPositions+=1,this.flushCountdown.restartCountdown(),this.numberOfCachedPositions>=E&&this.flush()}flush(){this.numberOfCachedPositions!==0&&(this.flushCountdown.stopCountdown(),this.cachedCoveredRanges.forEach((e,t)=>{let o=Array.from(e).map(n=>`${n.start.line}:${n.start.column}:${n.end.line}:${n.end.column}`);this.socket.send(`${"c"} ${t} ${o.join(" ")}`),e.clear()}),this.cachedCoveredRanges.clear(),this.numberOfCachedPositions=0)}};var C="s",m="b";console.log("Starting coverage forwarding worker.");var p=new a("$REPORT_TO_URL/socket"),d=new c(p),h=new Map;onmessage=s=>{let e=s.data;if(e.startsWith("s"))p.send(e);else if(e.startsWith("i")){let t=JSON.parse(e.substring(2));h.set(t.hash,t),console.info(`Received coverage mapping information for "${t.hash}".`)}else e.startsWith("u")?S(e):e==="unload"?d.flush():console.error(`No handler for message: ${e}`)};function S(s){var l;let e=s.split(" ");if(e.length<4||h===null)return;let t=e[1],o=e[2],n=h.get(t);if(!n){console.log(`No coverage mapping information for ${t} available!`);return}if(o===C){let i=e[3],r=n.statementMap[i];r&&d.addRange(t,r)}else if(o===m){let i=e[3],r=Number.parseInt(e[4]),u=(l=n.branchMap[i])==null?void 0:l.locations[r];u&&d.addRange(t,u)}}\n')}var b="s",w="b";var a;(function(o){o.MESSAGE_TYPE_SOURCEMAP="s",o.MESSAGE_TYPE_COVERAGE="c",o.ISTANBUL_COV_OBJECT="i",o.UNRESOLVED_CODE_ENTITY="u"})(a||(a={}));var k=class{constructor(t,n,r){this.worker=t;this.fileHash=n;this.path=r}get(t,n,r){let o=t[n];return o!==Object(o)?o:C(this.worker,this.fileHash,o,[...this.path,n])}set(t,n,r){let o=[...this.path,n],i=o[0];if(i===b){let s=o[1];this.worker.postMessage(`${a.UNRESOLVED_CODE_ENTITY} ${this.fileHash} ${b} ${s}`)}else if(i===w){let s=o[1],u=o[2];this.worker.postMessage(`${a.UNRESOLVED_CODE_ENTITY} ${this.fileHash} ${w} ${s} ${u}`)}return!0}};function C(e,t,n,r){return new Proxy(n,new k(e,t,r))}var T=S(O());function G(e){if(!(typeof WorkerGlobalScope=="function"&&self instanceof WorkerGlobalScope)){if(typeof window.addEventListener!="function")return;window.addEventListener("beforeunload",function(){e()},!0),window.addEventListener("unload",function(){e()},!0)}}var _={add:G};var W=S($()),V=T.default?W.default:_,c=new Set,M=!1;function Y(){M||(M=!0,V.add(J))}function x(e){if(Y(),typeof e!="function")throw new Error("Listener is no function");c.add(e);var t={remove:function(){return c.delete(e)},run:function(){return c.delete(e),e()}};return t}function J(){var e=[];return c.forEach(function(t){e.push(t()),c.delete(t)}),Promise.all(e)}function l(){return d()}function A(){return typeof window!="undefined"}function d(){return window}function v(e,t){let n=l()[e];return n||(n=t,l()[e]=n),n}var I=v("__TS_AGENT",{});function h(){return I._$BcWorker}function z(e){return I._$BcWorker=e,e}var N=new Set;l().makeCoverageInterceptor=function(e){let t=e.hash;if(N.has(t)){console.log(`Coverage interceptor added twice for ${t}. This seems to be a bug in the instrumentation.`);return}else N.add(t);if(!h()){let n=z(new g);(function(){let o=function(i){let s=d()[i];d()[i]=function(...u){if(n.postMessage("unload"),s)return s.apply(this,u)},A()&&Object.defineProperty(d(),i,{get:function(){return s},set:function(u){s=u}})};o("onunload"),o("onbeforeunload"),x(()=>n.postMessage("unload"))})()}return function(){h().postMessage(`${a.ISTANBUL_COV_OBJECT} ${JSON.stringify(e)}`);let r=v("sentMaps",new Set);e.inputSourceMap&&(r.has(e.path)||(h().postMessage(`${a.MESSAGE_TYPE_SOURCEMAP} ${t}:${JSON.stringify(e.inputSourceMap)}`),r.add(e.path)))}(),function(){let r=new Set;l()._$Bc=(o,i,s,u,y)=>{let f=`${o}:${i}:${s}:${u}:${y}`;r.has(f)||(h().postMessage(f),r.add(f))}}(),C(h(),e.hash,e,[])};})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teamscale/javascript-instrumenter",
|
|
3
|
-
"version": "0.0.1-beta.
|
|
3
|
+
"version": "0.0.1-beta.40",
|
|
4
4
|
"description": "Istanbul-based coverage instrumenter with coverage forwarding via WebSockets",
|
|
5
5
|
"main": "dist/src/main.js",
|
|
6
6
|
"bin": "dist/src/main.js",
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"dist/**/*"
|
|
24
24
|
],
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@babel/core": "^7.
|
|
27
|
-
"@babel/plugin-transform-modules-commonjs": "^7.
|
|
28
|
-
"@babel/preset-env": "^7.
|
|
26
|
+
"@babel/core": "^7.18.5",
|
|
27
|
+
"@babel/plugin-transform-modules-commonjs": "^7.18.2",
|
|
28
|
+
"@babel/preset-env": "^7.18.2",
|
|
29
29
|
"@types/async": "^3.2.6",
|
|
30
30
|
"@types/bunyan": "^1.8.8",
|
|
31
31
|
"@types/convert-source-map": "^1.5.1",
|
|
@@ -47,14 +47,14 @@
|
|
|
47
47
|
"typescript": "^4.4.3"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@babel/generator": "^7.
|
|
51
|
-
"@babel/parser": "^7.
|
|
52
|
-
"@babel/traverse": "^7.
|
|
53
|
-
"@babel/types": "^7.
|
|
50
|
+
"@babel/generator": "^7.18.2",
|
|
51
|
+
"@babel/parser": "^7.18.5",
|
|
52
|
+
"@babel/traverse": "^7.18.5",
|
|
53
|
+
"@babel/types": "^7.18.4",
|
|
54
54
|
"@cqse/commons": "^0.0.1-beta.1",
|
|
55
55
|
"@types/micromatch": "^4.0.2",
|
|
56
56
|
"argparse": "^2.0.1",
|
|
57
|
-
"async": "^3.2.
|
|
57
|
+
"async": "^3.2.4",
|
|
58
58
|
"bunyan": "^1.8.15",
|
|
59
59
|
"convert-source-map": "^1.7.0",
|
|
60
60
|
"foreground-child": "^2.0.0",
|