You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
5.2 KiB
191 lines
5.2 KiB
/** |
|
* @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 |
|
ajv._opts.defaultMeta = metaSchema.id; |
|
|
|
return ajv; |
|
};
|
|
|