@vitest/coverage-v8 3.1.2 → 3.2.0-beta.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.
@@ -18,6 +18,7 @@ declare class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOp
18
18
  generateReports(coverageMap: CoverageMap, allTestsRun?: boolean): Promise<void>;
19
19
  parseConfigModule(configFilePath: string): Promise<ProxifiedModule<any>>;
20
20
  private getUntestedFiles;
21
+ private v8ToIstanbul;
21
22
  private getSources;
22
23
  private convertCoverage;
23
24
  }
package/dist/provider.js CHANGED
@@ -2,6 +2,7 @@ import { promises } from 'node:fs';
2
2
  import { pathToFileURL, fileURLToPath } from 'node:url';
3
3
  import remapping from '@ampproject/remapping';
4
4
  import { mergeProcessCovs } from '@bcoe/v8-coverage';
5
+ import astV8ToIstanbul from 'ast-v8-to-istanbul';
5
6
  import createDebug from 'debug';
6
7
  import libCoverage from 'istanbul-lib-coverage';
7
8
  import libReport from 'istanbul-lib-report';
@@ -20,6 +21,7 @@ import require$$9 from 'fs';
20
21
  import require$$11 from 'module';
21
22
  import { builtinModules } from 'node:module';
22
23
  import { BaseCoverageProvider } from 'vitest/coverage';
24
+ import { parseAstAsync } from 'vitest/node';
23
25
 
24
26
  const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
25
27
  function normalizeWindowsPath(input = "") {
@@ -2539,7 +2541,7 @@ new Set([
2539
2541
  "wasi"
2540
2542
  ]);
2541
2543
 
2542
- var version = "3.1.2";
2544
+ var version = "3.2.0-beta.1";
2543
2545
 
2544
2546
  const VITE_EXPORTS_LINE_PATTERN = /Object\.defineProperty\(__vite_ssr_exports__.*\n/g;
2545
2547
  const DECORATOR_METADATA_PATTERN = /_ts_metadata\("design:paramtypes", \[[^\]]*\]\),*/g;
@@ -2648,22 +2650,15 @@ class V8CoverageProvider extends BaseCoverageProvider {
2648
2650
  timeout = setTimeout(() => debug(c.bgRed(`File "${filename.pathname}" is taking longer than 3s`)), 3e3);
2649
2651
  }
2650
2652
  const sources = await this.getSources(filename.href, transformResults, transform);
2651
- const converter = v8ToIstanbul(filename.href, 0, sources, undefined, this.options.ignoreEmptyLines);
2652
- await converter.load();
2653
- try {
2654
- converter.applyCoverage([{
2655
- ranges: [{
2656
- startOffset: 0,
2657
- endOffset: sources.originalSource.length,
2658
- count: 0
2659
- }],
2660
- isBlockCoverage: true,
2661
- functionName: "(empty-report)"
2662
- }]);
2663
- } catch (error) {
2664
- this.ctx.logger.error(`Failed to convert coverage for uncovered ${filename.href}.\n`, error);
2665
- }
2666
- coverageMap.merge(converter.toIstanbul());
2653
+ coverageMap.merge(await this.v8ToIstanbul(filename.href, 0, sources, [{
2654
+ ranges: [{
2655
+ startOffset: 0,
2656
+ endOffset: sources.originalSource.length,
2657
+ count: 0
2658
+ }],
2659
+ isBlockCoverage: true,
2660
+ functionName: "(empty-report)"
2661
+ }]));
2667
2662
  if (debug.enabled) {
2668
2663
  clearTimeout(timeout);
2669
2664
  const diff = performance.now() - start;
@@ -2674,6 +2669,44 @@ class V8CoverageProvider extends BaseCoverageProvider {
2674
2669
  }
2675
2670
  return coverageMap;
2676
2671
  }
2672
+ async v8ToIstanbul(filename, wrapperLength, sources, functions) {
2673
+ if (this.options.experimentalAstAwareRemapping) {
2674
+ let ast;
2675
+ try {
2676
+ ast = await parseAstAsync(sources.source);
2677
+ } catch (error) {
2678
+ this.ctx.logger.error(`Failed to parse ${filename}. Excluding it from coverage.\n`, error);
2679
+ return {};
2680
+ }
2681
+ return await astV8ToIstanbul({
2682
+ code: sources.source,
2683
+ sourceMap: sources.sourceMap?.sourcemap,
2684
+ ast,
2685
+ coverage: {
2686
+ functions,
2687
+ url: filename
2688
+ },
2689
+ ignoreClassMethods: this.options.ignoreClassMethods,
2690
+ wrapperLength,
2691
+ ignoreNode: (node, type) => {
2692
+ if (type === "statement" && node.type === "AwaitExpression" && node.argument.type === "CallExpression" && node.argument.callee.type === "Identifier" && node.argument.callee.name === "__vite_ssr_import__") {
2693
+ return true;
2694
+ }
2695
+ 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_exports__") {
2696
+ return true;
2697
+ }
2698
+ }
2699
+ });
2700
+ }
2701
+ const converter = v8ToIstanbul(filename, wrapperLength, sources, undefined, this.options.ignoreEmptyLines);
2702
+ await converter.load();
2703
+ try {
2704
+ converter.applyCoverage(functions);
2705
+ } catch (error) {
2706
+ this.ctx.logger.error(`Failed to convert coverage for ${filename}.\n`, error);
2707
+ }
2708
+ return converter.toIstanbul();
2709
+ }
2677
2710
  async getSources(url, transformResults, onTransform, functions = []) {
2678
2711
  const filePath = normalize(fileURLToPath(url));
2679
2712
  let transformResult = transformResults.get(filePath);
@@ -2686,7 +2719,7 @@ class V8CoverageProvider extends BaseCoverageProvider {
2686
2719
  if (!sourcesContent[0]) {
2687
2720
  sourcesContent[0] = await promises.readFile(filePath, "utf-8").catch(() => {
2688
2721
  const length = findLongestFunctionLength(functions);
2689
- return ".".repeat(length);
2722
+ return "/".repeat(length);
2690
2723
  });
2691
2724
  }
2692
2725
  if (!map) {
@@ -2756,14 +2789,7 @@ class V8CoverageProvider extends BaseCoverageProvider {
2756
2789
  timeout = setTimeout(() => debug(c.bgRed(`File "${fileURLToPath(url)}" is taking longer than 3s`)), 3e3);
2757
2790
  }
2758
2791
  const sources = await this.getSources(url, transformResults, onTransform, functions);
2759
- const converter = v8ToIstanbul(url, startOffset, sources, undefined, this.options.ignoreEmptyLines);
2760
- await converter.load();
2761
- try {
2762
- converter.applyCoverage(functions);
2763
- } catch (error) {
2764
- this.ctx.logger.error(`Failed to convert coverage for ${url}.\n`, error);
2765
- }
2766
- coverageMap.merge(converter.toIstanbul());
2792
+ coverageMap.merge(await this.v8ToIstanbul(url, startOffset, sources, functions));
2767
2793
  if (debug.enabled) {
2768
2794
  clearTimeout(timeout);
2769
2795
  const diff = performance.now() - start;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/coverage-v8",
3
3
  "type": "module",
4
- "version": "3.1.2",
4
+ "version": "3.2.0-beta.1",
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": "3.1.2",
45
- "vitest": "3.1.2"
44
+ "@vitest/browser": "3.2.0-beta.1",
45
+ "vitest": "3.2.0-beta.1"
46
46
  },
47
47
  "peerDependenciesMeta": {
48
48
  "@vitest/browser": {
@@ -52,6 +52,7 @@
52
52
  "dependencies": {
53
53
  "@ampproject/remapping": "^2.3.0",
54
54
  "@bcoe/v8-coverage": "^1.0.2",
55
+ "ast-v8-to-istanbul": "^0.3.1",
55
56
  "debug": "^4.4.0",
56
57
  "istanbul-lib-coverage": "^3.2.2",
57
58
  "istanbul-lib-report": "^3.0.1",
@@ -72,9 +73,9 @@
72
73
  "@types/test-exclude": "^6.0.2",
73
74
  "pathe": "^2.0.3",
74
75
  "v8-to-istanbul": "^9.3.0",
75
- "@vitest/browser": "3.1.2",
76
- "vitest": "3.1.2",
77
- "vite-node": "3.1.2"
76
+ "@vitest/browser": "3.2.0-beta.1",
77
+ "vitest": "3.2.0-beta.1",
78
+ "vite-node": "3.2.0-beta.1"
78
79
  },
79
80
  "scripts": {
80
81
  "build": "rimraf dist && rollup -c",