Add ability to get definitions from types exported from modules
This commit is contained in:
parent
877024ec8c
commit
d06781277a
@ -1,5 +1,6 @@
|
|||||||
import * as ts from 'typescript'
|
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
|
import * as ts from 'typescript'
|
||||||
|
import {argparse, arg} from '../argparse'
|
||||||
|
|
||||||
function isObjectType(type: ts.Type): type is ts.ObjectType {
|
function isObjectType(type: ts.Type): type is ts.ObjectType {
|
||||||
return !!(type.flags & ts.TypeFlags.Object)
|
return !!(type.flags & ts.TypeFlags.Object)
|
||||||
@ -48,7 +49,16 @@ interface IClassDefinition {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export function typecheck() {
|
export function typecheck(...argv: string[]) {
|
||||||
|
const args = argparse({
|
||||||
|
file: arg('string', {
|
||||||
|
default: __dirname + '/' + 'intergen.sample.ts',
|
||||||
|
alias: 'f',
|
||||||
|
}),
|
||||||
|
debug: arg('boolean'),
|
||||||
|
help: arg('boolean', {alias: 'h'}),
|
||||||
|
}).parse(argv)
|
||||||
|
|
||||||
/** Generate interfaces for all exported classes in a set of .ts files */
|
/** Generate interfaces for all exported classes in a set of .ts files */
|
||||||
function generateInterfaces(
|
function generateInterfaces(
|
||||||
fileNames: string[],
|
fileNames: string[],
|
||||||
@ -185,10 +195,14 @@ export function typecheck() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const type = checker.getDeclaredTypeOfSymbol(symbol)
|
||||||
|
handleType(type)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleType(type: ts.Type) {
|
||||||
const typeParameters: ts.TypeParameter[] = []
|
const typeParameters: ts.TypeParameter[] = []
|
||||||
const expandedTypeParameters: ts.Type[] = []
|
const expandedTypeParameters: ts.Type[] = []
|
||||||
const allRelevantTypes: ts.Type[] = []
|
const allRelevantTypes: ts.Type[] = []
|
||||||
const type = checker.getDeclaredTypeOfSymbol(symbol)
|
|
||||||
|
|
||||||
if (type.isClassOrInterface() && type.typeParameters) {
|
if (type.isClassOrInterface() && type.typeParameters) {
|
||||||
type.typeParameters.forEach(tp => {
|
type.typeParameters.forEach(tp => {
|
||||||
@ -245,7 +259,8 @@ export function typecheck() {
|
|||||||
allRelevantTypes.push(...relevantTypeParameters)
|
allRelevantTypes.push(...relevantTypeParameters)
|
||||||
|
|
||||||
const classDef: IClassDefinition = {
|
const classDef: IClassDefinition = {
|
||||||
name: symbol.getName(),
|
name: typeToString(type),
|
||||||
|
// name: symbol.getName(),
|
||||||
typeParameters,
|
typeParameters,
|
||||||
allRelevantTypes: allRelevantTypes
|
allRelevantTypes: allRelevantTypes
|
||||||
.filter(filterClassTypeParameters)
|
.filter(filterClassTypeParameters)
|
||||||
@ -272,6 +287,18 @@ export function typecheck() {
|
|||||||
* Visit nodes finding exported classes
|
* Visit nodes finding exported classes
|
||||||
*/
|
*/
|
||||||
function visit(node: ts.Node) {
|
function visit(node: ts.Node) {
|
||||||
|
// console.log('node.getText()', node.getText())
|
||||||
|
// console.log('node.kind', node.kind)
|
||||||
|
|
||||||
|
if (ts.isExportDeclaration(node)) {
|
||||||
|
if (node.exportClause) {
|
||||||
|
// console.log('export {...} from', node.exportClause.elements.length)
|
||||||
|
} else {
|
||||||
|
// console.log('export * from...')
|
||||||
|
// it is exporting *
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Only consider exported nodes
|
// Only consider exported nodes
|
||||||
if (!isNodeExported(node)) {
|
if (!isNodeExported(node)) {
|
||||||
return
|
return
|
||||||
@ -289,10 +316,19 @@ export function typecheck() {
|
|||||||
ts.forEachChild(sourceFile, visit)
|
ts.forEachChild(sourceFile, visit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Vote = classDefs.find(c => c.name === 'Vote')
|
||||||
|
if (Vote) {
|
||||||
|
console.log('found vote')
|
||||||
|
const U = Vote.allRelevantTypes.find(t => typeToString(t) === 'User')
|
||||||
|
if (U) {
|
||||||
|
console.log('found user')
|
||||||
|
handleType(U)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const path = __dirname + '/' + 'intergen.sample.ts'
|
generateInterfaces([args.file], {
|
||||||
generateInterfaces([path], {
|
|
||||||
target: ts.ScriptTarget.ES5,
|
target: ts.ScriptTarget.ES5,
|
||||||
module: ts.ModuleKind.CommonJS,
|
module: ts.ModuleKind.CommonJS,
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user