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