UNPKG

@hyperjump/json-schema

Version:

A JSON Schema validator with support for custom keywords, vocabularies, and dialects

52 lines (40 loc) 1.55 kB
import { zip, range } from "@hyperjump/pact"; import { FLAG } from "../index.js"; import { canonicalUri, Validation } from "../experimental.js"; import * as Instance from "../instance.js"; const id = "https://json-schema.org/keyword/unevaluatedItems"; const compile = async (schema, ast, parentSchema) => { return [canonicalUri(parentSchema), await Validation.compile(schema, ast)]; }; const interpret = ([schemaUrl, unevaluatedItems], instance, context) => { if (Instance.typeOf(instance) !== "array") { return true; } const keywordContext = { ...context, errors: [], annotations: [], outputFormat: FLAG }; const itemIndexes = Validation.collectEvaluatedItems(schemaUrl, instance, keywordContext, true); if (itemIndexes === false) { return true; } let isValid = true; for (const [item, index] of zip(Instance.iter(instance), range(0))) { if (!itemIndexes.has(index) && !Validation.interpret(unevaluatedItems, item, context)) { isValid = false; } } return isValid; }; const simpleApplicator = true; const collectEvaluatedItems = (keywordValue, instance, context) => { const itemIndexes = Validation.collectEvaluatedItems(keywordValue[0], instance, context, true); if (!itemIndexes) { return false; } const evaluatedIndexes = new Set(); for (let ndx = 0; ndx < Instance.length(instance); ndx++) { if (!itemIndexes.has(ndx)) { evaluatedIndexes.add(ndx); } } return evaluatedIndexes; }; export default { id, compile, interpret, simpleApplicator, collectEvaluatedItems };