vitest-dev/vitest · error · Error

@vitest/coverage-v8 does not work with ${browserConfig} Use

Error message

@vitest/coverage-v8 does not work with
${browserConfig}

Use either:
${correctExample}

...or change your coverage provider to:
${coverageExample}

What it means

V8 coverage relies on Chrome DevTools Protocol and only works with Chromium-based browsers under the playwright (chromium) or preview (chrome/edge) provider. The block at resolveProjects.ts:695-736 detects a non-chromium browser instance (or non-preview provider) combined with coverage.provider === 'v8' and coverage.enabled, then throws with the offending config and two fixes: switch the browser to chromium/chrome, or switch coverage to istanbul.

Source

Thrown at packages/vitest/src/node/projects/resolveProjects.ts:731

  browser: {
    provider: ${preferredProvider}(),
    instances: [
      { browser: '${preferredBrowser}' }
    ],
  },
}
          `.trim()

        if (projectConfig.coverage.enabled && projectConfig.coverage.provider === 'v8') {
          const coverageExample = `
{
  coverage: {
    provider: 'istanbul',
  },
}
            `.trim()

          throw new Error(
            `@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`,
          )
        }

        if (globalConfig.inspect || globalConfig.inspectBrk) {
          const inspectOption = `--inspect${globalConfig.inspectBrk ? '-brk' : ''}`

          throw new Error(
            `${inspectOption} does not work with\n${browserConfig}\n`
            + `\nUse either:\n${correctExample}`
            + `\n\n...or disable ${inspectOption}\n`,
          )
        }
      }

      if (names.has(name)) {

View on GitHub (pinned to d568f8ce37)

Solutions

  1. Switch coverage.provider to 'istanbul' for non-Chromium browsers (istanbul instruments the JS and works anywhere).
  2. Limit browser.instances to Chromium-based engines (chromium under playwright, chrome/edge under preview) when you need v8 coverage.
  3. Split into two projects: one chromium project with v8 coverage, one firefox/webkit project with coverage disabled or istanbul.

Example fix

// before
test: {
  coverage: { enabled: true, provider: 'v8' },
  browser: { enabled: true, provider: 'playwright', instances: [
    { browser: 'chromium' }, { browser: 'firefox' },
  ] },
}

// after
test: {
  coverage: { enabled: true, provider: 'istanbul' },
  browser: { enabled: true, provider: 'playwright', instances: [
    { browser: 'chromium' }, { browser: 'firefox' },
  ] },
}
Defensive patterns

Strategy: validation

Validate before calling

const chromiumOnly = (instances: { browser: string }[], provider: string) =>
  instances.every(i => isChromiumName(provider, i.browser))
if (config.coverage.enabled && config.coverage.provider === 'v8' && !chromiumOnly(config.browser.instances, config.browser.provider?.name ?? 'preview')) {
  throw new Error('v8 coverage requires chromium-only browser instances; switch to istanbul or restrict instances')
}

Type guard

function isChromiumBrowser(provider: string, browser: string): boolean {
  if (provider === 'playwright') return browser === 'chromium'
  return browser === 'chrome' || browser === 'edge'
}

Prevention

When it happens

Trigger: Setting coverage.provider='v8' while browser.instances includes firefox/webkit, or using a non-chromium browser name with the playwright provider; enabling coverage and a non-chromium browser simultaneously.

Common situations: Wanting coverage numbers across multiple browsers including Firefox/Safari; default v8 coverage inherited from root while a project adds firefox instances; CI matrix that enables coverage globally but runs a webkit project.

Related errors


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