fix(compiler-sfc): properly parse d.ts files when resolving types

close #8285
This commit is contained in:
Evan You 2023-05-12 11:08:29 +01:00
parent 8dc8cf852b
commit aa1e77d532
3 changed files with 12 additions and 4 deletions

View File

@ -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(
`

View File

@ -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')
}

View File

@ -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') {