From 33e1be94a737575ff94cd5434b9c3e231181389d Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Thu, 18 Sep 2025 14:31:10 -0500 Subject: [PATCH 1/5] feat(clerk-js,types): Add support for ticket sign-ins and sign-ups --- .changeset/two-mangos-rest.md | 6 ++++++ packages/clerk-js/src/core/resources/SignIn.ts | 6 ++++++ packages/clerk-js/src/core/resources/SignUp.ts | 7 +++++++ packages/types/src/signInFuture.ts | 12 +++++++++++- packages/types/src/signUpFuture.ts | 12 +++++++++++- 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 .changeset/two-mangos-rest.md diff --git a/.changeset/two-mangos-rest.md b/.changeset/two-mangos-rest.md new file mode 100644 index 00000000000..8512d779a0d --- /dev/null +++ b/.changeset/two-mangos-rest.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-js': minor +'@clerk/types': minor +--- + +[Experimental] Add support for ticket sign-ins and sign-ups diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index e9b652336bb..4c7b2fafb52 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -44,6 +44,7 @@ import type { SignInFutureResetPasswordSubmitParams, SignInFutureResource, SignInFutureSSOParams, + SignInFutureTicketParams, SignInFutureTOTPVerifyParams, SignInIdentifier, SignInJSON, @@ -914,6 +915,11 @@ class SignInFuture implements SignInFutureResource { }); } + async ticket(params: SignInFutureTicketParams = {}): Promise<{ error: unknown }> { + const ticket = params.ticket ?? getClerkQueryParam('__clerk_ticket'); + return this.create({ ticket: ticket ?? undefined }); + } + async finalize(params?: SignInFutureFinalizeParams): Promise<{ error: unknown }> { const { navigate } = params || {}; return runAsyncResourceTask(this.resource, async () => { diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 6948345274a..0ed77f42384 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -25,6 +25,7 @@ import type { SignUpFuturePhoneCodeVerifyParams, SignUpFutureResource, SignUpFutureSSOParams, + SignUpFutureTicketParams, SignUpFutureUpdateParams, SignUpIdentificationField, SignUpJSON, @@ -44,6 +45,7 @@ import { generateSignatureWithMetamask, generateSignatureWithOKXWallet, getBaseIdentifier, + getClerkQueryParam, getCoinbaseWalletIdentifier, getMetamaskIdentifier, getOKXWalletIdentifier, @@ -773,6 +775,11 @@ class SignUpFuture implements SignUpFutureResource { }); } + async ticket(params: SignUpFutureTicketParams = {}): Promise<{ error: unknown }> { + const ticket = params.ticket ?? getClerkQueryParam('__clerk_ticket'); + return this.create({ ticket: ticket ?? undefined }); + } + async finalize(params?: SignUpFutureFinalizeParams): Promise<{ error: unknown }> { const { navigate } = params || {}; return runAsyncResourceTask(this.resource, async () => { diff --git a/packages/types/src/signInFuture.ts b/packages/types/src/signInFuture.ts index 3e437740899..47c2931c080 100644 --- a/packages/types/src/signInFuture.ts +++ b/packages/types/src/signInFuture.ts @@ -10,6 +10,7 @@ export interface SignInFutureCreateParams { redirectUrl?: string; actionCompleteRedirectUrl?: string; transfer?: boolean; + ticket?: string; } export type SignInFuturePasswordParams = @@ -110,6 +111,10 @@ export interface SignInFutureBackupCodeVerifyParams { code: string; } +export interface SignInFutureTicketParams { + ticket: string; +} + export interface SignInFutureFinalizeParams { navigate?: SetActiveNavigate; } @@ -266,7 +271,12 @@ export interface SignInFutureResource { }; /** - * Used to convert a sign-in with `status === ‘complete’` into an active session. Will cause anything observing the + * Used to perform a ticket-based sign-in. + */ + ticket: (params: SignInFutureTicketParams) => Promise<{ error: unknown }>; + + /** + * Used to convert a sign-in with `status === 'complete'` into an active session. Will cause anything observing the * session state (such as the `useUser()` hook) to update automatically. */ finalize: (params?: SignInFutureFinalizeParams) => Promise<{ error: unknown }>; diff --git a/packages/types/src/signUpFuture.ts b/packages/types/src/signUpFuture.ts index e3f47eecfb4..076b4b74784 100644 --- a/packages/types/src/signUpFuture.ts +++ b/packages/types/src/signUpFuture.ts @@ -11,6 +11,7 @@ interface SignUpFutureAdditionalParams { export interface SignUpFutureCreateParams extends SignUpFutureAdditionalParams { transfer?: boolean; + ticket?: string; } // This will likely get more properties @@ -50,6 +51,10 @@ export interface SignUpFutureSSOParams { redirectCallbackUrl: string; } +export interface SignUpFutureTicketParams extends SignUpFutureAdditionalParams { + ticket: string; +} + export interface SignUpFutureFinalizeParams { navigate?: SetActiveNavigate; } @@ -116,7 +121,12 @@ export interface SignUpFutureResource { sso: (params: SignUpFutureSSOParams) => Promise<{ error: unknown }>; /** - * Used to convert a sign-up with `status === ‘complete’` into an active session. Will cause anything observing the + * Used to perform a ticket-based sign-up. + */ + ticket: (params: SignUpFutureTicketParams) => Promise<{ error: unknown }>; + + /** + * Used to convert a sign-up with `status === 'complete'` into an active session. Will cause anything observing the * session state (such as the `useUser()` hook) to update automatically. */ finalize: (params?: SignUpFutureFinalizeParams) => Promise<{ error: unknown }>; From 268276beec5286caccb2f4f9b9f96e512ee07ddf Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:01:29 -0500 Subject: [PATCH 2/5] fix(clerk-js): Fix function param type --- packages/clerk-js/src/core/resources/SignIn.ts | 4 ++-- packages/clerk-js/src/core/resources/SignUp.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 4c7b2fafb52..a1daf140c1d 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -915,8 +915,8 @@ class SignInFuture implements SignInFutureResource { }); } - async ticket(params: SignInFutureTicketParams = {}): Promise<{ error: unknown }> { - const ticket = params.ticket ?? getClerkQueryParam('__clerk_ticket'); + async ticket(params?: SignInFutureTicketParams): Promise<{ error: unknown }> { + const ticket = params?.ticket ?? getClerkQueryParam('__clerk_ticket'); return this.create({ ticket: ticket ?? undefined }); } diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 0ed77f42384..d9005b1f58a 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -775,8 +775,8 @@ class SignUpFuture implements SignUpFutureResource { }); } - async ticket(params: SignUpFutureTicketParams = {}): Promise<{ error: unknown }> { - const ticket = params.ticket ?? getClerkQueryParam('__clerk_ticket'); + async ticket(params?: SignUpFutureTicketParams): Promise<{ error: unknown }> { + const ticket = params?.ticket ?? getClerkQueryParam('__clerk_ticket'); return this.create({ ticket: ticket ?? undefined }); } From 0a099ed4ce76eefe97ca332009ab44b0623e64c6 Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:08:46 -0500 Subject: [PATCH 3/5] fix(clerk-react): Add ticket methods to stateProxy --- packages/react/src/stateProxy.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react/src/stateProxy.ts b/packages/react/src/stateProxy.ts index bbef14d3ee7..41119f891c5 100644 --- a/packages/react/src/stateProxy.ts +++ b/packages/react/src/stateProxy.ts @@ -91,6 +91,7 @@ export class StateProxy implements State { 'verifyTOTP', 'verifyBackupCode', ] as const), + ticket: this.gateMethod(target, 'ticket'), }, }; } @@ -119,6 +120,7 @@ export class StateProxy implements State { update: gateMethod(target, 'update'), sso: gateMethod(target, 'sso'), password: gateMethod(target, 'password'), + ticket: gateMethod(target, 'ticket'), finalize: gateMethod(target, 'finalize'), verifications: wrapMethods(() => target().verifications, [ From aa1a4c46f3250681852e65d4e3e44c774bb0c3e0 Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:23:39 -0500 Subject: [PATCH 4/5] fix(clerk-js): Pass through additional params for signUp.ticket --- packages/clerk-js/src/core/resources/SignUp.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index d9005b1f58a..61bd6cec668 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -777,7 +777,7 @@ class SignUpFuture implements SignUpFutureResource { async ticket(params?: SignUpFutureTicketParams): Promise<{ error: unknown }> { const ticket = params?.ticket ?? getClerkQueryParam('__clerk_ticket'); - return this.create({ ticket: ticket ?? undefined }); + return this.create({ ...params, ticket: ticket ?? undefined }); } async finalize(params?: SignUpFutureFinalizeParams): Promise<{ error: unknown }> { From ab0d83cb99a55704877189e034cf430076ad7f45 Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:24:49 -0500 Subject: [PATCH 5/5] fix(types): Mark ticket params as optional --- packages/types/src/signInFuture.ts | 2 +- packages/types/src/signUpFuture.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/types/src/signInFuture.ts b/packages/types/src/signInFuture.ts index 47c2931c080..7b49ecae111 100644 --- a/packages/types/src/signInFuture.ts +++ b/packages/types/src/signInFuture.ts @@ -273,7 +273,7 @@ export interface SignInFutureResource { /** * Used to perform a ticket-based sign-in. */ - ticket: (params: SignInFutureTicketParams) => Promise<{ error: unknown }>; + ticket: (params?: SignInFutureTicketParams) => Promise<{ error: unknown }>; /** * Used to convert a sign-in with `status === 'complete'` into an active session. Will cause anything observing the diff --git a/packages/types/src/signUpFuture.ts b/packages/types/src/signUpFuture.ts index 076b4b74784..f9c647e3ff6 100644 --- a/packages/types/src/signUpFuture.ts +++ b/packages/types/src/signUpFuture.ts @@ -123,7 +123,7 @@ export interface SignUpFutureResource { /** * Used to perform a ticket-based sign-up. */ - ticket: (params: SignUpFutureTicketParams) => Promise<{ error: unknown }>; + ticket: (params?: SignUpFutureTicketParams) => Promise<{ error: unknown }>; /** * Used to convert a sign-up with `status === 'complete'` into an active session. Will cause anything observing the