redocly-cli
redocly-cli copied to clipboard
`spec-strict-ref` rule failing when $ref used in components section
We're starting to implement the redocly-cli linter into our API documentation.
We have separated out our API definition, specifically with the components
section into separate files, but the @redocly/cli lint
command is failing on rule spec-strict-rules
.
In our openapi.yaml
file we have:
components:
parameters:
$ref: "./parameters/_index.yaml"
securitySchemes:
$ref: "./security-schemes.yaml"
schemas:
$ref: "./schemas/_index.yaml"
examples:
$ref: "./examples/_index.yaml"
The bundle
etc commands all reference these files correctly and pull in the information, but the linter rule is failing.
I'm not sure if this is a bug with the lint rule itself, or an issue with how we have defined our documentation (although given all other operations work, my feeling is it's with the rule).
Do you mean the spec-strict-refs rule? What is the error? What OpenAPI and Redocy CLI versions are?
Sorry @tatomyr , yes I meant the spec-strict-refs
rule. My openapi.yaml
version is 3.1.0 (but also fails on 3.0.0), and my Redocly CLI version is 1.11.0.
A set of files that demonstrates the problem is below:
openapi.yaml
openapi: 3.0.0
info:
version: v1
title: Example
components:
schemas:
$ref: "./schemas.yaml"
paths:
/foo:
get:
responses:
"200":
description: The list of foo.
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/FooModel"
schemas.yaml
FooModel:
type: object
properties:
` Id:
type: number
Name:
type: string
DateOfBirth:
type: string
format: date
redocly.yaml
extends: []
rules:
spec: error
spec-strict-refs: error
Running redocly bundle openapi.yaml
, correctly expands the $ref
under the components/schemas
:
> redocly bundle openapi.yaml
(node:38808) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
bundling .\openapi.yaml...
openapi: 3.0.0
info:
version: v1
title: Example
paths:
/foo:
get:
responses:
'200':
description: The list of foo.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/FooModel'
components:
schemas:
FooModel:
type: object
properties:
Id:
type: number
Name:
type: string
DateOfBirth:
type: string
format: date
Running redocly lint
throws the error on the spec-strict-refs
rule:
(node:71364) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
validating .\openapi.yaml...
[1] openapi.yaml:8:5 at #/components/schemas/$ref
Field $ref is not expected here.
6 | components:
7 | schemas:
8 | $ref: "./schemas.yaml"
9 |
10 | paths:
Error was generated by the spec-strict-refs rule.
.\openapi.yaml: validated in 11ms
❌ Validation failed with 1 error.
run `redocly lint --generate-ignore-file` to add all problems to the ignore file.
According to the OAS 3/3.1 specification, the schemas
property inside the components
must be a map of schema objects (not a $ref): https://spec.openapis.org/oas/v3.1.0#components-object. Although Redocly CLI correctly resolves the $refs in that case, your example is not compliant to the spec (see more about this here). That's what the spec-strict-refs
rule is about.
You have several options here. First, you can go along with the spec and use $refs in other places, e.g.:
openapi: 3.0.0
info:
version: v1
title: Example
components:
schemas:
FooModel:
$ref: "./schemas.yaml#/FooModel"
Second, you can bypass the components
section and refer to the schemas.yaml
file directly (I'd expect this to be the best option), e.g.:
paths:
/foo:
get:
responses:
'200':
description: The list of foo.
content:
application/json:
schema:
type: array
items:
$ref: 'schemas.yaml#/FooModel'
Then, you can turn off this rule or make its severity warning instead of error. And finally, you can suppress this rule for this particular case by generating the ignore file as the linter suggests:
run `redocly lint --generate-ignore-file` to add all problems to the ignore file.
Thanks @tatomyr for this clear explanation. The tool is correctly identifying the $ref
doesn't meet the strict standard, so I'll close this issue.