Explorar o código

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

close #8285
Evan You %!s(int64=3) %!d(string=hai) anos
pai
achega
aa1e77d532

+ 4 - 1
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(
         `

+ 3 - 2
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')
     }

+ 5 - 1
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') {