in src/validation/utils/getDiagnosticsForNode.ts [54:103]
function getDiagnosticsForOneOfSchema(
rootNode: ObjectASTNode,
document: TextDocument,
schemaPart: SchemaObject,
oneOfSchema: string,
) {
const mutuallyExclusiveProperties: unknown = referenceTypes[oneOfSchema]
const mutuallyExclusivePropertiesPresent: { propNode: PropertyASTNode, schemaValue: unknown }[] = []
let diagnostics: Diagnostic[] = []
rootNode.properties.forEach(prop => {
if (!isObject(mutuallyExclusiveProperties)) {
return
}
const propName = prop.keyNode.value
const propertySchema = mutuallyExclusiveProperties[propName]
// If the property is one of mutually exclusive properties
if (propertySchema) {
mutuallyExclusivePropertiesPresent.push({ propNode: prop, schemaValue: propertySchema})
// If the property is neither in the set nor in the schema props
} else if (!schemaPart[propName]) {
diagnostics.push(
getPropertyNodeDiagnostic(prop, document, MESSAGES.INVALID_PROPERTY_NAME)
)
}
})
// if there is more than one item mark them all as invalid
if (mutuallyExclusivePropertiesPresent.length > 1) {
mutuallyExclusivePropertiesPresent.forEach(oneOfProp => {
diagnostics.push(
getPropertyNodeDiagnostic(oneOfProp.propNode, document, MESSAGES.MUTUALLY_EXCLUSIVE_CHOICE_PROPERTIES)
)
})
// if there is only one item and it is an object
// recursively continue on with validation
} else if (mutuallyExclusivePropertiesPresent.length) {
const { schemaValue, propNode } = mutuallyExclusivePropertiesPresent[0]
const { valueNode } = propNode
if (valueNode && isObject(schemaValue)) {
diagnostics = diagnostics.concat(
getDiagnosticsForNode(valueNode, document, schemaValue as SchemaObject)
)
}
}
return diagnostics
}