})
})
+ it('should wrap keys guard for static key event w/ left/right modifiers', () => {
+ const {
+ props: [prop]
+ } = parseWithVOn(`<div @keyup.left="test"/>`, {
+ prefixIdentifiers: true
+ })
+ expect(prop).toMatchObject({
+ type: NodeTypes.JS_PROPERTY,
+ value: {
+ callee: V_ON_WITH_KEYS,
+ arguments: [{ content: '_ctx.test' }, '["left"]']
+ }
+ })
+ })
+
+ it('should wrap both for dynamic key event w/ left/right modifiers', () => {
+ const {
+ props: [prop]
+ } = parseWithVOn(`<div @[e].left="test"/>`, {
+ prefixIdentifiers: true
+ })
+ expect(prop).toMatchObject({
+ type: NodeTypes.JS_PROPERTY,
+ value: {
+ callee: V_ON_WITH_KEYS,
+ arguments: [
+ {
+ callee: V_ON_WITH_MODIFIERS,
+ arguments: [{ content: `_ctx.test` }, `["left"]`]
+ },
+ '["left"]'
+ ]
+ }
+ })
+ })
+
it('should not wrap normal guard if there is only keys guard', () => {
const {
props: [prop]
createSimpleExpression,
NodeTypes,
createCompoundExpression,
- ExpressionNode
+ ExpressionNode,
+ SimpleExpressionNode
} from '@vue/compiler-core'
import { V_ON_WITH_MODIFIERS, V_ON_WITH_KEYS } from '../runtimeHelpers'
import { makeMap } from '@vue/shared'
// system modifiers + exact
`ctrl,shift,alt,meta,exact,` +
// mouse
- `left,middle,right`
+ `middle`
)
+// left & right could be mouse or key modifiers based on event type
+const maybeKeyModifier = /*#__PURE__*/ makeMap('left,right')
const isKeyboardEvent = /*#__PURE__*/ makeMap(
`onkeyup,onkeydown,onkeypress`,
true
)
-const generateModifiers = (modifiers: string[]) => {
+const resolveModifiers = (key: ExpressionNode, modifiers: string[]) => {
+ const isStaticKey = key.type === NodeTypes.SIMPLE_EXPRESSION && key.isStatic
const keyModifiers = []
const nonKeyModifiers = []
const eventOptionModifiers = []
eventOptionModifiers.push(modifier)
} else {
// runtimeModifiers: modifiers that needs runtime guards
- if (isNonKeyModifier(modifier)) {
- nonKeyModifiers.push(modifier)
+ if (maybeKeyModifier(modifier)) {
+ if (isStaticKey) {
+ if (isKeyboardEvent((key as SimpleExpressionNode).content)) {
+ keyModifiers.push(modifier)
+ } else {
+ nonKeyModifiers.push(modifier)
+ }
+ } else {
+ keyModifiers.push(modifier)
+ nonKeyModifiers.push(modifier)
+ }
} else {
- keyModifiers.push(modifier)
+ if (isNonKeyModifier(modifier)) {
+ nonKeyModifiers.push(modifier)
+ } else {
+ keyModifiers.push(modifier)
+ }
}
}
}
keyModifiers,
nonKeyModifiers,
eventOptionModifiers
- } = generateModifiers(modifiers)
+ } = resolveModifiers(key, modifiers)
// normalize click.right and click.middle since they don't actually fire
if (nonKeyModifiers.includes('right')) {