json-refs icon indicating copy to clipboard operation
json-refs copied to clipboard

Allow custom loader to be provided

Open jammi opened this issue 5 years ago • 1 comments

My use-case is that I have an object of objects, for which there are no real correspending files (let's say they come from a database), let's say:

const oaData = {
  'index.foo': {openapi: '3.0.2', ...},
  'schemas.foo': {...}
};

and my refs are like:

{ $ref: 'schemas.foo#/components/schemas/foofoo' }

When json-refs is used with it like this, there's no real way to fetch such references with a processContent function because PathLoader will try to resolve to process.cwd() and of course won't find such files.

What I suggest is providing an option for a simple function that gets an unmangled uri and then either returns an object (or error) as-is (synchronous), or returns a promise (asynchronous). You could name it customLoader or somesuch.

It could even have some matcher function to provide a way to validate whether to use the customLoader or fall back to PathLoader ending up with a simplest use-case (using the oaData from above) such as:

resolveRefs(oaData['index.foo'], {
  useCustomLoader: uri => !!oaData[uri],
  customLoader: uri => oaData[uri]
}).then(buildAPI);

or let's say from an async database loader such as:

resolveRefs(oaIndex, {
  overrideLoader: uri.startsWith('mydb://'),
  customLoader: uri => dbLoader(uri).then(res => JSON.parse(res.oa_data))
}).then(buildAPI);

jammi avatar May 23 '19 17:05 jammi

I guess it's time I get this supported: https://github.com/whitlockjc/path-loader/issues/1

whitlockjc avatar May 24 '19 21:05 whitlockjc