From 051407d2e11c611c6008c00f455a755f8bc2bc60 Mon Sep 17 00:00:00 2001 From: huangcheng Date: Sat, 23 Apr 2022 18:50:23 +0800 Subject: [PATCH 1/4] fix(compiler-core): add support for arrow aysnc function with no bracket --- packages/compiler-core/src/transforms/vOn.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-core/src/transforms/vOn.ts b/packages/compiler-core/src/transforms/vOn.ts index 060a7ef9097..3c0feedddbe 100644 --- a/packages/compiler-core/src/transforms/vOn.ts +++ b/packages/compiler-core/src/transforms/vOn.ts @@ -17,7 +17,7 @@ import { hasScopeRef, isMemberExpression } from '../utils' import { TO_HANDLER_KEY } from '../runtimeHelpers' const fnExpRE = - /^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/ + /^\s*([\w$_]+|(async\s*)?(\([^)]*?\)|[^=]+))\s*=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/ export interface VOnDirectiveNode extends DirectiveNode { // v-on without arg is handled directly in ./transformElements.ts due to it affecting From 5ea150a050d48841f87e21a9c3acfe0efb619e76 Mon Sep 17 00:00:00 2001 From: huangcheng Date: Sat, 23 Apr 2022 21:12:46 +0800 Subject: [PATCH 2/4] test: add test for async function with no bracket --- .../__tests__/transforms/vOn.spec.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/packages/compiler-core/__tests__/transforms/vOn.spec.ts b/packages/compiler-core/__tests__/transforms/vOn.spec.ts index 8f943a7491f..d7c00d5e3aa 100644 --- a/packages/compiler-core/__tests__/transforms/vOn.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vOn.spec.ts @@ -271,6 +271,21 @@ describe('compiler: transform v-on', () => { }) }) + test('should NOT wrap as function if expression is already function expression (async)', () => { + const { node } = parseWithVOn(`
`) + expect((node.codegenNode as VNodeCall).props).toMatchObject({ + properties: [ + { + key: { content: `onClick` }, + value: { + type: NodeTypes.SIMPLE_EXPRESSION, + content: `async $event => await foo($event)` + } + } + ] + }) + }) + test('should NOT wrap as function if expression is already function expression (with newlines)', () => { const { node } = parseWithVOn( `
await foo(e)" />`, + { + prefixIdentifiers: true, + cacheHandlers: true + } + ) + + expect(root.cached).toBe(1) + const vnodeCall = node.codegenNode as VNodeCall + // should not treat cached handler as dynamicProp, so no flags + expect(vnodeCall.patchFlag).toBeUndefined() + expect( + (vnodeCall.props as ObjectExpression).properties[0].value + ).toMatchObject({ + type: NodeTypes.JS_CACHE_EXPRESSION, + index: 0, + value: { + type: NodeTypes.COMPOUND_EXPRESSION, + children: [ + `async `, + { content: `e` }, + ` => await `, + { content: `_ctx.foo` }, + `(`, + { content: `e` }, + `)` + ] + } + }) + }) + test('inline async function expression handler', () => { const { root, node } = parseWithVOn( `
`, From 234fe86e55ec7fa885a48eed897e76dd9a8f7bae Mon Sep 17 00:00:00 2001 From: huangcheng <1530844743@qq.com> Date: Sun, 1 May 2022 10:14:31 +0800 Subject: [PATCH 3/4] fix(compiler-core): improve reg for v-on function expression --- packages/compiler-core/src/transforms/vOn.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-core/src/transforms/vOn.ts b/packages/compiler-core/src/transforms/vOn.ts index 3c0feedddbe..de85b502a64 100644 --- a/packages/compiler-core/src/transforms/vOn.ts +++ b/packages/compiler-core/src/transforms/vOn.ts @@ -17,7 +17,7 @@ import { hasScopeRef, isMemberExpression } from '../utils' import { TO_HANDLER_KEY } from '../runtimeHelpers' const fnExpRE = - /^\s*([\w$_]+|(async\s*)?(\([^)]*?\)|[^=]+))\s*=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/ + /^\s*(async\s*)?(\([^)]*?\)|[\w$_]+)\s*=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/ export interface VOnDirectiveNode extends DirectiveNode { // v-on without arg is handled directly in ./transformElements.ts due to it affecting From 10d515cf0b75f1b6420b47ad522d240ca16026f7 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 10:53:40 +0000 Subject: [PATCH 4/4] [autofix.ci] apply automated fixes --- .../__tests__/transforms/vOn.spec.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/vOn.spec.ts b/packages/compiler-core/__tests__/transforms/vOn.spec.ts index 7722c3222b0..b1c37e3f74e 100644 --- a/packages/compiler-core/__tests__/transforms/vOn.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vOn.spec.ts @@ -287,17 +287,19 @@ describe('compiler: transform v-on', () => { }) test('should NOT wrap as function if expression is already function expression (async)', () => { - const { node } = parseWithVOn(`
`) + const { node } = parseWithVOn( + `
`, + ) expect((node.codegenNode as VNodeCall).props).toMatchObject({ properties: [ { key: { content: `onClick` }, value: { type: NodeTypes.SIMPLE_EXPRESSION, - content: `async $event => await foo($event)` - } - } - ] + content: `async $event => await foo($event)`, + }, + }, + ], }) }) @@ -650,8 +652,8 @@ describe('compiler: transform v-on', () => { `
`, { prefixIdentifiers: true, - cacheHandlers: true - } + cacheHandlers: true, + }, ) expect(root.cached).toBe(1) @@ -659,7 +661,7 @@ describe('compiler: transform v-on', () => { // should not treat cached handler as dynamicProp, so no flags expect(vnodeCall.patchFlag).toBeUndefined() expect( - (vnodeCall.props as ObjectExpression).properties[0].value + (vnodeCall.props as ObjectExpression).properties[0].value, ).toMatchObject({ type: NodeTypes.JS_CACHE_EXPRESSION, index: 0, @@ -672,9 +674,9 @@ describe('compiler: transform v-on', () => { { content: `_ctx.foo` }, `(`, { content: `e` }, - `)` - ] - } + `)`, + ], + }, }) })