2025-04-19 23:12:19 -04:00

188 lines
4.4 KiB
JavaScript

/**
* @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;
};