UNPKG

bobflux-gen

Version:

Generator for monkey files in bobflux application.

70 lines (69 loc) 2.36 kB
"use strict"; var ts = require("typescript"); function create(saveCallback) { return { accept: function (n) { return n.kind === ts.SyntaxKind.PropertySignature; }, visit: function (n) { var ps = n; saveCallback({ name: ps.name.getText(), type: getTypes(ps.type, ps.questionToken) }); } }; } exports.create = create; function getTypes(type, questionToken) { var types = getDeclaredTypes(type); if (!questionToken || types.filter(function (t) { return t.name === 'undefined'; }).length) return types; return types.concat([{ name: 'undefined' }]); } exports.getTypes = getTypes; function getDeclaredTypes(type) { if (type.kind == ts.SyntaxKind.UnionType) { var unionType = type; return unionType.types.reduce(function (c, t) { return c.concat(getDeclaredTypes(t)); }, []); } else if (type.kind === ts.SyntaxKind.TypeReference) { var tp = type; return [{ name: tp.typeName.getText(), arguments: tp.typeArguments && tp.typeArguments.map(function (tp) { return getDeclaredTypes(tp); }) }]; } else if (type.kind === ts.SyntaxKind.ArrayType) return [{ name: type.elementType.getText(), isArray: true }]; else if (type.kind === ts.SyntaxKind.TypeLiteral) { var tlType = type; if (tlType.members[0].kind === ts.SyntaxKind.IndexSignature) { var is = tlType.members[0]; if (is.type.kind === ts.SyntaxKind.TypeReference) { var tr = is.type; return [{ name: tr.typeName.getText(), arguments: tr.typeArguments && tr.typeArguments.map(function (tp) { return getDeclaredTypes(tp); }), indexer: is.parameters[0].getText() }]; } else return [{ name: is.type.getText(), indexer: is.parameters[0].getText() }]; } else return [{ name: tlType.getText() }]; } else return [{ name: ts.tokenToString(type.kind) }]; }