@vitest/coverage-istanbul 1.0.0-beta.2 → 1.0.0-beta.4
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/provider.d.ts +7 -4
- package/dist/provider.js +48 -19
- package/package.json +3 -3
package/dist/provider.d.ts
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
import { CoverageProvider, Vitest, AfterSuiteRunMeta, ReportContext, ResolvedCoverageOptions } from 'vitest';
|
2
2
|
import { BaseCoverageProvider } from 'vitest/coverage';
|
3
|
-
import {
|
3
|
+
import { CoverageMapData } from 'istanbul-lib-coverage';
|
4
4
|
import { Instrumenter } from 'istanbul-lib-instrument';
|
5
5
|
|
6
6
|
type Options = ResolvedCoverageOptions<'istanbul'>;
|
7
|
+
type CoverageByTransformMode = Record<AfterSuiteRunMeta['transformMode'], CoverageMapData[]>;
|
8
|
+
type ProjectName = NonNullable<AfterSuiteRunMeta['projectName']> | typeof DEFAULT_PROJECT;
|
7
9
|
interface TestExclude {
|
8
10
|
new (opts: {
|
9
11
|
cwd?: string | string[];
|
@@ -17,6 +19,7 @@ interface TestExclude {
|
|
17
19
|
glob(cwd: string): Promise<string[]>;
|
18
20
|
};
|
19
21
|
}
|
22
|
+
declare const DEFAULT_PROJECT: unique symbol;
|
20
23
|
declare class IstanbulCoverageProvider extends BaseCoverageProvider implements CoverageProvider {
|
21
24
|
name: string;
|
22
25
|
ctx: Vitest;
|
@@ -29,17 +32,17 @@ declare class IstanbulCoverageProvider extends BaseCoverageProvider implements C
|
|
29
32
|
* If storing in memory causes issues, we can simply write these into fs in `onAfterSuiteRun`
|
30
33
|
* and read them back when merging coverage objects in `onAfterAllFilesRun`.
|
31
34
|
*/
|
32
|
-
coverages:
|
35
|
+
coverages: Map<ProjectName, CoverageByTransformMode>;
|
33
36
|
initialize(ctx: Vitest): void;
|
34
37
|
resolveOptions(): Options;
|
35
38
|
onFileTransform(sourceCode: string, id: string, pluginCtx: any): {
|
36
39
|
code: string;
|
37
40
|
map: any;
|
38
41
|
} | undefined;
|
39
|
-
onAfterSuiteRun({ coverage }: AfterSuiteRunMeta): void;
|
42
|
+
onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta): void;
|
40
43
|
clean(clean?: boolean): Promise<void>;
|
41
44
|
reportCoverage({ allTestsRun }?: ReportContext): Promise<void>;
|
42
|
-
|
45
|
+
getCoverageMapForUncoveredFiles(coveredFiles: string[]): Promise<CoverageMapData>;
|
43
46
|
}
|
44
47
|
|
45
48
|
export { IstanbulCoverageProvider };
|
package/dist/provider.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { existsSync, promises } from 'fs';
|
1
|
+
import { existsSync, promises } from 'node:fs';
|
2
2
|
import { coverageConfigDefaults, defaultExclude, defaultInclude } from 'vitest/config';
|
3
3
|
import { BaseCoverageProvider } from 'vitest/coverage';
|
4
4
|
import c from 'picocolors';
|
@@ -104,6 +104,7 @@ const isAbsolute = function(p) {
|
|
104
104
|
return _IS_ABSOLUTE_RE.test(p);
|
105
105
|
};
|
106
106
|
|
107
|
+
const DEFAULT_PROJECT = Symbol.for("default-project");
|
107
108
|
class IstanbulCoverageProvider extends BaseCoverageProvider {
|
108
109
|
name = "istanbul";
|
109
110
|
ctx;
|
@@ -116,7 +117,7 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
|
|
116
117
|
* If storing in memory causes issues, we can simply write these into fs in `onAfterSuiteRun`
|
117
118
|
* and read them back when merging coverage objects in `onAfterAllFilesRun`.
|
118
119
|
*/
|
119
|
-
coverages =
|
120
|
+
coverages = /* @__PURE__ */ new Map();
|
120
121
|
initialize(ctx) {
|
121
122
|
const config = ctx.config.coverage;
|
122
123
|
this.ctx = ctx;
|
@@ -165,29 +166,42 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
|
|
165
166
|
const map = this.instrumenter.lastSourceMap();
|
166
167
|
return { code, map };
|
167
168
|
}
|
168
|
-
|
169
|
-
|
169
|
+
/*
|
170
|
+
* Coverage and meta information passed from Vitest runners.
|
171
|
+
* Note that adding new entries here and requiring on those without
|
172
|
+
* backwards compatibility is a breaking change.
|
173
|
+
*/
|
174
|
+
onAfterSuiteRun({ coverage, transformMode, projectName }) {
|
175
|
+
if (transformMode !== "web" && transformMode !== "ssr")
|
176
|
+
throw new Error(`Invalid transform mode: ${transformMode}`);
|
177
|
+
let entry = this.coverages.get(projectName || DEFAULT_PROJECT);
|
178
|
+
if (!entry) {
|
179
|
+
entry = { web: [], ssr: [] };
|
180
|
+
this.coverages.set(projectName || DEFAULT_PROJECT, entry);
|
181
|
+
}
|
182
|
+
entry[transformMode].push(coverage);
|
170
183
|
}
|
171
184
|
async clean(clean = true) {
|
172
185
|
if (clean && existsSync(this.options.reportsDirectory))
|
173
186
|
await promises.rm(this.options.reportsDirectory, { recursive: true, force: true, maxRetries: 10 });
|
174
|
-
this.coverages =
|
187
|
+
this.coverages = /* @__PURE__ */ new Map();
|
175
188
|
}
|
176
189
|
async reportCoverage({ allTestsRun } = {}) {
|
177
|
-
const
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
190
|
+
const coverageMaps = await Promise.all(
|
191
|
+
Array.from(this.coverages.values()).map((coverages) => [
|
192
|
+
mergeAndTransformCoverage(coverages.ssr),
|
193
|
+
mergeAndTransformCoverage(coverages.web)
|
194
|
+
]).flat()
|
195
|
+
);
|
196
|
+
if (this.options.all && allTestsRun) {
|
197
|
+
const coveredFiles = coverageMaps.map((map) => map.files()).flat();
|
198
|
+
const uncoveredCoverage = await this.getCoverageMapForUncoveredFiles(coveredFiles);
|
199
|
+
coverageMaps.push(await mergeAndTransformCoverage([uncoveredCoverage]));
|
200
|
+
}
|
201
|
+
const coverageMap = mergeCoverageMaps(...coverageMaps);
|
187
202
|
const context = libReport.createContext({
|
188
203
|
dir: this.options.reportsDirectory,
|
189
204
|
coverageMap,
|
190
|
-
sourceFinder: sourceMapStore.sourceFinder,
|
191
205
|
watermarks: this.options.watermarks
|
192
206
|
});
|
193
207
|
if (hasTerminalReporter(this.options.reporter))
|
@@ -225,15 +239,16 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
|
|
225
239
|
});
|
226
240
|
}
|
227
241
|
}
|
228
|
-
async
|
242
|
+
async getCoverageMapForUncoveredFiles(coveredFiles) {
|
229
243
|
const includedFiles = await this.testExclude.glob(this.ctx.config.root);
|
230
|
-
const uncoveredFiles = includedFiles.map((file) => resolve(this.ctx.config.root, file)).filter((file) => !
|
244
|
+
const uncoveredFiles = includedFiles.map((file) => resolve(this.ctx.config.root, file)).filter((file) => !coveredFiles.includes(file));
|
231
245
|
const transformResults = await Promise.all(uncoveredFiles.map(async (filename) => {
|
232
246
|
const transformResult = await this.ctx.vitenode.transformRequest(filename);
|
233
247
|
return { transformResult, filename };
|
234
248
|
}));
|
249
|
+
const coverageMap = libCoverage.createCoverageMap({});
|
235
250
|
for (const { transformResult, filename } of transformResults) {
|
236
|
-
const sourceMap = transformResult
|
251
|
+
const sourceMap = transformResult?.map;
|
237
252
|
if (sourceMap) {
|
238
253
|
this.instrumenter.instrumentSync(
|
239
254
|
transformResult.code,
|
@@ -245,8 +260,22 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
|
|
245
260
|
coverageMap.addFileCoverage(lastCoverage);
|
246
261
|
}
|
247
262
|
}
|
263
|
+
return coverageMap.data;
|
248
264
|
}
|
249
265
|
}
|
266
|
+
async function mergeAndTransformCoverage(coverages) {
|
267
|
+
const mergedCoverage = mergeCoverageMaps(...coverages);
|
268
|
+
includeImplicitElseBranches(mergedCoverage);
|
269
|
+
const sourceMapStore = libSourceMaps.createSourceMapStore();
|
270
|
+
return await sourceMapStore.transformCoverage(mergedCoverage);
|
271
|
+
}
|
272
|
+
function mergeCoverageMaps(...coverageMaps) {
|
273
|
+
return coverageMaps.reduce((coverage, previousCoverageMap) => {
|
274
|
+
const map = libCoverage.createCoverageMap(coverage);
|
275
|
+
map.merge(previousCoverageMap);
|
276
|
+
return map;
|
277
|
+
}, libCoverage.createCoverageMap({}));
|
278
|
+
}
|
250
279
|
function removeQueryParameters(filename) {
|
251
280
|
return filename.split("?")[0];
|
252
281
|
}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@vitest/coverage-istanbul",
|
3
3
|
"type": "module",
|
4
|
-
"version": "1.0.0-beta.
|
4
|
+
"version": "1.0.0-beta.4",
|
5
5
|
"description": "Istanbul coverage provider for Vitest",
|
6
6
|
"author": "Anthony Fu <anthonyfu117@hotmail.com>",
|
7
7
|
"license": "MIT",
|
@@ -37,7 +37,7 @@
|
|
37
37
|
"dist"
|
38
38
|
],
|
39
39
|
"peerDependencies": {
|
40
|
-
"vitest": "
|
40
|
+
"vitest": "^1.0.0-0"
|
41
41
|
},
|
42
42
|
"dependencies": {
|
43
43
|
"istanbul-lib-coverage": "^3.2.0",
|
@@ -55,7 +55,7 @@
|
|
55
55
|
"@types/istanbul-lib-source-maps": "^4.0.1",
|
56
56
|
"@types/istanbul-reports": "^3.0.1",
|
57
57
|
"pathe": "^1.1.1",
|
58
|
-
"vitest": "1.0.0-beta.
|
58
|
+
"vitest": "1.0.0-beta.4"
|
59
59
|
},
|
60
60
|
"scripts": {
|
61
61
|
"build": "rimraf dist && rollup -c",
|