{"id":"4d7c5f5346ee41c6","repo":"vitest-dev/vitest","slug":"browser-mode-was-enabled-but-provider-was-not-spe","errorCode":null,"errorMessage":"Browser Mode was enabled, but provider was not specified anywhere. See https://vitest.dev/guide/browser/#configuration","messagePattern":"Browser Mode was enabled, but provider was not specified anywhere\\. See https://vitest\\.dev/guide/browser/#configuration","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/plugins/browserLoader.ts","lineNumber":60,"sourceCode":"    {\n      name: 'vitest:browser:loader',\n      // `pre` so the browser plugins injected via `applyToEnvironment` land before\n      // Vite's internal resolver in the `client` environment (so e.g. the\n      // `vitest/browser` virtual module wins over the node stub resolution).\n      enforce: 'pre',\n      async config(viteConfig) {\n        const browser = viteConfig.test?.browser\n        if (!browser?.enabled) {\n          return\n        }\n        // The provider can be configured at the project level or per instance\n        // (e.g. connect mode). All instances in a project share one provider\n        // (validated in `resolveTestConfig`), so any instance's server factory\n        // builds the shared server.\n        const provider = browser.provider\n          ?? browser.instances?.find(instance => instance.provider)?.provider\n        if (!provider || typeof provider.serverFactory !== 'function') {\n          throw new Error(`Browser Mode was enabled, but provider was not specified anywhere. See https://vitest.dev/guide/browser/#configuration`)\n        }\n        const contribution = await provider.serverFactory()\n        holder.contribution = contribution\n        const browserConfig = await contribution.config(viteConfig, harness)\n        return browserConfig\n      },\n      applyToEnvironment(environment) {\n        const contribution = holder.contribution\n        if (contribution && environment.name === 'client') {\n          // `post` browser plugins are injected by `vitest:browser:loader:post`\n          // instead, so they run after the `post` plugins of the main pipeline\n          // rather than at this `pre` position. For example, the mocker's\n          // `vitest:browser:esm-injector` must run after `vitest:mocks`, which is\n          // added by the main pipeline and is not part of `contribution.plugins`.\n          return sortPluginsByEnforce(\n            contribution.plugins.filter(plugin => plugin.enforce !== 'post'),\n          )\n        }","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/node/plugins/browserLoader.ts#L42-L78","documentation":"BrowserLoaderPlugin.config (browserLoader.ts:60) needs a browser provider exposing a serverFactory. It checks browser.provider, then any instance.provider; if none resolves (or the resolved provider has no serverFactory function), the browser pipeline can't boot. Browser mode therefore refuses to start instead of running headless without a provider.","triggerScenarios":"Setting test.browser.enabled = true without configuring test.browser.provider (and no browser.instances with a provider), or specifying a provider that doesn't expose serverFactory (e.g. not installed / wrong package).","commonSituations":"Enabling browser mode before installing @vitest/browser-provider-playwright/webdriverio; misspelling the provider name; using instances without per-instance provider in a multi-instance setup.","solutions":["Set test.browser.provider to a supported name (e.g. 'playwright') or set provider on each browser.instances entry.","Install the matching provider package and follow https://vitest.dev/guide/browser/#configuration.","Verify the provider is registered and exposes serverFactory (check @vitest/browser core)."],"exampleFix":"// before\ntest: { browser: { enabled: true } }\n\n// after\ntest: { browser: { enabled: true, provider: 'playwright', instances: [{ browser: 'chromium' }] } }","handlingStrategy":"validation","validationCode":"const provider = browser.provider ?? browser.instances?.find(i => i.provider)?.provider\nif (!provider || typeof provider.serverFactory !== 'function') {\n  throw new Error('Browser mode needs a configured provider with serverFactory')\n}","typeGuard":"function hasBrowserProvider(browser: any): boolean {\n  const p = browser?.provider ?? browser?.instances?.find((i: any) => i.provider)?.provider\n  return p != null && typeof p.serverFactory === 'function'\n}","tryCatchPattern":null,"preventionTips":["Set test.browser.provider (or per-instance provider) whenever browser.enabled is true.","Install the matching provider package before enabling browser mode.","Validate the browser config block in a CI smoke test."],"tags":["browser","config","provider"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}