mocks-server / main

Node.js mock server running live, interactive mocks in place of real APIs
https://www.mocks-server.org
Apache License 2.0
281 stars 14 forks source link

Error resolving openapi $ref: JSON Pointer points to missing location: #/components/schemas/Pet #470

Open bogi158 opened 1 year ago

bogi158 commented 1 year ago

Describe the bug Generating mocks from OpenAPI definition is not working whe using $ref to point to some schema.

To Reproduce Download the Petstore example from Swagger Hub, configure mocks server on a Node project and run.

Expected behavior Mocks Server should be able to generate the routes.

Logs One of the many errors:

Error: JSON Pointer points to missing location: #/components/schemas/Pet
             at /.../.../node_modules/@mocks-server/plugin-openapi/dist/openapi.js:172:20
             at Array.map (<anonymous>)...

Operating system, Node.js an npm versions, or browser version (please complete the following information):

Additional context The mock server works if I put all the OpenAPI specification inside the document property of definitions.js, but doesn't if I want to have an external file reference in document with $ref.

// definitions.js
module.exports = [
  {
    basePath: '/example',
    document: {
      $ref: '../documents/example.json',
    },
  },
];
// mocks.config.js
module.exports = {
  // Log level. Can be one of silly, debug, verbose, info, warn or error
  log: 'debug',
  plugins: {
    // Plugins to be registered
    openapi: {
      collection: {
        // Name for the collection created from OpenAPI definitions
        id: 'openapi',
        // Name of the collection to extend from
        // from: undefined,
      },
    },
  },
  mock: {
    routes: {
      // Global delay to apply to routes
      delay: 3000,
    },
    collections: {
      // Selected collection
      selected: 'openapi',
    },
  },
  server: {
    // Port number for the server to be listening at
    port: 6000,
    // Host for the server
    host: '0.0.0.0',
  },
};
javierbrea commented 1 year ago

Hi @bogi158 , I suppose that the error is probably produced because the json-refs module is trying to resolve refs from the root document, which in this case is not the OpenAPI itself, but a ref to the OpenAPI.

Have you tried to fix it using the plugin options refs.subDocPath or refs.location? It also supports defining any other json-refs module options.

{
plugins: {
    openapi: {
      refs: {
         subDocPath: "", // Read the docs for further info about this options
         location: "", // Read the docs for further info about this options
         // You can define any other json-refs option here
       }
    },
  },
}

In any case, it deserves to be investigated further in order to find and document a possible solution. Thanks for reporting it!

bogi158 commented 1 year ago

sorry but I needed to change the mocks library because of the limitation I had, so at the moment I am not using mocks-server and I cannot test your solution. I might try in the future if I have time.