@@ -3,6 +3,11 @@ import { isElementVisible } from './utils/isElementVisible'
3
3
import BaseWrapper from './baseWrapper'
4
4
import { createWrapperError } from './errorWrapper'
5
5
import WrapperLike from './interfaces/wrapperLike'
6
+ import { ComponentInternalInstance , ComponentPublicInstance } from 'vue'
7
+ import { FindAllComponentsSelector , FindComponentSelector } from './types'
8
+ import { VueWrapper } from 'src'
9
+ import { matches , find } from './utils/find'
10
+ import { createWrapper } from './vueWrapper'
6
11
7
12
export class DOMWrapper < ElementType extends Element >
8
13
extends BaseWrapper < ElementType >
@@ -38,22 +43,6 @@ export class DOMWrapper<ElementType extends Element>
38
43
return createWrapperError ( 'DOMWrapper' )
39
44
}
40
45
41
- get < K extends keyof HTMLElementTagNameMap > (
42
- selector : K
43
- ) : Omit < DOMWrapper < HTMLElementTagNameMap [ K ] > , 'exists' >
44
- get < K extends keyof SVGElementTagNameMap > (
45
- selector : K
46
- ) : Omit < DOMWrapper < SVGElementTagNameMap [ K ] > , 'exists' >
47
- get < T extends Element > ( selector : string ) : Omit < DOMWrapper < T > , 'exists' >
48
- get ( selector : string ) : Omit < DOMWrapper < Element > , 'exists' > {
49
- const result = this . find ( selector )
50
- if ( result instanceof DOMWrapper ) {
51
- return result
52
- }
53
-
54
- throw new Error ( `Unable to get ${ selector } within: ${ this . html ( ) } ` )
55
- }
56
-
57
46
findAll < K extends keyof HTMLElementTagNameMap > (
58
47
selector : K
59
48
) : DOMWrapper < HTMLElementTagNameMap [ K ] > [ ]
@@ -67,6 +56,47 @@ export class DOMWrapper<ElementType extends Element>
67
56
)
68
57
}
69
58
59
+ findComponent < T extends ComponentPublicInstance > (
60
+ selector : FindComponentSelector | ( new ( ) => T )
61
+ ) : VueWrapper < T > {
62
+ const parentComponent : ComponentInternalInstance = ( this . element as any )
63
+ . __vueParentComponent
64
+ if ( typeof selector === 'object' && 'ref' in selector ) {
65
+ const result = parentComponent . refs [ selector . ref ]
66
+ if ( result && ! ( result instanceof HTMLElement ) ) {
67
+ return createWrapper ( null , result as T )
68
+ } else {
69
+ return createWrapperError ( 'VueWrapper' )
70
+ }
71
+ }
72
+
73
+ if (
74
+ matches ( parentComponent . vnode , selector ) &&
75
+ this . element . contains ( parentComponent . vnode . el as Node )
76
+ ) {
77
+ return createWrapper ( null , parentComponent . proxy ! )
78
+ }
79
+
80
+ const result = find ( parentComponent . subTree , selector ) . filter ( ( v ) =>
81
+ this . element . contains ( v . $el )
82
+ )
83
+
84
+ if ( result . length ) {
85
+ return createWrapper ( null , result [ 0 ] )
86
+ }
87
+
88
+ return createWrapperError ( 'VueWrapper' )
89
+ }
90
+
91
+ findAllComponents ( selector : FindAllComponentsSelector ) : VueWrapper < any > [ ] {
92
+ const parentComponent : ComponentInternalInstance = ( this . element as any )
93
+ . __vueParentComponent
94
+
95
+ return find ( parentComponent . subTree , selector )
96
+ . filter ( ( v ) => this . element . contains ( v . $el ) )
97
+ . map ( ( c ) => createWrapper ( null , c ) )
98
+ }
99
+
70
100
private async setChecked ( checked : boolean = true ) {
71
101
// typecast so we get type safety
72
102
const element = this . element as unknown as HTMLInputElement
0 commit comments