From 19bb275962f3a49dcae1090472a083719455fcca Mon Sep 17 00:00:00 2001 From: Dimitris Klouvas Date: Tue, 31 Oct 2023 23:48:13 +0200 Subject: [PATCH 01/23] chore(clerk-react): Drop `frontendApi` --- packages/react/src/errors.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react/src/errors.ts b/packages/react/src/errors.ts index 9ab1690fe69..96be65cf73b 100644 --- a/packages/react/src/errors.ts +++ b/packages/react/src/errors.ts @@ -1,5 +1,6 @@ export { EmailLinkErrorCode, + MagicLinkErrorCode, isClerkAPIResponseError, isEmailLinkError, isKnownError, From bafa9a4cbe621fd089f14a71a145a054118060bf Mon Sep 17 00:00:00 2001 From: Dimitris Klouvas Date: Wed, 1 Nov 2023 00:23:13 +0200 Subject: [PATCH 02/23] chore(clerk-react,chrome-extension): Drop `*MagicLink*` related exports --- packages/react/src/errors.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react/src/errors.ts b/packages/react/src/errors.ts index 96be65cf73b..9ab1690fe69 100644 --- a/packages/react/src/errors.ts +++ b/packages/react/src/errors.ts @@ -1,6 +1,5 @@ export { EmailLinkErrorCode, - MagicLinkErrorCode, isClerkAPIResponseError, isEmailLinkError, isKnownError, From 7bc4b66e3c75cf1515561f3440bfbc974fe154b1 Mon Sep 17 00:00:00 2001 From: Dimitris Klouvas Date: Tue, 7 Nov 2023 19:53:47 +0200 Subject: [PATCH 03/23] chore(clerk-js): Drop `*MagicLink*` related exports --- packages/clerk-js/src/core/clerk.test.ts | 272 +----------------- packages/clerk-js/src/core/clerk.ts | 52 ---- .../src/core/resources/EmailAddress.ts | 37 --- packages/clerk-js/src/core/resources/Error.ts | 3 - .../clerk-js/src/core/resources/SignIn.ts | 44 +-- .../clerk-js/src/core/resources/SignUp.ts | 40 --- .../ui/components/UserProfile/EmailPage.tsx | 4 +- .../src/ui/components/UserProfile/utils.ts | 2 +- 8 files changed, 5 insertions(+), 449 deletions(-) diff --git a/packages/clerk-js/src/core/clerk.test.ts b/packages/clerk-js/src/core/clerk.test.ts index 7db257a5a0e..a6d049722ef 100644 --- a/packages/clerk-js/src/core/clerk.test.ts +++ b/packages/clerk-js/src/core/clerk.test.ts @@ -5,15 +5,7 @@ import { mockNativeRuntime } from '../testUtils'; import Clerk from './clerk'; import { eventBus, events } from './events'; import type { AuthConfig, DisplayConfig, Organization } from './resources/internal'; -import { - BaseResource, - Client, - EmailLinkErrorCode, - Environment, - MagicLinkErrorCode, - SignIn, - SignUp, -} from './resources/internal'; +import { BaseResource, Client, EmailLinkErrorCode, Environment, SignIn, SignUp } from './resources/internal'; import { SessionCookieService } from './services'; import { mockJwt } from './test/fixtures'; @@ -1477,268 +1469,6 @@ describe('Clerk singleton', () => { }); }); - // deprecated: Will be replaced by handleEmailLinkVerification - describe('.handleMagicLinkVerification()', () => { - beforeEach(() => { - mockClientFetch.mockReset(); - mockEnvironmentFetch.mockReset(); - }); - - it('completes the sign in flow if a session was created on this client', async () => { - const createdSessionId = 'sess_123'; - setWindowQueryParams([ - ['__clerk_status', 'verified'], - ['__clerk_created_session', createdSessionId], - ]); - mockClientFetch.mockReturnValue( - Promise.resolve({ - activeSessions: [], - sessions: [{ id: createdSessionId }], - signIn: new SignIn({ - status: 'completed', - } as any as SignInJSON), - signUp: new SignUp(null), - }), - ); - const mockSetActive = jest.fn(); - - const sut = new Clerk(frontendApi); - await sut.load({ - navigate: mockNavigate, - }); - sut.setActive = mockSetActive; - - const redirectUrlComplete = '/redirect-to'; - sut.handleMagicLinkVerification({ redirectUrlComplete }); - - await waitFor(() => { - expect(mockSetActive).toHaveBeenCalledWith({ - session: createdSessionId, - beforeEmit: expect.any(Function), - }); - }); - }); - - it("continues to redirectUrl for sign in that's not completed", async () => { - setWindowQueryParams([['__clerk_status', 'verified']]); - mockClientFetch.mockReturnValue( - Promise.resolve({ - activeSessions: [], - sessions: [], - signIn: new SignIn({ - status: 'needs_second_factor', - } as any as SignInJSON), - signUp: new SignUp(null), - }), - ); - const mockSetActive = jest.fn(); - - const sut = new Clerk(frontendApi); - await sut.load({ - navigate: mockNavigate, - }); - sut.setActive = mockSetActive; - - const redirectUrl = '/2fa'; - sut.handleMagicLinkVerification({ redirectUrl }); - - await waitFor(() => { - expect(mockSetActive).not.toHaveBeenCalled(); - expect(mockNavigate).toHaveBeenCalledWith(redirectUrl); - }); - }); - - it('completes the sign up flow if a session was created on this client', async () => { - const createdSessionId = 'sess_123'; - setWindowQueryParams([ - ['__clerk_status', 'verified'], - ['__clerk_created_session', createdSessionId], - ]); - mockClientFetch.mockReturnValue( - Promise.resolve({ - activeSessions: [], - sessions: [{ id: createdSessionId }], - signUp: new SignUp({ - status: 'completed', - } as any as SignUpJSON), - signIn: new SignIn(null), - }), - ); - const mockSetActive = jest.fn(); - - const sut = new Clerk(frontendApi); - await sut.load({ - navigate: mockNavigate, - }); - sut.setActive = mockSetActive; - - const redirectUrlComplete = '/redirect-to'; - sut.handleMagicLinkVerification({ redirectUrlComplete }); - - await waitFor(() => { - expect(mockSetActive).toHaveBeenCalledWith({ - session: createdSessionId, - beforeEmit: expect.any(Function), - }); - }); - }); - - it("continues the sign up flow for a sign up that's not completed", async () => { - setWindowQueryParams([['__clerk_status', 'verified']]); - mockClientFetch.mockReturnValue( - Promise.resolve({ - activeSessions: [], - sessions: [], - signUp: new SignUp({ - status: 'missing_requirements', - } as any as SignUpJSON), - signIn: new SignIn(null), - }), - ); - const mockSetActive = jest.fn(); - - const sut = new Clerk(frontendApi); - await sut.load({ - navigate: mockNavigate, - }); - sut.setActive = mockSetActive; - - const redirectUrl = '/next-up'; - sut.handleMagicLinkVerification({ redirectUrl }); - - await waitFor(() => { - expect(mockSetActive).not.toHaveBeenCalled(); - expect(mockNavigate).toHaveBeenCalledWith(redirectUrl); - }); - }); - - it('throws an error for expired verification status parameter', async () => { - setWindowQueryParams([['__clerk_status', 'expired']]); - mockClientFetch.mockReturnValue( - Promise.resolve({ - activeSessions: [], - sessions: [], - signUp: new SignUp(null), - signIn: new SignIn(null), - }), - ); - const mockSetActive = jest.fn(); - - const sut = new Clerk(frontendApi); - await sut.load({ - navigate: mockNavigate, - }); - sut.setActive = mockSetActive; - - await expect(async () => { - await sut.handleMagicLinkVerification({}); - }).rejects.toThrow(MagicLinkErrorCode.Expired); - expect(mockSetActive).not.toHaveBeenCalled(); - }); - - it('throws an error for failed verification status parameter', async () => { - setWindowQueryParams([['__clerk_status', 'failed']]); - mockClientFetch.mockReturnValue( - Promise.resolve({ - activeSessions: [], - sessions: [], - signUp: new SignUp(null), - signIn: new SignIn(null), - }), - ); - const mockSetActive = jest.fn(); - - const sut = new Clerk(frontendApi); - await sut.load({ - navigate: mockNavigate, - }); - sut.setActive = mockSetActive; - - await expect(async () => { - await sut.handleMagicLinkVerification({}); - }).rejects.toThrow(MagicLinkErrorCode.Failed); - expect(mockSetActive).not.toHaveBeenCalled(); - }); - - it('runs a callback when verified on other device', async () => { - setWindowQueryParams([ - ['__clerk_status', 'verified'], - ['__clerk_created_session', 'sess_123'], - ]); - mockClientFetch.mockReturnValue( - Promise.resolve({ - activeSessions: [], - sessions: [], - signUp: new SignUp(null), - signIn: new SignIn(null), - }), - ); - const mockSetActive = jest.fn(); - const sut = new Clerk(frontendApi); - await sut.load({ - navigate: mockNavigate, - }); - sut.setActive = mockSetActive; - const res = { ping: 'ping' }; - const cb = () => { - res.ping = 'pong'; - }; - await sut.handleMagicLinkVerification({ onVerifiedOnOtherDevice: cb }); - expect(res.ping).toEqual('pong'); - expect(mockSetActive).not.toHaveBeenCalled(); - }); - - it('throws an error with no status query parameter', async () => { - setWindowQueryParams([['__clerk_created_session', 'sess_123']]); - mockClientFetch.mockReturnValue( - Promise.resolve({ - activeSessions: [], - sessions: [], - signUp: new SignUp(null), - signIn: new SignIn(null), - }), - ); - const mockSetActive = jest.fn(); - const sut = new Clerk(frontendApi); - await sut.load({ - navigate: mockNavigate, - }); - sut.setActive = mockSetActive; - await expect(async () => { - await sut.handleMagicLinkVerification({}); - }).rejects.toThrow(MagicLinkErrorCode.Failed); - expect(mockSetActive).not.toHaveBeenCalled(); - }); - - it('throws an error for invalid status query parameter', async () => { - setWindowQueryParams([ - ['__clerk_status', 'whatever'], - ['__clerk_created_session', 'sess_123'], - ]); - mockClientFetch.mockReturnValue( - Promise.resolve({ - activeSessions: [], - sessions: [{ id: 'sess_123' }], - signIn: new SignIn({ - status: 'completed', - } as any as SignInJSON), - signUp: new SignUp(null), - }), - ); - const mockSetActive = jest.fn(); - const sut = new Clerk(frontendApi); - await sut.load({ - navigate: mockNavigate, - }); - sut.setActive = mockSetActive; - - await expect(async () => { - await sut.handleMagicLinkVerification({}); - }).rejects.toThrow(MagicLinkErrorCode.Failed); - expect(mockSetActive).not.toHaveBeenCalled(); - }); - }); - describe('.handleEmailLinkVerification()', () => { beforeEach(() => { mockClientFetch.mockReset(); diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 83a4f00c2cb..42c740cdf9d 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -29,7 +29,6 @@ import type { EnvironmentJSON, EnvironmentResource, HandleEmailLinkVerificationParams, - HandleMagicLinkVerificationParams, HandleOAuthCallbackParams, InstanceType, ListenerCallback, @@ -113,8 +112,6 @@ import { EmailLinkError, EmailLinkErrorCode, Environment, - MagicLinkError, - MagicLinkErrorCode, Organization, OrganizationMembership, } from './resources/internal'; @@ -845,55 +842,6 @@ export default class Clerk implements ClerkInterface { return; }; - /** - * - * @deprecated Use `handleEmailLinkVerification` instead. - */ - public handleMagicLinkVerification = async ( - params: HandleMagicLinkVerificationParams, - customNavigate?: (to: string) => Promise, - ): Promise => { - deprecated('handleMagicLinkVerification', 'Use `handleEmailLinkVerification` instead.'); - - if (!this.client) { - return; - } - - const verificationStatus = getClerkQueryParam('__clerk_status'); - if (verificationStatus === 'expired') { - throw new MagicLinkError(MagicLinkErrorCode.Expired); - } else if (verificationStatus !== 'verified') { - throw new MagicLinkError(MagicLinkErrorCode.Failed); - } - - const newSessionId = getClerkQueryParam('__clerk_created_session'); - const { signIn, signUp, sessions } = this.client; - - const shouldCompleteOnThisDevice = sessions.some(s => s.id === newSessionId); - const shouldContinueOnThisDevice = - signIn.status === 'needs_second_factor' || signUp.status === 'missing_requirements'; - - const navigate = (to: string) => - customNavigate && typeof customNavigate === 'function' ? customNavigate(to) : this.navigate(to); - - const redirectComplete = params.redirectUrlComplete ? () => navigate(params.redirectUrlComplete as string) : noop; - const redirectContinue = params.redirectUrl ? () => navigate(params.redirectUrl as string) : noop; - - if (shouldCompleteOnThisDevice) { - return this.setActive({ - session: newSessionId, - beforeEmit: redirectComplete, - }); - } else if (shouldContinueOnThisDevice) { - return redirectContinue(); - } - - if (typeof params.onVerifiedOnOtherDevice === 'function') { - params.onVerifiedOnOtherDevice(); - } - return null; - }; - public handleEmailLinkVerification = async ( params: HandleEmailLinkVerificationParams, customNavigate?: (to: string) => Promise, diff --git a/packages/clerk-js/src/core/resources/EmailAddress.ts b/packages/clerk-js/src/core/resources/EmailAddress.ts index 2dbf00cd2a5..24ba7653942 100644 --- a/packages/clerk-js/src/core/resources/EmailAddress.ts +++ b/packages/clerk-js/src/core/resources/EmailAddress.ts @@ -1,15 +1,12 @@ -import { deprecated } from '@clerk/shared/deprecated'; import { Poller } from '@clerk/shared/poller'; import type { AttemptEmailAddressVerificationParams, CreateEmailLinkFlowReturn, - CreateMagicLinkFlowReturn, EmailAddressJSON, EmailAddressResource, IdentificationLinkResource, PrepareEmailAddressVerificationParams, StartEmailLinkFlowParams, - StartMagicLinkFlowParams, VerificationResource, } from '@clerk/types'; @@ -49,40 +46,6 @@ export class EmailAddress extends BaseResource implements EmailAddressResource { body: { code }, }); }; - /** - * @deprecated Use `createEmailLinkFlow` instead. - */ - createMagicLinkFlow = (): CreateMagicLinkFlowReturn => { - deprecated('createMagicLinkFlow', 'Use `createEmailLinkFlow` instead.'); - - const { run, stop } = Poller(); - - const startMagicLinkFlow = async ({ redirectUrl }: StartMagicLinkFlowParams): Promise => { - if (!this.id) { - clerkVerifyEmailAddressCalledBeforeCreate('SignUp'); - } - await this.prepareVerification({ - strategy: 'email_link', - redirectUrl: redirectUrl, - }); - return new Promise((resolve, reject) => { - void run(() => { - return this.reload() - .then(res => { - if (res.verification.status === 'verified') { - stop(); - resolve(res); - } - }) - .catch(err => { - stop(); - reject(err); - }); - }); - }); - }; - return { startMagicLinkFlow, cancelMagicLinkFlow: stop }; - }; createEmailLinkFlow = (): CreateEmailLinkFlowReturn => { const { run, stop } = Poller(); diff --git a/packages/clerk-js/src/core/resources/Error.ts b/packages/clerk-js/src/core/resources/Error.ts index 80ff047b8a5..7d92ccf00b5 100644 --- a/packages/clerk-js/src/core/resources/Error.ts +++ b/packages/clerk-js/src/core/resources/Error.ts @@ -7,11 +7,8 @@ export { isClerkRuntimeError, isEmailLinkError, isKnownError, - isMagicLinkError, isMetamaskError, isUserLockedError, - MagicLinkError, - MagicLinkErrorCode, parseError, parseErrors, } from '@clerk/shared/error'; diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 1cf73b7841d..2d02c9df351 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -1,11 +1,10 @@ -import { deepSnakeToCamel, deprecated, Poller } from '@clerk/shared'; +import { deepSnakeToCamel, Poller } from '@clerk/shared'; import type { AttemptFirstFactorParams, AttemptSecondFactorParams, AuthenticateWithRedirectParams, AuthenticateWithWeb3Params, CreateEmailLinkFlowReturn, - CreateMagicLinkFlowReturn, EmailCodeConfig, EmailLinkConfig, PhoneCodeConfig, @@ -22,7 +21,6 @@ import type { SignInResource, SignInSecondFactor, SignInStartEmailLinkFlowParams, - SignInStartMagicLinkFlowParams, SignInStatus, VerificationResource, Web3SignatureConfig, @@ -121,46 +119,6 @@ export class SignIn extends BaseResource implements SignInResource { action: 'attempt_first_factor', }); }; - /** - * @deprecated Use `createEmailLinkFlow` instead. - */ - createMagicLinkFlow = (): CreateMagicLinkFlowReturn => { - deprecated('createMagicLinkFlow', 'Use `createEmailLinkFlow` instead.'); - - const { run, stop } = Poller(); - - const startMagicLinkFlow = async ({ - emailAddressId, - redirectUrl, - }: SignInStartMagicLinkFlowParams): Promise => { - if (!this.id) { - clerkVerifyEmailAddressCalledBeforeCreate('SignIn'); - } - await this.prepareFirstFactor({ - strategy: 'email_link', - emailAddressId: emailAddressId, - redirectUrl: redirectUrl, - }); - return new Promise((resolve, reject) => { - void run(() => { - return this.reload() - .then(res => { - const status = res.firstFactorVerification.status; - if (status === 'verified' || status === 'expired') { - stop(); - resolve(res); - } - }) - .catch(err => { - stop(); - reject(err); - }); - }); - }); - }; - - return { startMagicLinkFlow, cancelMagicLinkFlow: stop }; - }; createEmailLinkFlow = (): CreateEmailLinkFlowReturn => { const { run, stop } = Poller(); diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 7666fc0a848..17cb19eb276 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -7,7 +7,6 @@ import type { AuthenticateWithRedirectParams, AuthenticateWithWeb3Params, CreateEmailLinkFlowReturn, - CreateMagicLinkFlowReturn, PrepareEmailAddressVerificationParams, PreparePhoneNumberVerificationParams, PrepareVerificationParams, @@ -20,7 +19,6 @@ import type { SignUpStatus, SignUpUpdateParams, StartEmailLinkFlowParams, - StartMagicLinkFlowParams, } from '@clerk/types'; import { generateSignatureWithMetamask, getCaptchaToken, getMetamaskIdentifier, windowNavigate } from '../../utils'; @@ -116,44 +114,6 @@ export class SignUp extends BaseResource implements SignUpResource { return this.attemptVerification({ ...params, strategy: 'email_code' }); }; - /** - * @deprecated Use `createEmailLinkFlow` instead. - */ - createMagicLinkFlow = (): CreateMagicLinkFlowReturn => { - deprecated('createMagicLinkFlow', 'Use `createEmailLinkFlow` instead.'); - - const { run, stop } = Poller(); - - const startMagicLinkFlow = async ({ redirectUrl }: StartMagicLinkFlowParams): Promise => { - if (!this.id) { - clerkVerifyEmailAddressCalledBeforeCreate('SignUp'); - } - await this.prepareEmailAddressVerification({ - strategy: 'email_link', - redirectUrl, - }); - - return new Promise((resolve, reject) => { - void run(() => { - return this.reload() - .then(res => { - const status = res.verifications.emailAddress.status; - if (status === 'verified' || status === 'expired') { - stop(); - resolve(res); - } - }) - .catch(err => { - stop(); - reject(err); - }); - }); - }); - }; - - return { startMagicLinkFlow, cancelMagicLinkFlow: stop }; - }; - createEmailLinkFlow = (): CreateEmailLinkFlowReturn => { const { run, stop } = Poller(); diff --git a/packages/clerk-js/src/ui/components/UserProfile/EmailPage.tsx b/packages/clerk-js/src/ui/components/UserProfile/EmailPage.tsx index 5fe4f654fde..64db4c7bbba 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/EmailPage.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/EmailPage.tsx @@ -8,7 +8,7 @@ import { ContentPage, Form, FormButtons, SuccessPage, useCardState, withCardStat import { useRouter } from '../../router'; import { handleError, useFormControl } from '../../utils'; import { UserProfileBreadcrumbs } from './UserProfileNavbar'; -import { magicLinksEnabledForInstance } from './utils'; +import { emailLinksEnabledForInstance } from './utils'; import { VerifyWithCode } from './VerifyWithCode'; import { VerifyWithLink } from './VerifyWithLink'; @@ -17,7 +17,7 @@ export const EmailPage = withCardStateProvider(() => { const card = useCardState(); const user = useCoreUser(); const environment = useEnvironment(); - const preferEmailLinks = magicLinksEnabledForInstance(environment); + const preferEmailLinks = emailLinksEnabledForInstance(environment); const { params } = useRouter(); const { id } = params || {}; diff --git a/packages/clerk-js/src/ui/components/UserProfile/utils.ts b/packages/clerk-js/src/ui/components/UserProfile/utils.ts index 28c526f7359..2b653e822bb 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/utils.ts +++ b/packages/clerk-js/src/ui/components/UserProfile/utils.ts @@ -10,7 +10,7 @@ export const currentSessionFirst = (id: string) => (a: IDable) => a.id === id ? export const defaultFirst = (a: PhoneNumberResource) => (a.defaultSecondFactor ? -1 : 1); -export function magicLinksEnabledForInstance(env: EnvironmentResource): boolean { +export function emailLinksEnabledForInstance(env: EnvironmentResource): boolean { const { userSettings } = env; const { email_address } = userSettings.attributes; return email_address.enabled && email_address.verifications.includes('email_link'); From fa10b24832ece4e5c61797b5e192a177953d2fc7 Mon Sep 17 00:00:00 2001 From: Dimitris Klouvas Date: Tue, 7 Nov 2023 19:57:35 +0200 Subject: [PATCH 04/23] chore(types): Drop `*MagicLink*` related exports --- packages/types/src/clerk.ts | 30 ------------------------------ packages/types/src/emailAddress.ts | 6 ------ packages/types/src/signIn.ts | 15 --------------- packages/types/src/signUp.ts | 5 ----- packages/types/src/verification.ts | 15 --------------- 5 files changed, 71 deletions(-) diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 044d1b936a4..3b99139e0fd 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -412,15 +412,6 @@ export interface Clerk { customNavigate?: (to: string) => Promise, ) => Promise; - /** - * Completes a Magic Link flow started by {@link Clerk.client.signIn.createMagicLinkFlow} or {@link Clerk.client.signUp.createMagicLinkFlow} - * @deprecated Use `handleEmailLinkVerification` instead. - */ - handleMagicLinkVerification: ( - params: HandleMagicLinkVerificationParams, - customNavigate?: (to: string) => Promise, - ) => Promise; - /** * Completes a Email Link flow started by {@link Clerk.client.signIn.createEmailLinkFlow} or {@link Clerk.client.signUp.createEmailLinkFlow} */ @@ -977,27 +968,6 @@ export type OrganizationListProps = { afterSelectPersonalUrl?: ((user: UserResource) => string) | LooseExtractedParams>; }; -/** - * @deprecated Use `HandleEmailLinkVerificationParams` instead. - */ -export interface HandleMagicLinkVerificationParams { - /** - * Full URL or path to navigate after successful magic link verification - * on completed sign up or sign in on the same device. - */ - redirectUrlComplete?: string; - /** - * Full URL or path to navigate after successful magic link verification - * on the same device, but not completed sign in or sign up. - */ - redirectUrl?: string; - /** - * Callback function to be executed after successful magic link - * verification on another device. - */ - onVerifiedOnOtherDevice?: () => void; -} - export interface HandleEmailLinkVerificationParams { /** * Full URL or path to navigate after successful magic link verification diff --git a/packages/types/src/emailAddress.ts b/packages/types/src/emailAddress.ts index 60b21379583..1d241cd8810 100644 --- a/packages/types/src/emailAddress.ts +++ b/packages/types/src/emailAddress.ts @@ -1,7 +1,6 @@ import type { IdentificationLinkResource } from './identificationLink'; import type { ClerkResource } from './resource'; import type { EmailCodeStrategy, EmailLinkStrategy } from './strategies'; -import type { CreateMagicLinkFlowReturn, StartMagicLinkFlowParams } from './verification'; import type { CreateEmailLinkFlowReturn, StartEmailLinkFlowParams, VerificationResource } from './verification'; export type PrepareEmailAddressVerificationParams = @@ -25,11 +24,6 @@ export interface EmailAddressResource extends ClerkResource { toString: () => string; prepareVerification: (params: PrepareEmailAddressVerificationParams) => Promise; attemptVerification: (params: AttemptEmailAddressVerificationParams) => Promise; - /** - * - * @deprecated Use `createEmailLinkFlow` instead. - */ - createMagicLinkFlow: () => CreateMagicLinkFlowReturn; createEmailLinkFlow: () => CreateEmailLinkFlowReturn; destroy: () => Promise; create: () => Promise; diff --git a/packages/types/src/signIn.ts b/packages/types/src/signIn.ts index a0e04802cdf..25e3d8664a4 100644 --- a/packages/types/src/signIn.ts +++ b/packages/types/src/signIn.ts @@ -58,7 +58,6 @@ import type { TOTPStrategy, Web3Strategy, } from './strategies'; -import type { CreateMagicLinkFlowReturn, StartMagicLinkFlowParams } from './verification'; import type { CreateEmailLinkFlowReturn, StartEmailLinkFlowParams, VerificationResource } from './verification'; import type { AuthenticateWithWeb3Params } from './web3Wallet'; @@ -91,12 +90,6 @@ export interface SignInResource extends ClerkResource { authenticateWithMetamask: () => Promise; - /** - * - * @deprecated Use `createEmailLinkFlow` instead. - */ - createMagicLinkFlow: () => CreateMagicLinkFlowReturn; - createEmailLinkFlow: () => CreateEmailLinkFlowReturn; validatePassword: (password: string, callbacks?: ValidatePasswordCallbacks) => void; @@ -204,14 +197,6 @@ export type ResetPasswordParams = { signOutOfOtherSessions?: boolean; }; -/** - * - * @deprecated Use `SignInStartEmailLinkFlowParams` instead. - */ -export interface SignInStartMagicLinkFlowParams extends StartMagicLinkFlowParams { - emailAddressId: string; -} - export interface SignInStartEmailLinkFlowParams extends StartEmailLinkFlowParams { emailAddressId: string; } diff --git a/packages/types/src/signUp.ts b/packages/types/src/signUp.ts index 024993875ca..d17af00b61f 100644 --- a/packages/types/src/signUp.ts +++ b/packages/types/src/signUp.ts @@ -27,7 +27,6 @@ import type { Web3Strategy, } from './strategies'; import type { SnakeToCamel } from './utils'; -import type { CreateMagicLinkFlowReturn, StartMagicLinkFlowParams } from './verification'; import type { CreateEmailLinkFlowReturn, StartEmailLinkFlowParams, VerificationResource } from './verification'; import type { AttemptWeb3WalletVerificationParams, AuthenticateWithWeb3Params } from './web3Wallet'; @@ -81,10 +80,6 @@ export interface SignUpResource extends ClerkResource { prepareWeb3WalletVerification: () => Promise; attemptWeb3WalletVerification: (params: AttemptWeb3WalletVerificationParams) => Promise; - /** - * @deprecated Use `createEmailLinkFlow` instead. - */ - createMagicLinkFlow: () => CreateMagicLinkFlowReturn; createEmailLinkFlow: () => CreateEmailLinkFlowReturn; diff --git a/packages/types/src/verification.ts b/packages/types/src/verification.ts index cc92ead85ab..f7a1b13293a 100644 --- a/packages/types/src/verification.ts +++ b/packages/types/src/verification.ts @@ -27,25 +27,10 @@ export interface SignatureVerificationAttemptParam { export type VerificationAttemptParams = CodeVerificationAttemptParam | SignatureVerificationAttemptParam; -/** - * @deprecated Use `StarEmailLinkFlowParams` instead. - */ -export interface StartMagicLinkFlowParams { - redirectUrl: string; -} - export interface StartEmailLinkFlowParams { redirectUrl: string; } -/** - * @deprecated Use `CreateEmailLinkFlowReturn` instead. - */ -export type CreateMagicLinkFlowReturn = { - startMagicLinkFlow: (params: Params) => Promise; - cancelMagicLinkFlow: () => void; -}; - export type CreateEmailLinkFlowReturn = { startEmailLinkFlow: (params: Params) => Promise; cancelEmailLinkFlow: () => void; From 22d4acbabcadfe080e061bf5f26efa623a55930d Mon Sep 17 00:00:00 2001 From: Dimitris Klouvas Date: Tue, 7 Nov 2023 20:05:53 +0200 Subject: [PATCH 05/23] chore(clerk-js): Drop `orgs` claim --- packages/clerk-js/src/utils/jwt.ts | 8 -------- packages/types/src/jwt.ts | 7 +------ 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/packages/clerk-js/src/utils/jwt.ts b/packages/clerk-js/src/utils/jwt.ts index e0f96218e7f..6066f25132b 100644 --- a/packages/clerk-js/src/utils/jwt.ts +++ b/packages/clerk-js/src/utils/jwt.ts @@ -1,4 +1,3 @@ -import { deprecatedObjectProperty } from '@clerk/shared/deprecated'; import type { JWT, JWTClaims } from '@clerk/types'; import { urlDecodeB64 } from './encoders'; @@ -24,12 +23,5 @@ export function decode(token: string): JWT { claims, }; - deprecatedObjectProperty( - decodedToken, - 'orgs', - 'Add orgs to your session token using the "user.organizations" shortcode in JWT Templates instead.', - 'decode:orgs', - ); - return decodedToken; } diff --git a/packages/types/src/jwt.ts b/packages/types/src/jwt.ts index 46d50d562e4..8f01e1a6954 100644 --- a/packages/types/src/jwt.ts +++ b/packages/types/src/jwt.ts @@ -11,7 +11,7 @@ export interface JWTHeader { alg: string | Algorithm; typ?: string; cty?: string; - crit?: Array>; + crit?: Array>; kid?: string; jku?: string; x5u?: string | string[]; @@ -69,11 +69,6 @@ export interface ClerkJWTClaims { */ act?: ActJWTClaim; - /** - * @deprecated - Add orgs to your session token using the "user.organizations" shortcode in JWT Templates instead - */ - orgs?: Record; - /** * Active organization id. */ From 5fac548af576ed0aa51ec873cc6dd8474c77db5f Mon Sep 17 00:00:00 2001 From: Dimitris Klouvas Date: Tue, 7 Nov 2023 20:09:23 +0200 Subject: [PATCH 06/23] chore(clerk-js,types): Drop `afterSwitchOrganizationUrl` claim --- .../clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx | 8 +------- packages/types/src/clerk.ts | 6 ------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx index b7bbacb2775..1d1ce8a0840 100644 --- a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx +++ b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx @@ -1,4 +1,4 @@ -import { deprecated, snakeToCamel } from '@clerk/shared'; +import { snakeToCamel } from '@clerk/shared/underscore'; import type { OrganizationResource, UserResource } from '@clerk/types'; import React, { useMemo } from 'react'; @@ -302,12 +302,6 @@ export const useOrganizationSwitcherContext = () => { return navigate(parsedUrl); } - // Continue to support afterSwitchOrganizationUrl - if (ctx.afterSwitchOrganizationUrl) { - deprecated('afterSwitchOrganizationUrl', 'Use `afterSelectOrganizationUrl` or `afterSelectPersonalUrl`'); - return navigate(ctx.afterSwitchOrganizationUrl); - } - return Promise.resolve(); }; diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 3b99139e0fd..c8b6d213e4b 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -853,12 +853,6 @@ export type OrganizationSwitcherProps = { * @default true */ hidePersonal?: boolean; - /** - * Full URL or path to navigate after a successful organization switch. - * @default undefined - * @deprecated use `afterSelectOrganizationUrl` or `afterSelectPersonalUrl` - */ - afterSwitchOrganizationUrl?: string; /** * Full URL or path to navigate after creating a new organization. * @default undefined From 60f6857a3551fde75f80c7f2639d00a4e6ecb841 Mon Sep 17 00:00:00 2001 From: Dimitris Klouvas Date: Tue, 7 Nov 2023 20:57:50 +0200 Subject: [PATCH 07/23] chore(clerk-js): Drop support for `frontendApi` as parameter --- packages/clerk-js/README.md | 9 +- .../clerk-js/src/core/clerk.redirects.test.ts | 20 +-- packages/clerk-js/src/core/clerk.test.ts | 116 +++++++++--------- packages/clerk-js/src/core/clerk.ts | 46 ++++--- packages/clerk-js/src/core/fapiClient.test.ts | 16 ++- packages/clerk-js/src/index.browser.ts | 7 +- .../clerk-js/src/index.headless.browser.ts | 7 +- .../hooks/__tests__/useSupportEmail.test.tsx | 2 +- .../src/ui/utils/test/createFixtures.tsx | 4 +- packages/shared/src/error.ts | 7 -- packages/shared/src/keys.ts | 2 +- packages/types/src/clerk.ts | 6 +- 12 files changed, 108 insertions(+), 134 deletions(-) diff --git a/packages/clerk-js/README.md b/packages/clerk-js/README.md index 8bdf9b8a958..f39f870e388 100644 --- a/packages/clerk-js/README.md +++ b/packages/clerk-js/README.md @@ -49,8 +49,8 @@ Once you have installed the package, you will need to import the ClerkJS object ```js import Clerk from '@clerk/clerk-js'; -const clerkFrontendApi = 'pk_[publishable_key]'; -const clerk = new Clerk(clerkFrontendApi); +const clerkPublishableKey = 'pk_[publishable_key]'; +const clerk = new Clerk(clerkPublishableKey); await clerk.load({ // Set load options here... }); @@ -65,14 +65,13 @@ Add the following script to your site's `` element: ```html