Skip to content
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

Error with external $ref pointers in open api 3 #95

Closed
Fillosof opened this issue Sep 6, 2019 · 14 comments
Closed

Error with external $ref pointers in open api 3 #95

Fillosof opened this issue Sep 6, 2019 · 14 comments

Comments

@Fillosof
Copy link

Fillosof commented Sep 6, 2019

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?

@kobik
Copy link
Collaborator

kobik commented Sep 6, 2019

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.

@Fillosof
Copy link
Author

Fillosof commented Sep 6, 2019

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

@kobik
Copy link
Collaborator

kobik commented Sep 6, 2019

Thanks @Fillosof, the error is coming from json-schema-deref-sync.

I'll investigate this further.

@kobik
Copy link
Collaborator

kobik commented Sep 7, 2019

@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.

@Fillosof
Copy link
Author

Fillosof commented Sep 9, 2019

@kobik I think issue somewhere in the parser.
Here old swagger 2.0 files.
It's yaml too but work without any issues.

@kobik
Copy link
Collaborator

kobik commented Sep 10, 2019

It is indeed json-schema-deref-sync not handling yaml files.
You can see the issue I've opened here and the PR for fixing this issue here, although I'm not sure the maintainer would like to add this functionality.

@Fillosof
Copy link
Author

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
Copy link
Contributor

Hi @kobik @Fillosof, it appears you have found the root cause and thanks for the effort. Just want to let you know I had the same issue after upgrading to 1.0.8 but it worked well with 0.9.0.

@Fillosof
Copy link
Author

Fillosof commented Sep 11, 2019

@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 (((

@kobik
Copy link
Collaborator

kobik commented Sep 15, 2019

@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'

@kobik
Copy link
Collaborator

kobik commented Sep 19, 2019

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.

@Fillosof
Copy link
Author

@kobik Thank You, now I had a hope to clear a mess, that I created to make it work

@philsturgeon
Copy link

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.

@kobik
Copy link
Collaborator

kobik commented Dec 31, 2019

Fixed #103

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

4 participants