@sjsf/ajv8-validator
Version:
The ajv-8 based validator for svelte-jsonschema-form
34 lines (33 loc) • 1.39 kB
JavaScript
import { memoize, weakMemoize } from "@sjsf/form/lib/memoize";
import { ID_KEY, prefixSchemaRefs, ROOT_SCHEMA_PREFIX } from "@sjsf/form/core";
export function createSchemaCompiler(ajv, _async, validatorsCache = new WeakMap()) {
let rootSchemaId = "";
let usePrefixSchemaRefs = false;
const compile = memoize(validatorsCache, (schema) => {
let ajvSchema = schema;
if (usePrefixSchemaRefs) {
ajvSchema = prefixSchemaRefs(schema, rootSchemaId);
delete ajvSchema[ID_KEY];
}
return ajv.compile(ajvSchema);
});
return (schema, rootSchema) => {
rootSchemaId = rootSchema[ID_KEY] ?? ROOT_SCHEMA_PREFIX;
let ajvSchema = ajv.getSchema(rootSchemaId)?.schema;
if (ajvSchema !== undefined && ajvSchema !== rootSchema) {
ajv.removeSchema(rootSchemaId);
validatorsCache.delete(schema);
ajvSchema = undefined;
}
if (ajvSchema === undefined) {
ajv.addSchema(rootSchema, rootSchemaId);
}
usePrefixSchemaRefs = schema !== rootSchema;
return compile(schema);
};
}
export function createFieldSchemaCompiler(ajv, async) {
const validatorsCache = new WeakMap();
const compile = weakMemoize(validatorsCache, (schema) => ajv.compile({ ...schema, $async: async }));
return (config) => compile(config.schema);
}