@furystack/rest-service
Version:
Repository implementation for FuryStack
47 lines • 1.76 kB
JavaScript
import { SchemaValidator } from './schema-validator/schema-validator.js';
export const Validate = (validationOptions) => (action) => {
const schema = { ...validationOptions.schema };
Object.values(schema.definitions).forEach((definition) => {
if (definition.required && definition.required.includes('result')) {
definition.required = definition.required.filter((value) => value !== 'result');
}
definition.additionalProperties = true;
if (definition.properties?.headers) {
definition.properties.headers.additionalProperties = true;
}
});
const validator = new SchemaValidator(schema, { coerceTypes: true, strict: false });
const wrapped = async (args) => {
const anyArgs = args;
let body;
const { headers } = anyArgs;
const query = anyArgs.getQuery?.();
const url = anyArgs.getUrlParams?.();
try {
body = await anyArgs.getBody?.();
}
catch (error) {
// ignore
}
validator.isValid({
...(query ? { query } : {}),
...(body ? { body } : {}),
...(url ? { url } : {}),
...(headers ? { headers } : {}),
}, { schemaName: validationOptions.schemaName });
// @ts-expect-error
return await action({
request: args.request,
response: args.response,
injector: args.injector,
headers,
getQuery: () => query,
getUrlParams: () => url,
getBody: () => Promise.resolve(body),
});
};
wrapped.schema = schema;
wrapped.schemaName = validationOptions.schemaName;
return wrapped;
};
//# sourceMappingURL=validate.js.map