merge-json-schemas

Merge json schemas.


Keywords
merge, json, schema, schemas
License
Other
Install
npm install merge-json-schemas@1.0.0

Documentation

merge-json-schemas

Intended for consumer driven contracts. Define a JSON schema for each consumer of a service, then merge those schemas into a single schema that can be used for validating the service provider.

mergeJsonSchemas will:

  • merge keys in all schemas
  • error if keys are incompatible
  • create of union of "required" values

Usage

import mergeJsonSchemas from 'merge-json-schemas'

const consumer1Schema = {
  type: 'object',
  required: ['name'],
  properties: {
    name: {
      type: 'string',
      maxLength: 20,
    },
  },
};

const consumer2Schema = {
  type: 'object',
  required: ['gender'],
  properties: {
    name: {
      type: 'string',
      minLength: 1,
    },
    gender: {
      type: 'string',
      enum: ['male', 'female'],
    },
  },
};

mergeJsonSchemas([consumer1Schema, consumer2Schema]);

Creates a merged schema of:

{
  type: 'object',
  required: ['name', 'gender'],
  properties: {
    name: {
      type: 'string',
      minLength: 1,
      maxLength: 20,
    },
    gender: {
      type: 'string',
      enum: ['male', 'female'],
    },
  },
}

mergeJsonShemas vs allOf

JSON schema supports an allOf option, which validates against multiple schemas.

const providerSchema = {
  allOf: [consumer1Schema, consumer2Schema]
};

However, mergeJsonSchemas has a few advantages:

  • checks compatability - it validates that the schemas are compatible with each other
  • faster validation - it generates a smaller provider schema for faster validation
  • easier provider design - it provides wholistic representation of what the provider should give to the consumers
  • test factories - using a test factory tool like JSON Schema Factory, you can derive factories from the provider schema for testing all of the consumers (rather than duplicating factories for each consumer).

Contributing

This module is written in ES2015 and converted to node-friendly CommonJS via Babel.

To compile the src directory to build:

npm run build

Deploying a new version

npm version [major|minor|patch]
npm run build
npm publish build # publish the build directory instead of the main directory
git push --follow-tags # update github