@faststore/core 4.5.1-dev.4 → 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.
@@ -1,9 +1,9 @@
1
1
 
2
- > @faststore/core@4.5.1-dev.3 generate /home/runner/work/faststore/faststore/packages/core
2
+ > @faststore/core@4.5.1-dev.2 generate /home/runner/work/faststore/faststore/packages/core
3
3
  > pnpm run gen-types && pnpm run cache-graphql
4
4
 
5
5
 
6
- > @faststore/core@4.5.1-dev.3 gen-types /home/runner/work/faststore/faststore/packages/core
6
+ > @faststore/core@4.5.1-dev.2 gen-types /home/runner/work/faststore/faststore/packages/core
7
7
  > node ../cli/bin/run generate-types .
8
8
 
9
9
  [STARTED] Parse Configuration
@@ -19,7 +19,7 @@
19
19
  [COMPLETED] Generate to /home/runner/work/faststore/faststore/packages/core/@generated/
20
20
  [COMPLETED] Generate outputs
21
21
 
22
- > @faststore/core@4.5.1-dev.3 cache-graphql /home/runner/work/faststore/faststore/packages/core
22
+ > @faststore/core@4.5.1-dev.2 cache-graphql /home/runner/work/faststore/faststore/packages/core
23
23
  > node ../cli/bin/run cache-graphql --config=./discovery.config.default.js --queries=./@generated/persisted-documents.json
24
24
 
25
25
  [Info] - Config file location: /home/runner/work/faststore/faststore/packages/core/discovery.config.default.js
@@ -1,11 +1,12 @@
1
1
 
2
- > @faststore/core@4.5.1-dev.3 test /home/runner/work/faststore/faststore/packages/core
2
+ > @faststore/core@4.5.1-dev.2 test /home/runner/work/faststore/faststore/packages/core
3
3
  > vitest run
4
4
 
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) 25ms
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
38
- ✓  browser  test/components/account/ContractSwitcher.browser.test.tsx (13 tests) 1958ms
39
- ✓ shows an error state when the list fails to load  633ms
39
+ ✓  browser  test/sdk/ui/useScrollRestoration.browser.test.ts (43 tests) 1024ms
40
40
  stderr | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx > RecommendationShelf > renders nothing when there is an error
41
41
  Error fetching recommendations undefined boom for campaign vrn:recommendations:acc:rec-top-items-v2:campaign-1
42
42
 
43
- ✓  browser  test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx (8 tests) 186ms
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,13 +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) 1405ms
274
- ✓ renders the password protection form  561ms
275
- ✓  browser  test/sdk/session/getInitialSession.browser.test.ts (6 tests) 32ms
276
- ✓  browser  test/sdk/account/changeContractToken.browser.test.ts (9 tests) 80ms
277
- ✓  browser  test/components/account/OrganizationDrawer.browser.test.tsx (5 tests) 2162ms
278
- ✓ renders the menu view with contract details and manage footer  1261ms
279
- ✓ opens the contract switcher and returns to the menu on back  397ms
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
280
285
  stderr | test/sdk/localization/store-url.browser.test.ts
281
286
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
282
287
  at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
@@ -284,9 +289,10 @@ This ensures that you're testing the behavior the user would see in the browser.
284
289
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
285
290
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
286
291
 
287
- ✓  browser  test/sdk/localization/store-url.browser.test.ts (3 tests) 12ms
288
- ✓  browser  test/sdk/account/useAvailableContracts.browser.test.ts (6 tests) 91ms
289
- ✓  browser  test/sdk/account/useSwitchContract.browser.test.ts (4 tests) 132ms
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
290
296
  stderr | test/components/account/doLogout.browser.test.ts
291
297
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
292
298
  at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
@@ -294,9 +300,8 @@ This ensures that you're testing the behavior the user would see in the browser.
294
300
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
295
301
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
296
302
 
297
- ✓  browser  test/components/account/doLogout.browser.test.ts (1 test) 71ms
303
+ ✓  browser  test/components/account/doLogout.browser.test.ts (1 test) 20ms
298
304
  ✓  browser  test/components/account/OrganizationDrawerHeader.browser.test.tsx (3 tests) 265ms
299
- ✓  browser  test/components/account/OrganizationDrawerFooter.browser.test.tsx (3 tests) 255ms
300
305
  stderr | test/sdk/account/clearPersistedSessionState.browser.test.ts
301
306
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
302
307
  at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
@@ -304,11 +309,13 @@ This ensures that you're testing the behavior the user would see in the browser.
304
309
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
305
310
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
306
311
 
307
- ✓  browser  test/sdk/account/clearPersistedSessionState.browser.test.ts (1 test) 9ms
312
+ ✓  browser  test/sdk/account/clearPersistedSessionState.browser.test.ts (1 test) 12ms
313
+ ✓  browser  test/components/account/OrganizationDrawerFooter.browser.test.tsx (3 tests) 248ms
308
314
  ✓  browser  test/utils/isLocalHost.browser.test.ts (3 tests) 3ms
309
- ✓  node  test/utils/localization/bindingPaths.test.ts (71 tests) 19ms
310
- ✓  browser  test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts (1 test) 3ms
311
- ✓  node  test/server/password-protection-service.test.ts (22 tests) 31ms
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
312
319
  stderr | test/sdk/account/refreshToken.browser.test.ts
313
320
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
314
321
  at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
@@ -317,9 +324,9 @@ This ensures that you're testing the behavior the user would see in the browser.
317
324
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
318
325
 
319
326
  ✓  node  test/utils/match-url.test.ts (10 tests) 10ms
320
- ✓  browser  test/sdk/account/refreshToken.browser.test.ts (1 test) 7ms
321
- ✓  node  test/sdk/localization/useBindingSelector.test.tsx (22 tests) 15ms
322
- ✓  node  test/pages/api/unlock.test.ts (15 tests) 201ms
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
323
330
  ✓  node  test/sdk/localization/bindingSelector.test.ts (18 tests) 9ms
324
331
  stderr | test/components/search/SearchInputComponent.test.tsx
325
332
  Warning: forwardRef render functions accept exactly two parameters: props and ref. Did you forget to use the ref parameter?
@@ -384,23 +391,24 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
384
391
  at Suspense
385
392
  at Wrapper (/home/runner/work/faststore/faststore/packages/core/test/components/search/SearchInputComponent.test.tsx:106:20)
386
393
 
387
- ✓  node  test/components/search/SearchInputComponent.test.tsx (6 tests) 84ms
388
- ✓  node  test/utils/cookieCacheBusting.test.ts (10 tests) 11ms
389
- ✓  node  test/sdk/search/useSearchHistory.test.ts (13 tests) 54ms
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
390
397
  ✓  node  test/experimental/myAccountCmsServerSideProps.test.ts (5 tests) 9ms
391
- ✓  node  test/utils/clearCookies.test.ts (20 tests) 19ms
398
+ ✓  node  test/utils/clearCookies.test.ts (20 tests) 27ms
399
+ ✓  node  test/components/quotes/MyAccountListQuotesTable.test.tsx (12 tests) 419ms
392
400
  stderr | test/sdk/account/useSetPassword.test.ts > useSetPassword > maps wrongcredentials error responses to the existing message
393
401
  Set password request failed: Bad Request
394
402
 
395
- ✓  node  test/sdk/account/useSetPassword.test.ts (6 tests) 51ms
396
- ✓  node  test/components/quotes/MyAccountListQuotesTable.test.tsx (12 tests) 427ms
397
- ✓  node  test/components/quotes/quoteFilters.test.ts (23 tests) 33ms
403
+ ✓  node  test/sdk/account/useSetPassword.test.ts (6 tests) 34ms
404
+ ✓  node  test/components/quotes/quoteFilters.test.ts (23 tests) 24ms
398
405
  ✓  node  test/utils/multipleTemplates.test.ts (8 tests) 5ms
399
406
  ✓  node  test/utils/localization/localizeRedirectDestination.test.ts (11 tests) 5ms
400
- ✓  node  test/components/quotes/MyAccountListQuotes.test.tsx (9 tests) 818ms
401
- ✓ navigates with the search term on blur  370ms
407
+ ✓  node  test/components/quotes/MyAccountListQuotes.test.tsx (9 tests) 804ms
408
+ ✓ navigates with the search term on blur  359ms
402
409
  ✓ navigates without a label param when the search is cleared  358ms
403
- ✓  node  test/sdk/orderEntry/useOrderEntryOperation.test.ts (8 tests) 43ms
410
+ ✓  node  test/sdk/orderEntry/useOrderEntryOperation.test.ts (8 tests) 42ms
411
+ ✓  node  test/sdk/orderEntry/useOrderEntryUpload.test.ts (8 tests) 56ms
404
412
  stderr | test/pages/api/graphql.test.ts > /api/graphql error status propagation > propagates the upstream 400 from a wrapped BadRequestError instead of 500
405
413
  Graphql execution returned with error: [
406
414
  {
@@ -447,47 +455,47 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
447
455
  { message: 'bad', status: 400, type: 'BadRequestError' }
448
456
  ]
449
457
 
450
- ✓  node  test/pages/api/graphql.test.ts (10 tests) 17ms
451
- ✓  node  test/sdk/orderEntry/useOrderEntryUpload.test.ts (8 tests) 46ms
452
- ✓  node  test/sdk/analytics/useStartRecommendationSession.test.ts (6 tests) 58ms
453
- ✓  node  test/components/quotes/MyAccountQuotesFilterSlider.test.tsx (5 tests) 148ms
454
- ✓  node  test/proxy.localization.test.ts (5 tests) 40ms
455
- ✓  node  test/server/index.test.ts (7 tests) 708ms
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
456
464
  ✓  node  test/sdk/account/getMyAccountRoutes.test.ts (10 tests) 8ms
457
- ✓  node  test/sdk/orderEntry/useOrderEntry.test.ts (8 tests) 43ms
458
- ✓  node  test/proxy.test.ts (4 tests) 25ms
459
- ✓  node  test/server/webops-api.test.ts (9 tests) 28ms
460
- ✓  node  test/components/quotes/MyAccountQuotesSelectedTags.test.tsx (8 tests) 105ms
461
- ✓  node  test/sdk/orderEntry/useOrderFormItems.test.ts (7 tests) 41ms
465
+ ✓  node  test/sdk/orderEntry/useOrderEntry.test.ts (8 tests) 47ms
466
+ ✓  node  test/proxy.test.ts (4 tests) 21ms
467
+ ✓  node  test/components/quotes/MyAccountQuotesSelectedTags.test.tsx (8 tests) 107ms
468
+ ✓  node  test/server/webops-api.test.ts (9 tests) 23ms
469
+ ✓  node  test/sdk/orderEntry/useOrderFormItems.test.ts (7 tests) 40ms
462
470
  ✓  node  test/sdk/account/refreshToken.test.ts (5 tests) 7ms
463
- ✓  node  test/server/cms/global.test.ts (3 tests) 4ms
464
- ✓  node  test/server/content/service.test.ts (5 tests) 10ms
471
+ ✓  node  test/server/cms/global.test.ts (3 tests) 5ms
472
+ ✓  node  test/server/content/service.test.ts (5 tests) 4ms
465
473
  ✓  node  test/sdk/localization/store-url.test.ts (1 test) 4ms
466
- ✓  node  test/sdk/analytics/hasEnabledRecommendationShelf.test.ts (6 tests) 5ms
467
- ✓  node  test/sdk/auth/useAuth.test.ts (5 tests) 27ms
468
- ✓  node  test/utils/getRequestHostname.test.ts (12 tests) 5ms
469
- ✓  node  test/components/quotes/MyAccountQuotesStatusSelector.test.tsx (6 tests) 134ms
470
- ✓  node  test/utils/validateSessionRefreshToken.test.ts (6 tests) 3ms
471
- ✓  node  test/components/search/SearchInput.test.ts (6 tests) 8ms
472
- ✓  node  test/pages/api/preview.test.ts (2 tests) 8ms
473
- ✓  node  test/components/RecommendationShelf/vrn.test.ts (5 tests) 4ms
474
- ✓  node  test/server/cms/index.test.ts (2 tests) 5ms
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
478
+ ✓  node  test/utils/validateSessionRefreshToken.test.ts (6 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
475
483
  ✓  node  test/utils/retry.test.ts (5 tests) 14ms
476
- ✓  node  test/components/RecommendationShelf/useRecommendationUserId.test.ts (4 tests) 197ms
477
- ✓  node  test/components/account/Layout.test.tsx (4 tests) 52ms
484
+ ✓  node  test/components/account/Layout.test.tsx (4 tests) 47ms
485
+ ✓  node  test/components/RecommendationShelf/useRecommendationUserId.test.ts (4 tests) 191ms
478
486
  ✓  node  test/utils/unlockResponse.test.ts (11 tests) 6ms
479
- ✓  node  test/server/cms/myAccountDefaultSections.test.ts (5 tests) 5ms
480
- ✓  node  test/components/RecommendationShelf/useRecommendations.test.ts (2 tests) 5ms
487
+ ✓  node  test/server/cms/myAccountDefaultSections.test.ts (5 tests) 6ms
488
+ ✓  node  test/components/RecommendationShelf/useRecommendations.test.ts (2 tests) 3ms
481
489
  ✓  node  test/utils/isLocalHost.test.ts (7 tests) 5ms
482
- ✓  node  test/components/account/OrganizationDrawerBody.test.tsx (3 tests) 47ms
483
490
  ✓  node  test/utils/userOrderStatus.test.ts (3 tests) 4ms
491
+ ✓  node  test/components/account/OrganizationDrawerBody.test.tsx (3 tests) 49ms
484
492
  ✓  node  test/sdk/analytics/utils.test.ts (2 tests) 4ms
485
- ✓  node  test/components/auth/ProfileChallenge.test.tsx (3 tests) 42ms
486
- ✓  node  test/sdk/account/clearPersistedSessionState.test.ts (1 test) 9ms
487
- ✓  node  test/components/quotes/MyAccountQuoteStatusBadge.test.tsx (2 tests) 23ms
488
-
489
-  Test Files  73 passed (73)
490
-  Tests  570 passed (570)
491
-  Start at  23:06:30
492
-  Duration  36.09s (transform 8.20s, setup 0ms, collect 28.56s, tests 10.44s, environment 49.69s, prepare 1.25s)
493
+ ✓  node  test/components/auth/ProfileChallenge.test.tsx (3 tests) 27ms
494
+ ✓  node  test/sdk/account/clearPersistedSessionState.test.ts (1 test) 11ms
495
+ ✓  node  test/components/quotes/MyAccountQuoteStatusBadge.test.tsx (2 tests) 24ms
496
+
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)
493
501
 
package/CHANGELOG.md CHANGED
@@ -3,19 +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.4](https://github.com/vtex/faststore/compare/v4.5.1-dev.3...v4.5.1-dev.4) (2026-08-10)
7
-
8
- **Note:** Version bump only for package @faststore/core
9
-
10
- ## [4.5.1-dev.3](https://github.com/vtex/faststore/compare/v4.5.1-dev.2...v4.5.1-dev.3) (2026-08-10)
11
-
12
- ### Bug Fixes
13
-
14
- - **core:** add twitter card meta tag to default next seo config ([720f3e6](https://github.com/vtex/faststore/commit/720f3e6d04ef523f2fcf0e146c3741b7e5af70fa))
15
- - **core:** add twittermeta tags validaton for tests ([c8f5872](https://github.com/vtex/faststore/commit/c8f5872e42b69ddae5b2abfa0e8d3140e2bc7163))
16
- - **core:** lint error ([d07460f](https://github.com/vtex/faststore/commit/d07460f890ba712c9aecbec25bda5de96bf3e4ef))
17
- - **core:** remove duplicated twitter meta tag ([f388288](https://github.com/vtex/faststore/commit/f388288731ff75fceedba3cd7449ef1088b0b0c2))
18
- - **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))
19
23
 
20
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)
21
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.4",
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/diagnostics": "4.5.1-dev.4",
75
- "@faststore/lighthouse": "4.5.1-dev.4",
76
- "@faststore/sdk": "4.5.1-dev.4",
77
- "@faststore/api": "4.5.1-dev.4",
78
- "@faststore/ui": "4.5.1-dev.4"
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}>