@vitest/coverage-istanbul 5.0.0-beta.5 → 5.0.0-beta.7
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/base-BmUGq4Ml.js +39 -0
- package/dist/browser.d.ts +5 -0
- package/dist/browser.js +23 -0
- package/dist/commands-KXFl3PvR.js +118 -0
- package/dist/index.js +18 -30
- package/dist/provider.js +12 -2
- package/package.json +7 -3
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { C as COVERAGE_STORE_KEY } from './constants-BCJfMgEg.js';
|
|
2
|
+
|
|
3
|
+
const BaseCoverageProviderModule = {
|
|
4
|
+
takeCoverage() {
|
|
5
|
+
// @ts-expect-error -- untyped global
|
|
6
|
+
return globalThis[COVERAGE_STORE_KEY];
|
|
7
|
+
},
|
|
8
|
+
startCoverage() {
|
|
9
|
+
// @ts-expect-error -- untyped global
|
|
10
|
+
const coverageMap = globalThis[COVERAGE_STORE_KEY];
|
|
11
|
+
// When isolated, there are no previous results
|
|
12
|
+
if (!coverageMap) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
for (const filename in coverageMap) {
|
|
16
|
+
const branches = coverageMap[filename].b;
|
|
17
|
+
for (const key in branches) {
|
|
18
|
+
branches[key] = branches[key].map(() => 0);
|
|
19
|
+
}
|
|
20
|
+
for (const metric of ["f", "s"]) {
|
|
21
|
+
const entry = coverageMap[filename][metric];
|
|
22
|
+
for (const key in entry) {
|
|
23
|
+
entry[key] = 0;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
async getProvider() {
|
|
29
|
+
// to not bundle the provider
|
|
30
|
+
const providerPath = "./provider.js";
|
|
31
|
+
const { IstanbulCoverageProvider } = await import(
|
|
32
|
+
/* @vite-ignore */
|
|
33
|
+
providerPath
|
|
34
|
+
);
|
|
35
|
+
return new IstanbulCoverageProvider();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export { BaseCoverageProviderModule as B };
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { B as BaseCoverageProviderModule } from './base-BmUGq4Ml.js';
|
|
2
|
+
import './constants-BCJfMgEg.js';
|
|
3
|
+
|
|
4
|
+
function triggerCommand(command, args = []) {
|
|
5
|
+
return globalThis.__vitest_browser_runner__?.commands?.triggerCommand?.(command, args);
|
|
6
|
+
}
|
|
7
|
+
const mod = {
|
|
8
|
+
takeCoverage() {
|
|
9
|
+
const coverage = BaseCoverageProviderModule.takeCoverage();
|
|
10
|
+
if (!coverage) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
return triggerCommand("__vitest_writeCoverageFile", [coverage]);
|
|
14
|
+
},
|
|
15
|
+
startCoverage() {
|
|
16
|
+
BaseCoverageProviderModule.startCoverage();
|
|
17
|
+
},
|
|
18
|
+
getProvider() {
|
|
19
|
+
return BaseCoverageProviderModule.getProvider();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export { mod as default };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { writeFile } from 'node:fs/promises';
|
|
4
|
+
|
|
5
|
+
const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
|
|
6
|
+
function normalizeWindowsPath(input = "") {
|
|
7
|
+
if (!input) {
|
|
8
|
+
return input;
|
|
9
|
+
}
|
|
10
|
+
return input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
|
|
11
|
+
}
|
|
12
|
+
const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/;
|
|
13
|
+
function cwd() {
|
|
14
|
+
if (typeof process !== "undefined" && typeof process.cwd === "function") {
|
|
15
|
+
return process.cwd().replace(/\\/g, "/");
|
|
16
|
+
}
|
|
17
|
+
return "/";
|
|
18
|
+
}
|
|
19
|
+
const resolve = function(...arguments_) {
|
|
20
|
+
arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
|
|
21
|
+
let resolvedPath = "";
|
|
22
|
+
let resolvedAbsolute = false;
|
|
23
|
+
for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
|
|
24
|
+
const path = index >= 0 ? arguments_[index] : cwd();
|
|
25
|
+
if (!path || path.length === 0) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
resolvedPath = `${path}/${resolvedPath}`;
|
|
29
|
+
resolvedAbsolute = isAbsolute(path);
|
|
30
|
+
}
|
|
31
|
+
resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute);
|
|
32
|
+
if (resolvedAbsolute && !isAbsolute(resolvedPath)) {
|
|
33
|
+
return `/${resolvedPath}`;
|
|
34
|
+
}
|
|
35
|
+
return resolvedPath.length > 0 ? resolvedPath : ".";
|
|
36
|
+
};
|
|
37
|
+
function normalizeString(path, allowAboveRoot) {
|
|
38
|
+
let res = "";
|
|
39
|
+
let lastSegmentLength = 0;
|
|
40
|
+
let lastSlash = -1;
|
|
41
|
+
let dots = 0;
|
|
42
|
+
let char = null;
|
|
43
|
+
for (let index = 0; index <= path.length; ++index) {
|
|
44
|
+
if (index < path.length) {
|
|
45
|
+
char = path[index];
|
|
46
|
+
} else if (char === "/") {
|
|
47
|
+
break;
|
|
48
|
+
} else {
|
|
49
|
+
char = "/";
|
|
50
|
+
}
|
|
51
|
+
if (char === "/") {
|
|
52
|
+
if (lastSlash === index - 1 || dots === 1) ; else if (dots === 2) {
|
|
53
|
+
if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
|
|
54
|
+
if (res.length > 2) {
|
|
55
|
+
const lastSlashIndex = res.lastIndexOf("/");
|
|
56
|
+
if (lastSlashIndex === -1) {
|
|
57
|
+
res = "";
|
|
58
|
+
lastSegmentLength = 0;
|
|
59
|
+
} else {
|
|
60
|
+
res = res.slice(0, lastSlashIndex);
|
|
61
|
+
lastSegmentLength = res.length - 1 - res.lastIndexOf("/");
|
|
62
|
+
}
|
|
63
|
+
lastSlash = index;
|
|
64
|
+
dots = 0;
|
|
65
|
+
continue;
|
|
66
|
+
} else if (res.length > 0) {
|
|
67
|
+
res = "";
|
|
68
|
+
lastSegmentLength = 0;
|
|
69
|
+
lastSlash = index;
|
|
70
|
+
dots = 0;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (allowAboveRoot) {
|
|
75
|
+
res += res.length > 0 ? "/.." : "..";
|
|
76
|
+
lastSegmentLength = 2;
|
|
77
|
+
}
|
|
78
|
+
} else {
|
|
79
|
+
if (res.length > 0) {
|
|
80
|
+
res += `/${path.slice(lastSlash + 1, index)}`;
|
|
81
|
+
} else {
|
|
82
|
+
res = path.slice(lastSlash + 1, index);
|
|
83
|
+
}
|
|
84
|
+
lastSegmentLength = index - lastSlash - 1;
|
|
85
|
+
}
|
|
86
|
+
lastSlash = index;
|
|
87
|
+
dots = 0;
|
|
88
|
+
} else if (char === "." && dots !== -1) {
|
|
89
|
+
++dots;
|
|
90
|
+
} else {
|
|
91
|
+
dots = -1;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return res;
|
|
95
|
+
}
|
|
96
|
+
const isAbsolute = function(p) {
|
|
97
|
+
return _IS_ABSOLUTE_RE.test(p);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const commands = { writeCoverageFile(context, coverage) {
|
|
101
|
+
const provider = context.project.vitest.coverageProvider;
|
|
102
|
+
return writeCoverageFile(provider.coverageFilesDirectory, coverage);
|
|
103
|
+
} };
|
|
104
|
+
async function writeCoverageFile(coverageFilesDirectory, coverage) {
|
|
105
|
+
// Write results on file system directly and transfer only the filename over RPC
|
|
106
|
+
const filename = resolve(coverageFilesDirectory, `coverage-${randomUUID()}.json`);
|
|
107
|
+
try {
|
|
108
|
+
await writeFile(filename, JSON.stringify(coverage), "utf-8");
|
|
109
|
+
} catch (error) {
|
|
110
|
+
if (!existsSync(coverageFilesDirectory)) {
|
|
111
|
+
throw new Error(`Something removed the coverage directory "${coverageFilesDirectory}" Vitest created earlier. Make sure you are not running multiple Vitests with the same "coverage.reportsDirectory" at the same time.`, { cause: error });
|
|
112
|
+
}
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
return filename;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export { commands as c, writeCoverageFile as w };
|
package/dist/index.js
CHANGED
|
@@ -1,38 +1,26 @@
|
|
|
1
|
-
import
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { B as BaseCoverageProviderModule } from './base-BmUGq4Ml.js';
|
|
3
|
+
import { w as writeCoverageFile } from './commands-KXFl3PvR.js';
|
|
4
|
+
import './constants-BCJfMgEg.js';
|
|
5
|
+
import 'node:crypto';
|
|
6
|
+
import 'node:fs';
|
|
7
|
+
import 'node:fs/promises';
|
|
2
8
|
|
|
3
9
|
const mod = {
|
|
4
|
-
takeCoverage() {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
},
|
|
8
|
-
startCoverage() {
|
|
9
|
-
// @ts-expect-error -- untyped global
|
|
10
|
-
const coverageMap = globalThis[COVERAGE_STORE_KEY];
|
|
11
|
-
// When isolated, there are no previous results
|
|
12
|
-
if (!coverageMap) {
|
|
10
|
+
takeCoverage(options) {
|
|
11
|
+
const coverage = BaseCoverageProviderModule.takeCoverage();
|
|
12
|
+
if (!coverage) {
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const entry = coverageMap[filename][metric];
|
|
22
|
-
for (const key in entry) {
|
|
23
|
-
entry[key] = 0;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
15
|
+
const coverageFilesDirectory = options?.coverageFilesDirectory;
|
|
16
|
+
assert(coverageFilesDirectory, "coverageFilesDirectory is required");
|
|
17
|
+
return writeCoverageFile(coverageFilesDirectory, coverage);
|
|
18
|
+
},
|
|
19
|
+
startCoverage() {
|
|
20
|
+
BaseCoverageProviderModule.startCoverage();
|
|
27
21
|
},
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const providerPath = "./provider.js";
|
|
31
|
-
const { IstanbulCoverageProvider } = await import(
|
|
32
|
-
/* @vite-ignore */
|
|
33
|
-
providerPath
|
|
34
|
-
);
|
|
35
|
-
return new IstanbulCoverageProvider();
|
|
22
|
+
getProvider() {
|
|
23
|
+
return BaseCoverageProviderModule.getProvider();
|
|
36
24
|
}
|
|
37
25
|
};
|
|
38
26
|
|
package/dist/provider.js
CHANGED
|
@@ -17,7 +17,10 @@ import { parseModule } from 'magicast';
|
|
|
17
17
|
import { createDebug } from 'obug';
|
|
18
18
|
import c from 'tinyrainbow';
|
|
19
19
|
import { BaseCoverageProvider, isCSSRequest } from 'vitest/node';
|
|
20
|
+
import { c as commands } from './commands-KXFl3PvR.js';
|
|
20
21
|
import { C as COVERAGE_STORE_KEY } from './constants-BCJfMgEg.js';
|
|
22
|
+
import 'node:crypto';
|
|
23
|
+
import 'node:fs/promises';
|
|
21
24
|
|
|
22
25
|
function getDefaultExportFromCjs(x) {
|
|
23
26
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
|
@@ -3543,7 +3546,7 @@ function requireIstanbulLibSourceMaps () {
|
|
|
3543
3546
|
var istanbulLibSourceMapsExports = requireIstanbulLibSourceMaps();
|
|
3544
3547
|
var libSourceMaps = /*@__PURE__*/getDefaultExportFromCjs(istanbulLibSourceMapsExports);
|
|
3545
3548
|
|
|
3546
|
-
var version = "5.0.0-beta.
|
|
3549
|
+
var version = "5.0.0-beta.7";
|
|
3547
3550
|
|
|
3548
3551
|
const debug = createDebug("vitest:coverage");
|
|
3549
3552
|
class IstanbulCoverageProvider extends BaseCoverageProvider {
|
|
@@ -3553,6 +3556,13 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
|
|
|
3553
3556
|
transformedModuleIds = new Set();
|
|
3554
3557
|
initialize(ctx) {
|
|
3555
3558
|
this._initialize(ctx);
|
|
3559
|
+
for (const project of ctx.projects) {
|
|
3560
|
+
if (project.isBrowserEnabled() && project.browser) {
|
|
3561
|
+
for (const [name, command] of Object.entries(commands)) {
|
|
3562
|
+
project.browser.registerCommand(`__vitest_${name}`, command);
|
|
3563
|
+
}
|
|
3564
|
+
}
|
|
3565
|
+
}
|
|
3556
3566
|
if (this.options.instrumenter) {
|
|
3557
3567
|
this.instrumenter = this.options.instrumenter({
|
|
3558
3568
|
coverageVariable: COVERAGE_STORE_KEY,
|
|
@@ -3692,7 +3702,7 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
|
|
|
3692
3702
|
}
|
|
3693
3703
|
async getCoverageMapForUncoveredFiles(coveredFiles) {
|
|
3694
3704
|
const uncoveredFiles = await this.getUntestedFiles(coveredFiles);
|
|
3695
|
-
const cacheKey =
|
|
3705
|
+
const cacheKey = Date.now();
|
|
3696
3706
|
const coverageMap = this.createCoverageMap();
|
|
3697
3707
|
const transform = this.createUncoveredFileTransformer(this.ctx);
|
|
3698
3708
|
// Note that these cannot be run parallel as synchronous instrumenter.lastFileCoverage
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitest/coverage-istanbul",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.0.0-beta.
|
|
4
|
+
"version": "5.0.0-beta.7",
|
|
5
5
|
"description": "Istanbul coverage provider for Vitest",
|
|
6
6
|
"author": "Anthony Fu <anthonyfu117@hotmail.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -28,6 +28,10 @@
|
|
|
28
28
|
"types": "./dist/index.d.ts",
|
|
29
29
|
"default": "./dist/index.js"
|
|
30
30
|
},
|
|
31
|
+
"./browser": {
|
|
32
|
+
"types": "./dist/browser.d.ts",
|
|
33
|
+
"default": "./dist/browser.js"
|
|
34
|
+
},
|
|
31
35
|
"./*": "./*"
|
|
32
36
|
},
|
|
33
37
|
"main": "./dist/index.js",
|
|
@@ -37,7 +41,7 @@
|
|
|
37
41
|
"dist"
|
|
38
42
|
],
|
|
39
43
|
"peerDependencies": {
|
|
40
|
-
"vitest": "5.0.0-beta.
|
|
44
|
+
"vitest": "5.0.0-beta.7"
|
|
41
45
|
},
|
|
42
46
|
"dependencies": {
|
|
43
47
|
"@babel/core": "^7.29.0",
|
|
@@ -60,7 +64,7 @@
|
|
|
60
64
|
"istanbul-lib-instrument": "^6.0.3",
|
|
61
65
|
"istanbul-lib-source-maps": "^5.0.6",
|
|
62
66
|
"pathe": "^2.0.3",
|
|
63
|
-
"vitest": "5.0.0-beta.
|
|
67
|
+
"vitest": "5.0.0-beta.7"
|
|
64
68
|
},
|
|
65
69
|
"scripts": {
|
|
66
70
|
"build": "premove dist && rollup -c",
|