From c6364c9afe4d9ba4344637966cf51d17de26baad Mon Sep 17 00:00:00 2001 From: Diya Date: Thu, 27 Nov 2025 19:30:04 +0530 Subject: [PATCH 1/4] fixed:format test failure Signed-off-by: Diya --- src/error-handlers/format.js | 34 +++++--- src/index.js | 6 ++ src/keyword-error-message.test.js | 117 ++++++++++++++++++++++++++- src/normalization-handlers/format.js | 12 +++ 4 files changed, 159 insertions(+), 10 deletions(-) create mode 100644 src/normalization-handlers/format.js diff --git a/src/error-handlers/format.js b/src/error-handlers/format.js index 7e4d158..e6f38d9 100644 --- a/src/error-handlers/format.js +++ b/src/error-handlers/format.js @@ -11,16 +11,32 @@ const format = async (normalizedErrors, instance, localization) => { /** @type ErrorObject[] */ const errors = []; - if (normalizedErrors["https://json-schema.org/keyword/format"]) { - for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/format"]) { - if (!normalizedErrors["https://json-schema.org/keyword/format"][schemaLocation]) { - const keyword = await getSchema(schemaLocation); - errors.push({ - message: localization.getFormatErrorMessage(Schema.value(keyword)), - instanceLocation: Instance.uri(instance), - schemaLocation: schemaLocation - }); + const formats = [ + "https://json-schema.org/keyword/draft-2020-12/format", + "https://json-schema.org/keyword/draft-2019-09/format", + "https://json-schema.org/keyword/draft-07/format", + "https://json-schema.org/keyword/draft-06/format", + "https://json-schema.org/keyword/draft-04/format", + ]; + + for (const formatKeyword of formats) { + if (!normalizedErrors[formatKeyword]) { + continue; + } + + for (const schemaLocation in normalizedErrors[formatKeyword]) { + const valid = normalizedErrors[formatKeyword][schemaLocation]; + if (valid) { + continue; } + + const keyword = await getSchema(schemaLocation); + + errors.push({ + message: localization.getFormatErrorMessage(Schema.value(keyword)), + instanceLocation: Instance.uri(instance), + schemaLocation + }); } } diff --git a/src/index.js b/src/index.js index 1b34ee5..e3db1a6 100644 --- a/src/index.js +++ b/src/index.js @@ -50,6 +50,7 @@ import arrayRangeErrorHandler from "./error-handlers/array-range-handler.js"; import constErrorHandler from "./error-handlers/const.js"; import containsErrorHandler from "./error-handlers/contains.js"; import enumErrorHandler from "./error-handlers/enum.js"; +import format from "./normalization-handlers/format.js"; import formatErrorHandler from "./error-handlers/format.js"; import multipleOfErrorHandler from "./error-handlers/multipleOf.js"; import notErrorHandler from "./error-handlers/not.js"; @@ -83,6 +84,11 @@ setNormalizationHandler("https://json-schema.org/keyword/dependentSchema", depen setNormalizationHandler("https://json-schema.org/keyword/definitions", definitions); setNormalizationHandler("https://json-schema.org/keyword/else", elseKeyword); setNormalizationHandler("https://json-schema.org/keyword/enum", enumKeyword); +setNormalizationHandler("https://json-schema.org/keyword/draft-2020-12/format", format); +setNormalizationHandler("https://json-schema.org/keyword/draft-2019-09/format", format); +setNormalizationHandler("https://json-schema.org/keyword/draft-07/format", format); +setNormalizationHandler("https://json-schema.org/keyword/draft-06/format", format); +setNormalizationHandler("https://json-schema.org/keyword/draft-04/format", format); setNormalizationHandler("https://json-schema/keyword/exclusiveMaximum", exclusiveMaximum); setNormalizationHandler("https://json-schema/keyword/exclusiveMinimum", exclusiveMinimum); setNormalizationHandler("https://json-schema.org/keyword/items", items); diff --git a/src/keyword-error-message.test.js b/src/keyword-error-message.test.js index f51e197..5180b09 100644 --- a/src/keyword-error-message.test.js +++ b/src/keyword-error-message.test.js @@ -4,6 +4,10 @@ import { registerSchema } from "@hyperjump/json-schema/draft-2020-12"; import { unregisterSchema } from "@hyperjump/json-schema"; import { getSchemaDescription } from "./schema-descriptions.js"; import { Localization } from "./localization.js"; +import "@hyperjump/json-schema/draft-04"; +import "@hyperjump/json-schema/draft-06"; +import "@hyperjump/json-schema/draft-2019-09"; +import "@hyperjump/json-schema/draft-07"; /** * @import { OutputFormat} from "./index.d.ts" @@ -639,7 +643,7 @@ describe("Error messages", async () => { }]); }); - test("format: email", async () => { + test("format: email (draft-2020-12)", async () => { registerSchema({ $schema: "https://json-schema.org/draft/2020-12/schema", format: "email" @@ -666,6 +670,117 @@ describe("Error messages", async () => { ]); }); + test("format: email (draft-2019-09)", async () => { + registerSchema({ + $schema: "https://json-schema.org/draft/2019-09/schema", + format: "email" + }, schemaUri); + + const instance = "not-an-email"; + const output = { + valid: false, + errors: [ + { + absoluteKeywordLocation: "https://example.com/main#/format", + instanceLocation: "#" + } + ] + }; + + const result = await betterJsonSchemaErrors(output, schemaUri, instance); + expect(result.errors).to.eql([ + { + schemaLocation: "https://example.com/main#/format", + instanceLocation: "#", + message: localization.getFormatErrorMessage("email") + } + ]); + }); + + test("format: email (draft-07)", async () => { + registerSchema({ + $schema: "http://json-schema.org/draft-07/schema", + format: "email" + }, schemaUri); + + const instance = "not-an-email"; + const output = { + valid: false, + errors: [ + { + absoluteKeywordLocation: "https://example.com/main#/format", + instanceLocation: "#" + } + ] + }; + + const result = await betterJsonSchemaErrors(output, schemaUri, instance); + expect(result.errors).to.eql([ + { + schemaLocation: "https://example.com/main#/format", + instanceLocation: "#", + message: localization.getFormatErrorMessage("email") + } + ]); +}); + +test("format: email (draft-06)", async () => { + registerSchema({ + $schema: "http://json-schema.org/draft-06/schema", + format: "email" + }, schemaUri); + + const instance = "not-an-email"; + const output = { + valid: false, + errors: [ + { + absoluteKeywordLocation: "https://example.com/main#/format", + instanceLocation: "#" + } + ] + }; + + const result = await betterJsonSchemaErrors(output, schemaUri, instance); + + expect(result.errors).to.eql([ + { + schemaLocation: "https://example.com/main#/format", + instanceLocation: "#", + message: localization.getFormatErrorMessage("email") + } + ]); +}); + +test("format: email (draft-04)", async () => { + + registerSchema({ + $schema: "http://json-schema.org/draft-04/schema", + format: "email" + }, schemaUri); + + const instance = "not-an-email"; + const output = { + valid: false, + errors: [ + { + absoluteKeywordLocation: "https://example.com/main#/format", + instanceLocation: "#" + } + ] + }; + + const result = await betterJsonSchemaErrors(output, schemaUri, instance); + + expect(result.errors).to.eql([ + { + schemaLocation: "https://example.com/main#/format", + instanceLocation: "#", + message: localization.getFormatErrorMessage("email") + } + ]); +}); + test("pattern", async () => { registerSchema({ $schema: "https://json-schema.org/draft/2020-12/schema", diff --git a/src/normalization-handlers/format.js b/src/normalization-handlers/format.js new file mode 100644 index 0000000..4846783 --- /dev/null +++ b/src/normalization-handlers/format.js @@ -0,0 +1,12 @@ +/** + * @import { KeywordHandler } from "../index.d.ts" + */ + +/** @type KeywordHandler */ +const format = { +appliesTo() { + return true; + } +}; + +export default format; From 836980eb45e727191359ef1a1c9658ad68c9ea2c Mon Sep 17 00:00:00 2001 From: Diya Date: Thu, 27 Nov 2025 20:01:35 +0530 Subject: [PATCH 2/4] fix lint error --- src/error-handlers/format.js | 2 +- src/keyword-error-message.test.js | 137 +++++++++++++-------------- src/normalization-handlers/format.js | 6 +- 3 files changed, 72 insertions(+), 73 deletions(-) diff --git a/src/error-handlers/format.js b/src/error-handlers/format.js index e6f38d9..747685f 100644 --- a/src/error-handlers/format.js +++ b/src/error-handlers/format.js @@ -16,7 +16,7 @@ const format = async (normalizedErrors, instance, localization) => { "https://json-schema.org/keyword/draft-2019-09/format", "https://json-schema.org/keyword/draft-07/format", "https://json-schema.org/keyword/draft-06/format", - "https://json-schema.org/keyword/draft-04/format", + "https://json-schema.org/keyword/draft-04/format" ]; for (const formatKeyword of formats) { diff --git a/src/keyword-error-message.test.js b/src/keyword-error-message.test.js index 5180b09..3f93879 100644 --- a/src/keyword-error-message.test.js +++ b/src/keyword-error-message.test.js @@ -698,88 +698,87 @@ describe("Error messages", async () => { }); test("format: email (draft-07)", async () => { - registerSchema({ - $schema: "http://json-schema.org/draft-07/schema", - format: "email" - }, schemaUri); - - const instance = "not-an-email"; - const output = { - valid: false, - errors: [ + registerSchema({ + $schema: "http://json-schema.org/draft-07/schema", + format: "email" + }, schemaUri); + + const instance = "not-an-email"; + const output = { + valid: false, + errors: [ + { + absoluteKeywordLocation: "https://example.com/main#/format", + instanceLocation: "#" + } + ] + }; + + const result = await betterJsonSchemaErrors(output, schemaUri, instance); + expect(result.errors).to.eql([ { - absoluteKeywordLocation: "https://example.com/main#/format", - instanceLocation: "#" + schemaLocation: "https://example.com/main#/format", + instanceLocation: "#", + message: localization.getFormatErrorMessage("email") } - ] - }; + ]); + }); - const result = await betterJsonSchemaErrors(output, schemaUri, instance); - expect(result.errors).to.eql([ - { - schemaLocation: "https://example.com/main#/format", - instanceLocation: "#", - message: localization.getFormatErrorMessage("email") - } - ]); -}); + test("format: email (draft-06)", async () => { + registerSchema({ + $schema: "http://json-schema.org/draft-06/schema", + format: "email" + }, schemaUri); + + const instance = "not-an-email"; + const output = { + valid: false, + errors: [ + { + absoluteKeywordLocation: "https://example.com/main#/format", + instanceLocation: "#" + } + ] + }; -test("format: email (draft-06)", async () => { - registerSchema({ - $schema: "http://json-schema.org/draft-06/schema", - format: "email" - }, schemaUri); + const result = await betterJsonSchemaErrors(output, schemaUri, instance); - const instance = "not-an-email"; - const output = { - valid: false, - errors: [ + expect(result.errors).to.eql([ { - absoluteKeywordLocation: "https://example.com/main#/format", - instanceLocation: "#" + schemaLocation: "https://example.com/main#/format", + instanceLocation: "#", + message: localization.getFormatErrorMessage("email") } - ] - }; - - const result = await betterJsonSchemaErrors(output, schemaUri, instance); + ]); + }); - expect(result.errors).to.eql([ - { - schemaLocation: "https://example.com/main#/format", - instanceLocation: "#", - message: localization.getFormatErrorMessage("email") - } - ]); -}); + test("format: email (draft-04)", async () => { + registerSchema({ + $schema: "http://json-schema.org/draft-04/schema", + format: "email" + }, schemaUri); -test("format: email (draft-04)", async () => { + const instance = "not-an-email"; + const output = { + valid: false, + errors: [ + { + absoluteKeywordLocation: "https://example.com/main#/format", + instanceLocation: "#" + } + ] + }; - registerSchema({ - $schema: "http://json-schema.org/draft-04/schema", - format: "email" - }, schemaUri); + const result = await betterJsonSchemaErrors(output, schemaUri, instance); - const instance = "not-an-email"; - const output = { - valid: false, - errors: [ + expect(result.errors).to.eql([ { - absoluteKeywordLocation: "https://example.com/main#/format", - instanceLocation: "#" + schemaLocation: "https://example.com/main#/format", + instanceLocation: "#", + message: localization.getFormatErrorMessage("email") } - ] - }; - - const result = await betterJsonSchemaErrors(output, schemaUri, instance); - - expect(result.errors).to.eql([ - { - schemaLocation: "https://example.com/main#/format", - instanceLocation: "#", - message: localization.getFormatErrorMessage("email") - } - ]); -}); + ]); + }); test("pattern", async () => { registerSchema({ diff --git a/src/normalization-handlers/format.js b/src/normalization-handlers/format.js index 4846783..7035543 100644 --- a/src/normalization-handlers/format.js +++ b/src/normalization-handlers/format.js @@ -4,9 +4,9 @@ /** @type KeywordHandler */ const format = { -appliesTo() { - return true; - } + appliesTo() { + return true; + } }; export default format; From ef8f3f612c70926471a85e0d7b2c17d011139c11 Mon Sep 17 00:00:00 2001 From: Diya Date: Thu, 27 Nov 2025 20:43:09 +0530 Subject: [PATCH 3/4] removed repition in format test --- src/keyword-error-message.test.js | 124 +++--------------------------- 1 file changed, 12 insertions(+), 112 deletions(-) diff --git a/src/keyword-error-message.test.js b/src/keyword-error-message.test.js index 3f93879..669611b 100644 --- a/src/keyword-error-message.test.js +++ b/src/keyword-error-message.test.js @@ -643,36 +643,18 @@ describe("Error messages", async () => { }]); }); - test("format: email (draft-2020-12)", async () => { + const dialects = [ + { name: "draft-2020-12", schema: "https://json-schema.org/draft/2020-12/schema" }, + { name: "draft-2019-09", schema: "https://json-schema.org/draft/2019-09/schema" }, + { name: "draft-07", schema: "http://json-schema.org/draft-07/schema" }, + { name: "draft-06", schema: "http://json-schema.org/draft-06/schema" }, + { name: "draft-04", schema: "http://json-schema.org/draft-04/schema" } +]; + +for (const { name, schema } of dialects) { + test(`format: email (${name})`, async () => { registerSchema({ - $schema: "https://json-schema.org/draft/2020-12/schema", - format: "email" - }, schemaUri); - - const instance = "not-an-email"; - const output = { - valid: false, - errors: [ - { - absoluteKeywordLocation: "https://example.com/main#/format", - instanceLocation: "#" - } - ] - }; - - const result = await betterJsonSchemaErrors(output, schemaUri, instance); - expect(result.errors).to.eql([ - { - schemaLocation: "https://example.com/main#/format", - instanceLocation: "#", - message: localization.getFormatErrorMessage("email") - } - ]); - }); - - test("format: email (draft-2019-09)", async () => { - registerSchema({ - $schema: "https://json-schema.org/draft/2019-09/schema", + $schema: schema, format: "email" }, schemaUri); @@ -688,33 +670,7 @@ describe("Error messages", async () => { }; const result = await betterJsonSchemaErrors(output, schemaUri, instance); - expect(result.errors).to.eql([ - { - schemaLocation: "https://example.com/main#/format", - instanceLocation: "#", - message: localization.getFormatErrorMessage("email") - } - ]); - }); - - test("format: email (draft-07)", async () => { - registerSchema({ - $schema: "http://json-schema.org/draft-07/schema", - format: "email" - }, schemaUri); - - const instance = "not-an-email"; - const output = { - valid: false, - errors: [ - { - absoluteKeywordLocation: "https://example.com/main#/format", - instanceLocation: "#" - } - ] - }; - const result = await betterJsonSchemaErrors(output, schemaUri, instance); expect(result.errors).to.eql([ { schemaLocation: "https://example.com/main#/format", @@ -723,63 +679,7 @@ describe("Error messages", async () => { } ]); }); - - test("format: email (draft-06)", async () => { - registerSchema({ - $schema: "http://json-schema.org/draft-06/schema", - format: "email" - }, schemaUri); - - const instance = "not-an-email"; - const output = { - valid: false, - errors: [ - { - absoluteKeywordLocation: "https://example.com/main#/format", - instanceLocation: "#" - } - ] - }; - - const result = await betterJsonSchemaErrors(output, schemaUri, instance); - - expect(result.errors).to.eql([ - { - schemaLocation: "https://example.com/main#/format", - instanceLocation: "#", - message: localization.getFormatErrorMessage("email") - } - ]); - }); - - test("format: email (draft-04)", async () => { - registerSchema({ - $schema: "http://json-schema.org/draft-04/schema", - format: "email" - }, schemaUri); - - const instance = "not-an-email"; - const output = { - valid: false, - errors: [ - { - absoluteKeywordLocation: "https://example.com/main#/format", - instanceLocation: "#" - } - ] - }; - - const result = await betterJsonSchemaErrors(output, schemaUri, instance); - - expect(result.errors).to.eql([ - { - schemaLocation: "https://example.com/main#/format", - instanceLocation: "#", - message: localization.getFormatErrorMessage("email") - } - ]); - }); - +} test("pattern", async () => { registerSchema({ $schema: "https://json-schema.org/draft/2020-12/schema", From 56d2f40713994969241e2ddf94d9315a4ce7b50e Mon Sep 17 00:00:00 2001 From: Diya Date: Thu, 27 Nov 2025 20:45:12 +0530 Subject: [PATCH 4/4] fixed repetition and lint errors --- src/keyword-error-message.test.js | 66 +++++++++++++++---------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/keyword-error-message.test.js b/src/keyword-error-message.test.js index 669611b..4217ef1 100644 --- a/src/keyword-error-message.test.js +++ b/src/keyword-error-message.test.js @@ -644,42 +644,42 @@ describe("Error messages", async () => { }); const dialects = [ - { name: "draft-2020-12", schema: "https://json-schema.org/draft/2020-12/schema" }, - { name: "draft-2019-09", schema: "https://json-schema.org/draft/2019-09/schema" }, - { name: "draft-07", schema: "http://json-schema.org/draft-07/schema" }, - { name: "draft-06", schema: "http://json-schema.org/draft-06/schema" }, - { name: "draft-04", schema: "http://json-schema.org/draft-04/schema" } -]; - -for (const { name, schema } of dialects) { - test(`format: email (${name})`, async () => { - registerSchema({ - $schema: schema, - format: "email" - }, schemaUri); + { name: "draft-2020-12", schema: "https://json-schema.org/draft/2020-12/schema" }, + { name: "draft-2019-09", schema: "https://json-schema.org/draft/2019-09/schema" }, + { name: "draft-07", schema: "http://json-schema.org/draft-07/schema" }, + { name: "draft-06", schema: "http://json-schema.org/draft-06/schema" }, + { name: "draft-04", schema: "http://json-schema.org/draft-04/schema" } + ]; + + for (const { name, schema } of dialects) { + test(`format: email (${name})`, async () => { + registerSchema({ + $schema: schema, + format: "email" + }, schemaUri); + + const instance = "not-an-email"; + const output = { + valid: false, + errors: [ + { + absoluteKeywordLocation: "https://example.com/main#/format", + instanceLocation: "#" + } + ] + }; - const instance = "not-an-email"; - const output = { - valid: false, - errors: [ + const result = await betterJsonSchemaErrors(output, schemaUri, instance); + + expect(result.errors).to.eql([ { - absoluteKeywordLocation: "https://example.com/main#/format", - instanceLocation: "#" + schemaLocation: "https://example.com/main#/format", + instanceLocation: "#", + message: localization.getFormatErrorMessage("email") } - ] - }; - - const result = await betterJsonSchemaErrors(output, schemaUri, instance); - - expect(result.errors).to.eql([ - { - schemaLocation: "https://example.com/main#/format", - instanceLocation: "#", - message: localization.getFormatErrorMessage("email") - } - ]); - }); -} + ]); + }); + } test("pattern", async () => { registerSchema({ $schema: "https://json-schema.org/draft/2020-12/schema",