{"id":"8c032ac66a1b9016","repo":"vitest-dev/vitest","slug":"failed-to-load-coverageprovidermap-provider-d","errorCode":null,"errorMessage":"Failed to load ${CoverageProviderMap[provider]}. Default export is missing.","messagePattern":"Failed to load (.+?)\\. Default export is missing\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/utils/coverage.ts","lineNumber":76,"sourceCode":"    return null\n  }\n\n  const provider = options.provider\n\n  if (provider === 'v8' || provider === 'istanbul') {\n    let builtInModule = CoverageProviderMap[provider]\n\n    if (loader.isBrowser) {\n      builtInModule += '/browser'\n    }\n\n    const { default: coverageModule }\n      = loader.isBrowser\n        ? await loader.import(builtInModule)\n        : await import(/* @vite-ignore */ builtInModule)\n\n    if (!coverageModule) {\n      throw new Error(\n        `Failed to load ${CoverageProviderMap[provider]}. Default export is missing.`,\n      )\n    }\n\n    return coverageModule\n  }\n\n  let customProviderModule\n\n  try {\n    customProviderModule = await loader.import(options.customProviderModule!)\n  }\n  catch (error) {\n    throw new Error(\n      `Failed to load custom CoverageProviderModule from ${options.customProviderModule}`,\n      { cause: error },\n    )\n  }","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/utils/coverage.ts#L58-L94","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before: mismatched versions\n// package.json\n\"vitest\": \"^4.0.0\", \"@vitest/coverage-v8\": \"^1.6.0\"\n\n// after: aligned versions\n\"vitest\": \"^4.0.0\", \"@vitest/coverage-v8\": \"^4.0.0\"","handlingStrategy":"validation","validationCode":"async function assertCoverageProviderHasDefault(provider: 'v8' | 'istanbul') {\n  const mod = await import(provider === 'v8' ? '@vitest/coverage-v8' : '@vitest/coverage-istanbul')\n  if (mod.default == null) {\n    throw new Error(`@vitest/coverage-${provider} has no default export; reinstall a version matching vitest.`)\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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."],"tags":["coverage","v8","istanbul","dependency-version"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}