vitest-dev/vitest · error · TypeError
The "${name}" browser provider does not provide a "providerF
Error message
The "${name}" browser provider does not provide a "providerFactory" function. Received ${typeof options.provider.providerFactory}. What it means
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.
Source
Thrown at packages/browser/src/node/utils.ts:91
const name = project.name ? `[${project.name}] ` : ''
if (!browser) {
throw new Error(
`${name}Browser name is required. Please, set \`test.browser.instances[].browser\` option manually.`,
)
}
if (options.provider == null) {
throw new Error(`Browser Mode requires the "provider" to always be specified.`)
}
const supportedBrowsers = options.provider.supportedBrowser || []
if (supportedBrowsers.length && !supportedBrowsers.includes(browser)) {
throw new Error(
`${name}Browser "${browser}" is not supported by the browser provider "${
options.provider.name
}". Supported browsers: ${supportedBrowsers.join(', ')}.`,
)
}
if (typeof options.provider.providerFactory !== 'function') {
throw new TypeError(`The "${name}" browser provider does not provide a "providerFactory" function. Received ${typeof options.provider.providerFactory}.`)
}
return options.provider.providerFactory(project)
}
export function slash(path: string): string {
return path.replace(/\\/g, '/').replace(/\/+/g, '/')
}
export function assertBrowserFileAccess(project: TestProject, path: string): void {
const normalized = slash(path)
if (
!isFileLoadingAllowed(project.vite.config, normalized)
&& !isFileLoadingAllowed(project.vitest.vite.config, normalized)
) {
throw new Error(
`Access denied to "${path}". See Vite config documentation for "server.fs": https://vitejs.dev/config/server-options.html#server-fs-strict.`,
)
}View on GitHub (pinned to d568f8ce37)
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.
Example fix
// before: custom provider missing providerFactory
export default {
name: 'my-driver',
supportedBrowser: ['chromium'],
// no providerFactory
}
// after
export default {
name: 'my-driver',
supportedBrowser: ['chromium'],
providerFactory: (project) => new MyDriverProvider(project),
} Defensive patterns
Strategy: type-guard
Validate before calling
// verify the resolved provider is well-formed
const provider = resolvedOptions.provider
if (!provider || typeof provider.providerFactory !== 'function') {
throw new Error(`Provider '${provider?.name}' is incompatible (no providerFactory). Check @vitest/browser-* version.`)
} Type guard
function isValidProvider(p: any): p is { name: string; providerFactory: Function } {
return p != null && typeof p === 'object'
&& typeof p.providerFactory === 'function'
} Try / catch
try {
await getBrowserProvider(options, project)
} catch (e) {
if (/providerFactory/i.test(String((e as Error).message))) {
throw new Error('Provider/version mismatch — reinstall @vitest/browser-* to match vitest version')
}
throw e
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Browser Mode requires the "provider" to always be specified.
- The ${provider.name} provider does not support tracing.
- The ${context.provider.name} provider does not support traci
- provider ${context.provider.name} is not supported
- You've enabled headless mode for "preview" provider but it d
AI-assisted analysis of vitest-dev/vitest@d568f8ce37 (2026-08-03).
Data as JSON: /data/errors/69a9d457293db0c3.json.
Report an issue: GitHub.