[READ-ONLY] Mirror of https://github.com/vitest-dev/vitest. Next generation testing framework powered by Vite. vitest.dev
test testing-tools vite
12

Configure Feed

Select the types of activity you want to include in your feed.

fix(coverage): correct `coverageConfigDefaults` values and types (#9940)

authored by

Arthur Petrie and committed by
GitHub
(Mar 25, 2026, 2:07 PM +0200) b3c992cb faace1fb

+40 -19
+18 -10
packages/vitest/src/defaults.ts
··· 1 1 import type { 2 2 BenchmarkUserOptions, 3 - CoverageV8Options, 4 - ResolvedCoverageOptions, 3 + CoverageOptions, 5 4 UserConfig, 6 5 } from './node/types/config' 6 + import type { FieldsWithDefaultValues } from './node/types/coverage' 7 7 import os from 'node:os' 8 8 import { isAgent, isCI } from './utils/env' 9 9 ··· 25 25 } 26 26 27 27 // These are the generic defaults for coverage. Providers may also set some provider specific defaults. 28 - export const coverageConfigDefaults: ResolvedCoverageOptions = { 28 + export const coverageConfigDefaults: Required<Pick<CoverageOptions, FieldsWithDefaultValues>> = { 29 29 provider: 'v8', 30 30 enabled: false, 31 31 clean: true, ··· 34 34 exclude: [], 35 35 reportOnFailure: false, 36 36 reporter: [ 37 - ['text', {}], 38 - ['html', {}], 39 - ['clover', {}], 40 - ['json', {}], 37 + 'text', 38 + 'html', 39 + 'clover', 40 + 'json', 41 41 ], 42 42 allowExternal: false, 43 43 excludeAfterRemap: false, ··· 45 45 20, 46 46 os.availableParallelism?.() ?? os.cpus().length, 47 47 ), 48 + ignoreClassMethods: [], 49 + skipFull: false, 50 + watermarks: { 51 + statements: [50, 80], 52 + functions: [50, 80], 53 + branches: [50, 80], 54 + lines: [50, 80], 55 + }, 48 56 } 49 57 50 58 export const fakeTimersDefaults: NonNullable<UserConfig['fakeTimers']> = { ··· 78 86 css: { 79 87 include: never[] 80 88 } 81 - coverage: CoverageV8Options 89 + coverage: CoverageOptions 82 90 fakeTimers: import('@sinonjs/fake-timers').FakeTimerInstallOpts 83 91 maxConcurrency: number 84 92 dangerouslyIgnoreUnhandledErrors: boolean ··· 95 103 isolate: true, 96 104 watch: !isCI && process.stdin.isTTY && !isAgent, 97 105 globals: false, 98 - environment: 'node' as const, 106 + environment: 'node', 99 107 clearMocks: false, 100 108 restoreMocks: false, 101 109 mockReset: false, ··· 116 124 css: { 117 125 include: [], 118 126 }, 119 - coverage: coverageConfigDefaults as CoverageV8Options, 127 + coverage: coverageConfigDefaults, 120 128 fakeTimers: fakeTimersDefaults, 121 129 maxConcurrency: 5, 122 130 dangerouslyIgnoreUnhandledErrors: false,
+2 -2
test/config/test/public.test.ts
··· 1 - import type { BaseCoverageOptions } from 'vitest/node' 1 + import type { CoverageOptions } from 'vitest/node' 2 2 import { resolve } from 'pathe' 3 3 import { expect, test } from 'vitest' 4 4 import { resolveConfig } from 'vitest/node' ··· 106 106 expected: 'custom-html-dir', 107 107 }, 108 108 ] satisfies { 109 - options: BaseCoverageOptions 109 + options: CoverageOptions 110 110 expected?: string 111 111 }[])('coverage.htmlDir inference: $options', async ({ options, expected }) => { 112 112 const { vitestConfig } = await resolveConfig({
+10
test/coverage-test/test/configuration-options.test-d.ts
··· 91 91 reportOnFailure: true, 92 92 allowExternal: true, 93 93 processingConcurrency: 1, 94 + excludeAfterRemap: false, 95 + ignoreClassMethods: [], 96 + skipFull: true, 97 + watermarks: { 98 + statements: [80, 95], 99 + functions: [80, 95], 100 + branches: [80, 95], 101 + lines: [80, 95], 102 + }, 103 + 94 104 } 95 105 }, 96 106 clean(_?: boolean) {},
+2 -2
packages/vitest/src/node/coverage.ts
··· 1 1 import type { CoverageMap } from 'istanbul-lib-coverage' 2 2 import type { TransformResult } from 'vite' 3 3 import type { Vitest } from '../node/core' 4 - import type { BaseCoverageOptions, CoverageModuleLoader, CoverageProvider, ReportContext, ResolvedCoverageOptions } from '../node/types/coverage' 4 + import type { CoverageModuleLoader, CoverageOptions, CoverageProvider, ReportContext, ResolvedCoverageOptions } from '../node/types/coverage' 5 5 import type { SerializedCoverageConfig } from '../runtime/config' 6 6 import type { AfterSuiteRunMeta } from '../types/general' 7 7 import type { TestProject } from './project' ··· 778 778 779 779 function assertConfigurationModule(config: unknown): asserts config is { 780 780 test: { 781 - coverage: { thresholds: NonNullable<BaseCoverageOptions['thresholds']> } 781 + coverage: { thresholds: NonNullable<CoverageOptions['thresholds']> } 782 782 } 783 783 } { 784 784 try {
+2 -2
packages/vitest/src/node/config/resolveConfig.ts
··· 8 8 ResolvedConfig, 9 9 UserConfig, 10 10 } from '../types/config' 11 - import type { BaseCoverageOptions, CoverageReporterWithOptions } from '../types/coverage' 11 + import type { CoverageOptions, CoverageReporterWithOptions } from '../types/coverage' 12 12 import crypto from 'node:crypto' 13 13 import { pathToFileURL } from 'node:url' 14 14 import { slash, toArray } from '@vitest/utils/helpers' ··· 970 970 return Boolean(config.browser?.enabled) 971 971 } 972 972 973 - export function resolveCoverageReporters(configReporters: NonNullable<BaseCoverageOptions['reporter']>): CoverageReporterWithOptions[] { 973 + export function resolveCoverageReporters(configReporters: NonNullable<CoverageOptions['reporter']>): CoverageReporterWithOptions[] { 974 974 // E.g. { reporter: "html" } 975 975 if (!Array.isArray(configReporters)) { 976 976 return [[configReporters, {}]]
+6 -3
packages/vitest/src/node/types/coverage.ts
··· 96 96 export type CoverageProviderName = 'v8' | 'istanbul' | 'custom' | undefined 97 97 98 98 /** Fields that have default values. Internally these will always be defined. */ 99 - type FieldsWithDefaultValues 99 + export type FieldsWithDefaultValues 100 100 = | 'provider' 101 101 | 'enabled' 102 102 | 'clean' ··· 106 106 | 'reportOnFailure' 107 107 | 'allowExternal' 108 108 | 'processingConcurrency' 109 + | 'reporter' 110 + | 'excludeAfterRemap' 111 + | 'ignoreClassMethods' 112 + | 'skipFull' 113 + | 'watermarks' 109 114 110 115 export type ResolvedCoverageOptions 111 116 = CoverageOptions ··· 276 281 /** 277 282 * Collect coverage only for files changed since a specified commit or branch. 278 283 * Inherits the default value from `test.changed`. 279 - * 280 - * @default false 281 284 */ 282 285 changed?: boolean | string 283 286