diff --git a/src/error-handlers/contains.js b/src/error-handlers/contains.js index 62243b4..20765b6 100644 --- a/src/error-handlers/contains.js +++ b/src/error-handlers/contains.js @@ -12,36 +12,43 @@ const containsErrorHandler = async (normalizedErrors, instance, localization) => /** @type ErrorObject[] */ const errors = []; - for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/contains"]) { - if (normalizedErrors["https://json-schema.org/keyword/contains"][schemaLocation] == true) { - continue; + const keywordUris = [ + "https://json-schema.org/keyword/contains", + "https://json-schema.org/keyword/draft-06/contains" + ]; + + for (const keywordUri of keywordUris) { + for (const schemaLocation in normalizedErrors[keywordUri]) { + if (normalizedErrors[keywordUri][schemaLocation] == true) { + continue; + } + + /** @type string[] */ + const schemaLocations = [schemaLocation]; + + /** @type ContainsRange */ + const range = {}; + + for (const minContainsLocation in normalizedErrors["https://json-schema.org/keyword/minContains"]) { + const minContainsNode = await getSchema(minContainsLocation); + const minContains = /** @type number */ (Schema.value(minContainsNode)); + range.minContains = Math.max(range.minContains ?? -1, minContains); + schemaLocations.push(minContainsLocation); + } + + for (const maxContainsLocation in normalizedErrors["https://json-schema.org/keyword/maxContains"]) { + const maxContainsNode = await getSchema(maxContainsLocation); + const maxContains = /** @type number */ (Schema.value(maxContainsNode)); + range.maxContains = Math.min(range.maxContains ?? Number.MAX_VALUE, maxContains); + schemaLocations.push(maxContainsLocation); + } + + errors.push({ + message: localization.getContainsErrorMessage(range), + instanceLocation: Instance.uri(instance), + schemaLocations: schemaLocations + }); } - - /** @type string[] */ - const schemaLocations = [schemaLocation]; - - /** @type ContainsRange */ - const range = {}; - - for (const minContainsLocation in normalizedErrors["https://json-schema.org/keyword/minContains"]) { - const minContainsNode = await getSchema(minContainsLocation); - const minContains = /** @type number */ (Schema.value(minContainsNode)); - range.minContains = Math.max(range.minContains ?? -1, minContains); - schemaLocations.push(minContainsLocation); - } - - for (const maxContainsLocation in normalizedErrors["https://json-schema.org/keyword/maxContains"]) { - const maxContainsNode = await getSchema(maxContainsLocation); - const maxContains = /** @type number */ (Schema.value(maxContainsNode)); - range.maxContains = Math.min(range.maxContains ?? Number.MAX_VALUE, maxContains); - schemaLocations.push(maxContainsLocation); - } - - errors.push({ - message: localization.getContainsErrorMessage(range), - instanceLocation: Instance.uri(instance), - schemaLocations: schemaLocations - }); } return errors; diff --git a/src/index.js b/src/index.js index 8017fe1..f3bafd3 100644 --- a/src/index.js +++ b/src/index.js @@ -7,6 +7,7 @@ import allOfNormalizationHandler from "./normalization-handlers/allOf.js"; import anyOfNormalizationHandler from "./normalization-handlers/anyOf.js"; import constNormalizationHandler from "./normalization-handlers/const.js"; import containsNormalizationHandler from "./normalization-handlers/contains.js"; +import containsDraft06NormalizationHandler from "./normalization-handlers/draft-06/contains.js"; import definitionsNormalizationHandler from "./normalization-handlers/definitions.js"; import dependentRequiredNormalizationHandler from "./normalization-handlers/dependentRequired.js"; import dependentSchemasNormalizationHandler from "./normalization-handlers/dependentSchemas.js"; @@ -79,6 +80,7 @@ setNormalizationHandler("https://json-schema.org/keyword/allOf", allOfNormalizat setNormalizationHandler("https://json-schema.org/keyword/anyOf", anyOfNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/const", constNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/contains", containsNormalizationHandler); +setNormalizationHandler("https://json-schema.org/keyword/draft-06/contains", containsDraft06NormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/definitions", definitionsNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/dependentRequired", dependentRequiredNormalizationHandler); setNormalizationHandler("https://json-schema.org/keyword/dependentSchemas", dependentSchemasNormalizationHandler); diff --git a/src/normalization-handlers/draft-06/contains.js b/src/normalization-handlers/draft-06/contains.js new file mode 100644 index 0000000..60d53f0 --- /dev/null +++ b/src/normalization-handlers/draft-06/contains.js @@ -0,0 +1,26 @@ +import * as Instance from "@hyperjump/json-schema/instance/experimental"; +import { evaluateSchema } from "../../json-schema-errors.js"; + +/** + * @import { NormalizationHandler, NormalizedOutput } from "../../index.d.ts" + */ + +/** @type NormalizationHandler */ +const containsDraft06NormalizationHandler = { + evaluate(contains, instance, context) { + /** @type NormalizedOutput[] */ + const output = []; + + if (Instance.typeOf(instance) !== "array") { + return output; + } + + for (const item of Instance.iter(instance)) { + output.push(evaluateSchema(contains, item, context)); + } + + return output; + } +}; + +export default containsDraft06NormalizationHandler;