vitest-dev/vitest · error · Error
Failed to load ${CoverageProviderMap[provider]}. Default exp
Error message
Failed to load ${CoverageProviderMap[provider]}. Default export is missing. What it means
resolveCoverageProviderModule (coverage.ts:70-79) dynamically imports the built-in coverage package (@vitest/coverage-v8 or @vitest/coverage-istanbul, or their /browser entry) and expects a default export. If the module loads but `default` is undefined/null, this error is thrown — the package is present but its shape is wrong.
Source
Thrown at packages/vitest/src/utils/coverage.ts:76
return null
}
const provider = options.provider
if (provider === 'v8' || provider === 'istanbul') {
let builtInModule = CoverageProviderMap[provider]
if (loader.isBrowser) {
builtInModule += '/browser'
}
const { default: coverageModule }
= loader.isBrowser
? await loader.import(builtInModule)
: await import(/* @vite-ignore */ builtInModule)
if (!coverageModule) {
throw new Error(
`Failed to load ${CoverageProviderMap[provider]}. Default export is missing.`,
)
}
return coverageModule
}
let customProviderModule
try {
customProviderModule = await loader.import(options.customProviderModule!)
}
catch (error) {
throw new Error(
`Failed to load custom CoverageProviderModule from ${options.customProviderModule}`,
{ cause: error },
)
}View on GitHub (pinned to d568f8ce37)
Solutions
- Reinstall the coverage package matching your vitest version: `pnpm add -D @vitest/coverage-v8@<vitest-version>`.
- Check for duplicate/conflicting versions with `pnpm why @vitest/coverage-v8` (or npm ls).
- Remove node_modules and lockfile regeneration if the install is corrupted.
- Verify no path alias or local file shadows the coverage package name.
Example fix
// before: mismatched versions // package.json "vitest": "^4.0.0", "@vitest/coverage-v8": "^1.6.0" // after: aligned versions "vitest": "^4.0.0", "@vitest/coverage-v8": "^4.0.0"
Defensive patterns
Strategy: validation
Validate before calling
async function assertCoverageProviderHasDefault(provider: 'v8' | 'istanbul') {
const mod = await import(provider === 'v8' ? '@vitest/coverage-v8' : '@vitest/coverage-istanbul')
if (mod.default == null) {
throw new Error(`@vitest/coverage-${provider} has no default export; reinstall a version matching vitest.`)
}
} Prevention
- Keep @vitest/coverage-* on the same version as vitest.
- Lock dependencies in CI to avoid surprise major bumps.
- Periodically run `pnpm why @vitest/coverage-v8` to detect duplicates.
When it happens
Trigger: Enabling coverage with provider 'v8' or 'istanbul' where the installed @vitest/coverage-* package is the wrong version, corrupted, shadowed by a local file of the same name, or re-exported without a default export. Reached when `const { default: coverageModule } = await import(...)` yields undefined.
Common situations: Version mismatch between vitest and @vitest/coverage-v8/istanbul (e.g. coverage pkg from a different major); a node_modules resolution issue returning a stub; a bundler/alias remapping the coverage package; partial/corrupted install.
Related errors
- "Istanbul" coverage provider is not compatible with "experim
- Something removed the coverage directory "${coverageFilesDir
- Something removed the coverage directory "${coverageFilesDir
- V8 provider missing inspector session.
- @vitest/coverage-v8 does not work with ${browserConfig} Use
AI-assisted analysis of vitest-dev/vitest@d568f8ce37 (2026-08-03).
Data as JSON: /data/errors/8c032ac66a1b9016.json.
Report an issue: GitHub.