From 615e4e26414d1c289102fb9f80ba642a7697ee1d Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Thu, 14 Dec 2023 11:40:15 +0200 Subject: [PATCH 1/5] feat(nextjs): Drop support for next@12, next<13.0.4, next<14.0.3 Drop support for NextJS v12: v12 was released on 26 Oct 2021 (~2 years ago). Security support ended on 21 Nov 2022 (~11 months ago) Drop support for NextJS <13.0.4: Many header-related bugs and breaking changes were introduced with the 12.1.0, 12.2.0, 13.0.1, 13.0.2, 13.0.3 releases. Vercel fixed all known related-bugs with version 13.0.4. In order to support every release in the range of 12 to 13.0.4 we had to resort to various workaround/compatibility layers (example https://github.com/clerk/javascript/blob/92727eec39566278263ffa118a085493f964eb94/packages/nextjs/src/server/utils.ts#L76). If we drop support for v12 and the other problematic versions, we can also remove all the extra logic from the @clerk/nextjs package Drop support for NextJS < 14.0.3 for the issues described here: https://github.com/clerk/javascript/issues/1436 --- packages/backend/src/constants.ts | 5 -- packages/nextjs/package.json | 2 +- .../nextjs/src/app-router/server/utils.ts | 7 +- packages/nextjs/src/server/utils.ts | 69 ++----------------- 4 files changed, 10 insertions(+), 73 deletions(-) diff --git a/packages/backend/src/constants.ts b/packages/backend/src/constants.ts index 55bb8897239..0f129877403 100644 --- a/packages/backend/src/constants.ts +++ b/packages/backend/src/constants.ts @@ -43,10 +43,6 @@ const Headers = { SecFetchDest: 'sec-fetch-dest', } as const; -const SearchParams = { - AuthStatus: Headers.AuthStatus, -} as const; - const ContentTypes = { Json: 'application/json', } as const; @@ -55,7 +51,6 @@ export const constants = { Attributes, Cookies, Headers, - SearchParams, ContentTypes, QueryParameters, } as const; diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 36fe82a0a93..19ace22c6e9 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -74,7 +74,7 @@ "typescript": "*" }, "peerDependencies": { - "next": ">=10", + "next": "^13.0.4 || ^14.0.3", "react": ">=18", "react-dom": ">=18" }, diff --git a/packages/nextjs/src/app-router/server/utils.ts b/packages/nextjs/src/app-router/server/utils.ts index 5807878d230..10e86bc0248 100644 --- a/packages/nextjs/src/app-router/server/utils.ts +++ b/packages/nextjs/src/app-router/server/utils.ts @@ -1,12 +1,9 @@ -// import { headers } from 'next/headers'; +import { headers } from 'next/headers'; import { NextRequest } from 'next/server'; export const buildRequestLike = () => { try { - // Dynamically import next/headers, otherwise Next12 apps will break - // because next/headers was introduced in next@13 - // eslint-disable-next-line @typescript-eslint/no-var-requires - const { headers } = require('next/headers'); + console.log(NextRequest); return new NextRequest('https://placeholder.com', { headers: headers() }); } catch (e: any) { if ( diff --git a/packages/nextjs/src/server/utils.ts b/packages/nextjs/src/server/utils.ts index 6f244db5963..42ef545f133 100644 --- a/packages/nextjs/src/server/utils.ts +++ b/packages/nextjs/src/server/utils.ts @@ -23,43 +23,16 @@ export function getCustomAttributeFromRequest(req: RequestLike, key: string): st } export function getAuthKeyFromRequest(req: RequestLike, key: AuthKey): string | null | undefined { - return ( - getCustomAttributeFromRequest(req, constants.Attributes[key]) || - getHeader(req, constants.Headers[key]) || - (key === 'AuthStatus' ? getQueryParam(req, constants.SearchParams.AuthStatus) : undefined) - ); + return getCustomAttributeFromRequest(req, constants.Attributes[key]) || getHeader(req, constants.Headers[key]); } -// Tries to extract auth status from the request using several strategies // TODO: Rename Auth status and align the naming across media export function getAuthStatusFromRequest(req: RequestLike): string | null | undefined { return ( - getCustomAttributeFromRequest(req, constants.Attributes.AuthStatus) || - getHeader(req, constants.Headers.AuthStatus) || - getQueryParam(req, constants.SearchParams.AuthStatus) + getCustomAttributeFromRequest(req, constants.Attributes.AuthStatus) || getHeader(req, constants.Headers.AuthStatus) ); } -function getQueryParam(req: RequestLike, name: string): string | null | undefined { - if (isNextRequest(req)) { - return req.nextUrl.searchParams.get(name); - } - - // Check if the request contains a parsed query object - // NextApiRequest does, but the IncomingMessage in the GetServerSidePropsContext case does not - let queryParam: string | null | undefined; - if ('query' in req) { - queryParam = req.query[name] as string | undefined; - } - - // Fall back to query string - if (!queryParam) { - const qs = (req.url || '').split('?')[1]; - queryParam = new URLSearchParams(qs).get(name); - } - return queryParam; -} - export function getHeader(req: RequestLike, name: string): string | null | undefined { if (isNextRequest(req)) { return req.headers.get(name); @@ -124,22 +97,6 @@ export const setRequestHeadersOnNextResponse = ( }); }; -/** - * Test whether the currently installed nextjs version supports overriding the request headers. - * This feature was added in nextjs v13.0.1 - * https://github.com/vercel/next.js/pull/41380 - */ -export const nextJsVersionCanOverrideRequestHeaders = () => { - try { - const headerKey = 'clerkTest'; - const headerKeyInRes = `${MIDDLEWARE_HEADER_PREFIX}-${headerKey}`; - const res = NextResponse.next({ request: { headers: new Headers({ [headerKey]: 'true' }) } }); - return res.headers.has(headerKeyInRes); - } catch (e) { - return false; - } -}; - export const injectSSRStateIntoObject = (obj: O, authObject: T) => { // Serializing the state on dev env is a temp workaround for the following issue: // https://github.com/vercel/next.js/discussions/11209|Next.js @@ -188,23 +145,11 @@ export function decorateRequest( } if (rewriteURL) { - if (nextJsVersionCanOverrideRequestHeaders()) { - // If we detect that the host app is using a nextjs installation that reliably sets the - // request headers, we don't need to fall back to the searchParams strategy. - // In this case, we won't set them at all in order to avoid having them visible in the req.url - setRequestHeadersOnNextResponse(res, req, { - [constants.Headers.AuthStatus]: status, - [constants.Headers.AuthMessage]: message || '', - [constants.Headers.AuthReason]: reason || '', - }); - } else { - res.headers.set(constants.Headers.AuthStatus, status); - res.headers.set(constants.Headers.AuthMessage, message || ''); - res.headers.set(constants.Headers.AuthReason, reason || ''); - rewriteURL.searchParams.set(constants.SearchParams.AuthStatus, status); - rewriteURL.searchParams.set(constants.Headers.AuthMessage, message || ''); - rewriteURL.searchParams.set(constants.Headers.AuthReason, reason || ''); - } + setRequestHeadersOnNextResponse(res, req, { + [constants.Headers.AuthStatus]: status, + [constants.Headers.AuthMessage]: message || '', + [constants.Headers.AuthReason]: reason || '', + }); res.headers.set(nextConstants.Headers.NextRewrite, rewriteURL.href); } From 7685092914788c0b0d457cda0d362a7d46bf84e7 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Thu, 14 Dec 2023 12:57:58 +0200 Subject: [PATCH 2/5] feat(nextjs): Deprecate `authMiddleware` in favor of `clerkMiddleware` --- packages/nextjs/src/server/authMiddleware.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/nextjs/src/server/authMiddleware.ts b/packages/nextjs/src/server/authMiddleware.ts index b2a8474a275..c9be134ed43 100644 --- a/packages/nextjs/src/server/authMiddleware.ts +++ b/packages/nextjs/src/server/authMiddleware.ts @@ -132,6 +132,10 @@ export interface AuthMiddleware { (params?: AuthMiddlewareParams): NextMiddleware; } +/** + * @deprecated Use `clerkMiddleware` instead. + * Migration guide: https://clerk.com/docs/migration-guides/v5 + */ const authMiddleware: AuthMiddleware = (...args: unknown[]) => { const [params = {}] = args as [AuthMiddlewareParams?]; const { beforeAuth, afterAuth, publicRoutes, ignoredRoutes, apiRoutes, ...options } = params; From f885d524f0d2101b33d3db922570bb6edf4045c0 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Thu, 14 Dec 2023 19:12:36 +0200 Subject: [PATCH 3/5] feat(nextjs): Move errors to /errors --- packages/nextjs/errors/package.json | 5 +++++ packages/nextjs/package.json | 11 +++++++---- packages/nextjs/src/errors.ts | 1 + packages/nextjs/src/index.ts | 4 ---- packages/nextjs/tsconfig.json | 3 ++- 5 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 packages/nextjs/errors/package.json create mode 100644 packages/nextjs/src/errors.ts diff --git a/packages/nextjs/errors/package.json b/packages/nextjs/errors/package.json new file mode 100644 index 00000000000..3cf0cd7b90a --- /dev/null +++ b/packages/nextjs/errors/package.json @@ -0,0 +1,5 @@ +{ + "main": "../dist/errors/index.js", + "module": "../dist/errors/index.mjs", + "types": "../dist/types/errors/index.d.ts" +} diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 19ace22c6e9..7e38da71adc 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -34,14 +34,17 @@ "types": "./dist/types/server/index.d.ts", "import": "./dist/esm/server/index.js", "require": "./dist/cjs/server/index.js" + }, + "./errors": { + "types": "./dist/types/errors.d.ts", + "import": "./dist/esm/errors.js", + "require": "./dist/cjs/errors.js" } }, - "main": "./dist/cjs/index.js", - "module": "./dist/esm/index.js", - "types": "./dist/types/index.d.ts", "files": [ "dist", - "server" + "server", + "errors" ], "scripts": { "build": "npm run clean && tsup", diff --git a/packages/nextjs/src/errors.ts b/packages/nextjs/src/errors.ts new file mode 100644 index 00000000000..6462cd43bc6 --- /dev/null +++ b/packages/nextjs/src/errors.ts @@ -0,0 +1 @@ +export { isClerkAPIResponseError, isEmailLinkError, isKnownError, isMetamaskError } from './client-boundary/hooks'; diff --git a/packages/nextjs/src/index.ts b/packages/nextjs/src/index.ts index ba69ff2efa7..3c19e955078 100644 --- a/packages/nextjs/src/index.ts +++ b/packages/nextjs/src/index.ts @@ -37,10 +37,6 @@ export { * If you do, app router will break. */ export { - isClerkAPIResponseError, - isEmailLinkError, - isKnownError, - isMetamaskError, useAuth, useClerk, useEmailLink, diff --git a/packages/nextjs/tsconfig.json b/packages/nextjs/tsconfig.json index e8ef5d4615f..8f20e3722f8 100644 --- a/packages/nextjs/tsconfig.json +++ b/packages/nextjs/tsconfig.json @@ -19,7 +19,8 @@ "skipLibCheck": true, "sourceMap": false, "strict": true, - "target": "ES2020" + "target": "ES2020", + "rootDir": "src" }, "include": ["src"] } From d04efe7da9f9b30f73f4192a28a6de2d0bdb4c09 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Thu, 14 Dec 2023 19:13:32 +0200 Subject: [PATCH 4/5] feat(nextjs): Move server-related APIs to /server chore(repo): Add changesets chore(repo): Update changesets --- .changeset/grumpy-drinks-turn.md | 13 ++++++ .changeset/tricky-bikes-fix.md | 5 +++ packages/nextjs/errors/package.json | 6 +-- packages/nextjs/package.cjs.json | 8 ---- packages/nextjs/package.esm.json | 8 ---- packages/nextjs/package.json | 1 + .../nextjs/src/app-router/server/utils.ts | 1 - packages/nextjs/src/index.ts | 30 +++---------- packages/nextjs/src/server-helpers.client.ts | 11 ----- packages/nextjs/src/server-helpers.server.ts | 18 -------- .../__snapshots__/exports.test.ts.snap | 42 ------------------- packages/nextjs/src/server/authMiddleware.ts | 2 +- packages/nextjs/src/server/clerkClient.ts | 1 - packages/nextjs/src/server/index.ts | 12 +++++- 14 files changed, 38 insertions(+), 120 deletions(-) create mode 100644 .changeset/grumpy-drinks-turn.md create mode 100644 .changeset/tricky-bikes-fix.md delete mode 100644 packages/nextjs/src/server-helpers.client.ts delete mode 100644 packages/nextjs/src/server-helpers.server.ts diff --git a/.changeset/grumpy-drinks-turn.md b/.changeset/grumpy-drinks-turn.md new file mode 100644 index 00000000000..a47c79336af --- /dev/null +++ b/.changeset/grumpy-drinks-turn.md @@ -0,0 +1,13 @@ +--- +'@clerk/nextjs': major +--- + +Drop support for NextJS v12: v12 was released on 26 Oct 2021. Support for security updates stopped on 21 Nov 2022. + +Drop support for NextJS <13.0.4: Various header-related bugs were introduced with the 12.1.0, 12.2.0, 13.0.1, 13.0.2, 13.0.3 NextJS releases which are now fixed since next@^13.0.4. We will be dropping support for these problematic versions in order to greatly reduce complexity in our codebase. + +Drop support for NextJS < 14.0.3 because of the issues described here: https://github.com/clerk/javascript/issues/1436. + +Deprecate `authMiddleware` in favor of `clerkMiddleware`. For more information, see https://clerk.com/docs/upgrade-guides/v5-introduction + +Move the server-side APIs from `@clerk/nextjs` to the `@clerk/nextjs/server` module: `WebhookEventType`, `WebhookEvent`, `verifyToken`, `redirectToSignIn`, `auth`, `buildClerkProps`, `clerkClient`, `currentUser`, `getAuth`, `redirectToSignUp` and `authMiddleware`. For more information, see https://clerk.com/docs/upgrade-guides/v5-introduction diff --git a/.changeset/tricky-bikes-fix.md b/.changeset/tricky-bikes-fix.md new file mode 100644 index 00000000000..61b8ca0837c --- /dev/null +++ b/.changeset/tricky-bikes-fix.md @@ -0,0 +1,5 @@ +--- +'@clerk/backend': major +--- + +Drop unused SearchParams.AuthStatus constant diff --git a/packages/nextjs/errors/package.json b/packages/nextjs/errors/package.json index 3cf0cd7b90a..11198993274 100644 --- a/packages/nextjs/errors/package.json +++ b/packages/nextjs/errors/package.json @@ -1,5 +1,5 @@ { - "main": "../dist/errors/index.js", - "module": "../dist/errors/index.mjs", - "types": "../dist/types/errors/index.d.ts" + "main": "../dist/cjs/errors.js", + "module": "../dist/esm/errors.js", + "types": "../dist/types/errors.d.ts" } diff --git a/packages/nextjs/package.cjs.json b/packages/nextjs/package.cjs.json index c2e8475f09b..2a6bfb38976 100644 --- a/packages/nextjs/package.cjs.json +++ b/packages/nextjs/package.cjs.json @@ -4,14 +4,6 @@ "#components": { "react-server": "./components.server.js", "default": "./components.client.js" - }, - "#server": { - "react-server": "./server-helpers.server.js", - "edge-light": "./server-helpers.server.js", - "worker": "./server-helpers.server.js", - "node": "./server-helpers.server.js", - "browser": "./server-helpers.client.js", - "default": "./server-helpers.client.js" } } } diff --git a/packages/nextjs/package.esm.json b/packages/nextjs/package.esm.json index c2e8475f09b..2a6bfb38976 100644 --- a/packages/nextjs/package.esm.json +++ b/packages/nextjs/package.esm.json @@ -4,14 +4,6 @@ "#components": { "react-server": "./components.server.js", "default": "./components.client.js" - }, - "#server": { - "react-server": "./server-helpers.server.js", - "edge-light": "./server-helpers.server.js", - "worker": "./server-helpers.server.js", - "node": "./server-helpers.server.js", - "browser": "./server-helpers.client.js", - "default": "./server-helpers.client.js" } } } diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 7e38da71adc..582c0ec32a6 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -41,6 +41,7 @@ "require": "./dist/cjs/errors.js" } }, + "types": "./dist/types/index.d.ts", "files": [ "dist", "server", diff --git a/packages/nextjs/src/app-router/server/utils.ts b/packages/nextjs/src/app-router/server/utils.ts index 10e86bc0248..2fcf8c22d0b 100644 --- a/packages/nextjs/src/app-router/server/utils.ts +++ b/packages/nextjs/src/app-router/server/utils.ts @@ -3,7 +3,6 @@ import { NextRequest } from 'next/server'; export const buildRequestLike = () => { try { - console.log(NextRequest); return new NextRequest('https://placeholder.com', { headers: headers() }); } catch (e: any) { if ( diff --git a/packages/nextjs/src/index.ts b/packages/nextjs/src/index.ts index 3c19e955078..5471744740f 100644 --- a/packages/nextjs/src/index.ts +++ b/packages/nextjs/src/index.ts @@ -58,31 +58,11 @@ export { */ // @ts-ignore import * as ComponentsModule from '#components'; -/** - * Conditionally export server-side helpers. - * This allows to import server-side helpers from the top-level path. - * We defined the runtime and the type values explicitly, - * because TS will not recognize the subpath import unless the HOST - * application sets moduleResolution to 'NodeNext'. - */ -// @ts-ignore -import * as ServerHelperModule from '#server'; import type { ServerComponentsServerModuleTypes } from './components.server'; -import type { ServerHelpersServerModuleTypes } from './server-helpers.server'; - -export const ClerkProvider = ComponentsModule.ClerkProvider as ServerComponentsServerModuleTypes['ClerkProvider']; -export const SignedIn = ComponentsModule.SignedIn as ServerComponentsServerModuleTypes['SignedIn']; -export const SignedOut = ComponentsModule.SignedOut as ServerComponentsServerModuleTypes['SignedOut']; - -export const Protect = ComponentsModule.Protect; -export const auth = ServerHelperModule.auth as ServerHelpersServerModuleTypes['auth']; -export const currentUser = ServerHelperModule.currentUser as ServerHelpersServerModuleTypes['currentUser']; -// export const getAuth = ServerHelperModule.getAuth as ServerHelpersServerModuleTypes['getAuth']; -export const clerkClient = ServerHelperModule.clerkClient as ServerHelpersServerModuleTypes['clerkClient']; -export const authMiddleware = ServerHelperModule.authMiddleware as ServerHelpersServerModuleTypes['authMiddleware']; -export const redirectToSignIn = - ServerHelperModule.redirectToSignIn as ServerHelpersServerModuleTypes['redirectToSignIn']; -export const redirectToSignUp = - ServerHelperModule.redirectToSignUp as ServerHelpersServerModuleTypes['redirectToSignUp']; +export const ClerkProvider = + ComponentsModule.ClerkProvider as unknown as ServerComponentsServerModuleTypes['ClerkProvider']; +export const SignedIn = ComponentsModule.SignedIn as unknown as ServerComponentsServerModuleTypes['SignedIn']; +export const SignedOut = ComponentsModule.SignedOut as unknown as ServerComponentsServerModuleTypes['SignedOut']; +export const Protect = ComponentsModule.Protect as unknown as ServerComponentsServerModuleTypes['Protect']; diff --git a/packages/nextjs/src/server-helpers.client.ts b/packages/nextjs/src/server-helpers.client.ts deleted file mode 100644 index 86a4c652571..00000000000 --- a/packages/nextjs/src/server-helpers.client.ts +++ /dev/null @@ -1,11 +0,0 @@ -const mockImplementation = (name: string) => { - throw new Error(`${name} can only be used in a server environment.`); -}; - -export const auth = () => mockImplementation('auth()'); -export const currentUser = () => mockImplementation('currentUser()'); -export const authMiddleware = () => mockImplementation('authMiddleware()'); -export const getAuth = () => mockImplementation('getAuth()'); -export const clerkClient = () => mockImplementation('clerkClient()'); -export const redirectToSignIn = () => mockImplementation('redirectToSignIn()'); -export const redirectToSignUp = () => mockImplementation('redirectToSignUp()'); diff --git a/packages/nextjs/src/server-helpers.server.ts b/packages/nextjs/src/server-helpers.server.ts deleted file mode 100644 index c16af6a89d9..00000000000 --- a/packages/nextjs/src/server-helpers.server.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { auth } from './app-router/server/auth'; -import { currentUser } from './app-router/server/currentUser'; -import { authMiddleware } from './server/authMiddleware'; -import { clerkClient } from './server/clerkClient'; -import { getAuth } from './server/getAuth'; -import { redirectToSignIn, redirectToSignUp } from './server/redirect'; - -export { auth, authMiddleware, clerkClient, currentUser, getAuth, redirectToSignIn, redirectToSignUp }; - -export type ServerHelpersServerModuleTypes = { - auth: typeof auth; - currentUser: typeof currentUser; - authMiddleware: typeof authMiddleware; - getAuth: typeof getAuth; - clerkClient: typeof clerkClient; - redirectToSignIn: typeof redirectToSignIn; - redirectToSignUp: typeof redirectToSignUp; -}; 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 f14079b5887..f6dbeba59f2 100644 --- a/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap @@ -2,56 +2,14 @@ exports[`/server public exports should not include a breaking change 1`] = ` [ - "AllowlistIdentifier", - "AuthStatus", - "Client", - "DeletedObject", - "Email", - "EmailAddress", - "ExternalAccount", - "IdentificationLink", - "Invitation", - "OauthAccessToken", - "ObjectType", - "Organization", - "OrganizationInvitation", - "OrganizationMembership", - "OrganizationMembershipPublicUserData", - "PhoneNumber", - "RedirectUrl", - "SMSMessage", - "Session", - "SignInToken", - "Token", - "TokenVerificationError", - "TokenVerificationErrorReason", - "User", - "Verification", "auth", "authMiddleware", "buildClerkProps", - "buildRequestUrl", "clerkClient", - "constants", - "createAuthenticateRequest", - "createClerkClient", - "createIsomorphicRequest", "currentUser", - "debugRequestState", - "decodeJwt", - "deserialize", "getAuth", - "hasValidSignature", - "makeAuthObjectSerializable", - "prunePrivateMetadata", - "redirect", "redirectToSignIn", "redirectToSignUp", - "sanitizeAuthObject", - "signJwt", - "signedInAuthObject", - "signedOutAuthObject", - "verifyJwt", "verifyToken", ] `; diff --git a/packages/nextjs/src/server/authMiddleware.ts b/packages/nextjs/src/server/authMiddleware.ts index c9be134ed43..77f0d306b85 100644 --- a/packages/nextjs/src/server/authMiddleware.ts +++ b/packages/nextjs/src/server/authMiddleware.ts @@ -134,7 +134,7 @@ export interface AuthMiddleware { /** * @deprecated Use `clerkMiddleware` instead. - * Migration guide: https://clerk.com/docs/migration-guides/v5 + * Migration guide: https://clerk.com/docs/upgrade-guides/v5-introduction */ const authMiddleware: AuthMiddleware = (...args: unknown[]) => { const [params = {}] = args as [AuthMiddlewareParams?]; diff --git a/packages/nextjs/src/server/clerkClient.ts b/packages/nextjs/src/server/clerkClient.ts index fc26200d9a4..f16a757b520 100644 --- a/packages/nextjs/src/server/clerkClient.ts +++ b/packages/nextjs/src/server/clerkClient.ts @@ -29,4 +29,3 @@ const clerkClient = createClerkClient({ }); export { clerkClient }; -export * from '@clerk/backend'; diff --git a/packages/nextjs/src/server/index.ts b/packages/nextjs/src/server/index.ts index d19461d34a8..908b4cbc448 100644 --- a/packages/nextjs/src/server/index.ts +++ b/packages/nextjs/src/server/index.ts @@ -1,7 +1,15 @@ -export * from './clerkClient'; +/** + * Generic exports + */ +export { verifyToken, createClerkClient } from '@clerk/backend'; +export type { WebhookEvent, WebhookEventType } from '@clerk/backend'; +export { clerkClient } from './clerkClient'; + +/** + * NextJS-specific exports + */ export { buildClerkProps, getAuth } from './getAuth'; export { redirectToSignIn, redirectToSignUp } from './redirect'; - export { auth } from '../app-router/server/auth'; export { currentUser } from '../app-router/server/currentUser'; export { authMiddleware } from './authMiddleware'; From 84c1a31c5bc1d99d0c030327369a64e3883ace25 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Fri, 15 Dec 2023 00:19:40 +0200 Subject: [PATCH 5/5] chore(repo): Update playground apps --- .../__snapshots__/exports.test.ts.snap | 1 + .../nextjs/app/app-dir/client-component.tsx | 11 ++ playground/nextjs/app/app-dir/page.tsx | 13 +- .../nextjs/pages/session-examples/index.tsx | 26 +--- .../nextjs/pages/user-examples/index.tsx | 35 +---- playground/nextjs12/.eslintrc.json | 4 - playground/nextjs12/.gitignore | 36 ----- playground/nextjs12/README.md | 55 -------- .../nextjs12/app/app-dir/client/page.tsx | 11 -- .../app/app-dir/create-organization/page.tsx | 5 - .../app/app-dir/organization/page.tsx | 10 -- playground/nextjs12/app/app-dir/page.tsx | 43 ------ .../nextjs12/app/app-dir/sign-in/page.tsx | 5 - .../nextjs12/app/app-dir/sign-up/page.tsx | 5 - playground/nextjs12/app/app-dir/user/page.tsx | 5 - playground/nextjs12/app/layout.tsx | 15 -- playground/nextjs12/hooks/useColorScheme.ts | 68 --------- playground/nextjs12/middleware.ts | 23 ---- playground/nextjs12/next-env.d.ts | 5 - playground/nextjs12/next.config.js | 17 --- playground/nextjs12/package.json | 31 ----- playground/nextjs12/pages/_app.tsx | 86 ------------ playground/nextjs12/pages/api/hello-edge.ts | 23 ---- playground/nextjs12/pages/api/hello.ts | 13 -- .../create-organization/[[...index]].tsx | 15 -- playground/nextjs12/pages/index.tsx | 56 -------- .../pages/organization/[[...index]].tsx | 15 -- .../nextjs12/pages/redirect-helpers/index.tsx | 37 ----- .../nextjs12/pages/session-examples/index.tsx | 33 ----- .../nextjs12/pages/sign-in/[[...index]].tsx | 13 -- .../nextjs12/pages/sign-up/[[...index]].tsx | 13 -- .../nextjs12/pages/user-examples/index.tsx | 28 ---- .../nextjs12/pages/user/[[...index]].tsx | 13 -- playground/nextjs12/public/favicon.ico | Bin 25931 -> 0 bytes playground/nextjs12/public/vercel.svg | 4 - playground/nextjs12/styles/Home.module.css | 129 ------------------ playground/nextjs12/styles/globals.css | 33 ----- playground/nextjs12/tsconfig.json | 25 ---- 38 files changed, 16 insertions(+), 944 deletions(-) create mode 100644 playground/nextjs/app/app-dir/client-component.tsx delete mode 100644 playground/nextjs12/.eslintrc.json delete mode 100644 playground/nextjs12/.gitignore delete mode 100644 playground/nextjs12/README.md delete mode 100644 playground/nextjs12/app/app-dir/client/page.tsx delete mode 100644 playground/nextjs12/app/app-dir/create-organization/page.tsx delete mode 100644 playground/nextjs12/app/app-dir/organization/page.tsx delete mode 100644 playground/nextjs12/app/app-dir/page.tsx delete mode 100644 playground/nextjs12/app/app-dir/sign-in/page.tsx delete mode 100644 playground/nextjs12/app/app-dir/sign-up/page.tsx delete mode 100644 playground/nextjs12/app/app-dir/user/page.tsx delete mode 100644 playground/nextjs12/app/layout.tsx delete mode 100644 playground/nextjs12/hooks/useColorScheme.ts delete mode 100644 playground/nextjs12/middleware.ts delete mode 100644 playground/nextjs12/next-env.d.ts delete mode 100644 playground/nextjs12/next.config.js delete mode 100644 playground/nextjs12/package.json delete mode 100644 playground/nextjs12/pages/_app.tsx delete mode 100644 playground/nextjs12/pages/api/hello-edge.ts delete mode 100644 playground/nextjs12/pages/api/hello.ts delete mode 100644 playground/nextjs12/pages/create-organization/[[...index]].tsx delete mode 100644 playground/nextjs12/pages/index.tsx delete mode 100644 playground/nextjs12/pages/organization/[[...index]].tsx delete mode 100644 playground/nextjs12/pages/redirect-helpers/index.tsx delete mode 100644 playground/nextjs12/pages/session-examples/index.tsx delete mode 100644 playground/nextjs12/pages/sign-in/[[...index]].tsx delete mode 100644 playground/nextjs12/pages/sign-up/[[...index]].tsx delete mode 100644 playground/nextjs12/pages/user-examples/index.tsx delete mode 100644 playground/nextjs12/pages/user/[[...index]].tsx delete mode 100644 playground/nextjs12/public/favicon.ico delete mode 100644 playground/nextjs12/public/vercel.svg delete mode 100644 playground/nextjs12/styles/Home.module.css delete mode 100644 playground/nextjs12/styles/globals.css delete mode 100644 playground/nextjs12/tsconfig.json 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 f6dbeba59f2..17c471ccec7 100644 --- a/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap @@ -6,6 +6,7 @@ exports[`/server public exports should not include a breaking change 1`] = ` "authMiddleware", "buildClerkProps", "clerkClient", + "createClerkClient", "currentUser", "getAuth", "redirectToSignIn", diff --git a/playground/nextjs/app/app-dir/client-component.tsx b/playground/nextjs/app/app-dir/client-component.tsx new file mode 100644 index 00000000000..cc286b6ebb1 --- /dev/null +++ b/playground/nextjs/app/app-dir/client-component.tsx @@ -0,0 +1,11 @@ +'use client'; + +import React from 'react'; +import { isClerkAPIResponseError, isEmailLinkError, isKnownError, isMetamaskError } from '@clerk/nextjs/errors'; + +export const ClientComponent = () => { + React.useEffect(() => { + console.log({ isClerkAPIResponseError, isEmailLinkError, isKnownError, isMetamaskError }); + }); + return
Client Component
; +}; diff --git a/playground/nextjs/app/app-dir/page.tsx b/playground/nextjs/app/app-dir/page.tsx index a3c307286c3..208d0ed82fa 100644 --- a/playground/nextjs/app/app-dir/page.tsx +++ b/playground/nextjs/app/app-dir/page.tsx @@ -1,20 +1,11 @@ -import { - auth, - clerkClient, - currentUser, - OrganizationSwitcher, - SignedIn, - SignedOut, - SignIn, - UserButton, -} from '@clerk/nextjs'; +import { OrganizationSwitcher, SignedIn, SignedOut, SignIn, UserButton } from '@clerk/nextjs'; +import { auth, clerkClient, currentUser } from '@clerk/nextjs/server'; import Link from 'next/link'; export default async function Page() { const { userId } = auth(); const currentUser_ = await currentUser(); const user = userId ? await clerkClient.users.getUser(userId) : null; - console.log({ userId, currentUser_, user }); return (
diff --git a/playground/nextjs/pages/session-examples/index.tsx b/playground/nextjs/pages/session-examples/index.tsx index ca392b7c9a5..09827464c4c 100644 --- a/playground/nextjs/pages/session-examples/index.tsx +++ b/playground/nextjs/pages/session-examples/index.tsx @@ -1,4 +1,4 @@ -import { useSession, withSession, WithSession, WithSessionProp } from '@clerk/nextjs'; +import { useSession } from '@clerk/nextjs'; import { PublicUserData } from '@clerk/types'; import type { NextPage } from 'next'; import React from 'react'; @@ -20,36 +20,12 @@ function PublicMetadataWithHook() { return