82 lines
3 KiB
JavaScript
82 lines
3 KiB
JavaScript
![]() |
import getTypeOf from "../getTypeOf";
|
||
|
import { mergeSchema } from "../mergeSchema";
|
||
|
import { uniqueItems } from "../utils/uniqueItems";
|
||
|
import { isObject } from "../utils/isObject";
|
||
|
/**
|
||
|
* returns dependencies as an object json schema. does not merge with input
|
||
|
* json schema. you probably will need to do so to correctly resolve
|
||
|
* references.
|
||
|
*
|
||
|
* @returns merged json schema defined by dependencies or undefined
|
||
|
*/
|
||
|
export function resolveDependencies(draft, schema, data) {
|
||
|
const { dependencies } = schema;
|
||
|
if (!isObject(dependencies) || !isObject(data)) {
|
||
|
return;
|
||
|
}
|
||
|
let updated = false;
|
||
|
let resolvedSchema = { required: [] };
|
||
|
Object.keys(dependencies).forEach((prop) => {
|
||
|
var _a, _b;
|
||
|
if (data[prop] == null &&
|
||
|
!(((_a = schema.required) === null || _a === void 0 ? void 0 : _a.includes(prop)) || ((_b = resolvedSchema.required) === null || _b === void 0 ? void 0 : _b.includes(prop)))) {
|
||
|
return;
|
||
|
}
|
||
|
const dependency = dependencies[prop];
|
||
|
// dependency array
|
||
|
if (Array.isArray(dependency)) {
|
||
|
updated = true;
|
||
|
resolvedSchema.required.push(...dependency);
|
||
|
return;
|
||
|
}
|
||
|
// dependency schema
|
||
|
if (isObject(dependency)) {
|
||
|
updated = true;
|
||
|
resolvedSchema = mergeSchema(resolvedSchema, draft.resolveRef(dependency));
|
||
|
return;
|
||
|
}
|
||
|
});
|
||
|
if (updated) {
|
||
|
resolvedSchema.required = uniqueItems(resolvedSchema.required);
|
||
|
return resolvedSchema;
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* validate dependencies definition for given input data
|
||
|
*/
|
||
|
const validateDependencies = (draft, schema, value, pointer) => {
|
||
|
if (getTypeOf(schema.dependencies) !== "object") {
|
||
|
return undefined;
|
||
|
}
|
||
|
const errors = [];
|
||
|
Object.keys(value).forEach((property) => {
|
||
|
if (schema.dependencies[property] === undefined) {
|
||
|
return;
|
||
|
}
|
||
|
// @draft >= 6 boolean schema
|
||
|
if (schema.dependencies[property] === true) {
|
||
|
return;
|
||
|
}
|
||
|
if (schema.dependencies[property] === false) {
|
||
|
errors.push(draft.errors.missingDependencyError({ pointer, schema, value }));
|
||
|
return;
|
||
|
}
|
||
|
let dependencyErrors;
|
||
|
const type = getTypeOf(schema.dependencies[property]);
|
||
|
if (type === "array") {
|
||
|
dependencyErrors = schema.dependencies[property]
|
||
|
.filter((dependency) => value[dependency] === undefined)
|
||
|
.map((missingProperty) => draft.errors.missingDependencyError({ missingProperty, pointer, schema, value }));
|
||
|
}
|
||
|
else if (type === "object") {
|
||
|
dependencyErrors = draft.validate(value, schema.dependencies[property], pointer);
|
||
|
}
|
||
|
else {
|
||
|
throw new Error(`Invalid dependency definition for ${pointer}/${property}. Must be string[] or schema`);
|
||
|
}
|
||
|
errors.push(...dependencyErrors);
|
||
|
});
|
||
|
return errors.length > 0 ? errors : undefined;
|
||
|
};
|
||
|
export { validateDependencies };
|