diff --git a/src/HttpKernel.ts b/src/HttpKernel.ts index ae8db14..8925aff 100644 --- a/src/HttpKernel.ts +++ b/src/HttpKernel.ts @@ -2,14 +2,13 @@ import { IContext, IHandler, IHttpKernel, + IHttpKernelConfig, IInternalRoute, IMiddleware, IRouteBuilder, - IRouteBuilderFactory, IRouteDefinition, } from './Interfaces/mod.ts'; import { RouteBuilder } from './RouteBuilder.ts'; -import { ResponseDecorator } from './Types/mod.ts'; import { parseQuery } from './Utils/mod.ts'; /** @@ -21,6 +20,7 @@ import { parseQuery } from './Utils/mod.ts'; */ export class HttpKernel implements IHttpKernel { + private cfg: IHttpKernelConfig; /** * The list of internally registered routes, each with method, matcher, middleware, and handler. */ @@ -34,11 +34,16 @@ export class HttpKernel * @param routeBuilderFactory - Optional factory for creating route builders. Defaults to using `RouteBuilder`. */ public constructor( - private readonly decorateResponse: ResponseDecorator = (res) => res, - private readonly routeBuilderFactory: IRouteBuilderFactory = - RouteBuilder, + config?: Partial>, ) { + this.cfg = { + decorateResponse: (res) => res, + routeBuilderFactory: RouteBuilder, + ...config, + } as IHttpKernelConfig; + this.handle = this.handle.bind(this); + this.registerRoute = this.registerRoute.bind(this); } /** @@ -47,8 +52,8 @@ export class HttpKernel public route<_TContext extends IContext = TContext>( definition: IRouteDefinition, ): IRouteBuilder { - return new this.routeBuilderFactory( - this.registerRoute.bind(this), + return new this.cfg.routeBuilderFactory( + this.registerRoute, definition, ); } @@ -125,6 +130,9 @@ export class HttpKernel ? await fn(ctx, () => dispatch(index + 1)) : await (fn as IHandler<_TContext>)(ctx); }; - return this.decorateResponse(await dispatch(0), ctx); + return this.cfg.decorateResponse( + await dispatch(0), + ctx as unknown as TContext, + ); } } diff --git a/src/Interfaces/HttpKernelConfig.ts b/src/Interfaces/HttpKernelConfig.ts new file mode 100644 index 0000000..6f9fe19 --- /dev/null +++ b/src/Interfaces/HttpKernelConfig.ts @@ -0,0 +1,8 @@ +import { ResponseDecorator } from '../Types/mod.ts'; +import { IContext } from './IContext.ts'; +import { IRouteBuilderFactory } from './IRouteBuilder.ts'; + +export interface IHttpKernelConfig { + decorateResponse: ResponseDecorator; + routeBuilderFactory: IRouteBuilderFactory; +} diff --git a/src/Interfaces/IRouteBuilder.ts b/src/Interfaces/IRouteBuilder.ts index 48e090b..874dd41 100644 --- a/src/Interfaces/IRouteBuilder.ts +++ b/src/Interfaces/IRouteBuilder.ts @@ -4,12 +4,12 @@ import { IMiddleware } from './IMiddleware.ts'; import { IRouteDefinition } from './IRouteDefinition.ts'; import { IContext } from './mod.ts'; -export interface IRouteBuilderFactory { +export interface IRouteBuilderFactory { new ( - registerRoute: (route: IInternalRoute) => void, + registerRoute: (route: IInternalRoute) => void, def: IRouteDefinition, - mws?: IMiddleware[], - ): IRouteBuilder; + mws?: IMiddleware[], + ): IRouteBuilder; } /** diff --git a/src/Interfaces/mod.ts b/src/Interfaces/mod.ts index aeebb7e..b0083f1 100644 --- a/src/Interfaces/mod.ts +++ b/src/Interfaces/mod.ts @@ -1,3 +1,6 @@ +// deno-coverage-ignore-file + +export type { IHttpKernelConfig } from './HttpKernelConfig.ts'; export type { IContext } from './IContext.ts'; export type { IHandler } from './IHandler.ts'; export type { IHttpKernel } from './IHttpKernel.ts'; diff --git a/src/Types/mod.ts b/src/Types/mod.ts index fd3b1de..2a05cc6 100644 --- a/src/Types/mod.ts +++ b/src/Types/mod.ts @@ -1,3 +1,5 @@ +// deno-coverage-ignore-file + export { isHttpMethod, validHttpMethods } from './HttpMethod.ts'; export type { HttpMethod } from './HttpMethod.ts'; export type { Params } from './Params.ts'; diff --git a/src/Utils/mod.ts b/src/Utils/mod.ts index 3910113..e755516 100644 --- a/src/Utils/mod.ts +++ b/src/Utils/mod.ts @@ -1,2 +1,4 @@ +// deno-coverage-ignore-file + export { createRouteMatcher } from './createRouteMatcher.ts'; export { parseQuery } from './parseQuery.ts';