perf(validators): cache compiled AJV validators instead of recompiling each call (#94)

validate() was creating a new AJV instance and recompiling the schema on every
invocation. Schema compilation is expensive (JSON Schema parsing, format setup).
Cache the compiled validator per SchemaKind so compilation happens once.
This commit is contained in:
forgou37 2026-07-12 18:09:06 +03:00 committed by GitHub
parent 506c001151
commit 9346d02a39
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -17,6 +17,16 @@ export function createValidator() {
return ajv;
}
const _ajv = createValidator();
const _compiledValidators = new Map<SchemaKind, ReturnType<typeof _ajv.compile>>();
function getCompiledValidator(kind: SchemaKind) {
if (!_compiledValidators.has(kind)) {
_compiledValidators.set(kind, _ajv.compile(schemas[kind]));
}
return _compiledValidators.get(kind)!;
}
export function parseDocument(input: string, fileName = "document") {
if (fileName.toLowerCase().endsWith(".json")) {
return JSON.parse(input) as unknown;
@ -26,8 +36,7 @@ export function parseDocument(input: string, fileName = "document") {
}
export function validate(kind: SchemaKind, data: unknown): ValidationResult {
const ajv = createValidator();
const validateDocument = ajv.compile(schemas[kind]);
const validateDocument = getCompiledValidator(kind);
const ok = validateDocument(data);
if (ok) {