{"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/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/browser/src/node/plugins/pluginContext.ts#L77-L101","documentation":"When the `preview` provider is active, the virtual context module needs `@testing-library/user-event` to wire up `userEvent`. Vitest resolves that package starting from the provider's `distRoot`; if the resolver returns null it cannot inject `userEvent`, so it fails fast.","triggerScenarios":"Using `provider: 'preview'` and importing `vitest/browser` while `@testing-library/user-event` is not installed, is not resolvable from the provider's `distRoot`, or is shadowed by an incompatible version.","commonSituations":"Forgetting to install `@testing-library/user-event` for component testing with the preview provider; pnpm strict hoisting hiding the package from the provider's resolution root; a broken or partial install.","solutions":["Install the package: `pnpm add -D @testing-library/user-event`.","Verify resolution: `node -e \"console.log(require.resolve('@testing-library/user-event', { paths: ['<provider distRoot>'] }))\"`.","For pnpm, ensure the package isn't locked behind `node-linker=hoisted=false` issues — add it to the workspace and rerun `pnpm install`.","If using a private registry, confirm the package downloaded correctly (clear `node_modules/.pnpm` and reinstall)."],"exampleFix":"// before — preview provider without user-event\npnpm add -D vitest @vitest/browser\n\n// after\npnpm add -D vitest @vitest/browser @testing-library/user-event","handlingStrategy":"validation","validationCode":"import { createRequire } from 'node:module'\nimport { dirname } from 'pathe'\n\nfunction userEventResolvableFrom(distRoot: string): boolean {\n  try {\n    createRequire(distRoot + '/package.json').resolve('@testing-library/user-event')\n    return true\n  } catch {\n    return false\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Install @testing-library/user-event whenever you use the preview provider.","Verify package resolution from the provider dist root (not just the project root) under pnpm strict hoisting.","Add a smoke test that imports vitest/browser under the preview provider in CI."],"tags":["preview-provider","dependency","user-event","resolution"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}