Skip to content

Commit ecdbab6

Browse files
committed
fix(coverage): simplify provider types
1 parent e78adcf commit ecdbab6

File tree

7 files changed

+61
-56
lines changed

7 files changed

+61
-56
lines changed

docs/guide/cli-generated.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,20 @@ High and low watermarks for functions in the format of `<high>,<low>`
285285

286286
Collect coverage only for files changed since a specified commit or branch (e.g., `origin/main` or `HEAD~1`). Inherits value from `--changed` by default.
287287

288+
### coverage.excludeAfterRemap
289+
290+
- **CLI:** `--coverage.excludeAfterRemap`
291+
- **Config:** [coverage.excludeAfterRemap](/config/coverage#coverage-excludeafterremap)
292+
293+
Apply exclusions again after coverage has been remapped to original sources. (default: false)
294+
295+
### coverage.htmlDir
296+
297+
- **CLI:** `--coverage.htmlDir <path>`
298+
- **Config:** [coverage.htmlDir](/config/coverage#coverage-htmldir)
299+
300+
Directory of HTML coverage output to be served in UI mode and HTML reporter.
301+
288302
### mode
289303

290304
- **CLI:** `--mode <name>`

packages/coverage-istanbul/src/provider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { CoverageMap } from 'istanbul-lib-coverage'
22
import type { Instrumenter } from 'istanbul-lib-instrument'
33
import type { ProxifiedModule } from 'magicast'
4-
import type { CoverageProvider, ReportContext, ResolvedCoverageOptions, Vite, Vitest } from 'vitest/node'
4+
import type { CoverageProvider, ReportContext, Vite, Vitest } from 'vitest/node'
55
import { existsSync, promises as fs } from 'node:fs'
66
// @ts-expect-error missing types
77
import { defaults as istanbulDefaults } from '@istanbuljs/schema'
@@ -21,7 +21,7 @@ import { COVERAGE_STORE_KEY } from './constants'
2121

2222
const debug = createDebug('vitest:coverage')
2323

24-
export class IstanbulCoverageProvider extends BaseCoverageProvider<ResolvedCoverageOptions<'istanbul'>> implements CoverageProvider {
24+
export class IstanbulCoverageProvider extends BaseCoverageProvider implements CoverageProvider {
2525
name = 'istanbul' as const
2626
version: string = version
2727
instrumenter!: Instrumenter

packages/coverage-v8/src/provider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { CoverageMap } from 'istanbul-lib-coverage'
22
import type { ProxifiedModule } from 'magicast'
33
import type { Profiler } from 'node:inspector'
4-
import type { CoverageProvider, ReportContext, ResolvedCoverageOptions, TestProject, Vite, Vitest } from 'vitest/node'
4+
import type { CoverageProvider, ReportContext, TestProject, Vite, Vitest } from 'vitest/node'
55
import { existsSync, promises as fs } from 'node:fs'
66
import { fileURLToPath } from 'node:url'
77
// @ts-expect-error -- untyped
@@ -28,7 +28,7 @@ const FILE_PROTOCOL = 'file://'
2828

2929
const debug = createDebug('vitest:coverage')
3030

31-
export class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOptions<'v8'>> implements CoverageProvider {
31+
export class V8CoverageProvider extends BaseCoverageProvider implements CoverageProvider {
3232
name = 'v8' as const
3333
version: string = version
3434

packages/vitest/src/node/cli/cli-config.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,13 @@ export const cliOptionsConfig: VitestCLIOptions = {
320320
return value
321321
},
322322
},
323+
excludeAfterRemap: {
324+
description: 'Apply exclusions again after coverage has been remapped to original sources. (default: false)',
325+
},
326+
htmlDir: {
327+
description: 'Directory of HTML coverage output to be served in UI mode and HTML reporter.',
328+
argument: '<path>',
329+
},
323330
},
324331
},
325332
mode: {

packages/vitest/src/node/coverage.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ export async function getCoverageProvider(
7474
return null
7575
}
7676

77-
export class BaseCoverageProvider<Options extends ResolvedCoverageOptions<'istanbul' | 'v8'>> {
77+
export class BaseCoverageProvider {
7878
ctx!: Vitest
7979
readonly name!: 'v8' | 'istanbul'
8080
version!: string
81-
options!: Options
81+
options!: ResolvedCoverageOptions
8282
globCache: Map<string, boolean> = new Map()
8383
autoUpdateMarker = '\n// __VITEST_COVERAGE_MARKER__'
8484

@@ -101,7 +101,7 @@ export class BaseCoverageProvider<Options extends ResolvedCoverageOptions<'istan
101101
)
102102
}
103103

104-
const config = ctx._coverageOptions as Options
104+
const config = ctx._coverageOptions
105105

106106
this.options = {
107107
...coverageConfigDefaults,
@@ -228,7 +228,7 @@ export class BaseCoverageProvider<Options extends ResolvedCoverageOptions<'istan
228228
throw new Error('BaseReporter\'s parseConfigModule was not overwritten')
229229
}
230230

231-
resolveOptions(): Options {
231+
resolveOptions(): ResolvedCoverageOptions {
232232
return this.options
233233
}
234234

packages/vitest/src/node/types/coverage.ts

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -95,24 +95,10 @@ export type CoverageReporterWithOptions<
9595

9696
export type CoverageProviderName = 'v8' | 'istanbul' | 'custom' | undefined
9797

98-
export type CoverageOptions<T extends CoverageProviderName = CoverageProviderName>
99-
= T extends 'istanbul'
100-
? { provider: T } & CoverageIstanbulOptions
101-
: T extends 'v8' ? {
102-
/**
103-
* Provider to use for coverage collection.
104-
*
105-
* @default 'v8'
106-
*/
107-
provider: T
108-
} & CoverageV8Options
109-
: T extends 'custom'
110-
? { provider: T } & CustomProviderOptions
111-
: { provider?: T } & CoverageV8Options
112-
11398
/** Fields that have default values. Internally these will always be defined. */
11499
type FieldsWithDefaultValues
115-
= | 'enabled'
100+
= | 'provider'
101+
| 'enabled'
116102
| 'clean'
117103
| 'cleanOnRerun'
118104
| 'reportsDirectory'
@@ -121,14 +107,23 @@ type FieldsWithDefaultValues
121107
| 'allowExternal'
122108
| 'processingConcurrency'
123109

124-
export type ResolvedCoverageOptions<T extends CoverageProviderName = CoverageProviderName>
125-
= CoverageOptions<T>
126-
& Required<Pick<CoverageOptions<T>, FieldsWithDefaultValues>> & { // Resolved fields which may have different typings as public configuration API has
110+
export type ResolvedCoverageOptions
111+
= CoverageOptions
112+
& Required<Pick<CoverageOptions, FieldsWithDefaultValues>>
113+
& {
114+
// Resolved fields which may have different typings as public configuration API has
127115
reporter: CoverageReporterWithOptions[]
128116
htmlDir?: string
129117
}
130118

131-
export interface BaseCoverageOptions {
119+
export interface CoverageOptions {
120+
/**
121+
* Coverage provider to use.
122+
*
123+
* @default 'v8'
124+
*/
125+
provider?: 'v8' | 'istanbul' | 'custom'
126+
132127
/**
133128
* Enables coverage collection. Can be overridden using `--coverage` CLI option.
134129
*
@@ -285,16 +280,11 @@ export interface BaseCoverageOptions {
285280
* @default false
286281
*/
287282
changed?: boolean | string
288-
}
289-
290-
export interface CoverageIstanbulOptions extends BaseCoverageOptions {}
291283

292-
export interface CoverageV8Options extends BaseCoverageOptions {}
293-
294-
export interface CustomProviderOptions
295-
extends Pick<BaseCoverageOptions, FieldsWithDefaultValues | 'changed'> {
296-
/** Name of the module or path to a file to load the custom provider from */
297-
customProviderModule: string
284+
/**
285+
* Name of the module or path to a file to load the custom provider from
286+
*/
287+
customProviderModule?: string
298288
}
299289

300290
interface Thresholds {
@@ -324,3 +314,15 @@ interface Thresholds {
324314
/** Thresholds for lines */
325315
lines?: number
326316
}
317+
318+
/** @deprecated Use `CoverageOptions` instead */
319+
export interface CoverageV8Options extends CoverageOptions {}
320+
321+
/** @deprecated Use `CoverageOptions` instead */
322+
export interface CoverageIstanbulOptions extends CoverageOptions {}
323+
324+
/** @deprecated Use `CoverageOptions` instead */
325+
export interface BaseCoverageOptions extends CoverageOptions {}
326+
327+
/** @deprecated Use `CoverageOptions` instead */
328+
export interface CustomProviderOptions extends CoverageOptions {}

test/coverage-test/test/configuration-options.test-d.ts

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -72,25 +72,6 @@ test('provider options, generic', () => {
7272
})
7373
})
7474

75-
test('provider specific options, custom', () => {
76-
assertType<Coverage>({
77-
provider: 'custom',
78-
customProviderModule: 'custom-provider-module.ts',
79-
enabled: true,
80-
})
81-
82-
// @ts-expect-error -- customProviderModule is required
83-
assertType<Coverage>({ provider: 'custom' })
84-
85-
assertType<Coverage>({
86-
provider: 'custom',
87-
customProviderModule: 'some-module',
88-
89-
// @ts-expect-error -- typings of BaseCoverageOptions still apply
90-
enabled: 'not boolean',
91-
})
92-
})
93-
9475
test('provider module', () => {
9576
assertType<CoverageProviderModule>({
9677
getProvider() {
@@ -100,6 +81,7 @@ test('provider module', () => {
10081
generateCoverage() {},
10182
resolveOptions(): ResolvedCoverageOptions {
10283
return {
84+
provider: 'v8',
10385
clean: true,
10486
cleanOnRerun: true,
10587
enabled: true,

0 commit comments

Comments
 (0)