73 lines
2.3 KiB
TypeScript
73 lines
2.3 KiB
TypeScript
/**
|
|
* @draft-04
|
|
*/
|
|
import { JsonSchema, JsonValidator, JsonError } from "../types";
|
|
import { Draft } from "../draft";
|
|
import { mergeSchema } from "../mergeSchema";
|
|
import { omit } from "../utils/omit";
|
|
import copy from "../utils/copy";
|
|
import { resolveIfSchema } from "./if";
|
|
|
|
/**
|
|
* resolves schema
|
|
* when complete this will have much duplication to step.object etc
|
|
*/
|
|
export function resolveSchema(draft: Draft, schemaToResolve: JsonSchema, data: unknown): JsonSchema {
|
|
const schema = { ...(draft.resolveRef(schemaToResolve) ?? {}) };
|
|
const ifSchema = resolveIfSchema(draft, schema, data);
|
|
if (ifSchema) {
|
|
return ifSchema;
|
|
}
|
|
return omit(schema, "if", "then", "else");
|
|
}
|
|
|
|
export function resolveAllOf(
|
|
draft: Draft,
|
|
data: any,
|
|
schema: JsonSchema = draft.rootSchema
|
|
): JsonSchema | JsonError {
|
|
let mergedSchema = copy(schema);
|
|
for (let i = 0; i < schema.allOf.length; i += 1) {
|
|
// @todo introduce draft.resolveSchema to iteratively resolve
|
|
const allOfSchema = resolveSchema(draft, schema.allOf[i], data);
|
|
mergedSchema = mergeSchema(mergedSchema, allOfSchema);
|
|
}
|
|
delete mergedSchema.allOf;
|
|
return mergedSchema;
|
|
}
|
|
|
|
/**
|
|
* @attention: subschemas have to be resolved upfront (e.g. if-else that do not apply)
|
|
* Merge all allOf sub schema into a single schema. Returns undefined for
|
|
* missing allOf definition.
|
|
*
|
|
* @returns json schema defined by allOf or undefined
|
|
*/
|
|
export function mergeAllOfSchema(draft: Draft, schema: JsonSchema): JsonSchema | undefined {
|
|
const { allOf } = schema;
|
|
if (!Array.isArray(allOf) || allOf.length === 0) {
|
|
return;
|
|
}
|
|
let resolvedSchema: JsonSchema = {};
|
|
allOf.forEach((subschema) => {
|
|
resolvedSchema = mergeSchema(resolvedSchema, draft.resolveRef(subschema));
|
|
});
|
|
return resolvedSchema;
|
|
}
|
|
|
|
/**
|
|
* validate allOf definition for given input data
|
|
*/
|
|
const validateAllOf: JsonValidator = (draft, schema, value, pointer) => {
|
|
const { allOf } = schema;
|
|
if (!Array.isArray(allOf) || allOf.length === 0) {
|
|
return;
|
|
}
|
|
const errors: JsonError[] = [];
|
|
schema.allOf.forEach((subSchema: JsonSchema) => {
|
|
errors.push(...draft.validate(value, subSchema, pointer));
|
|
});
|
|
return errors;
|
|
};
|
|
|
|
export { validateAllOf };
|