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

  1. Add a default export to the provider module: `export default { getProvider() { ... } }`.
  2. If using CommonDB, ensure module.exports = {...} so the interop default is populated.
  3. Confirm with node -e "import('./p').then(m=>console.log(m.default))" that default is the provider object.
  4. 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

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


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)