@@ -30,21 +30,20 @@ function triggerCommand<T>(command: string, ...args: any[]) {
30
30
}
31
31
32
32
export function createUserEvent ( __tl_user_event_base__ ?: TestingLibraryUserEvent , options ?: TestingLibraryOptions ) : UserEvent {
33
- let __tl_user_event__ = __tl_user_event_base__ ?. setup ( options ?? { } )
33
+ if ( __tl_user_event_base__ ) {
34
+ return createPreviewUserEvent ( __tl_user_event_base__ , options ?? { } )
35
+ }
36
+
34
37
const keyboard = {
35
38
unreleased : [ ] as string [ ] ,
36
39
}
37
40
38
41
return {
39
- setup ( options ?: any ) {
40
- return createUserEvent ( __tl_user_event_base__ , options )
42
+ setup ( ) {
43
+ return createUserEvent ( )
41
44
} ,
42
45
async cleanup ( ) {
43
46
return ensureAwaited ( async ( ) => {
44
- if ( typeof __tl_user_event_base__ !== 'undefined' ) {
45
- __tl_user_event__ = __tl_user_event_base__ ?. setup ( options ?? { } )
46
- return
47
- }
48
47
await triggerCommand ( '__vitest_cleanup' , keyboard )
49
48
keyboard . unreleased = [ ]
50
49
} )
@@ -87,14 +86,6 @@ export function createUserEvent(__tl_user_event_base__?: TestingLibraryUserEvent
87
86
// testing-library user-event
88
87
async type ( element : Element | Locator , text : string , options : UserEventTypeOptions = { } ) {
89
88
return ensureAwaited ( async ( ) => {
90
- if ( typeof __tl_user_event__ !== 'undefined' ) {
91
- return __tl_user_event__ . type (
92
- element instanceof Element ? element : element . element ( ) ,
93
- text ,
94
- options ,
95
- )
96
- }
97
-
98
89
const selector = convertToSelector ( element )
99
90
const { unreleased } = await triggerCommand < { unreleased : string [ ] } > (
100
91
'__vitest_type' ,
@@ -107,17 +98,11 @@ export function createUserEvent(__tl_user_event_base__?: TestingLibraryUserEvent
107
98
} ,
108
99
tab ( options : UserEventTabOptions = { } ) {
109
100
return ensureAwaited ( ( ) => {
110
- if ( typeof __tl_user_event__ !== 'undefined' ) {
111
- return __tl_user_event__ . tab ( options )
112
- }
113
101
return triggerCommand ( '__vitest_tab' , options )
114
102
} )
115
103
} ,
116
104
async keyboard ( text : string ) {
117
105
return ensureAwaited ( async ( ) => {
118
- if ( typeof __tl_user_event__ !== 'undefined' ) {
119
- return __tl_user_event__ . keyboard ( text )
120
- }
121
106
const { unreleased } = await triggerCommand < { unreleased : string [ ] } > (
122
107
'__vitest_keyboard' ,
123
108
text ,
@@ -129,6 +114,101 @@ export function createUserEvent(__tl_user_event_base__?: TestingLibraryUserEvent
129
114
}
130
115
}
131
116
117
+ function createPreviewUserEvent ( userEventBase : TestingLibraryUserEvent , options : TestingLibraryOptions ) : UserEvent {
118
+ let userEvent = userEventBase . setup ( options )
119
+
120
+ function toElement ( element : Element | Locator ) {
121
+ return element instanceof Element ? element : element . element ( )
122
+ }
123
+
124
+ const vitestUserEvent : UserEvent = {
125
+ setup ( options ?: any ) {
126
+ return createPreviewUserEvent ( userEventBase , options )
127
+ } ,
128
+ async cleanup ( ) {
129
+ userEvent = userEventBase . setup ( options ?? { } )
130
+ } ,
131
+ async click ( element ) {
132
+ await userEvent . click ( toElement ( element ) )
133
+ } ,
134
+ async dblClick ( element ) {
135
+ await userEvent . dblClick ( toElement ( element ) )
136
+ } ,
137
+ async tripleClick ( element ) {
138
+ await userEvent . tripleClick ( toElement ( element ) )
139
+ } ,
140
+ async selectOptions ( element , value ) {
141
+ const options = ( Array . isArray ( value ) ? value : [ value ] ) . map ( ( option ) => {
142
+ if ( typeof option !== 'string' ) {
143
+ return toElement ( option )
144
+ }
145
+ return option
146
+ } )
147
+ await userEvent . selectOptions (
148
+ element ,
149
+ options as string [ ] | HTMLElement [ ] ,
150
+ )
151
+ } ,
152
+ async clear ( element ) {
153
+ await userEvent . clear ( toElement ( element ) )
154
+ } ,
155
+ async hover ( element : Element | Locator ) {
156
+ await userEvent . hover ( toElement ( element ) )
157
+ } ,
158
+ async unhover ( element : Element | Locator ) {
159
+ await userEvent . unhover ( toElement ( element ) )
160
+ } ,
161
+ async upload ( element : Element | Locator , files : string | string [ ] | File | File [ ] ) {
162
+ const uploadPromise = ( Array . isArray ( files ) ? files : [ files ] ) . map ( async ( file ) => {
163
+ if ( typeof file !== 'string' ) {
164
+ return file
165
+ }
166
+
167
+ const { content : base64 , basename, mime } = await triggerCommand < {
168
+ content : string
169
+ basename : string
170
+ mime : string
171
+ } > ( '__vitest_fileInfo' , file , 'base64' )
172
+
173
+ const fileInstance = fetch ( `data:${ mime } ;base64,${ base64 } ` )
174
+ . then ( r => r . blob ( ) )
175
+ . then ( blob => new File ( [ blob ] , basename , { type : mime } ) )
176
+ return fileInstance
177
+ } )
178
+ const uploadFiles = await Promise . all ( uploadPromise )
179
+ return userEvent . upload ( toElement ( element ) as HTMLElement , uploadFiles )
180
+ } ,
181
+
182
+ async fill ( element : Element | Locator , text : string ) {
183
+ await userEvent . clear ( toElement ( element ) )
184
+ return userEvent . type ( toElement ( element ) , text )
185
+ } ,
186
+ async dragAndDrop ( ) {
187
+ throw new Error ( `The "preview" provider doesn't support 'userEvent.dragAndDrop'` )
188
+ } ,
189
+
190
+ async type ( element : Element | Locator , text : string , options : UserEventTypeOptions = { } ) {
191
+ await userEvent . type ( toElement ( element ) , text , options )
192
+ } ,
193
+ async tab ( options : UserEventTabOptions = { } ) {
194
+ await userEvent . tab ( options )
195
+ } ,
196
+ async keyboard ( text : string ) {
197
+ await userEvent . keyboard ( text )
198
+ } ,
199
+ }
200
+
201
+ for ( const [ name , fn ] of Object . entries ( vitestUserEvent ) ) {
202
+ if ( name !== 'setup' ) {
203
+ ( vitestUserEvent as any ) [ name ] = function ( this : any , ...args : any [ ] ) {
204
+ return ensureAwaited ( ( ) => fn . apply ( this , args ) )
205
+ }
206
+ }
207
+ }
208
+
209
+ return vitestUserEvent
210
+ }
211
+
132
212
export function cdp ( ) {
133
213
return getBrowserState ( ) . cdp !
134
214
}
0 commit comments