in src/models/typeDefinition.ts [361:472]
private processProperties(item: SchemaObjectContract, nested: boolean, definitions: object, prefix?: string): PropertiesObject {
const props = [];
let hasReadOnly = false;
if (!item.properties) {
return;
}
Object
.keys(item.properties)
.forEach(propertyName => {
try {
const propertySchemaObject = item.properties[propertyName];
const propertyNameToDisplay = (prefix ? prefix + "." : "") + propertyName;
if (!hasReadOnly) hasReadOnly = propertySchemaObject.readOnly ?? false;
if (!propertySchemaObject) {
return;
}
const isRequired = item.required?.includes(propertyName) || false;
if (propertySchemaObject.$ref) {
propertySchemaObject.type = "object";
}
if (propertySchemaObject.items) {
propertySchemaObject.type = "array";
}
if (propertySchemaObject.allOf ||
propertySchemaObject.anyOf ||
propertySchemaObject.oneOf ||
propertySchemaObject.not
) {
propertySchemaObject.type = "combination";
}
switch (propertySchemaObject.type) {
case "integer":
case "number":
case "string":
case "boolean":
if (propertySchemaObject.enum) {
props.push(new TypeDefinitionEnumerationProperty(propertyNameToDisplay, propertySchemaObject, isRequired));
}
else {
props.push(new TypeDefinitionPrimitiveProperty(propertyNameToDisplay, propertySchemaObject, isRequired));
}
break;
case "object": {
const objectProperty = new TypeDefinitionObjectProperty(propertyNameToDisplay, propertySchemaObject, isRequired, true, definitions);
if (!propertySchemaObject.$ref && propertySchemaObject.properties && !nested) {
const flattenObjects = this.flattenNestedObjects(objectProperty, propertyNameToDisplay);
props.push(...flattenObjects);
}
else {
props.push(objectProperty);
}
break;
}
case "array": {
const arrayProperty = new TypeDefinitionPrimitiveProperty(propertyNameToDisplay, propertySchemaObject, isRequired);
if (!propertySchemaObject.items) {
return arrayProperty;
}
if (propertySchemaObject.items.$ref) {
arrayProperty.type = new TypeDefinitionPropertyTypeArrayOfReference(this.getTypeNameFromRef(propertySchemaObject.items.$ref));
props.push(arrayProperty);
}
else if (propertySchemaObject.items.properties) {
const objectProperty = new TypeDefinitionObjectProperty(propertyNameToDisplay, propertySchemaObject.items, isRequired, true, definitions);
const flattenObjects = this.flattenNestedObjects(objectProperty, propertyNameToDisplay + "[]");
props.push(...flattenObjects);
}
else if (propertySchemaObject.items.type) {
arrayProperty.type = new TypeDefinitionPropertyTypeArrayOfPrimitive(propertySchemaObject.items.type);
props.push(arrayProperty);
}
else {
const objectProperty = new TypeDefinitionObjectProperty(propertyNameToDisplay + "[]", propertySchemaObject.items, isRequired, true, definitions);
props.push(objectProperty);
}
break;
}
case "combination":
props.push(new TypeDefinitionCombinationProperty(propertyNameToDisplay, propertySchemaObject, isRequired));
break;
default:
console.warn(`Unknown type of schema definition: ${propertySchemaObject.type}`);
}
}
catch (error) {
console.warn(`Unable to process object property ${propertyName}. Error: ${error}`);
}
});
return {
props,
hasReadOnly
};
}