})
})
+ test('should transform click.right', () => {
+ const {
+ props: [prop]
+ } = parseWithVOn(`<div @click.right="test"/>`)
+ expect(prop.key).toMatchObject({
+ type: NodeTypes.SIMPLE_EXPRESSION,
+ content: `onContextmenu`
+ })
+
+ // dynamic
+ const {
+ props: [prop2]
+ } = parseWithVOn(`<div @[event].right="test"/>`)
+ // ("on" + (event)).toLowerCase() === "onclick" ? "onContextmenu" : ("on" + (event))
+ expect(prop2.key).toMatchObject({
+ type: NodeTypes.COMPOUND_EXPRESSION,
+ children: [
+ `(`,
+ { children: [`"on" + (`, { content: 'event' }, `)`] },
+ `).toLowerCase() === "onclick" ? "onContextmenu" : (`,
+ { children: [`"on" + (`, { content: 'event' }, `)`] },
+ `)`
+ ]
+ })
+ })
+
+ test('should transform click.middle', () => {
+ const {
+ props: [prop]
+ } = parseWithVOn(`<div @click.middle="test"/>`)
+ expect(prop.key).toMatchObject({
+ type: NodeTypes.SIMPLE_EXPRESSION,
+ content: `onMouseup`
+ })
+
+ // dynamic
+ const {
+ props: [prop2]
+ } = parseWithVOn(`<div @[event].middle="test"/>`)
+ // ("on" + (event)).toLowerCase() === "onclick" ? "onMouseup" : ("on" + (event))
+ expect(prop2.key).toMatchObject({
+ type: NodeTypes.COMPOUND_EXPRESSION,
+ children: [
+ `(`,
+ { children: [`"on" + (`, { content: 'event' }, `)`] },
+ `).toLowerCase() === "onclick" ? "onMouseup" : (`,
+ { children: [`"on" + (`, { content: 'event' }, `)`] },
+ `)`
+ ]
+ })
+ })
+
test('cache handler w/ modifiers', () => {
const {
root,
createCallExpression,
createObjectExpression,
createSimpleExpression,
- NodeTypes
+ NodeTypes,
+ createCompoundExpression,
+ ExpressionNode
} from '@vue/compiler-core'
import { V_ON_WITH_MODIFIERS, V_ON_WITH_KEYS } from '../runtimeHelpers'
import { makeMap } from '@vue/shared'
}
}
+const transformClick = (key: ExpressionNode, event: string) => {
+ const isStaticClick =
+ key.type === NodeTypes.SIMPLE_EXPRESSION &&
+ key.isStatic &&
+ key.content.toLowerCase() === 'onclick'
+ return isStaticClick
+ ? createSimpleExpression(event, true)
+ : key.type !== NodeTypes.SIMPLE_EXPRESSION
+ ? createCompoundExpression([
+ `(`,
+ key,
+ `).toLowerCase() === "onclick" ? "${event}" : (`,
+ key,
+ `)`
+ ])
+ : key
+}
+
export const transformOn: DirectiveTransform = (dir, node, context) => {
return baseTransform(dir, node, context, baseResult => {
const { modifiers } = dir
eventOptionModifiers
} = generateModifiers(modifiers)
+ // normalize click.right and click.middle since they don't actually fire
+ if (nonKeyModifiers.includes('right')) {
+ key = transformClick(key, `onContextmenu`)
+ }
+ if (nonKeyModifiers.includes('middle')) {
+ key = transformClick(key, `onMouseup`)
+ }
+
if (nonKeyModifiers.length) {
handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [
handlerExp,