@faststore/core 4.5.1-dev.3 → 4.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,8 @@
5
5
 
6
6
   RUN  v4.0.7 /home/runner/work/faststore/faststore/packages/core
7
7
 
8
- ✓  browser  test/sdk/session/reconcileSessionLocale.browser.test.ts (5 tests) 42ms
8
+ Not implemented: navigation to another Document
9
+ Not implemented: navigation to another Document
9
10
  stderr | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx
10
11
  Error in optimistic validation: TypeError: Failed to parse URL from /api/graphql?operationName=ValidateCartMutation&operationHash=8199d03debb0a6751ec53d8ee8987b78d0292acb
11
12
   at node:internal/deps/undici/undici:16416:13
@@ -35,12 +36,16 @@
35
36
  Browserslist: browsers data (caniuse-lite) is 6 months old. Please run:
36
37
  npx update-browserslist-db@latest
37
38
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
39
+ ✓  browser  test/sdk/ui/useScrollRestoration.browser.test.ts (43 tests) 1024ms
38
40
  stderr | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx > RecommendationShelf > renders nothing when there is an error
39
41
  Error fetching recommendations undefined boom for campaign vrn:recommendations:acc:rec-top-items-v2:campaign-1
40
42
 
41
- ✓  browser  test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx (8 tests) 211ms
42
- ✓  browser  test/components/account/ContractSwitcher.browser.test.tsx (13 tests) 2474ms
43
- ✓ shows an error state when the list fails to load  761ms
43
+ ✓  browser  test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx (8 tests) 161ms
44
+ ✓  browser  test/components/account/ContractSwitcher.browser.test.tsx (13 tests) 2109ms
45
+ ✓ shows an error state when the list fails to load  511ms
46
+ ✓ requires selecting a contract before Confirm is enabled, then switches (REQ-03)  334ms
47
+ ✓  browser  test/components/ui/ProductGallery/GalleryPageHeightLock.browser.test.tsx (8 tests) 148ms
48
+ ✓  browser  test/sdk/session/reconcileSessionLocale.browser.test.ts (5 tests) 32ms
44
49
  stderr | test/pages/password-protection.browser.test.tsx > PasswordProtectionLogin > posts the password and redirects to the requested return path
45
50
  Warning: An update to PasswordProtectionLogin inside a test was not wrapped in act(...).
46
51
 
@@ -270,16 +275,13 @@ act(() => {
270
275
  This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act
271
276
  at PasswordProtectionLogin (/home/runner/work/faststore/faststore/packages/core/src/pages/password-protection/index.tsx:19:69)
272
277
 
273
- ✓  browser  test/pages/password-protection.browser.test.tsx (6 tests) 2350ms
274
- ✓ renders the password protection form  859ms
275
- ✓ posts the password and redirects to the requested return path  351ms
276
- ✓ defaults returnTo to root and shows API validation errors  319ms
277
- ✓  browser  test/sdk/session/getInitialSession.browser.test.ts (6 tests) 39ms
278
- ✓  browser  test/components/account/OrganizationDrawer.browser.test.tsx (5 tests) 2396ms
279
- ✓ renders the menu view with contract details and manage footer  1245ms
280
- ✓ opens the contract switcher and returns to the menu on back  558ms
281
- ✓ resets to the menu when the drawer closes  347ms
282
- ✓  browser  test/sdk/account/changeContractToken.browser.test.ts (9 tests) 58ms
278
+ ✓  browser  test/pages/password-protection.browser.test.tsx (6 tests) 1545ms
279
+ ✓ renders the password protection form  594ms
280
+ ✓  browser  test/sdk/session/getInitialSession.browser.test.ts (6 tests) 27ms
281
+ ✓  browser  test/components/account/OrganizationDrawer.browser.test.tsx (5 tests) 1942ms
282
+ ✓ renders the menu view with contract details and manage footer  936ms
283
+ ✓ opens the contract switcher and returns to the menu on back  452ms
284
+ ✓  browser  test/sdk/account/changeContractToken.browser.test.ts (9 tests) 55ms
283
285
  stderr | test/sdk/localization/store-url.browser.test.ts
284
286
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
285
287
  at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
@@ -287,9 +289,10 @@ This ensures that you're testing the behavior the user would see in the browser.
287
289
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
288
290
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
289
291
 
290
- ✓  browser  test/sdk/localization/store-url.browser.test.ts (3 tests) 31ms
291
- ✓  browser  test/sdk/account/useAvailableContracts.browser.test.ts (6 tests) 110ms
292
- ✓  browser  test/sdk/account/useSwitchContract.browser.test.ts (4 tests) 130ms
292
+ ✓  browser  test/sdk/localization/store-url.browser.test.ts (3 tests) 8ms
293
+ ✓  browser  test/sdk/account/useAvailableContracts.browser.test.ts (6 tests) 40ms
294
+ ✓  browser  test/components/templates/SearchPage/SearchWrapper.browser.test.tsx (3 tests) 35ms
295
+ ✓  browser  test/sdk/account/useSwitchContract.browser.test.ts (4 tests) 39ms
293
296
  stderr | test/components/account/doLogout.browser.test.ts
294
297
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
295
298
  at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
@@ -297,7 +300,8 @@ This ensures that you're testing the behavior the user would see in the browser.
297
300
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
298
301
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
299
302
 
300
- ✓  browser  test/components/account/doLogout.browser.test.ts (1 test) 30ms
303
+ ✓  browser  test/components/account/doLogout.browser.test.ts (1 test) 20ms
304
+ ✓  browser  test/components/account/OrganizationDrawerHeader.browser.test.tsx (3 tests) 265ms
301
305
  stderr | test/sdk/account/clearPersistedSessionState.browser.test.ts
302
306
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
303
307
  at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
@@ -305,12 +309,13 @@ This ensures that you're testing the behavior the user would see in the browser.
305
309
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
306
310
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
307
311
 
308
- ✓  browser  test/components/account/OrganizationDrawerHeader.browser.test.tsx (3 tests) 257ms
309
- ✓  browser  test/sdk/account/clearPersistedSessionState.browser.test.ts (1 test) 6ms
310
- ✓  browser  test/components/account/OrganizationDrawerFooter.browser.test.tsx (3 tests) 298ms
311
- ✓  browser  test/utils/isLocalHost.browser.test.ts (3 tests) 5ms
312
- ✓  browser  test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts (1 test) 4ms
313
- ✓  node  test/utils/localization/bindingPaths.test.ts (71 tests) 28ms
312
+ ✓  browser  test/sdk/account/clearPersistedSessionState.browser.test.ts (1 test) 12ms
313
+ ✓  browser  test/components/account/OrganizationDrawerFooter.browser.test.tsx (3 tests) 248ms
314
+ ✓  browser  test/utils/isLocalHost.browser.test.ts (3 tests) 3ms
315
+ ✓  browser  test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts (1 test) 2ms
316
+ ✓  node  test/utils/localization/bindingPaths.test.ts (71 tests) 27ms
317
+ ✓  browser  test/components/skeletons/ProductGridSkeleton.browser.test.tsx (2 tests) 38ms
318
+ ✓  node  test/server/password-protection-service.test.ts (22 tests) 30ms
314
319
  stderr | test/sdk/account/refreshToken.browser.test.ts
315
320
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
316
321
  at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
@@ -318,12 +323,11 @@ This ensures that you're testing the behavior the user would see in the browser.
318
323
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
319
324
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
320
325
 
321
- ✓  node  test/server/password-protection-service.test.ts (22 tests) 28ms
322
- ✓  browser  test/sdk/account/refreshToken.browser.test.ts (1 test) 6ms
323
- ✓  node  test/utils/match-url.test.ts (10 tests) 13ms
324
- ✓  node  test/sdk/localization/useBindingSelector.test.tsx (22 tests) 16ms
325
- ✓  node  test/pages/api/unlock.test.ts (15 tests) 216ms
326
- ✓  node  test/sdk/localization/bindingSelector.test.ts (18 tests) 11ms
326
+ ✓  node  test/utils/match-url.test.ts (10 tests) 10ms
327
+ ✓  browser  test/sdk/account/refreshToken.browser.test.ts (1 test) 5ms
328
+ ✓  node  test/sdk/localization/useBindingSelector.test.tsx (22 tests) 14ms
329
+ ✓  node  test/pages/api/unlock.test.ts (15 tests) 206ms
330
+ ✓  node  test/sdk/localization/bindingSelector.test.ts (18 tests) 9ms
327
331
  stderr | test/components/search/SearchInputComponent.test.tsx
328
332
  Warning: forwardRef render functions accept exactly two parameters: props and ref. Did you forget to use the ref parameter?
329
333
 
@@ -387,23 +391,24 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
387
391
  at Suspense
388
392
  at Wrapper (/home/runner/work/faststore/faststore/packages/core/test/components/search/SearchInputComponent.test.tsx:106:20)
389
393
 
390
- ✓  node  test/components/search/SearchInputComponent.test.tsx (6 tests) 87ms
391
- ✓  node  test/utils/cookieCacheBusting.test.ts (10 tests) 11ms
392
- ✓  node  test/sdk/search/useSearchHistory.test.ts (13 tests) 54ms
393
- ✓  node  test/experimental/myAccountCmsServerSideProps.test.ts (5 tests) 11ms
394
- ✓  node  test/utils/clearCookies.test.ts (20 tests) 21ms
394
+ ✓  node  test/components/search/SearchInputComponent.test.tsx (6 tests) 71ms
395
+ ✓  node  test/utils/cookieCacheBusting.test.ts (10 tests) 12ms
396
+ ✓  node  test/sdk/search/useSearchHistory.test.ts (13 tests) 58ms
397
+ ✓  node  test/experimental/myAccountCmsServerSideProps.test.ts (5 tests) 9ms
398
+ ✓  node  test/utils/clearCookies.test.ts (20 tests) 27ms
399
+ ✓  node  test/components/quotes/MyAccountListQuotesTable.test.tsx (12 tests) 419ms
395
400
  stderr | test/sdk/account/useSetPassword.test.ts > useSetPassword > maps wrongcredentials error responses to the existing message
396
401
  Set password request failed: Bad Request
397
402
 
398
- ✓  node  test/sdk/account/useSetPassword.test.ts (6 tests) 43ms
399
- ✓  node  test/components/quotes/MyAccountListQuotesTable.test.tsx (12 tests) 424ms
400
- ✓  node  test/components/quotes/quoteFilters.test.ts (23 tests) 28ms
403
+ ✓  node  test/sdk/account/useSetPassword.test.ts (6 tests) 34ms
404
+ ✓  node  test/components/quotes/quoteFilters.test.ts (23 tests) 24ms
401
405
  ✓  node  test/utils/multipleTemplates.test.ts (8 tests) 5ms
402
406
  ✓  node  test/utils/localization/localizeRedirectDestination.test.ts (11 tests) 5ms
403
- ✓  node  test/components/quotes/MyAccountListQuotes.test.tsx (9 tests) 823ms
404
- ✓ navigates with the search term on blur  364ms
405
- ✓ navigates without a label param when the search is cleared  360ms
407
+ ✓  node  test/components/quotes/MyAccountListQuotes.test.tsx (9 tests) 804ms
408
+ ✓ navigates with the search term on blur  359ms
409
+ ✓ navigates without a label param when the search is cleared  358ms
406
410
  ✓  node  test/sdk/orderEntry/useOrderEntryOperation.test.ts (8 tests) 42ms
411
+ ✓  node  test/sdk/orderEntry/useOrderEntryUpload.test.ts (8 tests) 56ms
407
412
  stderr | test/pages/api/graphql.test.ts > /api/graphql error status propagation > propagates the upstream 400 from a wrapped BadRequestError instead of 500
408
413
  Graphql execution returned with error: [
409
414
  {
@@ -450,49 +455,47 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
450
455
  { message: 'bad', status: 400, type: 'BadRequestError' }
451
456
  ]
452
457
 
453
- ✓  node  test/pages/api/graphql.test.ts (10 tests) 27ms
454
- ✓  node  test/sdk/orderEntry/useOrderEntryUpload.test.ts (8 tests) 75ms
455
- ✓  node  test/components/quotes/MyAccountQuotesFilterSlider.test.tsx (5 tests) 155ms
456
- ✓  node  test/sdk/analytics/useStartRecommendationSession.test.ts (6 tests) 43ms
457
- ✓  node  test/proxy.localization.test.ts (5 tests) 45ms
458
+ ✓  node  test/pages/api/graphql.test.ts (10 tests) 25ms
459
+ ✓  node  test/sdk/analytics/useStartRecommendationSession.test.ts (6 tests) 59ms
460
+ ✓  node  test/components/quotes/MyAccountQuotesFilterSlider.test.tsx (5 tests) 131ms
461
+ ✓  node  test/server/index.test.ts (7 tests) 799ms
462
+ ✓ should return a valid merged GraphQL schema  301ms
463
+ ✓  node  test/proxy.localization.test.ts (5 tests) 71ms
458
464
  ✓  node  test/sdk/account/getMyAccountRoutes.test.ts (10 tests) 8ms
459
- ✓  node  test/server/index.test.ts (7 tests) 1015ms
460
- ✓ should return a valid merged GraphQL schema  342ms
461
- ✓ should handle options and execute  440ms
462
465
  ✓  node  test/sdk/orderEntry/useOrderEntry.test.ts (8 tests) 47ms
463
- ✓  node  test/proxy.test.ts (4 tests) 19ms
464
- ✓  node  test/server/webops-api.test.ts (9 tests) 30ms
465
- ✓  node  test/sdk/orderEntry/useOrderFormItems.test.ts (7 tests) 35ms
466
+ ✓  node  test/proxy.test.ts (4 tests) 21ms
466
467
  ✓  node  test/components/quotes/MyAccountQuotesSelectedTags.test.tsx (8 tests) 107ms
467
- ✓  node  test/sdk/account/refreshToken.test.ts (5 tests) 8ms
468
- ✓  node  test/server/cms/global.test.ts (3 tests) 6ms
469
- ✓  node  test/server/content/service.test.ts (5 tests) 6ms
470
- ✓  node  test/sdk/localization/store-url.test.ts (1 test) 10ms
471
- ✓  node  test/sdk/analytics/hasEnabledRecommendationShelf.test.ts (6 tests) 5ms
472
- ✓  node  test/utils/getRequestHostname.test.ts (12 tests) 7ms
473
- ✓  node  test/sdk/auth/useAuth.test.ts (5 tests) 34ms
474
- ✓  node  test/components/quotes/MyAccountQuotesStatusSelector.test.tsx (6 tests) 137ms
468
+ ✓  node  test/server/webops-api.test.ts (9 tests) 23ms
469
+ ✓  node  test/sdk/orderEntry/useOrderFormItems.test.ts (7 tests) 40ms
470
+ ✓  node  test/sdk/account/refreshToken.test.ts (5 tests) 7ms
471
+ ✓  node  test/server/cms/global.test.ts (3 tests) 5ms
472
+ ✓  node  test/server/content/service.test.ts (5 tests) 4ms
473
+ ✓  node  test/sdk/localization/store-url.test.ts (1 test) 4ms
474
+ ✓  node  test/sdk/analytics/hasEnabledRecommendationShelf.test.ts (6 tests) 4ms
475
+ ✓  node  test/utils/getRequestHostname.test.ts (12 tests) 6ms
476
+ ✓  node  test/sdk/auth/useAuth.test.ts (5 tests) 20ms
477
+ ✓  node  test/components/quotes/MyAccountQuotesStatusSelector.test.tsx (6 tests) 144ms
475
478
  ✓  node  test/utils/validateSessionRefreshToken.test.ts (6 tests) 5ms
476
- ✓  node  test/pages/api/preview.test.ts (2 tests) 9ms
477
- ✓  node  test/components/search/SearchInput.test.ts (6 tests) 8ms
478
- ✓  node  test/components/RecommendationShelf/vrn.test.ts (5 tests) 5ms
479
- ✓  node  test/server/cms/index.test.ts (2 tests) 5ms
479
+ ✓  node  test/pages/api/preview.test.ts (2 tests) 7ms
480
+ ✓  node  test/components/search/SearchInput.test.ts (6 tests) 6ms
481
+ ✓  node  test/components/RecommendationShelf/vrn.test.ts (5 tests) 6ms
482
+ ✓  node  test/server/cms/index.test.ts (2 tests) 7ms
480
483
  ✓  node  test/utils/retry.test.ts (5 tests) 14ms
481
- ✓  node  test/components/account/Layout.test.tsx (4 tests) 57ms
482
- ✓  node  test/components/RecommendationShelf/useRecommendationUserId.test.ts (4 tests) 207ms
483
- ✓  node  test/utils/unlockResponse.test.ts (11 tests) 7ms
484
- ✓  node  test/server/cms/myAccountDefaultSections.test.ts (5 tests) 7ms
485
- ✓  node  test/components/RecommendationShelf/useRecommendations.test.ts (2 tests) 5ms
486
- ✓  node  test/utils/isLocalHost.test.ts (7 tests) 7ms
487
- ✓  node  test/utils/userOrderStatus.test.ts (3 tests) 5ms
488
- ✓  node  test/components/account/OrganizationDrawerBody.test.tsx (3 tests) 54ms
489
- ✓  node  test/sdk/analytics/utils.test.ts (2 tests) 5ms
490
- ✓  node  test/components/auth/ProfileChallenge.test.tsx (3 tests) 45ms
491
- ✓  node  test/sdk/account/clearPersistedSessionState.test.ts (1 test) 10ms
484
+ ✓  node  test/components/account/Layout.test.tsx (4 tests) 47ms
485
+ ✓  node  test/components/RecommendationShelf/useRecommendationUserId.test.ts (4 tests) 191ms
486
+ ✓  node  test/utils/unlockResponse.test.ts (11 tests) 6ms
487
+ ✓  node  test/server/cms/myAccountDefaultSections.test.ts (5 tests) 6ms
488
+ ✓  node  test/components/RecommendationShelf/useRecommendations.test.ts (2 tests) 3ms
489
+ ✓  node  test/utils/isLocalHost.test.ts (7 tests) 5ms
490
+ ✓  node  test/utils/userOrderStatus.test.ts (3 tests) 4ms
491
+ ✓  node  test/components/account/OrganizationDrawerBody.test.tsx (3 tests) 49ms
492
+ ✓  node  test/sdk/analytics/utils.test.ts (2 tests) 4ms
493
+ ✓  node  test/components/auth/ProfileChallenge.test.tsx (3 tests) 27ms
494
+ ✓  node  test/sdk/account/clearPersistedSessionState.test.ts (1 test) 11ms
492
495
  ✓  node  test/components/quotes/MyAccountQuoteStatusBadge.test.tsx (2 tests) 24ms
493
496
 
494
-  Test Files  73 passed (73)
495
-  Tests  570 passed (570)
496
-  Start at  21:17:01
497
-  Duration  38.06s (transform 8.66s, setup 0ms, collect 30.89s, tests 12.61s, environment 49.59s, prepare 1.36s)
497
+  Test Files  77 passed (77)
498
+  Tests  626 passed (626)
499
+  Start at  14:30:25
500
+  Duration  37.93s (transform 8.83s, setup 0ms, collect 30.97s, tests 11.57s, environment 49.14s, prepare 1.21s)
498
501
 
package/CHANGELOG.md CHANGED
@@ -3,15 +3,23 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- ## [4.5.1-dev.3](https://github.com/vtex/faststore/compare/v4.5.1-dev.2...v4.5.1-dev.3) (2026-08-10)
7
-
8
- ### Bug Fixes
9
-
10
- - **core:** add twitter card meta tag to default next seo config ([720f3e6](https://github.com/vtex/faststore/commit/720f3e6d04ef523f2fcf0e146c3741b7e5af70fa))
11
- - **core:** add twittermeta tags validaton for tests ([c8f5872](https://github.com/vtex/faststore/commit/c8f5872e42b69ddae5b2abfa0e8d3140e2bc7163))
12
- - **core:** lint error ([d07460f](https://github.com/vtex/faststore/commit/d07460f890ba712c9aecbec25bda5de96bf3e4ef))
13
- - **core:** remove duplicated twitter meta tag ([f388288](https://github.com/vtex/faststore/commit/f388288731ff75fceedba3cd7449ef1088b0b0c2))
14
- - **metaTags:** add twitter meta tags to nextSeo ([9c2439b](https://github.com/vtex/faststore/commit/9c2439b4a668dd81b7bfe5bdc44df575725067ec))
6
+ ## [4.5.1](https://github.com/vtex/faststore/compare/v4.5.1-dev.2...v4.5.1) (2026-08-11)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **core:** address scroll restoration review feedback ([a5fe6a3](https://github.com/vtex/faststore/commit/a5fe6a35c54e6095f81c7995a815ce6ef3b4dd4e))
11
+ - **core:** align beforePopState callback with NextHistoryState ([10719e5](https://github.com/vtex/faststore/commit/10719e5eca199385d9fe18bdd6d7da290716a1d5))
12
+ - **core:** compare window to undefined directly for Sonar ([bf05a54](https://github.com/vtex/faststore/commit/bf05a54bb014d120b7bdc95ff7c01a4e9b35b485))
13
+ - **core:** harden scroll restore path matching and hydration-safe heights ([34efa6b](https://github.com/vtex/faststore/commit/34efa6bda7549895a4531277c2fe55bd6bbe98a7))
14
+ - **core:** hash gallery height keys to avoid truncation collisions ([9e98043](https://github.com/vtex/faststore/commit/9e980438d74e457fa33aa77900438339463a078c))
15
+ - **core:** prevent IS redirect hang and improve scroll restoration ([5f30778](https://github.com/vtex/faststore/commit/5f30778161eec2e4381b3fe971479dd7cbe53b08))
16
+ - **core:** reset infinite scroll on forward listing navigations ([249226a](https://github.com/vtex/faststore/commit/249226a3acbe4cb26d687cf962125b2593d5949e))
17
+ - **core:** resolve Sonar new-code smells for scroll restoration ([59b41ed](https://github.com/vtex/faststore/commit/59b41ed1d2a30ba693726b19895a0279eb1ba464))
18
+ - **core:** restore PLP infinite-scroll pages on back navigation ([92b2efa](https://github.com/vtex/faststore/commit/92b2efa1d4d0895a10b5a0e71a4d9bf37cae1686))
19
+ - **core:** resync gallery height lock when children change ([5058089](https://github.com/vtex/faststore/commit/50580898d97baf800b97c8a876f7967529859c61))
20
+ - **core:** satisfy Sonar on gallery height key hash ([3a6ce47](https://github.com/vtex/faststore/commit/3a6ce47485c26be75d6d76906df3af64c9e34fd6))
21
+ - **core:** type scroll restore paint timer for DOM/Node setTimeout ([940c903](https://github.com/vtex/faststore/commit/940c90376f8d2eb77665e73a6fb0ea53c9786c8e))
22
+ - **core:** use replaceAll for infinite-scroll session key ([4f52048](https://github.com/vtex/faststore/commit/4f520482a9ba9661782fcf25a286b8f2e6c6b922))
15
23
 
16
24
  ## [4.5.1-dev.2](https://github.com/vtex/faststore/compare/v4.5.1-dev.1...v4.5.1-dev.2) (2026-08-04)
17
25
 
@@ -47,7 +47,7 @@ describe('Home Page Seo', () => {
47
47
  })
48
48
  })
49
49
 
50
- it('has OpenGraph and Twitter tags', () => {
50
+ it('has OpenGraph tags', () => {
51
51
  cy.visit(pages.home, options)
52
52
  cy.waitForHydration()
53
53
 
@@ -68,12 +68,6 @@ describe('Home Page Seo', () => {
68
68
  .should(($el) => {
69
69
  expect($el.attr('content')).to.be.a('string')
70
70
  })
71
-
72
- cy.get('meta[name="twitter:card"]')
73
- .should('exist')
74
- .should(($el) => {
75
- expect($el.attr('content')).to.eq('summary_large_image')
76
- })
77
71
  })
78
72
  })
79
73
 
@@ -123,7 +117,7 @@ describe('Product Page Seo', () => {
123
117
  })
124
118
  })
125
119
 
126
- it('has OpenGraph and Twitter tags', () => {
120
+ it('has OpenGraph tags', () => {
127
121
  cy.visit(pages.pdp, options)
128
122
  cy.waitForHydration()
129
123
 
@@ -162,12 +156,6 @@ describe('Product Page Seo', () => {
162
156
  .should(($el) => {
163
157
  expect($el.attr('content')).to.be.a('string')
164
158
  })
165
-
166
- cy.get('meta[name="twitter:card"]')
167
- .should('exist')
168
- .should(($el) => {
169
- expect($el.attr('content')).to.eq('summary_large_image')
170
- })
171
159
  })
172
160
  })
173
161
 
@@ -213,7 +201,7 @@ describe('Collection Page Seo', () => {
213
201
  })
214
202
  })
215
203
 
216
- it('has OpenGraph and Twitter tags', () => {
204
+ it('has OpenGraph tags', () => {
217
205
  cy.visit(pages.collection, options)
218
206
  cy.waitForHydration()
219
207
 
@@ -234,12 +222,6 @@ describe('Collection Page Seo', () => {
234
222
  .should(($el) => {
235
223
  expect($el.attr('content')).to.be.a('string')
236
224
  })
237
-
238
- cy.get('meta[name="twitter:card"]')
239
- .should('exist')
240
- .should(($el) => {
241
- expect($el.attr('content')).to.eq('summary_large_image')
242
- })
243
225
  })
244
226
  })
245
227
 
@@ -274,7 +256,7 @@ describe('Filtered Collection Page Seo', () => {
274
256
  })
275
257
  })
276
258
 
277
- it('has OpenGraph and Twitter tags', () => {
259
+ it('has OpenGraph tags', () => {
278
260
  cy.visit(pages.collection_filtered, options)
279
261
  cy.waitForHydration()
280
262
 
@@ -295,12 +277,6 @@ describe('Filtered Collection Page Seo', () => {
295
277
  .should(($el) => {
296
278
  expect($el.attr('content')).to.be.a('string')
297
279
  })
298
-
299
- cy.get('meta[name="twitter:card"]')
300
- .should('exist')
301
- .should(($el) => {
302
- expect($el.attr('content')).to.eq('summary_large_image')
303
- })
304
280
  })
305
281
  })
306
282
 
@@ -319,7 +295,7 @@ describe('Search Page Seo', () => {
319
295
  cy.get('link[rel="canonical"]').should('not.exist')
320
296
  })
321
297
 
322
- it('has OpenGraph and Twitter tags', () => {
298
+ it('has OpenGraph tags', () => {
323
299
  cy.visit(pages.search, options)
324
300
  cy.waitForHydration()
325
301
 
@@ -340,11 +316,5 @@ describe('Search Page Seo', () => {
340
316
  .should(($el) => {
341
317
  expect($el.attr('content')).to.be.a('string')
342
318
  })
343
-
344
- cy.get('meta[name="twitter:card"]')
345
- .should('exist')
346
- .should(($el) => {
347
- expect($el.attr('content')).to.eq('summary_large_image')
348
- })
349
319
  })
350
320
  })
@@ -8,9 +8,6 @@ const config: DefaultSeoProps = {
8
8
  norobots: storeConfig.experimental.noRobots,
9
9
  dangerouslySetAllPagesToNoFollow: storeConfig.experimental.nofollow,
10
10
  dangerouslySetAllPagesToNoIndex: storeConfig.experimental.noindex,
11
- twitter: {
12
- cardType: 'summary_large_image',
13
- },
14
11
  additionalMetaTags: [
15
12
  {
16
13
  name: 'generated-at',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/core",
3
- "version": "4.5.1-dev.3",
3
+ "version": "4.5.1",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -71,11 +71,11 @@
71
71
  "style-loader": "^3.3.1",
72
72
  "swr": "^2.2.5",
73
73
  "use-sync-external-store": "^1.6.0",
74
- "@faststore/api": "4.5.1-dev.3",
75
- "@faststore/diagnostics": "4.5.1-dev.3",
76
- "@faststore/lighthouse": "4.5.1-dev.3",
77
- "@faststore/sdk": "4.5.1-dev.3",
78
- "@faststore/ui": "4.5.1-dev.3"
74
+ "@faststore/lighthouse": "4.5.1",
75
+ "@faststore/ui": "4.5.1",
76
+ "@faststore/diagnostics": "4.5.1",
77
+ "@faststore/sdk": "4.5.1",
78
+ "@faststore/api": "4.5.1"
79
79
  },
80
80
  "devDependencies": {
81
81
  "@cypress/code-coverage": "^3.12.1",
@@ -94,6 +94,7 @@ function ProductGrid({
94
94
  <ProductGridSkeleton
95
95
  aspectRatio={aspectRatio}
96
96
  loading={products.length === 0}
97
+ count={pageSize}
97
98
  >
98
99
  <UIProductGrid
99
100
  data-af-element={searchId && 'search-result'}
@@ -7,16 +7,19 @@ import ProductCardSkeleton from '../ProductCardSkeleton'
7
7
  interface ProductGridSkeletonProps {
8
8
  loading?: boolean
9
9
  aspectRatio?: number
10
+ /** How many placeholder cards to render — defaults to the global ITEMS_PER_PAGE. */
11
+ count?: number
10
12
  }
11
13
 
12
14
  function ProductGridSkeleton({
13
15
  children,
14
16
  aspectRatio,
15
17
  loading = true,
18
+ count = ITEMS_PER_PAGE,
16
19
  }: PropsWithChildren<ProductGridSkeletonProps>) {
17
20
  return loading ? (
18
21
  <ul data-fs-product-grid>
19
- {Array.from({ length: ITEMS_PER_PAGE }, (_, index) => (
22
+ {Array.from({ length: count }, (_, index) => (
20
23
  <li key={String(index)}>
21
24
  <ProductCardSkeleton aspectRatio={aspectRatio} bordered />
22
25
  </li>
@@ -1,3 +1,4 @@
1
+ import { useEffect, useRef } from 'react'
1
2
  import { useSearch } from '@faststore/sdk'
2
3
  import { useRouter } from 'next/router'
3
4
 
@@ -40,6 +41,19 @@ export default function SearchWrapper({
40
41
  selectedFacets,
41
42
  })
42
43
 
44
+ const redirectUrl = pageProductGalleryData?.redirect?.url
45
+ const lastRedirectedUrl = useRef<string | null>(null)
46
+
47
+ // Intelligent Search redirects must run in an effect — calling router.replace
48
+ // during render re-fires on every state update (e.g. scrollRestoration's
49
+ // resetInfiniteScroll) and loops until the tab hangs.
50
+ useEffect(() => {
51
+ if (!redirectUrl || lastRedirectedUrl.current === redirectUrl) return
52
+
53
+ lastRedirectedUrl.current = redirectUrl
54
+ void router.replace(redirectUrl)
55
+ }, [redirectUrl, router])
56
+
43
57
  const emptySearchProps = storeConfig.experimental.enableSearchSSR
44
58
  ? {
45
59
  title: storeConfig.seo.search.bodyH1 ?? 'Showing results for:',
@@ -58,11 +72,7 @@ export default function SearchWrapper({
58
72
  }
59
73
 
60
74
  // Redirect when there are registered Intelligent Search redirects on VTEX Admin
61
- if (pageProductGalleryData?.redirect?.url) {
62
- router.replace(pageProductGalleryData?.redirect?.url, null, {
63
- shallow: true,
64
- })
65
-
75
+ if (redirectUrl) {
66
76
  return (
67
77
  <PageProvider context={{ globalSettings }}>
68
78
  <RenderSections globalSections={globalSections}>