{"record":{"id":"6e8aa26c5092d991","repo":"vitest-dev/vitest","slug":"failed-to-resolve-user-event-package-from-previe","errorCode":null,"errorMessage":"Failed to resolve user-event package from ${previewDistRoot}","messagePattern":"Failed to resolve user-event package from (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/browser/src/node/plugins/pluginContext.ts","lineNumber":95,"sourceCode":"  commands: {\n    ${commandsCode}\n  },\n  config: __vitest_browser_runner__.config,\n}\nexport const commands = server.commands\nexport const userEvent = createUserEvent(_userEventSetup)\nexport { page, cdp, locators, utils }\n`\n}\n\nasync function getUserEventImport(provider: BrowserProvider | undefined, resolve: (id: string, importer: string) => Promise<null | { id: string }>) {\n  if (!provider || provider.name !== 'preview') {\n    return 'const _userEventSetup = undefined'\n  }\n  const previewDistRoot = (provider as any).distRoot\n  const resolved = await resolve('@testing-library/user-event', previewDistRoot)\n  if (!resolved) {\n    throw new Error(`Failed to resolve user-event package from ${previewDistRoot}`)\n  }\n  return `\\\nimport { userEvent as _userEventSetup } from '${slash(`/@fs/${resolved.id}`)}'\n`\n}\n","sourceCodeStart":77,"sourceCodeEnd":101,"githubUrl":"https://github.com/vitest-dev/vitest/blob/1fa9837ec26533512fdcad8baebf249771bd340a/packages/browser/src/node/plugins/pluginContext.ts#L77-L101","documentation":"getUserEventImport runs only for the 'preview' provider and resolves @testing-library/user-event relative to the preview provider's distRoot. The preview provider integrates user-event for simulating interactions, so the package must be resolvable from that location. The error fires when Vite's resolver returns null, meaning the package is not installed or not reachable.","triggerScenarios":"Selecting provider: 'preview' in browser config without having @testing-library/user-event installed; installing it in a different workspace package than the one the preview provider resolves from; a pnpm hoisting setting that hides the package from the preview dist root.","commonSituations":"Following a tutorial that uses the preview provider without listing the optional peer dependency; monorepo where user-event is a devDependency of one package but the browser tests run from another; corrupted/incomplete node_modules.","solutions":["Install the package: `pnpm add -D @testing-library/user-event` in the same package that runs the browser tests.","If in a monorepo, ensure hoisting makes the package visible from the preview provider's distRoot, or add it to every workspace package that uses provider: 'preview'.","Rebuild @vitest/browser (`pnpm build`) if you are in the Vitest monorepo itself, so distRoot is populated.","As a workaround, switch to provider: 'playwright' or 'webdriverio' which do not require user-event."],"exampleFix":"// before - missing dependency\nbrowser: { provider: 'preview' }\n// after\npnpm add -D @testing-library/user-event\nbrowser: { provider: 'preview' }","handlingStrategy":"validation","validationCode":"import { createRequire } from 'node:module'\nconst req = createRequire(import.meta.url)\nfunction userEventResolvable(from: string): boolean {\n  try { req.resolve('@testing-library/user-event', { paths: [from] }); return true } catch { return false }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Add @testing-library/user-event as a devDependency wherever provider: 'preview' is used.","In monorepos, verify the package is hoisted or installed in the running workspace.","Prefer playwright/webdriverio if you do not need user-event integration."],"tags":["browser-provider","dependency","preview","user-event","resolution"],"backgroundTag":null,"analyzedSha":"1fa9837ec26533512fdcad8baebf249771bd340a","analyzedAt":"2026-08-11T16:11:39.638Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}