diff --git a/index.js b/index.js index 1dc4783..26c516d 100644 --- a/index.js +++ b/index.js @@ -243,19 +243,20 @@ var compile = function(schema, cache, root, reporter, opts) { } if (Array.isArray(node.required)) { + var n = gensym('missing') + validate('var %s = 0', n) var checkRequired = function (req) { var prop = genobj(name, req); validate('if (%s === undefined) {', prop) error('is required', prop) - validate('missing++') + validate('%s++', n) validate('}') } validate('if ((%s)) {', type !== 'object' ? types.object(name) : 'true') - validate('var missing = 0') node.required.map(checkRequired) validate('}'); if (!greedy) { - validate('if (missing === 0) {') + validate('if (%s === 0) {', n) indent++ } } diff --git a/test/required-unique-noconflict.js b/test/required-unique-noconflict.js new file mode 100644 index 0000000..919563c --- /dev/null +++ b/test/required-unique-noconflict.js @@ -0,0 +1,19 @@ +const tape = require('tape') +const validator = require('..') + +tape('required + uniqueItems', (t) => { + const validate = validator({ required: ['a'], uniqueItems: true }) + t.notOk(validate([1, 1]), 'required + uniqueItems') + t.end() +}) + +tape('required + uniqueItems inside allOf', (t) => { + const validate = validator({ + required: ['a'], + allOf: [ + { required: ['b'], uniqueItems: true } + ] + }) + t.notOk(validate([1, 1]), 'required + uniqueItems in allOf') + t.end() +})