@faststore/core 4.7.0-dev.3 → 4.7.0-dev.5

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.
Files changed (33) hide show
  1. package/.turbo/turbo-generate.log +3 -3
  2. package/.turbo/turbo-test.log +101 -92
  3. package/CHANGELOG.md +18 -0
  4. package/cms/faststore/components/cms_component__recommendationshelf.jsonc +1 -7
  5. package/cms/faststore/my-account/README.md +2 -2
  6. package/cms/faststore/schema.json +1 -7
  7. package/discovery.config.default.js +5 -0
  8. package/package.json +6 -6
  9. package/src/Layout.tsx +3 -3
  10. package/src/components/account/orders/OrderDetails/section.module.scss +44 -3
  11. package/src/components/cms/RenderSections.tsx +20 -2
  12. package/src/components/sections/RecommendationShelf/README.md +25 -15
  13. package/src/components/sections/RecommendationShelf/RecommendationShelf.tsx +0 -2
  14. package/src/components/sections/RecommendationShelf/RecommendationShelf.types.ts +0 -7
  15. package/src/pages/pvt/account/403.tsx +1 -0
  16. package/src/pages/pvt/account/404.tsx +5 -1
  17. package/src/pages/pvt/account/cards/index.tsx +1 -0
  18. package/src/pages/pvt/account/orders/[id].tsx +5 -1
  19. package/src/pages/pvt/account/orders/index.tsx +1 -0
  20. package/src/pages/pvt/account/profile.tsx +1 -0
  21. package/src/pages/pvt/account/security.tsx +1 -0
  22. package/src/pages/pvt/account/user-details.tsx +1 -0
  23. package/src/sdk/analytics/hooks/useStartRecommendationSession.ts +18 -13
  24. package/src/sdk/recommendations/useRecommendationShelf.ts +17 -15
  25. package/src/server/cms/myAccountDefaultSections.ts +8 -3
  26. package/test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx +11 -32
  27. package/test/components/cms/RenderSections.browser.test.tsx +135 -0
  28. package/test/sdk/analytics/useStartRecommendationSession.test.ts +27 -58
  29. package/test/sdk/recommendations/useRecommendationShelf.browser.test.tsx +32 -34
  30. package/test/sdk/recommendations/useRecommendationShelf.sessionFallback.browser.test.tsx +110 -0
  31. package/test/server/cms/myAccountDefaultSections.test.ts +44 -0
  32. package/src/sdk/analytics/utils/hasEnabledRecommendationShelf.ts +0 -49
  33. package/test/sdk/analytics/hasEnabledRecommendationShelf.test.ts +0 -88
@@ -1,9 +1,9 @@
1
1
 
2
- > @faststore/core@4.7.0-dev.2 generate /home/runner/work/faststore/faststore/packages/core
2
+ > @faststore/core@4.7.0-dev.4 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.7.0-dev.2 gen-types /home/runner/work/faststore/faststore/packages/core
6
+ > @faststore/core@4.7.0-dev.4 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.7.0-dev.2 cache-graphql /home/runner/work/faststore/faststore/packages/core
22
+ > @faststore/core@4.7.0-dev.4 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,5 +1,5 @@
1
1
 
2
- > @faststore/core@4.7.0-dev.2 test /home/runner/work/faststore/faststore/packages/core
2
+ > @faststore/core@4.7.0-dev.4 test /home/runner/work/faststore/faststore/packages/core
3
3
  > vitest run
4
4
 
5
5
 
@@ -7,20 +7,20 @@
7
7
 
8
8
  Not implemented: navigation to another Document
9
9
  Not implemented: navigation to another Document
10
- ✓  browser  test/sdk/ui/useScrollRestoration.browser.test.ts (43 tests) 1015ms
10
+ ✓  browser  test/sdk/ui/useScrollRestoration.browser.test.ts (43 tests) 1325ms
11
11
  Browserslist: browsers data (caniuse-lite) is 6 months old. Please run:
12
12
  npx update-browserslist-db@latest
13
13
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
14
- ✓  browser  test/components/account/cards/MyAccountListCards.browser.test.tsx (14 tests) 2045ms
15
- ✓ shows the tab bar and renders Personal cards by default  821ms
16
- ✓ paginates when there are more than 25 cards  327ms
17
- ✓  browser  test/components/ui/ProductGallery/GalleryPageHeightLock.browser.test.tsx (8 tests) 216ms
18
- ✓  browser  test/components/account/ContractSwitcher.browser.test.tsx (13 tests) 2517ms
19
- ✓ shows an error state when the list fails to load  773ms
20
- ✓ requires selecting a contract before Confirm is enabled, then switches (REQ-03)  391ms
21
- ✓ keeps Confirm disabled until a different contract is selected  338ms
22
- ✓  browser  test/sdk/session/reconcileSessionLocale.browser.test.ts (5 tests) 33ms
23
- ✓  browser  test/sdk/recommendations/useRecommendationShelf.browser.test.tsx (10 tests) 124ms
14
+ ✓  browser  test/components/ui/ProductGallery/GalleryPageHeightLock.browser.test.tsx (8 tests) 260ms
15
+ ✓  browser  test/components/account/ContractSwitcher.browser.test.tsx (13 tests) 2965ms
16
+ ✓ shows an error state when the list fails to load  863ms
17
+ ✓ requires selecting a contract before Confirm is enabled, then switches (REQ-03)  427ms
18
+ ✓ keeps Confirm disabled when switching is unavailable  372ms
19
+ ✓  browser  test/components/account/cards/MyAccountListCards.browser.test.tsx (14 tests) 2735ms
20
+ ✓ shows the tab bar and renders Personal cards by default  1165ms
21
+ ✓ paginates when there are more than 25 cards  380ms
22
+ ✓  browser  test/sdk/session/reconcileSessionLocale.browser.test.ts (5 tests) 30ms
23
+ ✓  browser  test/sdk/recommendations/useRecommendationShelf.browser.test.tsx (12 tests) 218ms
24
24
  stderr | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx
25
25
  Error in optimistic validation: TypeError: Failed to parse URL from /api/graphql?operationName=ValidateCartMutation&operationHash=3c71b0d3fc2bade14df68abfa271858beb361b12
26
26
   at node:internal/deps/undici/undici:16416:13
@@ -50,8 +50,7 @@ Browserslist: browsers data (caniuse-lite) is 6 months old. Please run:
50
50
  stderr | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx > RecommendationShelf > renders nothing when there is an error
51
51
  Error fetching recommendations undefined boom for campaign vrn:recommendations:acc:rec-top-items-v2:campaign-1
52
52
 
53
- ✓  browser  test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx (8 tests) 115ms
54
- ✓  browser  test/sdk/session/getInitialSession.browser.test.ts (6 tests) 22ms
53
+ ✓  browser  test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx (7 tests) 292ms
55
54
  stderr | test/pages/password-protection.browser.test.tsx > PasswordProtectionLogin > posts the password and redirects to the requested return path
56
55
  Warning: An update to PasswordProtectionLogin inside a test was not wrapped in act(...).
57
56
 
@@ -185,8 +184,7 @@ act(() => {
185
184
  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
186
185
  at PasswordProtectionLogin (/home/runner/work/faststore/faststore/packages/core/src/pages/password-protection/index.tsx:19:69)
187
186
 
188
- ✓  browser  test/components/account/OrganizationDrawer.browser.test.tsx (5 tests) 1169ms
189
- ✓ renders the menu view with contract details and manage footer  632ms
187
+ ✓  browser  test/sdk/session/getInitialSession.browser.test.ts (6 tests) 31ms
190
188
  stderr | test/pages/password-protection.browser.test.tsx > PasswordProtectionLogin > shows service unavailable when the response is not a login payload
191
189
  Warning: An update to PasswordProtectionLogin inside a test was not wrapped in act(...).
192
190
 
@@ -283,9 +281,19 @@ act(() => {
283
281
  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
284
282
  at PasswordProtectionLogin (/home/runner/work/faststore/faststore/packages/core/src/pages/password-protection/index.tsx:19:69)
285
283
 
286
- ✓  browser  test/pages/password-protection.browser.test.tsx (6 tests) 1239ms
287
- ✓ renders the password protection form  640ms
288
- ✓  browser  test/sdk/account/changeContractToken.browser.test.ts (9 tests) 28ms
284
+ ✓  browser  test/pages/password-protection.browser.test.tsx (6 tests) 1454ms
285
+ ✓ renders the password protection form  616ms
286
+ ✓  browser  test/components/account/OrganizationDrawer.browser.test.tsx (5 tests) 1396ms
287
+ ✓ renders the menu view with contract details and manage footer  889ms
288
+ ✓  browser  test/sdk/account/changeContractToken.browser.test.ts (9 tests) 24ms
289
+ stderr | test/components/cms/RenderSections.browser.test.tsx
290
+ Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
291
+ at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
292
+ at validateCart (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/index.ts:120:9)
293
+ at onValidate (/home/runner/work/faststore/faststore/packages/core/src/sdk/useStore.ts:18:20)
294
+ at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
295
+  at processTicksAndRejections (node:internal/process/task_queues:103:5)
296
+
289
297
  stderr | test/sdk/localization/store-url.browser.test.ts
290
298
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
291
299
  at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
@@ -294,10 +302,12 @@ This ensures that you're testing the behavior the user would see in the browser.
294
302
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
295
303
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
296
304
 
297
- ✓  browser  test/sdk/localization/store-url.browser.test.ts (3 tests) 5ms
298
- ✓  browser  test/sdk/account/useAvailableContracts.browser.test.ts (6 tests) 36ms
299
- ✓  browser  test/components/templates/SearchPage/SearchWrapper.browser.test.tsx (3 tests) 39ms
300
- ✓  browser  test/sdk/account/useSwitchContract.browser.test.ts (4 tests) 27ms
305
+ ✓  browser  test/sdk/localization/store-url.browser.test.ts (3 tests) 6ms
306
+ ✓  browser  test/components/cms/RenderSections.browser.test.tsx (5 tests) 81ms
307
+ ✓  browser  test/sdk/account/useAvailableContracts.browser.test.ts (6 tests) 34ms
308
+ ✓  browser  test/components/templates/SearchPage/SearchWrapper.browser.test.tsx (3 tests) 35ms
309
+ ✓  browser  test/sdk/account/useSwitchContract.browser.test.ts (4 tests) 42ms
310
+ ✓  browser  test/sdk/recommendations/useRecommendationShelf.sessionFallback.browser.test.tsx (2 tests) 137ms
301
311
  stderr | test/components/account/doLogout.browser.test.ts
302
312
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
303
313
  at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
@@ -306,10 +316,9 @@ This ensures that you're testing the behavior the user would see in the browser.
306
316
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
307
317
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
308
318
 
309
- ✓  browser  test/components/account/doLogout.browser.test.ts (1 test) 31ms
310
- ✓  browser  test/components/sections/Account/AccountListCards.browser.test.tsx (3 tests) 82ms
311
- ✓  browser  test/components/account/OrganizationDrawerHeader.browser.test.tsx (3 tests) 273ms
312
- ✓  browser  test/components/account/OrganizationDrawerFooter.browser.test.tsx (3 tests) 281ms
319
+ ✓  browser  test/components/account/doLogout.browser.test.ts (1 test) 20ms
320
+ ✓  browser  test/components/sections/Account/AccountListCards.browser.test.tsx (3 tests) 86ms
321
+ ✓  browser  test/components/account/OrganizationDrawerHeader.browser.test.tsx (3 tests) 317ms
313
322
  stderr | test/sdk/account/clearPersistedSessionState.browser.test.ts
314
323
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
315
324
  at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
@@ -318,12 +327,10 @@ This ensures that you're testing the behavior the user would see in the browser.
318
327
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
319
328
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
320
329
 
321
- ✓  browser  test/sdk/account/clearPersistedSessionState.browser.test.ts (1 test) 8ms
322
- ✓  browser  test/utils/isLocalHost.browser.test.ts (3 tests) 5ms
323
- ✓  browser  test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts (1 test) 3ms
324
- ✓  node  test/utils/localization/bindingPaths.test.ts (71 tests) 25ms
325
- ✓  browser  test/components/skeletons/ProductGridSkeleton.browser.test.tsx (2 tests) 40ms
326
- ✓  node  test/server/password-protection-service.test.ts (22 tests) 43ms
330
+ ✓  browser  test/sdk/account/clearPersistedSessionState.browser.test.ts (1 test) 13ms
331
+ ✓  browser  test/utils/isLocalHost.browser.test.ts (3 tests) 6ms
332
+ ✓  browser  test/components/account/OrganizationDrawerFooter.browser.test.tsx (3 tests) 322ms
333
+ ✓  browser  test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts (1 test) 4ms
327
334
  stderr | test/sdk/account/refreshToken.browser.test.ts
328
335
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
329
336
  at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
@@ -332,11 +339,14 @@ This ensures that you're testing the behavior the user would see in the browser.
332
339
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
333
340
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
334
341
 
335
- ✓  node  test/utils/match-url.test.ts (10 tests) 8ms
336
342
  ✓  browser  test/sdk/account/refreshToken.browser.test.ts (1 test) 5ms
337
- ✓  node  test/sdk/localization/useBindingSelector.test.tsx (22 tests) 15ms
338
- ✓  node  test/pages/api/unlock.test.ts (15 tests) 154ms
339
- ✓  node  test/sdk/localization/bindingSelector.test.ts (18 tests) 8ms
343
+ ✓  node  test/utils/localization/bindingPaths.test.ts (71 tests) 21ms
344
+ ✓  browser  test/components/skeletons/ProductGridSkeleton.browser.test.tsx (2 tests) 40ms
345
+ ✓  node  test/utils/match-url.test.ts (10 tests) 12ms
346
+ ✓  node  test/server/password-protection-service.test.ts (22 tests) 38ms
347
+ ✓  node  test/pages/api/unlock.test.ts (15 tests) 260ms
348
+ ✓  node  test/sdk/localization/useBindingSelector.test.tsx (22 tests) 21ms
349
+ ✓  node  test/sdk/localization/bindingSelector.test.ts (18 tests) 10ms
340
350
  stderr | test/components/search/SearchInputComponent.test.tsx
341
351
  Warning: forwardRef render functions accept exactly two parameters: props and ref. Did you forget to use the ref parameter?
342
352
 
@@ -401,18 +411,18 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
401
411
  at Wrapper (/home/runner/work/faststore/faststore/packages/core/test/components/search/SearchInputComponent.test.tsx:106:20)
402
412
 
403
413
  ✓  node  test/components/search/SearchInputComponent.test.tsx (6 tests) 73ms
404
- ✓  node  test/sdk/search/useSearchHistory.test.ts (13 tests) 54ms
405
- ✓  node  test/utils/cookieCacheBusting.test.ts (10 tests) 12ms
414
+ ✓  node  test/sdk/search/useSearchHistory.test.ts (13 tests) 53ms
415
+ ✓  node  test/utils/cookieCacheBusting.test.ts (10 tests) 17ms
406
416
  stderr | test/pages/pvt/account/cards/index.test.ts > Cards page getServerSideProps > redirects to /pvt/account/403 when the query fails with 401/403
407
417
  { extensions: { status: 401 } }
408
418
 
409
419
  stderr | test/pages/pvt/account/cards/index.test.ts > Cards page getServerSideProps > renders the error state (no redirect) when the query fails with a non-auth status
410
420
  { extensions: { status: 502 } }
411
421
 
412
- ✓  node  test/pages/pvt/account/cards/index.test.ts (8 tests) 11ms
413
- ✓  node  test/utils/clearCookies.test.ts (20 tests) 27ms
414
- ✓  node  test/experimental/myAccountCmsServerSideProps.test.ts (5 tests) 10ms
415
- ✓  node  test/components/quotes/MyAccountListQuotesTable.test.tsx (12 tests) 390ms
422
+ ✓  node  test/pages/pvt/account/cards/index.test.ts (8 tests) 14ms
423
+ ✓  node  test/utils/clearCookies.test.ts (20 tests) 28ms
424
+ ✓  node  test/experimental/myAccountCmsServerSideProps.test.ts (5 tests) 11ms
425
+ ✓  node  test/components/quotes/MyAccountListQuotesTable.test.tsx (12 tests) 441ms
416
426
  stderr | test/pages/api/graphql.test.ts > /api/graphql error status propagation > propagates the upstream 400 from a wrapped BadRequestError instead of 500
417
427
  Graphql execution returned with error: [
418
428
  {
@@ -505,65 +515,64 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
505
515
  at file:///home/runner/work/faststore/faststore/node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/index.js:1653:37
506
516
  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)
507
517
 
508
- ✓  node  test/pages/api/graphql.test.ts (17 tests) 22ms
509
- ✓  node  test/components/quotes/MyAccountListQuotes.test.tsx (9 tests) 840ms
510
- ✓ navigates with the search term on blur  360ms
518
+ ✓  node  test/pages/api/graphql.test.ts (17 tests) 24ms
519
+ ✓  node  test/components/quotes/MyAccountListQuotes.test.tsx (9 tests) 851ms
520
+ ✓ navigates with the search term on blur  362ms
511
521
  ✓ navigates without a label param when the search is cleared  361ms
512
522
  stderr | test/sdk/account/useSetPassword.test.ts > useSetPassword > maps wrongcredentials error responses to the existing message
513
523
  Set password request failed: Bad Request
514
524
 
515
- ✓  node  test/sdk/account/useSetPassword.test.ts (6 tests) 44ms
516
- ✓  node  test/components/quotes/quoteFilters.test.ts (23 tests) 37ms
517
- ✓  node  test/sdk/orderEntry/useOrderEntryOperation.test.ts (8 tests) 38ms
518
- ✓  node  test/utils/multipleTemplates.test.ts (8 tests) 5ms
525
+ ✓  node  test/sdk/account/useSetPassword.test.ts (6 tests) 46ms
526
+ ✓  node  test/utils/multipleTemplates.test.ts (8 tests) 8ms
527
+ ✓  node  test/sdk/orderEntry/useOrderEntryOperation.test.ts (8 tests) 37ms
528
+ ✓  node  test/components/quotes/quoteFilters.test.ts (23 tests) 39ms
519
529
  ✓  node  test/utils/localization/localizeRedirectDestination.test.ts (11 tests) 7ms
520
530
  ✓  node  test/sdk/account/getMyAccountRoutes.test.ts (12 tests) 9ms
521
- ✓  node  test/sdk/orderEntry/useOrderEntryUpload.test.ts (8 tests) 48ms
522
- ✓  node  test/components/quotes/MyAccountQuotesFilterSlider.test.tsx (5 tests) 129ms
523
- ✓  node  test/sdk/analytics/useStartRecommendationSession.test.ts (6 tests) 47ms
524
- ✓  node  test/proxy.localization.test.ts (5 tests) 26ms
525
- ✓  node  test/sdk/orderEntry/useOrderEntry.test.ts (8 tests) 25ms
526
- ✓  node  test/server/index.test.ts (7 tests) 1128ms
527
- ✓ should handle options and execute  605ms
528
- ✓  node  test/sdk/session/syncSalesChannelFromOrderForm.test.ts (6 tests) 10ms
531
+ ✓  node  test/sdk/orderEntry/useOrderEntryUpload.test.ts (8 tests) 65ms
532
+ ✓  node  test/components/quotes/MyAccountQuotesFilterSlider.test.tsx (5 tests) 169ms
533
+ ✓  node  test/proxy.localization.test.ts (5 tests) 53ms
534
+ ✓  node  test/sdk/orderEntry/useOrderEntry.test.ts (8 tests) 44ms
535
+ ✓  node  test/server/index.test.ts (7 tests) 945ms
536
+ ✓ should handle options and execute  383ms
537
+ ✓  node  test/sdk/session/syncSalesChannelFromOrderForm.test.ts (6 tests) 7ms
538
+ ✓  node  test/components/quotes/MyAccountQuotesSelectedTags.test.tsx (8 tests) 113ms
539
+ ✓  node  test/sdk/analytics/useStartRecommendationSession.test.ts (6 tests) 48ms
529
540
  ✓  node  test/proxy.test.ts (4 tests) 18ms
530
- ✓  node  test/server/webops-api.test.ts (9 tests) 28ms
531
- ✓  node  test/components/quotes/MyAccountQuotesSelectedTags.test.tsx (8 tests) 91ms
532
- ✓  node  test/sdk/cart/waitForSessionValidated.test.ts (5 tests) 12ms
533
- ✓  node  test/sdk/orderEntry/useOrderFormItems.test.ts (7 tests) 41ms
534
- ✓  node  test/server/content/service.test.ts (5 tests) 5ms
535
- ✓  node  test/sdk/account/refreshToken.test.ts (5 tests) 7ms
541
+ ✓  node  test/server/webops-api.test.ts (9 tests) 24ms
542
+ ✓  node  test/sdk/orderEntry/useOrderFormItems.test.ts (7 tests) 39ms
543
+ ✓  node  test/sdk/cart/waitForSessionValidated.test.ts (5 tests) 15ms
544
+ ✓  node  test/server/cms/myAccountDefaultSections.test.ts (7 tests) 7ms
545
+ ✓  node  test/server/content/service.test.ts (5 tests) 6ms
546
+ ✓  node  test/sdk/account/refreshToken.test.ts (5 tests) 9ms
536
547
  ✓  node  test/server/cms/global.test.ts (3 tests) 6ms
537
548
  ✓  node  test/sdk/localization/store-url.test.ts (1 test) 4ms
538
- ✓  node  test/sdk/auth/useAuth.test.ts (5 tests) 20ms
539
- ✓  node  test/components/quotes/MyAccountQuotesStatusSelector.test.tsx (6 tests) 129ms
540
- ✓  node  test/sdk/analytics/hasEnabledRecommendationShelf.test.ts (6 tests) 5ms
541
- ✓  node  test/utils/getRequestHostname.test.ts (12 tests) 5ms
542
- ✓  node  test/server/rootSpan.test.ts (4 tests) 48ms
543
- ✓  node  test/components/account/Layout.test.tsx (6 tests) 70ms
544
- ✓  node  test/pages/api/preview.test.ts (2 tests) 9ms
549
+ ✓  node  test/sdk/auth/useAuth.test.ts (5 tests) 34ms
550
+ ✓  node  test/components/quotes/MyAccountQuotesStatusSelector.test.tsx (6 tests) 147ms
551
+ ✓  node  test/utils/getRequestHostname.test.ts (12 tests) 7ms
552
+ ✓  node  test/pages/api/preview.test.ts (2 tests) 7ms
553
+ ✓  node  test/server/rootSpan.test.ts (4 tests) 44ms
545
554
  ✓  node  test/utils/validateSessionRefreshToken.test.ts (6 tests) 5ms
555
+ ✓  node  test/components/account/Layout.test.tsx (6 tests) 69ms
546
556
  ✓  node  test/components/search/SearchInput.test.ts (6 tests) 7ms
547
- ✓  node  test/sdk/recommendations/vrn.test.ts (5 tests) 4ms
548
- ✓  node  test/utils/retry.test.ts (5 tests) 16ms
549
- ✓  node  test/server/cms/index.test.ts (2 tests) 8ms
550
- ✓  node  test/sdk/account/getB2BSessionClaims.test.ts (4 tests) 4ms
551
- ✓  node  test/utils/unlockResponse.test.ts (11 tests) 4ms
552
- ✓  node  test/server/cms/myAccountDefaultSections.test.ts (5 tests) 5ms
553
- ✓  node  test/sdk/recommendations/useRecommendationUserId.test.ts (4 tests) 189ms
554
- ✓  node  test/sdk/recommendations/useRecommendations.test.ts (2 tests) 5ms
555
- ✓  node  test/components/account/OrganizationDrawerBody.test.tsx (3 tests) 41ms
556
- ✓  node  test/utils/isLocalHost.test.ts (7 tests) 5ms
557
+ ✓  node  test/sdk/recommendations/vrn.test.ts (5 tests) 5ms
558
+ ✓  node  test/utils/retry.test.ts (5 tests) 14ms
559
+ ✓  node  test/server/cms/index.test.ts (2 tests) 6ms
560
+ ✓  node  test/sdk/account/getB2BSessionClaims.test.ts (4 tests) 6ms
561
+ ✓  node  test/utils/unlockResponse.test.ts (11 tests) 6ms
562
+ ✓  node  test/sdk/recommendations/useRecommendations.test.ts (2 tests) 6ms
563
+ ✓  node  test/sdk/recommendations/useRecommendationUserId.test.ts (4 tests) 184ms
564
+ ✓  node  test/utils/isLocalHost.test.ts (7 tests) 6ms
565
+ ✓  node  test/components/account/OrganizationDrawerBody.test.tsx (3 tests) 57ms
557
566
  ✓  node  test/utils/userOrderStatus.test.ts (3 tests) 4ms
558
- ✓  node  test/utils/getCookie.test.ts (4 tests) 3ms
559
- ✓  node  test/sdk/analytics/utils.test.ts (2 tests) 4ms
560
- ✓  node  test/instrumentation.test.ts (3 tests) 4ms
561
- ✓  node  test/components/auth/ProfileChallenge.test.tsx (3 tests) 39ms
562
- ✓  node  test/sdk/account/clearPersistedSessionState.test.ts (1 test) 10ms
563
- ✓  node  test/components/quotes/MyAccountQuoteStatusBadge.test.tsx (2 tests) 23ms
564
-
565
-  Test Files  87 passed (87)
566
-  Tests  698 passed (698)
567
-  Start at  17:40:10
568
-  Duration  39.18s (transform 11.25s, setup 0ms, import 34.85s, tests 13.48s, environment 48.59s)
567
+ ✓  node  test/utils/getCookie.test.ts (4 tests) 5ms
568
+ ✓  node  test/sdk/analytics/utils.test.ts (2 tests) 5ms
569
+ ✓  node  test/components/auth/ProfileChallenge.test.tsx (3 tests) 30ms
570
+ ✓  node  test/instrumentation.test.ts (3 tests) 6ms
571
+ ✓  node  test/sdk/account/clearPersistedSessionState.test.ts (1 test) 8ms
572
+ ✓  node  test/components/quotes/MyAccountQuoteStatusBadge.test.tsx (2 tests) 25ms
573
+
574
+  Test Files  88 passed (88)
575
+  Tests  702 passed (702)
576
+  Start at  21:33:38
577
+  Duration  45.95s (transform 12.76s, setup 0ms, import 41.15s, tests 16.16s, environment 54.47s)
569
578
 
package/CHANGELOG.md CHANGED
@@ -3,6 +3,24 @@
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.7.0-dev.5](https://github.com/vtex/faststore/compare/v4.7.0-dev.4...v4.7.0-dev.5) (2026-08-25)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **core:** restore Order Details layout and first-paint rendering in My Account ([#3464](https://github.com/vtex/faststore/issues/3464)) ([3464523](https://github.com/vtex/faststore/commit/346452304b265d439184bca3f56c2ae8a9341cce)), closes [#3354](https://github.com/vtex/faststore/issues/3354) [#3354](https://github.com/vtex/faststore/issues/3354) [#3417](https://github.com/vtex/faststore/issues/3417) [/github.com/vtex/faststore/pull/3464#discussion_r3848325785](https://github.com//github.com/vtex/faststore/pull/3464/issues/discussion_r3848325785) [#3411](https://github.com/vtex/faststore/issues/3411) [#3354](https://github.com/vtex/faststore/issues/3354)
11
+
12
+ # [4.7.0-dev.4](https://github.com/vtex/faststore/compare/v4.7.0-dev.3...v4.7.0-dev.4) (2026-08-25)
13
+
14
+ ### Bug Fixes
15
+
16
+ - **core:** address Sonar and session fallback timing ([c0ad09f](https://github.com/vtex/faststore/commit/c0ad09f4903627ce39b233013af40ab2505b5871))
17
+ - **core:** make session enable flag assignment Sonar-clear ([2fdfe96](https://github.com/vtex/faststore/commit/2fdfe96d6dccb22c33fb9f7f250f5531ef6f6f47))
18
+ - **core:** start shelf session fallback in parallel with userId lookup ([6f5afa5](https://github.com/vtex/faststore/commit/6f5afa587a554ab9a4289c01aa6c6eb57e027680))
19
+
20
+ ### Features
21
+
22
+ - **core:** gate recommendation session by feature flag with shelf fallback ([901b345](https://github.com/vtex/faststore/commit/901b3456943de25f028d6443f5f62b9de1db6ad3))
23
+
6
24
  # [4.7.0-dev.3](https://github.com/vtex/faststore/compare/v4.7.0-dev.2...v4.7.0-dev.3) (2026-08-25)
7
25
 
8
26
  **Note:** Version bump only for package @faststore/core
@@ -3,16 +3,10 @@
3
3
  "$componentKey": "RecommendationShelf",
4
4
  "$componentTitle": "Recommendation Shelf",
5
5
  "title": "Recommendation Shelf",
6
- "description": "Display a carousel of personalized product recommendations from a VTEX Recommendations campaign. Enable the shelf with the Enable recommendations toggle (off by default).",
6
+ "description": "Display a carousel of personalized product recommendations from a VTEX Recommendations campaign.",
7
7
  "type": "object",
8
8
  "required": ["campaignVrn"],
9
9
  "properties": {
10
- "enableRecommendations": {
11
- "title": "Enable recommendations?",
12
- "description": "When enabled, starts the VTEX Recommendations personalization session (once per browser session) and fetches personalized products for this shelf. Off by default so stores that do not use Recommendations never hit the Recommendations API.",
13
- "type": "boolean",
14
- "default": false
15
- },
16
10
  "title": {
17
11
  "title": "Title",
18
12
  "description": "Override the shelf title. If not set, the campaign title will be used.",
@@ -32,5 +32,5 @@ breaking change to the rendered storefront.
32
32
 
33
33
  ## Contents
34
34
 
35
- - `components/` — 14 `cms_component__account*.jsonc` section schemas.
36
- - `pages/` — 6 `cms_content_type__myaccount*.jsonc` content-types.
35
+ - `components/` — 15 `cms_component__account*.jsonc` section schemas.
36
+ - `pages/` — 7 `cms_content_type__myaccount*.jsonc` content-types.
@@ -3872,16 +3872,10 @@
3872
3872
  "$componentKey": "RecommendationShelf",
3873
3873
  "$componentTitle": "Recommendation Shelf",
3874
3874
  "title": "Recommendation Shelf",
3875
- "description": "Display a carousel of personalized product recommendations from a VTEX Recommendations campaign. Enable the shelf with the Enable recommendations toggle (off by default).",
3875
+ "description": "Display a carousel of personalized product recommendations from a VTEX Recommendations campaign.",
3876
3876
  "type": "object",
3877
3877
  "required": ["campaignVrn"],
3878
3878
  "properties": {
3879
- "enableRecommendations": {
3880
- "title": "Enable recommendations?",
3881
- "description": "When enabled, starts the VTEX Recommendations personalization session (once per browser session) and fetches personalized products for this shelf. Off by default so stores that do not use Recommendations never hit the Recommendations API.",
3882
- "type": "boolean",
3883
- "default": false
3884
- },
3885
3879
  "title": {
3886
3880
  "title": "Title",
3887
3881
  "description": "Override the shelf title. If not set, the campaign title will be used.",
@@ -202,6 +202,11 @@ module.exports = {
202
202
  },
203
203
  refreshToken: false,
204
204
  scrollRestoration: false,
205
+ // Opt-in flag for VTEX Recommendations. When enabled, Layout starts the
206
+ // personalization session on every page. When disabled (default), the
207
+ // session starts only as a RecommendationShelf fallback when userId is
208
+ // missing.
209
+ enableRecommendations: false,
205
210
  /** Package names to transpile (e.g. ['@vtex/components']). Use a non-empty list to enable Next.js transpilation. */
206
211
  transpilePackages: [],
207
212
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/core",
3
- "version": "4.7.0-dev.3",
3
+ "version": "4.7.0-dev.5",
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.7.0-dev.3",
75
- "@faststore/lighthouse": "4.7.0-dev.3",
76
- "@faststore/sdk": "4.7.0-dev.3",
77
- "@faststore/diagnostics": "4.7.0-dev.3",
78
- "@faststore/ui": "4.7.0-dev.3"
74
+ "@faststore/api": "4.7.0-dev.5",
75
+ "@faststore/diagnostics": "4.7.0-dev.5",
76
+ "@faststore/lighthouse": "4.7.0-dev.5",
77
+ "@faststore/sdk": "4.7.0-dev.5",
78
+ "@faststore/ui": "4.7.0-dev.5"
79
79
  },
80
80
  "devDependencies": {
81
81
  "@cypress/code-coverage": "^3.12.1",
package/src/Layout.tsx CHANGED
@@ -7,9 +7,9 @@ function Layout({ children }: PropsWithChildren) {
7
7
  const props = isValidElement(children) ? children.props : undefined
8
8
  usePageViewEvent(props)
9
9
 
10
- // Starts the personalization session once per browser session when the page
11
- // CMS data includes a RecommendationShelf with `enableRecommendations: true`.
12
- useStartRecommendationSession(props)
10
+ // Starts the personalization session once per browser session on every page
11
+ // when `experimental.enableRecommendations` is true.
12
+ useStartRecommendationSession()
13
13
 
14
14
  return <>{children}</>
15
15
  }
@@ -118,6 +118,19 @@
118
118
  }
119
119
  }
120
120
 
121
+ // Grid placement targets the CMS *section wrapper*, not the card.
122
+ // The CMS render wraps every section in `<section class="section section-account-order-*">`,
123
+ // which is the real grid item; `grid-column` on a card nested inside it is inert.
124
+ // Attribute selectors are required here because this is a CSS module: a plain
125
+ // class selector would be hashed and never match the global class emitted by
126
+ // `Section.tsx` (and stylelint does not support `:global()`).
127
+ // The rules below have three different fates — do not treat them as one group:
128
+ // 1. `[class~="section-account-order-*"]` — the live contract for the CMS render.
129
+ // 2. `[data-fs-delivery-option-accordion]` — ALSO live: the delivery wrapper is
130
+ // `display: contents`, so the accordion is a direct grid item again.
131
+ // 3. `[data-fs-order-status-card]`, `[data-fs-order-budgets-card]` — dead for the
132
+ // CMS render; they only serve `@deprecated OrderDetails.tsx`, so they can go
133
+ // when that component does.
121
134
  [data-fs-order-details-content] {
122
135
  display: flex;
123
136
  flex-direction: column;
@@ -128,22 +141,50 @@
128
141
  grid-template-columns: repeat(2, 1fr);
129
142
  }
130
143
 
131
- [data-fs-order-status-card] {
144
+ // Cards must fill their section wrapper. The wrapper is the grid item and
145
+ // stretches to the row height, but a block child keeps its natural height,
146
+ // so a short card next to a tall one stopped short and left a gap below it.
147
+ // Before the CMS render the card itself was the grid item and stretched, so
148
+ // cards sharing a row matched heights — this restores that.
149
+ [class~="section-account-order-ordered-by"],
150
+ [class~="section-account-order-payment"],
151
+ [class~="section-account-order-summary"],
152
+ [class~="section-account-order-more-info"],
153
+ [class~="section-account-order-status"],
154
+ [class~="section-account-order-budgets"] {
155
+ display: grid;
156
+ }
157
+
158
+ // (1) Live — full-width section wrappers.
159
+ [class~="section-account-order-details"] {
132
160
  grid-column: span 2;
133
161
  }
134
162
 
135
- [data-fs-buying-policy-alert] {
163
+ [class~="section-account-order-status"] {
136
164
  grid-column: span 2;
137
165
  }
138
166
 
139
- [data-fs-pending-policies-alert] {
167
+ [class~="section-account-order-budgets"] {
140
168
  grid-column: span 2;
141
169
  }
142
170
 
171
+ // (1) Live — the delivery section holds two blocks the design treats as
172
+ // independent (compact recipient card, full-width option list). Dropping the
173
+ // wrapper box makes both direct grid items, so the rules below still apply.
174
+ [class~="section-account-order-delivery"] {
175
+ display: contents;
176
+ }
177
+
178
+ // (2) Live — direct grid item via the `display: contents` above.
143
179
  [data-fs-delivery-option-accordion] {
144
180
  grid-column: span 2;
145
181
  }
146
182
 
183
+ // (3) Dead for the CMS render — kept for `@deprecated OrderDetails.tsx` only.
184
+ [data-fs-order-status-card] {
185
+ grid-column: span 2;
186
+ }
187
+
147
188
  [data-fs-order-budgets-card] {
148
189
  grid-column: span 2;
149
190
  }
@@ -23,6 +23,23 @@ interface Props {
23
23
  isInteractive?: boolean
24
24
  }
25
25
 
26
+ type RenderSectionsBaseProps = Props & {
27
+ /**
28
+ * Opts the whole render pass out of viewport lazy loading, so every section
29
+ * renders on first paint (SSR HTML included) instead of behind a placeholder.
30
+ *
31
+ * Meant for authenticated, above-the-fold pages such as My Account, where
32
+ * lazy loading only delays content. The public storefront must not set it.
33
+ *
34
+ * Wider counterpart of the per-section `data.skipLazyLoadingSection` flag.
35
+ *
36
+ * Only `RenderSectionsBase` honours it: the default `RenderSections` export
37
+ * also renders global sections (CartSidebar, RegionModal, RegionSlider),
38
+ * whose lazy loading is load-bearing, so it must not be opted out wholesale.
39
+ */
40
+ skipLazyLoading?: boolean
41
+ }
42
+
26
43
  const REGION_SLIDER_SECTION_NAME = 'RegionSlider'
27
44
 
28
45
  const SECTIONS_OUT_OF_VIEWPORT = [
@@ -139,7 +156,8 @@ export const RenderSectionsBase = ({
139
156
  sections = [],
140
157
  components,
141
158
  isInteractive,
142
- }: Props) => {
159
+ skipLazyLoading,
160
+ }: RenderSectionsBaseProps) => {
143
161
  return (
144
162
  <>
145
163
  {sections.map(({ name, data = {}, $componentKey }, index) => {
@@ -159,7 +177,7 @@ export const RenderSectionsBase = ({
159
177
 
160
178
  return (
161
179
  <SectionBoundary key={`cms-section-${name}-${index}`} name={name}>
162
- {data.skipLazyLoadingSection ? (
180
+ {skipLazyLoading || data.skipLazyLoadingSection ? (
163
181
  <Component {...sectionProps} />
164
182
  ) : (
165
183
  <LazyLoadingSection