@faststore/core 4.6.0-dev.0 → 4.6.0-dev.2

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.4 generate /home/runner/work/faststore/faststore/packages/core
2
+ > @faststore/core@4.6.0-dev.1 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.4 gen-types /home/runner/work/faststore/faststore/packages/core
6
+ > @faststore/core@4.6.0-dev.1 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.4 cache-graphql /home/runner/work/faststore/faststore/packages/core
22
+ > @faststore/core@4.6.0-dev.1 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,19 +1,21 @@
1
1
 
2
- > @faststore/core@4.5.1-dev.4 test /home/runner/work/faststore/faststore/packages/core
2
+ > @faststore/core@4.6.0-dev.1 test /home/runner/work/faststore/faststore/packages/core
3
3
  > vitest run
4
4
 
5
5
 
6
6
   RUN  v4.0.18 /home/runner/work/faststore/faststore/packages/core
7
7
 
8
- ✓  browser  test/sdk/session/reconcileSessionLocale.browser.test.ts (5 tests) 36ms
8
+ Not implemented: navigation to another Document
9
+ Not implemented: navigation to another Document
10
+ ✓  browser  test/sdk/ui/useScrollRestoration.browser.test.ts (43 tests) 763ms
9
11
  stderr | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx
10
- Error in optimistic validation: TypeError: Failed to parse URL from /api/graphql?operationName=ValidateCartMutation&operationHash=8199d03debb0a6751ec53d8ee8987b78d0292acb
12
+ Error in optimistic validation: TypeError: Failed to parse URL from /api/graphql?operationName=ValidateCartMutation&operationHash=3c71b0d3fc2bade14df68abfa271858beb361b12
11
13
   at node:internal/deps/undici/undici:16416:13
12
14
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
13
15
  at baseRequest (/home/runner/work/faststore/faststore/packages/core/src/sdk/graphql/request.ts:42:20)
14
16
  at GraphqlRequest (/home/runner/work/faststore/faststore/packages/core/src/sdk/graphql/request.ts:130:20)
15
17
  at request (/home/runner/work/faststore/faststore/packages/core/src/sdk/graphql/request.ts:154:5)
16
- at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:117:46)
18
+ at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:122:46)
17
19
  at onValidate (/home/runner/work/faststore/faststore/packages/core/src/sdk/useStore.ts:18:14)
18
20
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:17) {
19
21
  [cause]: TypeError: Invalid URL
@@ -28,19 +30,21 @@
28
30
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
29
31
  at GraphqlRequest (/home/runner/work/faststore/faststore/packages/core/src/sdk/graphql/request.ts:130:20) {
30
32
  code: 'ERR_INVALID_URL',
31
- input: '/api/graphql?operationName=ValidateCartMutation&operationHash=8199d03debb0a6751ec53d8ee8987b78d0292acb'
33
+ input: '/api/graphql?operationName=ValidateCartMutation&operationHash=3c71b0d3fc2bade14df68abfa271858beb361b12'
32
34
  }
33
35
  }
34
36
 
35
37
  Browserslist: browsers data (caniuse-lite) is 6 months old. Please run:
36
38
  npx update-browserslist-db@latest
37
39
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
40
+ ✓  browser  test/components/account/ContractSwitcher.browser.test.tsx (13 tests) 1389ms
38
41
  stderr | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx > RecommendationShelf > renders nothing when there is an error
39
42
  Error fetching recommendations undefined boom for campaign vrn:recommendations:acc:rec-top-items-v2:campaign-1
40
43
 
41
- ✓  browser  test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx (8 tests) 283ms
42
- ✓  browser  test/components/account/ContractSwitcher.browser.test.tsx (13 tests) 2139ms
43
- ✓ shows an error state when the list fails to load  585ms
44
+ ✓  browser  test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx (8 tests) 169ms
45
+ ✓  browser  test/components/ui/ProductGallery/GalleryPageHeightLock.browser.test.tsx (8 tests) 112ms
46
+ ✓  browser  test/sdk/session/reconcileSessionLocale.browser.test.ts (5 tests) 14ms
47
+ ✓  browser  test/sdk/session/getInitialSession.browser.test.ts (6 tests) 19ms
44
48
  stderr | test/pages/password-protection.browser.test.tsx > PasswordProtectionLogin > posts the password and redirects to the requested return path
45
49
  Warning: An update to PasswordProtectionLogin inside a test was not wrapped in act(...).
46
50
 
@@ -270,56 +274,61 @@ act(() => {
270
274
  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
275
  at PasswordProtectionLogin (/home/runner/work/faststore/faststore/packages/core/src/pages/password-protection/index.tsx:19:69)
272
276
 
273
- ✓  browser  test/pages/password-protection.browser.test.tsx (6 tests) 1851ms
274
- ✓ renders the password protection form  789ms
275
- ✓  browser  test/sdk/session/getInitialSession.browser.test.ts (6 tests) 29ms
276
- ✓  browser  test/sdk/account/changeContractToken.browser.test.ts (9 tests) 80ms
277
- ✓  browser  test/components/account/OrganizationDrawer.browser.test.tsx (5 tests) 1109ms
278
- ✓ renders the menu view with contract details and manage footer  577ms
277
+ ✓  browser  test/pages/password-protection.browser.test.tsx (6 tests) 1159ms
278
+ ✓ renders the password protection form  515ms
279
+ ✓  browser  test/sdk/account/changeContractToken.browser.test.ts (9 tests) 31ms
280
+ ✓  browser  test/components/account/OrganizationDrawer.browser.test.tsx (5 tests) 1172ms
281
+ ✓ renders the menu view with contract details and manage footer  744ms
279
282
  stderr | test/sdk/localization/store-url.browser.test.ts
280
283
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
281
- at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
284
+ at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
285
+ at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:120:9)
282
286
  at onValidate (/home/runner/work/faststore/faststore/packages/core/src/sdk/useStore.ts:18:20)
283
287
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
284
288
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
285
289
 
286
- ✓  browser  test/sdk/localization/store-url.browser.test.ts (3 tests) 17ms
287
- ✓  browser  test/sdk/account/useSwitchContract.browser.test.ts (4 tests) 119ms
288
- ✓  browser  test/sdk/account/useAvailableContracts.browser.test.ts (6 tests) 74ms
290
+ ✓  browser  test/sdk/localization/store-url.browser.test.ts (3 tests) 7ms
291
+ ✓  browser  test/sdk/account/useAvailableContracts.browser.test.ts (6 tests) 31ms
292
+ ✓  browser  test/components/templates/SearchPage/SearchWrapper.browser.test.tsx (3 tests) 21ms
293
+ ✓  browser  test/sdk/account/useSwitchContract.browser.test.ts (4 tests) 36ms
289
294
  stderr | test/components/account/doLogout.browser.test.ts
290
295
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
291
- at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
296
+ at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
297
+ at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:120:9)
292
298
  at onValidate (/home/runner/work/faststore/faststore/packages/core/src/sdk/useStore.ts:18:20)
293
299
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
294
300
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
295
301
 
296
- ✓  browser  test/components/account/doLogout.browser.test.ts (1 test) 31ms
297
- ✓  browser  test/components/account/OrganizationDrawerHeader.browser.test.tsx (3 tests) 251ms
298
- ✓  browser  test/components/account/OrganizationDrawerFooter.browser.test.tsx (3 tests) 306ms
302
+ ✓  browser  test/components/account/doLogout.browser.test.ts (1 test) 14ms
303
+ ✓  browser  test/components/account/OrganizationDrawerHeader.browser.test.tsx (3 tests) 186ms
299
304
  stderr | test/sdk/account/clearPersistedSessionState.browser.test.ts
300
305
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
301
- at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
306
+ at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
307
+ at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:120:9)
302
308
  at onValidate (/home/runner/work/faststore/faststore/packages/core/src/sdk/useStore.ts:18:20)
303
309
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
304
310
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
305
311
 
306
- ✓  browser  test/utils/isLocalHost.browser.test.ts (3 tests) 5ms
307
- ✓  browser  test/sdk/account/clearPersistedSessionState.browser.test.ts (1 test) 7ms
308
- ✓  browser  test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts (1 test) 3ms
309
- ✓  node  test/utils/localization/bindingPaths.test.ts (71 tests) 27ms
310
- ✓  node  test/server/password-protection-service.test.ts (22 tests) 35ms
311
- ✓  node  test/utils/match-url.test.ts (10 tests) 9ms
312
+ ✓  browser  test/sdk/account/clearPersistedSessionState.browser.test.ts (1 test) 14ms
313
+ ✓  browser  test/components/account/OrganizationDrawerFooter.browser.test.tsx (3 tests) 239ms
314
+ ✓  browser  test/utils/isLocalHost.browser.test.ts (3 tests) 4ms
315
+ ✓  browser  test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts (1 test) 2ms
316
+ ✓  node  test/utils/localization/bindingPaths.test.ts (71 tests) 21ms
317
+ ✓  browser  test/components/skeletons/ProductGridSkeleton.browser.test.tsx (2 tests) 29ms
318
+ ✓  node  test/server/password-protection-service.test.ts (22 tests) 25ms
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
- at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:121:27)
321
+ at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
322
+ at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:120:9)
315
323
  at onValidate (/home/runner/work/faststore/faststore/packages/core/src/sdk/useStore.ts:18:20)
316
324
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
317
325
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
318
326
 
319
- ✓  node  test/sdk/localization/useBindingSelector.test.tsx (22 tests) 13ms
320
- ✓  browser  test/sdk/account/refreshToken.browser.test.ts (1 test) 5ms
321
- ✓  node  test/sdk/localization/bindingSelector.test.ts (18 tests) 10ms
322
- ✓  node  test/pages/api/unlock.test.ts (15 tests) 147ms
327
+ ✓  node  test/utils/match-url.test.ts (10 tests) 5ms
328
+ ✓  browser  test/sdk/account/refreshToken.browser.test.ts (1 test) 4ms
329
+ ✓  node  test/sdk/localization/useBindingSelector.test.tsx (22 tests) 11ms
330
+ ✓  node  test/pages/api/unlock.test.ts (15 tests) 118ms
331
+ ✓  node  test/sdk/localization/bindingSelector.test.ts (18 tests) 8ms
323
332
  stderr | test/components/search/SearchInputComponent.test.tsx
324
333
  Warning: forwardRef render functions accept exactly two parameters: props and ref. Did you forget to use the ref parameter?
325
334
 
@@ -383,12 +392,11 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
383
392
  at Suspense
384
393
  at Wrapper (/home/runner/work/faststore/faststore/packages/core/test/components/search/SearchInputComponent.test.tsx:106:20)
385
394
 
386
- ✓  node  test/components/search/SearchInputComponent.test.tsx (6 tests) 84ms
387
- ✓  node  test/utils/cookieCacheBusting.test.ts (10 tests) 9ms
388
- ✓  node  test/sdk/search/useSearchHistory.test.ts (13 tests) 54ms
389
- ✓  node  test/experimental/myAccountCmsServerSideProps.test.ts (5 tests) 10ms
390
- ✓  node  test/utils/clearCookies.test.ts (20 tests) 29ms
391
- ✓  node  test/components/quotes/MyAccountListQuotesTable.test.tsx (12 tests) 386ms
395
+ ✓  node  test/components/search/SearchInputComponent.test.tsx (6 tests) 58ms
396
+ ✓  node  test/utils/cookieCacheBusting.test.ts (10 tests) 10ms
397
+ ✓  node  test/sdk/search/useSearchHistory.test.ts (13 tests) 44ms
398
+ ✓  node  test/experimental/myAccountCmsServerSideProps.test.ts (5 tests) 8ms
399
+ ✓  node  test/utils/clearCookies.test.ts (20 tests) 19ms
392
400
  stderr | test/pages/api/graphql.test.ts > /api/graphql error status propagation > propagates the upstream 400 from a wrapped BadRequestError instead of 500
393
401
  Graphql execution returned with error: [
394
402
  {
@@ -437,7 +445,7 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
437
445
 
438
446
  stderr | test/pages/api/graphql.test.ts > /api/graphql request handling > maps BadRequestError thrown by execute to its status
439
447
  Something unexpected occurred querying Graphql endpoint:
440
- _ [FastStoreError]: malformed
448
+ T [FastStoreError]: malformed
441
449
  at /home/runner/work/faststore/faststore/packages/core/test/pages/api/graphql.test.ts:190:31
442
450
  at /home/runner/work/faststore/faststore/packages/core/test/pages/api/graphql.test.ts:196:39
443
451
  at file:///home/runner/work/faststore/faststore/node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/index.js:1024:60
@@ -453,7 +461,7 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
453
461
 
454
462
  stderr | test/pages/api/graphql.test.ts > /api/graphql request handling > maps UnauthorizedError thrown by execute to its status
455
463
  Something unexpected occurred querying Graphql endpoint:
456
- te [FastStoreError]: expired
464
+ re [FastStoreError]: expired
457
465
  at /home/runner/work/faststore/faststore/packages/core/test/pages/api/graphql.test.ts:191:33
458
466
  at /home/runner/work/faststore/faststore/packages/core/test/pages/api/graphql.test.ts:196:39
459
467
  at file:///home/runner/work/faststore/faststore/node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/index.js:1024:60
@@ -481,61 +489,64 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
481
489
  at file:///home/runner/work/faststore/faststore/node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/index.js:1653:37
482
490
  at Traces.$ (file:///home/runner/work/faststore/faststore/node_modules/.pnpm/vitest@4.0.18_@opentelemetry+api@1.9.0_@types+node@20.19.13_jiti@2.6.1_jsdom@27.4.0_sas_13be941c57d55f08f06eeaf1c180ddfe/node_modules/vitest/dist/chunks/traces.CCmnQaNT.js:142:27)
483
491
 
484
- ✓  node  test/pages/api/graphql.test.ts (17 tests) 20ms
492
+ ✓  node  test/pages/api/graphql.test.ts (17 tests) 24ms
493
+ ✓  node  test/components/quotes/MyAccountListQuotesTable.test.tsx (12 tests) 323ms
485
494
  stderr | test/sdk/account/useSetPassword.test.ts > useSetPassword > maps wrongcredentials error responses to the existing message
486
495
  Set password request failed: Bad Request
487
496
 
488
- ✓  node  test/sdk/account/useSetPassword.test.ts (6 tests) 29ms
489
- ✓  node  test/components/quotes/MyAccountListQuotes.test.tsx (9 tests) 842ms
490
- ✓ navigates with the search term on blur  362ms
491
- ✓ navigates without a label param when the search is cleared  364ms
492
- ✓  node  test/components/quotes/quoteFilters.test.ts (23 tests) 35ms
497
+ ✓  node  test/sdk/account/useSetPassword.test.ts (6 tests) 20ms
498
+ ✓  node  test/sdk/orderEntry/useOrderEntryOperation.test.ts (8 tests) 24ms
499
+ ✓  node  test/components/quotes/MyAccountListQuotes.test.tsx (9 tests) 795ms
500
+ ✓ navigates with the search term on blur  360ms
501
+ ✓ navigates without a label param when the search is cleared  358ms
502
+ ✓  node  test/components/quotes/quoteFilters.test.ts (23 tests) 26ms
493
503
  ✓  node  test/utils/multipleTemplates.test.ts (8 tests) 6ms
494
- ✓  node  test/sdk/orderEntry/useOrderEntryOperation.test.ts (8 tests) 30ms
495
- ✓  node  test/utils/localization/localizeRedirectDestination.test.ts (11 tests) 5ms
496
- ✓  node  test/sdk/orderEntry/useOrderEntryUpload.test.ts (8 tests) 71ms
497
- ✓  node  test/components/quotes/MyAccountQuotesFilterSlider.test.tsx (5 tests) 125ms
498
- ✓  node  test/sdk/analytics/useStartRecommendationSession.test.ts (6 tests) 45ms
499
- ✓  node  test/sdk/orderEntry/useOrderEntry.test.ts (8 tests) 40ms
500
- ✓  node  test/proxy.localization.test.ts (5 tests) 45ms
501
- ✓  node  test/server/index.test.ts (7 tests) 830ms
502
- ✓ should handle options and execute  313ms
503
- ✓  node  test/sdk/account/getMyAccountRoutes.test.ts (10 tests) 9ms
504
- ✓  node  test/proxy.test.ts (4 tests) 14ms
505
- ✓  node  test/server/webops-api.test.ts (9 tests) 15ms
506
- ✓  node  test/sdk/orderEntry/useOrderFormItems.test.ts (7 tests) 46ms
507
- ✓  node  test/server/content/service.test.ts (5 tests) 5ms
508
- ✓  node  test/components/quotes/MyAccountQuotesSelectedTags.test.tsx (8 tests) 103ms
509
- ✓  node  test/sdk/account/refreshToken.test.ts (5 tests) 9ms
510
- ✓  node  test/server/cms/global.test.ts (3 tests) 5ms
511
- ✓  node  test/sdk/localization/store-url.test.ts (1 test) 4ms
512
- ✓  node  test/sdk/auth/useAuth.test.ts (5 tests) 27ms
513
- ✓  node  test/components/quotes/MyAccountQuotesStatusSelector.test.tsx (6 tests) 120ms
514
- ✓  node  test/sdk/analytics/hasEnabledRecommendationShelf.test.ts (6 tests) 5ms
515
- ✓  node  test/utils/getRequestHostname.test.ts (12 tests) 7ms
516
- ✓  node  test/pages/api/preview.test.ts (2 tests) 9ms
517
- ✓  node  test/utils/validateSessionRefreshToken.test.ts (6 tests) 5ms
518
- ✓  node  test/server/rootSpan.test.ts (4 tests) 31ms
519
- ✓  node  test/components/search/SearchInput.test.ts (6 tests) 8ms
504
+ ✓  node  test/utils/localization/localizeRedirectDestination.test.ts (11 tests) 4ms
505
+ ✓  node  test/sdk/orderEntry/useOrderEntryUpload.test.ts (8 tests) 37ms
506
+ ✓  node  test/components/quotes/MyAccountQuotesFilterSlider.test.tsx (5 tests) 103ms
507
+ ✓  node  test/sdk/analytics/useStartRecommendationSession.test.ts (6 tests) 38ms
508
+ ✓  node  test/sdk/orderEntry/useOrderEntry.test.ts (8 tests) 30ms
509
+ ✓  node  test/proxy.localization.test.ts (5 tests) 28ms
510
+ ✓  node  test/sdk/account/getMyAccountRoutes.test.ts (10 tests) 5ms
511
+ ✓  node  test/sdk/session/syncSalesChannelFromOrderForm.test.ts (6 tests) 5ms
512
+ ✓  node  test/server/index.test.ts (7 tests) 946ms
513
+ ✓ should handle options and execute  513ms
514
+ ✓  node  test/proxy.test.ts (4 tests) 13ms
515
+ ✓  node  test/server/webops-api.test.ts (9 tests) 13ms
516
+ ✓  node  test/components/quotes/MyAccountQuotesSelectedTags.test.tsx (8 tests) 89ms
517
+ ✓  node  test/sdk/orderEntry/useOrderFormItems.test.ts (7 tests) 29ms
518
+ ✓  node  test/server/content/service.test.ts (5 tests) 4ms
519
+ ✓  node  test/sdk/cart/waitForSessionValidated.test.ts (5 tests) 9ms
520
+ ✓  node  test/sdk/account/refreshToken.test.ts (5 tests) 6ms
521
+ ✓  node  test/server/cms/global.test.ts (3 tests) 4ms
522
+ ✓  node  test/sdk/localization/store-url.test.ts (1 test) 2ms
523
+ ✓  node  test/sdk/auth/useAuth.test.ts (5 tests) 24ms
524
+ ✓  node  test/sdk/analytics/hasEnabledRecommendationShelf.test.ts (6 tests) 4ms
525
+ ✓  node  test/components/quotes/MyAccountQuotesStatusSelector.test.tsx (6 tests) 92ms
526
+ ✓  node  test/utils/getRequestHostname.test.ts (12 tests) 3ms
527
+ ✓  node  test/pages/api/preview.test.ts (2 tests) 5ms
528
+ ✓  node  test/utils/validateSessionRefreshToken.test.ts (6 tests) 4ms
529
+ ✓  node  test/server/rootSpan.test.ts (4 tests) 38ms
530
+ ✓  node  test/components/search/SearchInput.test.ts (6 tests) 6ms
520
531
  ✓  node  test/components/RecommendationShelf/vrn.test.ts (5 tests) 4ms
521
- ✓  node  test/server/cms/index.test.ts (2 tests) 6ms
522
- ✓  node  test/utils/retry.test.ts (5 tests) 13ms
523
- ✓  node  test/components/account/Layout.test.tsx (4 tests) 39ms
524
- ✓  node  test/components/RecommendationShelf/useRecommendationUserId.test.ts (4 tests) 193ms
525
- ✓  node  test/utils/unlockResponse.test.ts (11 tests) 4ms
532
+ ✓  node  test/server/cms/index.test.ts (2 tests) 4ms
533
+ ✓  node  test/utils/retry.test.ts (5 tests) 12ms
534
+ ✓  node  test/components/account/Layout.test.tsx (4 tests) 29ms
535
+ ✓  node  test/components/RecommendationShelf/useRecommendationUserId.test.ts (4 tests) 185ms
536
+ ✓  node  test/utils/unlockResponse.test.ts (11 tests) 3ms
526
537
  ✓  node  test/server/cms/myAccountDefaultSections.test.ts (5 tests) 5ms
527
- ✓  node  test/components/RecommendationShelf/useRecommendations.test.ts (2 tests) 5ms
528
- ✓  node  test/utils/isLocalHost.test.ts (7 tests) 6ms
529
- ✓  node  test/components/account/OrganizationDrawerBody.test.tsx (3 tests) 39ms
530
- ✓  node  test/utils/userOrderStatus.test.ts (3 tests) 4ms
538
+ ✓  node  test/components/RecommendationShelf/useRecommendations.test.ts (2 tests) 3ms
539
+ ✓  node  test/utils/isLocalHost.test.ts (7 tests) 4ms
540
+ ✓  node  test/utils/userOrderStatus.test.ts (3 tests) 3ms
541
+ ✓  node  test/components/account/OrganizationDrawerBody.test.tsx (3 tests) 33ms
531
542
  ✓  node  test/sdk/analytics/utils.test.ts (2 tests) 3ms
532
543
  ✓  node  test/instrumentation.test.ts (3 tests) 6ms
533
- ✓  node  test/components/auth/ProfileChallenge.test.tsx (3 tests) 27ms
534
- ✓  node  test/sdk/account/clearPersistedSessionState.test.ts (1 test) 12ms
535
- ✓  node  test/components/quotes/MyAccountQuoteStatusBadge.test.tsx (2 tests) 22ms
536
-
537
-  Test Files  75 passed (75)
538
-  Tests  584 passed (584)
539
-  Start at  22:51:57
540
-  Duration  33.94s (transform 8.01s, setup 0ms, import 27.87s, tests 10.10s, environment 44.06s)
544
+ ✓  node  test/components/auth/ProfileChallenge.test.tsx (3 tests) 32ms
545
+ ✓  node  test/sdk/account/clearPersistedSessionState.test.ts (1 test) 13ms
546
+ ✓  node  test/components/quotes/MyAccountQuoteStatusBadge.test.tsx (2 tests) 18ms
547
+
548
+  Test Files  81 passed (81)
549
+  Tests  651 passed (651)
550
+  Start at  02:49:36
551
+  Duration  29.47s (transform 7.03s, setup 0ms, import 25.03s, tests 8.86s, environment 38.42s)
541
552
 
package/@generated/gql.ts CHANGED
@@ -45,7 +45,7 @@ type Documents = {
45
45
  "\n mutation ProcessOrderAuthorizationMutation($data: IProcessOrderAuthorization!) {\n processOrderAuthorization(data: $data) {\n isPendingForOtherAuthorizer\n ruleForAuthorization {\n orderAuthorizationId\n dimensionId\n rule {\n id\n name\n status\n doId\n authorizedEmails\n priority\n trigger {\n condition {\n conditionType\n description\n lessThan\n greatherThan\n expression\n }\n effect {\n description\n effectType\n funcPath\n }\n }\n timeout\n notification\n scoreInterval {\n accept\n deny\n }\n authorizationData {\n requireAllApprovals\n authorizers {\n id\n email\n type\n authorizationDate\n }\n }\n isUserAuthorized\n isUserNextAuthorizer\n }\n }\n }\n }\n": typeof types.ProcessOrderAuthorizationMutationDocument,
46
46
  "\n query ValidateUser {\n validateUser {\n isValid\n }\n }\n": typeof types.ValidateUserDocument,
47
47
  "\n mutation StartRecommendationSession {\n startRecommendationSession\n }\n": typeof types.StartRecommendationSessionDocument,
48
- "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n": typeof types.ValidateCartMutationDocument,
48
+ "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n salesChannel\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n": typeof types.ValidateCartMutationDocument,
49
49
  "\n query ClientPickupPointsQuery(\n $geoCoordinates: IStoreGeoCoordinates\n ) {\n pickupPoints(geoCoordinates: $geoCoordinates) {\n pickupPointDistances {\n pickupId\n distance\n pickupName\n isActive\n address {\n city\n state\n number\n postalCode\n street\n }\n }\n }\n }\n": typeof types.ClientPickupPointsQueryDocument,
50
50
  "\n mutation SubscribeToNewsletter($data: IPersonNewsletter!) {\n subscribeToNewsletter(data: $data) {\n id\n }\n }\n": typeof types.SubscribeToNewsletterDocument,
51
51
  "\n mutation StartOrderEntryOperationMutation($data: IOrderEntryOperation!) {\n startOrderEntryOperation(data: $data) {\n operationId\n }\n }\n": typeof types.StartOrderEntryOperationMutationDocument,
@@ -97,7 +97,7 @@ const documents: Documents = {
97
97
  "\n mutation ProcessOrderAuthorizationMutation($data: IProcessOrderAuthorization!) {\n processOrderAuthorization(data: $data) {\n isPendingForOtherAuthorizer\n ruleForAuthorization {\n orderAuthorizationId\n dimensionId\n rule {\n id\n name\n status\n doId\n authorizedEmails\n priority\n trigger {\n condition {\n conditionType\n description\n lessThan\n greatherThan\n expression\n }\n effect {\n description\n effectType\n funcPath\n }\n }\n timeout\n notification\n scoreInterval {\n accept\n deny\n }\n authorizationData {\n requireAllApprovals\n authorizers {\n id\n email\n type\n authorizationDate\n }\n }\n isUserAuthorized\n isUserNextAuthorizer\n }\n }\n }\n }\n": types.ProcessOrderAuthorizationMutationDocument,
98
98
  "\n query ValidateUser {\n validateUser {\n isValid\n }\n }\n": types.ValidateUserDocument,
99
99
  "\n mutation StartRecommendationSession {\n startRecommendationSession\n }\n": types.StartRecommendationSessionDocument,
100
- "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n": types.ValidateCartMutationDocument,
100
+ "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n salesChannel\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n": types.ValidateCartMutationDocument,
101
101
  "\n query ClientPickupPointsQuery(\n $geoCoordinates: IStoreGeoCoordinates\n ) {\n pickupPoints(geoCoordinates: $geoCoordinates) {\n pickupPointDistances {\n pickupId\n distance\n pickupName\n isActive\n address {\n city\n state\n number\n postalCode\n street\n }\n }\n }\n }\n": types.ClientPickupPointsQueryDocument,
102
102
  "\n mutation SubscribeToNewsletter($data: IPersonNewsletter!) {\n subscribeToNewsletter(data: $data) {\n id\n }\n }\n": types.SubscribeToNewsletterDocument,
103
103
  "\n mutation StartOrderEntryOperationMutation($data: IOrderEntryOperation!) {\n startOrderEntryOperation(data: $data) {\n operationId\n }\n }\n": types.StartOrderEntryOperationMutationDocument,
@@ -242,7 +242,7 @@ export function gql(source: "\n mutation StartRecommendationSession {\n star
242
242
  /**
243
243
  * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
244
244
  */
245
- export function gql(source: "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n"): typeof import('./graphql').ValidateCartMutationDocument;
245
+ export function gql(source: "\n mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) {\n validateCart(cart: $cart, session: $session) {\n order {\n orderNumber\n salesChannel\n acceptedOffer {\n ...CartItem\n }\n shouldSplitItem\n }\n messages {\n ...CartMessage\n }\n }\n }\n\n fragment CartMessage on StoreCartMessage {\n text\n status\n }\n\n fragment CartItem on StoreOffer {\n seller {\n identifier\n }\n quantity\n price\n priceWithTaxes\n listPrice\n listPriceWithTaxes\n isGift\n priceToken\n itemOffered {\n ...CartProductItem\n }\n }\n\n fragment CartProductItem on StoreProduct {\n sku\n name\n unitMultiplier\n image {\n url\n alternateName\n }\n brand {\n name\n }\n isVariantOf {\n productGroupID\n name\n skuVariants {\n activeVariations\n slugsMap\n availableVariations\n }\n }\n gtin\n additionalProperty {\n propertyID\n name\n value\n valueReference\n }\n }\n"): typeof import('./graphql').ValidateCartMutationDocument;
246
246
  /**
247
247
  * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
248
248
  */
@@ -1538,6 +1538,12 @@ export type StoreOrder = {
1538
1538
  acceptedOffer: Array<StoreOffer>;
1539
1539
  /** ID of the order in [VTEX order management](https://help.vtex.com/en/tutorial/license-manager-resources-oms--60QcBsvWeum02cFi3GjBzg#). */
1540
1540
  orderNumber: Scalars['String']['output'];
1541
+ /**
1542
+ * Sales channel of the underlying orderForm when FastStore adopted it because
1543
+ * the browser session was stale (e.g. after Quick Order). Clients should align
1544
+ * `session.channel` to this value. Null when no SC adoption happened.
1545
+ */
1546
+ salesChannel: Maybe<Scalars['String']['output']>;
1541
1547
  /** Indicates whether or not items with attachments should be split. */
1542
1548
  shouldSplitItem: Maybe<Scalars['Boolean']['output']>;
1543
1549
  };
@@ -2863,7 +2869,7 @@ export type ValidateCartMutationMutationVariables = Exact<{
2863
2869
  }>;
2864
2870
 
2865
2871
 
2866
- export type ValidateCartMutationMutation = { validateCart: { order: { orderNumber: string, shouldSplitItem: boolean | null, acceptedOffer: Array<{ quantity: number, price: number, priceWithTaxes: number, listPrice: number, listPriceWithTaxes: number, isGift: boolean | null, priceToken: string | null, seller: { identifier: string }, itemOffered: { sku: string, name: string, unitMultiplier: number | null, gtin: string, image: Array<{ url: string, alternateName: string }>, brand: { name: string }, isVariantOf: { productGroupID: string, name: string, skuVariants: { activeVariations: any | null, slugsMap: any | null, availableVariations: any | null } | null }, additionalProperty: Array<{ propertyID: string, name: string, value: any, valueReference: any }> } }> }, messages: Array<{ text: string, status: StoreStatus }> } | null };
2872
+ export type ValidateCartMutationMutation = { validateCart: { order: { orderNumber: string, salesChannel: string | null, shouldSplitItem: boolean | null, acceptedOffer: Array<{ quantity: number, price: number, priceWithTaxes: number, listPrice: number, listPriceWithTaxes: number, isGift: boolean | null, priceToken: string | null, seller: { identifier: string }, itemOffered: { sku: string, name: string, unitMultiplier: number | null, gtin: string, image: Array<{ url: string, alternateName: string }>, brand: { name: string }, isVariantOf: { productGroupID: string, name: string, skuVariants: { activeVariations: any | null, slugsMap: any | null, availableVariations: any | null } | null }, additionalProperty: Array<{ propertyID: string, name: string, value: any, valueReference: any }> } }> }, messages: Array<{ text: string, status: StoreStatus }> } | null };
2867
2873
 
2868
2874
  export type CartMessageFragment = { text: string, status: StoreStatus };
2869
2875
 
@@ -3565,7 +3571,7 @@ export const CancelOrderMutationDocument = {"__meta__":{"operationName":"CancelO
3565
3571
  export const ProcessOrderAuthorizationMutationDocument = {"__meta__":{"operationName":"ProcessOrderAuthorizationMutation","operationHash":"8c25d37c8d6e7c20ab21bb8a4f4e6a2fe320ea8d"}} as unknown as TypedDocumentString<ProcessOrderAuthorizationMutationMutation, ProcessOrderAuthorizationMutationMutationVariables>;
3566
3572
  export const ValidateUserDocument = {"__meta__":{"operationName":"ValidateUser","operationHash":"32f99c73c3de958b64d6bece1afe800469f54548"}} as unknown as TypedDocumentString<ValidateUserQuery, ValidateUserQueryVariables>;
3567
3573
  export const StartRecommendationSessionDocument = {"__meta__":{"operationName":"StartRecommendationSession","operationHash":"1def6438c0cd87b85002411ac7326c221f192583"}} as unknown as TypedDocumentString<StartRecommendationSessionMutation, StartRecommendationSessionMutationVariables>;
3568
- export const ValidateCartMutationDocument = {"__meta__":{"operationName":"ValidateCartMutation","operationHash":"8199d03debb0a6751ec53d8ee8987b78d0292acb"}} as unknown as TypedDocumentString<ValidateCartMutationMutation, ValidateCartMutationMutationVariables>;
3574
+ export const ValidateCartMutationDocument = {"__meta__":{"operationName":"ValidateCartMutation","operationHash":"3c71b0d3fc2bade14df68abfa271858beb361b12"}} as unknown as TypedDocumentString<ValidateCartMutationMutation, ValidateCartMutationMutationVariables>;
3569
3575
  export const ClientPickupPointsQueryDocument = {"__meta__":{"operationName":"ClientPickupPointsQuery","operationHash":"3fa04e88c811fcb5ece7206fd5aa745bdbc143a8"}} as unknown as TypedDocumentString<ClientPickupPointsQueryQuery, ClientPickupPointsQueryQueryVariables>;
3570
3576
  export const SubscribeToNewsletterDocument = {"__meta__":{"operationName":"SubscribeToNewsletter","operationHash":"feb7005103a859e2bc8cf2360d568806fd88deba"}} as unknown as TypedDocumentString<SubscribeToNewsletterMutation, SubscribeToNewsletterMutationVariables>;
3571
3577
  export const StartOrderEntryOperationMutationDocument = {"__meta__":{"operationName":"StartOrderEntryOperationMutation","operationHash":"78c50fbf9b85d03dbeac9b05b06405217f2ec440"}} as unknown as TypedDocumentString<StartOrderEntryOperationMutationMutation, StartOrderEntryOperationMutationMutationVariables>;
@@ -15,7 +15,7 @@
15
15
  "8c25d37c8d6e7c20ab21bb8a4f4e6a2fe320ea8d": "mutation ProcessOrderAuthorizationMutation($data: IProcessOrderAuthorization!) { processOrderAuthorization(data: $data) { isPendingForOtherAuthorizer ruleForAuthorization { dimensionId orderAuthorizationId rule { authorizationData { authorizers { authorizationDate email id type } requireAllApprovals } authorizedEmails doId id isUserAuthorized isUserNextAuthorizer name notification priority scoreInterval { accept deny } status timeout trigger { condition { conditionType description expression greatherThan lessThan } effect { description effectType funcPath } } } } } }",
16
16
  "32f99c73c3de958b64d6bece1afe800469f54548": "query ValidateUser { validateUser { isValid } }",
17
17
  "1def6438c0cd87b85002411ac7326c221f192583": "mutation StartRecommendationSession { startRecommendationSession }",
18
- "8199d03debb0a6751ec53d8ee8987b78d0292acb": "fragment CartItem on StoreOffer { isGift itemOffered { ...CartProductItem } listPrice listPriceWithTaxes price priceToken priceWithTaxes quantity seller { identifier } } fragment CartMessage on StoreCartMessage { status text } fragment CartProductItem on StoreProduct { additionalProperty { name propertyID value valueReference } brand { name } gtin image { alternateName url } isVariantOf { name productGroupID skuVariants { activeVariations availableVariations slugsMap } } name sku unitMultiplier } mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) { validateCart(cart: $cart, session: $session) { messages { ...CartMessage } order { acceptedOffer { ...CartItem } orderNumber shouldSplitItem } } }",
18
+ "3c71b0d3fc2bade14df68abfa271858beb361b12": "fragment CartItem on StoreOffer { isGift itemOffered { ...CartProductItem } listPrice listPriceWithTaxes price priceToken priceWithTaxes quantity seller { identifier } } fragment CartMessage on StoreCartMessage { status text } fragment CartProductItem on StoreProduct { additionalProperty { name propertyID value valueReference } brand { name } gtin image { alternateName url } isVariantOf { name productGroupID skuVariants { activeVariations availableVariations slugsMap } } name sku unitMultiplier } mutation ValidateCartMutation($cart: IStoreCart!, $session: IStoreSession!) { validateCart(cart: $cart, session: $session) { messages { ...CartMessage } order { acceptedOffer { ...CartItem } orderNumber salesChannel shouldSplitItem } } }",
19
19
  "3fa04e88c811fcb5ece7206fd5aa745bdbc143a8": "query ClientPickupPointsQuery($geoCoordinates: IStoreGeoCoordinates) { pickupPoints(geoCoordinates: $geoCoordinates) { pickupPointDistances { address { city number postalCode state street } distance isActive pickupId pickupName } } }",
20
20
  "feb7005103a859e2bc8cf2360d568806fd88deba": "mutation SubscribeToNewsletter($data: IPersonNewsletter!) { subscribeToNewsletter(data: $data) { id } }",
21
21
  "78c50fbf9b85d03dbeac9b05b06405217f2ec440": "mutation StartOrderEntryOperationMutation($data: IOrderEntryOperation!) { startOrderEntryOperation(data: $data) { operationId } }",
@@ -1538,6 +1538,12 @@ type StoreOrder {
1538
1538
  acceptedOffer: [StoreOffer!]!
1539
1539
  """Indicates whether or not items with attachments should be split."""
1540
1540
  shouldSplitItem: Boolean
1541
+ """
1542
+ Sales channel of the underlying orderForm when FastStore adopted it because
1543
+ the browser session was stale (e.g. after Quick Order). Clients should align
1544
+ `session.channel` to this value. Null when no SC adoption happened.
1545
+ """
1546
+ salesChannel: String
1541
1547
  }
1542
1548
 
1543
1549
  type StoreOrderEntryMissingItem {
package/CHANGELOG.md CHANGED
@@ -3,6 +3,35 @@
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.6.0-dev.2](https://github.com/vtex/faststore/compare/v4.6.0-dev.1...v4.6.0-dev.2) (2026-08-12)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **api:** address Sonar and harden session sales-channel sync ([5f6e8e9](https://github.com/vtex/faststore/commit/5f6e8e909def75f60c24cdaffae9303ed2c0a052))
11
+ - **api:** keep orderForm sales channel after stale validateCart sync ([09b051b](https://github.com/vtex/faststore/commit/09b051b80aaff7183adf7f5e86aece438bcd38f0))
12
+ - **api:** preserve orderForm sales channel in validateCart ([2336cda](https://github.com/vtex/faststore/commit/2336cda2c95970850dd0d29c1c18043ca8c9078a))
13
+ - **api:** sync adopted orderForm sales channel into session ([8943da7](https://github.com/vtex/faststore/commit/8943da7821f8abec08a39b7907a258bf156b05ee))
14
+
15
+ # [4.6.0-dev.1](https://github.com/vtex/faststore/compare/v4.6.0-dev.0...v4.6.0-dev.1) (2026-08-11)
16
+
17
+ ## [4.5.1](https://github.com/vtex/faststore/compare/v4.5.1-dev.4...v4.5.1) (2026-08-11)
18
+
19
+ ### Bug Fixes
20
+
21
+ - **core:** address scroll restoration review feedback ([a5fe6a3](https://github.com/vtex/faststore/commit/a5fe6a35c54e6095f81c7995a815ce6ef3b4dd4e))
22
+ - **core:** align beforePopState callback with NextHistoryState ([10719e5](https://github.com/vtex/faststore/commit/10719e5eca199385d9fe18bdd6d7da290716a1d5))
23
+ - **core:** compare window to undefined directly for Sonar ([bf05a54](https://github.com/vtex/faststore/commit/bf05a54bb014d120b7bdc95ff7c01a4e9b35b485))
24
+ - **core:** harden scroll restore path matching and hydration-safe heights ([34efa6b](https://github.com/vtex/faststore/commit/34efa6bda7549895a4531277c2fe55bd6bbe98a7))
25
+ - **core:** hash gallery height keys to avoid truncation collisions ([9e98043](https://github.com/vtex/faststore/commit/9e980438d74e457fa33aa77900438339463a078c))
26
+ - **core:** prevent IS redirect hang and improve scroll restoration ([5f30778](https://github.com/vtex/faststore/commit/5f30778161eec2e4381b3fe971479dd7cbe53b08))
27
+ - **core:** reset infinite scroll on forward listing navigations ([249226a](https://github.com/vtex/faststore/commit/249226a3acbe4cb26d687cf962125b2593d5949e))
28
+ - **core:** resolve Sonar new-code smells for scroll restoration ([59b41ed](https://github.com/vtex/faststore/commit/59b41ed1d2a30ba693726b19895a0279eb1ba464))
29
+ - **core:** restore PLP infinite-scroll pages on back navigation ([92b2efa](https://github.com/vtex/faststore/commit/92b2efa1d4d0895a10b5a0e71a4d9bf37cae1686))
30
+ - **core:** resync gallery height lock when children change ([5058089](https://github.com/vtex/faststore/commit/50580898d97baf800b97c8a876f7967529859c61))
31
+ - **core:** satisfy Sonar on gallery height key hash ([3a6ce47](https://github.com/vtex/faststore/commit/3a6ce47485c26be75d6d76906df3af64c9e34fd6))
32
+ - **core:** type scroll restore paint timer for DOM/Node setTimeout ([940c903](https://github.com/vtex/faststore/commit/940c90376f8d2eb77665e73a6fb0ea53c9786c8e))
33
+ - **core:** use replaceAll for infinite-scroll session key ([4f52048](https://github.com/vtex/faststore/commit/4f520482a9ba9661782fcf25a286b8f2e6c6b922))
34
+
6
35
  # [4.6.0-dev.0](https://github.com/vtex/faststore/compare/v4.5.1-dev.4...v4.6.0-dev.0) (2026-08-11)
7
36
 
8
37
  ### Features
@@ -23,6 +52,22 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
23
52
  - **core:** remove duplicated twitter meta tag ([f388288](https://github.com/vtex/faststore/commit/f388288731ff75fceedba3cd7449ef1088b0b0c2))
24
53
  - **metaTags:** add twitter meta tags to nextSeo ([9c2439b](https://github.com/vtex/faststore/commit/9c2439b4a668dd81b7bfe5bdc44df575725067ec))
25
54
 
55
+ ## [4.5.1](https://github.com/vtex/faststore/compare/v4.5.1-dev.2...v4.5.1) (2026-08-11)
56
+
57
+ - **core:** address scroll restoration review feedback ([a5fe6a3](https://github.com/vtex/faststore/commit/a5fe6a35c54e6095f81c7995a815ce6ef3b4dd4e))
58
+ - **core:** align beforePopState callback with NextHistoryState ([10719e5](https://github.com/vtex/faststore/commit/10719e5eca199385d9fe18bdd6d7da290716a1d5))
59
+ - **core:** compare window to undefined directly for Sonar ([bf05a54](https://github.com/vtex/faststore/commit/bf05a54bb014d120b7bdc95ff7c01a4e9b35b485))
60
+ - **core:** harden scroll restore path matching and hydration-safe heights ([34efa6b](https://github.com/vtex/faststore/commit/34efa6bda7549895a4531277c2fe55bd6bbe98a7))
61
+ - **core:** hash gallery height keys to avoid truncation collisions ([9e98043](https://github.com/vtex/faststore/commit/9e980438d74e457fa33aa77900438339463a078c))
62
+ - **core:** prevent IS redirect hang and improve scroll restoration ([5f30778](https://github.com/vtex/faststore/commit/5f30778161eec2e4381b3fe971479dd7cbe53b08))
63
+ - **core:** reset infinite scroll on forward listing navigations ([249226a](https://github.com/vtex/faststore/commit/249226a3acbe4cb26d687cf962125b2593d5949e))
64
+ - **core:** resolve Sonar new-code smells for scroll restoration ([59b41ed](https://github.com/vtex/faststore/commit/59b41ed1d2a30ba693726b19895a0279eb1ba464))
65
+ - **core:** restore PLP infinite-scroll pages on back navigation ([92b2efa](https://github.com/vtex/faststore/commit/92b2efa1d4d0895a10b5a0e71a4d9bf37cae1686))
66
+ - **core:** resync gallery height lock when children change ([5058089](https://github.com/vtex/faststore/commit/50580898d97baf800b97c8a876f7967529859c61))
67
+ - **core:** satisfy Sonar on gallery height key hash ([3a6ce47](https://github.com/vtex/faststore/commit/3a6ce47485c26be75d6d76906df3af64c9e34fd6))
68
+ - **core:** type scroll restore paint timer for DOM/Node setTimeout ([940c903](https://github.com/vtex/faststore/commit/940c90376f8d2eb77665e73a6fb0ea53c9786c8e))
69
+ - **core:** use replaceAll for infinite-scroll session key ([4f52048](https://github.com/vtex/faststore/commit/4f520482a9ba9661782fcf25a286b8f2e6c6b922))
70
+
26
71
  ## [4.5.1-dev.2](https://github.com/vtex/faststore/compare/v4.5.1-dev.1...v4.5.1-dev.2) (2026-08-04)
27
72
 
28
73
  **Note:** Version bump only for package @faststore/core
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/core",
3
- "version": "4.6.0-dev.0",
3
+ "version": "4.6.0-dev.2",
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.6.0-dev.0",
75
- "@faststore/diagnostics": "4.6.0-dev.0",
76
- "@faststore/lighthouse": "4.6.0-dev.0",
77
- "@faststore/sdk": "4.6.0-dev.0",
78
- "@faststore/ui": "4.6.0-dev.0"
74
+ "@faststore/diagnostics": "4.6.0-dev.2",
75
+ "@faststore/api": "4.6.0-dev.2",
76
+ "@faststore/lighthouse": "4.6.0-dev.2",
77
+ "@faststore/sdk": "4.6.0-dev.2",
78
+ "@faststore/ui": "4.6.0-dev.2"
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>