Skip to content

Commit 2836429

Browse files
committed
Fix draft-06 contains normalization output
1 parent 97be1f3 commit 2836429

4 files changed

Lines changed: 68 additions & 31 deletions

File tree

src/error-handlers/contains.js

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,43 @@ const containsErrorHandler = async (normalizedErrors, instance, localization) =>
1212
/** @type ErrorObject[] */
1313
const errors = [];
1414

15-
for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/contains"]) {
16-
if (normalizedErrors["https://json-schema.org/keyword/contains"][schemaLocation] == true) {
17-
continue;
15+
const keywordUris = [
16+
"https://json-schema.org/keyword/contains",
17+
"https://json-schema.org/keyword/draft-06/contains"
18+
];
19+
20+
for (const keywordUri of keywordUris) {
21+
for (const schemaLocation in normalizedErrors[keywordUri]) {
22+
if (normalizedErrors[keywordUri][schemaLocation] == true) {
23+
continue;
24+
}
25+
26+
/** @type string[] */
27+
const schemaLocations = [schemaLocation];
28+
29+
/** @type ContainsRange */
30+
const range = {};
31+
32+
for (const minContainsLocation in normalizedErrors["https://json-schema.org/keyword/minContains"]) {
33+
const minContainsNode = await getSchema(minContainsLocation);
34+
const minContains = /** @type number */ (Schema.value(minContainsNode));
35+
range.minContains = Math.max(range.minContains ?? -1, minContains);
36+
schemaLocations.push(minContainsLocation);
37+
}
38+
39+
for (const maxContainsLocation in normalizedErrors["https://json-schema.org/keyword/maxContains"]) {
40+
const maxContainsNode = await getSchema(maxContainsLocation);
41+
const maxContains = /** @type number */ (Schema.value(maxContainsNode));
42+
range.maxContains = Math.min(range.maxContains ?? Number.MAX_VALUE, maxContains);
43+
schemaLocations.push(maxContainsLocation);
44+
}
45+
46+
errors.push({
47+
message: localization.getContainsErrorMessage(range),
48+
instanceLocation: Instance.uri(instance),
49+
schemaLocations: schemaLocations
50+
});
1851
}
19-
20-
/** @type string[] */
21-
const schemaLocations = [schemaLocation];
22-
23-
/** @type ContainsRange */
24-
const range = {};
25-
26-
for (const minContainsLocation in normalizedErrors["https://json-schema.org/keyword/minContains"]) {
27-
const minContainsNode = await getSchema(minContainsLocation);
28-
const minContains = /** @type number */ (Schema.value(minContainsNode));
29-
range.minContains = Math.max(range.minContains ?? -1, minContains);
30-
schemaLocations.push(minContainsLocation);
31-
}
32-
33-
for (const maxContainsLocation in normalizedErrors["https://json-schema.org/keyword/maxContains"]) {
34-
const maxContainsNode = await getSchema(maxContainsLocation);
35-
const maxContains = /** @type number */ (Schema.value(maxContainsNode));
36-
range.maxContains = Math.min(range.maxContains ?? Number.MAX_VALUE, maxContains);
37-
schemaLocations.push(maxContainsLocation);
38-
}
39-
40-
errors.push({
41-
message: localization.getContainsErrorMessage(range),
42-
instanceLocation: Instance.uri(instance),
43-
schemaLocations: schemaLocations
44-
});
4552
}
4653

4754
return errors;

src/hyperjump-json-schema.test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
validate
88
} from "@hyperjump/json-schema/draft-2020-12";
99
import "@hyperjump/json-schema/draft-2019-09";
10+
import "@hyperjump/json-schema/draft-07";
11+
import "@hyperjump/json-schema/draft-06";
1012
import "@hyperjump/json-schema/formats";
1113
import { BASIC } from "@hyperjump/json-schema/experimental";
1214
import { jsonSchemaErrors } from "../src/index.js";
@@ -182,6 +184,6 @@ const getMessage = await (async function () {
182184

183185
runTests("https://json-schema.org/draft/2020-12/schema", 2020);
184186
runTests("https://json-schema.org/draft/2019-09/schema", 2019);
185-
// runTests("http://json-schema.org/draft-07/schema", 7);
186-
// runTests("http://json-schema.org/draft-06/schema", 6);
187+
runTests("http://json-schema.org/draft-07/schema", 7);
188+
runTests("http://json-schema.org/draft-06/schema", 6);
187189
// runTests("http://json-schema.org/draft-04/schema", 4);

src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import allOfNormalizationHandler from "./normalization-handlers/allOf.js";
77
import anyOfNormalizationHandler from "./normalization-handlers/anyOf.js";
88
import constNormalizationHandler from "./normalization-handlers/const.js";
99
import containsNormalizationHandler from "./normalization-handlers/contains.js";
10+
import containsDraft06NormalizationHandler from "./normalization-handlers/draft-06/contains.js";
1011
import definitionsNormalizationHandler from "./normalization-handlers/definitions.js";
1112
import dependentRequiredNormalizationHandler from "./normalization-handlers/dependentRequired.js";
1213
import dependentSchemasNormalizationHandler from "./normalization-handlers/dependentSchemas.js";
@@ -79,6 +80,7 @@ setNormalizationHandler("https://json-schema.org/keyword/allOf", allOfNormalizat
7980
setNormalizationHandler("https://json-schema.org/keyword/anyOf", anyOfNormalizationHandler);
8081
setNormalizationHandler("https://json-schema.org/keyword/const", constNormalizationHandler);
8182
setNormalizationHandler("https://json-schema.org/keyword/contains", containsNormalizationHandler);
83+
setNormalizationHandler("https://json-schema.org/keyword/draft-06/contains", containsDraft06NormalizationHandler);
8284
setNormalizationHandler("https://json-schema.org/keyword/definitions", definitionsNormalizationHandler);
8385
setNormalizationHandler("https://json-schema.org/keyword/dependentRequired", dependentRequiredNormalizationHandler);
8486
setNormalizationHandler("https://json-schema.org/keyword/dependentSchemas", dependentSchemasNormalizationHandler);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import * as Instance from "@hyperjump/json-schema/instance/experimental";
2+
import { evaluateSchema } from "../../json-schema-errors.js";
3+
4+
/**
5+
* @import { NormalizationHandler, NormalizedOutput } from "../../index.d.ts"
6+
*/
7+
8+
/** @type NormalizationHandler<string> */
9+
const containsDraft06NormalizationHandler = {
10+
evaluate(contains, instance, context) {
11+
/** @type NormalizedOutput[] */
12+
const output = [];
13+
14+
if (Instance.typeOf(instance) !== "array") {
15+
return output;
16+
}
17+
18+
for (const item of Instance.iter(instance)) {
19+
output.push(evaluateSchema(contains, item, context));
20+
}
21+
22+
return output;
23+
}
24+
};
25+
26+
export default containsDraft06NormalizationHandler;

0 commit comments

Comments
 (0)