{"record":{"id":"d8004f0d5e1199a1","repo":"vitest-dev/vitest","slug":"istanbul-coverage-provider-is-not-compatible-wit","errorCode":null,"errorMessage":"\"Istanbul\" coverage provider is not compatible with \"experimental.viteModuleRunner: false\". Please, enable \"viteModuleRunner\" or switch to \"v8\" coverage provider.","messagePattern":"\"Istanbul\" coverage provider is not compatible with \"experimental\\.viteModuleRunner: false\"\\. Please, enable \"viteModuleRunner\" or switch to \"v8\" coverage provider\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/config/resolveConfig.ts","lineNumber":480,"sourceCode":"      // if `instances` were defined, but now they are empty,\n      // let's throw an error because the filter is invalid\n      if (!browser.instances.length) {\n        throw new Error([\n          `\"browser.instances\" was set in the config, but the array is empty. Define at least one browser config.`,\n          ` The \"browser.name\" was set to \"${browser.name}\" which filtered all configs (${instances.map(c => c.browser).join(', ')}). Did you mean to use another name?`,\n        ].join(''))\n      }\n    }\n\n    browser.instances.forEach((instance) => {\n      instance.name ??= resolved.name\n        ? `${resolved.name} (${instance.browser})`\n        : instance.browser\n    })\n  }\n\n  if (resolved.coverage.enabled && resolved.coverage.provider === 'istanbul' && resolved.experimental?.viteModuleRunner === false) {\n    throw new Error(`\"Istanbul\" coverage provider is not compatible with \"experimental.viteModuleRunner: false\". Please, enable \"viteModuleRunner\" or switch to \"v8\" coverage provider.`)\n  }\n\n  if (browser.enabled && resolved.detectAsyncLeaks) {\n    logger.console.warn(c.yellow('The option \"detectAsyncLeaks\" is not supported in browser mode and will be ignored.'))\n  }\n\n  resolved.coverage.reporter = resolveCoverageReporters(resolved.coverage.reporter)\n  if (isAgent) {\n    // default to `skipFull` and add `text-summary` reporter when `text` reporter is used on agents\n    const text = resolved.coverage.reporter.find(([name]) => name === 'text')\n    const textSummary = resolved.coverage.reporter.find(([name]) => name === 'text-summary')\n    if (text) {\n      (text as any)[1] = { skipFull: true, ...text[1] as any }\n      if (!textSummary) {\n        resolved.coverage.reporter.push(['text-summary', {}])\n      }\n    }\n  }","sourceCodeStart":462,"sourceCodeEnd":498,"githubUrl":"https://github.com/vitest-dev/vitest/blob/1fa9837ec26533512fdcad8baebf249771bd340a/packages/vitest/src/node/config/resolveConfig.ts#L462-L498","documentation":"The Istanbul coverage provider instruments code through its own transform pipeline and depends on Vitest's Vite module runner to load the instrumented output. Disabling the experimental module runner (`experimental.viteModuleRunner: false`) breaks that pipeline, so Vitest refuses the pairing rather than emitting silently-wrong coverage.","triggerScenarios":"Setting `coverage.provider: 'istanbul'` together with `experimental.viteModuleRunner: false` in the same config.","commonSituations":"Opting out of the experimental runner for a stability reason while leaving Istanbul as the default coverage provider.","solutions":["Switch coverage to `provider: 'v8'`.","Or remove `experimental.viteModuleRunner: false` (let it default / set it true) and keep Istanbul.","If you must disable the runner for other reasons, accept v8 coverage for those runs."],"exampleFix":"// before\ntest: {\n  coverage: { provider: 'istanbul' },\n  experimental: { viteModuleRunner: false },\n}\n// after\ntest: {\n  coverage: { provider: 'v8' },\n  experimental: { viteModuleRunner: false },\n}","handlingStrategy":"validation","validationCode":"if (config.test?.coverage?.provider === 'istanbul' && config.test?.experimental?.viteModuleRunner === false) {\n  throw new Error('Istanbul coverage requires viteModuleRunner; switching to v8.')\n}\nconfig.test.coverage.provider = 'v8'","typeGuard":"function isCompatibleCoverageCombo(provider: string, runner?: boolean): boolean {\n  return !(provider === 'istanbul' && runner === false)\n}","tryCatchPattern":null,"preventionTips":["When you disable `viteModuleRunner`, audit coverage provider in the same change.","Document the pairing in the config comment."],"tags":["config","coverage","experimental","validation"],"backgroundTag":null,"analyzedSha":"1fa9837ec26533512fdcad8baebf249771bd340a","analyzedAt":"2026-08-11T16:11:39.638Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}