Defer schema validation to improve test performance

Many modules export an `ajvCompiledJsonSchemaValidator(...)`, which
incurs the `ajv` schema compilation at module-import-time.
Many tests depend on these modules transitively, but don't exercise the
compiled schema - so, this compilation time is wasted.

On my machine, with an example test (airbrake/src/index.test.ts) I'm
seeing the following numbers (n=10):

Before: 6005.1ms
After: 5807.8ms
Benefit: 197.3ms (~3.3%)

Weirdly, the NodeJS profiler was saying that schema compilation was
taking ~2000ms, but that is likely due to the inaccuracy of the
sampling.

Signed-off-by: Mitchell Hentges <mhentges@spotify.com>
This commit is contained in:
Mitchell Hentges
2022-09-21 16:35:56 +02:00
parent c3936bd995
commit 6f3b8d0962
2 changed files with 9 additions and 1 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/catalog-model': patch
---
Defer `ajv` compilation of schema validators to improve module-import performance
+4 -1
View File
@@ -22,9 +22,12 @@ import { KindValidator } from './types';
// exported kind validators have the `KindValidator` signature which is
// different. So let's postpone that change until a later time.
export function ajvCompiledJsonSchemaValidator(schema: unknown): KindValidator {
const validator = entityKindSchemaValidator(schema);
let validator: undefined | ((data: unknown) => any);
return {
async check(data) {
if (!validator) {
validator = entityKindSchemaValidator(schema);
}
return validator(data) === data;
},
};