'use strict'; module.exports = function generate_validate(it, $keyword, $ruleType) { var out=''; var $async = it.schema.$async === true , $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref') , $id = it.self._getId(it.schema); if (it.opts.strictKeywords) { var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); if ($unknownKwd) { var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); else throw new Error($keywordsMsg); } }if(it.isTop){out+=' var validate = ';if($async){it.async = true;out+='async ';}out+='function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; ';if($id && (it.opts.sourceCode || it.opts.processCode)){out+=' '+( '/\*# sourceURL=' + $id + ' */' )+' ';}}if(typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)){ var $keyword = 'false schema'; var $lvl = it.level; var $dataLvl = it.dataLevel; var $schema = it.schema[$keyword]; var $schemaPath = it.schemaPath + it.util.getProperty($keyword); var $errSchemaPath = it.errSchemaPath + '/' + $keyword; var $breakOnError = !it.opts.allErrors; var $errorKeyword; var $data = 'data' + ($dataLvl || ''); var $valid = 'valid' + $lvl; if(it.schema === false){if(it.isTop){ $breakOnError = true; }else{out+=' var '+($valid)+' = false; ';} var $$outStack = $$outStack || []; $$outStack.push(out); out = ''; /* istanbul ignore else */ if(it.createErrors !== false){out+=' { keyword: \''+( $errorKeyword || 'false schema' )+'\' , dataPath: (dataPath || \'\') + '+( it.errorPath )+' , schemaPath: '+(it.util.toQuotedString($errSchemaPath))+' , params: {} ';if(it.opts.messages !== false){out+=' , message: \'boolean schema is false\' ';}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++; ';}}else{if(it.isTop){if($async){out+=' return data; ';}else{out+=' validate.errors = null; return true; ';}}else{out+=' var '+($valid)+' = true; ';}}if(it.isTop){out+=' }; return validate; ';} return out; }if(it.isTop){ var $top = it.isTop , $lvl = it.level = 0 , $dataLvl = it.dataLevel = 0 , $data = 'data'; it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); it.baseId = it.baseId || it.rootId; delete it.isTop; it.dataPathArr = [""]; if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { var $defaultMsg = 'default is ignored in the schema root'; if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); else throw new Error($defaultMsg); } out+=' var vErrors = null; '; out+=' var errors = 0; '; out+=' if (rootData === undefined) rootData = data; '; }else{ var $lvl = it.level , $dataLvl = it.dataLevel , $data = 'data' + ($dataLvl || ''); if ($id) it.baseId = it.resolve.url(it.baseId, $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 = ''; var $errorKeyword; var $typeSchema = it.schema.type , $typeIsArray = Array.isArray($typeSchema); if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { if ($typeIsArray) { if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); } else if ($typeSchema != 'null') { $typeSchema = [$typeSchema, 'null']; $typeIsArray = true; } } if ($typeIsArray && $typeSchema.length == 1) { $typeSchema = $typeSchema[0]; $typeIsArray = false; }if(it.schema.$ref && $refKeywords){if(it.opts.extendRefs == 'fail'){ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); }else if(it.opts.extendRefs !== true){ $refKeywords = false; it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); }}if(it.schema.$comment && it.opts.$comment){out+=' '+( it.RULES.all.$comment.code(it, '$comment') );}if($typeSchema){if(it.opts.coerceTypes){ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); } var $rulesGroup = it.RULES.types[$typeSchema]; if($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))){ var $schemaPath = it.schemaPath + '.type' , $errSchemaPath = it.errSchemaPath + '/type'; var $schemaPath = it.schemaPath + '.type' , $errSchemaPath = it.errSchemaPath + '/type' , $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; out+=' if ('+( it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true) )+') { ';if($coerceToTypes){ var $dataType = 'dataType' + $lvl , $coerced = 'coerced' + $lvl; out+=' var '+($dataType)+' = typeof '+($data)+'; var '+($coerced)+' = undefined; ';if(it.opts.coerceTypes == 'array'){out+=' if ('+($dataType)+' == \'object\' && Array.isArray('+($data)+') && '+($data)+'.length == 1) { '+($data)+' = '+($data)+'[0]; '+($dataType)+' = typeof '+($data)+'; if ('+(it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers))+') '+($coerced)+' = '+($data)+'; } ';}out+=' if ('+($coerced)+' !== undefined) ; ';var arr1=$coerceToTypes;if(arr1){var $type,$i=-1,l1=arr1.length-1;while($i