From a22476f9332fb5993b6ec44ddeb2dcd9fc19f602 Mon Sep 17 00:00:00 2001 From: austincalvelage Date: Wed, 7 Jan 2026 10:06:55 -0700 Subject: [PATCH 1/3] Add ability for optional password --- packages/clerk-js/src/core/resources/UserSettings.ts | 2 +- .../src/core/resources/__tests__/UserSettings.test.ts | 11 +++++++++++ .../UserProfile/__tests__/SecurityPage.test.tsx | 4 +--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/clerk-js/src/core/resources/UserSettings.ts b/packages/clerk-js/src/core/resources/UserSettings.ts index 8af85ab38c8..ed5951b7037 100644 --- a/packages/clerk-js/src/core/resources/UserSettings.ts +++ b/packages/clerk-js/src/core/resources/UserSettings.ts @@ -191,7 +191,7 @@ export class UserSettings extends BaseResource implements UserSettingsResource { } get instanceIsPasswordBased() { - return Boolean(this.attributes?.password?.enabled && this.attributes.password?.required); + return Boolean(this.attributes?.password?.enabled); } get hasValidAuthFactor() { diff --git a/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts b/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts index e3ec7d04cca..13cf34b54d8 100644 --- a/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts +++ b/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts @@ -76,6 +76,17 @@ describe('UserSettings', () => { }, } as any as UserSettingsJSON); expect(sut.instanceIsPasswordBased).toEqual(false); + + expect(sut.instanceIsPasswordBased).toEqual(true); + + sut = new UserSettings({ + attributes: { + password: { + enabled: false, + required: false, + }, + }, + } as any as UserSettingsJSON); }); it('respects default values for min and max password length', function () { diff --git a/packages/clerk-js/src/ui/components/UserProfile/__tests__/SecurityPage.test.tsx b/packages/clerk-js/src/ui/components/UserProfile/__tests__/SecurityPage.test.tsx index 47f8004c652..d74c50398f5 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/__tests__/SecurityPage.test.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/__tests__/SecurityPage.test.tsx @@ -33,9 +33,7 @@ describe('SecurityPage', () => { it('renders the Password section if instance is password based', async () => { const { wrapper, fixtures } = await createFixtures(f => { - f.withPassword({ - required: true, - }); + f.withPassword(); f.withUser({ email_addresses: ['test@clerk.com'] }); }); fixtures.clerk.user?.getSessions.mockReturnValue(Promise.resolve([])); From 0122cfad9ac1421911fcf15858db67f92cc35c02 Mon Sep 17 00:00:00 2001 From: austincalvelage Date: Wed, 7 Jan 2026 10:10:04 -0700 Subject: [PATCH 2/3] Add changeset --- .changeset/moody-bugs-film.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/moody-bugs-film.md diff --git a/.changeset/moody-bugs-film.md b/.changeset/moody-bugs-film.md new file mode 100644 index 00000000000..86a399faca8 --- /dev/null +++ b/.changeset/moody-bugs-film.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': minor +--- + +When password is enabled at the instance level, but not required allow users to add a password in the user profile. From 711c30b87e9288d82e5bfd6a009c1f4e747675af Mon Sep 17 00:00:00 2001 From: austincalvelage Date: Wed, 7 Jan 2026 10:26:39 -0700 Subject: [PATCH 3/3] Fix test --- .../src/core/resources/__tests__/UserSettings.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts b/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts index 13cf34b54d8..e87df8e5028 100644 --- a/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts +++ b/packages/clerk-js/src/core/resources/__tests__/UserSettings.test.ts @@ -75,8 +75,6 @@ describe('UserSettings', () => { }, }, } as any as UserSettingsJSON); - expect(sut.instanceIsPasswordBased).toEqual(false); - expect(sut.instanceIsPasswordBased).toEqual(true); sut = new UserSettings({ @@ -87,6 +85,8 @@ describe('UserSettings', () => { }, }, } as any as UserSettingsJSON); + + expect(sut.instanceIsPasswordBased).toEqual(false); }); it('respects default values for min and max password length', function () {