Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 0 additions & 56 deletions src/error-handlers/draft-04/maximum.js

This file was deleted.

56 changes: 0 additions & 56 deletions src/error-handlers/draft-04/minimum.js

This file was deleted.

32 changes: 0 additions & 32 deletions src/error-handlers/exclusiveMaximum.js

This file was deleted.

32 changes: 0 additions & 32 deletions src/error-handlers/exclusiveMinimum.js

This file was deleted.

79 changes: 70 additions & 9 deletions src/error-handlers/maximum.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ import * as Schema from "@hyperjump/browser";
import * as Instance from "@hyperjump/json-schema/instance/experimental";

/**
* @import { ErrorHandler, ErrorObject } from "../index.d.ts"
* @import { ErrorHandler } from "../index.d.ts"
*/

/** @type ErrorHandler */
const maximumErrorHandler = async (normalizedErrors, instance, localization) => {
/** @type ErrorObject[] */
const errors = [];
let lowestMaximum = Infinity;
let isExclusive = false;

/** @type string[] */
let schemaLocations = [];

for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/maximum"]) {
if (normalizedErrors["https://json-schema.org/keyword/maximum"][schemaLocation]) {
Expand All @@ -18,15 +21,73 @@ const maximumErrorHandler = async (normalizedErrors, instance, localization) =>

const keyword = await getSchema(schemaLocation);
const maximum = /** @type number */ (Schema.value(keyword));
if (maximum < lowestMaximum) {
lowestMaximum = maximum;
schemaLocations = [schemaLocation];
}
}

errors.push({
message: localization.getMaximumErrorMessage(maximum),
instanceLocation: Instance.uri(instance),
schemaLocations: [schemaLocation]
});
for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/exclusiveMaximum"]) {
if (normalizedErrors["https://json-schema.org/keyword/exclusiveMaximum"][schemaLocation]) {
continue;
}

const keyword = await getSchema(schemaLocation);
const exclusiveMaximum = /** @type number */ (Schema.value(keyword));
if (exclusiveMaximum < lowestMaximum) {
lowestMaximum = exclusiveMaximum;
isExclusive = true;
schemaLocations = [schemaLocation];
}
}

for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/draft-04/maximum"]) {
if (normalizedErrors["https://json-schema.org/keyword/draft-04/maximum"][schemaLocation]) {
continue;
}

const parentLocation = pointerPop(schemaLocation);
/** @type string */
let exclusiveLocation = "";
for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/draft-04/exclusiveMaximum"]) {
const exclusiveParentLocation = pointerPop(schemaLocation);
if (exclusiveParentLocation === parentLocation) {
const exclusiveNode = await getSchema(schemaLocation);
if (Schema.value(exclusiveNode)) {
exclusiveLocation = schemaLocation;
}
break;
}
}

const keywordNode = await getSchema(schemaLocation);
const maximum = /** @type number */ (Schema.value(keywordNode));

if (maximum < lowestMaximum) {
lowestMaximum = maximum;
isExclusive = !!exclusiveLocation;
schemaLocations = exclusiveLocation ? [schemaLocation, exclusiveLocation] : [schemaLocation];
}
}

return errors;
if (lowestMaximum === Infinity) {
return [];
} else if (isExclusive) {
return [{
message: localization.getExclusiveMaximumErrorMessage(lowestMaximum),
instanceLocation: Instance.uri(instance),
schemaLocations: schemaLocations
}];
} else {
return [{
message: localization.getMaximumErrorMessage(lowestMaximum),
instanceLocation: Instance.uri(instance),
schemaLocations: schemaLocations
}];
}
};

/** @type (pointer: string) => string */
const pointerPop = (pointer) => pointer.replace(/\/[^/]+$/, "");

export default maximumErrorHandler;
79 changes: 70 additions & 9 deletions src/error-handlers/minimum.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ import * as Schema from "@hyperjump/browser";
import * as Instance from "@hyperjump/json-schema/instance/experimental";

/**
* @import { ErrorHandler, ErrorObject } from "../index.d.ts"
* @import { ErrorHandler } from "../index.d.ts"
*/

/** @type ErrorHandler */
const minimumErrorHandler = async (normalizedErrors, instance, localization) => {
/** @type ErrorObject[] */
const errors = [];
let highestMinimum = -Infinity;
let isExclusive = false;
/** @type string[] */
let schemaLocations = [];

for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/minimum"]) {
if (normalizedErrors["https://json-schema.org/keyword/minimum"][schemaLocation]) {
Expand All @@ -19,14 +21,73 @@ const minimumErrorHandler = async (normalizedErrors, instance, localization) =>
const keyword = await getSchema(schemaLocation);
const minimum = /** @type number */ (Schema.value(keyword));

errors.push({
message: localization.getMinimumErrorMessage(minimum),
instanceLocation: Instance.uri(instance),
schemaLocations: [schemaLocation]
});
if (minimum > highestMinimum) {
highestMinimum = minimum;
schemaLocations = [schemaLocation];
}
}

for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/exclusiveMinimum"]) {
if (
normalizedErrors["https://json-schema.org/keyword/exclusiveMinimum"][schemaLocation]) {
continue;
}

const keyword = await getSchema(schemaLocation);
const exclusiveMinimum = /** @type number */ (Schema.value(keyword));

if (exclusiveMinimum > highestMinimum) {
highestMinimum = exclusiveMinimum;
isExclusive = true;
schemaLocations = [schemaLocation];
}
}
for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/draft-04/minimum"]) {
if (normalizedErrors["https://json-schema.org/keyword/draft-04/minimum"][schemaLocation]) {
continue;
}

const parentLocation = pointerPop(schemaLocation);

let exclusiveLocation = "";
for (const schemaLocation in normalizedErrors["https://json-schema.org/keyword/draft-04/exclusiveMinimum"]) {
const exclusiveParentLocation = pointerPop(schemaLocation);
if (exclusiveParentLocation === parentLocation) {
const exclusiveNode = await getSchema(schemaLocation);
if (Schema.value(exclusiveNode)) {
exclusiveLocation = schemaLocation;
}
break;
}
}

const keywordNode = await getSchema(schemaLocation);
const minimum = /** @type number */ (Schema.value(keywordNode));
if (minimum > highestMinimum) {
highestMinimum = minimum;
isExclusive = !!exclusiveLocation;
schemaLocations = exclusiveLocation ? [schemaLocation, exclusiveLocation] : [schemaLocation];
}
}

return errors;
if (highestMinimum === -Infinity) {
return [];
} else if (isExclusive) {
return [{
message: localization.getExclusiveMinimumErrorMessage(highestMinimum),
instanceLocation: Instance.uri(instance),
schemaLocations: schemaLocations
}];
} else {
return [{
message: localization.getMinimumErrorMessage(highestMinimum),
instanceLocation: Instance.uri(instance),
schemaLocations: schemaLocations
}];
}
};

/** @type (pointer: string) => string */
const pointerPop = (pointer) => pointer.replace(/\/[^/]+$/, "");

export default minimumErrorHandler;
Loading