From 6d912f801fcac50fa85b994d0e14114cc580a562 Mon Sep 17 00:00:00 2001 From: MURAKAMI Masahiko Date: Tue, 26 May 2026 23:16:36 +0900 Subject: [PATCH] fix(aws-lambda): return request with runtime metadata and use correct awsLambda property --- src/presets/aws-lambda/runtime/_utils.ts | 9 ++-- test/unit/aws-lambda.utils.test.ts | 61 ++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 test/unit/aws-lambda.utils.test.ts diff --git a/src/presets/aws-lambda/runtime/_utils.ts b/src/presets/aws-lambda/runtime/_utils.ts index a5efd6cdbf..a1639aabe7 100644 --- a/src/presets/aws-lambda/runtime/_utils.ts +++ b/src/presets/aws-lambda/runtime/_utils.ts @@ -1,4 +1,4 @@ -import type { APIGatewayProxyEvent, APIGatewayProxyEventV2 } from "aws-lambda"; +import type { APIGatewayProxyEvent, APIGatewayProxyEventV2, Context } from "aws-lambda"; import type { ServerRequest } from "srvx"; import { stringifyQuery } from "ufo"; @@ -6,7 +6,7 @@ import { stringifyQuery } from "ufo"; export function awsRequest( event: APIGatewayProxyEvent | APIGatewayProxyEventV2, - context: unknown + context: Context ): ServerRequest { const method = awsEventMethod(event); const url = awsEventURL(event); @@ -17,10 +17,9 @@ export function awsRequest( // srvx compatibility req.runtime ??= { name: "aws-lambda" }; - // @ts-expect-error (add to srvx types) - req.runtime.aws ??= { event, context } as any; + req.runtime.awsLambda ??= { event, context }; - return new Request(url, { method, headers, body }); + return req; } function awsEventMethod(event: APIGatewayProxyEvent | APIGatewayProxyEventV2): string { diff --git a/test/unit/aws-lambda.utils.test.ts b/test/unit/aws-lambda.utils.test.ts new file mode 100644 index 0000000000..f3e06ae7d8 --- /dev/null +++ b/test/unit/aws-lambda.utils.test.ts @@ -0,0 +1,61 @@ +import type { APIGatewayProxyEventV2 } from "aws-lambda"; +import { describe, expect, it } from "vitest"; +import { awsRequest } from "../../src/presets/aws-lambda/runtime/_utils.ts"; + +const mockContext = { + functionName: "test", + functionVersion: "$LATEST", + invokedFunctionArn: "arn:aws:lambda:us-east-1:123456789012:function:test", + memoryLimitInMB: "128", + awsRequestId: "test-request-id", + logGroupName: "/aws/lambda/test", + logStreamName: "test-stream", + callbackWaitsForEmptyEventLoop: false, + getRemainingTimeInMillis: () => 1000, + done: () => {}, + fail: () => {}, + succeed: () => {}, +}; + +const mockEvent: APIGatewayProxyEventV2 = { + rawPath: "/test", + headers: { host: "example.com" }, + rawQueryString: "", + body: undefined, + isBase64Encoded: false, + version: "2.0", + routeKey: "GET /test", + requestContext: { + accountId: "123456789012", + apiId: "api-id", + domainName: "example.com", + domainPrefix: "example", + requestId: "request-id", + routeKey: "GET /test", + stage: "$default", + time: "01/Jan/2024:00:00:00 +0000", + timeEpoch: 1704067200, + http: { + method: "GET", + path: "/test", + protocol: "HTTP/1.1", + sourceIp: "1.2.3.4", + userAgent: "test-agent", + }, + }, +}; + +describe("awsRequest", () => { + it("returns the same Request object with runtime metadata", () => { + const req = awsRequest(mockEvent, mockContext); + expect(req.runtime).toBeDefined(); + expect(req.runtime?.name).toBe("aws-lambda"); + }); + + it("sets runtime.awsLambda with event and context", () => { + const req = awsRequest(mockEvent, mockContext); + expect(req.runtime?.awsLambda).toBeDefined(); + expect(req.runtime?.awsLambda?.event).toBe(mockEvent); + expect(req.runtime?.awsLambda?.context).toBe(mockContext); + }); +});