Skip to content

Commit 7b37d27

Browse files
authored
fix: don't panic when coverage.reporter is a string (#6267)
1 parent 081cfe0 commit 7b37d27

File tree

4 files changed

+47
-21
lines changed

4 files changed

+47
-21
lines changed

packages/vitest/src/node/config/resolveConfig.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { RandomSequencer } from '../sequencers/RandomSequencer'
2424
import type { BenchmarkBuiltinReporters } from '../reporters'
2525
import { builtinPools } from '../pool'
2626
import type { Logger } from '../logger'
27+
import type { BaseCoverageOptions, CoverageReporterWithOptions } from '../types/coverage'
2728

2829
function resolvePath(path: string, root: string) {
2930
return normalize(
@@ -229,6 +230,8 @@ export function resolveConfig(
229230
)
230231
}
231232

233+
resolved.coverage.reporter = resolveCoverageReporters(resolved.coverage.reporter)
234+
232235
if (resolved.coverage.enabled && resolved.coverage.reportsDirectory) {
233236
const reportsDirectory = resolve(
234237
resolved.root,
@@ -789,3 +792,25 @@ export function resolveConfig(
789792
export function isBrowserEnabled(config: ResolvedConfig): boolean {
790793
return Boolean(config.browser?.enabled)
791794
}
795+
796+
export function resolveCoverageReporters(configReporters: NonNullable<BaseCoverageOptions['reporter']>): CoverageReporterWithOptions[] {
797+
// E.g. { reporter: "html" }
798+
if (!Array.isArray(configReporters)) {
799+
return [[configReporters, {}]]
800+
}
801+
802+
const resolvedReporters: CoverageReporterWithOptions[] = []
803+
804+
for (const reporter of configReporters) {
805+
if (Array.isArray(reporter)) {
806+
// E.g. { reporter: [ ["html", { skipEmpty: true }], ["lcov"], ["json", { file: "map.json" }] ]}
807+
resolvedReporters.push([reporter[0], reporter[1] as Record<string, unknown> || {}])
808+
}
809+
else {
810+
// E.g. { reporter: ["html", "json"]}
811+
resolvedReporters.push([reporter, {}])
812+
}
813+
}
814+
815+
return resolvedReporters
816+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export interface CoverageProviderModule {
7878

7979
export type CoverageReporter = keyof ReportOptions | (string & {})
8080

81-
type CoverageReporterWithOptions<
81+
export type CoverageReporterWithOptions<
8282
ReporterName extends CoverageReporter = CoverageReporter,
8383
> = ReporterName extends keyof ReportOptions
8484
? ReportOptions[ReporterName] extends never

packages/vitest/src/utils/coverage.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { relative } from 'pathe'
22
import mm from 'micromatch'
33
import type { CoverageMap } from 'istanbul-lib-coverage'
44
import type { BaseCoverageOptions, ResolvedCoverageOptions } from '../node/types/coverage'
5+
import { resolveCoverageReporters } from '../node/config/resolveConfig'
56

67
type Threshold = 'lines' | 'functions' | 'statements' | 'branches'
78

@@ -242,25 +243,7 @@ export class BaseCoverageProvider {
242243
resolveReporters(
243244
configReporters: NonNullable<BaseCoverageOptions['reporter']>,
244245
): ResolvedCoverageOptions['reporter'] {
245-
// E.g. { reporter: "html" }
246-
if (!Array.isArray(configReporters)) {
247-
return [[configReporters, {}]]
248-
}
249-
250-
const resolvedReporters: ResolvedCoverageOptions['reporter'] = []
251-
252-
for (const reporter of configReporters) {
253-
if (Array.isArray(reporter)) {
254-
// E.g. { reporter: [ ["html", { skipEmpty: true }], ["lcov"], ["json", { file: "map.json" }] ]}
255-
resolvedReporters.push([reporter[0], reporter[1] as Record<string, unknown> || {}])
256-
}
257-
else {
258-
// E.g. { reporter: ["html", "json"]}
259-
resolvedReporters.push([reporter, {}])
260-
}
261-
}
262-
263-
return resolvedReporters
246+
return resolveCoverageReporters(configReporters) as any
264247
}
265248

266249
hasTerminalReporter(reporters: ResolvedCoverageOptions['reporter']) {

test/coverage-test/test/reporters.test.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { readdirSync } from 'node:fs'
1+
import { existsSync, readdirSync } from 'node:fs'
2+
import { rm } from 'node:fs/promises'
23
import { expect } from 'vitest'
34
import { runVitest, test } from '../utils'
45

@@ -17,6 +18,23 @@ test('reporter as string', async () => {
1718
expect(files).toContain('coverage-final.json')
1819
})
1920

21+
test('reporter as string when coverage is disabled', async () => {
22+
if (existsSync('./coverage')) {
23+
await rm('./coverage', { recursive: true, force: true })
24+
}
25+
26+
await runVitest({
27+
include,
28+
coverage: {
29+
enabled: false,
30+
reporter: 'json',
31+
all: false,
32+
},
33+
})
34+
35+
expect(existsSync('./coverage')).toBe(false)
36+
})
37+
2038
test('reporter as list of strings', async () => {
2139
await runVitest({
2240
include,

0 commit comments

Comments
 (0)