Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
82a1c25
remove node 18 from e2e matrix
kevinxh Oct 14, 2025
0c9accf
use larger runner for e2e tests
kevinxh Oct 14, 2025
b211df3
undo large ubuntu runner
kevinxh Oct 14, 2025
34adcfb
Merge branch 'develop' into improve-e2e-stability
kevinxh Oct 14, 2025
41a5a1d
Fix footer heading semantic consistency and alignment
sf-cboscenco Oct 14, 2025
17a0ddb
Fix accessibility compliance by adding proper h1 headings to checkout…
sf-cboscenco Oct 15, 2025
780f824
Added changelog entry.
sf-cboscenco Oct 15, 2025
014cef1
Fix more a11y issues on various pages
sf-cboscenco Oct 15, 2025
0337719
Update compiled translations with new accessibility h1 heading keys
sf-cboscenco Oct 15, 2025
fd4d325
Complete translation build for accessibility h1 keys
sf-cboscenco Oct 15, 2025
4d314a5
Merge pull request #3397 from SalesforceCommerceCloud/improve-e2e-sta…
kevinxh Oct 15, 2025
46f2419
Merge branch 'develop' into t/cc-sharks/W-19721000
sf-cboscenco Oct 15, 2025
2069f3d
fix: resolve e2e test failures for DNT, PLP and checkout a11y tests
sf-cboscenco Oct 15, 2025
ce23444
fix: update DNT test selector and checkout step-1 a11y snapshots
sf-cboscenco Oct 15, 2025
3955d93
fix: update remaining checkout a11y snapshots (step-2, step-3, step-4)
sf-cboscenco Oct 15, 2025
fa57bb7
fix: update login test selectors to use getByRole for button
sf-cboscenco Oct 15, 2025
c287be4
fix: update test expectations for account page headings
sf-cboscenco Oct 15, 2025
c064f29
Merge pull request #3398 from SalesforceCommerceCloud/t/cc-sharks/W-1…
sf-cboscenco Oct 15, 2025
eaaa094
Fix: prevent `generateCustomEndpointOptions` from overriding headers …
joeluong-sfcc Oct 16, 2025
1adfe9f
@W-19347602 - Fix In Store Inventory Stock Level Checks (#3401)
shauryemahajanSF Oct 16, 2025
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
40 changes: 12 additions & 28 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,14 @@ jobs:
fail-fast: false
matrix:
# Run all matrix env at once because we will not deploy demo app to MRT.
node: [18, 20, 22]
npm: [8, 9, 10, 11]
exclude: # node 18 with npm 11 is not compatible
- node: 18
npm: 11
node: [20, 22]
npm: [10, 11]
runs-on: ubuntu-latest
env:
# The "default" npm is the one that ships with a given version of node.
# For more: https://nodejs.org/en/download/releases/
# (We also use this env var for making sure a step runs once for the current node version)
# Note: For node 18, the default was npm 9 until v18.19.0, when it became npm 10
IS_DEFAULT_NPM: ${{ (matrix.node == 18 && matrix.npm == 10) || (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }}
IS_DEFAULT_NPM: ${{ (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }}
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down Expand Up @@ -67,18 +63,14 @@ jobs:
max-parallel: 1
matrix:
# Run all matrix env at once because we will not deploy demo app to MRT.
node: [18, 20, 22]
npm: [8, 9, 10, 11]
exclude: # node 18 with npm 11 is not compatible
- node: 18
npm: 11
node: [20, 22]
npm: [10, 11]
runs-on: ubuntu-latest
env:
# The "default" npm is the one that ships with a given version of node.
# For more: https://nodejs.org/en/download/releases/
# (We also use this env var for making sure a step runs once for the current node version)
# Note: For node 18, the default was npm 9 until v18.19.0, when it became npm 10
IS_DEFAULT_NPM: ${{ (matrix.node == 18 && matrix.npm == 10) || (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }}
IS_DEFAULT_NPM: ${{ (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }}

steps:
- name: Checkout
Expand Down Expand Up @@ -183,18 +175,14 @@ jobs:
max-parallel: 1
matrix:
# Run all matrix env at once because we will not deploy demo app to MRT.
node: [18, 20, 22]
npm: [8, 9, 10, 11]
exclude: # node 18 with npm 11 is not compatible
- node: 18
npm: 11
node: [20, 22]
npm: [10, 11]
runs-on: ubuntu-latest
env:
# The "default" npm is the one that ships with a given version of node.
# For more: https://nodejs.org/en/download/releases/
# (We also use this env var for making sure a step runs once for the current node version)
# Note: For node 18, the default was npm 9 until v18.19.0, when it became npm 10
IS_DEFAULT_NPM: ${{ (matrix.node == 18 && matrix.npm == 10) || (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }}
IS_DEFAULT_NPM: ${{ (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }}
# The current recommended version for Managed Runtime:
# https://developer.salesforce.com/docs/commerce/pwa-kit-managed-runtime/guide/upgrade-node-version.html
IS_MRT_NODE: ${{ matrix.node == 22 && matrix.npm == 11 }}
Expand Down Expand Up @@ -303,18 +291,14 @@ jobs:
max-parallel: 1
matrix:
# Run all matrix env at once because we will not deploy demo app to MRT.
node: [18, 20, 22]
npm: [8, 9, 10, 11]
exclude: # node 18 with npm 11 is not compatible
- node: 18
npm: 11
node: [20, 22]
npm: [10, 11]
runs-on: ubuntu-latest
env:
# The "default" npm is the one that ships with a given version of node.
# For more: https://nodejs.org/en/download/releases/
# (We also use this env var for making sure a step runs once for the current node version)
# Note: For node 18, the default was npm 9 until v18.19.0, when it became npm 10
IS_DEFAULT_NPM: ${{ (matrix.node == 18 && matrix.npm == 10) || (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }}
IS_DEFAULT_NPM: ${{ (matrix.node == 20 && matrix.npm == 10) || (matrix.node == 22 && matrix.npm == 10) }}
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,6 @@
}
]
},
{
"id": "page-has-heading-one",
"impact": "moderate",
"description": "Ensure that the page, or at least one of its frames contains a level-one heading",
"help": "Page should contain a level-one heading",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=playwright",
"nodes": [
{
"html": "<html lang=\"en-US\" class=\"...\" >",
"failureSummary": "Fix all of the following:\n Page must have a level-one heading",
"target": [
"html"
]
}
]
},
{
"id": "region",
"impact": "moderate",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,6 @@
}
]
},
{
"id": "page-has-heading-one",
"impact": "moderate",
"description": "Ensure that the page, or at least one of its frames contains a level-one heading",
"help": "Page should contain a level-one heading",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=playwright",
"nodes": [
{
"html": "<html lang=\"en-US\" class=\"...\" >",
"failureSummary": "Fix all of the following:\n Page must have a level-one heading",
"target": [
"html"
]
}
]
},
{
"id": "region",
"impact": "moderate",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,6 @@
}
]
},
{
"id": "page-has-heading-one",
"impact": "moderate",
"description": "Ensure that the page, or at least one of its frames contains a level-one heading",
"help": "Page should contain a level-one heading",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=playwright",
"nodes": [
{
"html": "<html lang=\"en-US\" class=\"...\" >",
"failureSummary": "Fix all of the following:\n Page must have a level-one heading",
"target": [
"html"
]
}
]
},
{
"id": "region",
"impact": "moderate",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,6 @@
}
]
},
{
"id": "page-has-heading-one",
"impact": "moderate",
"description": "Ensure that the page, or at least one of its frames contains a level-one heading",
"help": "Page should contain a level-one heading",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=playwright",
"nodes": [
{
"html": "<html lang=\"en-US\" class=\"...\" >",
"failureSummary": "Fix all of the following:\n Page must have a level-one heading",
"target": [
"html"
]
}
]
},
{
"id": "region",
"impact": "moderate",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,6 @@
}
]
},
{
"id": "page-has-heading-one",
"impact": "moderate",
"description": "Ensure that the page, or at least one of its frames contains a level-one heading",
"help": "Page should contain a level-one heading",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=playwright",
"nodes": [
{
"html": "<html lang=\"en-US\" class=\"...\" >",
"failureSummary": "Fix all of the following:\n Page must have a level-one heading",
"target": [
"html"
]
}
]
},
{
"id": "region",
"impact": "moderate",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,6 @@
}
]
},
{
"id": "page-has-heading-one",
"impact": "moderate",
"description": "Ensure that the page, or at least one of its frames contains a level-one heading",
"help": "Page should contain a level-one heading",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=playwright",
"nodes": [
{
"html": "<html lang=\"en-US\" class=\"...\" >",
"failureSummary": "Fix all of the following:\n Page must have a level-one heading",
"target": [
"html"
]
}
]
},
{
"id": "region",
"impact": "moderate",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,6 @@
}
]
},
{
"id": "page-has-heading-one",
"impact": "moderate",
"description": "Ensure that the page, or at least one of its frames contains a level-one heading",
"help": "Page should contain a level-one heading",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=playwright",
"nodes": [
{
"html": "<html lang=\"en-US\" class=\"...\" >",
"failureSummary": "Fix all of the following:\n Page must have a level-one heading",
"target": [
"html"
]
}
]
},
{
"id": "region",
"impact": "moderate",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,6 @@
}
]
},
{
"id": "page-has-heading-one",
"impact": "moderate",
"description": "Ensure that the page, or at least one of its frames contains a level-one heading",
"help": "Page should contain a level-one heading",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=playwright",
"nodes": [
{
"html": "<html lang=\"en-US\" class=\"...\" >",
"failureSummary": "Fix all of the following:\n Page must have a level-one heading",
"target": [
"html"
]
}
]
},
{
"id": "region",
"impact": "moderate",
Expand Down
2 changes: 1 addition & 1 deletion e2e/tests/mobile/dnt.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ test('Shopper can use the consent tracking form', async ({page}) => {
await checkDntCookie(page, '1')

// Logging out clears the preference
await page.getByRole('heading', {name: /My Account/i}).click()
await page.getByRole('button', {name: /My Account chevron-down/i}).click()
const buttons = await page.getByText(/Log Out/i).elementHandles()
for (const button of buttons) {
if (await button.isVisible()) {
Expand Down
3 changes: 2 additions & 1 deletion packages/commerce-sdk-react/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
## v4.2.0-dev (Sep 26, 2025)
- Prevent headers from being overriden in `generateCustomEndpointOptions` [#3405](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3405/)

## v4.1.0 (Sep 25, 2025)

## v4.0.0 (Sep 04, 2025)

- [Breaking] Upgrade to commerce-sdk-isomorphic v4.0.0 [2879](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2879)
- [Breaking] Upgrade to commerce-sdk-isomorphic v4.0.0 [#2879](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2879)
- [Breaking] Remove deprecated properties from useDNT in commerce-sdk-react [#3177](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3177)
- Add support for environment level base paths on /mobify routes [#2892](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2892)
- Update USID expiry to match SLAS refresh token expiry [#2854](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2854)
Expand Down
4 changes: 2 additions & 2 deletions packages/commerce-sdk-react/src/hooks/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export const generateCustomEndpointOptions = (
return {
...options,
options: {
...options.options,
method: options.options?.method || 'GET',
headers: {
Authorization: `Bearer ${access_token}`,
Expand All @@ -61,8 +62,7 @@ export const generateCustomEndpointOptions = (
...globalHeaders,
...options.options?.headers,
...(args?.headers ? args.headers : {})
},
...options.options
}
},
clientConfig: {
...globalClientConfig,
Expand Down
2 changes: 2 additions & 0 deletions packages/template-retail-react-app/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
## v8.2.0-dev (Sep 26, 2025)
- [Bugfix] Fix footer heading semantic consistency and alignment. Fix accessibility compliance by adding proper h1 headings to checkout pages to resolve the page-has-heading-one accessibility rule violation. [#3398](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3398)
- [Bugfix] Use `serverSafeEncode` util for address mutations. [#3380](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3380)
## v8.1.0 (Sep 25, 2025)
- Updated search UX - prices, images, suggestions new layout [#3271](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3271)
Expand All @@ -10,6 +11,7 @@
- Only show option to deliver to multiple addresses if there are multiple items in the basket. [#3336](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3336)
- Added support for Choice of Bonus Products feature. Users can now select from available bonus products when they qualify for the associated promotion. The bonus product selection flow can be entered from either the "Item Added to Cart" modal (when adding the qualifying product to the cart) or from the cart page. [#3292] (https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3292)
- Add @h4ad/serverless-adapter to jest config [#3325](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3325)
- Fix bug where pick up items were displaying delivery stock levels instead of in store stock levels [#3401](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3401)

## v8.0.0 (Sep 04, 2025)
- Add support for environment level base paths on /mobify routes [#2892](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2892)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ const Subscribe = ({...otherProps}) => {
const intl = useIntl()
return (
<Box {...styles.subscribe} {...otherProps}>
<Heading as="h1" {...styles.subscribeHeading}>
<Heading as="h2" {...styles.subscribeHeading}>
{intl.formatMessage({
id: 'footer.subscribe.heading.first_to_know',
defaultMessage: 'Be the first to know'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ const ProductItemList = ({
removingItemIds = [],
// Styling options
hideBorder = false,
hideBottomBorder = false
hideBottomBorder = false,
// Pickup information
getShipmentInfoForProduct = null
}) => {
return (
<Stack spacing={4}>
Expand All @@ -42,11 +44,18 @@ const ProductItemList = ({
// Check if this product item (regular or bonus) is being removed
const isBeingRemoved = removingItemIds.includes(productItem.itemId)

// Get pickup information for this product item
const shipmentInfo = getShipmentInfoForProduct
? getShipmentInfoForProduct(productItem)
: null
const pickupInStore = shipmentInfo?.isPickupOrder || false

return (
<ProductItem
key={productItem.itemId}
isBonusProduct={isBonusProductItem}
isRemoving={isBeingRemoved}
pickupInStore={pickupInStore}
containerStyles={{
borderX: 'none',
borderTop: 'none',
Expand Down Expand Up @@ -105,7 +114,8 @@ ProductItemList.propTypes = {
selectedItem: PropTypes.object,
removingItemIds: PropTypes.arrayOf(PropTypes.string),
hideBorder: PropTypes.bool,
hideBottomBorder: PropTypes.bool
hideBottomBorder: PropTypes.bool,
getShipmentInfoForProduct: PropTypes.func
}

export default ProductItemList
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,11 @@ const ProductItem = ({
onItemQuantityChange = noop,
showLoading = false,
containerStyles = {},
isRemoving = false
isRemoving = false,
pickupInStore = false
}) => {
const {stepQuantity, showInventoryMessage, inventoryMessage, quantity, setQuantity} =
useDerivedProduct(product)
useDerivedProduct(product, false, false, pickupInStore)
const {currency: activeCurrency} = useCurrency()
return (
<Box
Expand Down Expand Up @@ -141,7 +142,8 @@ ProductItem.propTypes = {
secondaryActions: PropTypes.node,
deliveryActions: PropTypes.node,
containerStyles: PropTypes.object,
isRemoving: PropTypes.bool
isRemoving: PropTypes.bool,
pickupInStore: PropTypes.bool
}

export default ProductItem
Loading
Loading