2023-04-27 23:18:48 +02:00
|
|
|
import { eq } from 'lodash/fp';
|
2021-11-05 12:19:49 +01:00
|
|
|
|
2023-04-27 23:18:48 +02:00
|
|
|
interface Options {
|
|
|
|
name: string;
|
|
|
|
validator?(config: unknown): void;
|
|
|
|
handler(...args: any[]): any;
|
|
|
|
}
|
|
|
|
|
|
|
|
const createPolicy = (options: Options) => {
|
2021-11-05 12:19:49 +01:00
|
|
|
const { name = 'unnamed', validator, handler } = options;
|
|
|
|
|
2023-04-27 23:18:48 +02:00
|
|
|
const wrappedValidator = (config: unknown) => {
|
2020-06-19 15:02:10 +02:00
|
|
|
if (validator) {
|
2021-11-05 12:19:49 +01:00
|
|
|
try {
|
|
|
|
validator(config);
|
|
|
|
} catch (e) {
|
|
|
|
throw new Error(`Invalid config passed to "${name}" policy.`);
|
|
|
|
}
|
2020-06-19 15:02:10 +02:00
|
|
|
}
|
2021-11-05 12:19:49 +01:00
|
|
|
};
|
2020-06-19 15:02:10 +02:00
|
|
|
|
2021-11-05 12:19:49 +01:00
|
|
|
return {
|
|
|
|
name,
|
|
|
|
validator: wrappedValidator,
|
|
|
|
handler,
|
2020-06-19 15:02:10 +02:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2023-04-27 23:18:48 +02:00
|
|
|
const createPolicyContext = (type: string, ctx: object) => {
|
2021-09-24 09:35:25 +02:00
|
|
|
return Object.assign(
|
|
|
|
{
|
|
|
|
is: eq(type),
|
|
|
|
get type() {
|
|
|
|
return type;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ctx
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2024-03-24 18:01:45 +01:00
|
|
|
export { createPolicy, createPolicyContext };
|