{"record":{"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":"exception","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/1fa9837ec26533512fdcad8baebf249771bd340a/packages/browser/src/node/utils.ts#L73-L109","documentation":"A TypeError thrown when the resolved provider object exists but its providerFactory field is not a function. The factory is what Vitest calls as providerFactory(project) to build the live provider instance; a missing/non-function factory means the provider object is malformed.","triggerScenarios":"options.provider passes the null check and the supportedBrowser check, but typeof options.provider.providerFactory !== 'function' — e.g. it is undefined, a string, or an object.","commonSituations":"A hand-rolled custom provider that omits the providerFactory method; a provider package whose public surface changed across versions (breaking change); partial mock of a provider in a plugin.","solutions":["If shipping a custom provider, expose providerFactory: (project) => BrowserProviderInstance as a method on the provider definition.","Upgrade or downgrade the provider package to the version compatible with your installed @vitest/browser (check the peer range).","Audit your provider object dump (console.log(options.provider)) to confirm the expected function exists at the right key."],"exampleFix":"// before: custom provider missing the factory\nconst myProvider = { name: 'mine', supportedBrowser: ['chromium'] }\n// after\nconst myProvider = {\n  name: 'mine',\n  supportedBrowser: ['chromium'],\n  providerFactory: (project) => new MyProviderInstance(project),\n}","handlingStrategy":"type-guard","validationCode":"function assertProviderFactory(p) {\n  if (typeof p?.providerFactory !== 'function') {\n    throw new TypeError(`Provider \"${p?.name}\" is missing providerFactory(project).`)\n  }\n}","typeGuard":"function hasProviderFactory(p): p is { providerFactory: (project: unknown) => unknown } {\n  return !!p && typeof p.providerFactory === 'function'\n}","tryCatchPattern":null,"preventionTips":["When writing a custom provider, type it against the BrowserProvider interface so the factory is enforced at compile time.","Pin provider package versions to the compatible range; providerFactory was introduced in a specific major."],"tags":["browser","provider","custom-plugin","type-error"],"backgroundTag":null,"analyzedSha":"1fa9837ec26533512fdcad8baebf249771bd340a","analyzedAt":"2026-08-11T16:11:39.638Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}