UNPKG

json-to-ts

Version:

Convert json object to typescript interfaces

140 lines 5.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var pluralize = require("pluralize"); var model_1 = require("./model"); var util_1 = require("./util"); function getName(_a, keyName, names, isInsideArray) { var rootTypeId = _a.rootTypeId, types = _a.types; var typeDesc = types.find(function (_) { return _.id === rootTypeId; }); switch (util_1.getTypeDescriptionGroup(typeDesc)) { case model_1.TypeGroup.Array: typeDesc.arrayOfTypes.forEach(function (typeIdOrPrimitive, i) { getName({ rootTypeId: typeIdOrPrimitive, types: types }, // to differenttiate array types i === 0 ? keyName : "" + keyName + (i + 1), names, true); }); return { rootName: getNameById(typeDesc.id, keyName, isInsideArray, types, names), names: names, }; case model_1.TypeGroup.Object: Object.entries(typeDesc.typeObj).forEach(function (_a) { var key = _a[0], value = _a[1]; getName({ rootTypeId: value, types: types }, key, names, false); }); return { rootName: getNameById(typeDesc.id, keyName, isInsideArray, types, names), names: names, }; case model_1.TypeGroup.Primitive: // in this case rootTypeId is primitive type string (string, null, number, boolean) return { rootName: rootTypeId, names: names, }; } } function getNames(typeStructure, rootName) { if (rootName === void 0) { rootName = "RootObject"; } return getName(typeStructure, rootName, [], false).names.reverse(); } exports.getNames = getNames; function getNameById(id, keyName, isInsideArray, types, nameMap) { var nameEntry = nameMap.find(function (_) { return _.id === id; }); if (nameEntry) { return nameEntry.name; } var typeDesc = util_1.findTypeById(id, types); var group = util_1.getTypeDescriptionGroup(typeDesc); var name; switch (group) { case model_1.TypeGroup.Array: name = typeDesc.isUnion ? getArrayName(typeDesc, types, nameMap) : formatArrayName(typeDesc, types, nameMap); break; case model_1.TypeGroup.Object: /** * picking name for type in array requires to singularize that type name, * and if not then no need to singularize */ name = [keyName] .map(function (key) { return util_1.parseKeyMetaData(key).keyValue; }) .map(function (name) { return (isInsideArray ? pluralize.singular(name) : name); }) .map(pascalCase) .map(normalizeInvalidTypeName) .map(pascalCase) // needed because removed symbols might leave first character uncapitalized .map(function (name) { return uniqueByIncrement(name, nameMap.map(function (_a) { var name = _a.name; return name; })); }) .pop(); break; } nameMap.push({ id: id, name: name }); return name; } function pascalCase(name) { return name .split(/\s+/g) .filter(function (_) { return _ !== ""; }) .map(capitalize) .reduce(function (a, b) { return a + b; }, ""); } function capitalize(name) { return name.charAt(0).toUpperCase() + name.slice(1); } function normalizeInvalidTypeName(name) { if (/^[a-zA-Z][a-zA-Z0-9]*$/.test(name)) { return name; } else { var noSymbolsName = name.replace(/[^a-zA-Z0-9]/g, ""); var startsWithWordCharacter = /^[a-zA-Z]/.test(noSymbolsName); return startsWithWordCharacter ? noSymbolsName : "_" + noSymbolsName; } } function uniqueByIncrement(name, names) { for (var i = 0; i < 1000; i++) { var nameProposal = i === 0 ? name : "" + name + (i + 1); if (!names.includes(nameProposal)) { return nameProposal; } } } function getArrayName(typeDesc, types, nameMap) { if (typeDesc.arrayOfTypes.length === 0) { return "any"; } else if (typeDesc.arrayOfTypes.length === 1) { var idOrPrimitive = typeDesc.arrayOfTypes[0]; return convertToReadableType(idOrPrimitive, types, nameMap); } else { return unionToString(typeDesc, types, nameMap); } } function convertToReadableType(idOrPrimitive, types, nameMap) { return util_1.isHash(idOrPrimitive) ? // array keyName makes no difference in picking name for type getNameById(idOrPrimitive, null, true, types, nameMap) : idOrPrimitive; } function unionToString(typeDesc, types, nameMap) { return typeDesc.arrayOfTypes.reduce(function (acc, type, i) { var readableTypeName = convertToReadableType(type, types, nameMap); return i === 0 ? readableTypeName : acc + " | " + readableTypeName; }, ""); } function formatArrayName(typeDesc, types, nameMap) { var innerTypeId = typeDesc.arrayOfTypes[0]; // const isMultipleTypeArray = findTypeById(innerTypeId, types).arrayOfTypes.length > 1 var isMultipleTypeArray = util_1.isHash(innerTypeId) && util_1.findTypeById(innerTypeId, types).isUnion && util_1.findTypeById(innerTypeId, types).arrayOfTypes.length > 1; var readableInnerType = getArrayName(typeDesc, types, nameMap); return isMultipleTypeArray ? "(" + readableInnerType + ")[]" // add semicolons for union type : readableInnerType + "[]"; } //# sourceMappingURL=get-names.js.map