json-schema-library
Version:
Customizable and hackable json-validator and json-schema utilities for traversal, data generation and validation
70 lines (69 loc) • 2.56 kB
JavaScript
import { hasProperty } from "./utils/hasProperty";
// import { getValue } from "./utils/getValue";
import { validateNode } from "./validateNode";
/**
* Returns true if an item is evaluated
*
* - Note that this check is partial, the remainder is done in unevaluatedItems
* - This function currently checks for schema that are not visible by simple validation
* - We could introduce this method as a new keyword-layer
*/
export function isPropertyEvaluated({ node, data, key, pointer, path }) {
var _a;
if (Array.isArray(node.schema.required) && !node.schema.required.find((prop) => hasProperty(data, prop))) {
return false;
}
if (node.schema.unevaluatedProperties === true || node.schema.additionalProperties === true) {
return true;
}
if (((_a = node.properties) === null || _a === void 0 ? void 0 : _a[key]) && node.properties[key].validate(data[key], pointer, path).valid) {
return true;
}
if (node.patternProperties && node.patternProperties.find((p) => p.pattern.test(key))) {
return true;
}
if (node.allOf) {
for (let i = 0; i < node.allOf.length; i += 1) {
if (isPropertyEvaluated({ node: node.allOf[i], data, key, pointer, path })) {
return true;
}
}
}
if (node.anyOf) {
for (let i = 0; i < node.anyOf.length; i += 1) {
if (isPropertyEvaluated({ node: node.anyOf[i], data, key, pointer, path })) {
return true;
}
}
}
if (node.oneOf) {
for (let i = 0; i < node.oneOf.length; i += 1) {
if (isPropertyEvaluated({ node: node.oneOf[i], data, key, pointer, path })) {
return true;
}
}
}
if (node.if) {
if (isPropertyEvaluated({ node: node.if, data, key, pointer, path })) {
return true;
}
const validIf = validateNode(node.if, data, pointer, path).length === 0;
if (validIf && node.then) {
if (isPropertyEvaluated({ node: node.then, data, key, pointer, path })) {
return true;
}
}
else if (!validIf && node.else) {
if (isPropertyEvaluated({ node: node.else, data, key, pointer, path })) {
return true;
}
}
}
const resolved = node.resolveRef({ pointer, path });
if (resolved !== node) {
if (isPropertyEvaluated({ node: resolved, data, key, pointer, path })) {
return true;
}
}
return false;
}