{"id":"90956d0183214b91","repo":"vitest-dev/vitest","slug":"custom-coverageprovidermodule-loaded-from-option","errorCode":null,"errorMessage":"Custom CoverageProviderModule loaded from ${options.customProviderModule} was not the default export","messagePattern":"Custom CoverageProviderModule loaded from (.+?) was not the default export","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/utils/coverage.ts","lineNumber":97,"sourceCode":"    }\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  }\n\n  if (customProviderModule.default == null) {\n    throw new Error(\n      `Custom CoverageProviderModule loaded from ${options.customProviderModule} was not the default export`,\n    )\n  }\n\n  return customProviderModule.default\n}\n","sourceCodeStart":79,"sourceCodeEnd":104,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/utils/coverage.ts#L79-L104","documentation":"After successfully importing a custom coverage provider module (coverage.ts:96-100), Vitest requires its default export to be defined. If the module loads but `customProviderModule.default` is null/undefined, this error is thrown — the file exists and imports but does not export the expected default provider.","triggerScenarios":"A custom provider module that uses named exports only, forgets `export default`, or assigns default to undefined. The import succeeds so error 394 is not hit, but the shape check at line 96 fails.","commonSituations":"Authoring a custom CoverageProviderModule and using `export const provider = ...` instead of `export default`; a barrel file that re-exports but drops the default; converting a CJS module to ESM and losing the default export.","solutions":["Add `export default` to the custom provider module exporting the provider factory object.","If using a barrel/index, ensure the default is re-exported (`export { default } from './provider'`).","Confirm the default export is the provider object (with getProvider), not undefined."],"exampleFix":"// before: named export only\nexport const provider = { getProvider: () => new MyProvider() }\n\n// after: default export\nexport default { getProvider: () => new MyProvider() }","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"function hasDefaultExport(mod: unknown): mod is { default: NonNullable<unknown> } {\n  return !!mod && typeof mod === 'object' && (mod as any).default != null\n}","tryCatchPattern":null,"preventionTips":["Always `export default` the provider object from a custom coverage module.","When re-exporting through a barrel, preserve the default explicitly.","Write a tiny test that imports the module and asserts default is defined."],"tags":["coverage","custom-provider","default-export","config"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}