From 1959de4ea6e1cdacfac215f2773b4d2cef2d2ccb Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Tue, 16 Nov 2021 20:04:31 +0000 Subject: [PATCH] fix minContains: 0, closes #1819 (#1820) --- lib/vocabularies/applicator/contains.ts | 9 ++++----- spec/issues/1819_mincontains.spec.ts | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 spec/issues/1819_mincontains.spec.ts diff --git a/lib/vocabularies/applicator/contains.ts b/lib/vocabularies/applicator/contains.ts index 0c398d1d6..d88675c6c 100644 --- a/lib/vocabularies/applicator/contains.ts +++ b/lib/vocabularies/applicator/contains.ts @@ -63,13 +63,12 @@ const def: CodeKeywordDefinition = { const valid = gen.name("valid") if (max === undefined && min === 1) { validateItems(valid, () => gen.if(valid, () => gen.break())) + } else if (min === 0) { + gen.let(valid, true) + if (max !== undefined) gen.if(_`${data}.length > 0`, validateItemsWithCount) } else { gen.let(valid, false) - if (min === 0) { - gen.if(_`${data}.length > 0`, validateItemsWithCount, () => gen.assign(valid, true)) - } else { - validateItemsWithCount() - } + validateItemsWithCount() } cxt.result(valid, () => cxt.reset()) diff --git a/spec/issues/1819_mincontains.spec.ts b/spec/issues/1819_mincontains.spec.ts new file mode 100644 index 000000000..3fc454d77 --- /dev/null +++ b/spec/issues/1819_mincontains.spec.ts @@ -0,0 +1,19 @@ +import _Ajv from "../ajv2020" +import * as assert from "assert" + +describe("`minContains: 0` without valid items (issue #1819)", () => { + const ajv = new _Ajv() + + const schema = { + type: "array", + minContains: 0, + maxContains: 1, + contains: {type: "number"}, + } + + const validate = ajv.compile(schema) + + it("no items valid", () => assert.strictEqual(validate(["foo"]), true)) + it("1 item valid", () => assert.strictEqual(validate(["foo", 1]), true)) + it("2 items invalid", () => assert.strictEqual(validate(["foo", 1, 2]), false)) +})