diff --git a/.changeset/eight-badgers-speak.md b/.changeset/eight-badgers-speak.md new file mode 100644 index 00000000000..596dc350d17 --- /dev/null +++ b/.changeset/eight-badgers-speak.md @@ -0,0 +1,19 @@ +--- +'@clerk/clerk-sdk-node': major +--- + +(Note: This is only relevant if, in the unlikely case, you are using `Clerk` from `@clerk/clerk-sdk-node` directly. If not, you can safely ignore this change.) + +Remove the named `Clerk` import from `@clerk/clerk-sdk-node` and import `createClerkClient` instead. The latter is a factory method to create a Clerk client instance for you. This update aligns usage across our SDKs and will enable us to ship DX improvements better in the future. + +```js +import { Clerk } from '@clerk/clerk-sdk-node'; +const clerk = Clerk({ secretKey: '...' }); +``` + +You need to rename the import from `Clerk` to `createClerkClient` and change its usage: + +```js +import { createClerkClient } from '@clerk/clerk-sdk-node'; +const clerk = createClerkClient({ secretKey: '...' }); +``` diff --git a/.changeset/fuzzy-years-taste.md b/.changeset/fuzzy-years-taste.md new file mode 100644 index 00000000000..e1c45d07397 --- /dev/null +++ b/.changeset/fuzzy-years-taste.md @@ -0,0 +1,20 @@ +--- +'@clerk/backend': major +--- + +Remove the named `Clerk` import from `@clerk/backend` and import `createClerkClient` instead. The latter is a factory method that will create a Clerk client instance for you. This aligns usage across our SDKs and will enable us to better ship DX improvements in the future. + + +Inside your code, search for occurrences like these: + +```js +import { Clerk } from '@clerk/backend'; +const clerk = Clerk({ secretKey: '...' }); +``` + +You need to rename the import from `Clerk` to `createClerkClient` and change its usage: + +```js +import { createClerkClient } from '@clerk/backend'; +const clerk = createClerkClient({ secretKey: '...' }); +``` diff --git a/.changeset/metal-ears-cheat.md b/.changeset/metal-ears-cheat.md new file mode 100644 index 00000000000..c9de773d780 --- /dev/null +++ b/.changeset/metal-ears-cheat.md @@ -0,0 +1,19 @@ +--- +'gatsby-plugin-clerk': major +--- + +Remove the named `Clerk` import from `gatsby-plugin-clerk` and import `createClerkClient` instead. The latter is a factory method to create a Clerk client instance for you. This update aligns usage across our SDKs and will enable us to ship DX improvements better in the future. + +Inside your code, search for occurrences like these: + +```js +import { Clerk } from 'gatsby-plugin-clerk'; +const clerk = Clerk({ secretKey: '...' }); +``` + +You need to rename the import from `Clerk` to `createClerkClient` and change its usage: + +```js +import { createClerkClient } from 'gatsby-plugin-clerk'; +const clerk = createClerkClient({ secretKey: '...' }); +``` diff --git a/.changeset/shiny-pumas-share.md b/.changeset/shiny-pumas-share.md new file mode 100644 index 00000000000..8dfb86b4d82 --- /dev/null +++ b/.changeset/shiny-pumas-share.md @@ -0,0 +1,20 @@ +--- +'@clerk/remix': major +--- + +(Note: This is only relevant if, in the unlikely case, you are using `Clerk` from `@clerk/remix` directly. If not, you can safely ignore this change.) + +Remove the named `Clerk` import from `@clerk/remix` and import `createClerkClient` instead. The latter is a factory method to create a Clerk client instance for you. This update aligns usage across our SDKs and will enable us to ship DX improvements better in the future. + +```js +import { Clerk } from '@clerk/remix'; +const clerk = Clerk({ secretKey: '...' }); +``` + +You need to rename the import from `Clerk` to `createClerkClient` and change its usage: + +```js +import { createClerkClient } from '@clerk/remix'; +const clerk = createClerkClient({ secretKey: '...' }); +``` + diff --git a/.changeset/small-cats-check.md b/.changeset/small-cats-check.md new file mode 100644 index 00000000000..3c980021e22 --- /dev/null +++ b/.changeset/small-cats-check.md @@ -0,0 +1,21 @@ +--- +'@clerk/fastify': major +--- + +(Note: This is only relevant if, in the unlikely case, you are using `Clerk` from `@clerk/fastify` directly. If not, you can safely ignore this change.) + +Remove the named `Clerk` import from `@clerk/fastify` and import `createClerkClient` instead. The latter is a factory method to create a Clerk client instance for you. This update aligns usage across our SDKs and will enable us to ship DX improvements better in the future. + + +```js +import { Clerk } from '@clerk/fastify'; +const clerk = Clerk({ secretKey: '...' }); +``` + +You need to rename the import from `Clerk` to `createClerkClient` and change its usage: + +```js +import { createClerkClient } from '@clerk/fastify'; +const clerk = createClerkClient({ secretKey: '...' }); +``` + diff --git a/.changeset/sour-avocados-sin.md b/.changeset/sour-avocados-sin.md new file mode 100644 index 00000000000..9435b24fee7 --- /dev/null +++ b/.changeset/sour-avocados-sin.md @@ -0,0 +1,20 @@ +--- +'@clerk/nextjs': major +--- + +(Note: This is only relevant if, in the unlikely case, you are using `Clerk` from `@clerk/nextjs` directly. If not, you can safely ignore this change.) + +Remove the named `Clerk` import from `@clerk/nextjs` and import `createClerkClient` instead. The latter is a factory method to create a Clerk client instance for you. This update aligns usage across our SDKs and will enable us to ship DX improvements better in the future. + +```js +import { Clerk } from '@clerk/nextjs'; +const clerk = Clerk({ secretKey: '...' }); +``` + +You need to rename the import from `Clerk` to `createClerkClient` and change its usage: + +```js +import { createClerkClient } from '@clerk/nextjs'; +const clerk = createClerkClient({ secretKey: '...' }); +``` + diff --git a/integration/cleanup/cleanup.setup.ts b/integration/cleanup/cleanup.setup.ts index a3f9c40dee7..ef83b731bcf 100644 --- a/integration/cleanup/cleanup.setup.ts +++ b/integration/cleanup/cleanup.setup.ts @@ -1,5 +1,5 @@ import type { User } from '@clerk/backend'; -import { Clerk } from '@clerk/backend'; +import { createClerkClient } from '@clerk/backend'; import { test as setup } from '@playwright/test'; import { appConfigs } from '../presets/'; @@ -13,7 +13,7 @@ setup('cleanup instances ', async () => { for (const secretKey of secretKeys) { console.log(`Cleanup for ${secretKey.replace(/(sk_test_)(.+)(...)/, '$1***$3')}`); - const clerkClient = Clerk({ secretKey }); + const clerkClient = createClerkClient({ secretKey }); const { data: users, errors } = await clerkClient.users.getUserList({ orderBy: '-created_at', query: 'clerkcookie', diff --git a/integration/testUtils/index.ts b/integration/testUtils/index.ts index 40f63e55e2d..dca7e69139c 100644 --- a/integration/testUtils/index.ts +++ b/integration/testUtils/index.ts @@ -1,4 +1,4 @@ -import { Clerk } from '@clerk/backend'; +import { createClerkClient as backendCreateClerkClient } from '@clerk/backend'; import type { Browser, BrowserContext, Page } from '@playwright/test'; import type { Application } from '../models/application'; @@ -13,7 +13,7 @@ import { createUserService } from './usersService'; export type { FakeUser }; const createClerkClient = (app: Application) => { - return Clerk({ + return backendCreateClerkClient({ secretKey: app.env.privateVariables.get('CLERK_SECRET_KEY'), publishableKey: app.env.publicVariables.get('CLERK_PUBLISHABLE_KEY'), }); diff --git a/packages/backend/README.md b/packages/backend/README.md index 6093b7ab386..797b8b788a5 100644 --- a/packages/backend/README.md +++ b/packages/backend/README.md @@ -55,23 +55,23 @@ npm install @clerk/backend ``` ``` -import { Clerk } from '@clerk/backend'; +import { createClerkClient } from '@clerk/backend'; -const clerk = Clerk({ secretKey: '...' }); +const clerk = createClerkClient({ secretKey: '...' }); await clerk.users.getUser("user_..."); ``` ### API -#### Clerk(options: ClerkOptions) +#### createClerkClient(options: ClerkOptions) Create Clerk SDK that includes an HTTP Rest client for the Backend API and session verification helpers. The clerk object contains the following APIs and methods: ```js -import { Clerk } from '@clerk/backend'; +import { createClerkClient } from '@clerk/backend'; -const clerk = Clerk({ secretKey: '...' }); +const clerk = createClerkClient({ secretKey: '...' }); await clerk.users.getUser('user_...'); diff --git a/packages/backend/src/api/endpoints/InvitationApi.ts b/packages/backend/src/api/endpoints/InvitationApi.ts index 232e7ae3820..85d0b73a77e 100644 --- a/packages/backend/src/api/endpoints/InvitationApi.ts +++ b/packages/backend/src/api/endpoints/InvitationApi.ts @@ -19,8 +19,8 @@ type GetInvitationListParams = { * @example * get all revoked invitations * - * import { Clerk } from '@clerk/backend'; - * const clerkClient = Clerk(...) + * import { createClerkClient } from '@clerk/backend'; + * const clerkClient = createClerkClient(...) * await clerkClient.invitations.getInvitationList({ status: 'revoked }) * */ diff --git a/packages/backend/src/exports.test.ts b/packages/backend/src/exports.test.ts index 7adea6c8e3a..2b8bca5c84a 100644 --- a/packages/backend/src/exports.test.ts +++ b/packages/backend/src/exports.test.ts @@ -10,7 +10,6 @@ export default (QUnit: QUnit) => { const exportedApiKeys = [ 'AllowlistIdentifier', 'AuthStatus', - 'Clerk', 'Client', 'DeletedObject', 'Email', @@ -37,6 +36,7 @@ export default (QUnit: QUnit) => { 'buildRequestUrl', 'constants', 'createAuthenticateRequest', + 'createClerkClient', 'createIsomorphicRequest', 'debugRequestState', 'decodeJwt', diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index f706fb7e374..4b1bcafe9c5 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -25,7 +25,7 @@ export type ClerkOptions = CreateBackendApiOptions & > > & { sdkMetadata?: SDKMetadata; telemetry?: Pick }; -export function Clerk(options: ClerkOptions) { +export function createClerkClient(options: ClerkOptions) { const opts = { ...options }; const apiClient = createBackendApiClient(opts); const requestState = createAuthenticateRequest({ options: opts, apiClient }); diff --git a/packages/fastify/src/clerkClient.test.ts b/packages/fastify/src/clerkClient.test.ts index ece8ccd2aeb..88cdff33ac9 100644 --- a/packages/fastify/src/clerkClient.test.ts +++ b/packages/fastify/src/clerkClient.test.ts @@ -1,11 +1,11 @@ -const ClerkMock = jest.fn(() => { +const createClerkClientMock = jest.fn(() => { return 'clerkClient'; }); jest.mock('@clerk/backend', () => { return { ...jest.requireActual('@clerk/backend'), - Clerk: ClerkMock, + createClerkClient: createClerkClientMock, }; }); @@ -17,7 +17,7 @@ describe('clerk', () => { }); test('initializes clerk with constants', () => { - expect(ClerkMock.mock.calls).toMatchSnapshot(); + expect(createClerkClientMock.mock.calls).toMatchSnapshot(); expect(clerkClient).toEqual('clerkClient'); }); }); diff --git a/packages/fastify/src/clerkClient.ts b/packages/fastify/src/clerkClient.ts index 3e31939e2eb..fc9ee1be39f 100644 --- a/packages/fastify/src/clerkClient.ts +++ b/packages/fastify/src/clerkClient.ts @@ -1,8 +1,8 @@ -import { Clerk } from '@clerk/backend'; +import { createClerkClient } from '@clerk/backend'; import { API_URL, API_VERSION, JWT_KEY, SDK_METADATA, SECRET_KEY } from './constants'; -export const createClerkClient = Clerk; +export { createClerkClient }; export const clerkClient = createClerkClient({ secretKey: SECRET_KEY, diff --git a/packages/fastify/src/withClerkMiddleware.test.ts b/packages/fastify/src/withClerkMiddleware.test.ts index f14f92a1bbf..39490e244c0 100644 --- a/packages/fastify/src/withClerkMiddleware.test.ts +++ b/packages/fastify/src/withClerkMiddleware.test.ts @@ -9,7 +9,7 @@ const localInterstitialMock = jest.fn(); jest.mock('@clerk/backend', () => { return { ...jest.requireActual('@clerk/backend'), - Clerk: () => { + createClerkClient: () => { return { authenticateRequest: (...args: any) => authenticateRequestMock(...args), localInterstitial: (...args: any) => localInterstitialMock(...args), diff --git a/packages/gatsby-plugin-clerk/src/ssr/clerkClient.ts b/packages/gatsby-plugin-clerk/src/ssr/clerkClient.ts index 6cb3e7799d9..ef4ab591462 100644 --- a/packages/gatsby-plugin-clerk/src/ssr/clerkClient.ts +++ b/packages/gatsby-plugin-clerk/src/ssr/clerkClient.ts @@ -1,8 +1,8 @@ -import { Clerk } from '@clerk/backend'; +import { createClerkClient } from '@clerk/backend'; import { API_URL, API_VERSION, SDK_METADATA, SECRET_KEY, TELEMETRY_DEBUG, TELEMETRY_DISABLED } from '../constants'; -const clerkClient = Clerk({ +const clerkClient = createClerkClient({ secretKey: SECRET_KEY, apiUrl: API_URL, apiVersion: API_VERSION, @@ -15,10 +15,5 @@ const clerkClient = Clerk({ }, }); -const createClerkClient = Clerk; - -// eslint-disable-next-line import/export -export { Clerk, clerkClient, createClerkClient }; - -// eslint-disable-next-line import/export +export { clerkClient }; export * from '@clerk/backend'; 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 5c5d740ca18..6c43fefc75b 100644 --- a/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap @@ -4,7 +4,6 @@ exports[`/server public exports should not include a breaking change 1`] = ` [ "AllowlistIdentifier", "AuthStatus", - "Clerk", "Client", "DeletedObject", "Email", diff --git a/packages/nextjs/src/server/clerkClient.ts b/packages/nextjs/src/server/clerkClient.ts index 53ac740b150..fc26200d9a4 100644 --- a/packages/nextjs/src/server/clerkClient.ts +++ b/packages/nextjs/src/server/clerkClient.ts @@ -1,4 +1,4 @@ -import { Clerk } from '@clerk/backend'; +import { createClerkClient } from '@clerk/backend'; import { API_URL, @@ -12,7 +12,7 @@ import { TELEMETRY_DISABLED, } from './constants'; -const clerkClient = Clerk({ +const clerkClient = createClerkClient({ secretKey: SECRET_KEY, apiUrl: API_URL, apiVersion: API_VERSION, @@ -28,10 +28,5 @@ const clerkClient = Clerk({ }, }); -const createClerkClient = Clerk; - -// eslint-disable-next-line import/export -export { Clerk, clerkClient, createClerkClient }; - -// eslint-disable-next-line import/export +export { clerkClient }; export * from '@clerk/backend'; diff --git a/packages/remix/src/api/index.ts b/packages/remix/src/api/index.ts index c04bf4af58b..f5ce35a683b 100644 --- a/packages/remix/src/api/index.ts +++ b/packages/remix/src/api/index.ts @@ -1,7 +1 @@ -import { Clerk } from '@clerk/backend'; - -const createClerkClient = Clerk; - -export { createClerkClient }; - export * from '@clerk/backend'; diff --git a/packages/remix/src/ssr/authenticateRequest.ts b/packages/remix/src/ssr/authenticateRequest.ts index 0e1199b0c30..fb04d5f2e80 100644 --- a/packages/remix/src/ssr/authenticateRequest.ts +++ b/packages/remix/src/ssr/authenticateRequest.ts @@ -1,5 +1,5 @@ import type { RequestState } from '@clerk/backend'; -import { buildRequestUrl, Clerk } from '@clerk/backend'; +import { buildRequestUrl, createClerkClient } from '@clerk/backend'; import { apiUrlFromPublishableKey } from '@clerk/shared/apiUrlFromPublishableKey'; import { handleValueOrFn } from '@clerk/shared/handleValueOrFn'; import { isDevelopmentFromSecretKey } from '@clerk/shared/keys'; @@ -73,7 +73,7 @@ export function authenticateRequest(args: LoaderFunctionArgs, opts: RootAuthLoad throw new Error(satelliteAndMissingSignInUrl); } - return Clerk({ apiUrl, secretKey, jwtKey, proxyUrl, isSatellite, domain }).authenticateRequest({ + return createClerkClient({ apiUrl, secretKey, jwtKey, proxyUrl, isSatellite, domain }).authenticateRequest({ audience, secretKey, jwtKey, diff --git a/packages/sdk-node/src/clerkClient.ts b/packages/sdk-node/src/clerkClient.ts index 01b01ee69d5..d92016af8dc 100644 --- a/packages/sdk-node/src/clerkClient.ts +++ b/packages/sdk-node/src/clerkClient.ts @@ -1,11 +1,11 @@ import type { ClerkOptions, VerifyTokenOptions } from '@clerk/backend'; -import { Clerk as _Clerk, verifyToken as _verifyToken } from '@clerk/backend'; +import { createClerkClient, verifyToken as _verifyToken } from '@clerk/backend'; import { createClerkExpressRequireAuth } from './clerkExpressRequireAuth'; import { createClerkExpressWithAuth } from './clerkExpressWithAuth'; import { loadApiEnv, loadClientEnv } from './utils'; -type ExtendedClerk = ReturnType & { +type ExtendedClerk = ReturnType & { expressWithAuth: ReturnType; expressRequireAuth: ReturnType; verifyToken: (token: string, verifyOpts?: Parameters[1]) => ReturnType; @@ -17,7 +17,7 @@ type ExtendedClerk = ReturnType & { * Arrow functions can never be called with the new keyword because they do not have the [[Construct]] method */ export function Clerk(options: ClerkOptions): ExtendedClerk { - const clerkClient = _Clerk(options); + const clerkClient = createClerkClient(options); const expressWithAuth = createClerkExpressWithAuth({ ...options, clerkClient }); const expressRequireAuth = createClerkExpressRequireAuth({ ...options, clerkClient }); const verifyToken = (token: string, verifyOpts?: VerifyTokenOptions) => { @@ -32,7 +32,7 @@ export function Clerk(options: ClerkOptions): ExtendedClerk { }); } -export const createClerkClient = Clerk; +export { createClerkClient } from '@clerk/backend'; let clerkClientSingleton = {} as unknown as ReturnType; @@ -40,18 +40,18 @@ export const clerkClient = new Proxy(clerkClientSingleton, { get(_target, property) { const hasBeenInitialised = !!clerkClientSingleton.authenticateRequest; if (hasBeenInitialised) { - // @ts-expect-error + // @ts-expect-error - Element implicitly has an 'any' type because expression of type 'string | symbol' can't be used to index type 'ExtendedClerk'. return clerkClientSingleton[property]; } const env = { ...loadApiEnv(), ...loadClientEnv() }; if (env.secretKey) { clerkClientSingleton = Clerk({ ...env, userAgent: '@clerk/clerk-sdk-node' }); - // @ts-expect-error + // @ts-expect-error - Element implicitly has an 'any' type because expression of type 'string | symbol' can't be used to index type 'ExtendedClerk'. return clerkClientSingleton[property]; } - // @ts-expect-error + // @ts-expect-error - Element implicitly has an 'any' type because expression of type 'string | symbol' can't be used to index type 'ExtendedClerk'. return Clerk({ ...env, userAgent: '@clerk/clerk-sdk-node' })[property]; }, set() { diff --git a/packages/sdk-node/src/clerkExpressRequireAuth.ts b/packages/sdk-node/src/clerkExpressRequireAuth.ts index 79ca8f56c90..89632974c34 100644 --- a/packages/sdk-node/src/clerkExpressRequireAuth.ts +++ b/packages/sdk-node/src/clerkExpressRequireAuth.ts @@ -1,4 +1,4 @@ -import type { Clerk } from '@clerk/backend'; +import type { createClerkClient } from '@clerk/backend'; import { authenticateRequest, @@ -10,7 +10,7 @@ import { import type { ClerkMiddlewareOptions, MiddlewareRequireAuthProp, RequireAuthProp } from './types'; export type CreateClerkExpressMiddlewareOptions = { - clerkClient: ReturnType; + clerkClient: ReturnType; secretKey?: string; publishableKey?: string; apiUrl?: string; diff --git a/packages/sdk-node/src/types.ts b/packages/sdk-node/src/types.ts index a39dd5a291d..a4e45e80ad7 100644 --- a/packages/sdk-node/src/types.ts +++ b/packages/sdk-node/src/types.ts @@ -1,4 +1,4 @@ -import type { AuthenticateRequestOptions, AuthObject, Clerk, SignedInAuthObject } from '@clerk/backend'; +import type { AuthenticateRequestOptions, AuthObject, createClerkClient, SignedInAuthObject } from '@clerk/backend'; import type { MultiDomainAndOrProxy } from '@clerk/types'; import type { NextFunction, Request, Response } from 'express'; import type { IncomingMessage } from 'http'; @@ -36,7 +36,7 @@ export type ClerkMiddlewareOptions = { signInUrl?: string; } & MultiDomainAndOrProxy; -export type ClerkClient = ReturnType; +export type ClerkClient = ReturnType; export type AuthenticateRequestParams = { clerkClient: ClerkClient;