7
7
createSimpleExpression ,
8
8
NodeTypes ,
9
9
createCompoundExpression ,
10
- ExpressionNode
10
+ ExpressionNode ,
11
+ SimpleExpressionNode
11
12
} from '@vue/compiler-core'
12
13
import { V_ON_WITH_MODIFIERS , V_ON_WITH_KEYS } from '../runtimeHelpers'
13
14
import { makeMap } from '@vue/shared'
@@ -19,14 +20,17 @@ const isNonKeyModifier = /*#__PURE__*/ makeMap(
19
20
// system modifiers + exact
20
21
`ctrl,shift,alt,meta,exact,` +
21
22
// mouse
22
- `left, middle,right `
23
+ `middle`
23
24
)
25
+ // left & right could be mouse or key modifiers based on event type
26
+ const maybeKeyModifier = /*#__PURE__*/ makeMap ( 'left,right' )
24
27
const isKeyboardEvent = /*#__PURE__*/ makeMap (
25
28
`onkeyup,onkeydown,onkeypress` ,
26
29
true
27
30
)
28
31
29
- const generateModifiers = ( modifiers : string [ ] ) => {
32
+ const resolveModifiers = ( key : ExpressionNode , modifiers : string [ ] ) => {
33
+ const isStaticKey = key . type === NodeTypes . SIMPLE_EXPRESSION && key . isStatic
30
34
const keyModifiers = [ ]
31
35
const nonKeyModifiers = [ ]
32
36
const eventOptionModifiers = [ ]
@@ -39,10 +43,23 @@ const generateModifiers = (modifiers: string[]) => {
39
43
eventOptionModifiers . push ( modifier )
40
44
} else {
41
45
// runtimeModifiers: modifiers that needs runtime guards
42
- if ( isNonKeyModifier ( modifier ) ) {
43
- nonKeyModifiers . push ( modifier )
46
+ if ( maybeKeyModifier ( modifier ) ) {
47
+ if ( isStaticKey ) {
48
+ if ( isKeyboardEvent ( ( key as SimpleExpressionNode ) . content ) ) {
49
+ keyModifiers . push ( modifier )
50
+ } else {
51
+ nonKeyModifiers . push ( modifier )
52
+ }
53
+ } else {
54
+ keyModifiers . push ( modifier )
55
+ nonKeyModifiers . push ( modifier )
56
+ }
44
57
} else {
45
- keyModifiers . push ( modifier )
58
+ if ( isNonKeyModifier ( modifier ) ) {
59
+ nonKeyModifiers . push ( modifier )
60
+ } else {
61
+ keyModifiers . push ( modifier )
62
+ }
46
63
}
47
64
}
48
65
}
@@ -82,7 +99,7 @@ export const transformOn: DirectiveTransform = (dir, node, context) => {
82
99
keyModifiers,
83
100
nonKeyModifiers,
84
101
eventOptionModifiers
85
- } = generateModifiers ( modifiers )
102
+ } = resolveModifiers ( key , modifiers )
86
103
87
104
// normalize click.right and click.middle since they don't actually fire
88
105
if ( nonKeyModifiers . includes ( 'right' ) ) {
0 commit comments