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
						
					
					
				# 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).
 |