botbook/node_modules/json-schema-library/lib/features/allOf.ts
Rodrigo Rodriguez 6ae15fe3e5 Updated.
2024-09-04 13:13:15 -03:00

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 };