@vitest/coverage-istanbul 1.0.0-beta.2 → 1.0.0-beta.3

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.
@@ -1,9 +1,11 @@
1
1
  import { CoverageProvider, Vitest, AfterSuiteRunMeta, ReportContext, ResolvedCoverageOptions } from 'vitest';
2
2
  import { BaseCoverageProvider } from 'vitest/coverage';
3
- import { CoverageMap } from 'istanbul-lib-coverage';
3
+ import { CoverageMapData } from 'istanbul-lib-coverage';
4
4
  import { Instrumenter } from 'istanbul-lib-instrument';
5
5
 
6
6
  type Options = ResolvedCoverageOptions<'istanbul'>;
7
+ type CoverageByTransformMode = Record<AfterSuiteRunMeta['transformMode'], CoverageMapData[]>;
8
+ type ProjectName = NonNullable<AfterSuiteRunMeta['projectName']> | typeof DEFAULT_PROJECT;
7
9
  interface TestExclude {
8
10
  new (opts: {
9
11
  cwd?: string | string[];
@@ -17,6 +19,7 @@ interface TestExclude {
17
19
  glob(cwd: string): Promise<string[]>;
18
20
  };
19
21
  }
22
+ declare const DEFAULT_PROJECT: unique symbol;
20
23
  declare class IstanbulCoverageProvider extends BaseCoverageProvider implements CoverageProvider {
21
24
  name: string;
22
25
  ctx: Vitest;
@@ -29,17 +32,17 @@ declare class IstanbulCoverageProvider extends BaseCoverageProvider implements C
29
32
  * If storing in memory causes issues, we can simply write these into fs in `onAfterSuiteRun`
30
33
  * and read them back when merging coverage objects in `onAfterAllFilesRun`.
31
34
  */
32
- coverages: any[];
35
+ coverages: Map<ProjectName, CoverageByTransformMode>;
33
36
  initialize(ctx: Vitest): void;
34
37
  resolveOptions(): Options;
35
38
  onFileTransform(sourceCode: string, id: string, pluginCtx: any): {
36
39
  code: string;
37
40
  map: any;
38
41
  } | undefined;
39
- onAfterSuiteRun({ coverage }: AfterSuiteRunMeta): void;
42
+ onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta): void;
40
43
  clean(clean?: boolean): Promise<void>;
41
44
  reportCoverage({ allTestsRun }?: ReportContext): Promise<void>;
42
- includeUntestedFiles(coverageMap: CoverageMap): Promise<void>;
45
+ getCoverageMapForUncoveredFiles(coveredFiles: string[]): Promise<CoverageMapData>;
43
46
  }
44
47
 
45
48
  export { IstanbulCoverageProvider };
package/dist/provider.js CHANGED
@@ -1,4 +1,4 @@
1
- import { existsSync, promises } from 'fs';
1
+ import { existsSync, promises } from 'node:fs';
2
2
  import { coverageConfigDefaults, defaultExclude, defaultInclude } from 'vitest/config';
3
3
  import { BaseCoverageProvider } from 'vitest/coverage';
4
4
  import c from 'picocolors';
@@ -104,6 +104,7 @@ const isAbsolute = function(p) {
104
104
  return _IS_ABSOLUTE_RE.test(p);
105
105
  };
106
106
 
107
+ const DEFAULT_PROJECT = Symbol.for("default-project");
107
108
  class IstanbulCoverageProvider extends BaseCoverageProvider {
108
109
  name = "istanbul";
109
110
  ctx;
@@ -116,7 +117,7 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
116
117
  * If storing in memory causes issues, we can simply write these into fs in `onAfterSuiteRun`
117
118
  * and read them back when merging coverage objects in `onAfterAllFilesRun`.
118
119
  */
119
- coverages = [];
120
+ coverages = /* @__PURE__ */ new Map();
120
121
  initialize(ctx) {
121
122
  const config = ctx.config.coverage;
122
123
  this.ctx = ctx;
@@ -165,29 +166,42 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
165
166
  const map = this.instrumenter.lastSourceMap();
166
167
  return { code, map };
167
168
  }
168
- onAfterSuiteRun({ coverage }) {
169
- this.coverages.push(coverage);
169
+ /*
170
+ * Coverage and meta information passed from Vitest runners.
171
+ * Note that adding new entries here and requiring on those without
172
+ * backwards compatibility is a breaking change.
173
+ */
174
+ onAfterSuiteRun({ coverage, transformMode, projectName }) {
175
+ if (transformMode !== "web" && transformMode !== "ssr")
176
+ throw new Error(`Invalid transform mode: ${transformMode}`);
177
+ let entry = this.coverages.get(projectName || DEFAULT_PROJECT);
178
+ if (!entry) {
179
+ entry = { web: [], ssr: [] };
180
+ this.coverages.set(projectName || DEFAULT_PROJECT, entry);
181
+ }
182
+ entry[transformMode].push(coverage);
170
183
  }
171
184
  async clean(clean = true) {
172
185
  if (clean && existsSync(this.options.reportsDirectory))
173
186
  await promises.rm(this.options.reportsDirectory, { recursive: true, force: true, maxRetries: 10 });
174
- this.coverages = [];
187
+ this.coverages = /* @__PURE__ */ new Map();
175
188
  }
176
189
  async reportCoverage({ allTestsRun } = {}) {
177
- const mergedCoverage = this.coverages.reduce((coverage, previousCoverageMap) => {
178
- const map = libCoverage.createCoverageMap(coverage);
179
- map.merge(previousCoverageMap);
180
- return map;
181
- }, libCoverage.createCoverageMap({}));
182
- if (this.options.all && allTestsRun)
183
- await this.includeUntestedFiles(mergedCoverage);
184
- includeImplicitElseBranches(mergedCoverage);
185
- const sourceMapStore = libSourceMaps.createSourceMapStore();
186
- const coverageMap = await sourceMapStore.transformCoverage(mergedCoverage);
190
+ const coverageMaps = await Promise.all(
191
+ Array.from(this.coverages.values()).map((coverages) => [
192
+ mergeAndTransformCoverage(coverages.ssr),
193
+ mergeAndTransformCoverage(coverages.web)
194
+ ]).flat()
195
+ );
196
+ if (this.options.all && allTestsRun) {
197
+ const coveredFiles = coverageMaps.map((map) => map.files()).flat();
198
+ const uncoveredCoverage = await this.getCoverageMapForUncoveredFiles(coveredFiles);
199
+ coverageMaps.push(await mergeAndTransformCoverage([uncoveredCoverage]));
200
+ }
201
+ const coverageMap = mergeCoverageMaps(...coverageMaps);
187
202
  const context = libReport.createContext({
188
203
  dir: this.options.reportsDirectory,
189
204
  coverageMap,
190
- sourceFinder: sourceMapStore.sourceFinder,
191
205
  watermarks: this.options.watermarks
192
206
  });
193
207
  if (hasTerminalReporter(this.options.reporter))
@@ -225,15 +239,16 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
225
239
  });
226
240
  }
227
241
  }
228
- async includeUntestedFiles(coverageMap) {
242
+ async getCoverageMapForUncoveredFiles(coveredFiles) {
229
243
  const includedFiles = await this.testExclude.glob(this.ctx.config.root);
230
- const uncoveredFiles = includedFiles.map((file) => resolve(this.ctx.config.root, file)).filter((file) => !coverageMap.data[file]);
244
+ const uncoveredFiles = includedFiles.map((file) => resolve(this.ctx.config.root, file)).filter((file) => !coveredFiles.includes(file));
231
245
  const transformResults = await Promise.all(uncoveredFiles.map(async (filename) => {
232
246
  const transformResult = await this.ctx.vitenode.transformRequest(filename);
233
247
  return { transformResult, filename };
234
248
  }));
249
+ const coverageMap = libCoverage.createCoverageMap({});
235
250
  for (const { transformResult, filename } of transformResults) {
236
- const sourceMap = transformResult == null ? void 0 : transformResult.map;
251
+ const sourceMap = transformResult?.map;
237
252
  if (sourceMap) {
238
253
  this.instrumenter.instrumentSync(
239
254
  transformResult.code,
@@ -245,8 +260,22 @@ class IstanbulCoverageProvider extends BaseCoverageProvider {
245
260
  coverageMap.addFileCoverage(lastCoverage);
246
261
  }
247
262
  }
263
+ return coverageMap.data;
248
264
  }
249
265
  }
266
+ async function mergeAndTransformCoverage(coverages) {
267
+ const mergedCoverage = mergeCoverageMaps(...coverages);
268
+ includeImplicitElseBranches(mergedCoverage);
269
+ const sourceMapStore = libSourceMaps.createSourceMapStore();
270
+ return await sourceMapStore.transformCoverage(mergedCoverage);
271
+ }
272
+ function mergeCoverageMaps(...coverageMaps) {
273
+ return coverageMaps.reduce((coverage, previousCoverageMap) => {
274
+ const map = libCoverage.createCoverageMap(coverage);
275
+ map.merge(previousCoverageMap);
276
+ return map;
277
+ }, libCoverage.createCoverageMap({}));
278
+ }
250
279
  function removeQueryParameters(filename) {
251
280
  return filename.split("?")[0];
252
281
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/coverage-istanbul",
3
3
  "type": "module",
4
- "version": "1.0.0-beta.2",
4
+ "version": "1.0.0-beta.3",
5
5
  "description": "Istanbul coverage provider for Vitest",
6
6
  "author": "Anthony Fu <anthonyfu117@hotmail.com>",
7
7
  "license": "MIT",
@@ -37,7 +37,7 @@
37
37
  "dist"
38
38
  ],
39
39
  "peerDependencies": {
40
- "vitest": ">=0.32.0 <1"
40
+ "vitest": "^1.0.0-0"
41
41
  },
42
42
  "dependencies": {
43
43
  "istanbul-lib-coverage": "^3.2.0",
@@ -55,7 +55,7 @@
55
55
  "@types/istanbul-lib-source-maps": "^4.0.1",
56
56
  "@types/istanbul-reports": "^3.0.1",
57
57
  "pathe": "^1.1.1",
58
- "vitest": "1.0.0-beta.2"
58
+ "vitest": "1.0.0-beta.3"
59
59
  },
60
60
  "scripts": {
61
61
  "build": "rimraf dist && rollup -c",