diff --git a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap index 69527c0b100..a3726401180 100644 --- a/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap +++ b/packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap @@ -224,6 +224,36 @@ export function render(_ctx) { }" `; +exports[`compiler: element transform > component event with keys modifier 1`] = ` +"import { resolveComponent as _resolveComponent, withKeys as _withKeys, createComponentWithFallback as _createComponentWithFallback } from 'vue'; + +export function render(_ctx) { + const _component_Foo = _resolveComponent("Foo") + const n0 = _createComponentWithFallback(_component_Foo, { onKeyup: () => _withKeys(_ctx.bar, ["enter"]) }, null, true) + return n0 +}" +`; + +exports[`compiler: element transform > component event with multiple modifiers and event options 1`] = ` +"import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, withKeys as _withKeys, createComponentWithFallback as _createComponentWithFallback } from 'vue'; + +export function render(_ctx) { + const _component_Foo = _resolveComponent("Foo") + const n0 = _createComponentWithFallback(_component_Foo, { onFooCaptureOnce: () => _withKeys(_withModifiers(_ctx.bar, ["stop","prevent"]), ["enter"]) }, null, true) + return n0 +}" +`; + +exports[`compiler: element transform > component event with nonKeys modifier 1`] = ` +"import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, createComponentWithFallback as _createComponentWithFallback } from 'vue'; + +export function render(_ctx) { + const _component_Foo = _resolveComponent("Foo") + const n0 = _createComponentWithFallback(_component_Foo, { onFoo: () => _withModifiers(_ctx.bar, ["stop","prevent"]) }, null, true) + return n0 +}" +`; + exports[`compiler: element transform > component event with once modifier 1`] = ` "import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue'; diff --git a/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts b/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts index adaad182cf3..ca64729e050 100644 --- a/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts +++ b/packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts @@ -878,6 +878,78 @@ describe('compiler: element transform', () => { }) }) + test('component event with keys modifier', () => { + const { code, ir } = compileWithElementTransform( + `<Foo @keyup.enter="bar" />`, + ) + expect(code).toMatchSnapshot() + expect(ir.block.dynamic.children[0].operation).toMatchObject({ + type: IRNodeTypes.CREATE_COMPONENT_NODE, + tag: 'Foo', + props: [ + [ + { + key: { content: 'keyup' }, + handler: true, + handlerModifiers: { + keys: ['enter'], + nonKeys: [], + options: [], + }, + }, + ], + ], + }) + }) + + test('component event with nonKeys modifier', () => { + const { code, ir } = compileWithElementTransform( + `<Foo @foo.stop.prevent="bar" />`, + ) + expect(code).toMatchSnapshot() + expect(ir.block.dynamic.children[0].operation).toMatchObject({ + type: IRNodeTypes.CREATE_COMPONENT_NODE, + tag: 'Foo', + props: [ + [ + { + key: { content: 'foo' }, + handler: true, + handlerModifiers: { + keys: [], + nonKeys: ['stop', 'prevent'], + options: [], + }, + }, + ], + ], + }) + }) + + test('component event with multiple modifiers and event options', () => { + const { code, ir } = compileWithElementTransform( + `<Foo @foo.enter.stop.prevent.capture.once="bar" />`, + ) + expect(code).toMatchSnapshot() + expect(ir.block.dynamic.children[0].operation).toMatchObject({ + type: IRNodeTypes.CREATE_COMPONENT_NODE, + tag: 'Foo', + props: [ + [ + { + key: { content: 'foo' }, + handler: true, + handlerModifiers: { + keys: ['enter'], + nonKeys: ['stop', 'prevent'], + options: ['capture', 'once'], + }, + }, + ], + ], + }) + }) + test('component with dynamic event arguments', () => { const { code, ir } = compileWithElementTransform( `<Foo @[foo-bar]="bar" @[baz]="qux" />`, diff --git a/packages/compiler-vapor/src/generators/component.ts b/packages/compiler-vapor/src/generators/component.ts index 7c232db754b..2f7e6cd503a 100644 --- a/packages/compiler-vapor/src/generators/component.ts +++ b/packages/compiler-vapor/src/generators/component.ts @@ -211,7 +211,7 @@ function genProp(prop: IRProp, context: CodegenContext, isStatic?: boolean) { ? genEventHandler( context, prop.values[0], - undefined, + prop.handlerModifiers, true /* wrap handlers passed to components */, ) : isStatic diff --git a/packages/compiler-vapor/src/generators/prop.ts b/packages/compiler-vapor/src/generators/prop.ts index 62fca087ed7..a873f1fede3 100644 --- a/packages/compiler-vapor/src/generators/prop.ts +++ b/packages/compiler-vapor/src/generators/prop.ts @@ -114,9 +114,10 @@ export function genPropKey( ): CodeFragment[] { const { helper } = context - const handlerModifierPostfix = handlerModifiers - ? handlerModifiers.map(capitalize).join('') - : '' + const handlerModifierPostfix = + handlerModifiers && handlerModifiers.options + ? handlerModifiers.options.map(capitalize).join('') + : '' // static arg was transformed by v-bind transformer if (node.isStatic) { // only quote keys if necessary diff --git a/packages/compiler-vapor/src/transform.ts b/packages/compiler-vapor/src/transform.ts index 76563899d2b..b3963124e54 100644 --- a/packages/compiler-vapor/src/transform.ts +++ b/packages/compiler-vapor/src/transform.ts @@ -23,6 +23,7 @@ import { type IRSlots, type OperationNode, type RootIRNode, + type SetEventIRNode, type VaporDirectiveNode, } from './ir' import { isConstantExpression, isStaticExpression } from './utils' @@ -45,7 +46,7 @@ export interface DirectiveTransformResult { modifier?: '.' | '^' runtimeCamelize?: boolean handler?: boolean - handlerModifiers?: string[] + handlerModifiers?: SetEventIRNode['modifiers'] model?: boolean modelModifiers?: string[] } diff --git a/packages/compiler-vapor/src/transforms/vOn.ts b/packages/compiler-vapor/src/transforms/vOn.ts index fcbfc265d43..fe63ece0a88 100644 --- a/packages/compiler-vapor/src/transforms/vOn.ts +++ b/packages/compiler-vapor/src/transforms/vOn.ts @@ -65,7 +65,11 @@ export const transformVOn: DirectiveTransform = (dir, node, context) => { key: arg, value: handler, handler: true, - handlerModifiers: eventOptionModifiers, + handlerModifiers: { + keys: keyModifiers, + nonKeys: nonKeyModifiers, + options: eventOptionModifiers, + }, } }