From 1b69d5f2f49ee60af4b10137c7833a76420dbba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Tue, 28 Mar 2023 15:22:01 +0800 Subject: [PATCH] fix(compiler-sfc): unwrap TS node for defineProps (#7340) --- packages/compiler-core/src/babelUtils.ts | 19 ++++++++++-- .../__snapshots__/compileScript.spec.ts.snap | 16 ++++++++++ .../__tests__/compileScript.spec.ts | 13 ++++++++ packages/compiler-sfc/src/compileScript.ts | 30 +++++++++++-------- 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/packages/compiler-core/src/babelUtils.ts b/packages/compiler-core/src/babelUtils.ts index e773015f90f..5ddbc1ea412 100644 --- a/packages/compiler-core/src/babelUtils.ts +++ b/packages/compiler-core/src/babelUtils.ts @@ -38,9 +38,7 @@ export function walkIdentifiers( if ( parent && parent.type.startsWith('TS') && - parent.type !== 'TSAsExpression' && - parent.type !== 'TSNonNullExpression' && - parent.type !== 'TSTypeAssertion' + !TS_NODE_TYPES.includes(parent.type) ) { return this.skip() } @@ -422,3 +420,18 @@ function isReferenced(node: Node, parent: Node, grandparent?: Node): boolean { return true } + +export const TS_NODE_TYPES = [ + 'TSAsExpression', // foo as number + 'TSTypeAssertion', // (foo) + 'TSNonNullExpression', // foo! + 'TSInstantiationExpression', // foo + 'TSSatisfiesExpression' // foo satisfies T +] +export function unwrapTSNode(node: Node): Node { + if (TS_NODE_TYPES.includes(node.type)) { + return unwrapTSNode((node as any).expression) + } else { + return node + } +} diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index 879790e16fa..05e5e4fd1fd 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -1486,6 +1486,22 @@ return { emit } })" `; +exports[`SFC compile + `) + expect(content).toMatch(`props: ['foo']`) + assertCode(content) + expect(bindings).toStrictEqual({ + foo: BindingTypes.PROPS + }) + }) + test('withDefaults (static)', () => { const { content, bindings } = compile(`