vitest-dev/vitest · error · Error
Custom CoverageProviderModule loaded from
Error message
Custom CoverageProviderModule loaded from ${options.customProviderModule} was not the default export What it means
After successfully importing a custom coverage provider module, Vitest requires it to have a non-null default export. If customProviderModule.default is null/undefined, it throws stating the module loaded but was not the default export. This is a shape contract: the provider must be `export default { getProvider, ... }`.
Solutions
- Add a default export to the provider module: `export default { getProvider() { ... } }`.
- If using CommonDB, ensure module.exports = {...} so the interop default is populated.
- Confirm with node -e "import('./p').then(m=>console.log(m.default))" that default is the provider object.
- Re-export the named provider as default if you cannot change the source: export { getProvider as default }.
Example fix
// before: my-provider.js
export const getProvider = () => new MyProvider()
// after
export default { getProvider: () => new MyProvider() } Defensive patterns
Strategy: type-guard
Validate before calling
const m = await loader.import(customProviderModule)
if (m.default == null) throw new Error('provider must have a default export') Type guard
function hasDefaultExport(m) {
return m != null && m.default != null
} Prevention
- Always `export default` the provider object.
- Verify with node -e "import('./p').then(m=>m.default)".
- Re-export named providers as default if you cannot edit the source.
When it happens
Trigger: test.coverage.provider='custom' points at a module that exists and imports cleanly, but uses named exports (e.g. `export const getProvider = ...`) instead of a default export, or has `export default null`.
Common situations: Authoring a custom coverage provider and forgetting the default export, or migrating a provider that previously used CommonDB module.exports to ESM named exports.
Related errors
- Failed to load custom CoverageProviderModule from
- "Istanbul" coverage provider is not compatible with…
- Snapshot environment module must have a default export…
- @vitest/coverage-v8 does not work with
- You cannot set "coverage.reportsDirectory" as
AI-assisted analysis of vitest-dev/vitest@1fa9837ec2 (2026-08-11).
Data as JSON: /api/errors/90956d0183214b91.
Report an issue: GitHub.
Appendix: source
Thrown at packages/vitest/src/utils/coverage.ts:97
}
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 },
)
}
if (customProviderModule.default == null) {
throw new Error(
`Custom CoverageProviderModule loaded from ${options.customProviderModule} was not the default export`,
)
}
return customProviderModule.default
}
View on GitHub (pinned to 1fa9837ec2)