@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.
@@ -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 };
@@ -0,0 +1,5 @@
1
+ import { CoverageProviderModule } from 'vitest/node';
2
+
3
+ declare const mod: CoverageProviderModule;
4
+
5
+ export { mod as default };
@@ -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 { C as COVERAGE_STORE_KEY } from './constants-BCJfMgEg.js';
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
- // @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) {
10
+ takeCoverage(options) {
11
+ const coverage = BaseCoverageProviderModule.takeCoverage();
12
+ if (!coverage) {
13
13
  return;
14
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
- }
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
- 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();
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.5";
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 = new Date().getTime();
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.5",
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.5"
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.5"
67
+ "vitest": "5.0.0-beta.7"
64
68
  },
65
69
  "scripts": {
66
70
  "build": "premove dist && rollup -c",