@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 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
- ...res,
30
- startOffset: options?.moduleExecutionInfo?.get(fileURLToPath(res.url))?.startOffset || 0
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
- const isWindows = process.platform === "win32";
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, transformMode) => {
173
- const converted = await this.convertCoverage(merged, project, transformMode);
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.vitenode.fetchCache);
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 (!code) {
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(), transformMode) {
340
- let fetchCache = project.vitenode.fetchCache;
341
- if (transformMode) {
342
- fetchCache = transformMode === "browser" ? new Map() : project.vitenode.fetchCaches[transformMode];
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(fetchCache);
327
+ const transformResults = normalizeTransformResults({ [environment]: { moduleGraph } });
345
328
  async function onTransform(filepath) {
346
- if (transformMode === "browser" && project.browser) {
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.vitenode.transformRequest(filepath);
338
+ return project.vite.environments[environment].transformRequest(filepath);
356
339
  }
357
340
  const scriptCoverages = [];
358
341
  for (const result of coverage.result) {
359
- if (transformMode === "browser") {
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
- if (this.isIncluded(fileURLToPath(result.url))) {
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(fetchCache) {
398
+ function normalizeTransformResults(environments) {
413
399
  const normalized = new Map();
414
- for (const [key, value] of fetchCache.entries()) {
415
- const cleanEntry = cleanUrl(key);
416
- if (!normalized.has(cleanEntry)) {
417
- normalized.set(cleanEntry, value.result);
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.3",
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.3",
45
- "vitest": "4.0.0-beta.3"
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.3",
72
- "vite-node": "4.0.0-beta.3",
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",