From aa1e77d532b951ea5d3a5e26214a8b0c9c02fb6f Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 12 May 2023 11:08:29 +0100 Subject: [PATCH] fix(compiler-sfc): properly parse d.ts files when resolving types close #8285 --- .../__tests__/compileScript/resolveType.spec.ts | 5 ++++- packages/compiler-sfc/src/script/context.ts | 5 +++-- packages/compiler-sfc/src/script/resolveType.ts | 6 +++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index 4b36880bf1b..240497310ee 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -458,7 +458,10 @@ describe('resolveType', () => { test('relative ts', () => { const files = { '/foo.ts': 'export type P = { foo: number }', - '/bar.d.ts': 'type X = { bar: string }; export { X as Y }' + '/bar.d.ts': + 'type X = { bar: string }; export { X as Y };' + + // verify that we can parse syntax that is only valid in d.ts + 'export const baz: boolean' } const { props, deps } = resolve( ` diff --git a/packages/compiler-sfc/src/script/context.ts b/packages/compiler-sfc/src/script/context.ts index d2c5dabd194..9a3d2eccd3c 100644 --- a/packages/compiler-sfc/src/script/context.ts +++ b/packages/compiler-sfc/src/script/context.ts @@ -145,7 +145,8 @@ export class ScriptCompileContext { export function resolveParserPlugins( lang: string, - userPlugins?: ParserPlugin[] + userPlugins?: ParserPlugin[], + dts = false ) { const plugins: ParserPlugin[] = [] if (lang === 'jsx' || lang === 'tsx') { @@ -156,7 +157,7 @@ export function resolveParserPlugins( userPlugins = userPlugins.filter(p => p !== 'jsx') } if (lang === 'ts' || lang === 'tsx') { - plugins.push('typescript') + plugins.push(['typescript', { dts }]) if (!plugins.includes('decorators')) { plugins.push('decorators-legacy') } diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index 550b6c23767..6b43be582d5 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -933,7 +933,11 @@ function parseFile( const ext = extname(filename) if (ext === '.ts' || ext === '.tsx') { return babelParse(content, { - plugins: resolveParserPlugins(ext.slice(1), parserPlugins), + plugins: resolveParserPlugins( + ext.slice(1), + parserPlugins, + filename.endsWith('.d.ts') + ), sourceType: 'module' }).program.body } else if (ext === '.vue') {