forked from aws-powertools/powertools-lambda-typescript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalidate.ts
43 lines (36 loc) · 1.18 KB
/
validate.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import { search } from '@aws-lambda-powertools/jmespath';
import { Ajv, type ValidateFunction } from 'ajv';
import { SchemaValidationError } from './errors.js';
import type { ValidateParams } from './types.js';
export function validate<T = unknown>(params: ValidateParams): T {
const { payload, schema, envelope, formats, externalRefs, ajv } = params;
const ajvInstance = ajv || new Ajv({ allErrors: true });
if (formats) {
for (const key of Object.keys(formats)) {
ajvInstance.addFormat(key, formats[key]);
}
}
if (externalRefs) {
for (const refSchema of externalRefs) {
ajvInstance.addSchema(refSchema);
}
}
let validateFn: ValidateFunction;
try {
validateFn = ajvInstance.compile(schema);
} catch (error) {
throw new SchemaValidationError('Failed to compile schema', error);
}
const trimmedEnvelope = envelope?.trim();
const dataToValidate = trimmedEnvelope
? search(trimmedEnvelope, payload as Record<string, unknown>)
: payload;
const valid = validateFn(dataToValidate);
if (!valid) {
throw new SchemaValidationError(
'Schema validation failed',
validateFn.errors
);
}
return dataToValidate as T;
}