Skip to content

Builds a logical conjunction (AND) of multiple JSON schemas

License

Notifications You must be signed in to change notification settings

fastify/merge-json-schemas

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

@fastify/merge-json-schemas

merge-json-schemas is a javascript library that build a logical product (AND) for multiple JSON schemas.

Installation

npm install @fastify/merge-json-schemas

Usage

const assert = require('node:assert')
const { mergeSchemas } = require('@fastify/merge-json-schemas');

const schema1 = {
  $id: 'schema1',
  type: 'object',
  properties: {
    foo: { type: 'string', enum: ['foo1', 'foo2'] },
    bar: { type: 'string', minLength: 3 }
  }
}

const schema2 = {
  $id: 'schema1',
  type: 'object',
  properties: {
    foo: { type: 'string', enum: ['foo1', 'foo3'] },
    bar: { type: 'string', minLength: 5 }
  },
  required: ['foo']
}

const mergedSchema = mergeSchemas([schema1, schema2])
assert.deepStrictEqual(mergedSchema, {
  $id: 'schema1',
  type: 'object',
  properties: {
    foo: { type: 'string', enum: ['foo1'] },
    bar: { type: 'string', minLength: 5 }
  },
  required: ['foo']
})

API

mergeSchemas(schemas, options)

Builds a logical conjunction (AND) of multiple JSON schemas.

  • schemas <objects[]> - list of JSON schemas to merge.
  • options <object> - optional options.
    • resolvers <object> - custom resolvers for JSON schema keywords. Each key is the name of a JSON schema keyword. Each value is a resolver function. See keywordResolver.
    • defaultResolver <function> - custom default resolver for JSON schema keywords. See keywordResolver.
    • onConflict <string> - action to take when a conflict is found. Used by the default defaultResolver. Default is throw. Possible values are:
      • throw - throws an error if found a multiple different schemas for the same keyword.
      • ignore - do nothing if found a multiple different schemas for the same keyword.
      • first - use the value of the first schema if found a multiple different schemas for the same keyword.

resolvers

A list of default resolvers that merge-json-schema uses to merge JSON schemas. You can override the default resolvers by passing a list of custom resolvers in the options argument of mergeSchemas. See keywordResolver.

defaultResolver

A default resolver that merge-json-schema uses to merge JSON schemas. Default resolver is used when no custom resolver is defined for a JSON schema keyword. By default, the default resolver works as follows:

  • If only one schema contains the keyword, the value of the keyword is used as the merged value.
  • If multiple schemas contain the exact same value for the keyword, the value of the keyword is used as the merged value.
  • If multiple schemas contain different values for the keyword, it throws an error.

keywordResolver (keyword, values, mergedSchema, parentSchemas, options)

merge-json-schema uses a set of resolvers to merge JSON schemas. Each resolver is associated with a JSON schema keyword. The resolver is called when the keyword is found in the schemas to merge. The resolver is called with the following arguments:

  • keyword <string> - the name of the keyword to merge.
  • values <any[]> - the values of the keyword to merge. The length of the array is equal to the number of schemas to merge. If a schema does not contain the keyword, the value is undefined.
  • mergedSchema <object> - an instance of the merged schema.
  • parentSchemas <object[]> - the list of parent schemas.
  • options <object> - the options passed to mergeSchemas.

The resolver must set the merged value of the keyword in the mergedSchema object.

Example: resolver for the minNumber keyword.

function minNumberResolver (keyword, values, mergedSchema) {
  mergedSchema[keyword] = Math.min(...values)
}

License

MIT