From d2b8f46e59e1adbb4a05e75734d40ab0320694a9 Mon Sep 17 00:00:00 2001 From: Hui Zhao Date: Wed, 8 Jan 2025 17:43:11 -0800 Subject: [PATCH] fix(adapter-nextjs): not await params async API in Next.js 15 --- .../__tests__/auth/utils/predicates.test.ts | 3 ++- .../src/auth/handleAuthApiRouteRequestForAppRouter.ts | 2 +- packages/adapter-nextjs/src/auth/types.ts | 3 ++- packages/adapter-nextjs/src/auth/utils/predicates.ts | 11 ++--------- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/adapter-nextjs/__tests__/auth/utils/predicates.test.ts b/packages/adapter-nextjs/__tests__/auth/utils/predicates.test.ts index e3feabbe6b4..e991fafabd4 100644 --- a/packages/adapter-nextjs/__tests__/auth/utils/predicates.test.ts +++ b/packages/adapter-nextjs/__tests__/auth/utils/predicates.test.ts @@ -13,8 +13,9 @@ import { describe('isAuthRoutesHandlersContext', () => { test.each([ [{}, false], - [{ params: {} }, false], + [{ params: {} }, true], [{ params: { slug: 'sign-in' } }, true], + [{ params: Promise.resolve({ slug: 'sign-in' }) }, true], ] as [object, boolean][])( 'when call with %o it returns %s', (input, expectedResult) => { diff --git a/packages/adapter-nextjs/src/auth/handleAuthApiRouteRequestForAppRouter.ts b/packages/adapter-nextjs/src/auth/handleAuthApiRouteRequestForAppRouter.ts index 8ff7061b0e5..dc96199a9d7 100644 --- a/packages/adapter-nextjs/src/auth/handleAuthApiRouteRequestForAppRouter.ts +++ b/packages/adapter-nextjs/src/auth/handleAuthApiRouteRequestForAppRouter.ts @@ -29,7 +29,7 @@ export const handleAuthApiRouteRequestForAppRouter: HandleAuthApiRouteRequestFor return new Response(null, { status: 405 }); } - const { slug } = handlerContext.params; + const { slug } = await handlerContext.params; // don't support [...slug] here if (slug === undefined || Array.isArray(slug)) { return new Response(null, { status: 400 }); diff --git a/packages/adapter-nextjs/src/auth/types.ts b/packages/adapter-nextjs/src/auth/types.ts index 72376663909..649f0c21fc8 100644 --- a/packages/adapter-nextjs/src/auth/types.ts +++ b/packages/adapter-nextjs/src/auth/types.ts @@ -24,7 +24,8 @@ export interface AuthRouteHandlerParams { } export interface AuthRoutesHandlerContext { - params: AuthRouteHandlerParams; + // In Next.js 15 params is an async API, so it can be a promise. + params: AuthRouteHandlerParams | Promise; } /** diff --git a/packages/adapter-nextjs/src/auth/utils/predicates.ts b/packages/adapter-nextjs/src/auth/utils/predicates.ts index dbf79d1aab0..b7a612752db 100644 --- a/packages/adapter-nextjs/src/auth/utils/predicates.ts +++ b/packages/adapter-nextjs/src/auth/utils/predicates.ts @@ -4,7 +4,7 @@ import { NextRequest } from 'next/server'; import { NextApiRequest, NextApiResponse } from 'next'; -import { AuthRouteHandlerParams, AuthRoutesHandlerContext } from '../types'; +import { AuthRoutesHandlerContext } from '../types'; // NextRequest is the 1st parameter type for the API route handlers in the App Router export function isNextRequest(request: object): request is NextRequest { @@ -20,17 +20,10 @@ export function isAuthRoutesHandlersContext( return ( 'params' in context && context.params !== undefined && - context.params !== null && - isAuthRouteHandlerParams(context.params) + context.params !== null ); } -function isAuthRouteHandlerParams( - params: object, -): params is AuthRouteHandlerParams { - return 'slug' in params && typeof params.slug === 'string'; -} - // NextApiRequest is the 1st parameter type for the API route handlers in the Pages Router export function isNextApiRequest(request: object): request is NextApiRequest { // Can't use `IncomingMessage` to validate the request is an instance of `NextApiRequest`