1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | const typescript_1 = __importDefault(require("typescript"));
|
7 | const lodash_merge_1 = __importDefault(require("lodash.merge"));
|
8 | function 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 | }
|
11 | function 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 | }
|
62 | exports.convertType = convertType;
|