@vitest/coverage-v8 4.0.0-beta.3 → 4.0.0-beta.5
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/index.js +6 -4
- package/dist/provider.js +34 -45
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -25,10 +25,12 @@ const mod = {
|
|
|
25
25
|
return reject(error);
|
|
26
26
|
}
|
|
27
27
|
try {
|
|
28
|
-
const result = coverage.result.filter(filterResult).map((res) =>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
const result = coverage.result.filter(filterResult).map((res) => {
|
|
29
|
+
return {
|
|
30
|
+
...res,
|
|
31
|
+
startOffset: options?.moduleExecutionInfo?.get(fileURLToPath(res.url))?.startOffset || 0
|
|
32
|
+
};
|
|
33
|
+
});
|
|
32
34
|
resolve({ result });
|
|
33
35
|
} catch (e) {
|
|
34
36
|
reject(e);
|
package/dist/provider.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { promises } from 'node:fs';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import { mergeProcessCovs } from '@bcoe/v8-coverage';
|
|
4
|
+
import { cleanUrl } from '@vitest/utils';
|
|
4
5
|
import astV8ToIstanbul from 'ast-v8-to-istanbul';
|
|
5
6
|
import createDebug from 'debug';
|
|
6
7
|
import libCoverage from 'istanbul-lib-coverage';
|
|
@@ -10,9 +11,8 @@ import reports from 'istanbul-reports';
|
|
|
10
11
|
import { parseModule } from 'magicast';
|
|
11
12
|
import { provider } from 'std-env';
|
|
12
13
|
import c from 'tinyrainbow';
|
|
13
|
-
import { builtinModules } from 'node:module';
|
|
14
14
|
import { BaseCoverageProvider } from 'vitest/coverage';
|
|
15
|
-
import { parseAstAsync } from 'vitest/node';
|
|
15
|
+
import { parseAstAsync, isCSSRequest } from 'vitest/node';
|
|
16
16
|
|
|
17
17
|
const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
|
|
18
18
|
function normalizeWindowsPath(input = "") {
|
|
@@ -117,31 +117,7 @@ const isAbsolute = function(p) {
|
|
|
117
117
|
return _IS_ABSOLUTE_RE.test(p);
|
|
118
118
|
};
|
|
119
119
|
|
|
120
|
-
|
|
121
|
-
const drive = isWindows ? process.cwd()[0] : null;
|
|
122
|
-
drive ? drive === drive.toUpperCase() ? drive.toLowerCase() : drive.toUpperCase() : null;
|
|
123
|
-
const postfixRE = /[?#].*$/;
|
|
124
|
-
function cleanUrl(url) {
|
|
125
|
-
return url.replace(postfixRE, "");
|
|
126
|
-
}
|
|
127
|
-
new Set([
|
|
128
|
-
...builtinModules,
|
|
129
|
-
"assert/strict",
|
|
130
|
-
"diagnostics_channel",
|
|
131
|
-
"dns/promises",
|
|
132
|
-
"fs/promises",
|
|
133
|
-
"path/posix",
|
|
134
|
-
"path/win32",
|
|
135
|
-
"readline/promises",
|
|
136
|
-
"stream/consumers",
|
|
137
|
-
"stream/promises",
|
|
138
|
-
"stream/web",
|
|
139
|
-
"timers/promises",
|
|
140
|
-
"util/types",
|
|
141
|
-
"wasi"
|
|
142
|
-
]);
|
|
143
|
-
|
|
144
|
-
var version = "4.0.0-beta.3";
|
|
120
|
+
var version = "4.0.0-beta.5";
|
|
145
121
|
|
|
146
122
|
const FILE_PROTOCOL = "file://";
|
|
147
123
|
const debug = createDebug("vitest:coverage");
|
|
@@ -169,8 +145,8 @@ class V8CoverageProvider extends BaseCoverageProvider {
|
|
|
169
145
|
}
|
|
170
146
|
});
|
|
171
147
|
},
|
|
172
|
-
onFinished: async (project,
|
|
173
|
-
const converted = await this.convertCoverage(merged, project,
|
|
148
|
+
onFinished: async (project, environment) => {
|
|
149
|
+
const converted = await this.convertCoverage(merged, project, environment);
|
|
174
150
|
// Source maps can change based on projectName and transform mode.
|
|
175
151
|
// Coverage transform re-uses source maps so we need to separate transforms from each other.
|
|
176
152
|
const transformedCoverage = await transformCoverage(converted);
|
|
@@ -222,7 +198,7 @@ class V8CoverageProvider extends BaseCoverageProvider {
|
|
|
222
198
|
return parseModule(await promises.readFile(configFilePath, "utf8"));
|
|
223
199
|
}
|
|
224
200
|
async getCoverageMapForUncoveredFiles(testedFiles) {
|
|
225
|
-
const transformResults = normalizeTransformResults(this.ctx.
|
|
201
|
+
const transformResults = normalizeTransformResults(this.ctx.vite.environments);
|
|
226
202
|
const transform = this.createUncoveredFileTransformer(this.ctx);
|
|
227
203
|
const uncoveredFiles = await this.getUntestedFiles(testedFiles);
|
|
228
204
|
let index = 0;
|
|
@@ -299,6 +275,10 @@ class V8CoverageProvider extends BaseCoverageProvider {
|
|
|
299
275
|
if (type === "statement" && node.type === "ExpressionStatement" && node.expression.type === "AssignmentExpression" && node.expression.left.type === "MemberExpression" && node.expression.left.object.type === "MetaProperty" && node.expression.left.object.meta.name === "import" && node.expression.left.object.property.name === "meta" && node.expression.left.property.type === "Identifier" && node.expression.left.property.name === "env") {
|
|
300
276
|
return true;
|
|
301
277
|
}
|
|
278
|
+
// SSR mode's "import.meta.env ="
|
|
279
|
+
if (type === "statement" && node.type === "ExpressionStatement" && node.expression.type === "AssignmentExpression" && node.expression.left.type === "MemberExpression" && node.expression.left.object.type === "Identifier" && node.expression.left.object.name === "__vite_ssr_import_meta__") {
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
302
282
|
// SWC's decorators
|
|
303
283
|
if (type === "statement" && node.type === "ExpressionStatement" && node.expression.type === "CallExpression" && node.expression.callee.type === "Identifier" && node.expression.callee.name === "_ts_decorate") {
|
|
304
284
|
return "ignore-this-and-nested-nodes";
|
|
@@ -314,7 +294,7 @@ class V8CoverageProvider extends BaseCoverageProvider {
|
|
|
314
294
|
}
|
|
315
295
|
const map = transformResult?.map;
|
|
316
296
|
const code = transformResult?.code;
|
|
317
|
-
if (
|
|
297
|
+
if (code == null) {
|
|
318
298
|
const original = await promises.readFile(filePath, "utf-8").catch(() => {
|
|
319
299
|
// If file does not exist construct a dummy source for it.
|
|
320
300
|
// These can be files that were generated dynamically during the test run and were removed after it.
|
|
@@ -336,14 +316,17 @@ class V8CoverageProvider extends BaseCoverageProvider {
|
|
|
336
316
|
map
|
|
337
317
|
};
|
|
338
318
|
}
|
|
339
|
-
async convertCoverage(coverage, project = this.ctx.getRootProject(),
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
319
|
+
async convertCoverage(coverage, project = this.ctx.getRootProject(), environment) {
|
|
320
|
+
if (environment === "__browser__" && !project.browser) {
|
|
321
|
+
throw new Error(`Cannot access browser module graph because it was torn down.`);
|
|
322
|
+
}
|
|
323
|
+
const moduleGraph = environment === "__browser__" ? project.browser.vite.environments.client.moduleGraph : project.vite.environments[environment]?.moduleGraph;
|
|
324
|
+
if (!moduleGraph) {
|
|
325
|
+
throw new Error(`Module graph for environment ${environment} was not defined.`);
|
|
343
326
|
}
|
|
344
|
-
const transformResults = normalizeTransformResults(
|
|
327
|
+
const transformResults = normalizeTransformResults({ [environment]: { moduleGraph } });
|
|
345
328
|
async function onTransform(filepath) {
|
|
346
|
-
if (
|
|
329
|
+
if (environment === "__browser__" && project.browser) {
|
|
347
330
|
const result = await project.browser.vite.transformRequest(removeStartsWith(filepath, project.config.root));
|
|
348
331
|
if (result) {
|
|
349
332
|
return {
|
|
@@ -352,11 +335,11 @@ class V8CoverageProvider extends BaseCoverageProvider {
|
|
|
352
335
|
};
|
|
353
336
|
}
|
|
354
337
|
}
|
|
355
|
-
return project.
|
|
338
|
+
return project.vite.environments[environment].transformRequest(filepath);
|
|
356
339
|
}
|
|
357
340
|
const scriptCoverages = [];
|
|
358
341
|
for (const result of coverage.result) {
|
|
359
|
-
if (
|
|
342
|
+
if (environment === "__browser__") {
|
|
360
343
|
if (result.url.startsWith("/@fs")) {
|
|
361
344
|
result.url = `${FILE_PROTOCOL}${removeStartsWith(result.url, "/@fs")}`;
|
|
362
345
|
} else if (result.url.startsWith(project.config.root)) {
|
|
@@ -365,7 +348,10 @@ class V8CoverageProvider extends BaseCoverageProvider {
|
|
|
365
348
|
result.url = `${FILE_PROTOCOL}${project.config.root}${result.url}`;
|
|
366
349
|
}
|
|
367
350
|
}
|
|
368
|
-
|
|
351
|
+
// Ignore all CSS requests, so we don't override the actual code coverage
|
|
352
|
+
// In cases where CSS and JS are in the same file (.vue, .svelte)
|
|
353
|
+
// The file has a `.vue` extension, but the URL has `lang.css` query
|
|
354
|
+
if (!isCSSRequest(result.url) && this.isIncluded(fileURLToPath(result.url))) {
|
|
369
355
|
scriptCoverages.push(result);
|
|
370
356
|
}
|
|
371
357
|
}
|
|
@@ -409,12 +395,15 @@ function findLongestFunctionLength(functions) {
|
|
|
409
395
|
return Math.max(previous, maxEndOffset);
|
|
410
396
|
}, 0);
|
|
411
397
|
}
|
|
412
|
-
function normalizeTransformResults(
|
|
398
|
+
function normalizeTransformResults(environments) {
|
|
413
399
|
const normalized = new Map();
|
|
414
|
-
for (const
|
|
415
|
-
const
|
|
416
|
-
|
|
417
|
-
|
|
400
|
+
for (const environmentName in environments) {
|
|
401
|
+
const moduleGraph = environments[environmentName].moduleGraph;
|
|
402
|
+
for (const [key, value] of moduleGraph.idToModuleMap) {
|
|
403
|
+
const cleanEntry = cleanUrl(key);
|
|
404
|
+
if (value.transformResult && !normalized.has(cleanEntry)) {
|
|
405
|
+
normalized.set(cleanEntry, value.transformResult);
|
|
406
|
+
}
|
|
418
407
|
}
|
|
419
408
|
}
|
|
420
409
|
return normalized;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitest/coverage-v8",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.0.0-beta.
|
|
4
|
+
"version": "4.0.0-beta.5",
|
|
5
5
|
"description": "V8 coverage provider for Vitest",
|
|
6
6
|
"author": "Anthony Fu <anthonyfu117@hotmail.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"dist"
|
|
42
42
|
],
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"@vitest/browser": "4.0.0-beta.
|
|
45
|
-
"vitest": "4.0.0-beta.
|
|
44
|
+
"@vitest/browser": "4.0.0-beta.5",
|
|
45
|
+
"vitest": "4.0.0-beta.5"
|
|
46
46
|
},
|
|
47
47
|
"peerDependenciesMeta": {
|
|
48
48
|
"@vitest/browser": {
|
|
@@ -59,7 +59,8 @@
|
|
|
59
59
|
"istanbul-reports": "^3.1.7",
|
|
60
60
|
"magicast": "^0.3.5",
|
|
61
61
|
"std-env": "^3.9.0",
|
|
62
|
-
"tinyrainbow": "^2.0.0"
|
|
62
|
+
"tinyrainbow": "^2.0.0",
|
|
63
|
+
"@vitest/utils": "4.0.0-beta.5"
|
|
63
64
|
},
|
|
64
65
|
"devDependencies": {
|
|
65
66
|
"@types/debug": "^4.1.12",
|
|
@@ -68,9 +69,8 @@
|
|
|
68
69
|
"@types/istanbul-lib-source-maps": "^4.0.4",
|
|
69
70
|
"@types/istanbul-reports": "^3.0.4",
|
|
70
71
|
"pathe": "^2.0.3",
|
|
71
|
-
"vitest": "4.0.0-beta.
|
|
72
|
-
"
|
|
73
|
-
"@vitest/browser": "4.0.0-beta.3"
|
|
72
|
+
"@vitest/browser": "4.0.0-beta.5",
|
|
73
|
+
"vitest": "4.0.0-beta.5"
|
|
74
74
|
},
|
|
75
75
|
"scripts": {
|
|
76
76
|
"build": "rimraf dist && rollup -c",
|