-
Notifications
You must be signed in to change notification settings - Fork 158
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Bundler and linter fail when discriminator value is component name #1877
Comments
related to #1602 This particular comment has a good breakdown of each type of reference. The bug described here is directly related to this.
From the updated 3.1.1 spec.
components:
schemas:
Pet:
type: object
required:
- petType
properties:
petType:
type: string
discriminator:
propertyName: petType
mapping:
dog: Dog
Cat:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Cat`
properties:
name:
type: string
Dog:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Dog`
properties:
bark:
type: string
Lizard:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Lizard`
properties:
lovesRocks:
type: boolean |
OK, narrowed this down to the rule 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 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"
examples:
valid_test:
value:
elements:
- species: dog
rating: 1
invalid_test:
value:
elements:
- species: dog
rating: true
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:
const: dog
rating:
type: number
Cat:
type: object
required:
- species
properties:
species:
const: cat
tuxedo:
type: boolean
securitySchemes:
Bearer:
type: http
scheme: bearer
description: JWT auth0 token (without the word 'Bearer')
bearerFormat: JWT
security:
- Bearer: [] The expected error is from the Example value must conform to the schema: `rating` property type must be number. |
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: DiscriminatorMapping(mapping, { report, resolve, location }) {
for (const mappingName in mapping) {
const resolved = resolve({ $ref: `${mapping[mappingName]}` }); added this test to the it('should not report on discriminator mapping explicit value', async () => {
const document = parseYamlToDocument(
outdent`
openapi: 3.1.0
info:
title: pets
version: 1.0.0
servers:
- url: http://not.real.com/pets.yaml
paths:
/get-pets:
get:
description: get pets
responses:
200:
description: ok
content:
application/json:
schema:
$ref: "#/components/schemas/Animals"
examples:
valid_test:
value:
elements:
- species: dog
rating: 1
invalid_test:
value:
elements:
- species: dog
rating: true
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:
const: dog
rating:
type: number
Cat:
type: object
required:
- species
properties:
species:
const: cat
tuxedo:
type: boolean
`,
path.join(__dirname, 'foobar.yaml')
);
const results = await lintDocument({
externalRefResolver: new BaseResolver(),
document,
config: await makeConfig({
rules: {
'no-unresolved-refs': 'error',
},
}),
});
expect(replaceSourceWithRef(results, __dirname)).toMatchInlineSnapshot(``);
}); |
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 |
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 |
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:
And the spec provides examples like:
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
orredocly bundle
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:
The text was updated successfully, but these errors were encountered: