2025-04-19 23:12:19 -04:00

233 lines
5.9 KiB
JavaScript

'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;
};