diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index dd47344277c..f671541977b 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -574,6 +574,47 @@ describe('resolveType', () => { expect(deps && [...deps]).toStrictEqual(Object.keys(files)) }) + test('relative (default export)', () => { + const files = { + '/foo.ts': `export default interface P { foo: string }`, + '/bar.ts': `type X = { bar: string }; export default X` + } + const { props, deps } = resolve( + ` + import P from './foo' + import X from './bar' + defineProps

() + `, + files + ) + expect(props).toStrictEqual({ + foo: ['String'], + bar: ['String'] + }) + expect(deps && [...deps]).toStrictEqual(Object.keys(files)) + }) + + test('relative (default re-export)', () => { + const files = { + '/bar.ts': `export { default } from './foo'`, + '/foo.ts': `export default interface P { foo: string }; export interface PP { bar: number }`, + '/baz.ts': `export { PP as default } from './foo'` + } + const { props, deps } = resolve( + ` + import P from './bar' + import PP from './baz' + defineProps

() + `, + files + ) + expect(props).toStrictEqual({ + foo: ['String'], + bar: ['Number'] + }) + expect(deps && [...deps]).toStrictEqual(Object.keys(files)) + }) + test('relative (dynamic import)', () => { const files = { '/foo.ts': `export type P = { foo: string, bar: import('./bar').N }`, diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index 775aa41ff83..f4e1915255e 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -1144,6 +1144,18 @@ function recordTypes( stmt.source.value ) Object.assign(scope.exportedTypes, sourceScope.exportedTypes) + } else if (stmt.type === 'ExportDefaultDeclaration' && stmt.declaration) { + if (stmt.declaration.type !== 'Identifier') { + recordType(stmt.declaration, types, declares, 'default') + recordType( + stmt.declaration, + exportedTypes, + exportedDeclares, + 'default' + ) + } else if (types[stmt.declaration.name]) { + exportedTypes['default'] = types[stmt.declaration.name] + } } } } @@ -1160,13 +1172,14 @@ function recordTypes( function recordType( node: Node, types: Record, - declares: Record + declares: Record, + overwriteId?: string ) { switch (node.type) { case 'TSInterfaceDeclaration': case 'TSEnumDeclaration': case 'TSModuleDeclaration': { - const id = getId(node.id) + const id = overwriteId || getId(node.id) let existing = types[id] if (existing) { if (node.type === 'TSModuleDeclaration') { @@ -1199,7 +1212,7 @@ function recordType( break } case 'ClassDeclaration': - types[getId(node.id)] = node + types[overwriteId || getId(node.id)] = node break case 'TSTypeAliasDeclaration': types[node.id.name] = node.typeAnnotation