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