diff --git a/packages/docgen/src/docgen/ApiDocGenerator.ts b/packages/docgen/src/docgen/ApiDocGenerator.ts index 7aaf1463da..8d0fd04240 100644 --- a/packages/docgen/src/docgen/ApiDocGenerator.ts +++ b/packages/docgen/src/docgen/ApiDocGenerator.ts @@ -61,12 +61,16 @@ export default class ApiDocGenerator { const id = this.getObjectPropertyLiteral(info, 'id'); const description = this.getObjectPropertyLiteral(info, 'description'); - const interfaceInfo = this.getInterfaceInfo(typeArgs[0]); - if (!interfaceInfo) { - throw new Error('api has no info type argument'); - } - return { id, name, source, description, interfaceInfo }; + const rootTypeNode = typeArgs[0]; + const typeNodes = ts.isIntersectionTypeNode(rootTypeNode) + ? rootTypeNode.types.slice() + : [rootTypeNode]; + const interfaceInfos = typeNodes.map(typeNode => + this.getInterfaceInfo(typeNode), + ); + + return { id, name, source, description, interfaceInfos }; } private getNodeDocs(node: ts.Node): string[] { diff --git a/packages/docgen/src/docgen/ApiDocPrinter.ts b/packages/docgen/src/docgen/ApiDocPrinter.ts index 5824047ef7..5047885fc2 100644 --- a/packages/docgen/src/docgen/ApiDocPrinter.ts +++ b/packages/docgen/src/docgen/ApiDocPrinter.ts @@ -47,9 +47,9 @@ export default class ApiDocPrinter { // Remove line numbers from codeblocks printer.style('.linenodiv{ display: none }'); - printer.header(1, `shared/apis/${apiDoc.id}`); + printer.header(1, apiDoc.id); - const ifInfo = apiDoc.interfaceInfo; + const ifInfo = apiDoc.interfaceInfos[0]; if (ifInfo.docs.length) { for (const doc of ifInfo.docs) { diff --git a/packages/docgen/src/docgen/types.ts b/packages/docgen/src/docgen/types.ts index df9a5b93a0..b630caeda0 100644 --- a/packages/docgen/src/docgen/types.ts +++ b/packages/docgen/src/docgen/types.ts @@ -77,7 +77,7 @@ export type ApiDoc = { name: string; source: ts.SourceFile; description: string; - interfaceInfo: InterfaceInfo; + interfaceInfos: InterfaceInfo[]; }; /**