From c224619b9a13a30a7afb54d2e8b4a0c7b5b7943d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=BA=D0=BE=D0=B2=D0=BE=D1=80=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=90=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B5=D0=B2=D0=B8=D1=87?= Date: Wed, 15 Jul 2020 06:19:53 +0300 Subject: [PATCH] Fix 'required' implementation Now it doesn't rely on undeclared variables anymore. Fixes: https://github.com/mafintosh/is-my-json-valid/issues/179 --- index.js | 7 ++++--- test/required-unique-noconflict.js | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 test/required-unique-noconflict.js 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() +})