import {Instantiable} from '../di' import {FormRequest} from './FormRequest' import {ValidationError} from './Validator' import {ResponseObject, RouteHandler} from '../http/routing/Route' import {Request} from '../http/lifecycle/Request' /** * Builds a middleware function that validates a request's input against * the given form request class and registers the FormRequest class into * the request container. * * @example * ```typescript * Route.group(...).pre(formRequest(MyFormRequestClass)) * ``` * * @param formRequestClass */ export function formRequest(formRequestClass: Instantiable>): RouteHandler { return async function formRequestRouteHandler(request: Request): Promise { const formRequestInstance = > request.make(formRequestClass) try { await formRequestInstance.get() request.registerSingletonInstance>(formRequestClass, formRequestInstance) } catch (e: unknown) { if ( e instanceof ValidationError ) { return e.errors.toJSON() } throw e } } }