/** * @fileoverview The instance of Ajv validator. * @author Evgeny Poberezkin */ //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ import Ajv from 'ajv'; //----------------------------------------------------------------------------- // Helpers //----------------------------------------------------------------------------- /* * Copied from ajv/lib/refs/json-schema-draft-04.json * The MIT License (MIT) * Copyright (c) 2015-2017 Evgeny Poberezkin */ const metaSchema = { id: 'http://json-schema.org/draft-04/schema#', $schema: 'http://json-schema.org/draft-04/schema#', description: 'Core schema meta-schema', definitions: { schemaArray: { type: 'array', minItems: 1, items: { $ref: '#' }, }, positiveInteger: { type: 'integer', minimum: 0, }, positiveIntegerDefault0: { allOf: [{ $ref: '#/definitions/positiveInteger' }, { default: 0 }], }, simpleTypes: { enum: [ 'array', 'boolean', 'integer', 'null', 'number', 'object', 'string', ], }, stringArray: { type: 'array', items: { type: 'string' }, minItems: 1, uniqueItems: true, }, }, type: 'object', properties: { id: { type: 'string', }, $schema: { type: 'string', }, title: { type: 'string', }, description: { type: 'string', }, default: {}, multipleOf: { type: 'number', minimum: 0, exclusiveMinimum: true, }, maximum: { type: 'number', }, exclusiveMaximum: { type: 'boolean', default: false, }, minimum: { type: 'number', }, exclusiveMinimum: { type: 'boolean', default: false, }, maxLength: { $ref: '#/definitions/positiveInteger' }, minLength: { $ref: '#/definitions/positiveIntegerDefault0' }, pattern: { type: 'string', format: 'regex', }, additionalItems: { anyOf: [{ type: 'boolean' }, { $ref: '#' }], default: {}, }, items: { anyOf: [{ $ref: '#' }, { $ref: '#/definitions/schemaArray' }], default: {}, }, maxItems: { $ref: '#/definitions/positiveInteger' }, minItems: { $ref: '#/definitions/positiveIntegerDefault0' }, uniqueItems: { type: 'boolean', default: false, }, maxProperties: { $ref: '#/definitions/positiveInteger' }, minProperties: { $ref: '#/definitions/positiveIntegerDefault0' }, required: { $ref: '#/definitions/stringArray' }, additionalProperties: { anyOf: [{ type: 'boolean' }, { $ref: '#' }], default: {}, }, definitions: { type: 'object', additionalProperties: { $ref: '#' }, default: {}, }, properties: { type: 'object', additionalProperties: { $ref: '#' }, default: {}, }, patternProperties: { type: 'object', additionalProperties: { $ref: '#' }, default: {}, }, dependencies: { type: 'object', additionalProperties: { anyOf: [{ $ref: '#' }, { $ref: '#/definitions/stringArray' }], }, }, enum: { type: 'array', minItems: 1, uniqueItems: true, }, type: { anyOf: [ { $ref: '#/definitions/simpleTypes' }, { type: 'array', items: { $ref: '#/definitions/simpleTypes' }, minItems: 1, uniqueItems: true, }, ], }, format: { type: 'string' }, allOf: { $ref: '#/definitions/schemaArray' }, anyOf: { $ref: '#/definitions/schemaArray' }, oneOf: { $ref: '#/definitions/schemaArray' }, not: { $ref: '#' }, }, dependencies: { exclusiveMaximum: ['maximum'], exclusiveMinimum: ['minimum'], }, default: {}, }; //------------------------------------------------------------------------------ // Public Interface //------------------------------------------------------------------------------ export default (additionalOptions = {}) => { const ajv = new Ajv({ meta: false, useDefaults: true, validateSchema: false, missingRefs: 'ignore', verbose: true, schemaId: 'auto', ...additionalOptions, }); ajv.addMetaSchema(metaSchema); // eslint-disable-next-line no-underscore-dangle -- part of the API ajv._opts.defaultMeta = metaSchema.id; return ajv; };