in packages/libs/oai2-to-oai3/src/converter.ts [588:678]
private async visitSchema(
target: MappingTreeObject<oai3.Schema>,
schemaValue: any,
schemaItemMemebers: () => Iterable<Node>,
) {
for (const { key, value, pointer, childIterator } of schemaItemMemebers()) {
switch (key) {
case "$ref":
await this.copyRef(target as any, { $ref: value }, pointer);
break;
case "additionalProperties":
if (typeof value === "boolean") {
if (value === true) {
target.__set__(key, { value, sourcePointer: pointer });
} // false is assumed anyway in autorest.
} else {
target.__set__(key, this.newObject(pointer));
await this.visitSchema(target[key]! as any, value, childIterator);
}
break;
case "required":
case "title":
case "description":
case "default":
case "multipleOf":
case "maximum":
case "exclusiveMaximum":
case "minimum":
case "exclusiveMinimum":
case "maxLength":
case "minLength":
case "pattern":
case "maxItems":
case "minItems":
case "uniqueItems":
case "maxProperties":
case "minProperties":
case "readOnly":
target.__set__(key, { value, sourcePointer: pointer });
break;
case "enum":
target.__set__("enum", this.newArray(pointer));
await this.visitEnum(target.enum!, childIterator);
break;
case "allOf":
target.__set__("allOf", this.newArray(pointer));
await this.visitAllOf(target.allOf!, childIterator);
break;
case "items":
target.__set__(key, this.newObject(pointer));
await this.visitSchema(target[key]! as any, value, childIterator);
break;
case "properties":
target.__set__(key, this.newObject(pointer));
await this.visitProperties(target[key]!, childIterator);
break;
case "type":
case "format":
target.__set__(key, { value, sourcePointer: pointer });
break;
// in OpenAPI 3 the discriminator its an object instead of a string.
case "discriminator":
target.__set__("discriminator", this.newObject(pointer));
target.discriminator!.__set__("propertyName", { value, sourcePointer: pointer });
break;
case "xml":
this.visitXml(target, key, value, pointer);
break;
case "externalDocs":
this.visitExternalDocs(target, key, value, pointer);
break;
case "example":
target.__set__("example", { value, sourcePointer: pointer });
break;
case "x-nullable":
target.__set__("nullable", { value, sourcePointer: pointer });
// NOTE: this matches the previous converter behavior ... when a $ref
// is inside the schema copy the properties as they are don't update
// names, but also leave the new `nullable` field so that OpenAPI 3
// readers pick it up correctly.
if (schemaValue.$ref !== undefined) {
target.__set__("x-nullable", { value, sourcePointer: pointer });
}
break;
default:
await this.visitExtensions(target, key, value, pointer);
break;
}
}
}