UNPKG

ts-json-schema-generator

Version:

Generate JSON schema from your Typescript sources

88 lines 3.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const util_1 = require("util"); const AliasType_1 = require("../Type/AliasType"); const AnnotatedType_1 = require("../Type/AnnotatedType"); const DefinitionType_1 = require("../Type/DefinitionType"); const ReferenceType_1 = require("../Type/ReferenceType"); const uniqueArray_1 = require("./uniqueArray"); const deepMerge_1 = require("./deepMerge"); function getNonRefType(type) { if (type instanceof ReferenceType_1.ReferenceType || type instanceof DefinitionType_1.DefinitionType || type instanceof AliasType_1.AliasType || type instanceof AnnotatedType_1.AnnotatedType) { return getNonRefType(type.getType()); } return type; } function getAllOfDefinitionReducer(childTypeFormatter, concatArrays) { return (definition, baseType) => { const other = childTypeFormatter.getDefinition(getNonRefType(baseType)); definition.properties = deepMerge_1.deepMerge(other.properties || {}, definition.properties || {}, concatArrays); function additionalPropsDefinition(props) { return props !== undefined && props !== true; } if (additionalPropsDefinition(definition.additionalProperties) && additionalPropsDefinition(other.additionalProperties)) { let additionalProps = []; let additionalTypes = []; const addAdditionalProps = (addProps) => { if (addProps !== false) { if (addProps.anyOf) { for (const prop of addProps.anyOf) { if (prop.type) { additionalTypes = additionalTypes.concat(util_1.isArray(prop.type) ? prop.type : [prop.type]); } else { additionalProps.push(prop); } } } else if (addProps.type) { additionalTypes = additionalTypes.concat(util_1.isArray(addProps.type) ? addProps.type : [addProps.type]); } else { additionalProps.push(addProps); } } }; addAdditionalProps(definition.additionalProperties); addAdditionalProps(other.additionalProperties); additionalTypes = uniqueArray_1.uniqueArray(additionalTypes); additionalProps = uniqueArray_1.uniqueArray(additionalProps); if (additionalTypes.length > 1) { additionalProps.push({ type: additionalTypes, }); } else if (additionalTypes.length === 1) { additionalProps.push({ type: additionalTypes[0], }); } if (additionalProps.length > 1) { definition.additionalProperties = { anyOf: additionalProps, }; } else if (additionalProps.length === 1) { if (Object.keys(additionalProps[0]).length === 0) { delete definition.additionalProperties; } else { definition.additionalProperties = additionalProps[0]; } } else { definition.additionalProperties = false; } } if (other.required) { definition.required = uniqueArray_1.uniqueArray((definition.required || []).concat(other.required)).sort(); } return definition; }; } exports.getAllOfDefinitionReducer = getAllOfDefinitionReducer; //# sourceMappingURL=allOfDefinition.js.map