ts-json-schema-generator
Version:
Generate JSON schema from your Typescript sources
80 lines • 3.56 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAllOfDefinitionReducer = void 0;
const uniqueArray_js_1 = require("./uniqueArray.js");
const deepMerge_js_1 = require("./deepMerge.js");
const derefType_js_1 = require("./derefType.js");
function getAllOfDefinitionReducer(childTypeFormatter) {
return (definition, baseType) => {
const other = childTypeFormatter.getDefinition((0, derefType_js_1.derefType)(baseType));
definition.properties = (0, deepMerge_js_1.deepMerge)(other.properties || {}, definition.properties || {});
function additionalPropsDefinition(props) {
return props !== undefined && props !== true;
}
if (additionalPropsDefinition(definition.additionalProperties) &&
additionalPropsDefinition(other.additionalProperties)) {
let additionalProps = [];
let additionalTypes = [];
const addAdditionalProps = (addProps) => {
if (addProps) {
if (addProps.anyOf) {
for (const prop of addProps.anyOf) {
if (prop.type) {
additionalTypes = additionalTypes.concat(Array.isArray(prop.type) ? prop.type : [prop.type]);
}
else {
additionalProps.push(prop);
}
}
}
else if (addProps.type) {
additionalTypes = additionalTypes.concat(Array.isArray(addProps.type) ? addProps.type : [addProps.type]);
}
else {
additionalProps.push(addProps);
}
}
};
addAdditionalProps(definition.additionalProperties);
addAdditionalProps(other.additionalProperties);
additionalTypes = (0, uniqueArray_js_1.uniqueArray)(additionalTypes);
additionalProps = (0, uniqueArray_js_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 = (0, uniqueArray_js_1.uniqueArray)((definition.required || []).concat(other.required)).sort();
}
if ((other.additionalProperties || other.additionalProperties === undefined) &&
definition.additionalProperties == false) {
delete definition.additionalProperties;
}
return definition;
};
}
exports.getAllOfDefinitionReducer = getAllOfDefinitionReducer;
//# sourceMappingURL=allOfDefinition.js.map
;