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

  1. Reinstall the coverage package matching your vitest version: `pnpm add -D @vitest/coverage-v8@<vitest-version>`.
  2. Check for duplicate/conflicting versions with `pnpm why @vitest/coverage-v8` (or npm ls).
  3. Remove node_modules and lockfile regeneration if the install is corrupted.
  4. 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

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


AI-assisted analysis of vitest-dev/vitest@d568f8ce37 (2026-08-03). Data as JSON: /data/errors/8c032ac66a1b9016.json. Report an issue: GitHub.