'use strict'; var compileSchema = require('./compile') , resolve = require('./compile/resolve') , Cache = require('./cache') , SchemaObject = require('./compile/schema_obj') , stableStringify = require('json-stable-stringify') , formats = require('./compile/formats') , rules = require('./compile/rules') , v5 = require('./v5'); module.exports = Ajv; Ajv.prototype.compileAsync = require('./async'); Ajv.prototype.addKeyword = require('./keyword'); var META_SCHEMA_ID = 'http://json-schema.org/draft-04/schema'; var SCHEMA_URI_FORMAT = /^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i; function SCHEMA_URI_FORMAT_FUNC(str) { return SCHEMA_URI_FORMAT.test(str); } /** * Creates validator instance. * Usage: `Ajv(opts)` * @param {Object} opts optional options * @return {Object} ajv instance */ function Ajv(opts) { if (!(this instanceof Ajv)) return new Ajv(opts); var self = this; this.opts = opts || {}; this._schemas = {}; this._refs = {}; this._formats = formats(this.opts.format); this._cache = this.opts.cache || new Cache; this._loadingSchemas = {}; this.RULES = rules(); // this is done on purpose, so that methods are bound to the instance // (without using bind) so that they can be used without the instance this.validate = validate; this.compile = compile; this.addSchema = addSchema; this.addMetaSchema = addMetaSchema; this.validateSchema = validateSchema; this.getSchema = getSchema; this.removeSchema = removeSchema; this.addFormat = addFormat; this.errorsText = errorsText; this._addSchema = _addSchema; this._compile = _compile; addInitialSchemas(); if (this.opts.formats) addInitialFormats(); if (this.opts.errorDataPath == 'property') this.opts._errorDataPathProperty = true; if (this.opts.v5) v5.enable(this); this.opts.loopRequired = this.opts.loopRequired || Infinity; /** * Validate data using schema * Schema will be compiled and cached (using serialized JSON as key. [json-stable-stringify](https://github.com/substack/json-stable-stringify) is used to serialize. * @param {String|Object} schemaKeyRef key, ref or schema object * @param {Any} data to be validated * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). */ function validate(schemaKeyRef, data) { var v; if (typeof schemaKeyRef == 'string') { v = getSchema(schemaKeyRef); if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); } else { var schemaObj = _addSchema(schemaKeyRef); v = schemaObj.validate || _compile(schemaObj); } var valid = v(data); self.errors = v.errors; return valid; } /** * Create validating function for passed schema. * @param {String|Object} schema * @return {Function} validating function */ function compile(schema) { var schemaObj = _addSchema(schema); return schemaObj.validate || _compile(schemaObj); } /** * Adds schema to the instance. * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` will be ignored. * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. */ function addSchema(schema, key, _skipValidation, _meta) { if (Array.isArray(schema)){ for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. * @param {Object} opts optional options with properties `separator` and `dataVar`. * @return {String} */ function errorsText(errors, opts) { errors = errors || self.errors; if (!errors) return 'No errors'; opts = opts || {}; var separator = opts.separator || ', '; var dataVar = opts.dataVar || 'data'; var text = ''; for (var i=0; i