Skip to content
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
7877887
@W-20279798 support setting passwordless login mode in config (#3492)
hajinsuha1 Dec 10, 2025
22b6a36
Merge branch 'develop' into feature/email-otp
hajinsuha1 Dec 17, 2025
c646e44
@W-20443849 Set default passwordless mode to 'email' for apps created…
hajinsuha1 Dec 22, 2025
bd6d1d0
Merge branch 'develop' into feature/email-otp
hajinsuha1 Dec 29, 2025
11be87e
@W-20342599 Password Reset uses `email` mode (#3547)
hajinsuha1 Jan 2, 2026
d9ed864
@W-20279800 Update Passwordless E2E tests and change "Continue Secure…
hajinsuha1 Jan 8, 2026
07802f3
Merge branch 'develop' into feature/email-otp
hajinsuha1 Jan 9, 2026
c0aedcb
lint
hajinsuha1 Jan 9, 2026
3d27d0b
fix incorrect resetPasswordLandingPath in usePasswordReset after merg…
hajinsuha1 Jan 12, 2026
e49c9be
Merge branch 'develop' into feature/email-otp
hajinsuha1 Jan 12, 2026
3cfece1
fix failing unit test after merge from develop
hajinsuha1 Jan 12, 2026
c02836d
Merge branch 'develop' into feature/email-otp
hajinsuha1 Jan 13, 2026
3d79932
@W-20890250 Handle request limit and monthly quota error states for p…
hajinsuha1 Jan 16, 2026
892ef8c
Merge branch 'develop' into feature/email-otp
hajinsuha1 Jan 16, 2026
076b1ac
refactor auth so locale is sent via parameters instead of in the Auth…
hajinsuha1 Jan 21, 2026
b0ca814
Refactor URL handling by replacing buildAbsoluteUrl with absoluteUrl …
hajinsuha1 Jan 21, 2026
3c05026
Merge branch 'develop' into feature/email-otp
hajinsuha1 Jan 22, 2026
36e1b20
Update error message when shopper exceedes request limit for password…
hajinsuha1 Jan 22, 2026
3e9e385
Merge branch 'feature/email-otp' of https://github.com/SalesforceComm…
hajinsuha1 Jan 22, 2026
abff98d
Apply suggestion from @alexvuong
hajinsuha1 Jan 22, 2026
fe0a623
address feedback:
hajinsuha1 Jan 23, 2026
5f31e30
Merge branch 'feature/email-otp' of https://github.com/SalesforceComm…
hajinsuha1 Jan 23, 2026
bc6f621
lint
hajinsuha1 Jan 23, 2026
c766b59
Merge branch 'develop' into feature/email-otp
hajinsuha1 Jan 26, 2026
f4852df
update copyright date for new files
hajinsuha1 Jan 26, 2026
12a235d
Merge branch 'develop' into feature/email-otp
hajinsuha1 Jan 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions e2e/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ module.exports = {
PWA_E2E_USER_EMAIL: process.env.PWA_E2E_USER_EMAIL,
PWA_E2E_USER_PASSWORD: process.env.PWA_E2E_USER_PASSWORD,
EXTRA_FEATURES_E2E_RETAIL_APP_HOME:
process.env.EXTRA_FEATURES_E2E_RETAIL_APP_HOME ||
'https://scaffold-pwa-extra-features-e2e.mobify-storefront.com',
EXTRA_FEATURES_E2E_RETAIL_APP_HOME_SITE: 'RefArchGlobal'
}
19 changes: 7 additions & 12 deletions e2e/tests/desktop/extra-features.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ test('Verify passwordless login request', async ({page}) => {
await page.locator('#email').scrollIntoViewIfNeeded()
await page.fill('#email', config.PWA_E2E_USER_EMAIL)

await page.getByRole('button', {name: 'Continue Securely'}).click()
await page.getByRole('button', {name: 'Continue'}).click()

await page.waitForResponse(
'**/mobify/slas/private/shopper/auth/v1/organizations/*/oauth2/passwordless/login'
Expand All @@ -47,12 +47,11 @@ test('Verify passwordless login request', async ({page}) => {
const params = new URLSearchParams(postData)

expect(params.get('user_id')).toBe(config.PWA_E2E_USER_EMAIL)
expect(params.get('mode')).toBe('callback')
expect(params.get('mode')).toBe('email')
expect(params.get('channel_id')).toBe(config.EXTRA_FEATURES_E2E_RETAIL_APP_HOME_SITE)
expect(params.get('callback_uri')).toMatch(/.*\/passwordless-login-callback$/)
})

test('Verify password reset callback request', async ({page}) => {
test('Verify password reset request', async ({page}) => {
let interceptedRequest = null

await page.route(
Expand Down Expand Up @@ -88,16 +87,13 @@ test('Verify password reset callback request', async ({page}) => {
const params = new URLSearchParams(postData)

expect(params.get('user_id')).toBe(config.PWA_E2E_USER_EMAIL)
expect(params.get('mode')).toBe('callback')
expect(params.get('mode')).toBe('email')
expect(params.get('channel_id')).toBe(config.EXTRA_FEATURES_E2E_RETAIL_APP_HOME_SITE)
expect(params.get('callback_uri')).toMatch(/.*\/reset-password-callback$/)
expect(params.get('hint')).toBe('cross_device')
})

// Verify on the login UI that looks different when extra login features are not enabled
test('Verify password reset callback request when extra login features are not enabled', async ({
page
}) => {
test('Verify password reset request when extra login features are not enabled', async ({page}) => {
let interceptedRequest = null

await page.route(
Expand Down Expand Up @@ -132,13 +128,12 @@ test('Verify password reset callback request when extra login features are not e
const params = new URLSearchParams(postData)

expect(params.get('user_id')).toBe(config.PWA_E2E_USER_EMAIL)
expect(params.get('mode')).toBe('callback')
expect(params.get('mode')).toBe('email')
expect(params.get('channel_id')).toBe(config.RETAIL_APP_HOME_SITE)
expect(params.get('callback_uri')).toMatch(/.*\/reset-password-callback$/)
expect(params.get('hint')).toBe('cross_device')
})

test('Verify password reset request', async ({page}) => {
test('Verify password reset action request', async ({page}) => {
let interceptedRequest = null
await page.route(
'**/mobify/slas/private/shopper/auth/v1/organizations/*/oauth2/password/action',
Expand Down
21 changes: 8 additions & 13 deletions e2e/tests/mobile/extra-features.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ test('Verify passwordless login request on mobile', async ({page}) => {
await page.locator('#email').scrollIntoViewIfNeeded()
await page.fill('#email', config.PWA_E2E_USER_EMAIL)

await page.getByRole('button', {name: 'Continue Securely'}).scrollIntoViewIfNeeded()
await page.getByRole('button', {name: 'Continue Securely'}).click()
await page.getByRole('button', {name: 'Continue'}).scrollIntoViewIfNeeded()
await page.getByRole('button', {name: 'Continue'}).click()

await page.waitForResponse(
'**/mobify/slas/private/shopper/auth/v1/organizations/*/oauth2/passwordless/login'
Expand All @@ -49,14 +49,11 @@ test('Verify passwordless login request on mobile', async ({page}) => {
const params = new URLSearchParams(postData)

expect(params.get('user_id')).toBe(config.PWA_E2E_USER_EMAIL)
expect(params.get('mode')).toBe('callback')
expect(params.get('mode')).toBe('email')
expect(params.get('channel_id')).toBe(config.EXTRA_FEATURES_E2E_RETAIL_APP_HOME_SITE)
expect(params.get('callback_uri')).toMatch(/.*\/passwordless-login-callback$/)
})

test('Verify password reset callback request on mobile (extra features enabled)', async ({
page
}) => {
test('Verify password reset request on mobile (extra features enabled)', async ({page}) => {
let interceptedRequest = null

await page.route(
Expand Down Expand Up @@ -92,13 +89,12 @@ test('Verify password reset callback request on mobile (extra features enabled)'
const params = new URLSearchParams(postData)

expect(params.get('user_id')).toBe(config.PWA_E2E_USER_EMAIL)
expect(params.get('mode')).toBe('callback')
expect(params.get('mode')).toBe('email')
expect(params.get('channel_id')).toBe(config.EXTRA_FEATURES_E2E_RETAIL_APP_HOME_SITE)
expect(params.get('callback_uri')).toMatch(/.*\/reset-password-callback$/)
expect(params.get('hint')).toBe('cross_device')
})

test('Verify password reset callback request on mobile when extra login features are not enabled', async ({
test('Verify password reset request on mobile when extra login features are not enabled', async ({
page
}) => {
let interceptedRequest = null
Expand Down Expand Up @@ -136,13 +132,12 @@ test('Verify password reset callback request on mobile when extra login features
const params = new URLSearchParams(postData)

expect(params.get('user_id')).toBe(config.PWA_E2E_USER_EMAIL)
expect(params.get('mode')).toBe('callback')
expect(params.get('mode')).toBe('email')
expect(params.get('channel_id')).toBe(config.RETAIL_APP_HOME_SITE)
expect(params.get('callback_uri')).toMatch(/.*\/reset-password-callback$/)
expect(params.get('hint')).toBe('cross_device')
})

test('Verify password reset request on mobile', async ({page}) => {
test('Verify password reset action request on mobile', async ({page}) => {
let interceptedRequest = null
await page.route(
'**/mobify/slas/private/shopper/auth/v1/organizations/*/oauth2/password/action',
Expand Down
5 changes: 5 additions & 0 deletions packages/commerce-sdk-react/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
- [Bugfix]Ensure code_verifier can be optional in resetPassword call [#3567](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3567)
- [Improvement] Strengthening typescript types on custom endpoint options and fetchOptions types [#3589](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3589)

- Update `authorizePasswordless` to pass locale and simplify mode selection to respect user's explicit mode choice while still defaulting to callback mode for backward compatibility [#3492](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3492)
- Update `getPasswordResetToken` to pass locale, callback_uri and idp_name only when they are defined [#3547](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3547)
- Update `resetPassword` to default hint to `cross_device` and pass code_verifier only when it is defined [#3547](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3547)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's bundle these up into one feature PR (this one since this feature branch has all the code changes). customers do not need to know about non-feature branches.

- Update `getPasswordResetToken` to return raw response and throw an error with the error message if the status code is not 200 [#3574](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3574)

## v4.3.0 (Dec 17, 2025)

- Upgrade to commerce-sdk-isomorphic v4.2.0 and introduce Shopper Configurations SCAPI integration [#3071](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3071)
Expand Down
Loading
Loading