UNPKG

json-schema-library

Version:

Customizable and hackable json-validator and json-schema utilities for traversal, data generation and validation

61 lines (60 loc) 2.13 kB
/** * @draft-04 */ import { mergeSchema } from "../mergeSchema"; /** * returns merged schema of all valid anyOf subschemas for the given input data. * Does not merge with rest input schema. * * @returns merged anyOf subschemas which are valid to the given input data. */ export function mergeValidAnyOfSchema(node, data) { const { draft, schema } = node; if (!Array.isArray(schema.anyOf) || schema.anyOf.length === 0) { return; } let resolvedSchema; schema.anyOf.forEach((anySchema) => { const anyNode = draft.resolveRef(node.next(anySchema)); if (draft.validate(anyNode, data).length === 0) { resolvedSchema = resolvedSchema ? mergeSchema(resolvedSchema, anyNode.schema) : anyNode.schema; } }); if (resolvedSchema) { return node.next(resolvedSchema); } } /** * @unused this function is only exposed via draft and not used otherwise * @returns extended input schema with valid anyOf subschemas or JsonError if * no anyOf schema matches input data */ export function resolveAnyOf(node, data) { const { anyOf } = node.schema; if (!Array.isArray(anyOf) || anyOf.length === 0) { return node; } const resolvedNode = mergeValidAnyOfSchema(node, data); if (resolvedNode) { const { pointer, schema } = node; return node.draft.errors.anyOfError({ pointer, schema, value: data, anyOf: JSON.stringify(anyOf) }); } return node.merge(resolvedNode.schema, "anyOf"); } /** * validate anyOf definition for given input data */ export const validateAnyOf = (node, value) => { const { draft, schema, pointer } = node; if (!Array.isArray(schema.anyOf) || schema.anyOf.length === 0) { return undefined; } // console.log("validate any of", pointer, value); for (let i = 0; i < schema.anyOf.length; i += 1) { const nextNode = draft.resolveRef(node.next(schema.anyOf[i])); if (draft.validate(nextNode, value).length === 0) { return undefined; } } return draft.errors.anyOfError({ pointer, schema, value, anyOf: schema.anyOf }); };