{"id":"199e8eeeb863efa4","repo":"vitest-dev/vitest","slug":"the-browser-provider-configuration-was-changed-t","errorCode":null,"errorMessage":"The `browser.provider` configuration was changed to accept a factory instead of a string. Add an import of \"${resolved.browser.provider}\" from \"${source}\" instead. See: https://vitest.dev/config/browser/provider","messagePattern":"The `browser\\.provider` configuration was changed to accept a factory instead of a string\\. Add an import of \"(.+?)\" from \"(.+?)\" instead\\. See: https://vitest\\.dev/config/browser/provider","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/config/resolveConfig.ts","lineNumber":863,"sourceCode":"    )\n  }\n\n  if (resolved.inspector.enabled) {\n    resolved.browser.trackUnhandledErrors ??= false\n  }\n\n  resolved.browser.viewport ??= {} as any\n  resolved.browser.viewport.width ??= 414\n  resolved.browser.viewport.height ??= 896\n\n  resolved.browser.locators ??= {} as any\n  resolved.browser.locators.testIdAttribute ??= 'data-testid'\n  resolved.browser.locators.exact ??= true\n  resolved.browser.locators.errorFormat ??= 'all'\n\n  if (typeof resolved.browser.provider === 'string') {\n    const source = `@vitest/browser-${resolved.browser.provider}`\n    throw new TypeError(\n      'The `browser.provider` configuration was changed to accept a factory instead of a string. '\n      + `Add an import of \"${resolved.browser.provider}\" from \"${source}\" instead. See: https://vitest.dev/config/browser/provider`,\n    )\n  }\n\n  const isPreview = resolved.browser.provider?.name === 'preview'\n\n  if (!isPreview && resolved.browser.enabled && stdProvider === 'stackblitz') {\n    throw new Error(`stackblitz environment does not support the ${resolved.browser.provider?.name} provider. Please, use \"@vitest/browser-preview\" instead.`)\n  }\n  if (isPreview && resolved.browser.screenshotFailures === true) {\n    console.warn(c.yellow(\n      [\n        `Browser provider \"preview\" doesn't support screenshots, `,\n        `so \"browser.screenshotFailures\" option is forcefully disabled. `,\n        `Set \"browser.screenshotFailures\" to false or remove it from the config to suppress this warning.`,\n      ].join(''),\n    ))","sourceCodeStart":845,"sourceCodeEnd":881,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/node/config/resolveConfig.ts#L845-L881","documentation":"Vitest changed `browser.provider` from a string identifier (e.g. `'playwright'`) to a factory function imported from a package. The check at resolveConfig.ts:861 detects a string and throws, instructing you to import the provider and pass the factory instead, with a link to the migration docs.","triggerScenarios":"Set `browser: { provider: 'playwright' }` (a string) in a config targeting the current Vitest version.","commonSituations":"Upgrading Vitest across the major version that changed the provider API; copy-pasting config from old docs or examples.","solutions":["Import the provider factory and pass it: `import { playwright } from '@vitest/browser-playwright'; browser: { provider: playwright }`.","If the provider name in the error is something else, import from the corresponding `@vitest/browser-<name>` package.","Update the `@vitest/browser-*` package to the version matching your Vitest."],"exampleFix":"// before\nimport { defineConfig } from 'vitest/config'\nexport default defineConfig({ test: { browser: { enabled: true, provider: 'playwright' } } })\n// after\nimport { defineConfig } from 'vitest/config'\nimport { playwright } from '@vitest/browser-playwright'\nexport default defineConfig({ test: { browser: { enabled: true, provider: playwright } } })","handlingStrategy":"type-guard","validationCode":"function assertBrowserProviderIsFactory(browser: any) {\n  if (browser?.provider != null && typeof browser.provider === 'string') {\n    throw new Error(`browser.provider must be a factory, not a string. Import from @vitest/browser-${browser.provider}.`)\n  }\n}","typeGuard":"function isProviderFactory(provider: unknown): provider is { name: string; serverFactory: unknown } {\n  return typeof provider === 'object' && provider !== null && typeof (provider as any).name === 'string'\n}","tryCatchPattern":null,"preventionTips":["After upgrading Vitest, grep configs for `provider:` string literals.","Import the provider factory from its @vitest/browser-* package.","Pin the browser provider package version to match Vitest."],"tags":["config","browser","provider","migration","breaking-change"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}