2017-08-30 11:50:27 +03:00
"use strict" ;
const global = this ;
2016-06-20 18:53:55 +03:00
this . EXPORTED _SYMBOLS = [ "Ajv" ] ;
/ *
* ajv 4.1 . 1 : Another JSON Schema Validator
*
* https : //github.com/epoberezkin/ajv
*
* The MIT License ( MIT )
*
* Copyright ( c ) 2015 Evgeny Poberezkin
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the "Software" ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software .
* THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
* /
// Everything below this comment was taken from the `dist/ajv.bundle.js` in the
// ajv node module. (You can get this by running `npm install ajv` in an empty
// directory and copying `node_modules/ajv/dist/ajv.bundle.js`).
( function ( f ) { if ( typeof exports === "object" && typeof module !== "undefined" ) { module . exports = f ( ) } else if ( typeof define === "function" && define . amd ) { define ( [ ] , f ) } else { var g ; if ( typeof window !== "undefined" ) { g = window } else if ( typeof global !== "undefined" ) { g = global } else if ( typeof self !== "undefined" ) { g = self } else { g = this } g . Ajv = f ( ) } } ) ( function ( ) { var define , module , exports ; return ( function e ( t , n , r ) { function s ( o , u ) { if ( ! n [ o ] ) { if ( ! t [ o ] ) { var a = typeof require == "function" && require ; if ( ! u && a ) return a ( o , ! 0 ) ; if ( i ) return i ( o , ! 0 ) ; var f = new Error ( "Cannot find module '" + o + "'" ) ; throw f . code = "MODULE_NOT_FOUND" , f } var l = n [ o ] = { exports : { } } ; t [ o ] [ 0 ] . call ( l . exports , function ( e ) { var n = t [ o ] [ 1 ] [ e ] ; return s ( n ? n : e ) } , l , l . exports , e , t , n , r ) } return n [ o ] . exports } var i = typeof require == "function" && require ; for ( var o = 0 ; o < r . length ; o ++ ) s ( r [ o ] ) ; return s } ) ( { 1 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = {
setup : setupAsync ,
compile : compileAsync
} ;
var util = require ( './compile/util' ) ;
var ASYNC = {
'*' : checkGenerators ,
'co*' : checkGenerators ,
'es7' : checkAsyncFunction
} ;
var TRANSPILE = {
'nodent' : getNodent ,
'regenerator' : getRegenerator
} ;
var MODES = [
{ async : 'co*' } ,
{ async : 'es7' , transpile : 'nodent' } ,
{ async : 'co*' , transpile : 'regenerator' }
] ;
var regenerator , nodent ;
function setupAsync ( opts , required ) {
if ( required !== false ) required = true ;
var async = opts . async
, transpile = opts . transpile
, check ;
switch ( typeof transpile ) {
case 'string' :
var get = TRANSPILE [ transpile ] ;
if ( ! get ) throw new Error ( 'bad transpiler: ' + transpile ) ;
return ( opts . _transpileFunc = get ( opts , required ) ) ;
case 'undefined' :
case 'boolean' :
if ( typeof async == 'string' ) {
check = ASYNC [ async ] ;
if ( ! check ) throw new Error ( 'bad async mode: ' + async ) ;
return ( opts . transpile = check ( opts , required ) ) ;
}
for ( var i = 0 ; i < MODES . length ; i ++ ) {
var _opts = MODES [ i ] ;
if ( setupAsync ( _opts , false ) ) {
util . copy ( _opts , opts ) ;
return opts . transpile ;
}
}
/* istanbul ignore next */
throw new Error ( 'generators, nodent and regenerator are not available' ) ;
case 'function' :
return ( opts . _transpileFunc = opts . transpile ) ;
default :
throw new Error ( 'bad transpiler: ' + transpile ) ;
}
}
function checkGenerators ( opts , required ) {
/* jshint evil: true */
try {
eval ( '(function*(){})()' ) ;
return true ;
} catch ( e ) {
/* istanbul ignore next */
if ( required ) throw new Error ( 'generators not supported' ) ;
}
}
function checkAsyncFunction ( opts , required ) {
/* jshint evil: true */
try {
eval ( '(async function(){})()' ) ;
/* istanbul ignore next */
return true ;
} catch ( e ) {
if ( required ) throw new Error ( 'es7 async functions not supported' ) ;
}
}
function getRegenerator ( opts , required ) {
try {
if ( ! regenerator ) {
regenerator = require ( '' + 'regenerator' ) ;
regenerator . runtime ( ) ;
}
if ( ! opts . async || opts . async === true )
opts . async = 'es7' ;
return regeneratorTranspile ;
} catch ( e ) {
/* istanbul ignore next */
if ( required ) throw new Error ( 'regenerator not available' ) ;
}
}
function regeneratorTranspile ( code ) {
return regenerator . compile ( code ) . code ;
}
function getNodent ( opts , required ) {
/* jshint evil: true */
try {
if ( ! nodent ) nodent = require ( '' + 'nodent' ) ( { log : false , dontInstallRequireHook : true } ) ;
if ( opts . async != 'es7' ) {
if ( opts . async && opts . async !== true ) console . warn ( 'nodent transpiles only es7 async functions' ) ;
opts . async = 'es7' ;
}
return nodentTranspile ;
} catch ( e ) {
/* istanbul ignore next */
if ( required ) throw new Error ( 'nodent not available' ) ;
}
}
function nodentTranspile ( code ) {
return nodent . compile ( code , '' , { promises : true , sourcemap : false } ) . code ;
}
/ * *
* Creates validating function for passed schema with asynchronous loading of missing schemas .
* ` loadSchema ` option should be a function that accepts schema uri and node - style callback .
* @ this Ajv
* @ param { Object } schema schema object
* @ param { Function } callback node - style callback , it is always called with 2 parameters : error ( or null ) and validating function .
* /
function compileAsync ( schema , callback ) {
/* eslint no-shadow: 0 */
/* jshint validthis: true */
var schemaObj ;
var self = this ;
try {
schemaObj = this . _addSchema ( schema ) ;
} catch ( e ) {
setTimeout ( function ( ) { callback ( e ) ; } ) ;
return ;
}
if ( schemaObj . validate ) {
setTimeout ( function ( ) { callback ( null , schemaObj . validate ) ; } ) ;
} else {
if ( typeof this . _opts . loadSchema != 'function' )
throw new Error ( 'options.loadSchema should be a function' ) ;
_compileAsync ( schema , callback , true ) ;
}
function _compileAsync ( schema , callback , firstCall ) {
var validate ;
try { validate = self . compile ( schema ) ; }
catch ( e ) {
if ( e . missingSchema ) loadMissingSchema ( e ) ;
else deferCallback ( e ) ;
return ;
}
deferCallback ( null , validate ) ;
function loadMissingSchema ( e ) {
var ref = e . missingSchema ;
if ( self . _refs [ ref ] || self . _schemas [ ref ] )
return callback ( new Error ( 'Schema ' + ref + ' is loaded but' + e . missingRef + 'cannot be resolved' ) ) ;
var _callbacks = self . _loadingSchemas [ ref ] ;
if ( _callbacks ) {
if ( typeof _callbacks == 'function' )
self . _loadingSchemas [ ref ] = [ _callbacks , schemaLoaded ] ;
else
_callbacks [ _callbacks . length ] = schemaLoaded ;
} else {
self . _loadingSchemas [ ref ] = schemaLoaded ;
self . _opts . loadSchema ( ref , function ( err , sch ) {
var _callbacks = self . _loadingSchemas [ ref ] ;
delete self . _loadingSchemas [ ref ] ;
if ( typeof _callbacks == 'function' ) {
_callbacks ( err , sch ) ;
} else {
for ( var i = 0 ; i < _callbacks . length ; i ++ )
_callbacks [ i ] ( err , sch ) ;
}
} ) ;
}
function schemaLoaded ( err , sch ) {
if ( err ) return callback ( err ) ;
if ( ! ( self . _refs [ ref ] || self . _schemas [ ref ] ) ) {
try {
self . addSchema ( sch , ref ) ;
} catch ( e ) {
callback ( e ) ;
return ;
}
}
_compileAsync ( schema , callback ) ;
}
}
function deferCallback ( err , validate ) {
if ( firstCall ) setTimeout ( function ( ) { callback ( err , validate ) ; } ) ;
else return callback ( err , validate ) ;
}
}
}
} , { "./compile/util" : 10 } ] , 2 : [ function ( require , module , exports ) {
'use strict' ;
var Cache = module . exports = function Cache ( ) {
this . _cache = { } ;
} ;
Cache . prototype . put = function Cache _put ( key , value ) {
this . _cache [ key ] = value ;
} ;
Cache . prototype . get = function Cache _get ( key ) {
return this . _cache [ key ] ;
} ;
Cache . prototype . del = function Cache _del ( key ) {
delete this . _cache [ key ] ;
} ;
Cache . prototype . clear = function Cache _clear ( ) {
this . _cache = { } ;
} ;
} , { } ] , 3 : [ function ( require , module , exports ) {
'use strict' ;
//all requires must be explicit because browserify won't work with dynamic requires
module . exports = {
'$ref' : require ( '../dotjs/ref' ) ,
allOf : require ( '../dotjs/allOf' ) ,
anyOf : require ( '../dotjs/anyOf' ) ,
dependencies : require ( '../dotjs/dependencies' ) ,
'enum' : require ( '../dotjs/enum' ) ,
format : require ( '../dotjs/format' ) ,
items : require ( '../dotjs/items' ) ,
maximum : require ( '../dotjs/_limit' ) ,
minimum : require ( '../dotjs/_limit' ) ,
maxItems : require ( '../dotjs/_limitItems' ) ,
minItems : require ( '../dotjs/_limitItems' ) ,
maxLength : require ( '../dotjs/_limitLength' ) ,
minLength : require ( '../dotjs/_limitLength' ) ,
maxProperties : require ( '../dotjs/_limitProperties' ) ,
minProperties : require ( '../dotjs/_limitProperties' ) ,
multipleOf : require ( '../dotjs/multipleOf' ) ,
not : require ( '../dotjs/not' ) ,
oneOf : require ( '../dotjs/oneOf' ) ,
pattern : require ( '../dotjs/pattern' ) ,
properties : require ( '../dotjs/properties' ) ,
required : require ( '../dotjs/required' ) ,
uniqueItems : require ( '../dotjs/uniqueItems' ) ,
validate : require ( '../dotjs/validate' )
} ;
} , { "../dotjs/_limit" : 13 , "../dotjs/_limitItems" : 14 , "../dotjs/_limitLength" : 15 , "../dotjs/_limitProperties" : 16 , "../dotjs/allOf" : 17 , "../dotjs/anyOf" : 18 , "../dotjs/dependencies" : 20 , "../dotjs/enum" : 21 , "../dotjs/format" : 22 , "../dotjs/items" : 23 , "../dotjs/multipleOf" : 24 , "../dotjs/not" : 25 , "../dotjs/oneOf" : 26 , "../dotjs/pattern" : 27 , "../dotjs/properties" : 29 , "../dotjs/ref" : 30 , "../dotjs/required" : 31 , "../dotjs/uniqueItems" : 33 , "../dotjs/validate" : 34 } ] , 4 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function equal ( a , b ) {
if ( a === b ) return true ;
var arrA = Array . isArray ( a )
, arrB = Array . isArray ( b )
, i ;
if ( arrA && arrB ) {
if ( a . length != b . length ) return false ;
for ( i = 0 ; i < a . length ; i ++ )
if ( ! equal ( a [ i ] , b [ i ] ) ) return false ;
return true ;
}
if ( arrA != arrB ) return false ;
if ( a && b && typeof a === 'object' && typeof b === 'object' ) {
var keys = Object . keys ( a ) ;
if ( keys . length !== Object . keys ( b ) . length ) return false ;
for ( i = 0 ; i < keys . length ; i ++ )
if ( b [ keys [ i ] ] === undefined ) return false ;
for ( i = 0 ; i < keys . length ; i ++ )
if ( ! equal ( a [ keys [ i ] ] , b [ keys [ i ] ] ) ) return false ;
return true ;
}
return false ;
} ;
} , { } ] , 5 : [ function ( require , module , exports ) {
'use strict' ;
var util = require ( './util' ) ;
var DATE = /^\d\d\d\d-(\d\d)-(\d\d)$/ ;
var DAYS = [ 0 , 31 , 29 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 ] ;
var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d:\d\d)?$/i ;
var HOSTNAME = /^[a-z](?:(?:[-0-9a-z]{0,61})?[0-9a-z])?(\.[a-z](?:(?:[-0-9a-z]{0,61})?[0-9a-z])?)*$/i ;
var URI = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9a-f]{2})*)?(?:\#(?:[a-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9a-f]{2})*)?$/i ;
var UUID = /^(?:urn\:uuid\:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i ;
var JSON _POINTER = /^(?:\/(?:[^~\/]|~0|~1)+)*(?:\/)?$|^\#(?:\/(?:[a-z0-9_\-\.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)+)*(?:\/)?$/i ;
var RELATIVE _JSON _POINTER = /^(?:0|[1-9][0-9]*)(?:\#|(?:\/(?:[^~\/]|~0|~1)+)*(?:\/)?)$/ ;
module . exports = formats ;
function formats ( mode ) {
mode = mode == 'full' ? 'full' : 'fast' ;
var formatDefs = util . copy ( formats [ mode ] ) ;
for ( var fName in formats . compare ) {
formatDefs [ fName ] = {
validate : formatDefs [ fName ] ,
compare : formats . compare [ fName ]
} ;
}
return formatDefs ;
}
formats . fast = {
// date: http://tools.ietf.org/html/rfc3339#section-5.6
date : /^\d\d\d\d-[0-1]\d-[0-3]\d$/ ,
// date-time: http://tools.ietf.org/html/rfc3339#section-5.6
time : /^[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i ,
'date-time' : /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)$/i ,
// uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js
uri : /^(?:[a-z][a-z0-9+-.]*)?(?:\:|\/)\/?[^\s]*$/i ,
// email (sources from jsen validator):
// http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363
// http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')
email : /^[a-z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i ,
hostname : HOSTNAME ,
// optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
ipv4 : /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/ ,
// optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
ipv6 : /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i ,
regex : regex ,
// uuid: http://tools.ietf.org/html/rfc4122
uuid : UUID ,
// JSON-pointer: https://tools.ietf.org/html/rfc6901
// uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A
'json-pointer' : JSON _POINTER ,
// relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00
'relative-json-pointer' : RELATIVE _JSON _POINTER
} ;
formats . full = {
date : date ,
time : time ,
'date-time' : date _time ,
uri : uri ,
email : /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i ,
hostname : hostname ,
ipv4 : /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/ ,
ipv6 : /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i ,
regex : regex ,
uuid : UUID ,
'json-pointer' : JSON _POINTER ,
'relative-json-pointer' : RELATIVE _JSON _POINTER
} ;
formats . compare = {
date : compareDate ,
time : compareTime ,
'date-time' : compareDateTime
} ;
function date ( str ) {
// full-date from http://tools.ietf.org/html/rfc3339#section-5.6
var matches = str . match ( DATE ) ;
if ( ! matches ) return false ;
var month = + matches [ 1 ] ;
var day = + matches [ 2 ] ;
return month >= 1 && month <= 12 && day >= 1 && day <= DAYS [ month ] ;
}
function time ( str , full ) {
var matches = str . match ( TIME ) ;
if ( ! matches ) return false ;
var hour = matches [ 1 ] ;
var minute = matches [ 2 ] ;
var second = matches [ 3 ] ;
var timeZone = matches [ 5 ] ;
return hour <= 23 && minute <= 59 && second <= 59 && ( ! full || timeZone ) ;
}
var DATE _TIME _SEPARATOR = /t|\s/i ;
function date _time ( str ) {
// http://tools.ietf.org/html/rfc3339#section-5.6
var dateTime = str . split ( DATE _TIME _SEPARATOR ) ;
return date ( dateTime [ 0 ] ) && time ( dateTime [ 1 ] , true ) ;
}
function hostname ( str ) {
// http://tools.ietf.org/html/rfc1034#section-3.5
return str . length <= 255 && HOSTNAME . test ( str ) ;
}
var NOT _URI _FRAGMENT = /\/|\:/ ;
function uri ( str ) {
// http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "."
return NOT _URI _FRAGMENT . test ( str ) && URI . test ( str ) ;
}
function regex ( str ) {
try {
new RegExp ( str ) ;
return true ;
} catch ( e ) {
return false ;
}
}
function compareDate ( d1 , d2 ) {
if ( ! ( d1 && d2 ) ) return ;
if ( d1 > d2 ) return 1 ;
if ( d1 < d2 ) return - 1 ;
if ( d1 === d2 ) return 0 ;
}
function compareTime ( t1 , t2 ) {
if ( ! ( t1 && t2 ) ) return ;
t1 = t1 . match ( TIME ) ;
t2 = t2 . match ( TIME ) ;
if ( ! ( t1 && t2 ) ) return ;
t1 = t1 [ 1 ] + t1 [ 2 ] + t1 [ 3 ] + ( t1 [ 4 ] || '' ) ;
t2 = t2 [ 1 ] + t2 [ 2 ] + t2 [ 3 ] + ( t2 [ 4 ] || '' ) ;
if ( t1 > t2 ) return 1 ;
if ( t1 < t2 ) return - 1 ;
if ( t1 === t2 ) return 0 ;
}
function compareDateTime ( dt1 , dt2 ) {
if ( ! ( dt1 && dt2 ) ) return ;
dt1 = dt1 . split ( DATE _TIME _SEPARATOR ) ;
dt2 = dt2 . split ( DATE _TIME _SEPARATOR ) ;
var res = compareDate ( dt1 [ 0 ] , dt2 [ 0 ] ) ;
if ( res === undefined ) return ;
return res || compareTime ( dt1 [ 1 ] , dt2 [ 1 ] ) ;
}
} , { "./util" : 10 } ] , 6 : [ function ( require , module , exports ) {
'use strict' ;
var resolve = require ( './resolve' )
, util = require ( './util' )
, stableStringify = require ( 'json-stable-stringify' )
, async = require ( '../async' ) ;
var beautify = ( function ( ) { try { return require ( '' + 'js-beautify' ) . js _beautify ; } catch ( e ) { /*empty*/ } } ) ( ) ;
var validateGenerator = require ( '../dotjs/validate' ) ;
module . exports = compile ;
/ * *
* Compiles schema to validation function
* @ this Ajv
* @ param { Object } schema schema object
* @ param { Object } root object with information about the root schema for this schema
* @ param { Object } localRefs the hash of local references inside the schema ( created by resolve . id ) , used for inline resolution
* @ param { String } baseId base ID for IDs in the schema
* @ return { Function } validation function
* /
function compile ( schema , root , localRefs , baseId ) {
/* jshint validthis: true, evil: true */
/* eslint no-shadow: 0 */
var self = this
, opts = this . _opts
, refVal = [ undefined ]
, refs = { }
, patterns = [ ]
, patternsHash = { }
, defaults = [ ]
, defaultsHash = { }
, customRules = [ ] ;
root = root || { schema : schema , refVal : refVal , refs : refs } ;
var formats = this . _formats ;
var RULES = this . RULES ;
return localCompile ( schema , root , localRefs , baseId ) ;
function localCompile ( _schema , _root , localRefs , baseId ) {
var isRoot = ! _root || ( _root && _root . schema == _schema ) ;
if ( _root . schema != root . schema )
return compile . call ( self , _schema , _root , localRefs , baseId ) ;
var $async = _schema . $async === true ;
if ( $async && ! opts . transpile ) async . setup ( opts ) ;
var sourceCode = validateGenerator ( {
isTop : true ,
schema : _schema ,
isRoot : isRoot ,
baseId : baseId ,
root : _root ,
schemaPath : '' ,
errSchemaPath : '#' ,
errorPath : '""' ,
RULES : RULES ,
validate : validateGenerator ,
util : util ,
resolve : resolve ,
resolveRef : resolveRef ,
usePattern : usePattern ,
useDefault : useDefault ,
useCustomRule : useCustomRule ,
opts : opts ,
formats : formats ,
self : self
} ) ;
sourceCode = vars ( refVal , refValCode ) + vars ( patterns , patternCode )
+ vars ( defaults , defaultCode ) + vars ( customRules , customRuleCode )
+ sourceCode ;
if ( opts . beautify ) {
/* istanbul ignore else */
if ( beautify ) sourceCode = beautify ( sourceCode , opts . beautify ) ;
else console . error ( '"npm install js-beautify" to use beautify option' ) ;
}
// console.log('\n\n\n *** \n', sourceCode);
var validate , validateCode
, transpile = opts . _transpileFunc ;
try {
validateCode = $async && transpile
? transpile ( sourceCode )
: sourceCode ;
eval ( validateCode ) ;
refVal [ 0 ] = validate ;
} catch ( e ) {
console . error ( 'Error compiling schema, function code:' , validateCode ) ;
throw e ;
}
validate . schema = _schema ;
validate . errors = null ;
validate . refs = refs ;
validate . refVal = refVal ;
validate . root = isRoot ? validate : _root ;
if ( $async ) validate . $async = true ;
validate . sourceCode = sourceCode ;
return validate ;
}
function resolveRef ( baseId , ref , isRoot ) {
ref = resolve . url ( baseId , ref ) ;
var refIndex = refs [ ref ] ;
var _refVal , refCode ;
if ( refIndex !== undefined ) {
_refVal = refVal [ refIndex ] ;
refCode = 'refVal[' + refIndex + ']' ;
return resolvedRef ( _refVal , refCode ) ;
}
if ( ! isRoot ) {
var rootRefId = root . refs [ ref ] ;
if ( rootRefId !== undefined ) {
_refVal = root . refVal [ rootRefId ] ;
refCode = addLocalRef ( ref , _refVal ) ;
return resolvedRef ( _refVal , refCode ) ;
}
}
refCode = addLocalRef ( ref ) ;
var v = resolve . call ( self , localCompile , root , ref ) ;
if ( ! v ) {
var localSchema = localRefs && localRefs [ ref ] ;
if ( localSchema ) {
v = resolve . inlineRef ( localSchema , opts . inlineRefs )
? localSchema
: compile . call ( self , localSchema , root , localRefs , baseId ) ;
}
}
if ( v ) {
replaceLocalRef ( ref , v ) ;
return resolvedRef ( v , refCode ) ;
}
}
function addLocalRef ( ref , v ) {
var refId = refVal . length ;
refVal [ refId ] = v ;
refs [ ref ] = refId ;
return 'refVal' + refId ;
}
function replaceLocalRef ( ref , v ) {
var refId = refs [ ref ] ;
refVal [ refId ] = v ;
}
function resolvedRef ( refVal , code ) {
return typeof refVal == 'object'
? { code : code , schema : refVal , inline : true }
: { code : code , $async : refVal && refVal . $async } ;
}
function usePattern ( regexStr ) {
var index = patternsHash [ regexStr ] ;
if ( index === undefined ) {
index = patternsHash [ regexStr ] = patterns . length ;
patterns [ index ] = regexStr ;
}
return 'pattern' + index ;
}
function useDefault ( value ) {
switch ( typeof value ) {
case 'boolean' :
case 'number' :
return '' + value ;
case 'string' :
return util . toQuotedString ( value ) ;
case 'object' :
if ( value === null ) return 'null' ;
var valueStr = stableStringify ( value ) ;
var index = defaultsHash [ valueStr ] ;
if ( index === undefined ) {
index = defaultsHash [ valueStr ] = defaults . length ;
defaults [ index ] = value ;
}
return 'default' + index ;
}
}
function useCustomRule ( rule , schema , parentSchema , it ) {
var compile = rule . definition . compile
, inline = rule . definition . inline
, macro = rule . definition . macro ;
var validate ;
if ( compile ) {
validate = compile . call ( self , schema , parentSchema ) ;
} else if ( macro ) {
validate = macro . call ( self , schema , parentSchema ) ;
if ( opts . validateSchema !== false ) self . validateSchema ( validate , true ) ;
} else if ( inline ) {
validate = inline . call ( self , it , rule . keyword , schema , parentSchema ) ;
} else {
validate = rule . definition . validate ;
}
var index = customRules . length ;
customRules [ index ] = validate ;
return {
code : 'customRule' + index ,
validate : validate
} ;
}
}
function patternCode ( i , patterns ) {
return 'var pattern' + i + ' = new RegExp(' + util . toQuotedString ( patterns [ i ] ) + ');' ;
}
function defaultCode ( i ) {
return 'var default' + i + ' = defaults[' + i + '];' ;
}
function refValCode ( i , refVal ) {
return refVal [ i ] ? 'var refVal' + i + ' = refVal[' + i + '];' : '' ;
}
function customRuleCode ( i ) {
return 'var customRule' + i + ' = customRules[' + i + '];' ;
}
function vars ( arr , statement ) {
if ( ! arr . length ) return '' ;
var code = '' ;
for ( var i = 0 ; i < arr . length ; i ++ )
code += statement ( i , arr ) ;
return code ;
}
/*eslint-disable no-unused-vars */
/ * *
* Functions below are used inside compiled validations function
* /
var co = require ( 'co' ) ;
var ucs2length = util . ucs2length ;
var equal = require ( './equal' ) ;
// this error is thrown by async schemas to return validation errors via exception
var ValidationError = require ( './validation_error' ) ;
/*eslint-enable no-unused-vars */
} , { "../async" : 1 , "../dotjs/validate" : 34 , "./equal" : 4 , "./resolve" : 7 , "./util" : 10 , "./validation_error" : 11 , "co" : 45 , "json-stable-stringify" : 46 } ] , 7 : [ function ( require , module , exports ) {
'use strict' ;
var url = require ( 'url' )
, equal = require ( './equal' )
, util = require ( './util' )
, SchemaObject = require ( './schema_obj' ) ;
module . exports = resolve ;
resolve . normalizeId = normalizeId ;
resolve . fullPath = getFullPath ;
resolve . url = resolveUrl ;
resolve . ids = resolveIds ;
resolve . inlineRef = inlineRef ;
/ * *
* [ resolve and compile the references ( $ref ) ]
* @ this Ajv
* @ param { Function } compile reference to schema compilation funciton ( localCompile )
* @ param { Object } root object with information about the root schema for the current schema
* @ param { String } ref reference to resolve
* @ return { Object | Function } schema object ( if the schema can be inlined ) or validation function
* /
function resolve ( compile , root , ref ) {
/* jshint validthis: true */
var refVal = this . _refs [ ref ] ;
if ( typeof refVal == 'string' ) {
if ( this . _refs [ refVal ] ) refVal = this . _refs [ refVal ] ;
else return resolve . call ( this , compile , root , refVal ) ;
}
refVal = refVal || this . _schemas [ ref ] ;
if ( refVal instanceof SchemaObject ) {
return inlineRef ( refVal . schema , this . _opts . inlineRefs )
? refVal . schema
: refVal . validate || this . _compile ( refVal ) ;
}
var res = _resolve . call ( this , root , ref ) ;
var schema , v , baseId ;
if ( res ) {
schema = res . schema ;
root = res . root ;
baseId = res . baseId ;
}
if ( schema instanceof SchemaObject ) {
v = schema . validate || compile . call ( this , schema . schema , root , undefined , baseId ) ;
} else if ( schema ) {
v = inlineRef ( schema , this . _opts . inlineRefs )
? schema
: compile . call ( this , schema , root , undefined , baseId ) ;
}
return v ;
}
/* @this Ajv */
function _resolve ( root , ref ) {
/* jshint validthis: true */
var p = url . parse ( ref , false , true )
, refPath = _getFullPath ( p )
, baseId = getFullPath ( root . schema . id ) ;
if ( refPath !== baseId ) {
var id = normalizeId ( refPath ) ;
var refVal = this . _refs [ id ] ;
if ( typeof refVal == 'string' ) {
return resolveRecursive . call ( this , root , refVal , p ) ;
} else if ( refVal instanceof SchemaObject ) {
if ( ! refVal . validate ) this . _compile ( refVal ) ;
root = refVal ;
} else {
refVal = this . _schemas [ id ] ;
if ( refVal instanceof SchemaObject ) {
if ( ! refVal . validate ) this . _compile ( refVal ) ;
if ( id == normalizeId ( ref ) )
return { schema : refVal , root : root , baseId : baseId } ;
root = refVal ;
}
}
if ( ! root . schema ) return ;
baseId = getFullPath ( root . schema . id ) ;
}
return getJsonPointer . call ( this , p , baseId , root . schema , root ) ;
}
/* @this Ajv */
function resolveRecursive ( root , ref , parsedRef ) {
/* jshint validthis: true */
var res = _resolve . call ( this , root , ref ) ;
if ( res ) {
var schema = res . schema ;
var baseId = res . baseId ;
root = res . root ;
if ( schema . id ) baseId = resolveUrl ( baseId , schema . id ) ;
return getJsonPointer . call ( this , parsedRef , baseId , schema , root ) ;
}
}
var PREVENT _SCOPE _CHANGE = util . toHash ( [ 'properties' , 'patternProperties' , 'enum' , 'dependencies' , 'definitions' ] ) ;
/* @this Ajv */
function getJsonPointer ( parsedRef , baseId , schema , root ) {
/* jshint validthis: true */
parsedRef . hash = parsedRef . hash || '' ;
if ( parsedRef . hash . slice ( 0 , 2 ) != '#/' ) return ;
var parts = parsedRef . hash . split ( '/' ) ;
for ( var i = 1 ; i < parts . length ; i ++ ) {
var part = parts [ i ] ;
if ( part ) {
part = util . unescapeFragment ( part ) ;
schema = schema [ part ] ;
if ( ! schema ) break ;
if ( schema . id && ! PREVENT _SCOPE _CHANGE [ part ] ) baseId = resolveUrl ( baseId , schema . id ) ;
if ( schema . $ref ) {
var $ref = resolveUrl ( baseId , schema . $ref ) ;
var res = _resolve . call ( this , root , $ref ) ;
if ( res ) {
schema = res . schema ;
root = res . root ;
baseId = res . baseId ;
}
}
}
}
if ( schema && schema != root . schema )
return { schema : schema , root : root , baseId : baseId } ;
}
var SIMPLE _INLINED = util . toHash ( [
'type' , 'format' , 'pattern' ,
'maxLength' , 'minLength' ,
'maxProperties' , 'minProperties' ,
'maxItems' , 'minItems' ,
'maximum' , 'minimum' ,
'uniqueItems' , 'multipleOf' ,
'required' , 'enum'
] ) ;
function inlineRef ( schema , limit ) {
if ( limit === false ) return false ;
if ( limit === undefined || limit === true ) return checkNoRef ( schema ) ;
else if ( limit ) return countKeys ( schema ) <= limit ;
}
function checkNoRef ( schema ) {
var item ;
if ( Array . isArray ( schema ) ) {
for ( var i = 0 ; i < schema . length ; i ++ ) {
item = schema [ i ] ;
if ( typeof item == 'object' && ! checkNoRef ( item ) ) return false ;
}
} else {
for ( var key in schema ) {
if ( key == '$ref' ) return false ;
item = schema [ key ] ;
if ( typeof item == 'object' && ! checkNoRef ( item ) ) return false ;
}
}
return true ;
}
function countKeys ( schema ) {
var count = 0 , item ;
if ( Array . isArray ( schema ) ) {
for ( var i = 0 ; i < schema . length ; i ++ ) {
item = schema [ i ] ;
if ( typeof item == 'object' ) count += countKeys ( item ) ;
if ( count == Infinity ) return Infinity ;
}
} else {
for ( var key in schema ) {
if ( key == '$ref' ) return Infinity ;
if ( SIMPLE _INLINED [ key ] ) {
count ++ ;
} else {
item = schema [ key ] ;
if ( typeof item == 'object' ) count += countKeys ( item ) + 1 ;
if ( count == Infinity ) return Infinity ;
}
}
}
return count ;
}
function getFullPath ( id , normalize ) {
if ( normalize !== false ) id = normalizeId ( id ) ;
var p = url . parse ( id , false , true ) ;
return _getFullPath ( p ) ;
}
function _getFullPath ( p ) {
return ( p . protocol || '' ) + ( p . protocol ? '//' : '' ) + ( p . host || '' ) + ( p . path || '' ) + '#' ;
}
var TRAILING _SLASH _HASH = /#\/?$/ ;
function normalizeId ( id ) {
return id ? id . replace ( TRAILING _SLASH _HASH , '' ) : '' ;
}
function resolveUrl ( baseId , id ) {
id = normalizeId ( id ) ;
return url . resolve ( baseId , id ) ;
}
/* @this Ajv */
function resolveIds ( schema ) {
/* eslint no-shadow: 0 */
/* jshint validthis: true */
var id = normalizeId ( schema . id ) ;
var localRefs = { } ;
_resolveIds . call ( this , schema , getFullPath ( id , false ) , id ) ;
return localRefs ;
/* @this Ajv */
function _resolveIds ( schema , fullPath , baseId ) {
/* jshint validthis: true */
if ( Array . isArray ( schema ) ) {
for ( var i = 0 ; i < schema . length ; i ++ )
_resolveIds . call ( this , schema [ i ] , fullPath + '/' + i , baseId ) ;
} else if ( schema && typeof schema == 'object' ) {
if ( typeof schema . id == 'string' ) {
var id = baseId = baseId
? url . resolve ( baseId , schema . id )
: schema . id ;
id = normalizeId ( id ) ;
var refVal = this . _refs [ id ] ;
if ( typeof refVal == 'string' ) refVal = this . _refs [ refVal ] ;
if ( refVal && refVal . schema ) {
if ( ! equal ( schema , refVal . schema ) )
throw new Error ( 'id "' + id + '" resolves to more than one schema' ) ;
} else if ( id != normalizeId ( fullPath ) ) {
if ( id [ 0 ] == '#' ) {
if ( localRefs [ id ] && ! equal ( schema , localRefs [ id ] ) )
throw new Error ( 'id "' + id + '" resolves to more than one schema' ) ;
localRefs [ id ] = schema ;
} else {
this . _refs [ id ] = fullPath ;
}
}
}
for ( var key in schema )
_resolveIds . call ( this , schema [ key ] , fullPath + '/' + util . escapeFragment ( key ) , baseId ) ;
}
}
}
} , { "./equal" : 4 , "./schema_obj" : 9 , "./util" : 10 , "url" : 43 } ] , 8 : [ function ( require , module , exports ) {
'use strict' ;
var ruleModules = require ( './_rules' )
, util = require ( './util' ) ;
module . exports = function rules ( ) {
var RULES = [
{ type : 'number' ,
rules : [ 'maximum' , 'minimum' , 'multipleOf' ] } ,
{ type : 'string' ,
rules : [ 'maxLength' , 'minLength' , 'pattern' , 'format' ] } ,
{ type : 'array' ,
rules : [ 'maxItems' , 'minItems' , 'uniqueItems' , 'items' ] } ,
{ type : 'object' ,
rules : [ 'maxProperties' , 'minProperties' , 'required' , 'dependencies' , 'properties' ] } ,
{ rules : [ '$ref' , 'enum' , 'not' , 'anyOf' , 'oneOf' , 'allOf' ] }
] ;
RULES . all = [ 'type' , 'additionalProperties' , 'patternProperties' ] ;
RULES . keywords = [ 'additionalItems' , '$schema' , 'id' , 'title' , 'description' , 'default' ] ;
RULES . types = [ 'number' , 'integer' , 'string' , 'array' , 'object' , 'boolean' , 'null' ] ;
RULES . forEach ( function ( group ) {
group . rules = group . rules . map ( function ( keyword ) {
RULES . all . push ( keyword ) ;
return {
keyword : keyword ,
code : ruleModules [ keyword ]
} ;
} ) ;
} ) ;
RULES . keywords = util . toHash ( RULES . all . concat ( RULES . keywords ) ) ;
RULES . all = util . toHash ( RULES . all ) ;
RULES . types = util . toHash ( RULES . types ) ;
return RULES ;
} ;
} , { "./_rules" : 3 , "./util" : 10 } ] , 9 : [ function ( require , module , exports ) {
'use strict' ;
var util = require ( './util' ) ;
module . exports = SchemaObject ;
function SchemaObject ( obj ) {
util . copy ( obj , this ) ;
}
} , { "./util" : 10 } ] , 10 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = {
copy : copy ,
checkDataType : checkDataType ,
checkDataTypes : checkDataTypes ,
coerceToTypes : coerceToTypes ,
toHash : toHash ,
getProperty : getProperty ,
escapeQuotes : escapeQuotes ,
ucs2length : ucs2length ,
varOccurences : varOccurences ,
varReplace : varReplace ,
cleanUpCode : cleanUpCode ,
cleanUpVarErrors : cleanUpVarErrors ,
schemaHasRules : schemaHasRules ,
stableStringify : require ( 'json-stable-stringify' ) ,
toQuotedString : toQuotedString ,
getPathExpr : getPathExpr ,
getPath : getPath ,
getData : getData ,
unescapeFragment : unescapeFragment ,
escapeFragment : escapeFragment ,
escapeJsonPointer : escapeJsonPointer
} ;
function copy ( o , to ) {
to = to || { } ;
for ( var key in o ) to [ key ] = o [ key ] ;
return to ;
}
function checkDataType ( dataType , data , negate ) {
var EQUAL = negate ? ' !== ' : ' === '
, AND = negate ? ' || ' : ' && '
, OK = negate ? '!' : ''
, NOT = negate ? '' : '!' ;
switch ( dataType ) {
case 'null' : return data + EQUAL + 'null' ;
case 'array' : return OK + 'Array.isArray(' + data + ')' ;
case 'object' : return '(' + OK + data + AND +
'typeof ' + data + EQUAL + '"object"' + AND +
NOT + 'Array.isArray(' + data + '))' ;
case 'integer' : return '(typeof ' + data + EQUAL + '"number"' + AND +
NOT + '(' + data + ' % 1)' +
AND + data + EQUAL + data + ')' ;
default : return 'typeof ' + data + EQUAL + '"' + dataType + '"' ;
}
}
function checkDataTypes ( dataTypes , data ) {
switch ( dataTypes . length ) {
case 1 : return checkDataType ( dataTypes [ 0 ] , data , true ) ;
default :
var code = '' ;
var types = toHash ( dataTypes ) ;
if ( types . array && types . object ) {
code = types . null ? '(' : '(!' + data + ' || ' ;
code += 'typeof ' + data + ' !== "object")' ;
delete types . null ;
delete types . array ;
delete types . object ;
}
if ( types . number ) delete types . integer ;
for ( var t in types )
code += ( code ? ' && ' : '' ) + checkDataType ( t , data , true ) ;
return code ;
}
}
var COERCE _TO _TYPES = toHash ( [ 'string' , 'number' , 'integer' , 'boolean' , 'null' ] ) ;
function coerceToTypes ( dataTypes ) {
if ( Array . isArray ( dataTypes ) ) {
var types = [ ] ;
for ( var i = 0 ; i < dataTypes . length ; i ++ ) {
var t = dataTypes [ i ] ;
if ( COERCE _TO _TYPES [ t ] ) types [ types . length ] = t ;
}
if ( types . length ) return types ;
} else if ( COERCE _TO _TYPES [ dataTypes ] ) {
return [ dataTypes ] ;
}
}
function toHash ( arr ) {
var hash = { } ;
for ( var i = 0 ; i < arr . length ; i ++ ) hash [ arr [ i ] ] = true ;
return hash ;
}
var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i ;
var SINGLE _QUOTE = /'|\\/g ;
function getProperty ( key ) {
return typeof key == 'number'
? '[' + key + ']'
: IDENTIFIER . test ( key )
? '.' + key
: "['" + key . replace ( SINGLE _QUOTE , '\\$&' ) + "']" ;
}
function escapeQuotes ( str ) {
return str . replace ( SINGLE _QUOTE , '\\$&' ) ;
}
// https://mathiasbynens.be/notes/javascript-encoding
// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode
function ucs2length ( str ) {
var length = 0
, len = str . length
, pos = 0
, value ;
while ( pos < len ) {
length ++ ;
value = str . charCodeAt ( pos ++ ) ;
if ( value >= 0xD800 && value <= 0xDBFF && pos < len ) {
// high surrogate, and there is a next character
value = str . charCodeAt ( pos ) ;
if ( ( value & 0xFC00 ) == 0xDC00 ) pos ++ ; // low surrogate
}
}
return length ;
}
function varOccurences ( str , dataVar ) {
dataVar += '[^0-9]' ;
var matches = str . match ( new RegExp ( dataVar , 'g' ) ) ;
return matches ? matches . length : 0 ;
}
function varReplace ( str , dataVar , expr ) {
dataVar += '([^0-9])' ;
expr = expr . replace ( /\$/g , '$$$$' ) ;
return str . replace ( new RegExp ( dataVar , 'g' ) , expr + '$1' ) ;
}
var EMPTY _ELSE = /else\s*{\s*}/g
, EMPTY _IF _NO _ELSE = /if\s*\([^)]+\)\s*\{\s*\}(?!\s*else)/g
, EMPTY _IF _WITH _ELSE = /if\s*\(([^)]+)\)\s*\{\s*\}\s*else(?!\s*if)/g ;
function cleanUpCode ( out ) {
return out . replace ( EMPTY _ELSE , '' )
. replace ( EMPTY _IF _NO _ELSE , '' )
. replace ( EMPTY _IF _WITH _ELSE , 'if (!($1))' ) ;
}
var ERRORS _REGEXP = /[^v\.]errors/g
, REMOVE _ERRORS = /var errors = 0;|var vErrors = null;|validate.errors = vErrors;/g
, REMOVE _ERRORS _ASYNC = /var errors = 0;|var vErrors = null;/g
, RETURN _VALID = 'return errors === 0;'
, RETURN _TRUE = 'validate.errors = null; return true;'
, RETURN _ASYNC = /if \(errors === 0\) return true;\s*else throw new ValidationError\(vErrors\);/
, RETURN _TRUE _ASYNC = 'return true;' ;
function cleanUpVarErrors ( out , async ) {
var matches = out . match ( ERRORS _REGEXP ) ;
if ( ! matches || matches . length !== 2 ) return out ;
return async
? out . replace ( REMOVE _ERRORS _ASYNC , '' )
. replace ( RETURN _ASYNC , RETURN _TRUE _ASYNC )
: out . replace ( REMOVE _ERRORS , '' )
. replace ( RETURN _VALID , RETURN _TRUE ) ;
}
function schemaHasRules ( schema , rules ) {
for ( var key in schema ) if ( rules [ key ] ) return true ;
}
function toQuotedString ( str ) {
return '\'' + escapeQuotes ( str ) + '\'' ;
}
function getPathExpr ( currentPath , expr , jsonPointers , isNumber ) {
var path = jsonPointers // false by default
? '\'/\' + ' + expr + ( isNumber ? '' : '.replace(/~/g, \'~0\').replace(/\\//g, \'~1\')' )
: ( isNumber ? '\'[\' + ' + expr + ' + \']\'' : '\'[\\\'\' + ' + expr + ' + \'\\\']\'' ) ;
return joinPaths ( currentPath , path ) ;
}
function getPath ( currentPath , prop , jsonPointers ) {
var path = jsonPointers // false by default
? toQuotedString ( '/' + escapeJsonPointer ( prop ) )
: toQuotedString ( getProperty ( prop ) ) ;
return joinPaths ( currentPath , path ) ;
}
var RELATIVE _JSON _POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/ ;
function getData ( $data , lvl , paths ) {
var matches = $data . match ( RELATIVE _JSON _POINTER ) ;
if ( ! matches ) throw new Error ( 'Invalid relative JSON-pointer: ' + $data ) ;
var up = + matches [ 1 ] ;
var jsonPointer = matches [ 2 ] ;
if ( jsonPointer == '#' ) {
if ( up >= lvl ) throw new Error ( 'Cannot access property/index ' + up + ' levels up, current level is ' + lvl ) ;
return paths [ lvl - up ] ;
}
if ( up > lvl ) throw new Error ( 'Cannot access data ' + up + ' levels up, current level is ' + lvl ) ;
var data = 'data' + ( ( lvl - up ) || '' ) ;
if ( ! jsonPointer ) return data ;
var expr = data ;
var segments = jsonPointer . split ( '/' ) ;
for ( var i = 0 ; i < segments . length ; i ++ ) {
var segment = segments [ i ] ;
if ( segment ) {
data += getProperty ( unescapeJsonPointer ( segment ) ) ;
expr += ' && ' + data ;
}
}
return expr ;
}
function joinPaths ( a , b ) {
if ( a == '""' ) return b ;
return ( a + ' + ' + b ) . replace ( /' \+ '/g , '' ) ;
}
function unescapeFragment ( str ) {
return unescapeJsonPointer ( decodeURIComponent ( str ) ) ;
}
function escapeFragment ( str ) {
return encodeURIComponent ( escapeJsonPointer ( str ) ) ;
}
function escapeJsonPointer ( str ) {
return str . replace ( /~/g , '~0' ) . replace ( /\//g , '~1' ) ;
}
function unescapeJsonPointer ( str ) {
return str . replace ( /~1/g , '/' ) . replace ( /~0/g , '~' ) ;
}
} , { "json-stable-stringify" : 46 } ] , 11 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = ValidationError ;
function ValidationError ( errors ) {
this . message = 'validation failed' ;
this . errors = errors ;
this . ajv = this . validation = true ;
}
ValidationError . prototype = Object . create ( Error . prototype ) ;
ValidationError . prototype . constructor = ValidationError ;
} , { } ] , 12 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _ _formatLimit ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
out += 'var ' + ( $valid ) + ' = undefined;' ;
if ( it . opts . format === false ) {
out += ' ' + ( $valid ) + ' = true; ' ;
return out ;
}
var $schemaFormat = it . schema . format ,
$isDataFormat = it . opts . v5 && $schemaFormat . $data ,
$closingBraces = '' ;
if ( $isDataFormat ) {
var $schemaValueFormat = it . util . getData ( $schemaFormat . $data , $dataLvl , it . dataPathArr ) ,
$format = 'format' + $lvl ,
$compare = 'compare' + $lvl ;
out += ' var ' + ( $format ) + ' = formats[' + ( $schemaValueFormat ) + '] , ' + ( $compare ) + ' = ' + ( $format ) + ' && ' + ( $format ) + '.compare;' ;
} else {
var $format = it . formats [ $schemaFormat ] ;
if ( ! ( $format && $format . compare ) ) {
out += ' ' + ( $valid ) + ' = true; ' ;
return out ;
}
var $compare = 'formats' + it . util . getProperty ( $schemaFormat ) + '.compare' ;
}
var $isMax = $keyword == 'formatMaximum' ,
$exclusiveKeyword = 'formatExclusive' + ( $isMax ? 'Maximum' : 'Minimum' ) ,
$schemaExcl = it . schema [ $exclusiveKeyword ] ,
$isDataExcl = it . opts . v5 && $schemaExcl && $schemaExcl . $data ,
$op = $isMax ? '<' : '>' ,
$result = 'result' + $lvl ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
if ( $isDataExcl ) {
var $schemaValueExcl = it . util . getData ( $schemaExcl . $data , $dataLvl , it . dataPathArr ) ,
$exclusive = 'exclusive' + $lvl ,
$opExpr = 'op' + $lvl ,
$opStr = '\' + ' + $opExpr + ' + \'' ;
out += ' var schemaExcl' + ( $lvl ) + ' = ' + ( $schemaValueExcl ) + '; ' ;
$schemaValueExcl = 'schemaExcl' + $lvl ;
out += ' if (typeof ' + ( $schemaValueExcl ) + ' != \'boolean\' && ' + ( $schemaValueExcl ) + ' !== undefined) { ' + ( $valid ) + ' = false; ' ;
var $errorKeyword = $exclusiveKeyword ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || '_formatExclusiveLimit' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: {} ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'' + ( $exclusiveKeyword ) + ' should be boolean\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
$closingBraces += '}' ;
out += ' else { ' ;
}
if ( $isData ) {
out += ' if (' + ( $schemaValue ) + ' === undefined) ' + ( $valid ) + ' = true; else if (typeof ' + ( $schemaValue ) + ' != \'string\') ' + ( $valid ) + ' = false; else { ' ;
$closingBraces += '}' ;
}
if ( $isDataFormat ) {
out += ' if (!' + ( $compare ) + ') ' + ( $valid ) + ' = true; else { ' ;
$closingBraces += '}' ;
}
out += ' var ' + ( $result ) + ' = ' + ( $compare ) + '(' + ( $data ) + ', ' ;
if ( $isData ) {
out += '' + ( $schemaValue ) ;
} else {
out += '' + ( it . util . toQuotedString ( $schema ) ) ;
}
out += ' ); if (' + ( $result ) + ' === undefined) ' + ( $valid ) + ' = false; var ' + ( $exclusive ) + ' = ' + ( $schemaValueExcl ) + ' === true; if (' + ( $valid ) + ' === undefined) { ' + ( $valid ) + ' = ' + ( $exclusive ) + ' ? ' + ( $result ) + ' ' + ( $op ) + ' 0 : ' + ( $result ) + ' ' + ( $op ) + '= 0; } if (!' + ( $valid ) + ') var op' + ( $lvl ) + ' = ' + ( $exclusive ) + ' ? \'' + ( $op ) + '\' : \'' + ( $op ) + '=\';' ;
} else {
var $exclusive = $schemaExcl === true ,
$opStr = $op ;
if ( ! $exclusive ) $opStr += '=' ;
var $opExpr = '\'' + $opStr + '\'' ;
if ( $isData ) {
out += ' if (' + ( $schemaValue ) + ' === undefined) ' + ( $valid ) + ' = true; else if (typeof ' + ( $schemaValue ) + ' != \'string\') ' + ( $valid ) + ' = false; else { ' ;
$closingBraces += '}' ;
}
if ( $isDataFormat ) {
out += ' if (!' + ( $compare ) + ') ' + ( $valid ) + ' = true; else { ' ;
$closingBraces += '}' ;
}
out += ' var ' + ( $result ) + ' = ' + ( $compare ) + '(' + ( $data ) + ', ' ;
if ( $isData ) {
out += '' + ( $schemaValue ) ;
} else {
out += '' + ( it . util . toQuotedString ( $schema ) ) ;
}
out += ' ); if (' + ( $result ) + ' === undefined) ' + ( $valid ) + ' = false; if (' + ( $valid ) + ' === undefined) ' + ( $valid ) + ' = ' + ( $result ) + ' ' + ( $op ) ;
if ( ! $exclusive ) {
out += '=' ;
}
out += ' 0;' ;
}
out += '' + ( $closingBraces ) + 'if (!' + ( $valid ) + ') { ' ;
var $errorKeyword = $keyword ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || '_formatLimit' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { comparison: ' + ( $opExpr ) + ', limit: ' ;
if ( $isData ) {
out += '' + ( $schemaValue ) ;
} else {
out += '' + ( it . util . toQuotedString ( $schema ) ) ;
}
out += ' , exclusive: ' + ( $exclusive ) + ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should be ' + ( $opStr ) + ' "' ;
if ( $isData ) {
out += '\' + ' + ( $schemaValue ) + ' + \'' ;
} else {
out += '' + ( it . util . escapeQuotes ( $schema ) ) ;
}
out += '"\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: ' ;
if ( $isData ) {
out += 'validate.schema' + ( $schemaPath ) ;
} else {
out += '' + ( it . util . toQuotedString ( $schema ) ) ;
}
out += ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += '}' ;
return out ;
}
} , { } ] , 13 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _ _limit ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
var $isMax = $keyword == 'maximum' ,
$exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum' ,
$schemaExcl = it . schema [ $exclusiveKeyword ] ,
$isDataExcl = it . opts . v5 && $schemaExcl && $schemaExcl . $data ,
$op = $isMax ? '<' : '>' ,
$notOp = $isMax ? '>' : '<' ;
if ( $isDataExcl ) {
var $schemaValueExcl = it . util . getData ( $schemaExcl . $data , $dataLvl , it . dataPathArr ) ,
$exclusive = 'exclusive' + $lvl ,
$opExpr = 'op' + $lvl ,
$opStr = '\' + ' + $opExpr + ' + \'' ;
out += ' var schemaExcl' + ( $lvl ) + ' = ' + ( $schemaValueExcl ) + '; ' ;
$schemaValueExcl = 'schemaExcl' + $lvl ;
out += ' var exclusive' + ( $lvl ) + '; if (typeof ' + ( $schemaValueExcl ) + ' != \'boolean\' && typeof ' + ( $schemaValueExcl ) + ' != \'undefined\') { ' ;
var $errorKeyword = $exclusiveKeyword ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || '_exclusiveLimit' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: {} ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'' + ( $exclusiveKeyword ) + ' should be boolean\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } else if( ' ;
if ( $isData ) {
out += ' (' + ( $schemaValue ) + ' !== undefined && typeof ' + ( $schemaValue ) + ' != \'number\') || ' ;
}
out += ' ((exclusive' + ( $lvl ) + ' = ' + ( $schemaValueExcl ) + ' === true) ? ' + ( $data ) + ' ' + ( $notOp ) + '= ' + ( $schemaValue ) + ' : ' + ( $data ) + ' ' + ( $notOp ) + ' ' + ( $schemaValue ) + ') || ' + ( $data ) + ' !== ' + ( $data ) + ') { var op' + ( $lvl ) + ' = exclusive' + ( $lvl ) + ' ? \'' + ( $op ) + '\' : \'' + ( $op ) + '=\';' ;
} else {
var $exclusive = $schemaExcl === true ,
$opStr = $op ;
if ( ! $exclusive ) $opStr += '=' ;
var $opExpr = '\'' + $opStr + '\'' ;
out += ' if ( ' ;
if ( $isData ) {
out += ' (' + ( $schemaValue ) + ' !== undefined && typeof ' + ( $schemaValue ) + ' != \'number\') || ' ;
}
out += ' ' + ( $data ) + ' ' + ( $notOp ) ;
if ( $exclusive ) {
out += '=' ;
}
out += ' ' + ( $schemaValue ) + ' || ' + ( $data ) + ' !== ' + ( $data ) + ') {' ;
}
var $errorKeyword = $keyword ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || '_limit' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { comparison: ' + ( $opExpr ) + ', limit: ' + ( $schemaValue ) + ', exclusive: ' + ( $exclusive ) + ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should be ' + ( $opStr ) + ' ' ;
if ( $isData ) {
out += '\' + ' + ( $schemaValue ) ;
} else {
out += '' + ( $schema ) + '\'' ;
}
}
if ( it . opts . verbose ) {
out += ' , schema: ' ;
if ( $isData ) {
out += 'validate.schema' + ( $schemaPath ) ;
} else {
out += '' + ( $schema ) ;
}
out += ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
return out ;
}
} , { } ] , 14 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _ _limitItems ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
var $op = $keyword == 'maxItems' ? '>' : '<' ;
out += 'if ( ' ;
if ( $isData ) {
out += ' (' + ( $schemaValue ) + ' !== undefined && typeof ' + ( $schemaValue ) + ' != \'number\') || ' ;
}
out += ' ' + ( $data ) + '.length ' + ( $op ) + ' ' + ( $schemaValue ) + ') { ' ;
var $errorKeyword = $keyword ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || '_limitItems' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { limit: ' + ( $schemaValue ) + ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT have ' ;
if ( $keyword == 'maxItems' ) {
out += 'more' ;
} else {
out += 'less' ;
}
out += ' than ' ;
if ( $isData ) {
out += '\' + ' + ( $schemaValue ) + ' + \'' ;
} else {
out += '' + ( $schema ) ;
}
out += ' items\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: ' ;
if ( $isData ) {
out += 'validate.schema' + ( $schemaPath ) ;
} else {
out += '' + ( $schema ) ;
}
out += ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += '} ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
return out ;
}
} , { } ] , 15 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _ _limitLength ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
var $op = $keyword == 'maxLength' ? '>' : '<' ;
out += 'if ( ' ;
if ( $isData ) {
out += ' (' + ( $schemaValue ) + ' !== undefined && typeof ' + ( $schemaValue ) + ' != \'number\') || ' ;
}
if ( it . opts . unicode === false ) {
out += ' ' + ( $data ) + '.length ' ;
} else {
out += ' ucs2length(' + ( $data ) + ') ' ;
}
out += ' ' + ( $op ) + ' ' + ( $schemaValue ) + ') { ' ;
var $errorKeyword = $keyword ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || '_limitLength' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { limit: ' + ( $schemaValue ) + ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT be ' ;
if ( $keyword == 'maxLength' ) {
out += 'longer' ;
} else {
out += 'shorter' ;
}
out += ' than ' ;
if ( $isData ) {
out += '\' + ' + ( $schemaValue ) + ' + \'' ;
} else {
out += '' + ( $schema ) ;
}
out += ' characters\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: ' ;
if ( $isData ) {
out += 'validate.schema' + ( $schemaPath ) ;
} else {
out += '' + ( $schema ) ;
}
out += ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += '} ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
return out ;
}
} , { } ] , 16 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _ _limitProperties ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
var $op = $keyword == 'maxProperties' ? '>' : '<' ;
out += 'if ( ' ;
if ( $isData ) {
out += ' (' + ( $schemaValue ) + ' !== undefined && typeof ' + ( $schemaValue ) + ' != \'number\') || ' ;
}
out += ' Object.keys(' + ( $data ) + ').length ' + ( $op ) + ' ' + ( $schemaValue ) + ') { ' ;
var $errorKeyword = $keyword ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || '_limitProperties' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { limit: ' + ( $schemaValue ) + ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT have ' ;
if ( $keyword == 'maxProperties' ) {
out += 'more' ;
} else {
out += 'less' ;
}
out += ' than ' ;
if ( $isData ) {
out += '\' + ' + ( $schemaValue ) + ' + \'' ;
} else {
out += '' + ( $schema ) ;
}
out += ' properties\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: ' ;
if ( $isData ) {
out += 'validate.schema' + ( $schemaPath ) ;
} else {
out += '' + ( $schema ) ;
}
out += ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += '} ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
return out ;
}
} , { } ] , 17 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _allOf ( it , $keyword ) {
var out = ' ' ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $it = it . util . copy ( it ) ;
var $closingBraces = '' ;
$it . level ++ ;
var $currentBaseId = $it . baseId ;
var arr1 = $schema ;
if ( arr1 ) {
var $sch , $i = - 1 ,
l1 = arr1 . length - 1 ;
while ( $i < l1 ) {
$sch = arr1 [ $i += 1 ] ;
if ( it . util . schemaHasRules ( $sch , it . RULES . all ) ) {
$it . schema = $sch ;
$it . schemaPath = $schemaPath + '[' + $i + ']' ;
$it . errSchemaPath = $errSchemaPath + '/' + $i ;
out += ' ' + ( it . validate ( $it ) ) + ' ' ;
$it . baseId = $currentBaseId ;
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
$closingBraces += '}' ;
}
}
}
}
if ( $breakOnError ) {
out += ' ' + ( $closingBraces . slice ( 0 , - 1 ) ) ;
}
out = it . util . cleanUpCode ( out ) ;
return out ;
}
} , { } ] , 18 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _anyOf ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $errs = 'errs__' + $lvl ;
var $it = it . util . copy ( it ) ;
var $closingBraces = '' ;
$it . level ++ ;
var $noEmptySchema = $schema . every ( function ( $sch ) {
return it . util . schemaHasRules ( $sch , it . RULES . all ) ;
} ) ;
if ( $noEmptySchema ) {
var $currentBaseId = $it . baseId ;
out += ' var ' + ( $errs ) + ' = errors; var ' + ( $valid ) + ' = false; ' ;
var $wasComposite = it . compositeRule ;
it . compositeRule = $it . compositeRule = true ;
var arr1 = $schema ;
if ( arr1 ) {
var $sch , $i = - 1 ,
l1 = arr1 . length - 1 ;
while ( $i < l1 ) {
$sch = arr1 [ $i += 1 ] ;
$it . schema = $sch ;
$it . schemaPath = $schemaPath + '[' + $i + ']' ;
$it . errSchemaPath = $errSchemaPath + '/' + $i ;
out += ' ' + ( it . validate ( $it ) ) + ' ' ;
$it . baseId = $currentBaseId ;
out += ' ' + ( $valid ) + ' = ' + ( $valid ) + ' || valid' + ( $it . level ) + '; if (!' + ( $valid ) + ') { ' ;
$closingBraces += '}' ;
}
}
it . compositeRule = $it . compositeRule = $wasComposite ;
out += ' ' + ( $closingBraces ) + ' if (!' + ( $valid ) + ') { var err = ' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'anyOf' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: {} ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should match some schema in anyOf\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = ' + ( $errs ) + '; if (vErrors !== null) { if (' + ( $errs ) + ') vErrors.length = ' + ( $errs ) + '; else vErrors = null; } ' ;
if ( it . opts . allErrors ) {
out += ' } ' ;
}
out = it . util . cleanUpCode ( out ) ;
} else {
if ( $breakOnError ) {
out += ' if (true) { ' ;
}
}
return out ;
}
} , { } ] , 19 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _constant ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
if ( ! $isData ) {
out += ' var schema' + ( $lvl ) + ' = validate.schema' + ( $schemaPath ) + ';' ;
}
out += 'var ' + ( $valid ) + ' = equal(' + ( $data ) + ', schema' + ( $lvl ) + '); if (!' + ( $valid ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'constant' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: {} ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should be equal to constant\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' }' ;
return out ;
}
} , { } ] , 20 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _dependencies ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $errs = 'errs__' + $lvl ;
var $it = it . util . copy ( it ) ;
var $closingBraces = '' ;
$it . level ++ ;
var $schemaDeps = { } ,
$propertyDeps = { } ;
for ( $property in $schema ) {
var $sch = $schema [ $property ] ;
var $deps = Array . isArray ( $sch ) ? $propertyDeps : $schemaDeps ;
$deps [ $property ] = $sch ;
}
out += 'var ' + ( $errs ) + ' = errors;' ;
var $currentErrorPath = it . errorPath ;
out += 'var missing' + ( $lvl ) + ';' ;
for ( var $property in $propertyDeps ) {
$deps = $propertyDeps [ $property ] ;
out += ' if (' + ( $data ) + ( it . util . getProperty ( $property ) ) + ' !== undefined ' ;
if ( $breakOnError ) {
out += ' && ( ' ;
var arr1 = $deps ;
if ( arr1 ) {
var _$property , $i = - 1 ,
l1 = arr1 . length - 1 ;
while ( $i < l1 ) {
_$property = arr1 [ $i += 1 ] ;
if ( $i ) {
out += ' || ' ;
}
var $prop = it . util . getProperty ( _$property ) ;
out += ' ( ' + ( $data ) + ( $prop ) + ' === undefined && (missing' + ( $lvl ) + ' = ' + ( it . util . toQuotedString ( it . opts . jsonPointers ? _$property : $prop ) ) + ') ) ' ;
}
}
out += ')) { ' ;
var $propertyPath = 'missing' + $lvl ,
$missingProperty = '\' + ' + $propertyPath + ' + \'' ;
if ( it . opts . _errorDataPathProperty ) {
it . errorPath = it . opts . jsonPointers ? it . util . getPathExpr ( $currentErrorPath , $propertyPath , true ) : $currentErrorPath + ' + ' + $propertyPath ;
}
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'dependencies' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { property: \'' + ( it . util . escapeQuotes ( $property ) ) + '\', missingProperty: \'' + ( $missingProperty ) + '\', depsCount: ' + ( $deps . length ) + ', deps: \'' + ( it . util . escapeQuotes ( $deps . length == 1 ? $deps [ 0 ] : $deps . join ( ", " ) ) ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should have ' ;
if ( $deps . length == 1 ) {
out += 'property ' + ( it . util . escapeQuotes ( $deps [ 0 ] ) ) ;
} else {
out += 'properties ' + ( it . util . escapeQuotes ( $deps . join ( ", " ) ) ) ;
}
out += ' when property ' + ( it . util . escapeQuotes ( $property ) ) + ' is present\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
} else {
out += ' ) { ' ;
var arr2 = $deps ;
if ( arr2 ) {
var $reqProperty , i2 = - 1 ,
l2 = arr2 . length - 1 ;
while ( i2 < l2 ) {
$reqProperty = arr2 [ i2 += 1 ] ;
var $prop = it . util . getProperty ( $reqProperty ) ,
$missingProperty = it . util . escapeQuotes ( $reqProperty ) ;
if ( it . opts . _errorDataPathProperty ) {
it . errorPath = it . util . getPath ( $currentErrorPath , $reqProperty , it . opts . jsonPointers ) ;
}
out += ' if (' + ( $data ) + ( $prop ) + ' === undefined) { var err = ' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'dependencies' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { property: \'' + ( it . util . escapeQuotes ( $property ) ) + '\', missingProperty: \'' + ( $missingProperty ) + '\', depsCount: ' + ( $deps . length ) + ', deps: \'' + ( it . util . escapeQuotes ( $deps . length == 1 ? $deps [ 0 ] : $deps . join ( ", " ) ) ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should have ' ;
if ( $deps . length == 1 ) {
out += 'property ' + ( it . util . escapeQuotes ( $deps [ 0 ] ) ) ;
} else {
out += 'properties ' + ( it . util . escapeQuotes ( $deps . join ( ", " ) ) ) ;
}
out += ' when property ' + ( it . util . escapeQuotes ( $property ) ) + ' is present\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ' ;
}
}
}
out += ' } ' ;
if ( $breakOnError ) {
$closingBraces += '}' ;
out += ' else { ' ;
}
}
it . errorPath = $currentErrorPath ;
var $currentBaseId = $it . baseId ;
for ( var $property in $schemaDeps ) {
var $sch = $schemaDeps [ $property ] ;
if ( it . util . schemaHasRules ( $sch , it . RULES . all ) ) {
out += ' valid' + ( $it . level ) + ' = true; if (' + ( $data ) + '[\'' + ( $property ) + '\'] !== undefined) { ' ;
$it . schema = $sch ;
$it . schemaPath = $schemaPath + it . util . getProperty ( $property ) ;
$it . errSchemaPath = $errSchemaPath + '/' + it . util . escapeFragment ( $property ) ;
out += ' ' + ( it . validate ( $it ) ) + ' ' ;
$it . baseId = $currentBaseId ;
out += ' } ' ;
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
$closingBraces += '}' ;
}
}
}
if ( $breakOnError ) {
out += ' ' + ( $closingBraces ) + ' if (' + ( $errs ) + ' == errors) {' ;
}
out = it . util . cleanUpCode ( out ) ;
return out ;
}
} , { } ] , 21 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _enum ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
var $i = 'i' + $lvl ;
if ( ! $isData ) {
out += ' var schema' + ( $lvl ) + ' = validate.schema' + ( $schemaPath ) + ';' ;
}
out += 'var ' + ( $valid ) + ';' ;
if ( $isData ) {
out += ' if (schema' + ( $lvl ) + ' === undefined) ' + ( $valid ) + ' = true; else if (!Array.isArray(schema' + ( $lvl ) + ')) ' + ( $valid ) + ' = false; else {' ;
}
out += '' + ( $valid ) + ' = false;for (var ' + ( $i ) + '=0; ' + ( $i ) + '<schema' + ( $lvl ) + '.length; ' + ( $i ) + '++) if (equal(' + ( $data ) + ', schema' + ( $lvl ) + '[' + ( $i ) + '])) { ' + ( $valid ) + ' = true; break; }' ;
if ( $isData ) {
out += ' } ' ;
}
out += ' if (!' + ( $valid ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'enum' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: {} ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should be equal to one of the allowed values\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' }' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
return out ;
}
} , { } ] , 22 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _format ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
if ( it . opts . format === false ) {
if ( $breakOnError ) {
out += ' if (true) { ' ;
}
return out ;
}
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
if ( $isData ) {
var $format = 'format' + $lvl ;
out += ' var ' + ( $format ) + ' = formats[' + ( $schemaValue ) + ']; var isObject' + ( $lvl ) + ' = typeof ' + ( $format ) + ' == \'object\' && !(' + ( $format ) + ' instanceof RegExp) && ' + ( $format ) + '.validate; if (isObject' + ( $lvl ) + ') { var async' + ( $lvl ) + ' = ' + ( $format ) + '.async; ' + ( $format ) + ' = ' + ( $format ) + '.validate; } if ( ' ;
if ( $isData ) {
out += ' (' + ( $schemaValue ) + ' !== undefined && typeof ' + ( $schemaValue ) + ' != \'string\') || ' ;
}
out += ' (' + ( $format ) + ' && !(typeof ' + ( $format ) + ' == \'function\' ? ' ;
if ( it . async ) {
out += ' (async' + ( $lvl ) + ' ? ' + ( it . yieldAwait ) + ' ' + ( $format ) + '(' + ( $data ) + ') : ' + ( $format ) + '(' + ( $data ) + ')) ' ;
} else {
out += ' ' + ( $format ) + '(' + ( $data ) + ') ' ;
}
out += ' : ' + ( $format ) + '.test(' + ( $data ) + ')))) {' ;
} else {
var $format = it . formats [ $schema ] ;
if ( ! $format ) {
if ( $breakOnError ) {
out += ' if (true) { ' ;
}
return out ;
}
var $isObject = typeof $format == 'object' && ! ( $format instanceof RegExp ) && $format . validate ;
if ( $isObject ) {
var $async = $format . async === true ;
$format = $format . validate ;
}
if ( $async ) {
if ( ! it . async ) throw new Error ( 'async format in sync schema' ) ;
var $formatRef = 'formats' + it . util . getProperty ( $schema ) + '.validate' ;
out += ' if (!(' + ( it . yieldAwait ) + ' ' + ( $formatRef ) + '(' + ( $data ) + '))) { ' ;
} else {
out += ' if (! ' ;
var $formatRef = 'formats' + it . util . getProperty ( $schema ) ;
if ( $isObject ) $formatRef += '.validate' ;
if ( typeof $format == 'function' ) {
out += ' ' + ( $formatRef ) + '(' + ( $data ) + ') ' ;
} else {
out += ' ' + ( $formatRef ) + '.test(' + ( $data ) + ') ' ;
}
out += ') { ' ;
}
}
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'format' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { format: ' ;
if ( $isData ) {
out += '' + ( $schemaValue ) ;
} else {
out += '' + ( it . util . toQuotedString ( $schema ) ) ;
}
out += ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should match format "' ;
if ( $isData ) {
out += '\' + ' + ( $schemaValue ) + ' + \'' ;
} else {
out += '' + ( it . util . escapeQuotes ( $schema ) ) ;
}
out += '"\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: ' ;
if ( $isData ) {
out += 'validate.schema' + ( $schemaPath ) ;
} else {
out += '' + ( it . util . toQuotedString ( $schema ) ) ;
}
out += ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
return out ;
}
} , { } ] , 23 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _items ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $errs = 'errs__' + $lvl ;
var $it = it . util . copy ( it ) ;
var $closingBraces = '' ;
$it . level ++ ;
var $dataNxt = $it . dataLevel = it . dataLevel + 1 ,
$nextData = 'data' + $dataNxt ,
$currentBaseId = it . baseId ;
out += 'var ' + ( $errs ) + ' = errors;var ' + ( $valid ) + ';' ;
if ( Array . isArray ( $schema ) ) {
var $additionalItems = it . schema . additionalItems ;
if ( $additionalItems === false ) {
out += ' ' + ( $valid ) + ' = ' + ( $data ) + '.length <= ' + ( $schema . length ) + '; ' ;
var $currErrSchemaPath = $errSchemaPath ;
$errSchemaPath = it . errSchemaPath + '/additionalItems' ;
out += ' if (!' + ( $valid ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'additionalItems' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { limit: ' + ( $schema . length ) + ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT have more than ' + ( $schema . length ) + ' items\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: false , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } ' ;
$errSchemaPath = $currErrSchemaPath ;
if ( $breakOnError ) {
$closingBraces += '}' ;
out += ' else { ' ;
}
}
var arr1 = $schema ;
if ( arr1 ) {
var $sch , $i = - 1 ,
l1 = arr1 . length - 1 ;
while ( $i < l1 ) {
$sch = arr1 [ $i += 1 ] ;
if ( it . util . schemaHasRules ( $sch , it . RULES . all ) ) {
out += ' valid' + ( $it . level ) + ' = true; if (' + ( $data ) + '.length > ' + ( $i ) + ') { ' ;
var $passData = $data + '[' + $i + ']' ;
$it . schema = $sch ;
$it . schemaPath = $schemaPath + '[' + $i + ']' ;
$it . errSchemaPath = $errSchemaPath + '/' + $i ;
$it . errorPath = it . util . getPathExpr ( it . errorPath , $i , it . opts . jsonPointers , true ) ;
$it . dataPathArr [ $dataNxt ] = $i ;
var $code = it . validate ( $it ) ;
$it . baseId = $currentBaseId ;
if ( it . util . varOccurences ( $code , $nextData ) < 2 ) {
out += ' ' + ( it . util . varReplace ( $code , $nextData , $passData ) ) + ' ' ;
} else {
out += ' var ' + ( $nextData ) + ' = ' + ( $passData ) + '; ' + ( $code ) + ' ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
$closingBraces += '}' ;
}
}
}
}
if ( typeof $additionalItems == 'object' && it . util . schemaHasRules ( $additionalItems , it . RULES . all ) ) {
$it . schema = $additionalItems ;
$it . schemaPath = it . schemaPath + '.additionalItems' ;
$it . errSchemaPath = it . errSchemaPath + '/additionalItems' ;
out += ' valid' + ( $it . level ) + ' = true; if (' + ( $data ) + '.length > ' + ( $schema . length ) + ') { for (var i' + ( $lvl ) + ' = ' + ( $schema . length ) + '; i' + ( $lvl ) + ' < ' + ( $data ) + '.length; i' + ( $lvl ) + '++) { ' ;
$it . errorPath = it . util . getPathExpr ( it . errorPath , 'i' + $lvl , it . opts . jsonPointers , true ) ;
var $passData = $data + '[i' + $lvl + ']' ;
$it . dataPathArr [ $dataNxt ] = 'i' + $lvl ;
var $code = it . validate ( $it ) ;
$it . baseId = $currentBaseId ;
if ( it . util . varOccurences ( $code , $nextData ) < 2 ) {
out += ' ' + ( it . util . varReplace ( $code , $nextData , $passData ) ) + ' ' ;
} else {
out += ' var ' + ( $nextData ) + ' = ' + ( $passData ) + '; ' + ( $code ) + ' ' ;
}
if ( $breakOnError ) {
out += ' if (!valid' + ( $it . level ) + ') break; ' ;
}
out += ' } } ' ;
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
$closingBraces += '}' ;
}
}
} else if ( it . util . schemaHasRules ( $schema , it . RULES . all ) ) {
$it . schema = $schema ;
$it . schemaPath = $schemaPath ;
$it . errSchemaPath = $errSchemaPath ;
out += ' for (var i' + ( $lvl ) + ' = ' + ( 0 ) + '; i' + ( $lvl ) + ' < ' + ( $data ) + '.length; i' + ( $lvl ) + '++) { ' ;
$it . errorPath = it . util . getPathExpr ( it . errorPath , 'i' + $lvl , it . opts . jsonPointers , true ) ;
var $passData = $data + '[i' + $lvl + ']' ;
$it . dataPathArr [ $dataNxt ] = 'i' + $lvl ;
var $code = it . validate ( $it ) ;
$it . baseId = $currentBaseId ;
if ( it . util . varOccurences ( $code , $nextData ) < 2 ) {
out += ' ' + ( it . util . varReplace ( $code , $nextData , $passData ) ) + ' ' ;
} else {
out += ' var ' + ( $nextData ) + ' = ' + ( $passData ) + '; ' + ( $code ) + ' ' ;
}
if ( $breakOnError ) {
out += ' if (!valid' + ( $it . level ) + ') break; ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
$closingBraces += '}' ;
}
}
if ( $breakOnError ) {
out += ' ' + ( $closingBraces ) + ' if (' + ( $errs ) + ' == errors) {' ;
}
out = it . util . cleanUpCode ( out ) ;
return out ;
}
} , { } ] , 24 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _multipleOf ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
out += 'var division' + ( $lvl ) + ';if (' ;
if ( $isData ) {
out += ' ' + ( $schemaValue ) + ' !== undefined && ( typeof ' + ( $schemaValue ) + ' != \'number\' || ' ;
}
out += ' (division' + ( $lvl ) + ' = ' + ( $data ) + ' / ' + ( $schemaValue ) + ', ' ;
if ( it . opts . multipleOfPrecision ) {
out += ' Math.abs(Math.round(division' + ( $lvl ) + ') - division' + ( $lvl ) + ') > 1e-' + ( it . opts . multipleOfPrecision ) + ' ' ;
} else {
out += ' division' + ( $lvl ) + ' !== parseInt(division' + ( $lvl ) + ') ' ;
}
out += ' ) ' ;
if ( $isData ) {
out += ' ) ' ;
}
out += ' ) { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'multipleOf' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { multipleOf: ' + ( $schemaValue ) + ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should be multiple of ' ;
if ( $isData ) {
out += '\' + ' + ( $schemaValue ) ;
} else {
out += '' + ( $schema ) + '\'' ;
}
}
if ( it . opts . verbose ) {
out += ' , schema: ' ;
if ( $isData ) {
out += 'validate.schema' + ( $schemaPath ) ;
} else {
out += '' + ( $schema ) ;
}
out += ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += '} ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
return out ;
}
} , { } ] , 25 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _not ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $errs = 'errs__' + $lvl ;
var $it = it . util . copy ( it ) ;
$it . level ++ ;
if ( it . util . schemaHasRules ( $schema , it . RULES . all ) ) {
$it . schema = $schema ;
$it . schemaPath = $schemaPath ;
$it . errSchemaPath = $errSchemaPath ;
out += ' var ' + ( $errs ) + ' = errors; ' ;
var $wasComposite = it . compositeRule ;
it . compositeRule = $it . compositeRule = true ;
$it . createErrors = false ;
var $allErrorsOption ;
if ( $it . opts . allErrors ) {
$allErrorsOption = $it . opts . allErrors ;
$it . opts . allErrors = false ;
}
out += ' ' + ( it . validate ( $it ) ) + ' ' ;
$it . createErrors = true ;
if ( $allErrorsOption ) $it . opts . allErrors = $allErrorsOption ;
it . compositeRule = $it . compositeRule = $wasComposite ;
out += ' if (valid' + ( $it . level ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'not' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: {} ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT be valid\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } else { errors = ' + ( $errs ) + '; if (vErrors !== null) { if (' + ( $errs ) + ') vErrors.length = ' + ( $errs ) + '; else vErrors = null; } ' ;
if ( it . opts . allErrors ) {
out += ' } ' ;
}
} else {
out += ' var err = ' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'not' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: {} ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT be valid\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
if ( $breakOnError ) {
out += ' if (false) { ' ;
}
}
return out ;
}
} , { } ] , 26 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _oneOf ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $errs = 'errs__' + $lvl ;
var $it = it . util . copy ( it ) ;
var $closingBraces = '' ;
$it . level ++ ;
out += 'var ' + ( $errs ) + ' = errors;var prevValid' + ( $lvl ) + ' = false;var ' + ( $valid ) + ' = false;' ;
var $currentBaseId = $it . baseId ;
var $wasComposite = it . compositeRule ;
it . compositeRule = $it . compositeRule = true ;
var arr1 = $schema ;
if ( arr1 ) {
var $sch , $i = - 1 ,
l1 = arr1 . length - 1 ;
while ( $i < l1 ) {
$sch = arr1 [ $i += 1 ] ;
if ( it . util . schemaHasRules ( $sch , it . RULES . all ) ) {
$it . schema = $sch ;
$it . schemaPath = $schemaPath + '[' + $i + ']' ;
$it . errSchemaPath = $errSchemaPath + '/' + $i ;
out += ' ' + ( it . validate ( $it ) ) + ' ' ;
$it . baseId = $currentBaseId ;
} else {
out += ' var valid' + ( $it . level ) + ' = true; ' ;
}
if ( $i ) {
out += ' if (valid' + ( $it . level ) + ' && prevValid' + ( $lvl ) + ') ' + ( $valid ) + ' = false; else { ' ;
$closingBraces += '}' ;
}
out += ' if (valid' + ( $it . level ) + ') ' + ( $valid ) + ' = prevValid' + ( $lvl ) + ' = true;' ;
}
}
it . compositeRule = $it . compositeRule = $wasComposite ;
out += '' + ( $closingBraces ) + 'if (!' + ( $valid ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'oneOf' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: {} ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should match exactly one schema in oneOf\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += '} else { errors = ' + ( $errs ) + '; if (vErrors !== null) { if (' + ( $errs ) + ') vErrors.length = ' + ( $errs ) + '; else vErrors = null; }' ;
if ( it . opts . allErrors ) {
out += ' } ' ;
}
return out ;
}
} , { } ] , 27 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _pattern ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it . usePattern ( $schema ) ;
out += 'if ( ' ;
if ( $isData ) {
out += ' (' + ( $schemaValue ) + ' !== undefined && typeof ' + ( $schemaValue ) + ' != \'string\') || ' ;
}
out += ' !' + ( $regexp ) + '.test(' + ( $data ) + ') ) { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'pattern' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { pattern: ' ;
if ( $isData ) {
out += '' + ( $schemaValue ) ;
} else {
out += '' + ( it . util . toQuotedString ( $schema ) ) ;
}
out += ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should match pattern "' ;
if ( $isData ) {
out += '\' + ' + ( $schemaValue ) + ' + \'' ;
} else {
out += '' + ( it . util . escapeQuotes ( $schema ) ) ;
}
out += '"\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: ' ;
if ( $isData ) {
out += 'validate.schema' + ( $schemaPath ) ;
} else {
out += '' + ( it . util . toQuotedString ( $schema ) ) ;
}
out += ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += '} ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
return out ;
}
} , { } ] , 28 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _patternRequired ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $key = 'key' + $lvl ,
$matched = 'patternMatched' + $lvl ,
$closingBraces = '' ,
$ownProperties = it . opts . ownProperties ;
out += 'var ' + ( $valid ) + ' = true;' ;
var arr1 = $schema ;
if ( arr1 ) {
var $pProperty , i1 = - 1 ,
l1 = arr1 . length - 1 ;
while ( i1 < l1 ) {
$pProperty = arr1 [ i1 += 1 ] ;
out += ' var ' + ( $matched ) + ' = false; for (var ' + ( $key ) + ' in ' + ( $data ) + ') { ' ;
if ( $ownProperties ) {
out += ' if (!Object.prototype.hasOwnProperty.call(' + ( $data ) + ', ' + ( $key ) + ')) continue; ' ;
}
out += ' ' + ( $matched ) + ' = ' + ( it . usePattern ( $pProperty ) ) + '.test(' + ( $key ) + '); if (' + ( $matched ) + ') break; } ' ;
var $missingPattern = it . util . escapeQuotes ( $pProperty ) ;
out += ' if (!' + ( $matched ) + ') { ' + ( $valid ) + ' = false; var err = ' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'patternRequired' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { missingPattern: \'' + ( $missingPattern ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should have property matching pattern \\\'' + ( $missingPattern ) + '\\\'\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ' ;
if ( $breakOnError ) {
$closingBraces += '}' ;
out += ' else { ' ;
}
}
}
out += '' + ( $closingBraces ) ;
return out ;
}
} , { } ] , 29 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _properties ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $errs = 'errs__' + $lvl ;
var $it = it . util . copy ( it ) ;
var $closingBraces = '' ;
$it . level ++ ;
var $key = 'key' + $lvl ,
$dataNxt = $it . dataLevel = it . dataLevel + 1 ,
$nextData = 'data' + $dataNxt ;
var $schemaKeys = Object . keys ( $schema || { } ) ,
$pProperties = it . schema . patternProperties || { } ,
$pPropertyKeys = Object . keys ( $pProperties ) ,
$aProperties = it . schema . additionalProperties ,
$someProperties = $schemaKeys . length || $pPropertyKeys . length ,
$noAdditional = $aProperties === false ,
$additionalIsSchema = typeof $aProperties == 'object' && Object . keys ( $aProperties ) . length ,
$removeAdditional = it . opts . removeAdditional ,
$checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional ,
$ownProperties = it . opts . ownProperties ,
$currentBaseId = it . baseId ;
var $required = it . schema . required ;
if ( $required && ! ( it . opts . v5 && $required . $data ) && $required . length < it . opts . loopRequired ) var $requiredHash = it . util . toHash ( $required ) ;
if ( it . opts . v5 ) {
var $pgProperties = it . schema . patternGroups || { } ,
$pgPropertyKeys = Object . keys ( $pgProperties ) ;
}
out += 'var ' + ( $errs ) + ' = errors;var valid' + ( $it . level ) + ' = true;' ;
if ( $checkAdditional ) {
out += ' for (var ' + ( $key ) + ' in ' + ( $data ) + ') { ' ;
if ( $ownProperties ) {
out += ' if (!Object.prototype.hasOwnProperty.call(' + ( $data ) + ', ' + ( $key ) + ')) continue; ' ;
}
if ( $someProperties ) {
out += ' var isAdditional' + ( $lvl ) + ' = !(false ' ;
if ( $schemaKeys . length ) {
if ( $schemaKeys . length > 5 ) {
out += ' || validate.schema' + ( $schemaPath ) + '[' + ( $key ) + '] ' ;
} else {
var arr1 = $schemaKeys ;
if ( arr1 ) {
var $propertyKey , i1 = - 1 ,
l1 = arr1 . length - 1 ;
while ( i1 < l1 ) {
$propertyKey = arr1 [ i1 += 1 ] ;
out += ' || ' + ( $key ) + ' == ' + ( it . util . toQuotedString ( $propertyKey ) ) + ' ' ;
}
}
}
}
if ( $pPropertyKeys . length ) {
var arr2 = $pPropertyKeys ;
if ( arr2 ) {
var $pProperty , $i = - 1 ,
l2 = arr2 . length - 1 ;
while ( $i < l2 ) {
$pProperty = arr2 [ $i += 1 ] ;
out += ' || ' + ( it . usePattern ( $pProperty ) ) + '.test(' + ( $key ) + ') ' ;
}
}
}
if ( it . opts . v5 && $pgPropertyKeys && $pgPropertyKeys . length ) {
var arr3 = $pgPropertyKeys ;
if ( arr3 ) {
var $pgProperty , $i = - 1 ,
l3 = arr3 . length - 1 ;
while ( $i < l3 ) {
$pgProperty = arr3 [ $i += 1 ] ;
out += ' || ' + ( it . usePattern ( $pgProperty ) ) + '.test(' + ( $key ) + ') ' ;
}
}
}
out += ' ); if (isAdditional' + ( $lvl ) + ') { ' ;
}
if ( $removeAdditional == 'all' ) {
out += ' delete ' + ( $data ) + '[' + ( $key ) + ']; ' ;
} else {
var $currentErrorPath = it . errorPath ;
var $additionalProperty = '\' + key' + $lvl + ' + \'' ;
if ( it . opts . _errorDataPathProperty ) {
it . errorPath = it . util . getPathExpr ( it . errorPath , 'key' + $lvl , it . opts . jsonPointers ) ;
}
if ( $noAdditional ) {
if ( $removeAdditional ) {
out += ' delete ' + ( $data ) + '[' + ( $key ) + ']; ' ;
} else {
out += ' valid' + ( $it . level ) + ' = false; ' ;
var $currErrSchemaPath = $errSchemaPath ;
$errSchemaPath = it . errSchemaPath + '/additionalProperties' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'additionalProperties' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { additionalProperty: \'' + ( $additionalProperty ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT have additional properties\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: false , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
$errSchemaPath = $currErrSchemaPath ;
if ( $breakOnError ) {
out += ' break; ' ;
}
}
} else if ( $additionalIsSchema ) {
if ( $removeAdditional == 'failing' ) {
out += ' var ' + ( $errs ) + ' = errors; ' ;
var $wasComposite = it . compositeRule ;
it . compositeRule = $it . compositeRule = true ;
$it . schema = $aProperties ;
$it . schemaPath = it . schemaPath + '.additionalProperties' ;
$it . errSchemaPath = it . errSchemaPath + '/additionalProperties' ;
$it . errorPath = it . opts . _errorDataPathProperty ? it . errorPath : it . util . getPathExpr ( it . errorPath , 'key' + $lvl , it . opts . jsonPointers ) ;
var $passData = $data + '[key' + $lvl + ']' ;
$it . dataPathArr [ $dataNxt ] = 'key' + $lvl ;
var $code = it . validate ( $it ) ;
$it . baseId = $currentBaseId ;
if ( it . util . varOccurences ( $code , $nextData ) < 2 ) {
out += ' ' + ( it . util . varReplace ( $code , $nextData , $passData ) ) + ' ' ;
} else {
out += ' var ' + ( $nextData ) + ' = ' + ( $passData ) + '; ' + ( $code ) + ' ' ;
}
out += ' if (!valid' + ( $it . level ) + ') { errors = ' + ( $errs ) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ( $data ) + '[' + ( $key ) + ']; } ' ;
it . compositeRule = $it . compositeRule = $wasComposite ;
} else {
$it . schema = $aProperties ;
$it . schemaPath = it . schemaPath + '.additionalProperties' ;
$it . errSchemaPath = it . errSchemaPath + '/additionalProperties' ;
$it . errorPath = it . opts . _errorDataPathProperty ? it . errorPath : it . util . getPathExpr ( it . errorPath , 'key' + $lvl , it . opts . jsonPointers ) ;
var $passData = $data + '[key' + $lvl + ']' ;
$it . dataPathArr [ $dataNxt ] = 'key' + $lvl ;
var $code = it . validate ( $it ) ;
$it . baseId = $currentBaseId ;
if ( it . util . varOccurences ( $code , $nextData ) < 2 ) {
out += ' ' + ( it . util . varReplace ( $code , $nextData , $passData ) ) + ' ' ;
} else {
out += ' var ' + ( $nextData ) + ' = ' + ( $passData ) + '; ' + ( $code ) + ' ' ;
}
if ( $breakOnError ) {
out += ' if (!valid' + ( $it . level ) + ') break; ' ;
}
}
}
it . errorPath = $currentErrorPath ;
}
if ( $someProperties ) {
out += ' } ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
$closingBraces += '}' ;
}
}
var $useDefaults = it . opts . useDefaults && ! it . compositeRule ;
if ( $schemaKeys . length ) {
var arr4 = $schemaKeys ;
if ( arr4 ) {
var $propertyKey , i4 = - 1 ,
l4 = arr4 . length - 1 ;
while ( i4 < l4 ) {
$propertyKey = arr4 [ i4 += 1 ] ;
var $sch = $schema [ $propertyKey ] ;
if ( it . util . schemaHasRules ( $sch , it . RULES . all ) ) {
var $prop = it . util . getProperty ( $propertyKey ) ,
$passData = $data + $prop ,
$hasDefault = $useDefaults && $sch . default !== undefined ;
$it . schema = $sch ;
$it . schemaPath = $schemaPath + $prop ;
$it . errSchemaPath = $errSchemaPath + '/' + it . util . escapeFragment ( $propertyKey ) ;
$it . errorPath = it . util . getPath ( it . errorPath , $propertyKey , it . opts . jsonPointers ) ;
$it . dataPathArr [ $dataNxt ] = it . util . toQuotedString ( $propertyKey ) ;
var $code = it . validate ( $it ) ;
$it . baseId = $currentBaseId ;
if ( it . util . varOccurences ( $code , $nextData ) < 2 ) {
$code = it . util . varReplace ( $code , $nextData , $passData ) ;
var $useData = $passData ;
} else {
var $useData = $nextData ;
out += ' var ' + ( $nextData ) + ' = ' + ( $passData ) + '; ' ;
}
if ( $hasDefault ) {
out += ' ' + ( $code ) + ' ' ;
} else {
if ( $requiredHash && $requiredHash [ $propertyKey ] ) {
out += ' if (' + ( $useData ) + ' === undefined) { valid' + ( $it . level ) + ' = false; ' ;
var $currentErrorPath = it . errorPath ,
$currErrSchemaPath = $errSchemaPath ,
$missingProperty = it . util . escapeQuotes ( $propertyKey ) ;
if ( it . opts . _errorDataPathProperty ) {
it . errorPath = it . util . getPath ( $currentErrorPath , $propertyKey , it . opts . jsonPointers ) ;
}
$errSchemaPath = it . errSchemaPath + '/required' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'required' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { missingProperty: \'' + ( $missingProperty ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'' ;
if ( it . opts . _errorDataPathProperty ) {
out += 'is a required property' ;
} else {
out += 'should have required property \\\'' + ( $missingProperty ) + '\\\'' ;
}
out += '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
$errSchemaPath = $currErrSchemaPath ;
it . errorPath = $currentErrorPath ;
out += ' } else { ' ;
} else {
if ( $breakOnError ) {
out += ' if (' + ( $useData ) + ' === undefined) { valid' + ( $it . level ) + ' = true; } else { ' ;
} else {
out += ' if (' + ( $useData ) + ' !== undefined) { ' ;
}
}
out += ' ' + ( $code ) + ' } ' ;
}
}
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
$closingBraces += '}' ;
}
}
}
}
var arr5 = $pPropertyKeys ;
if ( arr5 ) {
var $pProperty , i5 = - 1 ,
l5 = arr5 . length - 1 ;
while ( i5 < l5 ) {
$pProperty = arr5 [ i5 += 1 ] ;
var $sch = $pProperties [ $pProperty ] ;
if ( it . util . schemaHasRules ( $sch , it . RULES . all ) ) {
$it . schema = $sch ;
$it . schemaPath = it . schemaPath + '.patternProperties' + it . util . getProperty ( $pProperty ) ;
$it . errSchemaPath = it . errSchemaPath + '/patternProperties/' + it . util . escapeFragment ( $pProperty ) ;
out += ' for (var ' + ( $key ) + ' in ' + ( $data ) + ') { ' ;
if ( $ownProperties ) {
out += ' if (!Object.prototype.hasOwnProperty.call(' + ( $data ) + ', ' + ( $key ) + ')) continue; ' ;
}
out += ' if (' + ( it . usePattern ( $pProperty ) ) + '.test(' + ( $key ) + ')) { ' ;
$it . errorPath = it . util . getPathExpr ( it . errorPath , 'key' + $lvl , it . opts . jsonPointers ) ;
var $passData = $data + '[key' + $lvl + ']' ;
$it . dataPathArr [ $dataNxt ] = 'key' + $lvl ;
var $code = it . validate ( $it ) ;
$it . baseId = $currentBaseId ;
if ( it . util . varOccurences ( $code , $nextData ) < 2 ) {
out += ' ' + ( it . util . varReplace ( $code , $nextData , $passData ) ) + ' ' ;
} else {
out += ' var ' + ( $nextData ) + ' = ' + ( $passData ) + '; ' + ( $code ) + ' ' ;
}
if ( $breakOnError ) {
out += ' if (!valid' + ( $it . level ) + ') break; ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' else valid' + ( $it . level ) + ' = true; ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
$closingBraces += '}' ;
}
}
}
}
if ( it . opts . v5 ) {
var arr6 = $pgPropertyKeys ;
if ( arr6 ) {
var $pgProperty , i6 = - 1 ,
l6 = arr6 . length - 1 ;
while ( i6 < l6 ) {
$pgProperty = arr6 [ i6 += 1 ] ;
var $pgSchema = $pgProperties [ $pgProperty ] ,
$sch = $pgSchema . schema ;
if ( it . util . schemaHasRules ( $sch , it . RULES . all ) ) {
$it . schema = $sch ;
$it . schemaPath = it . schemaPath + '.patternGroups' + it . util . getProperty ( $pgProperty ) + '.schema' ;
$it . errSchemaPath = it . errSchemaPath + '/patternGroups/' + it . util . escapeFragment ( $pgProperty ) + '/schema' ;
out += ' var pgPropCount' + ( $lvl ) + ' = 0; for (var ' + ( $key ) + ' in ' + ( $data ) + ') { ' ;
if ( $ownProperties ) {
out += ' if (!Object.prototype.hasOwnProperty.call(' + ( $data ) + ', ' + ( $key ) + ')) continue; ' ;
}
out += ' if (' + ( it . usePattern ( $pgProperty ) ) + '.test(' + ( $key ) + ')) { pgPropCount' + ( $lvl ) + '++; ' ;
$it . errorPath = it . util . getPathExpr ( it . errorPath , 'key' + $lvl , it . opts . jsonPointers ) ;
var $passData = $data + '[key' + $lvl + ']' ;
$it . dataPathArr [ $dataNxt ] = 'key' + $lvl ;
var $code = it . validate ( $it ) ;
$it . baseId = $currentBaseId ;
if ( it . util . varOccurences ( $code , $nextData ) < 2 ) {
out += ' ' + ( it . util . varReplace ( $code , $nextData , $passData ) ) + ' ' ;
} else {
out += ' var ' + ( $nextData ) + ' = ' + ( $passData ) + '; ' + ( $code ) + ' ' ;
}
if ( $breakOnError ) {
out += ' if (!valid' + ( $it . level ) + ') break; ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' else valid' + ( $it . level ) + ' = true; ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
$closingBraces += '}' ;
}
var $pgMin = $pgSchema . minimum ,
$pgMax = $pgSchema . maximum ;
if ( $pgMin !== undefined || $pgMax !== undefined ) {
out += ' var ' + ( $valid ) + ' = true; ' ;
var $currErrSchemaPath = $errSchemaPath ;
if ( $pgMin !== undefined ) {
var $limit = $pgMin ,
$reason = 'minimum' ,
$moreOrLess = 'less' ;
out += ' ' + ( $valid ) + ' = pgPropCount' + ( $lvl ) + ' >= ' + ( $pgMin ) + '; ' ;
$errSchemaPath = it . errSchemaPath + '/patternGroups/minimum' ;
out += ' if (!' + ( $valid ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'patternGroups' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { reason: \'' + ( $reason ) + '\', limit: ' + ( $limit ) + ', pattern: \'' + ( it . util . escapeQuotes ( $pgProperty ) ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT have ' + ( $moreOrLess ) + ' than ' + ( $limit ) + ' properties matching pattern "' + ( it . util . escapeQuotes ( $pgProperty ) ) + '"\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } ' ;
if ( $pgMax !== undefined ) {
out += ' else ' ;
}
}
if ( $pgMax !== undefined ) {
var $limit = $pgMax ,
$reason = 'maximum' ,
$moreOrLess = 'more' ;
out += ' ' + ( $valid ) + ' = pgPropCount' + ( $lvl ) + ' <= ' + ( $pgMax ) + '; ' ;
$errSchemaPath = it . errSchemaPath + '/patternGroups/maximum' ;
out += ' if (!' + ( $valid ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'patternGroups' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { reason: \'' + ( $reason ) + '\', limit: ' + ( $limit ) + ', pattern: \'' + ( it . util . escapeQuotes ( $pgProperty ) ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT have ' + ( $moreOrLess ) + ' than ' + ( $limit ) + ' properties matching pattern "' + ( it . util . escapeQuotes ( $pgProperty ) ) + '"\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } ' ;
}
$errSchemaPath = $currErrSchemaPath ;
if ( $breakOnError ) {
out += ' if (' + ( $valid ) + ') { ' ;
$closingBraces += '}' ;
}
}
}
}
}
}
if ( $breakOnError ) {
out += ' ' + ( $closingBraces ) + ' if (' + ( $errs ) + ' == errors) {' ;
}
out = it . util . cleanUpCode ( out ) ;
return out ;
}
} , { } ] , 30 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _ref ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $async , $refCode ;
if ( $schema == '#' || $schema == '#/' ) {
if ( it . isRoot ) {
$async = it . async ;
$refCode = 'validate' ;
} else {
$async = it . root . schema . $async === true ;
$refCode = 'root.refVal[0]' ;
}
} else {
var $refVal = it . resolveRef ( it . baseId , $schema , it . isRoot ) ;
if ( $refVal === undefined ) {
var $message = 'can\'t resolve reference ' + $schema + ' from id ' + it . baseId ;
if ( it . opts . missingRefs == 'fail' ) {
console . log ( $message ) ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || '$ref' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { ref: \'' + ( it . util . escapeQuotes ( $schema ) ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'can\\\'t resolve reference ' + ( it . util . escapeQuotes ( $schema ) ) + '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: ' + ( it . util . toQuotedString ( $schema ) ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
if ( $breakOnError ) {
out += ' if (false) { ' ;
}
} else if ( it . opts . missingRefs == 'ignore' ) {
console . log ( $message ) ;
if ( $breakOnError ) {
out += ' if (true) { ' ;
}
} else {
var $error = new Error ( $message ) ;
$error . missingRef = it . resolve . url ( it . baseId , $schema ) ;
$error . missingSchema = it . resolve . normalizeId ( it . resolve . fullPath ( $error . missingRef ) ) ;
throw $error ;
}
} else if ( $refVal . inline ) {
var $it = it . util . copy ( it ) ;
$it . level ++ ;
$it . schema = $refVal . schema ;
$it . schemaPath = '' ;
$it . errSchemaPath = $schema ;
var $code = it . validate ( $it ) . replace ( /validate\.schema/g , $refVal . code ) ;
out += ' ' + ( $code ) + ' ' ;
if ( $breakOnError ) {
out += ' if (valid' + ( $it . level ) + ') { ' ;
}
} else {
$async = $refVal . $async === true ;
$refCode = $refVal . code ;
}
}
if ( $refCode ) {
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ;
if ( it . opts . passContext ) {
out += ' ' + ( $refCode ) + '.call(this, ' ;
} else {
out += ' ' + ( $refCode ) + '( ' ;
}
out += ' ' + ( $data ) + ', (dataPath || \'\')' ;
if ( it . errorPath != '""' ) {
out += ' + ' + ( it . errorPath ) ;
}
if ( $dataLvl ) {
out += ' , data' + ( ( $dataLvl - 1 ) || '' ) + ' , ' + ( it . dataPathArr [ $dataLvl ] ) + ' ' ;
} else {
out += ' , parentData , parentDataProperty ' ;
}
out += ') ' ;
var _ _callValidate = out ;
out = $$outStack . pop ( ) ;
if ( $async ) {
if ( ! it . async ) throw new Error ( 'async schema referenced by sync schema' ) ;
out += ' try { ' ;
if ( $breakOnError ) {
out += 'var ' + ( $valid ) + ' =' ;
}
out += ' ' + ( it . yieldAwait ) + ' ' + ( _ _callValidate ) + '; } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; } ' ;
if ( $breakOnError ) {
out += ' if (' + ( $valid ) + ') { ' ;
}
} else {
out += ' if (!' + ( _ _callValidate ) + ') { if (vErrors === null) vErrors = ' + ( $refCode ) + '.errors; else vErrors = vErrors.concat(' + ( $refCode ) + '.errors); errors = vErrors.length; } ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
}
}
return out ;
}
} , { } ] , 31 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _required ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
if ( ! $isData ) {
if ( $schema . length < it . opts . loopRequired && it . schema . properties && Object . keys ( it . schema . properties ) . length ) {
var $required = [ ] ;
var arr1 = $schema ;
if ( arr1 ) {
var $property , i1 = - 1 ,
l1 = arr1 . length - 1 ;
while ( i1 < l1 ) {
$property = arr1 [ i1 += 1 ] ;
var $propertySch = it . schema . properties [ $property ] ;
if ( ! ( $propertySch && it . util . schemaHasRules ( $propertySch , it . RULES . all ) ) ) {
$required [ $required . length ] = $property ;
}
}
}
} else {
var $required = $schema ;
}
}
if ( $isData || $required . length ) {
var $currentErrorPath = it . errorPath ,
$loopRequired = $isData || $required . length >= it . opts . loopRequired ;
if ( $breakOnError ) {
out += ' var missing' + ( $lvl ) + '; ' ;
if ( $loopRequired ) {
if ( ! $isData ) {
out += ' var schema' + ( $lvl ) + ' = validate.schema' + ( $schemaPath ) + '; ' ;
}
var $i = 'i' + $lvl ,
$propertyPath = 'schema' + $lvl + '[' + $i + ']' ,
$missingProperty = '\' + ' + $propertyPath + ' + \'' ;
if ( it . opts . _errorDataPathProperty ) {
it . errorPath = it . util . getPathExpr ( $currentErrorPath , $propertyPath , it . opts . jsonPointers ) ;
}
out += ' var ' + ( $valid ) + ' = true; ' ;
if ( $isData ) {
out += ' if (schema' + ( $lvl ) + ' === undefined) ' + ( $valid ) + ' = true; else if (!Array.isArray(schema' + ( $lvl ) + ')) ' + ( $valid ) + ' = false; else {' ;
}
out += ' for (var ' + ( $i ) + ' = 0; ' + ( $i ) + ' < schema' + ( $lvl ) + '.length; ' + ( $i ) + '++) { ' + ( $valid ) + ' = ' + ( $data ) + '[schema' + ( $lvl ) + '[' + ( $i ) + ']] !== undefined; if (!' + ( $valid ) + ') break; } ' ;
if ( $isData ) {
out += ' } ' ;
}
out += ' if (!' + ( $valid ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'required' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { missingProperty: \'' + ( $missingProperty ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'' ;
if ( it . opts . _errorDataPathProperty ) {
out += 'is a required property' ;
} else {
out += 'should have required property \\\'' + ( $missingProperty ) + '\\\'' ;
}
out += '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } else { ' ;
} else {
out += ' if ( ' ;
var arr2 = $required ;
if ( arr2 ) {
var _$property , $i = - 1 ,
l2 = arr2 . length - 1 ;
while ( $i < l2 ) {
_$property = arr2 [ $i += 1 ] ;
if ( $i ) {
out += ' || ' ;
}
var $prop = it . util . getProperty ( _$property ) ;
out += ' ( ' + ( $data ) + ( $prop ) + ' === undefined && (missing' + ( $lvl ) + ' = ' + ( it . util . toQuotedString ( it . opts . jsonPointers ? _$property : $prop ) ) + ') ) ' ;
}
}
out += ') { ' ;
var $propertyPath = 'missing' + $lvl ,
$missingProperty = '\' + ' + $propertyPath + ' + \'' ;
if ( it . opts . _errorDataPathProperty ) {
it . errorPath = it . opts . jsonPointers ? it . util . getPathExpr ( $currentErrorPath , $propertyPath , true ) : $currentErrorPath + ' + ' + $propertyPath ;
}
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'required' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { missingProperty: \'' + ( $missingProperty ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'' ;
if ( it . opts . _errorDataPathProperty ) {
out += 'is a required property' ;
} else {
out += 'should have required property \\\'' + ( $missingProperty ) + '\\\'' ;
}
out += '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } else { ' ;
}
} else {
if ( $loopRequired ) {
if ( ! $isData ) {
out += ' var schema' + ( $lvl ) + ' = validate.schema' + ( $schemaPath ) + '; ' ;
}
var $i = 'i' + $lvl ,
$propertyPath = 'schema' + $lvl + '[' + $i + ']' ,
$missingProperty = '\' + ' + $propertyPath + ' + \'' ;
if ( it . opts . _errorDataPathProperty ) {
it . errorPath = it . util . getPathExpr ( $currentErrorPath , $propertyPath , it . opts . jsonPointers ) ;
}
if ( $isData ) {
out += ' if (schema' + ( $lvl ) + ' && !Array.isArray(schema' + ( $lvl ) + ')) { var err = ' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'required' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { missingProperty: \'' + ( $missingProperty ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'' ;
if ( it . opts . _errorDataPathProperty ) {
out += 'is a required property' ;
} else {
out += 'should have required property \\\'' + ( $missingProperty ) + '\\\'' ;
}
out += '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (schema' + ( $lvl ) + ' !== undefined) { ' ;
}
out += ' for (var ' + ( $i ) + ' = 0; ' + ( $i ) + ' < schema' + ( $lvl ) + '.length; ' + ( $i ) + '++) { if (' + ( $data ) + '[schema' + ( $lvl ) + '[' + ( $i ) + ']] === undefined) { var err = ' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'required' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { missingProperty: \'' + ( $missingProperty ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'' ;
if ( it . opts . _errorDataPathProperty ) {
out += 'is a required property' ;
} else {
out += 'should have required property \\\'' + ( $missingProperty ) + '\\\'' ;
}
out += '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ' ;
if ( $isData ) {
out += ' } ' ;
}
} else {
var arr3 = $required ;
if ( arr3 ) {
var $reqProperty , i3 = - 1 ,
l3 = arr3 . length - 1 ;
while ( i3 < l3 ) {
$reqProperty = arr3 [ i3 += 1 ] ;
var $prop = it . util . getProperty ( $reqProperty ) ,
$missingProperty = it . util . escapeQuotes ( $reqProperty ) ;
if ( it . opts . _errorDataPathProperty ) {
it . errorPath = it . util . getPath ( $currentErrorPath , $reqProperty , it . opts . jsonPointers ) ;
}
out += ' if (' + ( $data ) + ( $prop ) + ' === undefined) { var err = ' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'required' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { missingProperty: \'' + ( $missingProperty ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'' ;
if ( it . opts . _errorDataPathProperty ) {
out += 'is a required property' ;
} else {
out += 'should have required property \\\'' + ( $missingProperty ) + '\\\'' ;
}
out += '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ' ;
}
}
}
}
it . errorPath = $currentErrorPath ;
} else if ( $breakOnError ) {
out += ' if (true) {' ;
}
return out ;
}
} , { } ] , 32 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _switch ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $errs = 'errs__' + $lvl ;
var $it = it . util . copy ( it ) ;
var $closingBraces = '' ;
$it . level ++ ;
var $ifPassed = 'ifPassed' + it . level ,
$currentBaseId = $it . baseId ,
$shouldContinue ;
out += 'var ' + ( $ifPassed ) + ';' ;
var arr1 = $schema ;
if ( arr1 ) {
var $sch , $caseIndex = - 1 ,
l1 = arr1 . length - 1 ;
while ( $caseIndex < l1 ) {
$sch = arr1 [ $caseIndex += 1 ] ;
if ( $caseIndex && ! $shouldContinue ) {
out += ' if (!' + ( $ifPassed ) + ') { ' ;
$closingBraces += '}' ;
}
if ( $sch . if && it . util . schemaHasRules ( $sch . if , it . RULES . all ) ) {
out += ' var ' + ( $errs ) + ' = errors; ' ;
var $wasComposite = it . compositeRule ;
it . compositeRule = $it . compositeRule = true ;
$it . createErrors = false ;
$it . schema = $sch . if ;
$it . schemaPath = $schemaPath + '[' + $caseIndex + '].if' ;
$it . errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/if' ;
out += ' ' + ( it . validate ( $it ) ) + ' ' ;
$it . baseId = $currentBaseId ;
$it . createErrors = true ;
it . compositeRule = $it . compositeRule = $wasComposite ;
out += ' ' + ( $ifPassed ) + ' = valid' + ( $it . level ) + '; if (' + ( $ifPassed ) + ') { ' ;
if ( typeof $sch . then == 'boolean' ) {
if ( $sch . then === false ) {
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'switch' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { caseIndex: ' + ( $caseIndex ) + ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should pass "switch" keyword validation\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
}
out += ' var valid' + ( $it . level ) + ' = ' + ( $sch . then ) + '; ' ;
} else {
$it . schema = $sch . then ;
$it . schemaPath = $schemaPath + '[' + $caseIndex + '].then' ;
$it . errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then' ;
out += ' ' + ( it . validate ( $it ) ) + ' ' ;
$it . baseId = $currentBaseId ;
}
out += ' } else { errors = ' + ( $errs ) + '; if (vErrors !== null) { if (' + ( $errs ) + ') vErrors.length = ' + ( $errs ) + '; else vErrors = null; } } ' ;
} else {
out += ' ' + ( $ifPassed ) + ' = true; ' ;
if ( typeof $sch . then == 'boolean' ) {
if ( $sch . then === false ) {
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'switch' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { caseIndex: ' + ( $caseIndex ) + ' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should pass "switch" keyword validation\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
}
out += ' var valid' + ( $it . level ) + ' = ' + ( $sch . then ) + '; ' ;
} else {
$it . schema = $sch . then ;
$it . schemaPath = $schemaPath + '[' + $caseIndex + '].then' ;
$it . errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then' ;
out += ' ' + ( it . validate ( $it ) ) + ' ' ;
$it . baseId = $currentBaseId ;
}
}
$shouldContinue = $sch . continue
}
}
out += '' + ( $closingBraces ) + 'var ' + ( $valid ) + ' = valid' + ( $it . level ) + '; ' ;
out = it . util . cleanUpCode ( out ) ;
return out ;
}
} , { } ] , 33 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _uniqueItems ( it , $keyword ) {
var out = ' ' ;
var $lvl = it . level ;
var $dataLvl = it . dataLevel ;
var $schema = it . schema [ $keyword ] ;
var $schemaPath = it . schemaPath + '.' + $keyword ;
var $errSchemaPath = it . errSchemaPath + '/' + $keyword ;
var $breakOnError = ! it . opts . allErrors ;
var $errorKeyword ;
var $data = 'data' + ( $dataLvl || '' ) ;
var $valid = 'valid' + $lvl ;
var $isData = it . opts . v5 && $schema . $data ;
var $schemaValue = $isData ? it . util . getData ( $schema . $data , $dataLvl , it . dataPathArr ) : $schema ;
if ( $isData ) {
out += ' var schema' + ( $lvl ) + ' = ' + ( $schemaValue ) + '; ' ;
$schemaValue = 'schema' + $lvl ;
}
if ( ( $schema || $isData ) && it . opts . uniqueItems !== false ) {
if ( $isData ) {
out += ' var ' + ( $valid ) + '; if (' + ( $schemaValue ) + ' === false || ' + ( $schemaValue ) + ' === undefined) ' + ( $valid ) + ' = true; else if (typeof ' + ( $schemaValue ) + ' != \'boolean\') ' + ( $valid ) + ' = false; else { ' ;
}
out += ' var ' + ( $valid ) + ' = true; if (' + ( $data ) + '.length > 1) { var i = ' + ( $data ) + '.length, j; outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ( $data ) + '[i], ' + ( $data ) + '[j])) { ' + ( $valid ) + ' = false; break outer; } } } } ' ;
if ( $isData ) {
out += ' } ' ;
}
out += ' if (!' + ( $valid ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'uniqueItems' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { i: i, j: j } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: ' ;
if ( $isData ) {
out += 'validate.schema' + ( $schemaPath ) ;
} else {
out += '' + ( $schema ) ;
}
out += ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
} else {
if ( $breakOnError ) {
out += ' if (true) { ' ;
}
}
return out ;
}
} , { } ] , 34 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = function generate _validate ( it , $keyword ) {
var out = '' ;
var $async = it . schema . $async === true ;
if ( it . isTop ) {
var $top = it . isTop ,
$lvl = it . level = 0 ,
$dataLvl = it . dataLevel = 0 ,
$data = 'data' ;
it . rootId = it . resolve . fullPath ( it . root . schema . id ) ;
it . baseId = it . baseId || it . rootId ;
if ( $async ) {
it . async = true ;
var $es7 = it . opts . async == 'es7' ;
it . yieldAwait = $es7 ? 'await' : 'yield' ;
}
delete it . isTop ;
it . dataPathArr = [ undefined ] ;
out += ' validate = ' ;
if ( $async ) {
if ( $es7 ) {
out += ' (async function ' ;
} else {
if ( it . opts . async == 'co*' ) {
out += 'co.wrap' ;
}
out += '(function* ' ;
}
} else {
out += ' (function ' ;
}
out += ' (data, dataPath, parentData, parentDataProperty) { \'use strict\'; var vErrors = null; ' ;
out += ' var errors = 0; ' ;
} else {
var $lvl = it . level ,
$dataLvl = it . dataLevel ,
$data = 'data' + ( $dataLvl || '' ) ;
if ( it . schema . id ) it . baseId = it . resolve . url ( it . baseId , it . schema . id ) ;
if ( $async && ! it . async ) throw new Error ( 'async schema in sync schema' ) ;
out += ' var errs_' + ( $lvl ) + ' = errors;' ;
}
var $valid = 'valid' + $lvl ,
$breakOnError = ! it . opts . allErrors ,
$closingBraces1 = '' ,
$closingBraces2 = '' ,
$errorKeyword ;
var $typeSchema = it . schema . type ,
$typeIsArray = Array . isArray ( $typeSchema ) ;
if ( $typeSchema && it . opts . coerceTypes ) {
var $coerceToTypes = it . util . coerceToTypes ( $typeSchema ) ;
if ( $coerceToTypes ) {
var $schemaPath = it . schemaPath + '.type' ,
$errSchemaPath = it . errSchemaPath + '/type' ,
$method = $typeIsArray ? 'checkDataTypes' : 'checkDataType' ;
out += ' if (' + ( it . util [ $method ] ( $typeSchema , $data , true ) ) + ') { ' ;
var $dataType = 'dataType' + $lvl ,
$coerced = 'coerced' + $lvl ;
out += ' var ' + ( $dataType ) + ' = typeof ' + ( $data ) + '; var ' + ( $coerced ) + ' = undefined; ' ;
var $bracesCoercion = '' ;
var arr1 = $coerceToTypes ;
if ( arr1 ) {
var $type , $i = - 1 ,
l1 = arr1 . length - 1 ;
while ( $i < l1 ) {
$type = arr1 [ $i += 1 ] ;
if ( $i ) {
out += ' if (' + ( $coerced ) + ' === undefined) { ' ;
$bracesCoercion += '}' ;
}
if ( $type == 'string' ) {
out += ' if (' + ( $dataType ) + ' == \'number\' || ' + ( $dataType ) + ' == \'boolean\') ' + ( $coerced ) + ' = \'\' + ' + ( $data ) + '; else if (' + ( $data ) + ' === null) ' + ( $coerced ) + ' = \'\'; ' ;
} else if ( $type == 'number' || $type == 'integer' ) {
out += ' if (' + ( $dataType ) + ' == \'boolean\' || ' + ( $data ) + ' === null || (' + ( $dataType ) + ' == \'string\' && ' + ( $data ) + ' && ' + ( $data ) + ' == +' + ( $data ) + ' ' ;
if ( $type == 'integer' ) {
out += ' && !(' + ( $data ) + ' % 1)' ;
}
out += ')) ' + ( $coerced ) + ' = +' + ( $data ) + '; ' ;
} else if ( $type == 'boolean' ) {
out += ' if (' + ( $data ) + ' === \'false\' || ' + ( $data ) + ' === 0 || ' + ( $data ) + ' === null) ' + ( $coerced ) + ' = false; else if (' + ( $data ) + ' === \'true\' || ' + ( $data ) + ' === 1) ' + ( $coerced ) + ' = true; ' ;
} else if ( $type == 'null' ) {
out += ' if (' + ( $data ) + ' === \'\' || ' + ( $data ) + ' === 0 || ' + ( $data ) + ' === false) ' + ( $coerced ) + ' = null; ' ;
}
}
}
out += ' ' + ( $bracesCoercion ) + ' if (' + ( $coerced ) + ' === undefined) { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'type' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { type: \'' ;
if ( $typeIsArray ) {
out += '' + ( $typeSchema . join ( "," ) ) ;
} else {
out += '' + ( $typeSchema ) ;
}
out += '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should be ' ;
if ( $typeIsArray ) {
out += '' + ( $typeSchema . join ( "," ) ) ;
} else {
out += '' + ( $typeSchema ) ;
}
out += '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } else { ' ;
if ( $dataLvl ) {
var $parentData = 'data' + ( ( $dataLvl - 1 ) || '' ) ,
$dataProperty = it . dataPathArr [ $dataLvl ] ;
out += ' ' + ( $data ) + ' = ' + ( $parentData ) + '[' + ( $dataProperty ) + '] = ' + ( $coerced ) + '; ' ;
} else {
out += ' data = ' + ( $coerced ) + '; if (parentData !== undefined) parentData[parentDataProperty] = ' + ( $coerced ) + '; ' ;
}
out += ' } } ' ;
}
}
var arr2 = it . RULES ;
if ( arr2 ) {
var $rulesGroup , i2 = - 1 ,
l2 = arr2 . length - 1 ;
while ( i2 < l2 ) {
$rulesGroup = arr2 [ i2 += 1 ] ;
if ( $shouldUseGroup ( $rulesGroup ) ) {
if ( $rulesGroup . type ) {
out += ' if (' + ( it . util . checkDataType ( $rulesGroup . type , $data ) ) + ') { ' ;
}
if ( it . opts . useDefaults && ! it . compositeRule ) {
if ( $rulesGroup . type == 'object' && it . schema . properties ) {
var $schema = it . schema . properties ,
$schemaKeys = Object . keys ( $schema ) ;
var arr3 = $schemaKeys ;
if ( arr3 ) {
var $propertyKey , i3 = - 1 ,
l3 = arr3 . length - 1 ;
while ( i3 < l3 ) {
$propertyKey = arr3 [ i3 += 1 ] ;
var $sch = $schema [ $propertyKey ] ;
if ( $sch . default !== undefined ) {
var $passData = $data + it . util . getProperty ( $propertyKey ) ;
out += ' if (' + ( $passData ) + ' === undefined) ' + ( $passData ) + ' = ' ;
if ( it . opts . useDefaults == 'shared' ) {
out += ' ' + ( it . useDefault ( $sch . default ) ) + ' ' ;
} else {
out += ' ' + ( JSON . stringify ( $sch . default ) ) + ' ' ;
}
out += '; ' ;
}
}
}
} else if ( $rulesGroup . type == 'array' && Array . isArray ( it . schema . items ) ) {
var arr4 = it . schema . items ;
if ( arr4 ) {
var $sch , $i = - 1 ,
l4 = arr4 . length - 1 ;
while ( $i < l4 ) {
$sch = arr4 [ $i += 1 ] ;
if ( $sch . default !== undefined ) {
var $passData = $data + '[' + $i + ']' ;
out += ' if (' + ( $passData ) + ' === undefined) ' + ( $passData ) + ' = ' ;
if ( it . opts . useDefaults == 'shared' ) {
out += ' ' + ( it . useDefault ( $sch . default ) ) + ' ' ;
} else {
out += ' ' + ( JSON . stringify ( $sch . default ) ) + ' ' ;
}
out += '; ' ;
}
}
}
}
}
var arr5 = $rulesGroup . rules ;
if ( arr5 ) {
var $rule , i5 = - 1 ,
l5 = arr5 . length - 1 ;
while ( i5 < l5 ) {
$rule = arr5 [ i5 += 1 ] ;
if ( $shouldUseRule ( $rule ) ) {
if ( $rule . custom ) {
var $schema = it . schema [ $rule . keyword ] ,
$ruleValidate = it . useCustomRule ( $rule , $schema , it . schema , it ) ,
$ruleErrs = $ruleValidate . code + '.errors' ,
$schemaPath = it . schemaPath + '.' + $rule . keyword ,
$errSchemaPath = it . errSchemaPath + '/' + $rule . keyword ,
$errs = 'errs' + $lvl ,
$i = 'i' + $lvl ,
$ruleErr = 'ruleErr' + $lvl ,
$rDef = $rule . definition ,
$asyncKeyword = $rDef . async ,
$inline = $rDef . inline ,
$macro = $rDef . macro ;
if ( $asyncKeyword && ! it . async ) throw new Error ( 'async keyword in sync schema' ) ;
if ( ! ( $inline || $macro ) ) {
out += '' + ( $ruleErrs ) + ' = null;' ;
}
out += 'var ' + ( $errs ) + ' = errors;var valid' + ( $lvl ) + ';' ;
if ( $inline && $rDef . statements ) {
out += ' ' + ( $ruleValidate . validate ) ;
} else if ( $macro ) {
var $it = it . util . copy ( it ) ;
$it . level ++ ;
$it . schema = $ruleValidate . validate ;
$it . schemaPath = '' ;
var $wasComposite = it . compositeRule ;
it . compositeRule = $it . compositeRule = true ;
var $code = it . validate ( $it ) . replace ( /validate\.schema/g , $ruleValidate . code ) ;
it . compositeRule = $it . compositeRule = $wasComposite ;
out += ' ' + ( $code ) ;
} else if ( $rDef . compile || $rDef . validate ) {
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ;
out += ' ' + ( $ruleValidate . code ) + '.call( ' ;
if ( it . opts . passContext ) {
out += 'this' ;
} else {
out += 'self' ;
}
if ( $rDef . compile || $rDef . schema === false ) {
out += ' , ' + ( $data ) + ' ' ;
} else {
out += ' , validate.schema' + ( $schemaPath ) + ' , ' + ( $data ) + ' , validate.schema' + ( it . schemaPath ) + ' ' ;
}
out += ' , (dataPath || \'\')' ;
if ( it . errorPath != '""' ) {
out += ' + ' + ( it . errorPath ) ;
}
if ( $dataLvl ) {
out += ' , data' + ( ( $dataLvl - 1 ) || '' ) + ' , ' + ( it . dataPathArr [ $dataLvl ] ) + ' ' ;
} else {
out += ' , parentData , parentDataProperty ' ;
}
out += ' ) ' ;
var def _callRuleValidate = out ;
out = $$outStack . pop ( ) ;
if ( $rDef . errors !== false ) {
if ( $asyncKeyword ) {
$ruleErrs = 'customErrors' + $lvl ;
out += ' var ' + ( $ruleErrs ) + ' = null; try { valid' + ( $lvl ) + ' = ' + ( it . yieldAwait ) + ( def _callRuleValidate ) + '; } catch (e) { valid' + ( $lvl ) + ' = false; if (e instanceof ValidationError) ' + ( $ruleErrs ) + ' = e.errors; else throw e; } ' ;
} else {
out += ' ' + ( $ruleValidate . code ) + '.errors = null; ' ;
}
}
}
out += 'if (! ' ;
if ( $inline ) {
if ( $rDef . statements ) {
out += ' valid' + ( $lvl ) + ' ' ;
} else {
out += ' (' + ( $ruleValidate . validate ) + ') ' ;
}
} else if ( $macro ) {
out += ' valid' + ( $it . level ) + ' ' ;
} else {
if ( $asyncKeyword ) {
if ( $rDef . errors === false ) {
out += ' (' + ( it . yieldAwait ) + ( def _callRuleValidate ) + ') ' ;
} else {
out += ' valid' + ( $lvl ) + ' ' ;
}
} else {
out += ' ' + ( def _callRuleValidate ) + ' ' ;
}
}
out += ') { ' ;
$errorKeyword = $rule . keyword ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'custom' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { keyword: \'' + ( $rule . keyword ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should pass "' + ( $rule . keyword ) + '" keyword validation\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
var def _customError = out ;
out = $$outStack . pop ( ) ;
if ( $inline ) {
if ( $rDef . errors ) {
if ( $rDef . errors != 'full' ) {
out += ' for (var ' + ( $i ) + '=' + ( $errs ) + '; ' + ( $i ) + '<errors; ' + ( $i ) + '++) { var ' + ( $ruleErr ) + ' = vErrors[' + ( $i ) + ']; if (' + ( $ruleErr ) + '.dataPath === undefined) { ' + ( $ruleErr ) + '.dataPath = (dataPath || \'\') + ' + ( it . errorPath ) + '; } if (' + ( $ruleErr ) + '.schemaPath === undefined) { ' + ( $ruleErr ) + '.schemaPath = "' + ( $errSchemaPath ) + '"; } ' ;
if ( it . opts . verbose ) {
out += ' ' + ( $ruleErr ) + '.schema = validate.schema' + ( $schemaPath ) + '; ' + ( $ruleErr ) + '.data = ' + ( $data ) + '; ' ;
}
out += ' } ' ;
}
} else {
if ( $rDef . errors === false ) {
out += ' ' + ( def _customError ) + ' ' ;
} else {
out += ' if (' + ( $errs ) + ' == errors) { ' + ( def _customError ) + ' } else { for (var ' + ( $i ) + '=' + ( $errs ) + '; ' + ( $i ) + '<errors; ' + ( $i ) + '++) { var ' + ( $ruleErr ) + ' = vErrors[' + ( $i ) + ']; if (' + ( $ruleErr ) + '.dataPath === undefined) { ' + ( $ruleErr ) + '.dataPath = (dataPath || \'\') + ' + ( it . errorPath ) + '; } if (' + ( $ruleErr ) + '.schemaPath === undefined) { ' + ( $ruleErr ) + '.schemaPath = "' + ( $errSchemaPath ) + '"; } ' ;
if ( it . opts . verbose ) {
out += ' ' + ( $ruleErr ) + '.schema = validate.schema' + ( $schemaPath ) + '; ' + ( $ruleErr ) + '.data = ' + ( $data ) + '; ' ;
}
out += ' } } ' ;
}
}
} else if ( $macro ) {
out += ' var err = ' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'custom' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { keyword: \'' + ( $rule . keyword ) + '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should pass "' + ( $rule . keyword ) + '" keyword validation\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError(vErrors); ' ;
} else {
out += ' validate.errors = vErrors; return false ' ;
}
}
} else {
if ( $rDef . errors === false ) {
out += ' ' + ( def _customError ) + ' ' ;
} else {
out += ' if (Array.isArray(' + ( $ruleErrs ) + ')) { if (vErrors === null) vErrors = ' + ( $ruleErrs ) + '; else vErrors.concat(' + ( $ruleErrs ) + '); errors = vErrors.length; for (var ' + ( $i ) + '=' + ( $errs ) + '; ' + ( $i ) + '<errors; ' + ( $i ) + '++) { var ' + ( $ruleErr ) + ' = vErrors[' + ( $i ) + ']; ' + ( $ruleErr ) + '.dataPath = (dataPath || \'\') + ' + ( it . errorPath ) + '; ' + ( $ruleErr ) + '.schemaPath = "' + ( $errSchemaPath ) + '"; ' ;
if ( it . opts . verbose ) {
out += ' ' + ( $ruleErr ) + '.schema = validate.schema' + ( $schemaPath ) + '; ' + ( $ruleErr ) + '.data = ' + ( $data ) + '; ' ;
}
out += ' } } else { ' + ( def _customError ) + ' } ' ;
}
}
$errorKeyword = undefined ;
out += ' } ' ;
if ( $breakOnError ) {
out += ' else { ' ;
}
} else {
out += ' ' + ( $rule . code ( it , $rule . keyword ) ) + ' ' ;
}
if ( $breakOnError ) {
$closingBraces1 += '}' ;
}
}
}
}
if ( $breakOnError ) {
out += ' ' + ( $closingBraces1 ) + ' ' ;
$closingBraces1 = '' ;
}
if ( $rulesGroup . type ) {
out += ' } ' ;
if ( $typeSchema && $typeSchema === $rulesGroup . type ) {
var $typeChecked = true ;
out += ' else { ' ;
var $schemaPath = it . schemaPath + '.type' ,
$errSchemaPath = it . errSchemaPath + '/type' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'type' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { type: \'' ;
if ( $typeIsArray ) {
out += '' + ( $typeSchema . join ( "," ) ) ;
} else {
out += '' + ( $typeSchema ) ;
}
out += '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should be ' ;
if ( $typeIsArray ) {
out += '' + ( $typeSchema . join ( "," ) ) ;
} else {
out += '' + ( $typeSchema ) ;
}
out += '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' } ' ;
}
}
if ( $breakOnError ) {
out += ' if (errors === ' ;
if ( $top ) {
out += '0' ;
} else {
out += 'errs_' + ( $lvl ) ;
}
out += ') { ' ;
$closingBraces2 += '}' ;
}
}
}
}
if ( $typeSchema && ! $typeChecked && ! ( it . opts . coerceTypes && $coerceToTypes ) ) {
var $schemaPath = it . schemaPath + '.type' ,
$errSchemaPath = it . errSchemaPath + '/type' ,
$method = $typeIsArray ? 'checkDataTypes' : 'checkDataType' ;
out += ' if (' + ( it . util [ $method ] ( $typeSchema , $data , true ) ) + ') { ' ;
var $$outStack = $$outStack || [ ] ;
$$outStack . push ( out ) ;
out = '' ; /* istanbul ignore else */
if ( it . createErrors !== false ) {
out += ' { keyword: \'' + ( $errorKeyword || 'type' ) + '\' , dataPath: (dataPath || \'\') + ' + ( it . errorPath ) + ' , schemaPath: "' + ( $errSchemaPath ) + '" , params: { type: \'' ;
if ( $typeIsArray ) {
out += '' + ( $typeSchema . join ( "," ) ) ;
} else {
out += '' + ( $typeSchema ) ;
}
out += '\' } ' ;
if ( it . opts . messages !== false ) {
out += ' , message: \'should be ' ;
if ( $typeIsArray ) {
out += '' + ( $typeSchema . join ( "," ) ) ;
} else {
out += '' + ( $typeSchema ) ;
}
out += '\' ' ;
}
if ( it . opts . verbose ) {
out += ' , schema: validate.schema' + ( $schemaPath ) + ' , parentSchema: validate.schema' + ( it . schemaPath ) + ' , data: ' + ( $data ) + ' ' ;
}
out += ' } ' ;
} else {
out += ' {} ' ;
}
var _ _err = out ;
out = $$outStack . pop ( ) ;
if ( ! it . compositeRule && $breakOnError ) { /* istanbul ignore if */
if ( it . async ) {
out += ' throw new ValidationError([' + ( _ _err ) + ']); ' ;
} else {
out += ' validate.errors = [' + ( _ _err ) + ']; return false; ' ;
}
} else {
out += ' var err = ' + ( _ _err ) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ' ;
}
out += ' }' ;
}
if ( $breakOnError ) {
out += ' ' + ( $closingBraces2 ) + ' ' ;
}
if ( $top ) {
if ( $async ) {
out += ' if (errors === 0) return true; ' ;
out += ' else throw new ValidationError(vErrors); ' ;
} else {
out += ' validate.errors = vErrors; ' ;
out += ' return errors === 0; ' ;
}
out += ' });' ;
} else {
out += ' var ' + ( $valid ) + ' = errors === errs_' + ( $lvl ) + ';' ;
}
out = it . util . cleanUpCode ( out ) ;
if ( $top && $breakOnError ) {
out = it . util . cleanUpVarErrors ( out , $async ) ;
}
function $shouldUseGroup ( $rulesGroup ) {
for ( var i = 0 ; i < $rulesGroup . rules . length ; i ++ )
if ( $shouldUseRule ( $rulesGroup . rules [ i ] ) ) return true ;
}
function $shouldUseRule ( $rule ) {
return it . schema [ $rule . keyword ] !== undefined || ( $rule . keyword == 'properties' && ( it . schema . additionalProperties === false || typeof it . schema . additionalProperties == 'object' || ( it . schema . patternProperties && Object . keys ( it . schema . patternProperties ) . length ) || ( it . opts . v5 && it . schema . patternGroups && Object . keys ( it . schema . patternGroups ) . length ) ) ) ;
}
return out ;
}
} , { } ] , 35 : [ function ( require , module , exports ) {
'use strict' ;
var IDENTIFIER = /^[a-z_$][a-z0-9_$]*$/i ;
/ * *
* Define custom keyword
* @ this Ajv
* @ param { String } keyword custom keyword , should be a valid identifier , should be different from all standard , custom and macro keywords .
* @ param { Object } definition keyword definition object with properties ` type ` ( type ( s ) which the keyword applies to ) , ` validate ` or ` compile ` .
* /
module . exports = function addKeyword ( keyword , definition ) {
/* eslint no-shadow: 0 */
var self = this ;
if ( this . RULES . keywords [ keyword ] )
throw new Error ( 'Keyword ' + keyword + ' is already defined' ) ;
if ( ! IDENTIFIER . test ( keyword ) )
throw new Error ( 'Keyword ' + keyword + ' is not a valid identifier' ) ;
if ( definition ) {
var dataType = definition . type ;
if ( Array . isArray ( dataType ) ) {
var i , len = dataType . length ;
for ( i = 0 ; i < len ; i ++ ) checkDataType ( dataType [ i ] ) ;
for ( i = 0 ; i < len ; i ++ ) _addRule ( keyword , dataType [ i ] , definition ) ;
} else {
if ( dataType ) checkDataType ( dataType ) ;
_addRule ( keyword , dataType , definition ) ;
}
}
this . RULES . keywords [ keyword ] = true ;
this . RULES . all [ keyword ] = true ;
function _addRule ( keyword , dataType , definition ) {
var ruleGroup ;
for ( var i = 0 ; i < self . RULES . length ; i ++ ) {
var rg = self . RULES [ i ] ;
if ( rg . type == dataType ) {
ruleGroup = rg ;
break ;
}
}
if ( ! ruleGroup ) {
ruleGroup = { type : dataType , rules : [ ] } ;
self . RULES . push ( ruleGroup ) ;
}
var rule = { keyword : keyword , definition : definition , custom : true } ;
ruleGroup . rules . push ( rule ) ;
}
function checkDataType ( dataType ) {
if ( ! self . RULES . types [ dataType ] ) throw new Error ( 'Unknown type ' + dataType ) ;
}
} ;
} , { } ] , 36 : [ function ( require , module , exports ) {
module . exports = {
"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" ,
"format" : "uri"
} ,
"$schema" : {
"type" : "string" ,
"format" : "uri"
} ,
"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
}
]
} ,
"allOf" : { "$ref" : "#/definitions/schemaArray" } ,
"anyOf" : { "$ref" : "#/definitions/schemaArray" } ,
"oneOf" : { "$ref" : "#/definitions/schemaArray" } ,
"not" : { "$ref" : "#" }
} ,
"dependencies" : {
"exclusiveMaximum" : [ "maximum" ] ,
"exclusiveMinimum" : [ "minimum" ]
} ,
"default" : { }
}
} , { } ] , 37 : [ function ( require , module , exports ) {
module . exports = {
"id" : "https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json#" ,
"$schema" : "http://json-schema.org/draft-04/schema#" ,
"description" : "Core schema meta-schema (v5 proposals)" ,
"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
} ,
"$data" : {
"type" : "object" ,
"required" : [ "$data" ] ,
"properties" : {
"$data" : {
"type" : "string" ,
"format" : "relative-json-pointer"
}
} ,
"additionalProperties" : false
}
} ,
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string" ,
"format" : "uri"
} ,
"$schema" : {
"type" : "string" ,
"format" : "uri"
} ,
"title" : {
"type" : "string"
} ,
"description" : {
"type" : "string"
} ,
"default" : { } ,
"multipleOf" : {
"anyOf" : [
{
"type" : "number" ,
"minimum" : 0 ,
"exclusiveMinimum" : true
} ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"maximum" : {
"anyOf" : [
{ "type" : "number" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"exclusiveMaximum" : {
"anyOf" : [
{
"type" : "boolean" ,
"default" : false
} ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"minimum" : {
"anyOf" : [
{ "type" : "number" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"exclusiveMinimum" : {
"anyOf" : [
{
"type" : "boolean" ,
"default" : false
} ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"maxLength" : {
"anyOf" : [
{ "$ref" : "#/definitions/positiveInteger" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"minLength" : {
"anyOf" : [
{ "$ref" : "#/definitions/positiveIntegerDefault0" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"pattern" : {
"anyOf" : [
{
"type" : "string" ,
"format" : "regex"
} ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"additionalItems" : {
"anyOf" : [
{ "type" : "boolean" } ,
{ "$ref" : "#" } ,
{ "$ref" : "#/definitions/$data" }
] ,
"default" : { }
} ,
"items" : {
"anyOf" : [
{ "$ref" : "#" } ,
{ "$ref" : "#/definitions/schemaArray" }
] ,
"default" : { }
} ,
"maxItems" : {
"anyOf" : [
{ "$ref" : "#/definitions/positiveInteger" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"minItems" : {
"anyOf" : [
{ "$ref" : "#/definitions/positiveIntegerDefault0" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"uniqueItems" : {
"anyOf" : [
{
"type" : "boolean" ,
"default" : false
} ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"maxProperties" : {
"anyOf" : [
{ "$ref" : "#/definitions/positiveInteger" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"minProperties" : {
"anyOf" : [
{ "$ref" : "#/definitions/positiveIntegerDefault0" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"required" : {
"anyOf" : [
{ "$ref" : "#/definitions/stringArray" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"additionalProperties" : {
"anyOf" : [
{ "type" : "boolean" } ,
{ "$ref" : "#" } ,
{ "$ref" : "#/definitions/$data" }
] ,
"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" : {
"anyOf" : [
{
"type" : "array" ,
"minItems" : 1 ,
"uniqueItems" : true
} ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"type" : {
"anyOf" : [
{ "$ref" : "#/definitions/simpleTypes" } ,
{
"type" : "array" ,
"items" : { "$ref" : "#/definitions/simpleTypes" } ,
"minItems" : 1 ,
"uniqueItems" : true
}
]
} ,
"allOf" : { "$ref" : "#/definitions/schemaArray" } ,
"anyOf" : { "$ref" : "#/definitions/schemaArray" } ,
"oneOf" : { "$ref" : "#/definitions/schemaArray" } ,
"not" : { "$ref" : "#" } ,
"format" : {
"anyOf" : [
{ "type" : "string" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"formatMaximum" : {
"anyOf" : [
{ "type" : "string" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"formatMinimum" : {
"anyOf" : [
{ "type" : "string" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"formatExclusiveMaximum" : {
"anyOf" : [
{
"type" : "boolean" ,
"default" : false
} ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"formatExclusiveMinimum" : {
"anyOf" : [
{
"type" : "boolean" ,
"default" : false
} ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"constant" : {
"anyOf" : [
{ } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"contains" : { "$ref" : "#" } ,
"patternGroups" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "object" ,
"required" : [ "schema" ] ,
"properties" : {
"maximum" : {
"anyOf" : [
{ "$ref" : "#/definitions/positiveInteger" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"minimum" : {
"anyOf" : [
{ "$ref" : "#/definitions/positiveIntegerDefault0" } ,
{ "$ref" : "#/definitions/$data" }
]
} ,
"schema" : { "$ref" : "#" }
} ,
"additionalProperties" : false
} ,
"default" : { }
} ,
"switch" : {
"type" : "array" ,
"items" : {
"required" : [ "then" ] ,
"properties" : {
"if" : { "$ref" : "#" } ,
"then" : {
"anyOf" : [
{ "type" : "boolean" } ,
{ "$ref" : "#" }
]
} ,
"continue" : { "type" : "boolean" }
} ,
"additionalProperties" : false ,
"dependencies" : {
"continue" : [ "if" ]
}
}
}
} ,
"dependencies" : {
"exclusiveMaximum" : [ "maximum" ] ,
"exclusiveMinimum" : [ "minimum" ] ,
"formatMaximum" : [ "format" ] ,
"formatMinimum" : [ "format" ] ,
"formatExclusiveMaximum" : [ "formatMaximum" ] ,
"formatExclusiveMinimum" : [ "formatMinimum" ]
} ,
"default" : { }
}
} , { } ] , 38 : [ function ( require , module , exports ) {
'use strict' ;
var META _SCHEMA _ID = 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json' ;
module . exports = {
enable : enableV5 ,
META _SCHEMA _ID : META _SCHEMA _ID
} ;
function enableV5 ( ajv ) {
var inlineFunctions = {
'switch' : require ( './dotjs/switch' ) ,
'constant' : require ( './dotjs/constant' ) ,
'_formatLimit' : require ( './dotjs/_formatLimit' ) ,
'patternRequired' : require ( './dotjs/patternRequired' )
} ;
if ( ajv . _opts . meta !== false ) {
var metaSchema = require ( './refs/json-schema-v5.json' ) ;
ajv . addMetaSchema ( metaSchema , META _SCHEMA _ID ) ;
}
_addKeyword ( 'constant' ) ;
ajv . addKeyword ( 'contains' , { type : 'array' , macro : containsMacro } ) ;
_addKeyword ( 'formatMaximum' , 'string' , inlineFunctions . _formatLimit ) ;
_addKeyword ( 'formatMinimum' , 'string' , inlineFunctions . _formatLimit ) ;
ajv . addKeyword ( 'formatExclusiveMaximum' ) ;
ajv . addKeyword ( 'formatExclusiveMinimum' ) ;
ajv . addKeyword ( 'patternGroups' ) ; // implemented in properties.jst
_addKeyword ( 'patternRequired' , 'object' ) ;
_addKeyword ( 'switch' ) ;
function _addKeyword ( keyword , types , inlineFunc ) {
var definition = {
inline : inlineFunc || inlineFunctions [ keyword ] ,
statements : true ,
errors : 'full'
} ;
if ( types ) definition . type = types ;
ajv . addKeyword ( keyword , definition ) ;
}
}
function containsMacro ( schema ) {
return {
not : { items : { not : schema } }
} ;
}
} , { "./dotjs/_formatLimit" : 12 , "./dotjs/constant" : 19 , "./dotjs/patternRequired" : 28 , "./dotjs/switch" : 32 , "./refs/json-schema-v5.json" : 37 } ] , 39 : [ function ( require , module , exports ) {
( function ( global ) {
/*! https://mths.be/punycode v1.4.1 by @mathias */
; ( function ( root ) {
/** Detect free variables */
var freeExports = typeof exports == 'object' && exports &&
! exports . nodeType && exports ;
var freeModule = typeof module == 'object' && module &&
! module . nodeType && module ;
var freeGlobal = typeof global == 'object' && global ;
if (
freeGlobal . global === freeGlobal ||
freeGlobal . window === freeGlobal ||
freeGlobal . self === freeGlobal
) {
root = freeGlobal ;
}
/ * *
* The ` punycode ` object .
* @ name punycode
* @ type Object
* /
var punycode ,
/** Highest positive signed 32-bit float value */
maxInt = 2147483647 , // aka. 0x7FFFFFFF or 2^31-1
/** Bootstring parameters */
base = 36 ,
tMin = 1 ,
tMax = 26 ,
skew = 38 ,
damp = 700 ,
initialBias = 72 ,
initialN = 128 , // 0x80
delimiter = '-' , // '\x2D'
/** Regular expressions */
regexPunycode = /^xn--/ ,
regexNonASCII = /[^\x20-\x7E]/ , // unprintable ASCII chars + non-ASCII chars
regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g , // RFC 3490 separators
/** Error messages */
errors = {
'overflow' : 'Overflow: input needs wider integers to process' ,
'not-basic' : 'Illegal input >= 0x80 (not a basic code point)' ,
'invalid-input' : 'Invalid input'
} ,
/** Convenience shortcuts */
baseMinusTMin = base - tMin ,
floor = Math . floor ,
stringFromCharCode = String . fromCharCode ,
/** Temporary variable */
key ;
/*--------------------------------------------------------------------------*/
/ * *
* A generic error utility function .
* @ private
* @ param { String } type The error type .
* @ returns { Error } Throws a ` RangeError ` with the applicable error message .
* /
function error ( type ) {
throw new RangeError ( errors [ type ] ) ;
}
/ * *
* A generic ` Array#map ` utility function .
* @ private
* @ param { Array } array The array to iterate over .
* @ param { Function } callback The function that gets called for every array
* item .
* @ returns { Array } A new array of values returned by the callback function .
* /
function map ( array , fn ) {
var length = array . length ;
var result = [ ] ;
while ( length -- ) {
result [ length ] = fn ( array [ length ] ) ;
}
return result ;
}
/ * *
* A simple ` Array#map ` - like wrapper to work with domain name strings or email
* addresses .
* @ private
* @ param { String } domain The domain name or email address .
* @ param { Function } callback The function that gets called for every
* character .
* @ returns { Array } A new string of characters returned by the callback
* function .
* /
function mapDomain ( string , fn ) {
var parts = string . split ( '@' ) ;
var result = '' ;
if ( parts . length > 1 ) {
// In email addresses, only the domain name should be punycoded. Leave
// the local part (i.e. everything up to `@`) intact.
result = parts [ 0 ] + '@' ;
string = parts [ 1 ] ;
}
// Avoid `split(regex)` for IE8 compatibility. See #17.
string = string . replace ( regexSeparators , '\x2E' ) ;
var labels = string . split ( '.' ) ;
var encoded = map ( labels , fn ) . join ( '.' ) ;
return result + encoded ;
}
/ * *
* Creates an array containing the numeric code points of each Unicode
* character in the string . While JavaScript uses UCS - 2 internally ,
* this function will convert a pair of surrogate halves ( each of which
* UCS - 2 exposes as separate characters ) into a single code point ,
* matching UTF - 16.
* @ see ` punycode.ucs2.encode `
* @ see < https : //mathiasbynens.be/notes/javascript-encoding>
* @ memberOf punycode . ucs2
* @ name decode
* @ param { String } string The Unicode input string ( UCS - 2 ) .
* @ returns { Array } The new array of code points .
* /
function ucs2decode ( string ) {
var output = [ ] ,
counter = 0 ,
length = string . length ,
value ,
extra ;
while ( counter < length ) {
value = string . charCodeAt ( counter ++ ) ;
if ( value >= 0xD800 && value <= 0xDBFF && counter < length ) {
// high surrogate, and there is a next character
extra = string . charCodeAt ( counter ++ ) ;
if ( ( extra & 0xFC00 ) == 0xDC00 ) { // low surrogate
output . push ( ( ( value & 0x3FF ) << 10 ) + ( extra & 0x3FF ) + 0x10000 ) ;
} else {
// unmatched surrogate; only append this code unit, in case the next
// code unit is the high surrogate of a surrogate pair
output . push ( value ) ;
counter -- ;
}
} else {
output . push ( value ) ;
}
}
return output ;
}
/ * *
* Creates a string based on an array of numeric code points .
* @ see ` punycode.ucs2.decode `
* @ memberOf punycode . ucs2
* @ name encode
* @ param { Array } codePoints The array of numeric code points .
* @ returns { String } The new Unicode string ( UCS - 2 ) .
* /
function ucs2encode ( array ) {
return map ( array , function ( value ) {
var output = '' ;
if ( value > 0xFFFF ) {
value -= 0x10000 ;
output += stringFromCharCode ( value >>> 10 & 0x3FF | 0xD800 ) ;
value = 0xDC00 | value & 0x3FF ;
}
output += stringFromCharCode ( value ) ;
return output ;
} ) . join ( '' ) ;
}
/ * *
* Converts a basic code point into a digit / integer .
* @ see ` digitToBasic() `
* @ private
* @ param { Number } codePoint The basic numeric code point value .
* @ returns { Number } The numeric value of a basic code point ( for use in
* representing integers ) in the range ` 0 ` to ` base - 1 ` , or ` base ` if
* the code point does not represent a value .
* /
function basicToDigit ( codePoint ) {
if ( codePoint - 48 < 10 ) {
return codePoint - 22 ;
}
if ( codePoint - 65 < 26 ) {
return codePoint - 65 ;
}
if ( codePoint - 97 < 26 ) {
return codePoint - 97 ;
}
return base ;
}
/ * *
* Converts a digit / integer into a basic code point .
* @ see ` basicToDigit() `
* @ private
* @ param { Number } digit The numeric value of a basic code point .
* @ returns { Number } The basic code point whose value ( when used for
* representing integers ) is ` digit ` , which needs to be in the range
* ` 0 ` to ` base - 1 ` . If ` flag ` is non - zero , the uppercase form is
* used ; else , the lowercase form is used . The behavior is undefined
* if ` flag ` is non - zero and ` digit ` has no uppercase form .
* /
function digitToBasic ( digit , flag ) {
// 0..25 map to ASCII a..z or A..Z
// 26..35 map to ASCII 0..9
return digit + 22 + 75 * ( digit < 26 ) - ( ( flag != 0 ) << 5 ) ;
}
/ * *
* Bias adaptation function as per section 3.4 of RFC 3492.
* https : //tools.ietf.org/html/rfc3492#section-3.4
* @ private
* /
function adapt ( delta , numPoints , firstTime ) {
var k = 0 ;
delta = firstTime ? floor ( delta / damp ) : delta >> 1 ;
delta += floor ( delta / numPoints ) ;
for ( /* no initialization */ ; delta > baseMinusTMin * tMax >> 1 ; k += base ) {
delta = floor ( delta / baseMinusTMin ) ;
}
return floor ( k + ( baseMinusTMin + 1 ) * delta / ( delta + skew ) ) ;
}
/ * *
* Converts a Punycode string of ASCII - only symbols to a string of Unicode
* symbols .
* @ memberOf punycode
* @ param { String } input The Punycode string of ASCII - only symbols .
* @ returns { String } The resulting string of Unicode symbols .
* /
function decode ( input ) {
// Don't use UCS-2
var output = [ ] ,
inputLength = input . length ,
out ,
i = 0 ,
n = initialN ,
bias = initialBias ,
basic ,
j ,
index ,
oldi ,
w ,
k ,
digit ,
t ,
/** Cached calculation results */
baseMinusT ;
// Handle the basic code points: let `basic` be the number of input code
// points before the last delimiter, or `0` if there is none, then copy
// the first basic code points to the output.
basic = input . lastIndexOf ( delimiter ) ;
if ( basic < 0 ) {
basic = 0 ;
}
for ( j = 0 ; j < basic ; ++ j ) {
// if it's not a basic code point
if ( input . charCodeAt ( j ) >= 0x80 ) {
error ( 'not-basic' ) ;
}
output . push ( input . charCodeAt ( j ) ) ;
}
// Main decoding loop: start just after the last delimiter if any basic code
// points were copied; start at the beginning otherwise.
for ( index = basic > 0 ? basic + 1 : 0 ; index < inputLength ; /* no final expression */ ) {
// `index` is the index of the next character to be consumed.
// Decode a generalized variable-length integer into `delta`,
// which gets added to `i`. The overflow checking is easier
// if we increase `i` as we go, then subtract off its starting
// value at the end to obtain `delta`.
for ( oldi = i , w = 1 , k = base ; /* no condition */ ; k += base ) {
if ( index >= inputLength ) {
error ( 'invalid-input' ) ;
}
digit = basicToDigit ( input . charCodeAt ( index ++ ) ) ;
if ( digit >= base || digit > floor ( ( maxInt - i ) / w ) ) {
error ( 'overflow' ) ;
}
i += digit * w ;
t = k <= bias ? tMin : ( k >= bias + tMax ? tMax : k - bias ) ;
if ( digit < t ) {
break ;
}
baseMinusT = base - t ;
if ( w > floor ( maxInt / baseMinusT ) ) {
error ( 'overflow' ) ;
}
w *= baseMinusT ;
}
out = output . length + 1 ;
bias = adapt ( i - oldi , out , oldi == 0 ) ;
// `i` was supposed to wrap around from `out` to `0`,
// incrementing `n` each time, so we'll fix that now:
if ( floor ( i / out ) > maxInt - n ) {
error ( 'overflow' ) ;
}
n += floor ( i / out ) ;
i %= out ;
// Insert `n` at position `i` of the output
output . splice ( i ++ , 0 , n ) ;
}
return ucs2encode ( output ) ;
}
/ * *
* Converts a string of Unicode symbols ( e . g . a domain name label ) to a
* Punycode string of ASCII - only symbols .
* @ memberOf punycode
* @ param { String } input The string of Unicode symbols .
* @ returns { String } The resulting Punycode string of ASCII - only symbols .
* /
function encode ( input ) {
var n ,
delta ,
handledCPCount ,
basicLength ,
bias ,
j ,
m ,
q ,
k ,
t ,
currentValue ,
output = [ ] ,
/** `inputLength` will hold the number of code points in `input`. */
inputLength ,
/** Cached calculation results */
handledCPCountPlusOne ,
baseMinusT ,
qMinusT ;
// Convert the input in UCS-2 to Unicode
input = ucs2decode ( input ) ;
// Cache the length
inputLength = input . length ;
// Initialize the state
n = initialN ;
delta = 0 ;
bias = initialBias ;
// Handle the basic code points
for ( j = 0 ; j < inputLength ; ++ j ) {
currentValue = input [ j ] ;
if ( currentValue < 0x80 ) {
output . push ( stringFromCharCode ( currentValue ) ) ;
}
}
handledCPCount = basicLength = output . length ;
// `handledCPCount` is the number of code points that have been handled;
// `basicLength` is the number of basic code points.
// Finish the basic string - if it is not empty - with a delimiter
if ( basicLength ) {
output . push ( delimiter ) ;
}
// Main encoding loop:
while ( handledCPCount < inputLength ) {
// All non-basic code points < n have been handled already. Find the next
// larger one:
for ( m = maxInt , j = 0 ; j < inputLength ; ++ j ) {
currentValue = input [ j ] ;
if ( currentValue >= n && currentValue < m ) {
m = currentValue ;
}
}
// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
// but guard against overflow
handledCPCountPlusOne = handledCPCount + 1 ;
if ( m - n > floor ( ( maxInt - delta ) / handledCPCountPlusOne ) ) {
error ( 'overflow' ) ;
}
delta += ( m - n ) * handledCPCountPlusOne ;
n = m ;
for ( j = 0 ; j < inputLength ; ++ j ) {
currentValue = input [ j ] ;
if ( currentValue < n && ++ delta > maxInt ) {
error ( 'overflow' ) ;
}
if ( currentValue == n ) {
// Represent delta as a generalized variable-length integer
for ( q = delta , k = base ; /* no condition */ ; k += base ) {
t = k <= bias ? tMin : ( k >= bias + tMax ? tMax : k - bias ) ;
if ( q < t ) {
break ;
}
qMinusT = q - t ;
baseMinusT = base - t ;
output . push (
stringFromCharCode ( digitToBasic ( t + qMinusT % baseMinusT , 0 ) )
) ;
q = floor ( qMinusT / baseMinusT ) ;
}
output . push ( stringFromCharCode ( digitToBasic ( q , 0 ) ) ) ;
bias = adapt ( delta , handledCPCountPlusOne , handledCPCount == basicLength ) ;
delta = 0 ;
++ handledCPCount ;
}
}
++ delta ;
++ n ;
}
return output . join ( '' ) ;
}
/ * *
* Converts a Punycode string representing a domain name or an email address
* to Unicode . Only the Punycoded parts of the input will be converted , i . e .
* it doesn ' t matter if you call it on a string that has already been
* converted to Unicode .
* @ memberOf punycode
* @ param { String } input The Punycoded domain name or email address to
* convert to Unicode .
* @ returns { String } The Unicode representation of the given Punycode
* string .
* /
function toUnicode ( input ) {
return mapDomain ( input , function ( string ) {
return regexPunycode . test ( string )
? decode ( string . slice ( 4 ) . toLowerCase ( ) )
: string ;
} ) ;
}
/ * *
* Converts a Unicode string representing a domain name or an email address to
* Punycode . Only the non - ASCII parts of the domain name will be converted ,
* i . e . it doesn 't matter if you call it with a domain that' s already in
* ASCII .
* @ memberOf punycode
* @ param { String } input The domain name or email address to convert , as a
* Unicode string .
* @ returns { String } The Punycode representation of the given domain name or
* email address .
* /
function toASCII ( input ) {
return mapDomain ( input , function ( string ) {
return regexNonASCII . test ( string )
? 'xn--' + encode ( string )
: string ;
} ) ;
}
/*--------------------------------------------------------------------------*/
/** Define the public API */
punycode = {
/ * *
* A string representing the current Punycode . js version number .
* @ memberOf punycode
* @ type String
* /
'version' : '1.4.1' ,
/ * *
* An object of methods to convert from JavaScript ' s internal character
* representation ( UCS - 2 ) to Unicode code points , and back .
* @ see < https : //mathiasbynens.be/notes/javascript-encoding>
* @ memberOf punycode
* @ type Object
* /
'ucs2' : {
'decode' : ucs2decode ,
'encode' : ucs2encode
} ,
'decode' : decode ,
'encode' : encode ,
'toASCII' : toASCII ,
'toUnicode' : toUnicode
} ;
/** Expose `punycode` */
// Some AMD build optimizers, like r.js, check for specific condition patterns
// like the following:
if (
typeof define == 'function' &&
typeof define . amd == 'object' &&
define . amd
) {
define ( 'punycode' , function ( ) {
return punycode ;
} ) ;
} else if ( freeExports && freeModule ) {
if ( module . exports == freeExports ) {
// in Node.js, io.js, or RingoJS v0.8.0+
freeModule . exports = punycode ;
} else {
// in Narwhal or RingoJS v0.7.0-
for ( key in punycode ) {
punycode . hasOwnProperty ( key ) && ( freeExports [ key ] = punycode [ key ] ) ;
}
}
} else {
// in Rhino or a web browser
root . punycode = punycode ;
}
} ( this ) ) ;
} ) . call ( this , typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : { } )
} , { } ] , 40 : [ function ( require , module , exports ) {
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict' ;
// If obj.hasOwnProperty has been overridden, then calling
// obj.hasOwnProperty(prop) will break.
// See: https://github.com/joyent/node/issues/1707
function hasOwnProperty ( obj , prop ) {
return Object . prototype . hasOwnProperty . call ( obj , prop ) ;
}
module . exports = function ( qs , sep , eq , options ) {
sep = sep || '&' ;
eq = eq || '=' ;
var obj = { } ;
if ( typeof qs !== 'string' || qs . length === 0 ) {
return obj ;
}
var regexp = /\+/g ;
qs = qs . split ( sep ) ;
var maxKeys = 1000 ;
if ( options && typeof options . maxKeys === 'number' ) {
maxKeys = options . maxKeys ;
}
var len = qs . length ;
// maxKeys <= 0 means that we should not limit keys count
if ( maxKeys > 0 && len > maxKeys ) {
len = maxKeys ;
}
for ( var i = 0 ; i < len ; ++ i ) {
var x = qs [ i ] . replace ( regexp , '%20' ) ,
idx = x . indexOf ( eq ) ,
kstr , vstr , k , v ;
if ( idx >= 0 ) {
kstr = x . substr ( 0 , idx ) ;
vstr = x . substr ( idx + 1 ) ;
} else {
kstr = x ;
vstr = '' ;
}
k = decodeURIComponent ( kstr ) ;
v = decodeURIComponent ( vstr ) ;
if ( ! hasOwnProperty ( obj , k ) ) {
obj [ k ] = v ;
} else if ( isArray ( obj [ k ] ) ) {
obj [ k ] . push ( v ) ;
} else {
obj [ k ] = [ obj [ k ] , v ] ;
}
}
return obj ;
} ;
var isArray = Array . isArray || function ( xs ) {
return Object . prototype . toString . call ( xs ) === '[object Array]' ;
} ;
} , { } ] , 41 : [ function ( require , module , exports ) {
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict' ;
var stringifyPrimitive = function ( v ) {
switch ( typeof v ) {
case 'string' :
return v ;
case 'boolean' :
return v ? 'true' : 'false' ;
case 'number' :
return isFinite ( v ) ? v : '' ;
default :
return '' ;
}
} ;
module . exports = function ( obj , sep , eq , name ) {
sep = sep || '&' ;
eq = eq || '=' ;
if ( obj === null ) {
obj = undefined ;
}
if ( typeof obj === 'object' ) {
return map ( objectKeys ( obj ) , function ( k ) {
var ks = encodeURIComponent ( stringifyPrimitive ( k ) ) + eq ;
if ( isArray ( obj [ k ] ) ) {
return map ( obj [ k ] , function ( v ) {
return ks + encodeURIComponent ( stringifyPrimitive ( v ) ) ;
} ) . join ( sep ) ;
} else {
return ks + encodeURIComponent ( stringifyPrimitive ( obj [ k ] ) ) ;
}
} ) . join ( sep ) ;
}
if ( ! name ) return '' ;
return encodeURIComponent ( stringifyPrimitive ( name ) ) + eq +
encodeURIComponent ( stringifyPrimitive ( obj ) ) ;
} ;
var isArray = Array . isArray || function ( xs ) {
return Object . prototype . toString . call ( xs ) === '[object Array]' ;
} ;
function map ( xs , f ) {
if ( xs . map ) return xs . map ( f ) ;
var res = [ ] ;
for ( var i = 0 ; i < xs . length ; i ++ ) {
res . push ( f ( xs [ i ] , i ) ) ;
}
return res ;
}
var objectKeys = Object . keys || function ( obj ) {
var res = [ ] ;
for ( var key in obj ) {
if ( Object . prototype . hasOwnProperty . call ( obj , key ) ) res . push ( key ) ;
}
return res ;
} ;
} , { } ] , 42 : [ function ( require , module , exports ) {
'use strict' ;
exports . decode = exports . parse = require ( './decode' ) ;
exports . encode = exports . stringify = require ( './encode' ) ;
} , { "./decode" : 40 , "./encode" : 41 } ] , 43 : [ function ( require , module , exports ) {
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict' ;
var punycode = require ( 'punycode' ) ;
var util = require ( './util' ) ;
exports . parse = urlParse ;
exports . resolve = urlResolve ;
exports . resolveObject = urlResolveObject ;
exports . format = urlFormat ;
exports . Url = Url ;
function Url ( ) {
this . protocol = null ;
this . slashes = null ;
this . auth = null ;
this . host = null ;
this . port = null ;
this . hostname = null ;
this . hash = null ;
this . search = null ;
this . query = null ;
this . pathname = null ;
this . path = null ;
this . href = null ;
}
// Reference: RFC 3986, RFC 1808, RFC 2396
// define these here so at least they only have to be
// compiled once on the first module load.
var protocolPattern = /^([a-z0-9.+-]+:)/i ,
portPattern = /:[0-9]*$/ ,
// Special case for a simple path URL
simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/ ,
// RFC 2396: characters reserved for delimiting URLs.
// We actually just auto-escape these.
delims = [ '<' , '>' , '"' , '`' , ' ' , '\r' , '\n' , '\t' ] ,
// RFC 2396: characters not allowed for various reasons.
unwise = [ '{' , '}' , '|' , '\\' , '^' , '`' ] . concat ( delims ) ,
// Allowed by RFCs, but cause of XSS attacks. Always escape these.
autoEscape = [ '\'' ] . concat ( unwise ) ,
// Characters that are never ever allowed in a hostname.
// Note that any invalid chars are also handled, but these
// are the ones that are *expected* to be seen, so we fast-path
// them.
nonHostChars = [ '%' , '/' , '?' , ';' , '#' ] . concat ( autoEscape ) ,
hostEndingChars = [ '/' , '?' , '#' ] ,
hostnameMaxLen = 255 ,
hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/ ,
hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/ ,
// protocols that can allow "unsafe" and "unwise" chars.
unsafeProtocol = {
'javascript' : true ,
'javascript:' : true
} ,
// protocols that never have a hostname.
hostlessProtocol = {
'javascript' : true ,
'javascript:' : true
} ,
// protocols that always contain a // bit.
slashedProtocol = {
'http' : true ,
'https' : true ,
'ftp' : true ,
'gopher' : true ,
'file' : true ,
'http:' : true ,
'https:' : true ,
'ftp:' : true ,
'gopher:' : true ,
'file:' : true
} ,
querystring = require ( 'querystring' ) ;
function urlParse ( url , parseQueryString , slashesDenoteHost ) {
if ( url && util . isObject ( url ) && url instanceof Url ) return url ;
var u = new Url ;
u . parse ( url , parseQueryString , slashesDenoteHost ) ;
return u ;
}
Url . prototype . parse = function ( url , parseQueryString , slashesDenoteHost ) {
if ( ! util . isString ( url ) ) {
throw new TypeError ( "Parameter 'url' must be a string, not " + typeof url ) ;
}
// Copy chrome, IE, opera backslash-handling behavior.
// Back slashes before the query string get converted to forward slashes
// See: https://code.google.com/p/chromium/issues/detail?id=25916
var queryIndex = url . indexOf ( '?' ) ,
splitter =
( queryIndex !== - 1 && queryIndex < url . indexOf ( '#' ) ) ? '?' : '#' ,
uSplit = url . split ( splitter ) ,
slashRegex = /\\/g ;
uSplit [ 0 ] = uSplit [ 0 ] . replace ( slashRegex , '/' ) ;
url = uSplit . join ( splitter ) ;
var rest = url ;
// trim before proceeding.
// This is to support parse stuff like " http://foo.com \n"
rest = rest . trim ( ) ;
if ( ! slashesDenoteHost && url . split ( '#' ) . length === 1 ) {
// Try fast path regexp
var simplePath = simplePathPattern . exec ( rest ) ;
if ( simplePath ) {
this . path = rest ;
this . href = rest ;
this . pathname = simplePath [ 1 ] ;
if ( simplePath [ 2 ] ) {
this . search = simplePath [ 2 ] ;
if ( parseQueryString ) {
this . query = querystring . parse ( this . search . substr ( 1 ) ) ;
} else {
this . query = this . search . substr ( 1 ) ;
}
} else if ( parseQueryString ) {
this . search = '' ;
this . query = { } ;
}
return this ;
}
}
var proto = protocolPattern . exec ( rest ) ;
if ( proto ) {
proto = proto [ 0 ] ;
var lowerProto = proto . toLowerCase ( ) ;
this . protocol = lowerProto ;
rest = rest . substr ( proto . length ) ;
}
// figure out if it's got a host
// user@server is *always* interpreted as a hostname, and url
// resolution will treat //foo/bar as host=foo,path=bar because that's
// how the browser resolves relative URLs.
if ( slashesDenoteHost || proto || rest . match ( /^\/\/[^@\/]+@[^@\/]+/ ) ) {
var slashes = rest . substr ( 0 , 2 ) === '//' ;
if ( slashes && ! ( proto && hostlessProtocol [ proto ] ) ) {
rest = rest . substr ( 2 ) ;
this . slashes = true ;
}
}
if ( ! hostlessProtocol [ proto ] &&
( slashes || ( proto && ! slashedProtocol [ proto ] ) ) ) {
// there's a hostname.
// the first instance of /, ?, ;, or # ends the host.
//
// If there is an @ in the hostname, then non-host chars *are* allowed
// to the left of the last @ sign, unless some host-ending character
// comes *before* the @-sign.
// URLs are obnoxious.
//
// ex:
// http://a@b@c/ => user:a@b host:c
// http://a@b?@c => user:a host:c path:/?@c
// v0.12 TODO(isaacs): This is not quite how Chrome does things.
// Review our test case against browsers more comprehensively.
// find the first instance of any hostEndingChars
var hostEnd = - 1 ;
for ( var i = 0 ; i < hostEndingChars . length ; i ++ ) {
var hec = rest . indexOf ( hostEndingChars [ i ] ) ;
if ( hec !== - 1 && ( hostEnd === - 1 || hec < hostEnd ) )
hostEnd = hec ;
}
// at this point, either we have an explicit point where the
// auth portion cannot go past, or the last @ char is the decider.
var auth , atSign ;
if ( hostEnd === - 1 ) {
// atSign can be anywhere.
atSign = rest . lastIndexOf ( '@' ) ;
} else {
// atSign must be in auth portion.
// http://a@b/c@d => host:b auth:a path:/c@d
atSign = rest . lastIndexOf ( '@' , hostEnd ) ;
}
// Now we have a portion which is definitely the auth.
// Pull that off.
if ( atSign !== - 1 ) {
auth = rest . slice ( 0 , atSign ) ;
rest = rest . slice ( atSign + 1 ) ;
this . auth = decodeURIComponent ( auth ) ;
}
// the host is the remaining to the left of the first non-host char
hostEnd = - 1 ;
for ( var i = 0 ; i < nonHostChars . length ; i ++ ) {
var hec = rest . indexOf ( nonHostChars [ i ] ) ;
if ( hec !== - 1 && ( hostEnd === - 1 || hec < hostEnd ) )
hostEnd = hec ;
}
// if we still have not hit it, then the entire thing is a host.
if ( hostEnd === - 1 )
hostEnd = rest . length ;
this . host = rest . slice ( 0 , hostEnd ) ;
rest = rest . slice ( hostEnd ) ;
// pull out port.
this . parseHost ( ) ;
// we've indicated that there is a hostname,
// so even if it's empty, it has to be present.
this . hostname = this . hostname || '' ;
// if hostname begins with [ and ends with ]
// assume that it's an IPv6 address.
var ipv6Hostname = this . hostname [ 0 ] === '[' &&
this . hostname [ this . hostname . length - 1 ] === ']' ;
// validate a little.
if ( ! ipv6Hostname ) {
var hostparts = this . hostname . split ( /\./ ) ;
for ( var i = 0 , l = hostparts . length ; i < l ; i ++ ) {
var part = hostparts [ i ] ;
if ( ! part ) continue ;
if ( ! part . match ( hostnamePartPattern ) ) {
var newpart = '' ;
for ( var j = 0 , k = part . length ; j < k ; j ++ ) {
if ( part . charCodeAt ( j ) > 127 ) {
// we replace non-ASCII char with a temporary placeholder
// we need this to make sure size of hostname is not
// broken by replacing non-ASCII by nothing
newpart += 'x' ;
} else {
newpart += part [ j ] ;
}
}
// we test again with ASCII char only
if ( ! newpart . match ( hostnamePartPattern ) ) {
var validParts = hostparts . slice ( 0 , i ) ;
var notHost = hostparts . slice ( i + 1 ) ;
var bit = part . match ( hostnamePartStart ) ;
if ( bit ) {
validParts . push ( bit [ 1 ] ) ;
notHost . unshift ( bit [ 2 ] ) ;
}
if ( notHost . length ) {
rest = '/' + notHost . join ( '.' ) + rest ;
}
this . hostname = validParts . join ( '.' ) ;
break ;
}
}
}
}
if ( this . hostname . length > hostnameMaxLen ) {
this . hostname = '' ;
} else {
// hostnames are always lower case.
this . hostname = this . hostname . toLowerCase ( ) ;
}
if ( ! ipv6Hostname ) {
// IDNA Support: Returns a punycoded representation of "domain".
// It only converts parts of the domain name that
// have non-ASCII characters, i.e. it doesn't matter if
// you call it with a domain that already is ASCII-only.
this . hostname = punycode . toASCII ( this . hostname ) ;
}
var p = this . port ? ':' + this . port : '' ;
var h = this . hostname || '' ;
this . host = h + p ;
this . href += this . host ;
// strip [ and ] from the hostname
// the host field still retains them, though
if ( ipv6Hostname ) {
this . hostname = this . hostname . substr ( 1 , this . hostname . length - 2 ) ;
if ( rest [ 0 ] !== '/' ) {
rest = '/' + rest ;
}
}
}
// now rest is set to the post-host stuff.
// chop off any delim chars.
if ( ! unsafeProtocol [ lowerProto ] ) {
// First, make 100% sure that any "autoEscape" chars get
// escaped, even if encodeURIComponent doesn't think they
// need to be.
for ( var i = 0 , l = autoEscape . length ; i < l ; i ++ ) {
var ae = autoEscape [ i ] ;
if ( rest . indexOf ( ae ) === - 1 )
continue ;
var esc = encodeURIComponent ( ae ) ;
if ( esc === ae ) {
esc = escape ( ae ) ;
}
rest = rest . split ( ae ) . join ( esc ) ;
}
}
// chop off from the tail first.
var hash = rest . indexOf ( '#' ) ;
if ( hash !== - 1 ) {
// got a fragment string.
this . hash = rest . substr ( hash ) ;
rest = rest . slice ( 0 , hash ) ;
}
var qm = rest . indexOf ( '?' ) ;
if ( qm !== - 1 ) {
this . search = rest . substr ( qm ) ;
this . query = rest . substr ( qm + 1 ) ;
if ( parseQueryString ) {
this . query = querystring . parse ( this . query ) ;
}
rest = rest . slice ( 0 , qm ) ;
} else if ( parseQueryString ) {
// no query string, but parseQueryString still requested
this . search = '' ;
this . query = { } ;
}
if ( rest ) this . pathname = rest ;
if ( slashedProtocol [ lowerProto ] &&
this . hostname && ! this . pathname ) {
this . pathname = '/' ;
}
//to support http.request
if ( this . pathname || this . search ) {
var p = this . pathname || '' ;
var s = this . search || '' ;
this . path = p + s ;
}
// finally, reconstruct the href based on what has been validated.
this . href = this . format ( ) ;
return this ;
} ;
// format a parsed object into a url string
function urlFormat ( obj ) {
// ensure it's an object, and not a string url.
// If it's an obj, this is a no-op.
// this way, you can call url_format() on strings
// to clean up potentially wonky urls.
if ( util . isString ( obj ) ) obj = urlParse ( obj ) ;
if ( ! ( obj instanceof Url ) ) return Url . prototype . format . call ( obj ) ;
return obj . format ( ) ;
}
Url . prototype . format = function ( ) {
var auth = this . auth || '' ;
if ( auth ) {
auth = encodeURIComponent ( auth ) ;
auth = auth . replace ( /%3A/i , ':' ) ;
auth += '@' ;
}
var protocol = this . protocol || '' ,
pathname = this . pathname || '' ,
hash = this . hash || '' ,
host = false ,
query = '' ;
if ( this . host ) {
host = auth + this . host ;
} else if ( this . hostname ) {
host = auth + ( this . hostname . indexOf ( ':' ) === - 1 ?
this . hostname :
'[' + this . hostname + ']' ) ;
if ( this . port ) {
host += ':' + this . port ;
}
}
if ( this . query &&
util . isObject ( this . query ) &&
Object . keys ( this . query ) . length ) {
query = querystring . stringify ( this . query ) ;
}
var search = this . search || ( query && ( '?' + query ) ) || '' ;
if ( protocol && protocol . substr ( - 1 ) !== ':' ) protocol += ':' ;
// only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
// unless they had them to begin with.
if ( this . slashes ||
( ! protocol || slashedProtocol [ protocol ] ) && host !== false ) {
host = '//' + ( host || '' ) ;
if ( pathname && pathname . charAt ( 0 ) !== '/' ) pathname = '/' + pathname ;
} else if ( ! host ) {
host = '' ;
}
if ( hash && hash . charAt ( 0 ) !== '#' ) hash = '#' + hash ;
if ( search && search . charAt ( 0 ) !== '?' ) search = '?' + search ;
pathname = pathname . replace ( /[?#]/g , function ( match ) {
return encodeURIComponent ( match ) ;
} ) ;
search = search . replace ( '#' , '%23' ) ;
return protocol + host + pathname + search + hash ;
} ;
function urlResolve ( source , relative ) {
return urlParse ( source , false , true ) . resolve ( relative ) ;
}
Url . prototype . resolve = function ( relative ) {
return this . resolveObject ( urlParse ( relative , false , true ) ) . format ( ) ;
} ;
function urlResolveObject ( source , relative ) {
if ( ! source ) return relative ;
return urlParse ( source , false , true ) . resolveObject ( relative ) ;
}
Url . prototype . resolveObject = function ( relative ) {
if ( util . isString ( relative ) ) {
var rel = new Url ( ) ;
rel . parse ( relative , false , true ) ;
relative = rel ;
}
var result = new Url ( ) ;
var tkeys = Object . keys ( this ) ;
for ( var tk = 0 ; tk < tkeys . length ; tk ++ ) {
var tkey = tkeys [ tk ] ;
result [ tkey ] = this [ tkey ] ;
}
// hash is always overridden, no matter what.
// even href="" will remove it.
result . hash = relative . hash ;
// if the relative url is empty, then there's nothing left to do here.
if ( relative . href === '' ) {
result . href = result . format ( ) ;
return result ;
}
// hrefs like //foo/bar always cut to the protocol.
if ( relative . slashes && ! relative . protocol ) {
// take everything except the protocol from relative
var rkeys = Object . keys ( relative ) ;
for ( var rk = 0 ; rk < rkeys . length ; rk ++ ) {
var rkey = rkeys [ rk ] ;
if ( rkey !== 'protocol' )
result [ rkey ] = relative [ rkey ] ;
}
//urlParse appends trailing / to urls like http://www.example.com
if ( slashedProtocol [ result . protocol ] &&
result . hostname && ! result . pathname ) {
result . path = result . pathname = '/' ;
}
result . href = result . format ( ) ;
return result ;
}
if ( relative . protocol && relative . protocol !== result . protocol ) {
// if it's a known url protocol, then changing
// the protocol does weird things
// first, if it's not file:, then we MUST have a host,
// and if there was a path
// to begin with, then we MUST have a path.
// if it is file:, then the host is dropped,
// because that's known to be hostless.
// anything else is assumed to be absolute.
if ( ! slashedProtocol [ relative . protocol ] ) {
var keys = Object . keys ( relative ) ;
for ( var v = 0 ; v < keys . length ; v ++ ) {
var k = keys [ v ] ;
result [ k ] = relative [ k ] ;
}
result . href = result . format ( ) ;
return result ;
}
result . protocol = relative . protocol ;
if ( ! relative . host && ! hostlessProtocol [ relative . protocol ] ) {
var relPath = ( relative . pathname || '' ) . split ( '/' ) ;
while ( relPath . length && ! ( relative . host = relPath . shift ( ) ) ) ;
if ( ! relative . host ) relative . host = '' ;
if ( ! relative . hostname ) relative . hostname = '' ;
if ( relPath [ 0 ] !== '' ) relPath . unshift ( '' ) ;
if ( relPath . length < 2 ) relPath . unshift ( '' ) ;
result . pathname = relPath . join ( '/' ) ;
} else {
result . pathname = relative . pathname ;
}
result . search = relative . search ;
result . query = relative . query ;
result . host = relative . host || '' ;
result . auth = relative . auth ;
result . hostname = relative . hostname || relative . host ;
result . port = relative . port ;
// to support http.request
if ( result . pathname || result . search ) {
var p = result . pathname || '' ;
var s = result . search || '' ;
result . path = p + s ;
}
result . slashes = result . slashes || relative . slashes ;
result . href = result . format ( ) ;
return result ;
}
var isSourceAbs = ( result . pathname && result . pathname . charAt ( 0 ) === '/' ) ,
isRelAbs = (
relative . host ||
relative . pathname && relative . pathname . charAt ( 0 ) === '/'
) ,
mustEndAbs = ( isRelAbs || isSourceAbs ||
( result . host && relative . pathname ) ) ,
removeAllDots = mustEndAbs ,
srcPath = result . pathname && result . pathname . split ( '/' ) || [ ] ,
relPath = relative . pathname && relative . pathname . split ( '/' ) || [ ] ,
psychotic = result . protocol && ! slashedProtocol [ result . protocol ] ;
// if the url is a non-slashed url, then relative
// links like ../.. should be able
// to crawl up to the hostname, as well. This is strange.
// result.protocol has already been set by now.
// Later on, put the first path part into the host field.
if ( psychotic ) {
result . hostname = '' ;
result . port = null ;
if ( result . host ) {
if ( srcPath [ 0 ] === '' ) srcPath [ 0 ] = result . host ;
else srcPath . unshift ( result . host ) ;
}
result . host = '' ;
if ( relative . protocol ) {
relative . hostname = null ;
relative . port = null ;
if ( relative . host ) {
if ( relPath [ 0 ] === '' ) relPath [ 0 ] = relative . host ;
else relPath . unshift ( relative . host ) ;
}
relative . host = null ;
}
mustEndAbs = mustEndAbs && ( relPath [ 0 ] === '' || srcPath [ 0 ] === '' ) ;
}
if ( isRelAbs ) {
// it's absolute.
result . host = ( relative . host || relative . host === '' ) ?
relative . host : result . host ;
result . hostname = ( relative . hostname || relative . hostname === '' ) ?
relative . hostname : result . hostname ;
result . search = relative . search ;
result . query = relative . query ;
srcPath = relPath ;
// fall through to the dot-handling below.
} else if ( relPath . length ) {
// it's relative
// throw away the existing file, and take the new path instead.
if ( ! srcPath ) srcPath = [ ] ;
srcPath . pop ( ) ;
srcPath = srcPath . concat ( relPath ) ;
result . search = relative . search ;
result . query = relative . query ;
} else if ( ! util . isNullOrUndefined ( relative . search ) ) {
// just pull out the search.
// like href='?foo'.
// Put this after the other two cases because it simplifies the booleans
if ( psychotic ) {
result . hostname = result . host = srcPath . shift ( ) ;
//occationaly the auth can get stuck only in host
//this especially happens in cases like
//url.resolveObject('mailto:local1@domain1', 'local2@domain2')
var authInHost = result . host && result . host . indexOf ( '@' ) > 0 ?
result . host . split ( '@' ) : false ;
if ( authInHost ) {
result . auth = authInHost . shift ( ) ;
result . host = result . hostname = authInHost . shift ( ) ;
}
}
result . search = relative . search ;
result . query = relative . query ;
//to support http.request
if ( ! util . isNull ( result . pathname ) || ! util . isNull ( result . search ) ) {
result . path = ( result . pathname ? result . pathname : '' ) +
( result . search ? result . search : '' ) ;
}
result . href = result . format ( ) ;
return result ;
}
if ( ! srcPath . length ) {
// no path at all. easy.
// we've already handled the other stuff above.
result . pathname = null ;
//to support http.request
if ( result . search ) {
result . path = '/' + result . search ;
} else {
result . path = null ;
}
result . href = result . format ( ) ;
return result ;
}
// if a url ENDs in . or .., then it must get a trailing slash.
// however, if it ends in anything else non-slashy,
// then it must NOT get a trailing slash.
var last = srcPath . slice ( - 1 ) [ 0 ] ;
var hasTrailingSlash = (
( result . host || relative . host || srcPath . length > 1 ) &&
( last === '.' || last === '..' ) || last === '' ) ;
// strip single dots, resolve double dots to parent dir
// if the path tries to go above the root, `up` ends up > 0
var up = 0 ;
for ( var i = srcPath . length ; i >= 0 ; i -- ) {
last = srcPath [ i ] ;
if ( last === '.' ) {
srcPath . splice ( i , 1 ) ;
} else if ( last === '..' ) {
srcPath . splice ( i , 1 ) ;
up ++ ;
} else if ( up ) {
srcPath . splice ( i , 1 ) ;
up -- ;
}
}
// if the path is allowed to go above the root, restore leading ..s
if ( ! mustEndAbs && ! removeAllDots ) {
for ( ; up -- ; up ) {
srcPath . unshift ( '..' ) ;
}
}
if ( mustEndAbs && srcPath [ 0 ] !== '' &&
( ! srcPath [ 0 ] || srcPath [ 0 ] . charAt ( 0 ) !== '/' ) ) {
srcPath . unshift ( '' ) ;
}
if ( hasTrailingSlash && ( srcPath . join ( '/' ) . substr ( - 1 ) !== '/' ) ) {
srcPath . push ( '' ) ;
}
var isAbsolute = srcPath [ 0 ] === '' ||
( srcPath [ 0 ] && srcPath [ 0 ] . charAt ( 0 ) === '/' ) ;
// put the host back
if ( psychotic ) {
result . hostname = result . host = isAbsolute ? '' :
srcPath . length ? srcPath . shift ( ) : '' ;
//occationaly the auth can get stuck only in host
//this especially happens in cases like
//url.resolveObject('mailto:local1@domain1', 'local2@domain2')
var authInHost = result . host && result . host . indexOf ( '@' ) > 0 ?
result . host . split ( '@' ) : false ;
if ( authInHost ) {
result . auth = authInHost . shift ( ) ;
result . host = result . hostname = authInHost . shift ( ) ;
}
}
mustEndAbs = mustEndAbs || ( result . host && srcPath . length ) ;
if ( mustEndAbs && ! isAbsolute ) {
srcPath . unshift ( '' ) ;
}
if ( ! srcPath . length ) {
result . pathname = null ;
result . path = null ;
} else {
result . pathname = srcPath . join ( '/' ) ;
}
//to support request.http
if ( ! util . isNull ( result . pathname ) || ! util . isNull ( result . search ) ) {
result . path = ( result . pathname ? result . pathname : '' ) +
( result . search ? result . search : '' ) ;
}
result . auth = relative . auth || result . auth ;
result . slashes = result . slashes || relative . slashes ;
result . href = result . format ( ) ;
return result ;
} ;
Url . prototype . parseHost = function ( ) {
var host = this . host ;
var port = portPattern . exec ( host ) ;
if ( port ) {
port = port [ 0 ] ;
if ( port !== ':' ) {
this . port = port . substr ( 1 ) ;
}
host = host . substr ( 0 , host . length - port . length ) ;
}
if ( host ) this . hostname = host ;
} ;
} , { "./util" : 44 , "punycode" : 39 , "querystring" : 42 } ] , 44 : [ function ( require , module , exports ) {
'use strict' ;
module . exports = {
isString : function ( arg ) {
return typeof ( arg ) === 'string' ;
} ,
isObject : function ( arg ) {
return typeof ( arg ) === 'object' && arg !== null ;
} ,
isNull : function ( arg ) {
return arg === null ;
} ,
isNullOrUndefined : function ( arg ) {
return arg == null ;
}
} ;
} , { } ] , 45 : [ function ( require , module , exports ) {
/ * *
* slice ( ) reference .
* /
var slice = Array . prototype . slice ;
/ * *
* Expose ` co ` .
* /
module . exports = co [ 'default' ] = co . co = co ;
/ * *
* Wrap the given generator ` fn ` into a
* function that returns a promise .
* This is a separate function so that
* every ` co() ` call doesn ' t create a new ,
* unnecessary closure .
*
* @ param { GeneratorFunction } fn
* @ return { Function }
* @ api public
* /
co . wrap = function ( fn ) {
createPromise . _ _generatorFunction _ _ = fn ;
return createPromise ;
function createPromise ( ) {
return co . call ( this , fn . apply ( this , arguments ) ) ;
}
} ;
/ * *
* Execute the generator function or a generator
* and return a promise .
*
* @ param { Function } fn
* @ return { Promise }
* @ api public
* /
function co ( gen ) {
var ctx = this ;
var args = slice . call ( arguments , 1 )
// we wrap everything in a promise to avoid promise chaining,
// which leads to memory leak errors.
// see https://github.com/tj/co/issues/180
return new Promise ( function ( resolve , reject ) {
if ( typeof gen === 'function' ) gen = gen . apply ( ctx , args ) ;
if ( ! gen || typeof gen . next !== 'function' ) return resolve ( gen ) ;
onFulfilled ( ) ;
/ * *
* @ param { Mixed } res
* @ return { Promise }
* @ api private
* /
function onFulfilled ( res ) {
var ret ;
try {
ret = gen . next ( res ) ;
} catch ( e ) {
return reject ( e ) ;
}
next ( ret ) ;
}
/ * *
* @ param { Error } err
* @ return { Promise }
* @ api private
* /
function onRejected ( err ) {
var ret ;
try {
ret = gen . throw ( err ) ;
} catch ( e ) {
return reject ( e ) ;
}
next ( ret ) ;
}
/ * *
* Get the next value in the generator ,
* return a promise .
*
* @ param { Object } ret
* @ return { Promise }
* @ api private
* /
function next ( ret ) {
if ( ret . done ) return resolve ( ret . value ) ;
var value = toPromise . call ( ctx , ret . value ) ;
if ( value && isPromise ( value ) ) return value . then ( onFulfilled , onRejected ) ;
return onRejected ( new TypeError ( 'You may only yield a function, promise, generator, array, or object, '
+ 'but the following object was passed: "' + String ( ret . value ) + '"' ) ) ;
}
} ) ;
}
/ * *
* Convert a ` yield ` ed value into a promise .
*
* @ param { Mixed } obj
* @ return { Promise }
* @ api private
* /
function toPromise ( obj ) {
if ( ! obj ) return obj ;
if ( isPromise ( obj ) ) return obj ;
if ( isGeneratorFunction ( obj ) || isGenerator ( obj ) ) return co . call ( this , obj ) ;
if ( 'function' == typeof obj ) return thunkToPromise . call ( this , obj ) ;
if ( Array . isArray ( obj ) ) return arrayToPromise . call ( this , obj ) ;
if ( isObject ( obj ) ) return objectToPromise . call ( this , obj ) ;
return obj ;
}
/ * *
* Convert a thunk to a promise .
*
* @ param { Function }
* @ return { Promise }
* @ api private
* /
function thunkToPromise ( fn ) {
var ctx = this ;
return new Promise ( function ( resolve , reject ) {
fn . call ( ctx , function ( err , res ) {
if ( err ) return reject ( err ) ;
if ( arguments . length > 2 ) res = slice . call ( arguments , 1 ) ;
resolve ( res ) ;
} ) ;
} ) ;
}
/ * *
* Convert an array of "yieldables" to a promise .
* Uses ` Promise.all() ` internally .
*
* @ param { Array } obj
* @ return { Promise }
* @ api private
* /
function arrayToPromise ( obj ) {
return Promise . all ( obj . map ( toPromise , this ) ) ;
}
/ * *
* Convert an object of "yieldables" to a promise .
* Uses ` Promise.all() ` internally .
*
* @ param { Object } obj
* @ return { Promise }
* @ api private
* /
function objectToPromise ( obj ) {
var results = new obj . constructor ( ) ;
var keys = Object . keys ( obj ) ;
var promises = [ ] ;
for ( var i = 0 ; i < keys . length ; i ++ ) {
var key = keys [ i ] ;
var promise = toPromise . call ( this , obj [ key ] ) ;
if ( promise && isPromise ( promise ) ) defer ( promise , key ) ;
else results [ key ] = obj [ key ] ;
}
return Promise . all ( promises ) . then ( function ( ) {
return results ;
} ) ;
function defer ( promise , key ) {
// predefine the key in the result
results [ key ] = undefined ;
promises . push ( promise . then ( function ( res ) {
results [ key ] = res ;
} ) ) ;
}
}
/ * *
* Check if ` obj ` is a promise .
*
* @ param { Object } obj
* @ return { Boolean }
* @ api private
* /
function isPromise ( obj ) {
return 'function' == typeof obj . then ;
}
/ * *
* Check if ` obj ` is a generator .
*
* @ param { Mixed } obj
* @ return { Boolean }
* @ api private
* /
function isGenerator ( obj ) {
return 'function' == typeof obj . next && 'function' == typeof obj . throw ;
}
/ * *
* Check if ` obj ` is a generator function .
*
* @ param { Mixed } obj
* @ return { Boolean }
* @ api private
* /
function isGeneratorFunction ( obj ) {
var constructor = obj . constructor ;
if ( ! constructor ) return false ;
if ( 'GeneratorFunction' === constructor . name || 'GeneratorFunction' === constructor . displayName ) return true ;
return isGenerator ( constructor . prototype ) ;
}
/ * *
* Check for plain object .
*
* @ param { Mixed } val
* @ return { Boolean }
* @ api private
* /
function isObject ( val ) {
return Object == val . constructor ;
}
} , { } ] , 46 : [ function ( require , module , exports ) {
var json = typeof JSON !== 'undefined' ? JSON : require ( 'jsonify' ) ;
module . exports = function ( obj , opts ) {
if ( ! opts ) opts = { } ;
if ( typeof opts === 'function' ) opts = { cmp : opts } ;
var space = opts . space || '' ;
if ( typeof space === 'number' ) space = Array ( space + 1 ) . join ( ' ' ) ;
var cycles = ( typeof opts . cycles === 'boolean' ) ? opts . cycles : false ;
var replacer = opts . replacer || function ( key , value ) { return value ; } ;
var cmp = opts . cmp && ( function ( f ) {
return function ( node ) {
return function ( a , b ) {
var aobj = { key : a , value : node [ a ] } ;
var bobj = { key : b , value : node [ b ] } ;
return f ( aobj , bobj ) ;
} ;
} ;
} ) ( opts . cmp ) ;
var seen = [ ] ;
return ( function stringify ( parent , key , node , level ) {
var indent = space ? ( '\n' + new Array ( level + 1 ) . join ( space ) ) : '' ;
var colonSeparator = space ? ': ' : ':' ;
if ( node && node . toJSON && typeof node . toJSON === 'function' ) {
node = node . toJSON ( ) ;
}
node = replacer . call ( parent , key , node ) ;
if ( node === undefined ) {
return ;
}
if ( typeof node !== 'object' || node === null ) {
return json . stringify ( node ) ;
}
if ( isArray ( node ) ) {
var out = [ ] ;
for ( var i = 0 ; i < node . length ; i ++ ) {
var item = stringify ( node , i , node [ i ] , level + 1 ) || json . stringify ( null ) ;
out . push ( indent + space + item ) ;
}
return '[' + out . join ( ',' ) + indent + ']' ;
}
else {
if ( seen . indexOf ( node ) !== - 1 ) {
if ( cycles ) return json . stringify ( '__cycle__' ) ;
throw new TypeError ( 'Converting circular structure to JSON' ) ;
}
else seen . push ( node ) ;
var keys = objectKeys ( node ) . sort ( cmp && cmp ( node ) ) ;
var out = [ ] ;
for ( var i = 0 ; i < keys . length ; i ++ ) {
var key = keys [ i ] ;
var value = stringify ( node , key , node [ key ] , level + 1 ) ;
if ( ! value ) continue ;
var keyValue = json . stringify ( key )
+ colonSeparator
+ value ;
;
out . push ( indent + space + keyValue ) ;
}
seen . splice ( seen . indexOf ( node ) , 1 ) ;
return '{' + out . join ( ',' ) + indent + '}' ;
}
} ) ( { '' : obj } , '' , obj , 0 ) ;
} ;
var isArray = Array . isArray || function ( x ) {
return { } . toString . call ( x ) === '[object Array]' ;
} ;
var objectKeys = Object . keys || function ( obj ) {
var has = Object . prototype . hasOwnProperty || function ( ) { return true } ;
var keys = [ ] ;
for ( var key in obj ) {
if ( has . call ( obj , key ) ) keys . push ( key ) ;
}
return keys ;
} ;
} , { "jsonify" : 47 } ] , 47 : [ function ( require , module , exports ) {
exports . parse = require ( './lib/parse' ) ;
exports . stringify = require ( './lib/stringify' ) ;
} , { "./lib/parse" : 48 , "./lib/stringify" : 49 } ] , 48 : [ function ( require , module , exports ) {
var at , // The index of the current character
ch , // The current character
escapee = {
'"' : '"' ,
'\\' : '\\' ,
'/' : '/' ,
b : '\b' ,
f : '\f' ,
n : '\n' ,
r : '\r' ,
t : '\t'
} ,
text ,
error = function ( m ) {
// Call error when something is wrong.
throw {
name : 'SyntaxError' ,
message : m ,
at : at ,
text : text
} ;
} ,
next = function ( c ) {
// If a c parameter is provided, verify that it matches the current character.
if ( c && c !== ch ) {
error ( "Expected '" + c + "' instead of '" + ch + "'" ) ;
}
// Get the next character. When there are no more characters,
// return the empty string.
ch = text . charAt ( at ) ;
at += 1 ;
return ch ;
} ,
number = function ( ) {
// Parse a number value.
var number ,
string = '' ;
if ( ch === '-' ) {
string = '-' ;
next ( '-' ) ;
}
while ( ch >= '0' && ch <= '9' ) {
string += ch ;
next ( ) ;
}
if ( ch === '.' ) {
string += '.' ;
while ( next ( ) && ch >= '0' && ch <= '9' ) {
string += ch ;
}
}
if ( ch === 'e' || ch === 'E' ) {
string += ch ;
next ( ) ;
if ( ch === '-' || ch === '+' ) {
string += ch ;
next ( ) ;
}
while ( ch >= '0' && ch <= '9' ) {
string += ch ;
next ( ) ;
}
}
number = + string ;
if ( ! isFinite ( number ) ) {
error ( "Bad number" ) ;
} else {
return number ;
}
} ,
string = function ( ) {
// Parse a string value.
var hex ,
i ,
string = '' ,
uffff ;
// When parsing for string values, we must look for " and \ characters.
if ( ch === '"' ) {
while ( next ( ) ) {
if ( ch === '"' ) {
next ( ) ;
return string ;
} else if ( ch === '\\' ) {
next ( ) ;
if ( ch === 'u' ) {
uffff = 0 ;
for ( i = 0 ; i < 4 ; i += 1 ) {
hex = parseInt ( next ( ) , 16 ) ;
if ( ! isFinite ( hex ) ) {
break ;
}
uffff = uffff * 16 + hex ;
}
string += String . fromCharCode ( uffff ) ;
} else if ( typeof escapee [ ch ] === 'string' ) {
string += escapee [ ch ] ;
} else {
break ;
}
} else {
string += ch ;
}
}
}
error ( "Bad string" ) ;
} ,
white = function ( ) {
// Skip whitespace.
while ( ch && ch <= ' ' ) {
next ( ) ;
}
} ,
word = function ( ) {
// true, false, or null.
switch ( ch ) {
case 't' :
next ( 't' ) ;
next ( 'r' ) ;
next ( 'u' ) ;
next ( 'e' ) ;
return true ;
case 'f' :
next ( 'f' ) ;
next ( 'a' ) ;
next ( 'l' ) ;
next ( 's' ) ;
next ( 'e' ) ;
return false ;
case 'n' :
next ( 'n' ) ;
next ( 'u' ) ;
next ( 'l' ) ;
next ( 'l' ) ;
return null ;
}
error ( "Unexpected '" + ch + "'" ) ;
} ,
value , // Place holder for the value function.
array = function ( ) {
// Parse an array value.
var array = [ ] ;
if ( ch === '[' ) {
next ( '[' ) ;
white ( ) ;
if ( ch === ']' ) {
next ( ']' ) ;
return array ; // empty array
}
while ( ch ) {
array . push ( value ( ) ) ;
white ( ) ;
if ( ch === ']' ) {
next ( ']' ) ;
return array ;
}
next ( ',' ) ;
white ( ) ;
}
}
error ( "Bad array" ) ;
} ,
object = function ( ) {
// Parse an object value.
var key ,
object = { } ;
if ( ch === '{' ) {
next ( '{' ) ;
white ( ) ;
if ( ch === '}' ) {
next ( '}' ) ;
return object ; // empty object
}
while ( ch ) {
key = string ( ) ;
white ( ) ;
next ( ':' ) ;
if ( Object . hasOwnProperty . call ( object , key ) ) {
error ( 'Duplicate key "' + key + '"' ) ;
}
object [ key ] = value ( ) ;
white ( ) ;
if ( ch === '}' ) {
next ( '}' ) ;
return object ;
}
next ( ',' ) ;
white ( ) ;
}
}
error ( "Bad object" ) ;
} ;
value = function ( ) {
// Parse a JSON value. It could be an object, an array, a string, a number,
// or a word.
white ( ) ;
switch ( ch ) {
case '{' :
return object ( ) ;
case '[' :
return array ( ) ;
case '"' :
return string ( ) ;
case '-' :
return number ( ) ;
default :
return ch >= '0' && ch <= '9' ? number ( ) : word ( ) ;
}
} ;
// Return the json_parse function. It will have access to all of the above
// functions and variables.
module . exports = function ( source , reviver ) {
var result ;
text = source ;
at = 0 ;
ch = ' ' ;
result = value ( ) ;
white ( ) ;
if ( ch ) {
error ( "Syntax error" ) ;
}
// If there is a reviver function, we recursively walk the new structure,
// passing each name/value pair to the reviver function for possible
// transformation, starting with a temporary root object that holds the result
// in an empty key. If there is not a reviver function, we simply return the
// result.
return typeof reviver === 'function' ? ( function walk ( holder , key ) {
var k , v , value = holder [ key ] ;
if ( value && typeof value === 'object' ) {
for ( k in value ) {
if ( Object . prototype . hasOwnProperty . call ( value , k ) ) {
v = walk ( value , k ) ;
if ( v !== undefined ) {
value [ k ] = v ;
} else {
delete value [ k ] ;
}
}
}
}
return reviver . call ( holder , key , value ) ;
} ( { '' : result } , '' ) ) : result ;
} ;
} , { } ] , 49 : [ function ( require , module , exports ) {
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g ,
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g ,
gap ,
indent ,
meta = { // table of character substitutions
'\b' : '\\b' ,
'\t' : '\\t' ,
'\n' : '\\n' ,
'\f' : '\\f' ,
'\r' : '\\r' ,
'"' : '\\"' ,
'\\' : '\\\\'
} ,
rep ;
function quote ( string ) {
// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.
escapable . lastIndex = 0 ;
return escapable . test ( string ) ? '"' + string . replace ( escapable , function ( a ) {
var c = meta [ a ] ;
return typeof c === 'string' ? c :
'\\u' + ( '0000' + a . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 4 ) ;
} ) + '"' : '"' + string + '"' ;
}
function str ( key , holder ) {
// Produce a string from holder[key].
var i , // The loop counter.
k , // The member key.
v , // The member value.
length ,
mind = gap ,
partial ,
value = holder [ key ] ;
// If the value has a toJSON method, call it to obtain a replacement value.
if ( value && typeof value === 'object' &&
typeof value . toJSON === 'function' ) {
value = value . toJSON ( key ) ;
}
// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.
if ( typeof rep === 'function' ) {
value = rep . call ( holder , key , value ) ;
}
// What happens next depends on the value's type.
switch ( typeof value ) {
case 'string' :
return quote ( value ) ;
case 'number' :
// JSON numbers must be finite. Encode non-finite numbers as null.
return isFinite ( value ) ? String ( value ) : 'null' ;
case 'boolean' :
case 'null' :
// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce 'null'. The case is included here in
// the remote chance that this gets fixed someday.
return String ( value ) ;
case 'object' :
if ( ! value ) return 'null' ;
gap += indent ;
partial = [ ] ;
// Array.isArray
if ( Object . prototype . toString . apply ( value ) === '[object Array]' ) {
length = value . length ;
for ( i = 0 ; i < length ; i += 1 ) {
partial [ i ] = str ( i , value ) || 'null' ;
}
// Join all of the elements together, separated with commas, and
// wrap them in brackets.
v = partial . length === 0 ? '[]' : gap ?
'[\n' + gap + partial . join ( ',\n' + gap ) + '\n' + mind + ']' :
'[' + partial . join ( ',' ) + ']' ;
gap = mind ;
return v ;
}
// If the replacer is an array, use it to select the members to be
// stringified.
if ( rep && typeof rep === 'object' ) {
length = rep . length ;
for ( i = 0 ; i < length ; i += 1 ) {
k = rep [ i ] ;
if ( typeof k === 'string' ) {
v = str ( k , value ) ;
if ( v ) {
partial . push ( quote ( k ) + ( gap ? ': ' : ':' ) + v ) ;
}
}
}
}
else {
// Otherwise, iterate through all of the keys in the object.
for ( k in value ) {
if ( Object . prototype . hasOwnProperty . call ( value , k ) ) {
v = str ( k , value ) ;
if ( v ) {
partial . push ( quote ( k ) + ( gap ? ': ' : ':' ) + v ) ;
}
}
}
}
// Join all of the member texts together, separated with commas,
// and wrap them in braces.
v = partial . length === 0 ? '{}' : gap ?
'{\n' + gap + partial . join ( ',\n' + gap ) + '\n' + mind + '}' :
'{' + partial . join ( ',' ) + '}' ;
gap = mind ;
return v ;
}
}
module . exports = function ( value , replacer , space ) {
var i ;
gap = '' ;
indent = '' ;
// If the space parameter is a number, make an indent string containing that
// many spaces.
if ( typeof space === 'number' ) {
for ( i = 0 ; i < space ; i += 1 ) {
indent += ' ' ;
}
}
// If the space parameter is a string, it will be used as the indent string.
else if ( typeof space === 'string' ) {
indent = space ;
}
// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.
rep = replacer ;
if ( replacer && typeof replacer !== 'function'
&& ( typeof replacer !== 'object' || typeof replacer . length !== 'number' ) ) {
throw new Error ( 'JSON.stringify' ) ;
}
// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.
return str ( '' , { '' : value } ) ;
} ;
} , { } ] , "ajv" : [ function ( require , module , exports ) {
'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' )
, util = require ( './compile/util' )
, async = require ( './async' )
, co = require ( 'co' ) ;
module . exports = Ajv ;
Ajv . prototype . compileAsync = async . compile ;
Ajv . prototype . addKeyword = require ( './keyword' ) ;
Ajv . ValidationError = require ( './compile/validation_error' ) ;
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 ) ;
}
var META _IGNORE _OPTIONS = [ 'removeAdditional' , 'useDefaults' , 'coerceTypes' ] ;
/ * *
* 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 ;
opts = this . _opts = util . copy ( opts ) || { } ;
this . _schemas = { } ;
this . _refs = { } ;
this . _formats = formats ( opts . format ) ;
this . _cache = 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 ;
opts . loopRequired = opts . loopRequired || Infinity ;
if ( opts . async || opts . transpile ) async . setup ( opts ) ;
if ( opts . beautify === true ) opts . beautify = { indent _size : 2 } ;
if ( opts . errorDataPath == 'property' ) opts . _errorDataPathProperty = true ;
this . _metaOpts = getMetaSchemaOptions ( ) ;
if ( opts . formats ) addInitialFormats ( ) ;
addDraft4MetaSchema ( ) ;
if ( opts . v5 ) v5 . enable ( this ) ;
if ( typeof opts . meta == 'object' ) addMetaSchema ( opts . meta ) ;
addInitialSchemas ( ) ;
/ * *
* 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 ) ;
if ( v . $async === true )
return self . _opts . async == '*' ? co ( valid ) : valid ;
self . errors = v . errors ;
return valid ;
}
/ * *
* Create validating function for passed schema .
* @ param { Object } schema schema object
* @ 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 ` and other parameters 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 ` .
* @ param { Boolean } _skipValidation true to skip schema validation . Used internally , option validateSchema should be used instead .
* @ param { Boolean } _meta true if schema is a meta - schema . Used internally , addMetaSchema should be used instead .
* /
function addSchema ( schema , key , _skipValidation , _meta ) {
if ( Array . isArray ( schema ) ) {
for ( var i = 0 ; i < schema . length ; i ++ ) addSchema ( schema [ i ] , undefined , _skipValidation , _meta ) ;
return ;
}
// can key/id have # inside?
key = resolve . normalizeId ( key || schema . id ) ;
checkUnique ( key ) ;
var schemaObj = self . _schemas [ key ] = _addSchema ( schema , _skipValidation , true ) ;
schemaObj . meta = _meta ;
}
/ * *
* Add schema that will be used to validate other schemas
* options in META _IGNORE _OPTIONS are alway set to false
* @ param { Object } schema schema object
* @ param { String } key optional schema key
* @ param { Boolean } skipValidation true to skip schema validation , can be used to override validateSchema option for meta - schema
* /
function addMetaSchema ( schema , key , skipValidation ) {
addSchema ( schema , key , skipValidation , true ) ;
}
/ * *
* Validate schema
* @ param { Object } schema schema to validate
* @ param { Boolean } throwOrLogError pass true to throw ( or log ) an error if invalid
* @ return { Boolean } true if schema is valid
* /
function validateSchema ( schema , throwOrLogError ) {
var $schema = schema . $schema || self . _opts . defaultMeta || defaultMeta ( ) ;
var currentUriFormat = self . _formats . uri ;
self . _formats . uri = typeof currentUriFormat == 'function'
? SCHEMA _URI _FORMAT _FUNC
: SCHEMA _URI _FORMAT ;
var valid = validate ( $schema , schema ) ;
self . _formats . uri = currentUriFormat ;
if ( ! valid && throwOrLogError ) {
var message = 'schema is invalid:' + errorsText ( ) ;
if ( self . _opts . validateSchema == 'log' ) console . error ( message ) ;
else throw new Error ( message ) ;
}
return valid ;
}
function defaultMeta ( ) {
var meta = self . _opts . meta ;
self . _opts . defaultMeta = typeof meta == 'object'
? meta . id || meta
: self . _opts . v5
? v5 . META _SCHEMA _ID
: META _SCHEMA _ID ;
return self . _opts . defaultMeta ;
}
/ * *
* Get compiled schema from the instance by ` key ` or ` ref ` .
* @ param { String } keyRef ` key ` that was passed to ` addSchema ` or full schema reference ( ` schema.id ` or resolved id ) .
* @ return { Function } schema validating function ( with property ` schema ` ) .
* /
function getSchema ( keyRef ) {
var schemaObj = _getSchemaObj ( keyRef ) ;
switch ( typeof schemaObj ) {
case 'object' : return schemaObj . validate || _compile ( schemaObj ) ;
case 'string' : return getSchema ( schemaObj ) ;
}
}
function _getSchemaObj ( keyRef ) {
keyRef = resolve . normalizeId ( keyRef ) ;
return self . _schemas [ keyRef ] || self . _refs [ keyRef ] ;
}
/ * *
* Remove cached schema ( s ) .
* If no parameter is passed all schemas but meta - schemas are removed .
* If RegExp is passed all schemas with key / id matching pattern but meta - schemas are removed .
* Even if schema is referenced by other schemas it still can be removed as other schemas have local references .
* @ param { String | Object | RegExp } schemaKeyRef key , ref , pattern to match key / ref or schema object
* /
function removeSchema ( schemaKeyRef ) {
if ( schemaKeyRef instanceof RegExp ) {
_removeAllSchemas ( self . _schemas , schemaKeyRef ) ;
_removeAllSchemas ( self . _refs , schemaKeyRef ) ;
return ;
}
switch ( typeof schemaKeyRef ) {
case 'undefined' :
_removeAllSchemas ( self . _schemas ) ;
_removeAllSchemas ( self . _refs ) ;
self . _cache . clear ( ) ;
return ;
case 'string' :
var schemaObj = _getSchemaObj ( schemaKeyRef ) ;
if ( schemaObj ) self . _cache . del ( schemaObj . jsonStr ) ;
delete self . _schemas [ schemaKeyRef ] ;
delete self . _refs [ schemaKeyRef ] ;
return ;
case 'object' :
var jsonStr = stableStringify ( schemaKeyRef ) ;
self . _cache . del ( jsonStr ) ;
var id = schemaKeyRef . id ;
if ( id ) {
id = resolve . normalizeId ( id ) ;
delete self . _schemas [ id ] ;
delete self . _refs [ id ] ;
}
}
}
function _removeAllSchemas ( schemas , regex ) {
for ( var keyRef in schemas ) {
var schemaObj = schemas [ keyRef ] ;
if ( ! schemaObj . meta && ( ! regex || regex . test ( keyRef ) ) ) {
self . _cache . del ( schemaObj . jsonStr ) ;
delete schemas [ keyRef ] ;
}
}
}
function _addSchema ( schema , skipValidation , shouldAddSchema ) {
if ( typeof schema != 'object' ) throw new Error ( 'schema should be object' ) ;
var jsonStr = stableStringify ( schema ) ;
var cached = self . _cache . get ( jsonStr ) ;
if ( cached ) return cached ;
shouldAddSchema = shouldAddSchema || self . _opts . addUsedSchema !== false ;
var id = resolve . normalizeId ( schema . id ) ;
if ( id && shouldAddSchema ) checkUnique ( id ) ;
if ( self . _opts . validateSchema !== false && ! skipValidation )
validateSchema ( schema , true ) ;
var localRefs = resolve . ids . call ( self , schema ) ;
var schemaObj = new SchemaObject ( {
id : id ,
schema : schema ,
localRefs : localRefs ,
jsonStr : jsonStr
} ) ;
if ( id [ 0 ] != '#' && shouldAddSchema ) self . _refs [ id ] = schemaObj ;
self . _cache . put ( jsonStr , schemaObj ) ;
return schemaObj ;
}
function _compile ( schemaObj , root ) {
if ( schemaObj . compiling ) {
schemaObj . validate = callValidate ;
callValidate . schema = schemaObj . schema ;
callValidate . errors = null ;
callValidate . root = root ? root : callValidate ;
if ( schemaObj . schema . $async === true )
callValidate . $async = true ;
return callValidate ;
}
schemaObj . compiling = true ;
var currentOpts ;
if ( schemaObj . meta ) {
currentOpts = self . _opts ;
self . _opts = self . _metaOpts ;
}
var v ;
try { v = compileSchema . call ( self , schemaObj . schema , root , schemaObj . localRefs ) ; }
finally {
schemaObj . compiling = false ;
if ( schemaObj . meta ) self . _opts = currentOpts ;
}
schemaObj . validate = v ;
schemaObj . refs = v . refs ;
schemaObj . refVal = v . refVal ;
schemaObj . root = v . root ;
return v ;
function callValidate ( ) {
var _validate = schemaObj . validate ;
var result = _validate . apply ( null , arguments ) ;
callValidate . errors = _validate . errors ;
return result ;
}
}
/ * *
* Convert array of error message objects to string
* @ param { Array < Object > } errors optional array of validation errors , if not passed errors from the instance are used .
* @ param { Object } options optional options with properties ` separator ` and ` dataVar ` .
* @ return { String } human readable string with all errors descriptions
* /
function errorsText ( errors , options ) {
errors = errors || self . errors ;
if ( ! errors ) return 'No errors' ;
options = options || { } ;
var separator = options . separator === undefined ? ', ' : options . separator ;
var dataVar = options . dataVar === undefined ? 'data' : options . dataVar ;
var text = '' ;
for ( var i = 0 ; i < errors . length ; i ++ ) {
var e = errors [ i ] ;
if ( e ) text += dataVar + e . dataPath + ' ' + e . message + separator ;
}
return text . slice ( 0 , - separator . length ) ;
}
/ * *
* Add custom format
* @ param { String } name format name
* @ param { String | RegExp | Function } format string is converted to RegExp ; function should return boolean ( true when valid )
* /
function addFormat ( name , format ) {
if ( typeof format == 'string' ) format = new RegExp ( format ) ;
self . _formats [ name ] = format ;
}
function addDraft4MetaSchema ( ) {
if ( self . _opts . meta !== false ) {
var metaSchema = require ( './refs/json-schema-draft-04.json' ) ;
addMetaSchema ( metaSchema , META _SCHEMA _ID , true ) ;
self . _refs [ 'http://json-schema.org/schema' ] = META _SCHEMA _ID ;
}
}
function addInitialSchemas ( ) {
var optsSchemas = self . _opts . schemas ;
if ( ! optsSchemas ) return ;
if ( Array . isArray ( optsSchemas ) ) addSchema ( optsSchemas ) ;
else for ( var key in optsSchemas ) addSchema ( optsSchemas [ key ] , key ) ;
}
function addInitialFormats ( ) {
for ( var name in self . _opts . formats ) {
var format = self . _opts . formats [ name ] ;
addFormat ( name , format ) ;
}
}
function checkUnique ( id ) {
if ( self . _schemas [ id ] || self . _refs [ id ] )
throw new Error ( 'schema with key or id "' + id + '" already exists' ) ;
}
function getMetaSchemaOptions ( ) {
var metaOpts = util . copy ( self . _opts ) ;
for ( var i = 0 ; i < META _IGNORE _OPTIONS . length ; i ++ )
delete metaOpts [ META _IGNORE _OPTIONS [ i ] ] ;
return metaOpts ;
}
}
} , { "./async" : 1 , "./cache" : 2 , "./compile" : 6 , "./compile/formats" : 5 , "./compile/resolve" : 7 , "./compile/rules" : 8 , "./compile/schema_obj" : 9 , "./compile/util" : 10 , "./compile/validation_error" : 11 , "./keyword" : 35 , "./refs/json-schema-draft-04.json" : 36 , "./v5" : 38 , "co" : 45 , "json-stable-stringify" : 46 } ] } , { } , [ ] ) ( "ajv" )
2017-08-30 11:50:27 +03:00
} ) ;