@@ -8,43 +8,36 @@ import {
8
8
WrapperAPI
9
9
} from './types'
10
10
import { ErrorWrapper } from './error-wrapper'
11
- import { MOUNT_ELEMENT_ID } from './constants'
12
11
import { find } from './utils/find'
13
12
14
13
export class VueWrapper < T extends ComponentPublicInstance >
15
14
implements WrapperAPI {
16
15
private componentVM : T
17
- private __emitted : Record < string , unknown [ ] > = { }
18
- private __vm : ComponentPublicInstance
16
+ private rootVM : ComponentPublicInstance
19
17
private __setProps : ( props : Record < string , any > ) => void
20
18
21
19
constructor (
22
20
vm : ComponentPublicInstance ,
23
- events : Record < string , unknown [ ] > ,
24
- setProps : ( props : Record < string , any > ) => void
21
+ setProps ?: ( props : Record < string , any > ) => void
25
22
) {
26
- this . __vm = vm
23
+ // TODO Remove cast after Vue releases the fix
24
+ this . rootVM = ( vm . $root as any ) as ComponentPublicInstance
25
+ this . componentVM = vm as T
27
26
this . __setProps = setProps
28
- this . componentVM = this . __vm . $refs [ 'VTU_COMPONENT' ] as T
29
- this . __emitted = events
30
- }
31
-
32
- private get appRootNode ( ) {
33
- return document . getElementById ( MOUNT_ELEMENT_ID ) as HTMLDivElement
34
27
}
35
28
36
29
private get hasMultipleRoots ( ) : boolean {
37
30
// if the subtree is an array of children, we have multiple root nodes
38
- return this . componentVM . $ . subTree . shapeFlag === ShapeFlags . ARRAY_CHILDREN
31
+ return this . vm . $ . subTree . shapeFlag === ShapeFlags . ARRAY_CHILDREN
39
32
}
40
33
41
34
private get parentElement ( ) : Element {
42
- return this . componentVM . $el . parentElement
35
+ return this . vm . $el . parentElement
43
36
}
44
37
45
38
get element ( ) : Element {
46
39
// if the component has multiple root elements, we use the parent's element
47
- return this . hasMultipleRoots ? this . parentElement : this . componentVM . $el
40
+ return this . hasMultipleRoots ? this . parentElement : this . vm . $el
48
41
}
49
42
50
43
get vm ( ) : T {
@@ -63,8 +56,10 @@ export class VueWrapper<T extends ComponentPublicInstance>
63
56
return true
64
57
}
65
58
66
- emitted ( ) {
67
- return this . __emitted
59
+ emitted ( ) : Record < string , unknown [ ] > {
60
+ // TODO Should we define this?
61
+ // @ts -ignore
62
+ return this . vm . __emitted
68
63
}
69
64
70
65
html ( ) {
@@ -94,26 +89,32 @@ export class VueWrapper<T extends ComponentPublicInstance>
94
89
return result
95
90
}
96
91
97
- findComponent ( selector : FindComponentSelector ) : ComponentPublicInstance {
92
+ findComponent ( selector : FindComponentSelector ) : VueWrapper | ErrorWrapper {
98
93
if ( typeof selector === 'object' && 'ref' in selector ) {
99
- return this . componentVM . $refs [ selector . ref ] as ComponentPublicInstance
94
+ return createWrapper (
95
+ this . vm . $refs [ selector . ref ] as ComponentPublicInstance
96
+ )
100
97
}
101
- const result = find ( this . componentVM . $ . subTree , selector )
102
- return result . length ? result [ 0 ] : undefined
98
+ const result = find ( this . vm . $ . subTree , selector )
99
+ if ( ! result . length ) return new ErrorWrapper ( { selector } )
100
+ return createWrapper ( result [ 0 ] )
103
101
}
104
102
105
- findAllComponents (
106
- selector : FindAllComponentsSelector
107
- ) : ComponentPublicInstance [ ] {
108
- return find ( this . componentVM . $ . subTree , selector )
103
+ findAllComponents ( selector : FindAllComponentsSelector ) : VueWrapper [ ] {
104
+ return find ( this . vm . $ . subTree , selector ) . map ( ( c ) => createWrapper ( c ) )
109
105
}
110
106
111
107
findAll < T extends Element > ( selector : string ) : DOMWrapper < T > [ ] {
112
108
const results = this . parentElement . querySelectorAll < T > ( selector )
113
109
return Array . from ( results ) . map ( ( x ) => new DOMWrapper ( x ) )
114
110
}
115
111
116
- setProps ( props : Record < string , any > ) {
112
+ setProps ( props : Record < string , any > ) : Promise < void > {
113
+ // if this VM's parent is not the root, error out
114
+ // TODO: Remove ignore after Vue releases fix
115
+ // @ts -ignore
116
+ if ( this . vm . $parent !== this . rootVM )
117
+ throw Error ( 'You can only use setProps on your mounted component' )
117
118
this . __setProps ( props )
118
119
return nextTick ( )
119
120
}
@@ -126,8 +127,7 @@ export class VueWrapper<T extends ComponentPublicInstance>
126
127
127
128
export function createWrapper < T extends ComponentPublicInstance > (
128
129
vm : ComponentPublicInstance ,
129
- events : Record < string , unknown [ ] > ,
130
- setProps : ( props : Record < string , any > ) => void
130
+ setProps ?: ( props : Record < string , any > ) => void
131
131
) : VueWrapper < T > {
132
- return new VueWrapper < T > ( vm , events , setProps )
132
+ return new VueWrapper < T > ( vm , setProps )
133
133
}
0 commit comments