@@ -36,31 +36,51 @@ async function injectDOMTestingLibrary(container: Element) {
36
36
}
37
37
}
38
38
39
- function serializeArgs ( args : any [ ] ) {
40
- return args . map ( ( arg ) => {
41
- if ( arg instanceof RegExp ) {
42
- return { RegExp : arg . toString ( ) }
43
- }
44
- if ( typeof arg === 'undefined' ) {
45
- return { Undefined : true }
46
- }
47
- return arg
48
- } )
39
+ function serializeObject ( object : Object ) : Object {
40
+ return Object . entries ( object )
41
+ . map ( ( [ key , value ] ) => [ key , serializeArg ( value ) ] )
42
+ . reduce ( ( acc , [ key , value ] ) => ( { ...acc , [ key ] : value } ) , { } )
43
+ }
44
+
45
+ function serializeArg ( arg : any ) {
46
+ if ( arg instanceof RegExp ) {
47
+ return { RegExp : arg . toString ( ) }
48
+ }
49
+ if ( typeof arg === 'undefined' ) {
50
+ return { Undefined : true }
51
+ }
52
+ if ( arg && typeof arg === 'object' ) {
53
+ return serializeObject ( arg )
54
+ }
55
+ return arg
49
56
}
50
57
51
58
function executeQuery (
52
59
[ query , container , ...args ] : [ QueryName , HTMLElement , ...any [ ] ] ,
53
60
done : ( result : any ) => void ,
54
61
) {
55
- const [ matcher , options , waitForOptions ] = args . map ( ( arg ) => {
62
+ // @ts -ignore
63
+ function deserializeObject ( object ) {
64
+ return Object . entries ( object )
65
+ . map ( ( [ key , value ] ) => [ key , deserializeArg ( value ) ] )
66
+ . reduce ( ( acc , [ key , value ] ) => ( { ...acc , [ key ] : value } ) , { } )
67
+ }
68
+
69
+ // @ts -ignore
70
+ function deserializeArg ( arg ) {
56
71
if ( arg && arg . RegExp ) {
57
72
return eval ( arg . RegExp )
58
73
}
59
74
if ( arg && arg . Undefined ) {
60
75
return undefined
61
76
}
77
+ if ( arg && typeof arg === 'object' ) {
78
+ return deserializeObject ( arg )
79
+ }
62
80
return arg
63
- } )
81
+ }
82
+
83
+ const [ matcher , options , waitForOptions ] = args . map ( deserializeArg )
64
84
65
85
Promise . resolve (
66
86
window . TestingLibraryDom [ query ] (
@@ -96,7 +116,7 @@ function createQuery(element: Element, queryName: string) {
96
116
const result = await element . executeAsync < any [ ] , any [ ] > ( executeQuery , [
97
117
queryName ,
98
118
element ,
99
- ...serializeArgs ( args ) ,
119
+ ...args . map ( serializeArg ) ,
100
120
] )
101
121
102
122
if ( typeof result === 'string' ) {
@@ -126,18 +146,18 @@ function within(element: Element) {
126
146
}
127
147
128
148
function setupBrowser ( browser : BrowserObject | MultiRemoteBrowserObject ) {
129
- const queries : { [ key : string ] : any } = { } ;
149
+ const queries : { [ key : string ] : any } = { }
130
150
131
151
Object . keys ( baseQueries ) . forEach ( ( key ) => {
132
- const queryName = key as keyof typeof baseQueries ;
152
+ const queryName = key as keyof typeof baseQueries
133
153
134
154
const query = async ( ...args : any [ ] ) => {
135
- const body = await browser . $ ( 'body' ) ;
136
- return within ( body ) [ queryName ] ( ...args ) ;
155
+ const body = await browser . $ ( 'body' )
156
+ return within ( body ) [ queryName ] ( ...args )
137
157
}
138
158
139
159
// add query to response queries
140
- queries [ queryName ] = query ;
160
+ queries [ queryName ] = query
141
161
142
162
// add query to BrowserObject
143
163
browser . addCommand ( queryName , query )
0 commit comments