monocart-coverage-reports 2.6.0 → 2.6.1
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/README.md +4 -0
- package/lib/cli.js +73 -38
- package/lib/converter/collect-source-maps.js +1 -1
- package/lib/index.js +7 -3
- package/lib/v8/v8.js +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
- [Vitest](#vitest)
|
|
40
40
|
- [CodeceptJS](#codeceptjs)
|
|
41
41
|
- [WebdriverIO](#webdriverio)
|
|
42
|
+
- [Storybook Test Runner](#storybook-test-runner)
|
|
42
43
|
- [Codecov](#codecov)
|
|
43
44
|
- [Coveralls](#coveralls)
|
|
44
45
|
- [Sonar Cloud](#sonar-cloud)
|
|
@@ -723,6 +724,9 @@ When `logging` is `debug`, the raw report data will be preserved in `[outputDir]
|
|
|
723
724
|
### [WebdriverIO](https://github.com/webdriverio/webdriverio)
|
|
724
725
|
- [wdio-monocart-service](https://github.com/cenfun/wdio-monocart-service) - A WebdriverIO service for coverage reports
|
|
725
726
|
|
|
727
|
+
### [Storybook Test Runner](https://github.com/storybookjs/test-runner)
|
|
728
|
+
- [storybook-monocart-coverage](https://github.com/cenfun/storybook-monocart-coverage) - Storybook V8 Coverage Example
|
|
729
|
+
|
|
726
730
|
### [Codecov](https://codecov.com/)
|
|
727
731
|
[](https://codecov.io/gh/cenfun/monocart-coverage-reports)
|
|
728
732
|
- Supports native `codecov` built-in report ([specification](https://docs.codecov.com/docs/codecov-custom-coverage-format))
|
package/lib/cli.js
CHANGED
|
@@ -4,6 +4,7 @@ const fs = require('fs');
|
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const EC = require('eight-colors');
|
|
6
6
|
const { fileURLToPath, pathToFileURL } = require('url');
|
|
7
|
+
|
|
7
8
|
const {
|
|
8
9
|
foregroundChild,
|
|
9
10
|
program
|
|
@@ -98,6 +99,71 @@ const initOptions = async (cliOptions) => {
|
|
|
98
99
|
return options;
|
|
99
100
|
};
|
|
100
101
|
|
|
102
|
+
const resolveEntrySource = (entry, sourceMapCache = {}) => {
|
|
103
|
+
let source;
|
|
104
|
+
const filePath = fileURLToPath(entry.url);
|
|
105
|
+
const extname = path.extname(filePath);
|
|
106
|
+
if (fs.existsSync(filePath)) {
|
|
107
|
+
source = fs.readFileSync(filePath).toString('utf8');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// not for typescript
|
|
111
|
+
if (source && !['.ts', '.tsx'].includes(extname)) {
|
|
112
|
+
entry.source = source;
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const sourcemapData = sourceMapCache[entry.url];
|
|
117
|
+
const lineLengths = sourcemapData && sourcemapData.lineLengths;
|
|
118
|
+
|
|
119
|
+
// for fake source file (can not parse to AST)
|
|
120
|
+
if (lineLengths) {
|
|
121
|
+
// get runtime code with ts-node
|
|
122
|
+
let fakeSource = '';
|
|
123
|
+
sourcemapData.lineLengths.forEach((length) => {
|
|
124
|
+
fakeSource += `${''.padEnd(length, '*')}\n`;
|
|
125
|
+
});
|
|
126
|
+
entry.fake = true;
|
|
127
|
+
entry.source = fakeSource;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Note: no runtime code in source map cache
|
|
131
|
+
// This is a problem for typescript
|
|
132
|
+
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const resolveEntrySourceMap = (entry, sourceMapCache = {}) => {
|
|
136
|
+
// sourcemap data
|
|
137
|
+
const sourcemapData = sourceMapCache[entry.url];
|
|
138
|
+
if (sourcemapData) {
|
|
139
|
+
if (sourcemapData.data) {
|
|
140
|
+
entry.sourceMap = resolveSourceMap(sourcemapData.data, entry.url);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const collectCoverageData = (coverageList, entryFilterHandler, sourceMapCache = {}) => {
|
|
146
|
+
|
|
147
|
+
if (!Util.isList(coverageList)) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// filter node internal files
|
|
152
|
+
coverageList = coverageList.filter((entry) => entry.url && entry.url.startsWith('file:'));
|
|
153
|
+
coverageList = coverageList.filter(entryFilterHandler);
|
|
154
|
+
|
|
155
|
+
if (!Util.isList(coverageList)) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
for (const entry of coverageList) {
|
|
160
|
+
resolveEntrySource(entry, sourceMapCache);
|
|
161
|
+
resolveEntrySourceMap(entry, sourceMapCache);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return coverageList;
|
|
165
|
+
};
|
|
166
|
+
|
|
101
167
|
const executeCommand = async (command, cliOptions) => {
|
|
102
168
|
|
|
103
169
|
const options = await initOptions(cliOptions);
|
|
@@ -130,49 +196,18 @@ const executeCommand = async (command, cliOptions) => {
|
|
|
130
196
|
return 1;
|
|
131
197
|
}
|
|
132
198
|
|
|
199
|
+
const entryFilterHandler = coverageReport.getEntryFilter();
|
|
200
|
+
|
|
133
201
|
const files = fs.readdirSync(nodeV8CoverageDir);
|
|
134
202
|
for (const filename of files) {
|
|
135
203
|
const content = fs.readFileSync(path.resolve(nodeV8CoverageDir, filename)).toString('utf-8');
|
|
136
204
|
const json = JSON.parse(content);
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
// filter node internal files
|
|
143
|
-
coverageList = coverageList.filter((entry) => entry.url && entry.url.startsWith('file:'));
|
|
144
|
-
|
|
145
|
-
if (!coverageList.length) {
|
|
146
|
-
continue;
|
|
205
|
+
const coverageList = json.result;
|
|
206
|
+
const sourceMapCache = json['source-map-cache'];
|
|
207
|
+
const coverageData = await collectCoverageData(coverageList, entryFilterHandler, sourceMapCache);
|
|
208
|
+
if (coverageData) {
|
|
209
|
+
await coverageReport.add(coverageData);
|
|
147
210
|
}
|
|
148
|
-
// attached source content
|
|
149
|
-
coverageList.forEach((entry) => {
|
|
150
|
-
// source content
|
|
151
|
-
const filePath = fileURLToPath(entry.url);
|
|
152
|
-
if (fs.existsSync(filePath)) {
|
|
153
|
-
entry.source = fs.readFileSync(filePath).toString('utf8');
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// sourcemap data
|
|
157
|
-
const sourcemapData = sourceMapCache[entry.url];
|
|
158
|
-
if (sourcemapData) {
|
|
159
|
-
if (sourcemapData.data) {
|
|
160
|
-
entry.sourceMap = resolveSourceMap(sourcemapData.data, entry.url);
|
|
161
|
-
}
|
|
162
|
-
// sourcemapData.lineLengths just for fake source file (can not parse to AST)
|
|
163
|
-
if (!entry.source && sourcemapData.lineLengths) {
|
|
164
|
-
// get runtime code with ts-node
|
|
165
|
-
let source = '';
|
|
166
|
-
sourcemapData.lineLengths.forEach((length) => {
|
|
167
|
-
source += `${''.padEnd(length, '*')}\n`;
|
|
168
|
-
});
|
|
169
|
-
entry.fake = true;
|
|
170
|
-
entry.source = source;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
await coverageReport.add(coverageList);
|
|
176
211
|
}
|
|
177
212
|
|
|
178
213
|
await coverageReport.generate();
|
package/lib/index.js
CHANGED
|
@@ -3,7 +3,7 @@ const path = require('path');
|
|
|
3
3
|
const defaultOptions = require('./default/options.js');
|
|
4
4
|
const Util = require('./utils/util.js');
|
|
5
5
|
|
|
6
|
-
const { initV8ListAndSourcemap } = require('./v8/v8.js');
|
|
6
|
+
const { initV8ListAndSourcemap, getEntryFilter } = require('./v8/v8.js');
|
|
7
7
|
const { getInputData, generateCoverageReports } = require('./generate.js');
|
|
8
8
|
const { getSnapshot, diffSnapshot } = require('./utils/snapshot.js');
|
|
9
9
|
|
|
@@ -63,12 +63,12 @@ class CoverageReport {
|
|
|
63
63
|
const dataPath = path.resolve(this.options.cacheDir, dataName);
|
|
64
64
|
|
|
65
65
|
const results = {
|
|
66
|
-
id: dataId
|
|
67
|
-
path: dataPath
|
|
66
|
+
id: dataId
|
|
68
67
|
};
|
|
69
68
|
|
|
70
69
|
if (Array.isArray(data)) {
|
|
71
70
|
results.type = 'v8';
|
|
71
|
+
// could be empty list after entryFilter
|
|
72
72
|
results.data = await initV8ListAndSourcemap(data, this.options);
|
|
73
73
|
} else {
|
|
74
74
|
results.type = 'istanbul';
|
|
@@ -170,6 +170,10 @@ class CoverageReport {
|
|
|
170
170
|
return false;
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
+
getEntryFilter() {
|
|
174
|
+
return getEntryFilter(this.options);
|
|
175
|
+
}
|
|
176
|
+
|
|
173
177
|
}
|
|
174
178
|
|
|
175
179
|
/** create coverage report */
|
package/lib/v8/v8.js
CHANGED