Skip to content

Commit 07481e0

Browse files
authored
feat: Add event modifiers (#590)
* feat: wip - added some modifiers * Updated to use types with modifiers * wip: added the correct modifiers * fixed lint issues
1 parent 80df0d2 commit 07481e0

File tree

5 files changed

+61
-38
lines changed

5 files changed

+61
-38
lines changed

src/baseWrapper.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { textContent } from './utils'
22
import type { TriggerOptions } from './createDomEvent'
33
import { nextTick } from 'vue'
44
import { createDOMEvent } from './createDomEvent'
5-
import { DomEventName } from './constants/dom-event-types'
5+
import { DomEventName, DomEventNameWithModifier } from './constants/dom-events'
66

77
export default class BaseWrapper<ElementType extends Element> {
88
private readonly wrapperElement: ElementType
@@ -66,7 +66,7 @@ export default class BaseWrapper<ElementType extends Element> {
6666
}
6767

6868
async trigger(
69-
eventString: DomEventName,
69+
eventString: DomEventNameWithModifier,
7070
options?: TriggerOptions
7171
): Promise<void>
7272
async trigger(eventString: string, options?: TriggerOptions): Promise<void>

src/constants/dom-event-types.ts renamed to src/constants/dom-events.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,50 @@ export interface DomEvent {
6262

6363
export type DomEventName = keyof typeof domEvents
6464

65+
export const ignorableKeyModifiers = [
66+
'stop',
67+
'prevent',
68+
'self',
69+
'exact',
70+
'prevent',
71+
'capture'
72+
]
73+
export const systemKeyModifiers = ['ctrl', 'shift', 'alt', 'meta'] as const
74+
export const mouseKeyModifiers = ['left', 'middle', 'right'] as const
75+
76+
export const keyCodesByKeyName = {
77+
backspace: 8,
78+
tab: 9,
79+
enter: 13,
80+
esc: 27,
81+
space: 32,
82+
pageup: 33,
83+
pagedown: 34,
84+
end: 35,
85+
home: 36,
86+
left: 37,
87+
up: 38,
88+
right: 39,
89+
down: 40,
90+
insert: 45,
91+
delete: 46
92+
} as const
93+
94+
export type KeyName = keyof typeof keyCodesByKeyName
95+
export type Modifier =
96+
| typeof systemKeyModifiers[number]
97+
| typeof mouseKeyModifiers[number]
98+
99+
export type DomEventNameWithModifier =
100+
| DomEventName
101+
| `${DomEventName}.${typeof systemKeyModifiers[number]}`
102+
| `click.${typeof mouseKeyModifiers[number]}`
103+
| `click.${typeof systemKeyModifiers[number]}.${typeof mouseKeyModifiers[number]}`
104+
| `${'keydown' | 'keyup'}.${keyof typeof keyCodesByKeyName}`
105+
| `${
106+
| 'keydown'
107+
| 'keyup'}.${typeof systemKeyModifiers[number]}.${keyof typeof keyCodesByKeyName}`
108+
65109
const domEvents = {
66110
abort: {
67111
eventInterface: 'Event',

src/createDomEvent.ts

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,14 @@
11
import domEvents, {
22
DomEvent,
33
DomEventName,
4-
EventInterface
5-
} from './constants/dom-event-types'
6-
7-
const keyCodesByKeyName = {
8-
backspace: 8,
9-
tab: 9,
10-
enter: 13,
11-
esc: 27,
12-
space: 32,
13-
pageup: 33,
14-
pagedown: 34,
15-
end: 35,
16-
home: 36,
17-
left: 37,
18-
up: 38,
19-
right: 39,
20-
down: 40,
21-
insert: 45,
22-
delete: 46
23-
} as const
24-
25-
// modifiers to keep an eye on
26-
const ignorableKeyModifiers = ['stop', 'prevent', 'self', 'exact']
27-
const systemKeyModifiers = ['ctrl', 'shift', 'alt', 'meta'] as const
28-
const mouseKeyModifiers = ['left', 'middle', 'right'] as const
29-
30-
type KeyName = keyof typeof keyCodesByKeyName
31-
type Modifier =
32-
| typeof systemKeyModifiers[number]
33-
| typeof mouseKeyModifiers[number]
4+
DomEventNameWithModifier,
5+
KeyName,
6+
Modifier,
7+
ignorableKeyModifiers,
8+
systemKeyModifiers,
9+
mouseKeyModifiers,
10+
keyCodesByKeyName
11+
} from './constants/dom-events'
3412

3513
interface TriggerOptions {
3614
code?: String
@@ -40,7 +18,7 @@ interface TriggerOptions {
4018
}
4119

4220
interface EventParams {
43-
eventType: DomEventName | string
21+
eventType: DomEventName
4422
modifiers: KeyName[]
4523
options?: TriggerOptions
4624
}
@@ -104,7 +82,7 @@ function getEventProperties(eventParams: EventParams) {
10482
}
10583
}
10684

107-
const meta: DomEvent = domEvents[eventType as DomEventName] || {
85+
const meta: DomEvent = domEvents[eventType] || {
10886
eventInterface: 'Event',
10987
cancelable: true,
11088
bubbles: true
@@ -163,14 +141,14 @@ function createEvent(eventParams: EventParams) {
163141
}
164142

165143
function createDOMEvent(
166-
eventString: DomEventName | string,
144+
eventString: DomEventNameWithModifier | string,
167145
options?: TriggerOptions
168146
) {
169-
// split eventString like `keydown.ctrl.shift.c` into `keydown` and array of modifiers
147+
// split eventString like `keydown.ctrl.shift` into `keydown` and array of modifiers
170148
const [eventType, ...modifiers] = eventString.split('.')
171149

172150
const eventParams: EventParams = {
173-
eventType,
151+
eventType: eventType as DomEventName,
174152
modifiers: modifiers as KeyName[],
175153
options
176154
}

src/vueWrapper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ShapeFlags } from '@vue/shared'
44
import pretty from 'pretty'
55

66
import { config } from './config'
7-
import domEvents from './constants/dom-event-types'
7+
import domEvents from './constants/dom-events'
88
import { DOMWrapper } from './domWrapper'
99
import {
1010
FindAllComponentsSelector,

tests/trigger.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ describe('trigger', () => {
171171
expect(keydownHandler).toHaveBeenCalledTimes(2)
172172
expect(keydownHandler.mock.calls[1][0].key).toBe('Enter')
173173

174+
// is correctly parsed when using modifier
174175
await wrapper.trigger('keydown.enter')
175176
expect(keydownHandler).toHaveBeenCalledTimes(3)
176177
expect(keydownHandler.mock.calls[2][0].key).toBe('enter')

0 commit comments

Comments
 (0)