192 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			5.2 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
 | |
|     ajv._opts.defaultMeta = metaSchema.id;
 | |
| 
 | |
|     return ajv;
 | |
| };
 |