{"id":"69a9d457293db0c3","repo":"vitest-dev/vitest","slug":"the-name-browser-provider-does-not-provide-a","errorCode":null,"errorMessage":"The \"${name}\" browser provider does not provide a \"providerFactory\" function. Received ${typeof options.provider.providerFactory}.","messagePattern":"The \"(.+?)\" browser provider does not provide a \"providerFactory\" function\\. Received (.+?)\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/browser/src/node/utils.ts","lineNumber":91,"sourceCode":"  const name = project.name ? `[${project.name}] ` : ''\n  if (!browser) {\n    throw new Error(\n      `${name}Browser name is required. Please, set \\`test.browser.instances[].browser\\` option manually.`,\n    )\n  }\n  if (options.provider == null) {\n    throw new Error(`Browser Mode requires the \"provider\" to always be specified.`)\n  }\n  const supportedBrowsers = options.provider.supportedBrowser || []\n  if (supportedBrowsers.length && !supportedBrowsers.includes(browser)) {\n    throw new Error(\n      `${name}Browser \"${browser}\" is not supported by the browser provider \"${\n        options.provider.name\n      }\". Supported browsers: ${supportedBrowsers.join(', ')}.`,\n    )\n  }\n  if (typeof options.provider.providerFactory !== 'function') {\n    throw new TypeError(`The \"${name}\" browser provider does not provide a \"providerFactory\" function. Received ${typeof options.provider.providerFactory}.`)\n  }\n  return options.provider.providerFactory(project)\n}\n\nexport function slash(path: string): string {\n  return path.replace(/\\\\/g, '/').replace(/\\/+/g, '/')\n}\n\nexport function assertBrowserFileAccess(project: TestProject, path: string): void {\n  const normalized = slash(path)\n  if (\n    !isFileLoadingAllowed(project.vite.config, normalized)\n    && !isFileLoadingAllowed(project.vitest.vite.config, normalized)\n  ) {\n    throw new Error(\n      `Access denied to \"${path}\". See Vite config documentation for \"server.fs\": https://vitejs.dev/config/server-options.html#server-fs-strict.`,\n    )\n  }","sourceCodeStart":73,"sourceCodeEnd":109,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/browser/src/node/utils.ts#L73-L109","documentation":"Thrown as a TypeError when the resolved provider object exists but its providerFactory property is not a function. providerFactory is the contract method Vitest calls to instantiate the actual driver; a non-function value means the provider module is malformed or incompatible.","triggerScenarios":"A provider object whose providerFactory is undefined, null, a string, etc. — i.e. the provider resolved to something that doesn't implement the required interface. The error names the received typeof.","commonSituations":"Version mismatch between @vitest/browser and the driver package (providerFactory was renamed/removed); a broken or partial provider import; bundling/transform issues stripping the providerFactory method; using an outdated custom provider against a newer Vitest.","solutions":["Ensure @vitest/browser and the driver (@vitest/browser-playwright or @vitest/browser-webdriverio) are on compatible versions (align with your vitest version).","Reinstall node_modules to rule out a corrupted/partial install.","If using a custom provider, export a providerFactory function from the provider object."],"exampleFix":"// before: custom provider missing providerFactory\nexport default {\n  name: 'my-driver',\n  supportedBrowser: ['chromium'],\n  // no providerFactory\n}\n// after\nexport default {\n  name: 'my-driver',\n  supportedBrowser: ['chromium'],\n  providerFactory: (project) => new MyDriverProvider(project),\n}","handlingStrategy":"type-guard","validationCode":"// verify the resolved provider is well-formed\nconst provider = resolvedOptions.provider\nif (!provider || typeof provider.providerFactory !== 'function') {\n  throw new Error(`Provider '${provider?.name}' is incompatible (no providerFactory). Check @vitest/browser-* version.`)\n}","typeGuard":"function isValidProvider(p: any): p is { name: string; providerFactory: Function } {\n  return p != null && typeof p === 'object'\n    && typeof p.providerFactory === 'function'\n}","tryCatchPattern":"try {\n  await getBrowserProvider(options, project)\n} catch (e) {\n  if (/providerFactory/i.test(String((e as Error).message))) {\n    throw new Error('Provider/version mismatch — reinstall @vitest/browser-* to match vitest version')\n  }\n  throw e\n}","preventionTips":["Keep @vitest/browser, the driver package, and vitest on the same release line.","Run pnpm install after version bumps to refresh the provider resolution.","Unit-test custom providers to assert providerFactory is a function."],"tags":["browser-mode","provider","version-mismatch","typescript"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}