-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathsetConstraints.ts
36 lines (35 loc) · 1.27 KB
/
setConstraints.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
import { APISchema, ValidatorLoader } from '@vulcan/core';
import { chain } from 'lodash';
import { SchemaParserMiddleware } from './middleware';
export const setConstraints =
(loader: ValidatorLoader): SchemaParserMiddleware =>
async (rawSchema, next) => {
await next();
const schema = rawSchema as APISchema;
for (const request of schema.request || []) {
request.constraints = chain(request.validators || [])
.map((validator) => ({
validator: loader.getLoader(validator.name),
args: validator.args,
}))
.filter(({ validator }) => !!validator.getConstraints)
.flatMap(({ validator, args }) =>
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
validator.getConstraints!(args)
)
// Group by constraint class (RequiredConstraint, MinValueConstraint ....)
.groupBy((constraint) => constraint.constructor.name)
.values()
.map((constraints) => {
let mergeConstraint = constraints[0];
constraints
.slice(1)
.forEach(
(constraint) =>
(mergeConstraint = mergeConstraint.compose(constraint))
);
return mergeConstraint;
})
.value();
}
};