'use strict'; module.exports = function generate_format(it, $keyword, $ruleType) { var out = ' '; 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 $data = 'data' + ($dataLvl || ''); if (it.opts.format === false) { if ($breakOnError) { out += ' if (true) { '; } return out; } var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue; if ($isData) { out += ' var schema' + $lvl + ' = ' + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + '; '; $schemaValue = 'schema' + $lvl; } else { $schemaValue = $schema; } var $unknownFormats = it.opts.unknownFormats, $allowUnknown = Array.isArray($unknownFormats); if ($isData) { var $format = 'format' + $lvl, $isObject = 'isObject' + $lvl, $formatType = 'formatType' + $lvl; out += ' var ' + $format + ' = formats[' + $schemaValue + ']; var ' + $isObject + ' = typeof ' + $format + " == 'object' && !(" + $format + ' instanceof RegExp) && ' + $format + '.validate; var ' + $formatType + ' = ' + $isObject + ' && ' + $format + ".type || 'string'; if (" + $isObject + ') { '; if (it.async) { out += ' var async' + $lvl + ' = ' + $format + '.async; '; } out += ' ' + $format + ' = ' + $format + '.validate; } if ( '; if ($isData) { out += ' (' + $schemaValue + ' !== undefined && typeof ' + $schemaValue + " != 'string') || "; } out += ' ('; if ($unknownFormats != 'ignore') { out += ' (' + $schemaValue + ' && !' + $format + ' '; if ($allowUnknown) { out += ' && self._opts.unknownFormats.indexOf(' + $schemaValue + ') == -1 '; } out += ') || '; } out += ' (' + $format + ' && ' + $formatType + " == '" + $ruleType + "' && !(typeof " + $format + " == 'function' ? "; if (it.async) { out += ' (async' + $lvl + ' ? await ' + $format + '(' + $data + ') : ' + $format + '(' + $data + ')) '; } else { out += ' ' + $format + '(' + $data + ') '; } out += ' : ' + $format + '.test(' + $data + '))))) {'; } else { var $format = it.formats[$schema]; if (!$format) { if ($unknownFormats == 'ignore') { it.logger.warn( 'unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"' ); if ($breakOnError) { out += ' if (true) { '; } return out; } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { if ($breakOnError) { out += ' if (true) { '; } return out; } else { throw new Error( 'unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"' ); } } var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; var $formatType = ($isObject && $format.type) || 'string'; if ($isObject) { var $async = $format.async === true; $format = $format.validate; } if ($formatType != $ruleType) { if ($breakOnError) { out += ' if (true) { '; } return out; } if ($async) { if (!it.async) throw new Error('async format in sync schema'); var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; out += ' if (!(await ' + $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: '" + 'format' + "' , dataPath: (dataPath || '') + " + it.errorPath + ' , schemaPath: ' + it.util.toQuotedString($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; };