Skip to content

Commit bbcf9de

Browse files
committed
feat: Next.js 15 support
1 parent dd94a56 commit bbcf9de

File tree

3 files changed

+16
-14
lines changed

3 files changed

+16
-14
lines changed

src/core/definer.test.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ describe("defineRoute", () => {
3232
mockAction.mockResolvedValue(new Response("Success"));
3333

3434
const nextJsRouteHandler = route.GET;
35-
const response = await nextJsRouteHandler(mockRequest as unknown as Request);
35+
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: Promise.resolve({}) });
3636

3737
expect(mockAction).toHaveBeenCalledWith({
3838
pathParams: null,
@@ -67,7 +67,7 @@ describe("defineRoute", () => {
6767
mockAction.mockResolvedValue(new Response("Created", { status: 201 }));
6868

6969
const nextJsRouteHandler = route.POST;
70-
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: { id: "123" } });
70+
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: Promise.resolve({ id: "123" }) });
7171

7272
expect(mockAction).toHaveBeenCalledWith({
7373
pathParams: { id: "123" },
@@ -101,7 +101,7 @@ describe("defineRoute", () => {
101101
});
102102

103103
const nextJsRouteHandler = route.POST;
104-
const response = await nextJsRouteHandler(mockRequest as unknown as Request);
104+
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: Promise.resolve({}) });
105105

106106
expect(response).toBeInstanceOf(Response);
107107
expect(response.status).toBe(400);
@@ -134,7 +134,7 @@ describe("defineRoute", () => {
134134
});
135135

136136
const nextJsRouteHandler = route.PUT;
137-
const response = await nextJsRouteHandler(mockRequest as unknown as Request);
137+
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: Promise.resolve({}) });
138138

139139
expect(response).toBeInstanceOf(Response);
140140
expect(response.status).toBe(400);
@@ -162,7 +162,7 @@ describe("defineRoute", () => {
162162
});
163163

164164
const nextJsRouteHandler = route.GET;
165-
const response = await nextJsRouteHandler(mockRequest as unknown as Request);
165+
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: Promise.resolve({}) });
166166

167167
expect(response).toBeInstanceOf(Response);
168168
expect(response.status).toBe(500);
@@ -189,7 +189,7 @@ describe("defineRoute", () => {
189189

190190
const invalidParams = {} as unknown as z.infer<typeof pathSchema>;
191191
const nextJsRouteHandler = route.GET;
192-
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: invalidParams });
192+
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: Promise.resolve(invalidParams) });
193193

194194
expect(response).toBeInstanceOf(Response);
195195
expect(response.status).toBe(404);
@@ -243,7 +243,8 @@ describe("defineRoute", () => {
243243

244244
const nextJsRouteHandler = route.GET;
245245

246-
await nextJsRouteHandler(mockRequest as unknown as Request);
246+
const fakeContext = { params: Promise.resolve(undefined as unknown as { id: string }) }
247+
await nextJsRouteHandler(mockRequest as unknown as Request, fakeContext);
247248

248249
expect(console.log).toHaveBeenCalledWith(expect.stringContaining("You tried to add pathParams to a route"));
249250

@@ -272,7 +273,7 @@ describe("defineRoute", () => {
272273

273274
const nextJsRouteHandler = route.POST;
274275

275-
const response = await nextJsRouteHandler(mockRequest as unknown as Request);
276+
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: Promise.resolve({}) });
276277
const bodyText = await response.text();
277278

278279
expect(response).toBeInstanceOf(Response);
@@ -305,7 +306,7 @@ describe("defineRoute", () => {
305306

306307
const nextJsRouteHandler = route.GET;
307308

308-
const response = await nextJsRouteHandler(mockRequest as unknown as Request);
309+
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: Promise.resolve({}) });
309310
const bodyText = await response.text();
310311

311312
expect(response).toBeInstanceOf(Response);
@@ -315,7 +316,7 @@ describe("defineRoute", () => {
315316

316317
it("should apply middleware to the route handler", async () => {
317318
type Handler = RouteMethodHandler<unknown, Request, Response>;
318-
const mockMiddleware = jest.fn((handler: Handler) => async (request: Request, context?: { params: unknown }) => {
319+
const mockMiddleware = jest.fn((handler: Handler) => async (request: Request, context: { params: Promise<unknown> }) => {
319320
await Promise.resolve();
320321
return handler(request, context);
321322
});
@@ -338,7 +339,7 @@ describe("defineRoute", () => {
338339
});
339340

340341
const nextJsRouteHandler = route.GET;
341-
const response = await nextJsRouteHandler(mockRequest as unknown as Request);
342+
const response = await nextJsRouteHandler(mockRequest as unknown as Request, { params: Promise.resolve({}) });
342343

343344
expect(response).toBeInstanceOf(Response);
344345
expect(response.status).toBe(200);

src/core/definer.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ function defineRoute<
8484
const handler: RouteMethodHandler<PPI, MwReq, MwRes> = async (request, context) => {
8585
try {
8686
const { searchParams } = new URL(request.url);
87-
const pathParams = parsePathParams(context?.params, input.pathParams) as PPO;
87+
const nextSegmentParams = context ? (await context.params) : undefined
88+
const pathParams = parsePathParams(nextSegmentParams, input.pathParams) as PPO;
8889
const queryParams = parseSearchParams(searchParams, input.queryParams) as QPO;
8990
const body = await parseRequestBody(request, input.method, input.requestBody, input.hasFormData) as RBO;
9091
return await input.action({ pathParams, queryParams, body }, request) as MwRes;

src/types/next.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import type { HttpMethod } from "./http";
22
import type { OperationObject } from "@omer-x/openapi-types/operation";
33

44
type RouteHandlerContext<PathParams> = {
5-
params: PathParams,
5+
params: Promise<PathParams>,
66
};
77

88
export type RouteMethodHandler<PathParamsInput, Req, Res> = ((
99
request: Req,
10-
context?: RouteHandlerContext<PathParamsInput>
10+
context: RouteHandlerContext<PathParamsInput>
1111
) => Promise<Res>) & {
1212
apiData?: OperationObject,
1313
};

0 commit comments

Comments
 (0)