* Find a discriminator property shared by all variants in an anyOf. * A discriminator is a property with a `const` value that uniquely identifies each variant.
(variants: JSONSchema7[])
| 271 | * A discriminator is a property with a `const` value that uniquely identifies each variant. |
| 272 | */ |
| 273 | function findDiscriminator(variants: JSONSchema7[]): DiscriminatorInfo | null { |
| 274 | if (variants.length === 0) return null; |
| 275 | const firstVariant = variants[0]; |
| 276 | if (!firstVariant.properties) return null; |
| 277 | |
| 278 | for (const [propName, propSchema] of Object.entries(firstVariant.properties).sort(([a], [b]) => a.localeCompare(b))) { |
| 279 | if (typeof propSchema !== "object") continue; |
| 280 | const schema = propSchema as JSONSchema7; |
| 281 | if (schema.const === undefined) continue; |
| 282 | |
| 283 | const mapping = new Map<string, { value: unknown; schema: JSONSchema7 }>(); |
| 284 | let isValidDiscriminator = true; |
| 285 | |
| 286 | for (const variant of variants) { |
| 287 | if (!variant.properties) { isValidDiscriminator = false; break; } |
| 288 | const variantProp = variant.properties[propName]; |
| 289 | if (typeof variantProp !== "object") { isValidDiscriminator = false; break; } |
| 290 | const variantSchema = variantProp as JSONSchema7; |
| 291 | if (variantSchema.const === undefined) { isValidDiscriminator = false; break; } |
| 292 | const key = String(variantSchema.const); |
| 293 | if (mapping.has(key)) { isValidDiscriminator = false; break; } |
| 294 | mapping.set(key, { value: variantSchema.const, schema: variant }); |
| 295 | } |
| 296 | |
| 297 | if (isValidDiscriminator && mapping.size === variants.length) { |
| 298 | return { property: propName, mapping }; |
| 299 | } |
| 300 | } |
| 301 | return null; |
| 302 | } |
| 303 | |
| 304 | /** |
| 305 | * Resolve anyOf variants, handling $ref to definitions. |
no test coverage detected
searching dependent graphs…