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 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
  [![codecov](https://codecov.io/gh/cenfun/monocart-coverage-reports/graph/badge.svg?token=H0LW7UKYU3)](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
- let coverageList = json.result;
138
-
139
- // for node sourcemap
140
- const sourceMapCache = json['source-map-cache'] || {};
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();
@@ -135,8 +135,8 @@ const collectSourceMaps = async (v8list, options) => {
135
135
 
136
136
  // save source and sourceMap to separated json file
137
137
  const sourceData = {
138
- url,
139
138
  id,
139
+ url,
140
140
  source,
141
141
  sourceMap
142
142
  };
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
@@ -395,5 +395,6 @@ const saveV8Report = async (v8list, options) => {
395
395
  module.exports = {
396
396
  initV8ListAndSourcemap,
397
397
  mergeV8Coverage,
398
- saveV8Report
398
+ saveV8Report,
399
+ getEntryFilter
399
400
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monocart-coverage-reports",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Monocart coverage reports",
5
5
  "main": "./lib/index.js",
6
6
  "bin": {