|
1 | 1 | import * as ASTQ from 'astq'; |
2 | 2 | import * as dom from 'dts-dom'; |
| 3 | +import pascalCase = require('pascal-case'); |
3 | 4 | import { InstanceOfResolver } from './index'; |
4 | 5 | import * as types from './types'; |
5 | 6 |
|
@@ -69,7 +70,9 @@ function createExportedTypes(m: dom.ModuleDeclaration, ast: AstQuery, componentN |
69 | 70 | interf.flags = dom.DeclarationFlags.Export; |
70 | 71 | if (propTypes) { |
71 | 72 | createPropTypeTypings(interf, ast, propTypes, propTypesName); |
| 73 | + extractComplexTypes(m, interf, componentName); |
72 | 74 | } |
| 75 | + |
73 | 76 | if (propTypes || classComponent) { |
74 | 77 | m.members.push(interf); |
75 | 78 | } |
@@ -116,6 +119,40 @@ function createPropTypeTypings(interf: dom.InterfaceDeclaration, ast: AstQuery, |
116 | 119 | }); |
117 | 120 | } |
118 | 121 |
|
| 122 | +function extractComplexTypes(m: dom.ModuleDeclaration, interf: dom.InterfaceDeclaration, |
| 123 | + componentName: string): void { |
| 124 | + interf.members.forEach((member) => { |
| 125 | + if (member.kind === 'property' && isExtractableType(member.type)) { |
| 126 | + const name = `${componentName}${pascalCase(member.name)}`; |
| 127 | + const extractedMember = createModuleMember(name, member.type); |
| 128 | + extractedMember.flags = dom.DeclarationFlags.Export; |
| 129 | + m.members.push(extractedMember); |
| 130 | + member.type = dom.create.namedTypeReference(name); |
| 131 | + } |
| 132 | + }); |
| 133 | +} |
| 134 | + |
| 135 | +type ExtractableType = dom.UnionType | dom.IntersectionType | dom.ObjectType; |
| 136 | + |
| 137 | +function isExtractableType(type: dom.Type): type is ExtractableType { |
| 138 | + if (typeof type === 'object') { |
| 139 | + return ['union', 'intersection', 'object'].indexOf(type.kind) > -1; |
| 140 | + } |
| 141 | + return false; |
| 142 | +} |
| 143 | + |
| 144 | +function createModuleMember(name: string, type: ExtractableType): dom.ModuleMember { |
| 145 | + switch (type.kind) { |
| 146 | + case 'intersection': |
| 147 | + case 'union': |
| 148 | + return dom.create.alias(name, type); |
| 149 | + case 'object': |
| 150 | + const interf = dom.create.interface(name); |
| 151 | + interf.members = type.members; |
| 152 | + return interf; |
| 153 | + } |
| 154 | +} |
| 155 | + |
119 | 156 | function getUniqueNames(input: string[]): string[] { |
120 | 157 | return Object.keys(input.reduce((all: any, name: string) => { |
121 | 158 | all[name] = true; |
|
0 commit comments