ts-randomizer
Version:
A tool to create random data by type parameters
96 lines • 4.08 kB
JavaScript
;
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