diff --git a/packages/nextjs/src/api/__tests__/__snapshots__/exports.test.ts.snap b/packages/nextjs/src/api/__tests__/__snapshots__/exports.test.ts.snap index 332b415bd7..83e0a866b2 100644 --- a/packages/nextjs/src/api/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/nextjs/src/api/__tests__/__snapshots__/exports.test.ts.snap @@ -24,6 +24,10 @@ exports[`/api public exports should not include a breaking change 1`] = ` "Session", "SignInToken", "Token", + "TokenVerificationError", + "TokenVerificationErrorAction", + "TokenVerificationErrorCode", + "TokenVerificationErrorReason", "User", "Verification", "allowlistIdentifiers", diff --git a/packages/nextjs/src/app-beta/ClerkProvider.tsx b/packages/nextjs/src/app-beta/ClerkProvider.tsx index c467ec694e..2619580d62 100644 --- a/packages/nextjs/src/app-beta/ClerkProvider.tsx +++ b/packages/nextjs/src/app-beta/ClerkProvider.tsx @@ -4,7 +4,7 @@ deprecated( '@clerk/nextjs/app-beta', 'Use imports from `@clerk/nextjs` instead.\nFor more details, consult the middleware documentation: https://clerk.com/docs/nextjs/middleware', ); -/* eslint-disable turbo/no-undeclared-env-vars */ + import type { IsomorphicClerkOptions } from '@clerk/clerk-react'; import type { InitialState, PublishableKeyOrFrontendApi } from '@clerk/types'; import React from 'react'; diff --git a/packages/nextjs/src/app-router/client/useAwaitableNavigate.ts b/packages/nextjs/src/app-router/client/useAwaitableNavigate.ts index 6bb1fba12c..19330b6528 100644 --- a/packages/nextjs/src/app-router/client/useAwaitableNavigate.ts +++ b/packages/nextjs/src/app-router/client/useAwaitableNavigate.ts @@ -15,7 +15,7 @@ export const useAwaitableNavigate = () => { const { push } = useRouter(); const pathname = usePathname(); const params = useSearchParams(); - // eslint-disable-next-line @typescript-eslint/restrict-plus-operands + const urlKey = pathname + params.toString(); useEffect(() => { diff --git a/packages/nextjs/src/app-router/server/currentUser.ts b/packages/nextjs/src/app-router/server/currentUser.ts index 4940e88dfc..6684ac8f90 100644 --- a/packages/nextjs/src/app-router/server/currentUser.ts +++ b/packages/nextjs/src/app-router/server/currentUser.ts @@ -3,7 +3,6 @@ import type { User } from '@clerk/backend'; import { clerkClient } from '../../server/clerkClient'; import { auth } from './auth'; -// eslint-disable-next-line @typescript-eslint/require-await export async function currentUser(): Promise { const { userId } = auth(); return userId ? clerkClient.users.getUser(userId) : null; diff --git a/packages/nextjs/src/client-boundary/NextOptionsContext.tsx b/packages/nextjs/src/client-boundary/NextOptionsContext.tsx index 0b554e3c3c..02bcf434b0 100644 --- a/packages/nextjs/src/client-boundary/NextOptionsContext.tsx +++ b/packages/nextjs/src/client-boundary/NextOptionsContext.tsx @@ -8,8 +8,8 @@ const ClerkNextOptionsCtx = React.createContext<{ value: ClerkNextContextValue } ClerkNextOptionsCtx.displayName = 'ClerkNextOptionsCtx'; const useClerkNextOptions = () => { - const ctx = React.useContext(ClerkNextOptionsCtx)!; - return ctx.value as ClerkNextContextValue; + const ctx = React.useContext(ClerkNextOptionsCtx) as { value: ClerkNextContextValue }; + return ctx.value; }; const ClerkNextOptionsProvider = (props: React.PropsWithChildren<{ options: ClerkNextContextValue }>) => { diff --git a/packages/nextjs/src/edge-middleware/__tests__/__snapshots__/exports.test.ts.snap b/packages/nextjs/src/edge-middleware/__tests__/__snapshots__/exports.test.ts.snap index d8da61fad6..ff39c6635e 100644 --- a/packages/nextjs/src/edge-middleware/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/nextjs/src/edge-middleware/__tests__/__snapshots__/exports.test.ts.snap @@ -24,6 +24,10 @@ exports[`/edge-middleware public exports should not include a breaking change 1` "Session", "SignInToken", "Token", + "TokenVerificationError", + "TokenVerificationErrorAction", + "TokenVerificationErrorCode", + "TokenVerificationErrorReason", "User", "Verification", "allowlistIdentifiers", diff --git a/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap b/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap index e5b9aa7de1..c9c9b549ad 100644 --- a/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap @@ -38,6 +38,10 @@ exports[`/server public exports should not include a breaking change 1`] = ` "Session", "SignInToken", "Token", + "TokenVerificationError", + "TokenVerificationErrorAction", + "TokenVerificationErrorCode", + "TokenVerificationErrorReason", "User", "Verification", "auth", diff --git a/packages/nextjs/src/server/authMiddleware.ts b/packages/nextjs/src/server/authMiddleware.ts index f823fa45fa..e5254371c2 100644 --- a/packages/nextjs/src/server/authMiddleware.ts +++ b/packages/nextjs/src/server/authMiddleware.ts @@ -1,6 +1,5 @@ -/* eslint-disable turbo/no-undeclared-env-vars */ import type { AuthObject, RequestState } from '@clerk/backend'; -import { buildRequestUrl, constants } from '@clerk/backend'; +import { buildRequestUrl, constants, TokenVerificationErrorReason } from '@clerk/backend'; import type Link from 'next/link'; import type { NextFetchEvent, NextMiddleware, NextRequest } from 'next/server'; import { NextResponse } from 'next/server'; @@ -355,7 +354,7 @@ const assertClockSkew = (requestState: RequestState, opts: AuthMiddlewareParams) return; } - if (requestState.reason === 'token-not-active-yet') { + if (requestState.reason === TokenVerificationErrorReason.TokenNotActiveYet) { throw new Error(clockSkewDetected(requestState.message)); } }; @@ -377,7 +376,7 @@ const assertInfiniteRedirectionLoop = ( if (infiniteRedirectsCounter === 6) { // Infinite redirect detected, is it clock skew? // We check for token-expired here because it can be a valid, recoverable scenario, but in a redirect loop a token-expired error likely indicates clock skew. - if (requestState.reason === 'token-expired') { + if (requestState.reason === TokenVerificationErrorReason.TokenExpired) { throw new Error(clockSkewDetected(requestState.message)); } diff --git a/packages/nextjs/src/server/clerkClient.ts b/packages/nextjs/src/server/clerkClient.ts index 5ec9ca2711..d5ed9ccaf8 100644 --- a/packages/nextjs/src/server/clerkClient.ts +++ b/packages/nextjs/src/server/clerkClient.ts @@ -1,4 +1,3 @@ -/* eslint-disable turbo/no-undeclared-env-vars */ import { Clerk } from '@clerk/backend'; import { API_KEY, API_URL, API_VERSION, DOMAIN, IS_SATELLITE, PROXY_URL, SECRET_KEY } from './constants'; diff --git a/packages/nextjs/src/server/utils.ts b/packages/nextjs/src/server/utils.ts index 37080d720e..76f4e3f117 100644 --- a/packages/nextjs/src/server/utils.ts +++ b/packages/nextjs/src/server/utils.ts @@ -8,8 +8,7 @@ import { NextResponse } from 'next/server'; import { constants as nextConstants } from '../constants'; import { API_KEY, DOMAIN, IS_SATELLITE, PROXY_URL, SECRET_KEY, SIGN_IN_URL } from './clerkClient'; import { missingDomainAndProxy, missingSignInUrlInDev } from './errors'; -import type { NextMiddlewareResult, RequestLike } from './types'; -import type { WithAuthOptions } from './types'; +import type { NextMiddlewareResult, RequestLike, WithAuthOptions } from './types'; type AuthKey = 'AuthStatus' | 'AuthMessage' | 'AuthReason'; @@ -18,7 +17,7 @@ export function setCustomAttributeOnRequest(req: RequestLike, key: string, value } export function getCustomAttributeFromRequest(req: RequestLike, key: string): string | null | undefined { - // @ts-expect-error + // @ts-expect-error - TS doesn't like indexing into RequestLike return key in req ? req[key] : undefined; } diff --git a/packages/nextjs/src/utils/mergeNextClerkPropsWithEnv.ts b/packages/nextjs/src/utils/mergeNextClerkPropsWithEnv.ts index 5bd60fe814..6b2318dcfc 100644 --- a/packages/nextjs/src/utils/mergeNextClerkPropsWithEnv.ts +++ b/packages/nextjs/src/utils/mergeNextClerkPropsWithEnv.ts @@ -1,4 +1,3 @@ -/* eslint-disable turbo/no-undeclared-env-vars */ import type { NextClerkProviderProps } from '../types'; export const mergeNextClerkPropsWithEnv = (props: Omit) => {