@vitest/browser 2.1.0-beta.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,6 +17,7 @@ function wrapModule(module) {
17
17
 
18
18
  window.__vitest_browser_runner__ = {
19
19
  wrapModule,
20
+ wrapDynamicImport: wrapModule,
20
21
  moduleCache,
21
22
  config: { __VITEST_CONFIG__ },
22
23
  viteConfig: { __VITEST_VITE_CONFIG__ },
@@ -26,8 +26,8 @@
26
26
  {__VITEST_INJECTOR__}
27
27
  {__VITEST_ERROR_CATCHER__}
28
28
  {__VITEST_SCRIPTS__}
29
- <script type="module" crossorigin src="/__vitest_browser__/orchestrator-CoMoQEYq.js"></script>
30
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/preload-helper-YsBSwBkS.js">
29
+ <script type="module" crossorigin src="/__vitest_browser__/orchestrator-qtq9EW1J.js"></script>
30
+ <link rel="modulepreload" crossorigin href="/__vitest_browser__/preload-helper-D-WYp1PK.js">
31
31
  </head>
32
32
  <body>
33
33
  <div id="vitest-tester"></div>
@@ -20,8 +20,8 @@
20
20
  <script>{__VITEST_STATE__}</script>
21
21
  {__VITEST_INTERNAL_SCRIPTS__}
22
22
  {__VITEST_SCRIPTS__}
23
- <script type="module" crossorigin src="/__vitest_browser__/tester-C7y_vb57.js"></script>
24
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/preload-helper-YsBSwBkS.js">
23
+ <script type="module" crossorigin src="/__vitest_browser__/tester-Bm6k0JOu.js"></script>
24
+ <link rel="modulepreload" crossorigin href="/__vitest_browser__/preload-helper-D-WYp1PK.js">
25
25
  </head>
26
26
  <body>
27
27
  {__VITEST_APPEND__}
package/dist/context.js CHANGED
@@ -90,13 +90,13 @@ const channel = new BroadcastChannel(`vitest:${contextId}`);
90
90
  function triggerCommand(command, ...args) {
91
91
  return rpc().triggerCommand(contextId, command, filepath(), args);
92
92
  }
93
- function createUserEvent() {
93
+ function createUserEvent(__tl_user_event__) {
94
94
  const keyboard = {
95
95
  unreleased: []
96
96
  };
97
97
  return {
98
- setup() {
99
- return createUserEvent();
98
+ setup(options) {
99
+ return createUserEvent(__tl_user_event__?.setup(options));
100
100
  },
101
101
  click(element, options = {}) {
102
102
  return convertToLocator(element).click(processClickOptions(options));
@@ -110,7 +110,36 @@ function createUserEvent() {
110
110
  selectOptions(element, value) {
111
111
  return convertToLocator(element).selectOptions(value);
112
112
  },
113
+ clear(element) {
114
+ return convertToLocator(element).clear();
115
+ },
116
+ hover(element, options = {}) {
117
+ return convertToLocator(element).hover(processHoverOptions(options));
118
+ },
119
+ unhover(element, options = {}) {
120
+ return convertToLocator(element).unhover(options);
121
+ },
122
+ upload(element, files) {
123
+ return convertToLocator(element).upload(files);
124
+ },
125
+ // non userEvent events, but still useful
126
+ fill(element, text, options) {
127
+ return convertToLocator(element).fill(text, options);
128
+ },
129
+ dragAndDrop(source, target, options = {}) {
130
+ const sourceLocator = convertToLocator(source);
131
+ const targetLocator = convertToLocator(target);
132
+ return sourceLocator.dropTo(targetLocator, processDragAndDropOptions(options));
133
+ },
134
+ // testing-library user-event
113
135
  async type(element, text, options = {}) {
136
+ if (typeof __tl_user_event__ !== "undefined") {
137
+ return __tl_user_event__.type(
138
+ element instanceof Element ? element : element.element(),
139
+ text,
140
+ options
141
+ );
142
+ }
114
143
  const selector = convertToSelector(element);
115
144
  const { unreleased } = await triggerCommand(
116
145
  "__vitest_type",
@@ -120,38 +149,25 @@ function createUserEvent() {
120
149
  );
121
150
  keyboard.unreleased = unreleased;
122
151
  },
123
- clear(element) {
124
- return convertToLocator(element).clear();
125
- },
126
152
  tab(options = {}) {
153
+ if (typeof __tl_user_event__ !== "undefined") {
154
+ return __tl_user_event__.tab(options);
155
+ }
127
156
  return triggerCommand("__vitest_tab", options);
128
157
  },
129
158
  async keyboard(text) {
159
+ if (typeof __tl_user_event__ !== "undefined") {
160
+ return __tl_user_event__.keyboard(text);
161
+ }
130
162
  const { unreleased } = await triggerCommand(
131
163
  "__vitest_keyboard",
132
164
  text,
133
165
  keyboard
134
166
  );
135
167
  keyboard.unreleased = unreleased;
136
- },
137
- hover(element, options = {}) {
138
- return convertToLocator(element).hover(processHoverOptions(options));
139
- },
140
- unhover(element, options = {}) {
141
- return convertToLocator(element).unhover(options);
142
- },
143
- // non userEvent events, but still useful
144
- fill(element, text, options) {
145
- return convertToLocator(element).fill(text, options);
146
- },
147
- dragAndDrop(source, target, options = {}) {
148
- const sourceLocator = convertToLocator(source);
149
- const targetLocator = convertToLocator(target);
150
- return sourceLocator.dropTo(targetLocator, processDragAndDropOptions(options));
151
168
  }
152
169
  };
153
170
  }
154
- const userEvent = createUserEvent();
155
171
  function cdp() {
156
172
  return getBrowserState().cdp;
157
173
  }
@@ -352,4 +368,4 @@ function getIframeScale() {
352
368
  return scale;
353
369
  }
354
370
 
355
- export { cdp, page, userEvent };
371
+ export { cdp, createUserEvent, page };
@@ -121,6 +121,25 @@ class Locator {
121
121
  fill(text, options) {
122
122
  return this.triggerCommand("__vitest_fill", this.selector, text, options);
123
123
  }
124
+ async upload(files) {
125
+ const filesPromise = (Array.isArray(files) ? files : [files]).map(async (file) => {
126
+ if (typeof file === "string") {
127
+ return file;
128
+ }
129
+ const bas64String = await new Promise((resolve, reject) => {
130
+ const reader = new FileReader();
131
+ reader.onload = () => resolve(reader.result);
132
+ reader.onerror = () => reject(new Error(`Failed to read file: ${file.name}`));
133
+ reader.readAsDataURL(file);
134
+ });
135
+ return {
136
+ name: file.name,
137
+ mimeType: file.type,
138
+ base64: bas64String
139
+ };
140
+ });
141
+ return this.triggerCommand("__vitest_upload", this.selector, await Promise.all(filesPromise));
142
+ }
124
143
  dropTo(target, options = {}) {
125
144
  return this.triggerCommand(
126
145
  "__vitest_dragAndDrop",
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import { CDPSession, BrowserServerState as BrowserServerState$1, BrowserServerStateContext, BrowserServer as BrowserServer$1, WorkspaceProject, Vite, BrowserProvider, BrowserScript, Vitest, ProcessPool } from 'vitest/node';
2
2
  import { Plugin } from 'vitest/config';
3
3
  import * as vitest from 'vitest';
4
- import { File, TaskResultPack, AfterSuiteRunMeta, CancelReason, UserConsoleLog, SnapshotResult, SerializedConfig } from 'vitest';
4
+ import { RunnerTestFile, TaskResultPack, AfterSuiteRunMeta, CancelReason, UserConsoleLog, SnapshotResult, SerializedConfig } from 'vitest';
5
5
  import { ErrorWithDiff } from '@vitest/utils';
6
6
  import { StackTraceParserOptions } from '@vitest/utils/source-map';
7
+ import { ServerIdResolution, ServerMockResolution } from '@vitest/mocker/node';
7
8
 
8
9
  type ArgumentsType<T> = T extends (...args: infer A) => any ? A : never;
9
10
  type ReturnType<T> = T extends (...args: any) => infer R ? R : never;
@@ -24,7 +25,7 @@ interface WebSocketBrowserHandlers {
24
25
  resolveSnapshotPath: (testPath: string) => string;
25
26
  resolveSnapshotRawPath: (testPath: string, rawPath: string) => string;
26
27
  onUnhandledError: (error: unknown, type: string) => Promise<void>;
27
- onCollected: (files?: File[]) => Promise<void>;
28
+ onCollected: (files?: RunnerTestFile[]) => Promise<void>;
28
29
  onTaskUpdate: (packs: TaskResultPack[]) => void;
29
30
  onAfterSuiteRun: (meta: AfterSuiteRunMeta) => void;
30
31
  onCancel: (reason: CancelReason) => void;
@@ -36,18 +37,11 @@ interface WebSocketBrowserHandlers {
36
37
  finishBrowserTests: (contextId: string) => void;
37
38
  snapshotSaved: (snapshot: SnapshotResult) => void;
38
39
  debug: (...args: string[]) => void;
39
- resolveId: (id: string, importer?: string) => Promise<{
40
- id: string;
41
- url: string;
42
- optimized: boolean;
43
- } | null>;
40
+ resolveId: (id: string, importer?: string) => Promise<ServerIdResolution | null>;
44
41
  triggerCommand: <T>(contextId: string, command: string, testPath: string | undefined, payload: unknown[]) => Promise<T>;
45
- resolveMock: (id: string, importer: string, hasFactory: boolean) => Promise<{
46
- type: 'factory' | 'redirect' | 'automock';
47
- mockPath?: string | null;
48
- resolvedId: string;
49
- needsInterop?: boolean;
50
- }>;
42
+ resolveMock: (id: string, importer: string, options: {
43
+ mock: 'spy' | 'factory' | 'auto';
44
+ }) => Promise<ServerMockResolution>;
51
45
  invalidate: (ids: string[]) => void;
52
46
  getBrowserFileSourceMap: (id: string) => SourceMap | null | {
53
47
  mappings: '';