You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
4.2 KiB
146 lines
4.2 KiB
3 years ago
|
# json-schema-resolver
|
||
|
|
||
|
[](https://github.com/Eomm/json-schema-resolver/actions?query=workflow%3Aci)
|
||
|
[](http://standardjs.com/)
|
||
|
|
||
|
Resolve all `$refs` in your [JSON schema](https://json-schema.org/specification.html)!
|
||
|
This module will resolve the `$ref` keyword against the `externalSchemas` you will provide.
|
||
|
By resolving the `$ref` keyword, means that you get back a single BIG inlined JSON schema that does not rely on any external schema.
|
||
|
If a reference is missing, it will not throw any error.
|
||
|
|
||
|
|
||
|
## Install
|
||
|
|
||
|
```sh
|
||
|
npm install json-schema-resolver
|
||
|
```
|
||
|
|
||
|
This plugin support Node.js >= 10
|
||
|
|
||
|
## Usage: resolve one schema against external schemas
|
||
|
|
||
|
The `$ref` string is going to be modified to point to a local reference URI: `#/definitions/<generated key>`.
|
||
|
Moreover, the `definitions` keyword will be decorated with the external schemas to get only one JSON schema resolved as output.
|
||
|
|
||
|
By default the `<generated key>` has the `def-${index}` format.
|
||
|
You can customize it by passing a `buildLocalReference` function as follows:
|
||
|
|
||
|
```js
|
||
|
const RefResolver = require('json-schema-resolver')
|
||
|
|
||
|
const ref = RefResolver({
|
||
|
clone: true, // Clone the input schema without changing it. Default: false,
|
||
|
buildLocalReference (json, baseUri, fragment, i) {
|
||
|
// the `json` that is being resolved
|
||
|
// the `baseUri` object of the schema. Its values is the parse result from https://www.npmjs.com/package/uri-js
|
||
|
// the `fragment` is the `$ref` string when the `$ref` is a relative reference
|
||
|
// the `i` is a local counter to generate a unique key
|
||
|
return `def-${i}` // default value
|
||
|
}
|
||
|
})
|
||
|
|
||
|
const inputSchema = {
|
||
|
$id: 'http://example.com/SimplePerson',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
name: { type: 'string' },
|
||
|
address: { $ref: 'relativeAddress#' },
|
||
|
houses: { type: 'array', items: { $ref: 'relativeAddress#' } }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const addresSchema = {
|
||
|
$id: 'relativeAddress', // Note: prefer always absolute URI like: http://mysite.com
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
zip: { type: 'string' },
|
||
|
city: { type: 'string' }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const singleSchema = ref.resolve(inputSchema, { externalSchemas: [addresSchema] })
|
||
|
// inputSchema is untouched thanks to clone:true
|
||
|
```
|
||
|
|
||
|
`singleSchema` will be like:
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"$id": "http://example.com/SimplePerson",
|
||
|
"type": "object",
|
||
|
"properties": {
|
||
|
"name": {
|
||
|
"type": "string"
|
||
|
},
|
||
|
"address": {
|
||
|
"$ref": "#/definitions/def-0"
|
||
|
},
|
||
|
"houses": {
|
||
|
"type": "array",
|
||
|
"items": {
|
||
|
"$ref": "#/definitions/def-0"
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
"definitions": {
|
||
|
"def-0": {
|
||
|
"$id": "relativeAddress",
|
||
|
"type": "object",
|
||
|
"properties": {
|
||
|
"zip": {
|
||
|
"type": "string"
|
||
|
},
|
||
|
"city": {
|
||
|
"type": "string"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Usage: resolve multiple schemas against external shared schemas
|
||
|
|
||
|
When you have multiple schemas to resolve against a collection of shared schema you need to use this
|
||
|
module with little changes.
|
||
|
|
||
|
This is needed to have all the same definitions path (`#/definitions/<generated key>`) across all the
|
||
|
root schemas
|
||
|
|
||
|
```js
|
||
|
const ref = RefResolver({
|
||
|
clone: true, // Clone the input schema without changing it. Default: false
|
||
|
applicationUri: 'my-application.org', // You need to provide an unique URI to resolve relative `$id`s
|
||
|
externalSchemas: [addresSchema] // The schemas provided at the creation of the resolver, will be used evvery time `.resolve` will be called
|
||
|
})
|
||
|
|
||
|
const inputSchema = {
|
||
|
$id: 'http://example.com/SimplePerson',
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
name: { type: 'string' },
|
||
|
address: { $ref: 'relativeAddress#' },
|
||
|
houses: { type: 'array', items: { $ref: 'relativeAddress#' } }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// the resolved schema DOES NOT have definitions added
|
||
|
const singleSchema = ref.resolve(inputSchema)
|
||
|
const anotherResolvedSchema = ref.resolve(input_2_Schema) // resolve schemas within the same externalSchemas
|
||
|
|
||
|
// to get the definition you need only to call:
|
||
|
const sharedDefinitions = ref.definitions()
|
||
|
```
|
||
|
|
||
|
## Debug
|
||
|
|
||
|
To debug this module, simply set:
|
||
|
|
||
|
```bash
|
||
|
export DEBUG=json-schema-resolver
|
||
|
```
|
||
|
|
||
|
## License
|
||
|
|
||
|
Licensed under [MIT](./LICENSE).
|