From b625eb3cc93d97eb41420302ab2e5afa6e1de74b Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:02:28 -0500 Subject: [PATCH 1/6] fix(clerk-js): Add private _create method for use inside runAsyncResourceTask --- .changeset/purple-toys-refuse.md | 6 ++++ .../clerk-js/src/core/resources/SignIn.ts | 14 +++++---- .../clerk-js/src/core/resources/SignUp.ts | 30 +++++++++++-------- 3 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 .changeset/purple-toys-refuse.md diff --git a/.changeset/purple-toys-refuse.md b/.changeset/purple-toys-refuse.md new file mode 100644 index 00000000000..124a660ad19 --- /dev/null +++ b/.changeset/purple-toys-refuse.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-js': minor +'@clerk/types': minor +--- + +[Experimental] Fix issue where calling `this.create()` would not correctly propogate errors. diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 4c5279a00ce..b4c80c2ec28 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -703,12 +703,16 @@ class SignInFuture implements SignInFutureResource { }); } + private async _create(params: SignInFutureCreateParams): Promise { + await this.resource.__internal_basePost({ + path: this.resource.pathRoot, + body: params, + }); + } + async create(params: SignInFutureCreateParams): Promise<{ error: unknown }> { return runAsyncResourceTask(this.resource, async () => { - await this.resource.__internal_basePost({ - path: this.resource.pathRoot, - body: params, - }); + await this._create(params); }); } @@ -744,7 +748,7 @@ class SignInFuture implements SignInFutureResource { return runAsyncResourceTask(this.resource, async () => { if (emailAddress) { - await this.create({ identifier: emailAddress }); + await this._create({ identifier: emailAddress }); } const emailCodeFactor = this.selectFirstFactor({ strategy: 'email_code', emailAddressId }); diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 35023047767..19952087dce 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -660,20 +660,24 @@ class SignUpFuture implements SignUpFutureResource { return { captchaToken, captchaWidgetType, captchaError }; } - async create(params: SignUpFutureCreateParams): Promise<{ error: unknown }> { - return runAsyncResourceTask(this.resource, async () => { - const { captchaToken, captchaWidgetType, captchaError } = await this.getCaptchaToken(); + private async _create(params: SignUpFutureCreateParams): Promise { + const { captchaToken, captchaWidgetType, captchaError } = await this.getCaptchaToken(); + + const body: Record = { + transfer: params.transfer, + captchaToken, + captchaWidgetType, + captchaError, + ...params, + unsafeMetadata: params.unsafeMetadata ? normalizeUnsafeMetadata(params.unsafeMetadata) : undefined, + }; - const body: Record = { - transfer: params.transfer, - captchaToken, - captchaWidgetType, - captchaError, - ...params, - unsafeMetadata: params.unsafeMetadata ? normalizeUnsafeMetadata(params.unsafeMetadata) : undefined, - }; + await this.resource.__internal_basePost({ path: this.resource.pathRoot, body }); + } - await this.resource.__internal_basePost({ path: this.resource.pathRoot, body }); + async create(params: SignUpFutureCreateParams): Promise<{ error: unknown }> { + return runAsyncResourceTask(this.resource, async () => { + await this._create(params); }); } @@ -808,7 +812,7 @@ class SignUpFuture implements SignUpFutureResource { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const web3Wallet = identifier || this.resource.web3wallet!; - await this.create({ web3Wallet, unsafeMetadata, legalAccepted }); + await this._create({ web3Wallet, unsafeMetadata, legalAccepted }); await this.resource.__internal_basePost({ body: { strategy }, action: 'prepare_verification', From 58e88c4f6e26881088f7e81562b0b00d70d07ab8 Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:02:46 -0500 Subject: [PATCH 2/6] fix(types): Allow calling create with identifiers --- packages/types/src/signUpFuture.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/types/src/signUpFuture.ts b/packages/types/src/signUpFuture.ts index f33a0764ecb..660d5622f5f 100644 --- a/packages/types/src/signUpFuture.ts +++ b/packages/types/src/signUpFuture.ts @@ -11,6 +11,9 @@ interface SignUpFutureAdditionalParams { } export interface SignUpFutureCreateParams extends SignUpFutureAdditionalParams { + emailAddress?: string; + phoneNumber?: string; + username?: string; transfer?: boolean; ticket?: string; web3Wallet?: string; From 9aae69b910f320dcc86afe0b6d62d7c22fc5d7cc Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:08:01 -0500 Subject: [PATCH 3/6] fix(repo): typo --- .changeset/purple-toys-refuse.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/purple-toys-refuse.md b/.changeset/purple-toys-refuse.md index 124a660ad19..9aa9afd7450 100644 --- a/.changeset/purple-toys-refuse.md +++ b/.changeset/purple-toys-refuse.md @@ -3,4 +3,4 @@ '@clerk/types': minor --- -[Experimental] Fix issue where calling `this.create()` would not correctly propogate errors. +[Experimental] Fix issue where calling `this.create()` would not correctly propagate errors. From 654b95a1768f80bba3ace3e728140a6b53c2832c Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:20:52 -0500 Subject: [PATCH 4/6] fix(clerk-js,types): Use emailAddress parameter name --- .changeset/giant-cats-lay.md | 6 ++++++ packages/clerk-js/src/core/resources/SignIn.ts | 6 +++--- packages/types/src/signInFuture.ts | 10 +++++----- 3 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 .changeset/giant-cats-lay.md diff --git a/.changeset/giant-cats-lay.md b/.changeset/giant-cats-lay.md new file mode 100644 index 00000000000..4164c160b3d --- /dev/null +++ b/.changeset/giant-cats-lay.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-js': minor +'@clerk/types': minor +--- + +[Experimental] Fix `signIn.password` emailAddress parameter name. diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index b4c80c2ec28..d135346e06a 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -717,13 +717,13 @@ class SignInFuture implements SignInFutureResource { } async password(params: SignInFuturePasswordParams): Promise<{ error: unknown }> { - if ([params.identifier, params.email, params.phoneNumber].filter(Boolean).length > 1) { - throw new Error('Only one of identifier, email, or phoneNumber can be provided'); + if ([params.identifier, params.emailAddress, params.phoneNumber].filter(Boolean).length > 1) { + throw new Error('Only one of identifier, emailAddress, or phoneNumber can be provided'); } return runAsyncResourceTask(this.resource, async () => { // TODO @userland-errors: - const identifier = params.identifier || params.email || params.phoneNumber; + const identifier = params.identifier || params.emailAddress || params.phoneNumber; const previousIdentifier = this.resource.identifier; await this.resource.__internal_basePost({ path: this.resource.pathRoot, diff --git a/packages/types/src/signInFuture.ts b/packages/types/src/signInFuture.ts index 343e1320f8d..90d76506880 100644 --- a/packages/types/src/signInFuture.ts +++ b/packages/types/src/signInFuture.ts @@ -15,14 +15,14 @@ export interface SignInFutureCreateParams { export type SignInFuturePasswordParams = | { - identifier: string; password: string; - email?: never; + identifier: string; + emailAddress?: never; phoneNumber?: never; } | { password: string; - email: string; + emailAddress: string; identifier?: never; phoneNumber?: never; } @@ -30,13 +30,13 @@ export type SignInFuturePasswordParams = password: string; phoneNumber: string; identifier?: never; - email?: never; + emailAddress?: never; } | { password: string; phoneNumber?: never; identifier?: never; - email?: never; + emailAddress?: never; }; export type SignInFutureEmailCodeSendParams = From ed078fdb741778fdba7181e74b9ebd6aac935c72 Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:38:09 -0500 Subject: [PATCH 5/6] fix(clerk-js): Replace this.create with this._create --- packages/clerk-js/src/core/resources/SignIn.ts | 8 ++++---- 1 file 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 d135346e06a..981e88f09ec 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -789,7 +789,7 @@ class SignInFuture implements SignInFutureResource { return runAsyncResourceTask(this.resource, async () => { if (emailAddress) { - await this.create({ identifier: emailAddress }); + await this._create({ identifier: emailAddress }); } const emailLinkFactor = this.selectFirstFactor({ strategy: 'email_link', emailAddressId }); @@ -852,7 +852,7 @@ class SignInFuture implements SignInFutureResource { return runAsyncResourceTask(this.resource, async () => { if (phoneNumber) { - await this.create({ identifier: phoneNumber }); + await this._create({ identifier: phoneNumber }); } const phoneCodeFactor = this.selectFirstFactor({ strategy: 'phone_code', phoneNumberId }); @@ -885,7 +885,7 @@ class SignInFuture implements SignInFutureResource { } if (!this.resource.id) { - await this.create({ + await this._create({ strategy, redirectUrl: SignIn.clerk.buildUrlWithAuth(redirectCallbackUrl), actionCompleteRedirectUrl: redirectUrl, @@ -928,7 +928,7 @@ class SignInFuture implements SignInFutureResource { throw new Error(`Unsupported Web3 provider: ${provider}`); } - await this.create({ identifier }); + await this._create({ identifier }); const web3FirstFactor = this.resource.supportedFirstFactors?.find( f => f.strategy === strategy, From 5031aa1a88c7ed918c03e9ccb1f40be1946099c7 Mon Sep 17 00:00:00 2001 From: Dylan Staley <88163+dstaley@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:45:55 -0500 Subject: [PATCH 6/6] fix(clerk-js): Make redirectUrl absolute --- packages/clerk-js/src/core/resources/SignIn.ts | 17 +++++++++++------ packages/clerk-js/src/core/resources/SignUp.ts | 10 +++++++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 981e88f09ec..e72b9490851 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -884,14 +884,19 @@ class SignInFuture implements SignInFutureResource { throw new Error('modal flow is not supported yet'); } - if (!this.resource.id) { - await this._create({ - strategy, - redirectUrl: SignIn.clerk.buildUrlWithAuth(redirectCallbackUrl), - actionCompleteRedirectUrl: redirectUrl, - }); + let actionCompleteRedirectUrl = redirectUrl; + try { + new URL(redirectUrl); + } catch { + actionCompleteRedirectUrl = window.location.origin + redirectUrl; } + await this._create({ + strategy, + redirectUrl: SignIn.clerk.buildUrlWithAuth(redirectCallbackUrl), + actionCompleteRedirectUrl, + }); + const { status, externalVerificationRedirectURL } = this.resource.firstFactorVerification; if (status === 'unverified' && externalVerificationRedirectURL) { diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 19952087dce..bac10783b6e 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -760,12 +760,20 @@ class SignUpFuture implements SignUpFutureResource { const { strategy, redirectUrl, redirectCallbackUrl } = params; return runAsyncResourceTask(this.resource, async () => { const { captchaToken, captchaWidgetType, captchaError } = await this.getCaptchaToken(); + + let redirectUrlComplete = redirectUrl; + try { + new URL(redirectUrl); + } catch { + redirectUrlComplete = window.location.origin + redirectUrl; + } + await this.resource.__internal_basePost({ path: this.resource.pathRoot, body: { strategy, redirectUrl: SignUp.clerk.buildUrlWithAuth(redirectCallbackUrl), - redirectUrlComplete: redirectUrl, + redirectUrlComplete, captchaToken, captchaWidgetType, captchaError,