Repository navigation
Bundler and linter fail when discriminator value is component name #1877
Description
Describe the bug
The OAS 3.1 spec states that the value of a discriminator mapping can be be a string that is the name of a component schema in the file:
The mapping entry maps a specific property value to either a different schema component name, or to a schema identified by a URI
And the spec provides examples like:
discriminator:
propertyName: petType
mapping:
dog: Dog
However when such a OAS schema is sent to the redocly cli linter or bundler it results in an error: "Can't resolve $ref"
To Reproduce
Pass this file to redocly lint or redocly bundle
openapi: "3.1.0"
info:
title: pets
version: 1.0.0
license:
name: Apache 2.0
identifier: Apache-2.0
servers:
- url: http://not.real.com/pets.yaml
paths:
/get-pets:
get:
description: get pets
summary: get pets
operationId: get_pets
responses:
200:
description: ok
content:
application/json:
schema:
$ref: "#/components/schemas/Animals"
400:
description: not ok
components:
schemas:
Animals:
type: object
properties:
elements:
type: array
items:
oneOf:
- $ref: "#/components/schemas/Cat"
- $ref: "#/components/schemas/Dog"
discriminator:
propertyName: species
mapping:
dog: Dog
cat: Cat
Dog:
type: object
required:
- species
properties:
species:
type: string
const: dog
rating:
type: number
Cat:
type: object
required:
- species
properties:
species:
type: string
const: cat
tuxedo:
type: boolean
securitySchemes:
Bearer:
type: http
scheme: bearer
description: JWT auth0 token (without the word 'Bearer')
bearerFormat: JWT
security:
- Bearer: []
Expected behavior
The linter should not report errors.
Logs
OpenAPI description
Redocly Version(s)
1.28.0
Node.js Version(s)
v20.18.1
OS, environment
Mac OS 14.7.2
Additional context
The linter and bundler can be made to pass by changing the file:
discriminator:
propertyName: species
mapping:
dog: "#/components/schemas/Dog"
cat: "#/components/schemas/Cat"
Activity
jeremyfiel commentedon Feb 1, 2025
related to #1602
This particular comment has a good breakdown of each type of reference.
#1602 (comment)
The bug described here is directly related to this.
From the updated 3.1.1 spec.
jeremyfiel commentedon Feb 1, 2025
OK, narrowed this down to the rule
no-unresolved-refswhich is incorrectly reporting the error.redocly-cli/packages/core/src/rules/no-unresolved-refs.ts
Lines 15 to 19 in fa280a3
The discriminator mapping itself is working correctly, this can be verified by this example
The expected error is from the
invalid_testexample.jeremyfiel commentedon Feb 1, 2025
played with a few changes but nothing fixed just yet. Seems this is where it's failing to resolve
redocly-cli/packages/core/src/walk.ts
Line 143 in fa280a3
other changes i've made,
from this:
redocly-cli/packages/core/src/rules/no-unresolved-refs.ts
Lines 15 to 17 in fa280a3
to this:
added this test to the
no-unresolved-refs.test.tsjeremyfiel commentedon Feb 1, 2025
redocly-cli/packages/core/src/ref-utils.ts
Lines 77 to 86 in fa280a3
This is tangentially related and could be another method to resolve these mapping refs rather than the
resolvedRefMapmethod.tatomyr commentedon Feb 3, 2025
Looks like a bug indeed. Until it's fixed, you can try working around it with a custom decorator to prepend the schema names in
DiscriminatorMappingwith#/components/schemas/or something similar.