{"record":{"id":"415f6816e52d90c4","repo":"vitest-dev/vitest","slug":"vitest-coverage-v8-does-not-work-with-browserco","errorCode":null,"errorMessage":"@vitest/coverage-v8 does not work with\n${browserConfig}\n\nUse either:\n${correctExample}\n\n...or change your coverage provider to:\n${coverageExample}\n","messagePattern":"@vitest/coverage-v8 does not work with\n(.+?)\n\nUse either:\n(.+?)\n\n\\.\\.\\.or change your coverage provider to:\n(.+?)\n","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/projects/resolveProjects.ts","lineNumber":927,"sourceCode":"  browser: {\n    provider: ${preferredProvider}(),\n    instances: [\n      { browser: '${preferredBrowser}' }\n    ],\n  },\n}\n          `.trim()\n\n        if (projectConfig.coverage.enabled && projectConfig.coverage.provider === 'v8') {\n          const coverageExample = `\n{\n  coverage: {\n    provider: 'istanbul',\n  },\n}\n            `.trim()\n\n          throw new Error(\n            `@vitest/coverage-v8 does not work with\\n${browserConfig}\\n`\n            + `\\nUse either:\\n${correctExample}`\n            + `\\n\\n...or change your coverage provider to:\\n${coverageExample}\\n`,\n          )\n        }\n\n        if (globalConfig.inspect || globalConfig.inspectBrk) {\n          const inspectOption = `--inspect${globalConfig.inspectBrk ? '-brk' : ''}`\n\n          throw new Error(\n            `${inspectOption} does not work with\\n${browserConfig}\\n`\n            + `\\nUse either:\\n${correctExample}`\n            + `\\n\\n...or disable ${inspectOption}\\n`,\n          )\n        }\n      }\n\n      if (names.has(name)) {","sourceCodeStart":909,"sourceCodeEnd":945,"githubUrl":"https://github.com/vitest-dev/vitest/blob/1fa9837ec26533512fdcad8baebf249771bd340a/packages/vitest/src/node/projects/resolveProjects.ts#L909-L945","documentation":"V8 coverage (`@vitest/coverage-v8`) collects coverage through Node's V8 inspector and only works while tests execute in a Node-controlled Chromium over CDP. When a browser project runs through the `preview` provider or a non-Chromium browser (playwright firefox/webkit, or webdriverio with a non-chrome/edge browser), V8 coverage cannot collect anything, so Vitest aborts project resolution and prints both a working browser-provider example and an Istanbul-coverage alternative.","triggerScenarios":"`projectConfig.coverage.enabled === true` AND `projectConfig.coverage.provider === 'v8'` AND a browser instance whose effective `provider` is `preview`, or whose `(provider, browser)` pair is non-Chromium per `isChromiumName` (playwright requires `chromium`; webdriverio requires `chrome` or `edge`). The check lives in the CDP-only branch at resolveProjects.ts:891-932.","commonSituations":"Copying a Node-oriented vitest config (with the default `provider: 'v8'`) into a project that enables `browser.instances` with the preview provider or playwright+firefox/webkit; enabling browser mode without realizing the default coverage provider is v8.","solutions":["Switch coverage to Istanbul: set `coverage: { provider: 'istanbul' }` in the project config (or globally).","Or keep v8 coverage and point the browser instance at a Chromium-based target: `provider: 'playwright'` with `browser: 'chromium'`, or `provider: 'webdriverio'` with `browser: 'chrome'`/`'edge'`.","Or disable coverage for that browser project (`coverage: { enabled: false }`)."],"exampleFix":"// before\nexport default defineConfig({\n  test: {\n    coverage: { provider: 'v8', enabled: true },\n    browser: { provider: 'playwright', instances: [{ browser: 'firefox' }] },\n  },\n})\n\n// after (option A: istanbul)\nexport default defineConfig({\n  test: {\n    coverage: { provider: 'istanbul', enabled: true },\n    browser: { provider: 'playwright', instances: [{ browser: 'firefox' }] },\n  },\n})\n\n// after (option B: chromium so v8 works)\nexport default defineConfig({\n  test: {\n    coverage: { provider: 'v8', enabled: true },\n    browser: { provider: 'playwright', instances: [{ browser: 'chromium' }] },\n  },\n})","handlingStrategy":"validation","validationCode":"// Reject v8 coverage combined with a non-CDP browser instance before starting Vitest.\nfunction isChromiumTarget(provider: string | undefined, browser: string) {\n  if (provider === 'playwright') return browser === 'chromium'\n  if (provider === 'webdriverio') return browser === 'chrome' || browser === 'edge'\n  return false // 'preview' and others are non-CDP\n}\nfunction assertCoverageBrowserCompatible(test: { coverage?: any; browser?: any }) {\n  const v8 = test.coverage?.enabled && test.coverage?.provider === 'v8'\n  if (!v8) return\n  const instances = test.browser?.instances ?? []\n  for (const i of instances) {\n    const provider = i.provider?.name ?? test.browser?.provider?.name ?? 'preview'\n    if (provider === 'preview' || !isChromiumTarget(provider, i.browser)) {\n      throw new Error(\n        `coverage 'v8' is incompatible with browser instance '${i.name ?? i.browser}' ` +\n        `(provider '${provider}'). Use provider 'istanbul' or a Chromium target.`,\n      )\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat `provider: 'istanbul'` as the safe default for any project that enables `browser`.","Centralize the coverage/browser compatibility check in a shared config helper so all projects are validated.","In CI, assert the resolved `coverage.provider` per browser project before running tests."],"tags":["coverage","browser","config"],"backgroundTag":null,"analyzedSha":"1fa9837ec26533512fdcad8baebf249771bd340a","analyzedAt":"2026-08-11T16:11:39.638Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}