UNPKG

2.7 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const typescript_1 = __importDefault(require("typescript"));
7const lodash_merge_1 = __importDefault(require("lodash.merge"));
8function isPrimitive(flags) {
9 return ((flags & typescript_1.default.TypeFlags.String) !== 0 || (flags & typescript_1.default.TypeFlags.Number) !== 0 || (flags & typescript_1.default.TypeFlags.Boolean) !== 0);
10}
11function convertType(typ, checker, definition = {}) {
12 const flags = typ.getFlags();
13 const typeNode = checker.typeToTypeNode(typ);
14 if (typescript_1.default.isArrayTypeNode(typeNode)) {
15 let elementType = checker.getElementTypeOfArrayType(typ);
16 const elementTypeFlags = elementType.getFlags();
17 if (!isPrimitive(elementTypeFlags)) {
18 elementType = checker.getApparentType(elementType);
19 }
20 return { type: 'array', items: convertType(elementType, checker) };
21 }
22 if (flags & typescript_1.default.TypeFlags.String) {
23 return { type: 'string' };
24 }
25 if (flags & typescript_1.default.TypeFlags.Number) {
26 return { type: 'number' };
27 }
28 if (flags & typescript_1.default.TypeFlags.Boolean) {
29 return { type: 'boolean' };
30 }
31 if (flags & typescript_1.default.TypeFlags.Intersection || flags & typescript_1.default.TypeFlags.Union) {
32 return typ.types.reduce((acc, t) => {
33 const converted = convertType(t, checker, acc);
34 return lodash_merge_1.default(acc, converted);
35 }, {});
36 }
37 if (flags & typescript_1.default.TypeFlags.Object) {
38 return {
39 type: 'object',
40 properties: checker
41 .getWidenedType(typ)
42 .getProperties()
43 .reduce((acc, s) => {
44 const nestedType = checker.getTypeOfSymbolAtLocation(s, s.valueDeclaration);
45 acc[checker.symbolToString(s)] = convertType(checker.getWidenedType(nestedType), checker);
46 return acc;
47 }, {})
48 };
49 }
50 if (typ.aliasTypeArguments && typ.aliasTypeArguments.length) {
51 return typ.aliasTypeArguments.reduce((acc, t) => {
52 acc[checker.symbolToString(t.symbol)] = convertType(t, checker);
53 return acc;
54 }, definition);
55 }
56 if (typ.aliasSymbol) {
57 const aliasedType = checker.getTypeOfSymbolAtLocation(typ.aliasSymbol, typ.aliasSymbol.valueDeclaration);
58 return convertType(aliasedType, checker, definition);
59 }
60 return definition;
61}
62exports.convertType = convertType;