Skip to content

Commit 07e93ce

Browse files
committed
perf(validators): cache compiled AJV validators instead of recompiling each call
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.
1 parent 8f46915 commit 07e93ce

1 file changed

Lines changed: 11 additions & 2 deletions

File tree

packages/validators/src/index.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ export function createValidator() {
1717
return ajv;
1818
}
1919

20+
const _ajv = createValidator();
21+
const _compiledValidators = new Map<SchemaKind, ReturnType<typeof _ajv.compile>>();
22+
23+
function getCompiledValidator(kind: SchemaKind) {
24+
if (!_compiledValidators.has(kind)) {
25+
_compiledValidators.set(kind, _ajv.compile(schemas[kind]));
26+
}
27+
return _compiledValidators.get(kind)!;
28+
}
29+
2030
export function parseDocument(input: string, fileName = "document") {
2131
if (fileName.endsWith(".json")) {
2232
return JSON.parse(input) as unknown;
@@ -26,8 +36,7 @@ export function parseDocument(input: string, fileName = "document") {
2636
}
2737

2838
export function validate(kind: SchemaKind, data: unknown): ValidationResult {
29-
const ajv = createValidator();
30-
const validateDocument = ajv.compile(schemas[kind]);
39+
const validateDocument = getCompiledValidator(kind);
3140
const ok = validateDocument(data);
3241

3342
if (ok) {

0 commit comments

Comments
 (0)