diff --git a/src/lib/models/types.ts b/src/lib/models/types.ts index be49d3a91..be93044d5 100644 --- a/src/lib/models/types.ts +++ b/src/lib/models/types.ts @@ -907,11 +907,39 @@ export class ReferenceType extends Type { return new ReferenceType(name, target, project, name); } + /** + * In certain cases, TypeScript returns the name `default` for the name of a type that is defined with + * the format `export default class` or `export default function`. This method checks for that case and returns the + * declaration of the export instead of the name `default`. + */ + private static getNameForDefaultExport( + symbol: ts.Symbol, + ): string | undefined { + if ( + symbol.name !== "default" || + symbol.valueDeclaration === undefined + ) { + return; + } + + const name = ts.getNameOfDeclaration(symbol.valueDeclaration); + + if (!name) { + return; + } + + if (ts.isIdentifier(name)) { + return name.text; + } + } + static createSymbolReference( symbol: ts.Symbol, context: Context, name?: string, ) { + name ??= this.getNameForDefaultExport(symbol); + const ref = new ReferenceType( name ?? symbol.name, new ReflectionSymbolId(symbol), diff --git a/src/test/converter2/issues/gh99999/default.ts b/src/test/converter2/issues/gh99999/default.ts new file mode 100644 index 000000000..196131c09 --- /dev/null +++ b/src/test/converter2/issues/gh99999/default.ts @@ -0,0 +1,6 @@ +/** + * Default export and class implementation + */ +export default class DefaultExport { + constructor() {} +} diff --git a/src/test/converter2/issues/gh99999/index.ts b/src/test/converter2/issues/gh99999/index.ts new file mode 100644 index 000000000..2fb7153e0 --- /dev/null +++ b/src/test/converter2/issues/gh99999/index.ts @@ -0,0 +1,3 @@ +import { Default } from "./reexported"; + +export function usesDefaultExport(param: Default) {} diff --git a/src/test/converter2/issues/gh99999/reexported.ts b/src/test/converter2/issues/gh99999/reexported.ts new file mode 100644 index 000000000..65fe0b80b --- /dev/null +++ b/src/test/converter2/issues/gh99999/reexported.ts @@ -0,0 +1 @@ +export { default as Default } from "./default"; diff --git a/src/test/issues.c2.test.ts b/src/test/issues.c2.test.ts index c41b253d6..476cc3cdd 100644 --- a/src/test/issues.c2.test.ts +++ b/src/test/issues.c2.test.ts @@ -15,6 +15,7 @@ import { ProjectReflection, QueryType, ReferenceReflection, + ReferenceType, ReflectionKind, ReflectionType, SignatureReflection, @@ -91,6 +92,21 @@ describe("Issue Tests", () => { ); }); + it("#99999", () => { + const project = convert(); + const usesDefaultExport = query(project, "usesDefaultExport"); + const sig = usesDefaultExport.signatures?.[0]; + ok(sig, "Missing signature for usesDefaultExport"); + const param = sig.parameters?.[0]; + ok(param, "Missing parameter"); + equal(param.name, "param", "Incorrect parameter name"); + const paramType = param.type as ReferenceType | undefined; + ok(paramType, "Parameter type is not a reference type or undefined"); + equal(paramType.type, "reference", "Parameter is not a reference type"); + equal(paramType.name, "DefaultExport", "Incorrect reference name"); + equal(paramType.qualifiedName, "default", "Incorrect qualified name"); + }); + it("#671", () => { const project = convert(); const toNumber = query(project, "toNumber");