UNPKG

ts-randomizer

Version:

A tool to create random data by type parameters

96 lines 4.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createDescription = void 0; const ts = require("typescript"); const fp_1 = require("lodash/fp"); const types_1 = require("../../../types"); const create_params_map_1 = require("../type-params/create-params-map"); const node_1 = require("../node"); const index_1 = require("./index"); const tuple_type_node_1 = require("../tuple-type-node"); const checker_1 = require("../../checker"); const marge_params_map_1 = require("../type-params/marge-params-map"); const getEnumValues = (type) => (0, fp_1.map)(literal => literal.value, type.types); /** * Generate description for type symbol declaration * @param node Property declarations * @param nodeTypeArguments Property type arguments relations map * @param typeArgumentsMap Parent node type arguments relations map */ const createDeclarationDescription = (node, nodeTypeArguments = {}, typeArgumentsMap = {}) => { const checker = (0, checker_1.getTypeChecker)(); if (!node || !(ts.isPropertyDeclaration(node) || ts.isPropertySignature(node) || ts.isMethodDeclaration(node) || ts.isMethodSignature(node))) { return types_1.PropertyType.Unknown; } if (!node.type) { const key = node.name.getText(); return { key, description: types_1.PropertyType.Unknown, }; } if (ts.isTupleTypeNode(node.type)) { return (0, tuple_type_node_1.getTupleNodeDescription)(node.type); } const nodeTypeNode = ts.isArrayTypeNode(node.type) ? node.type.elementType : node.type; const nodeType = checker.getTypeFromTypeNode(nodeTypeNode); const argumentsMap = (0, create_params_map_1.createTypeParamsMap)(nodeType); return (0, node_1.generateNodeDescription)(node, (0, marge_params_map_1.mergeTypeParamsMap)(argumentsMap, nodeTypeArguments, typeArgumentsMap)); }; /** * Generate property description * @param key Property key * @param type Type for description generation * @param typeArgumentsMap Node type arguments relations */ const createDescription = (key, type, typeArgumentsMap = {}) => { const checker = (0, checker_1.getTypeChecker)(); if (!type) { return types_1.PropertyType.Unknown; } if (!type.symbol) { const typeNode = checker.typeToTypeNode(type, undefined, undefined); return (0, index_1.getPropertyNameBySyntaxKind)(typeNode); } const nameByWrapper = (0, index_1.getTypeNameByWrapperFunction)(type.symbol.name); if (nameByWrapper) { return nameByWrapper; } const arrayTypeParam = (0, index_1.getFirstTypeParameter)(type); if ((0, index_1.isArrayType)(type) && arrayTypeParam) { return { flag: types_1.DescriptionFlag.Array, description: (0, exports.createDescription)(key, arrayTypeParam, typeArgumentsMap), }; } const enumValues = getEnumValues(type); if (!(0, fp_1.isEmpty)(enumValues)) { return { flag: types_1.DescriptionFlag.Enum, possibleValues: enumValues, description: [], }; } const declarations = (0, fp_1.flatMap)(p => p.declarations, checker.getPropertiesOfType(type)); if (!declarations.length) { const typeArg = typeArgumentsMap[type.symbol.name]; const isArray = typeArg && typeArg.isArray; if (isArray) { return { flag: types_1.DescriptionFlag.Array, description: (0, exports.createDescription)(key, typeArg && typeArg.type, typeArgumentsMap), }; } return (0, exports.createDescription)(key, typeArg && typeArg.type, typeArgumentsMap); } const nodeTypeArguments = (0, create_params_map_1.createTypeParamsMap)(type); return (0, fp_1.flatMap)(node => createDeclarationDescription(node, nodeTypeArguments, typeArgumentsMap), declarations.filter(x => x !== undefined)); }; exports.createDescription = createDescription; //# sourceMappingURL=create-description.js.map