1
1
import { textContent } from './utils'
2
2
import type { TriggerOptions } from './createDomEvent'
3
- import { nextTick } from 'vue'
3
+ import {
4
+ ComponentInternalInstance ,
5
+ ComponentPublicInstance ,
6
+ nextTick
7
+ } from 'vue'
4
8
import { createDOMEvent } from './createDomEvent'
5
- import { DomEventName , DomEventNameWithModifier } from './constants/dom-events'
9
+ import { DomEventNameWithModifier } from './constants/dom-events'
10
+ import type { VueWrapper } from './vueWrapper'
11
+ import type { DOMWrapper } from './domWrapper'
12
+ import { FindAllComponentsSelector , FindComponentSelector } from './types'
6
13
7
- export default class BaseWrapper < ElementType extends Element > {
8
- private readonly wrapperElement : ElementType
14
+ export default abstract class BaseWrapper < ElementType extends Element > {
15
+ private readonly wrapperElement : ElementType & {
16
+ __vueParentComponent ?: ComponentInternalInstance
17
+ }
9
18
10
19
get element ( ) {
11
20
return this . wrapperElement
@@ -15,6 +24,16 @@ export default class BaseWrapper<ElementType extends Element> {
15
24
this . wrapperElement = element
16
25
}
17
26
27
+ abstract find ( selector : string ) : DOMWrapper < Element >
28
+ abstract findAll ( selector : string ) : DOMWrapper < Element > [ ]
29
+ abstract findComponent < T extends ComponentPublicInstance > (
30
+ selector : FindComponentSelector | ( new ( ) => T )
31
+ ) : VueWrapper < T >
32
+ abstract findAllComponents (
33
+ selector : FindAllComponentsSelector
34
+ ) : VueWrapper < any > [ ]
35
+ abstract html ( ) : string
36
+
18
37
classes ( ) : string [ ]
19
38
classes ( className : string ) : boolean
20
39
classes ( className ?: string ) : string [ ] | boolean {
@@ -45,6 +64,45 @@ export default class BaseWrapper<ElementType extends Element> {
45
64
return true
46
65
}
47
66
67
+ get < K extends keyof HTMLElementTagNameMap > (
68
+ selector : K
69
+ ) : Omit < DOMWrapper < HTMLElementTagNameMap [ K ] > , 'exists' >
70
+ get < K extends keyof SVGElementTagNameMap > (
71
+ selector : K
72
+ ) : Omit < DOMWrapper < SVGElementTagNameMap [ K ] > , 'exists' >
73
+ get < T extends Element > ( selector : string ) : Omit < DOMWrapper < T > , 'exists' >
74
+ get ( selector : string ) : Omit < DOMWrapper < Element > , 'exists' > {
75
+ const result = this . find ( selector )
76
+ if ( result . exists ( ) ) {
77
+ return result
78
+ }
79
+
80
+ throw new Error ( `Unable to get ${ selector } within: ${ this . html ( ) } ` )
81
+ }
82
+
83
+ getComponent < T extends ComponentPublicInstance > (
84
+ selector : FindComponentSelector | ( new ( ) => T )
85
+ ) : Omit < VueWrapper < T > , 'exists' > {
86
+ const result = this . findComponent ( selector )
87
+
88
+ if ( result . exists ( ) ) {
89
+ return result as VueWrapper < T >
90
+ }
91
+
92
+ let message = 'Unable to get '
93
+ if ( typeof selector === 'string' ) {
94
+ message += `component with selector ${ selector } `
95
+ } else if ( 'name' in selector ) {
96
+ message += `component with name ${ selector . name } `
97
+ } else if ( 'ref' in selector ) {
98
+ message += `component with ref ${ selector . ref } `
99
+ } else {
100
+ message += 'specified component'
101
+ }
102
+ message += ` within: ${ this . html ( ) } `
103
+ throw new Error ( message )
104
+ }
105
+
48
106
protected isDisabled = ( ) => {
49
107
const validTagsToBeDisabled = [
50
108
'BUTTON' ,
0 commit comments