diff --git a/package.json b/package.json index d49c9f1..cfce3f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@extollo/lib", - "version": "0.9.23", + "version": "0.9.24", "description": "The framework library that lifts up your code.", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/http/routing/Middleware.ts b/src/http/routing/Middleware.ts index b0ed7e3..0ad6ae2 100644 --- a/src/http/routing/Middleware.ts +++ b/src/http/routing/Middleware.ts @@ -2,6 +2,7 @@ import {Request} from '../lifecycle/Request' import {ResponseObject} from './Route' import {Container} from '../../di' import {CanonicalItemClass} from '../../support/CanonicalReceiver' +import {Awaitable, Either, Left, left, Right, right} from '../../util' /** * Base class representing a middleware handler that can be applied to routes. @@ -31,3 +32,26 @@ export abstract class Middleware extends CanonicalItemClass { */ public abstract apply(): ResponseObject } + +/** + * A type of Middleware that produces a parameter that is passed to later handlers. + * Can be used to do common look-ups, &c before routes. + */ +export abstract class ParameterMiddleware extends Middleware { + /** Look up the value. */ + public abstract handle(): Awaitable> + + apply(): ResponseObject { + return this.handle() + } + + /** Alias for an error response return. */ + left(what: T): Left { + return left(what) + } + + /** Alias for a good value return. */ + right(what: T): Right { + return right(what) + } +} diff --git a/src/http/routing/Route.ts b/src/http/routing/Route.ts index d9ab49d..11d7dc2 100644 --- a/src/http/routing/Route.ts +++ b/src/http/routing/Route.ts @@ -1,8 +1,8 @@ -import {Collection, Either, ErrorWithContext, Maybe, Pipeline, PrefixTypeArray, right} from '../../util' +import {Awaitable, Collection, Either, ErrorWithContext, Maybe, Pipeline, PrefixTypeArray, right} from '../../util' import {ResponseFactory} from '../response/ResponseFactory' import {HTTPMethod, Request} from '../lifecycle/Request' import {constructable, Constructable, Container, Instantiable, isInstantiableOf, TypedDependencyKey} from '../../di' -import {Middleware} from './Middleware' +import {Middleware, ParameterMiddleware} from './Middleware' import {Valid, Validator, ValidatorFactory} from '../../validation/Validator' import {validateMiddleware} from '../../validation/middleware' import {RouteGroup} from './RouteGroup' @@ -20,7 +20,7 @@ export type ResponseObject = ResponseFactory | string | number | void | any | Pr */ export type ResolvedRouteHandler = (request: Request) => ResponseObject -export type ParameterProvidingMiddleware = (request: Request) => Either +export type ParameterProvidingMiddleware = (request: Request) => Awaitable> export interface HandledRoute { handler: Constructable<(...x: THandlerParams) => TReturn> @@ -311,7 +311,7 @@ export class Route( - handler: ParameterProvidingMiddleware, + handler: ParameterProvidingMiddleware | Instantiable>, ): Route> { const route = new Route>( this.method, @@ -319,7 +319,12 @@ export class Route req.make>(handler).handle()) + } + + route.parameters.push(handler as ParameterProvidingMiddleware) return route }