From 683f0921d02476efad030c954dac3f1d7929b8ea Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Tue, 23 Sep 2025 08:40:34 +0100 Subject: [PATCH] changed the middleware signature to move the top level param key under the RequestObject and changed the handler signature to do the same --- packages/event-handler/src/rest/Router.ts | 11 ++++------- packages/event-handler/src/rest/utils.ts | 3 +-- packages/event-handler/src/types/rest.ts | 9 ++++----- .../tests/unit/rest/Router/basic-routing.test.ts | 6 +++--- .../tests/unit/rest/Router/decorators.test.ts | 2 +- .../tests/unit/rest/Router/middleware.test.ts | 4 ++-- .../tests/unit/rest/middleware/compress.test.ts | 2 +- 7 files changed, 16 insertions(+), 21 deletions(-) diff --git a/packages/event-handler/src/rest/Router.ts b/packages/event-handler/src/rest/Router.ts index 03bb209523..313fb88ffd 100644 --- a/packages/event-handler/src/rest/Router.ts +++ b/packages/event-handler/src/rest/Router.ts @@ -224,6 +224,7 @@ class Router { // this response should be overwritten by the handler, if it isn't // it means something went wrong with the middleware chain res: new Response('', { status: 500 }), + params: {}, }; try { @@ -231,11 +232,7 @@ class Router { const route = this.routeRegistry.resolve(method, path); - const handlerMiddleware: Middleware = async ({ - params, - reqCtx, - next, - }) => { + const handlerMiddleware: Middleware = async ({ reqCtx, next }) => { if (route === null) { const notFoundRes = await this.handleError( new NotFoundError(`Route ${path} for method ${method} not found`), @@ -251,7 +248,7 @@ class Router { ? route.handler : route.handler.bind(options.scope); - const handlerResult = await handler(params, reqCtx); + const handlerResult = await handler(reqCtx); reqCtx.res = handlerResultToWebResponse( handlerResult, reqCtx.res.headers @@ -267,8 +264,8 @@ class Router { handlerMiddleware, ]); + requestContext.params = route?.params ?? {}; const middlewareResult = await middleware({ - params: route?.params ?? {}, reqCtx: requestContext, next: () => Promise.resolve(), }); diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index 792b85854b..e8fbd1e5d0 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -150,7 +150,7 @@ export const isAPIGatewayProxyResult = ( * ``` */ export const composeMiddleware = (middleware: Middleware[]): Middleware => { - return async ({ params, reqCtx, next }): Promise => { + return async ({ reqCtx, next }): Promise => { let index = -1; let result: HandlerResponse | undefined; @@ -177,7 +177,6 @@ export const composeMiddleware = (middleware: Middleware[]): Middleware => { }; const middlewareResult = await middlewareFn({ - params, reqCtx, next: nextFn, }); diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index d59b174a80..456a1dec9d 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -19,6 +19,7 @@ type RequestContext = { event: APIGatewayProxyEvent; context: Context; res: Response; + params: Record; }; type ErrorResolveOptions = RequestContext & ResolveOptions; @@ -60,10 +61,9 @@ type DynamicRoute = Route & CompiledRoute; type HandlerResponse = Response | JSONObject; -type RouteHandler< - TParams = Record, - TReturn = HandlerResponse, -> = (args: TParams, reqCtx: RequestContext) => Promise; +type RouteHandler = ( + reqCtx: RequestContext +) => Promise; type HttpMethod = keyof typeof HttpVerbs; @@ -87,7 +87,6 @@ type RestRouteOptions = { type NextFunction = () => Promise; type Middleware = (args: { - params: Record; reqCtx: RequestContext; next: NextFunction; }) => Promise; diff --git a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts index f2be005e58..fa58f23c87 100644 --- a/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/basic-routing.test.ts @@ -89,7 +89,7 @@ describe('Class: Router - Basic Routing', () => { const app = new Router(); const testEvent = createTestEvent('/test', 'GET'); - app.get('/test', async (_params, reqCtx) => { + app.get('/test', async (reqCtx) => { return { hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, @@ -126,8 +126,8 @@ describe('Class: Router - Basic Routing', () => { app.post('/', async () => { return { actualPath: '/todos' }; }); - app.get('/:todoId', async ({ todoId }) => { - return { actualPath: `/todos/${todoId}` }; + app.get('/:todoId', async (reqCtx) => { + return { actualPath: `/todos/${reqCtx.params.todoId}` }; }); // Act diff --git a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts index 3510516bc0..4b6be75101 100644 --- a/packages/event-handler/tests/unit/rest/Router/decorators.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/decorators.test.ts @@ -398,7 +398,7 @@ describe('Class: Router - Decorators', () => { class Lambda { @app.get('/test') - public async getTest(_params: any, reqCtx: any) { + public async getTest(reqCtx: any) { return { hasRequest: reqCtx.req instanceof Request, hasEvent: reqCtx.event === testEvent, diff --git a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts index c87d247aa9..a5080eb654 100644 --- a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts @@ -138,8 +138,8 @@ describe('Class: Router - Middleware', () => { let middlewareParams: Record | undefined; let middlewareOptions: RequestContext | undefined; - app.use(async ({ params, reqCtx, next }) => { - middlewareParams = params; + app.use(async ({ reqCtx, next }) => { + middlewareParams = reqCtx.params; middlewareOptions = reqCtx; await next(); }); diff --git a/packages/event-handler/tests/unit/rest/middleware/compress.test.ts b/packages/event-handler/tests/unit/rest/middleware/compress.test.ts index 056b04219a..0aa8a1e289 100644 --- a/packages/event-handler/tests/unit/rest/middleware/compress.test.ts +++ b/packages/event-handler/tests/unit/rest/middleware/compress.test.ts @@ -1,8 +1,8 @@ import { gzipSync } from 'node:zlib'; import context from '@aws-lambda-powertools/testing-utils/context'; -import { Router } from 'src/rest/Router.js'; import { beforeEach, describe, expect, it } from 'vitest'; import { compress } from '../../../../src/rest/middleware/index.js'; +import { Router } from '../../../../src/rest/Router.js'; import { createSettingHeadersMiddleware, createTestEvent } from '../helpers.js'; describe('Compress Middleware', () => {