Error with external $ref pointers in open api 3
Fillosof opened this issue · comments
Hi guys.
Recently update from 'swagger 2.0' to 'open api 3'
I used external $ref pointers in my swagger file like this:
paths:
/countries:
$ref: './validator/countries.yaml#/routes/base'
For 'swagger 2.0' it's working perfectly fine but for 'open api 3' it throws an error
TypeError: Cannot read property 'countries.yaml#' of undefined
It began working if we change $ref to this style:
$ref: './validator/countries.yaml/routes/base'
But this is nonconventional use of the $ref that doesn't support by the other libraries.
Is there any solutions for this Issue?
Hi @Fillosof,
Thanks for reporting the problem.
Can you please provide the stack of the error and also if possible definition files for reproducing the problem.
Thank you @kobik for the quick answer.
Here Error stack:
TypeError: Cannot read property 'countries.yaml#' of undefined
at /home/api/node_modules/json-schema-deref-sync/lib/utils.js:84:17
at Array.reduce (<anonymous>)
at Object.getRefPathValue (/home/api/node_modules/json-schema-deref-sync/lib/utils.js:83:15)
at getRefSchema (/home/api/node_modules/json-schema-deref-sync/lib/index.js:99:18)
at Object.<anonymous> (/home/api/node_modules/json-schema-deref-sync/lib/index.js:236:24)
at walker (/home/api/node_modules/traverse/index.js:190:22)
at /home/api/node_modules/traverse/index.js:208:29
at Array.forEach (<anonymous>)
at forEach (/home/api/node_modules/traverse/index.js:298:31)
at walker (/home/api/node_modules/traverse/index.js:203:13)
at /home/api/node_modules/traverse/index.js:208:29
at Array.forEach (<anonymous>)
at forEach (/home/api/node_modules/traverse/index.js:298:31)
at walker (/home/api/node_modules/traverse/index.js:203:13)
at walk (/home/api/node_modules/traverse/index.js:226:7)
at Traverse.forEach (/home/api/node_modules/traverse/index.js:50:18)
at derefSchema (/home/api/node_modules/json-schema-deref-sync/lib/index.js:223:27)
at deref (/home/api/node_modules/json-schema-deref-sync/lib/index.js:310:13)
at Object.buildSchemaSync (/home/api/node_modules/api-schema-builder/src/index.js:35:26)
at Object.init (/home/api/node_modules/express-ajv-swagger-validation/src/middleware.js:25:32)
at Object.<anonymous> (/home/api/dist/server.js:21:28)
at Generator.next (<anonymous>)
and swagger files: link
Thanks @Fillosof, the error is coming from json-schema-deref-sync
.
I'll investigate this further.
@Fillosof are you sure it's working with OIA2?
Do you mean that you've being using the same document, just in OIA2 format?
From what I see the problem is even bigger as json-schema-deref-sync
supports loading only refs to json files and not yaml ones.
This would require us to rethink of how to handle dereferencing properly.
Thank you @kobik
Then all its left is to pray and believe in a bright future.
Because in another case I need precompile swagger file, and its make it 4x bigger, thats slow down startup time by 2-3 sec.((((
@superliuwr Thanks man, you save my day))))
But as I check it's don't support nullable: true
parameters in the type definition((((
So I still need, wait for the update to fully move to OAS 3 (((
@Fillosof, until my fix gets merged, you can achieve nullable like behavior by adding null to the supported types of the property.
timezone:
type:
- 'string'
- 'null'
Quick update,
Waiting for json-schema-deref-sync devs to publish a new version with my fix.
In the meanwhile I've prepared a PR in api-schema-builder.
@kobik Thank You, now I had a hope to clear a mess, that I created to make it work
If you'd like a better json ref resolver, we've got a fantastic one over at stoplightio/json-ref-resolver.
It's powering everything throughout Studio, Prism, Spectral, etc., and is as performant as it is powerful.
Fixed #103