ts-json-schema-generator
Version:
Generate JSON schema from your Typescript sources
121 lines • 5.54 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTypeByKey = exports.getTypeKeys = void 0;
const IntersectionNodeParser_js_1 = require("../NodeParser/IntersectionNodeParser.js");
const AnyType_js_1 = require("../Type/AnyType.js");
const ArrayType_js_1 = require("../Type/ArrayType.js");
const BaseType_js_1 = require("../Type/BaseType.js");
const IntersectionType_js_1 = require("../Type/IntersectionType.js");
const LiteralType_js_1 = require("../Type/LiteralType.js");
const NumberType_js_1 = require("../Type/NumberType.js");
const ObjectType_js_1 = require("../Type/ObjectType.js");
const TupleType_js_1 = require("../Type/TupleType.js");
const UndefinedType_js_1 = require("../Type/UndefinedType.js");
const UnionType_js_1 = require("../Type/UnionType.js");
const derefType_js_1 = require("./derefType.js");
const preserveAnnotation_js_1 = require("./preserveAnnotation.js");
const uniqueArray_js_1 = require("./uniqueArray.js");
const uniqueTypeArray_js_1 = require("./uniqueTypeArray.js");
function uniqueLiterals(types) {
const values = types.map((type) => type.getValue());
return (0, uniqueArray_js_1.uniqueArray)(values).map((value) => new LiteralType_js_1.LiteralType(value));
}
function getTypeKeys(type) {
type = (0, derefType_js_1.derefType)(type);
if (type instanceof IntersectionType_js_1.IntersectionType || type instanceof UnionType_js_1.UnionType) {
return uniqueLiterals(type.getTypes().reduce((result, subType) => [...result, ...getTypeKeys(subType)], []));
}
if (type instanceof TupleType_js_1.TupleType) {
return type.getTypes().map((_it, idx) => new LiteralType_js_1.LiteralType(idx));
}
if (type instanceof ObjectType_js_1.ObjectType) {
const objectProperties = type.getProperties().map((it) => new LiteralType_js_1.LiteralType(it.getName()));
return uniqueLiterals(type
.getBaseTypes()
.reduce((result, parentType) => [...result, ...getTypeKeys(parentType)], objectProperties));
}
return [];
}
exports.getTypeKeys = getTypeKeys;
function getTypeByKey(type, index) {
type = (0, derefType_js_1.derefType)(type);
if (type instanceof IntersectionType_js_1.IntersectionType || type instanceof UnionType_js_1.UnionType) {
let subTypes = [];
let firstType;
for (const subType of type.getTypes()) {
const subKeyType = getTypeByKey(subType, index);
if (subKeyType) {
subTypes.push(subKeyType);
if (!firstType) {
firstType = subKeyType;
}
}
}
subTypes = (0, uniqueTypeArray_js_1.uniqueTypeArray)(subTypes);
let returnType = undefined;
if (subTypes.length == 1) {
return firstType;
}
else if (subTypes.length > 1) {
if (type instanceof UnionType_js_1.UnionType) {
returnType = new UnionType_js_1.UnionType(subTypes);
}
else {
returnType = (0, IntersectionNodeParser_js_1.translate)(subTypes);
}
}
if (!returnType) {
return undefined;
}
if (!firstType) {
return returnType;
}
return (0, preserveAnnotation_js_1.preserveAnnotation)(firstType, returnType);
}
if (type instanceof TupleType_js_1.TupleType && index instanceof LiteralType_js_1.LiteralType) {
return type.getTypes().find((it, idx) => idx === index.getValue());
}
if (type instanceof ArrayType_js_1.ArrayType && index instanceof NumberType_js_1.NumberType) {
return type.getItem();
}
if (type instanceof ObjectType_js_1.ObjectType) {
if (index instanceof LiteralType_js_1.LiteralType) {
const property = type.getProperties().find((it) => it.getName() === index.getValue());
if (property) {
const propertyType = property.getType();
if (propertyType === undefined) {
return undefined;
}
let newPropType = (0, derefType_js_1.derefAnnotatedType)(propertyType);
if (!property.isRequired()) {
if (newPropType instanceof UnionType_js_1.UnionType) {
if (!newPropType.getTypes().some((subType) => subType instanceof UndefinedType_js_1.UndefinedType)) {
newPropType = new UnionType_js_1.UnionType([...newPropType.getTypes(), new UndefinedType_js_1.UndefinedType()]);
}
}
else {
newPropType = new UnionType_js_1.UnionType([newPropType, new UndefinedType_js_1.UndefinedType()]);
}
}
return (0, preserveAnnotation_js_1.preserveAnnotation)(propertyType, newPropType);
}
}
const additionalProperty = type.getAdditionalProperties();
if (additionalProperty instanceof BaseType_js_1.BaseType) {
return additionalProperty;
}
else if (additionalProperty === true) {
return new AnyType_js_1.AnyType();
}
for (const subType of type.getBaseTypes()) {
const subKeyType = getTypeByKey(subType, index);
if (subKeyType) {
return subKeyType;
}
}
return undefined;
}
return undefined;
}
exports.getTypeByKey = getTypeByKey;
//# sourceMappingURL=typeKeys.js.map
;