optimised generated code for all keywords

master
Evgeny Poberezkin 2015-06-12 11:43:41 +01:00
parent 804627efe4
commit 80b04dfc4c
26 changed files with 131 additions and 84 deletions

View File

@ -31,7 +31,8 @@ function compile(schema, _rootSchema) {
util: util,
resolve: resolve,
resolveRef: resolveRef,
opts: this.opts
opts: this.opts,
formats: formats
});
if (this.opts.beautify) {

View File

@ -2,14 +2,18 @@
{{# def.setup:'$ref' }}
{{? $schema == '#' || $schema == '#/' }}
var {{=$valid}} = validate({{=$data}}, (dataPath || '') + {{= it.errorPath }});
{{? $breakOnError }} if ( {{?}}
validate({{=$data}}, (dataPath || '') + {{= it.errorPath }})
{{? $breakOnError }} ) { {{??}};{{?}}
{{??}}
{{ $id = it.resolveRef(it.baseId, $schema); }}
{{? $id === undefined }}
{{# def.error:'$ref' }}
var {{=$valid}} = false;
{{? $breakOnError }} if (false) { {{?}}
{{??}}
var {{=$valid}} = refVal[{{=$id}}]({{=$data}}, (dataPath || '') + {{= it.errorPath }});
if (!{{=$valid}}) validate.errors.push.apply(validate.errors, refVal[{{=$id}}].errors);
if (!refVal[{{=$id}}]({{=$data}}, (dataPath || '') + {{= it.errorPath }})) {
validate.errors.push.apply(validate.errors, refVal[{{=$id}}].errors);
}
{{? $breakOnError }} else { {{?}}
{{?}}
{{?}}

View File

@ -2,11 +2,7 @@
{{# def.setup:'allOf' }}
{{# def.setupNextLevel }}
var {{=$valid}} = true;
{{~ $schema:$sch:$i }}
{{? $i}} {{# def.ifValid }} {{?}}
{{
$it.schema = $sch;
$it.schemaPath = $schemaPath + '[' + $i + ']';
@ -14,7 +10,14 @@ var {{=$valid}} = true;
{{= it.validate($it) }}
{{=$valid}} = {{=$valid}} && valid{{=$it.level}};
{{? $breakOnError }}
if (valid{{=$it.level}}) {
{{ $closingBraces += '}'; }}
{{?}}
{{~}}
{{= $closingBraces }}
{{? $breakOnError }}
{{= $closingBraces.slice(0,-1) }}
{{?}}
{{# def.cleanUp }}

View File

@ -23,4 +23,6 @@ var {{=$valid}} = false;
{{= $closingBraces }}
if ({{=$valid}}) validate.errors.length = {{=$errs}};
if ({{=$valid}}) {
validate.errors.length = {{=$errs}};
{{? it.opts.allErrors }} } {{?}}

View File

@ -3,7 +3,9 @@
var $lvl = it.level
, $dataLvl = it.dataLevel
, $schema = it.schema[keyword]
, $schemaPath = it.schemaPath + '.' + keyword;
, $schemaPath = it.schemaPath + '.' + keyword
, $breakOnError = !it.opts.allErrors;
var $data = 'data' + ($dataLvl || '')
, $valid = 'valid' + $lvl
@ -15,8 +17,7 @@
{{## def.setupNextLevel:
{{
var $it = it.util.copy(it)
, $closingBraces = ''
, $breakOnError = !it.opts.allErrors;
, $closingBraces = '';
$it.level++;
}}
#}}

View File

@ -15,14 +15,19 @@
}}
var {{=$errs}} = validate.errors.length;
var {{=$valid}};
{{## def.checkPropertyDeps:
({{~ $deps:$dep:$i }}
{{?$i}} && {{?}}
{{=$data}}['{{= $dep}}'] !== undefined
{{~}})
#}}
{{ for ($property in $propertyDeps) { }}
if ({{=$data}}['{{= $property }}'] !== undefined) {
{{ $deps = $propertyDeps[$property]; }}
{{=$valid}} = {{~ $deps:$dep:$i }}{{?$i}} && {{?}}{{=$data}}['{{= $dep}}'] !== undefined{{~}};
{{# def.checkError:'dependencies' }}
if (! {{# def.checkPropertyDeps }} )
{{# def.error:'dependencies' }}
{{# def.elseIfValid }}
}
{{ } }}
@ -46,8 +51,9 @@ var {{=$valid}};
{{?}}
{{ } }}
{{? $breakOnError }}{{= $closingBraces }}{{?}}
{{=$valid}} = {{=$errs}} == validate.errors.length;
{{? $breakOnError }}
{{= $closingBraces }}
if ({{=$errs}} == validate.errors.length) {
{{?}}
{{# def.cleanUp }}

View File

@ -12,3 +12,5 @@ for (var {{=$i}}=0; {{=$i}}<enumSchema{{=$lvl}}.length; {{=$i}}++)
}
{{# def.checkError:'enum' }}
{{? $breakOnError }} else { {{?}}

View File

@ -1,15 +1,25 @@
{{# def.definitions }}
{{# def.setup:'format' }}
{{? it.opts.format !== false }}
{{# def.setup:'format' }}
{{ var $mode = it.opts.format == 'full' ? 'full' : 'fast'; }}
{{
var $mode = it.opts.format == 'full' ? 'full' : 'fast'
, $format = it.formats[$mode][$schema];
}}
var format{{=$lvl}} = formats.{{= $mode }}['{{=$schema}}'];
var {{=$valid}} = typeof format{{=$lvl}} == 'function'
? format{{=$lvl}}({{=$data}})
: !format{{=$lvl}} || format{{=$lvl}}.test({{=$data}});
{{## def.format: formats.{{= $mode }}['{{=$schema}}'] #}}
{{# def.checkError:'format' }}
{{## def.checkFormat:
{{? typeof $format == 'function' }}
{{# def.format }}({{=$data}})
{{??}}
{{# def.format }}.test({{=$data}})
{{?}}
#}}
{{? it.opts.format !== false && $format }}
if (! {{# def.checkFormat }})
{{# def.error:'format' }}
{{? $breakOnError }} else { {{?}}
{{??}}
var {{=$valid}} = true;
{{? $breakOnError }} if (true) { {{?}}
{{?}}

View File

@ -76,8 +76,9 @@ var {{=$valid}};
{{# def.ifResultValid }}
{{?}}
{{? $breakOnError }} {{= $closingBraces }} {{?}}
{{=$valid}} = {{=$errs}} == validate.errors.length;
{{? $breakOnError }}
{{= $closingBraces }}
if ({{=$errs}} == validate.errors.length) {
{{?}}
{{# def.cleanUp }}

View File

@ -1,6 +1,6 @@
{{# def.definitions }}
{{# def.setup:'maxItems' }}
var {{=$valid}} = {{=$data}}.length <= {{=$schema}};
{{# def.checkError:'maxItems' }}
if ({{=$data}}.length > {{=$schema}})
{{# def.error:'maxItems' }}
{{? $breakOnError }} else { {{?}}

View File

@ -1,6 +1,6 @@
{{# def.definitions }}
{{# def.setup:'maxLength' }}
var {{=$valid}} = {{# def.strLength }} <= {{=$schema}};
{{# def.checkError:'maxLength' }}
if ({{# def.strLength }} > {{=$schema}})
{{# def.error:'maxLength' }}
{{? $breakOnError }} else { {{?}}

View File

@ -1,6 +1,6 @@
{{# def.definitions }}
{{# def.setup:'maxProperties' }}
var {{=$valid}} = Object.keys({{=$data}}).length <= {{=$schema}};
{{# def.checkError:'maxProperties' }}
if (Object.keys({{=$data}}).length > {{=$schema}})
{{# def.error:'maxProperties' }}
{{? $breakOnError }} else { {{?}}

View File

@ -6,7 +6,6 @@
, $op = $exclusive ? '<' : '<=';
}}
var {{=$valid}} = {{=$data}} {{=$op}} {{=$schema}};
{{# def.checkError:'maximum' }}
if (! ({{=$data}} {{=$op}} {{=$schema}}) )
{{# def.error:'maximum' }}
{{? $breakOnError }} else { {{?}}

View File

@ -1,6 +1,6 @@
{{# def.definitions }}
{{# def.setup:'minItems' }}
var {{=$valid}} = {{=$data}}.length >= {{=$schema}};
{{# def.checkError:'minItems' }}
if ({{=$data}}.length < {{=$schema}})
{{# def.error:'minItems' }}
{{? $breakOnError }} else { {{?}}

View File

@ -1,6 +1,6 @@
{{# def.definitions }}
{{# def.setup:'minLength' }}
var {{=$valid}} = {{# def.strLength }} >= {{=$schema}};
{{# def.checkError:'minLength' }}
if ({{# def.strLength }} < {{=$schema}})
{{# def.error:'minLength' }}
{{? $breakOnError }} else { {{?}}

View File

@ -1,6 +1,6 @@
{{# def.definitions }}
{{# def.setup:'minProperties' }}
var {{=$valid}} = Object.keys({{=$data}}).length >= {{=$schema}};
{{# def.checkError:'minProperties' }}
if (Object.keys({{=$data}}).length < {{=$schema}})
{{# def.error:'minProperties' }}
{{? $breakOnError }} else { {{?}}

View File

@ -6,6 +6,6 @@
, $op = $exclusive ? '>' : '>=';
}}
var {{=$valid}} = {{=$data}} {{=$op}} {{=$schema}};
{{# def.checkError:'minimum' }}
if (!( {{=$data}} {{=$op}} {{=$schema}} ))
{{# def.error:'minimum' }}
{{? $breakOnError }} else { {{?}}

View File

@ -2,6 +2,6 @@
{{# def.setup:'multipleOf' }}
var division{{=$lvl}} = {{=$data}} / {{=$schema}};
var {{=$valid}} = division{{=$lvl}} === parseInt(division{{=$lvl}});
{{# def.checkError:'multipleOf' }}
if ({{=$data}} / {{=$schema}} !== parseInt(division{{=$lvl}}))
{{# def.error:'multipleOf' }}
{{? $breakOnError }} else { {{?}}

View File

@ -11,8 +11,9 @@ var {{=$errs}} = validate.errors.length;
{{= it.validate($it) }}
var {{=$valid}} = valid{{=$it.level}};
{{=$valid}} = !{{=$valid}};
if (valid{{=$it.level}})
{{# def.error:'not' }}
else {
validate.errors.length = {{=$errs}};
if ({{=$valid}}) validate.errors.length = {{=$errs}};
else {{# def.error:'not' }}
{{? it.opts.allErrors }} } {{?}}

View File

@ -28,5 +28,9 @@ var {{=$valid}} = false;
{{= $closingBraces }}
if ({{=$valid}}) validate.errors.length = {{=$errs}};
else {{# def.error:'oneOf' }}
if (!{{=$valid}})
{{# def.error:'oneOf' }}
else {
validate.errors.length = {{=$errs}};
{{? it.opts.allErrors }} } {{?}}

View File

@ -2,6 +2,6 @@
{{# def.setup:'pattern' }}
{{ new RegExp($schema); /* test if regexp is valid to fail at compile time rather than in eval */}}
var {{=$valid}} = /{{= it.util.escapeRegExp($schema) }}/.test({{=$data}});
{{# def.checkError:'pattern' }}
if (! /{{= it.util.escapeRegExp($schema) }}/.test({{=$data}}) )
{{# def.error:'pattern' }}
{{? $breakOnError }} else { {{?}}

View File

@ -124,8 +124,9 @@ var valid{{=$it.level}} = true;
{{?}}
{{~}}
{{? $breakOnError }}{{= $closingBraces }}{{?}}
var {{=$valid}} = {{=$errs}} == validate.errors.length;
{{? $breakOnError }}
{{= $closingBraces }}
if ({{=$errs}} == validate.errors.length) {
{{?}}
{{# def.cleanUp }}

View File

@ -1,18 +1,26 @@
{{# def.definitions }}
{{# def.setup:'required' }}
{{## def.checkRequired:
({{~ $schema:$property:$i }}
{{? $i}} && {{?}}
{{=$data}}{{= it.util.getProperty($property) }} !== undefined
{{~}})
#}}
{{? $schema.length <= 100 }}
{{=$valid}} = {{~ $schema:$property:$i }}
{{? $i}} && {{?}}
{{=$data}}{{= it.util.getProperty($property) }} !== undefined
{{~}};
if (! {{# def.checkRequired }})
{{# def.error:'required' }}
{{? $breakOnError }} else { {{?}}
{{??}}
var schema{{=$lvl}} = validate.schema{{=$schemaPath}};
for (var i = 0; i < schema{{=$lvl}}.length; i++) {
{{=$valid}} = data[schema{{=$lvl}}[i]] !== undefined;
var {{=$valid}} = data[schema{{=$lvl}}[i]] !== undefined;
if (!{{=$valid}}) break;
}
{{# def.checkError:'required' }}
{{? $breakOnError }} if ({{=$valid}}) { {{?}}
{{?}}
{{# def.checkError:'required' }}

View File

@ -1,9 +1,9 @@
{{# def.definitions }}
{{# def.setup:'uniqueItems' }}
var {{=$valid}} = true;
{{? $schema && it.opts.uniqueItems !== false }}
var {{=$valid}} = true;
if ({{=$data}}.length > 1) {
var i = {{=$data}}.length, j;
outer:
@ -15,7 +15,12 @@ var {{=$valid}} = true;
}
}
}
{{# def.checkError:'uniqueItems' }}
}
if (!{{=$valid}})
{{# def.error:'uniqueItems' }}
{{? $breakOnError }} else { {{?}}
{{??}}
{{? $breakOnError }} if (true) { {{?}}
{{?}}

View File

@ -55,7 +55,6 @@ var {{=$valid}} = true;
{{? $shouldUseRule($rule) }}
{{= $rule.code(it) }}
{{? $breakOnErrors }}
if ({{=$valid}}) {
{{ $closingBraces1 += '}'; }}
{{?}}
{{?}}

View File

@ -1,6 +1,6 @@
{
"name": "ajv",
"version": "0.3.7",
"version": "0.3.8",
"description": "Another JSON schema Validator",
"main": "lib/ajv.js",
"scripts": {