@faststore/core 4.7.0-dev.4 → 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.
@@ -1,9 +1,9 @@
1
1
 
2
- > @faststore/core@4.7.0-dev.3 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.3 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.3 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,25 +1,26 @@
1
1
 
2
- > @faststore/core@4.7.0-dev.3 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
 
6
6
   RUN  v4.0.18 /home/runner/work/faststore/faststore/packages/core
7
7
 
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) 1325ms
8
11
  Browserslist: browsers data (caniuse-lite) is 6 months old. Please run:
9
12
  npx update-browserslist-db@latest
10
13
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
11
- Not implemented: navigation to another Document
12
- Not implemented: navigation to another Document
13
- ✓  browser  test/components/account/ContractSwitcher.browser.test.tsx (13 tests) 3129ms
14
- ✓ shows an error state when the list fails to load  876ms
15
- ✓ requires selecting a contract before Confirm is enabled, then switches (REQ-03)  533ms
16
- ✓  browser  test/sdk/ui/useScrollRestoration.browser.test.ts (43 tests) 1002ms
17
- ✓  browser  test/components/account/cards/MyAccountListCards.browser.test.tsx (14 tests) 2391ms
18
- ✓ shows the tab bar and renders Personal cards by default  1007ms
19
- ✓ paginates when there are more than 25 cards  358ms
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
20
22
  ✓  browser  test/sdk/session/reconcileSessionLocale.browser.test.ts (5 tests) 30ms
21
- ✓  browser  test/components/ui/ProductGallery/GalleryPageHeightLock.browser.test.tsx (8 tests) 162ms
22
- ✓  browser  test/sdk/recommendations/useRecommendationShelf.browser.test.tsx (12 tests) 128ms
23
+ ✓  browser  test/sdk/recommendations/useRecommendationShelf.browser.test.tsx (12 tests) 218ms
23
24
  stderr | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx
24
25
  Error in optimistic validation: TypeError: Failed to parse URL from /api/graphql?operationName=ValidateCartMutation&operationHash=3c71b0d3fc2bade14df68abfa271858beb361b12
25
26
   at node:internal/deps/undici/undici:16416:13
@@ -49,7 +50,7 @@ Not implemented: navigation to another Document
49
50
  stderr | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx > RecommendationShelf > renders nothing when there is an error
50
51
  Error fetching recommendations undefined boom for campaign vrn:recommendations:acc:rec-top-items-v2:campaign-1
51
52
 
52
- ✓  browser  test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx (7 tests) 255ms
53
+ ✓  browser  test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx (7 tests) 292ms
53
54
  stderr | test/pages/password-protection.browser.test.tsx > PasswordProtectionLogin > posts the password and redirects to the requested return path
54
55
  Warning: An update to PasswordProtectionLogin inside a test was not wrapped in act(...).
55
56
 
@@ -183,6 +184,7 @@ act(() => {
183
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
184
185
  at PasswordProtectionLogin (/home/runner/work/faststore/faststore/packages/core/src/pages/password-protection/index.tsx:19:69)
185
186
 
187
+ ✓  browser  test/sdk/session/getInitialSession.browser.test.ts (6 tests) 31ms
186
188
  stderr | test/pages/password-protection.browser.test.tsx > PasswordProtectionLogin > shows service unavailable when the response is not a login payload
187
189
  Warning: An update to PasswordProtectionLogin inside a test was not wrapped in act(...).
188
190
 
@@ -279,13 +281,19 @@ act(() => {
279
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
280
282
  at PasswordProtectionLogin (/home/runner/work/faststore/faststore/packages/core/src/pages/password-protection/index.tsx:19:69)
281
283
 
282
- ✓  browser  test/pages/password-protection.browser.test.tsx (6 tests) 1530ms
283
- ✓ renders the password protection form  544ms
284
- ✓  browser  test/components/account/OrganizationDrawer.browser.test.tsx (5 tests) 1630ms
285
- ✓ renders the menu view with contract details and manage footer  917ms
286
- ✓ opens the contract switcher and returns to the menu on back  372ms
287
- ✓  browser  test/sdk/session/getInitialSession.browser.test.ts (6 tests) 38ms
288
- ✓  browser  test/sdk/account/changeContractToken.browser.test.ts (9 tests) 56ms
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,11 +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) 41ms
299
- ✓  browser  test/components/templates/SearchPage/SearchWrapper.browser.test.tsx (3 tests) 30ms
300
- ✓  browser  test/sdk/recommendations/useRecommendationShelf.sessionFallback.browser.test.tsx (2 tests) 132ms
301
- ✓  browser  test/sdk/account/useSwitchContract.browser.test.ts (4 tests) 39ms
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
302
311
  stderr | test/components/account/doLogout.browser.test.ts
303
312
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
304
313
  at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
@@ -307,10 +316,9 @@ This ensures that you're testing the behavior the user would see in the browser.
307
316
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
308
317
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
309
318
 
310
- ✓  browser  test/components/account/doLogout.browser.test.ts (1 test) 22ms
311
- ✓  browser  test/components/sections/Account/AccountListCards.browser.test.tsx (3 tests) 98ms
312
- ✓  browser  test/components/account/OrganizationDrawerHeader.browser.test.tsx (3 tests) 301ms
313
- ✓  browser  test/components/account/OrganizationDrawerFooter.browser.test.tsx (3 tests) 275ms
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
314
322
  stderr | test/sdk/account/clearPersistedSessionState.browser.test.ts
315
323
  Error in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
316
324
  at waitForSessionValidated (/home/runner/work/faststore/faststore/packages/core/src/sdk/cart/waitForSessionValidated.ts:16:32)
@@ -319,11 +327,10 @@ This ensures that you're testing the behavior the user would see in the browser.
319
327
  at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
320
328
   at processTicksAndRejections (node:internal/process/task_queues:103:5)
321
329
 
322
- ✓  browser  test/utils/isLocalHost.browser.test.ts (3 tests) 5ms
323
- ✓  browser  test/sdk/account/clearPersistedSessionState.browser.test.ts (1 test) 8ms
324
- ✓  browser  test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts (1 test) 3ms
325
- ✓  node  test/utils/localization/bindingPaths.test.ts (71 tests) 19ms
326
- ✓  node  test/server/password-protection-service.test.ts (22 tests) 34ms
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,12 +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
- ✓  browser  test/components/skeletons/ProductGridSkeleton.browser.test.tsx (2 tests) 38ms
336
- ✓  browser  test/sdk/account/refreshToken.browser.test.ts (1 test) 3ms
337
- ✓  node  test/utils/match-url.test.ts (10 tests) 9ms
338
- ✓  node  test/sdk/localization/useBindingSelector.test.tsx (22 tests) 14ms
339
- ✓  node  test/pages/api/unlock.test.ts (15 tests) 151ms
340
- ✓  node  test/sdk/localization/bindingSelector.test.ts (18 tests) 7ms
342
+ ✓  browser  test/sdk/account/refreshToken.browser.test.ts (1 test) 5ms
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
341
350
  stderr | test/components/search/SearchInputComponent.test.tsx
342
351
  Warning: forwardRef render functions accept exactly two parameters: props and ref. Did you forget to use the ref parameter?
343
352
 
@@ -401,19 +410,19 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
401
410
  at Suspense
402
411
  at Wrapper (/home/runner/work/faststore/faststore/packages/core/test/components/search/SearchInputComponent.test.tsx:106:20)
403
412
 
404
- ✓  node  test/components/search/SearchInputComponent.test.tsx (6 tests) 74ms
405
- ✓  node  test/sdk/search/useSearchHistory.test.ts (13 tests) 59ms
406
- ✓  node  test/utils/cookieCacheBusting.test.ts (10 tests) 12ms
413
+ ✓  node  test/components/search/SearchInputComponent.test.tsx (6 tests) 73ms
414
+ ✓  node  test/sdk/search/useSearchHistory.test.ts (13 tests) 53ms
415
+ ✓  node  test/utils/cookieCacheBusting.test.ts (10 tests) 17ms
407
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
408
417
  { extensions: { status: 401 } }
409
418
 
410
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
411
420
  { extensions: { status: 502 } }
412
421
 
413
- ✓  node  test/pages/pvt/account/cards/index.test.ts (8 tests) 10ms
414
- ✓  node  test/experimental/myAccountCmsServerSideProps.test.ts (5 tests) 7ms
415
- ✓  node  test/utils/clearCookies.test.ts (20 tests) 30ms
416
- ✓  node  test/components/quotes/MyAccountListQuotesTable.test.tsx (12 tests) 380ms
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
417
426
  stderr | test/pages/api/graphql.test.ts > /api/graphql error status propagation > propagates the upstream 400 from a wrapped BadRequestError instead of 500
418
427
  Graphql execution returned with error: [
419
428
  {
@@ -506,63 +515,64 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
506
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
507
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)
508
517
 
509
- ✓  node  test/pages/api/graphql.test.ts (17 tests) 29ms
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
521
+ ✓ navigates without a label param when the search is cleared  361ms
510
522
  stderr | test/sdk/account/useSetPassword.test.ts > useSetPassword > maps wrongcredentials error responses to the existing message
511
523
  Set password request failed: Bad Request
512
524
 
513
- ✓  node  test/sdk/account/useSetPassword.test.ts (6 tests) 28ms
514
- ✓  node  test/components/quotes/MyAccountListQuotes.test.tsx (9 tests) 806ms
515
- ✓ navigates with the search term on blur  360ms
516
- ✓ navigates without a label param when the search is cleared  359ms
517
- ✓  node  test/sdk/orderEntry/useOrderEntryOperation.test.ts (8 tests) 30ms
518
- ✓  node  test/utils/multipleTemplates.test.ts (8 tests) 5ms
519
- ✓  node  test/components/quotes/quoteFilters.test.ts (23 tests) 25ms
520
- ✓  node  test/utils/localization/localizeRedirectDestination.test.ts (11 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
529
+ ✓  node  test/utils/localization/localizeRedirectDestination.test.ts (11 tests) 7ms
521
530
  ✓  node  test/sdk/account/getMyAccountRoutes.test.ts (12 tests) 9ms
522
- ✓  node  test/sdk/orderEntry/useOrderEntryUpload.test.ts (8 tests) 56ms
523
- ✓  node  test/components/quotes/MyAccountQuotesFilterSlider.test.tsx (5 tests) 136ms
524
- ✓  node  test/proxy.localization.test.ts (5 tests) 37ms
525
- ✓  node  test/sdk/orderEntry/useOrderEntry.test.ts (8 tests) 30ms
526
- ✓  node  test/server/index.test.ts (7 tests) 820ms
527
- ✓  node  test/sdk/session/syncSalesChannelFromOrderForm.test.ts (6 tests) 9ms
528
- ✓  node  test/components/quotes/MyAccountQuotesSelectedTags.test.tsx (8 tests) 117ms
529
- ✓  node  test/sdk/analytics/useStartRecommendationSession.test.ts (6 tests) 57ms
530
- ✓  node  test/proxy.test.ts (4 tests) 19ms
531
- ✓  node  test/server/webops-api.test.ts (9 tests) 13ms
532
- ✓  node  test/sdk/cart/waitForSessionValidated.test.ts (5 tests) 11ms
533
- ✓  node  test/sdk/orderEntry/useOrderFormItems.test.ts (7 tests) 35ms
534
- ✓  node  test/sdk/account/refreshToken.test.ts (5 tests) 7ms
535
- ✓  node  test/server/content/service.test.ts (5 tests) 5ms
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
540
+ ✓  node  test/proxy.test.ts (4 tests) 18ms
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
- ✓  node  test/sdk/localization/store-url.test.ts (1 test) 3ms
538
- ✓  node  test/sdk/auth/useAuth.test.ts (5 tests) 22ms
539
- ✓  node  test/components/quotes/MyAccountQuotesStatusSelector.test.tsx (6 tests) 126ms
548
+ ✓  node  test/sdk/localization/store-url.test.ts (1 test) 4ms
549
+ ✓  node  test/sdk/auth/useAuth.test.ts (5 tests) 34ms
550
+ ✓  node  test/components/quotes/MyAccountQuotesStatusSelector.test.tsx (6 tests) 147ms
540
551
  ✓  node  test/utils/getRequestHostname.test.ts (12 tests) 7ms
541
- ✓  node  test/server/rootSpan.test.ts (4 tests) 39ms
542
- ✓  node  test/pages/api/preview.test.ts (2 tests) 8ms
543
- ✓  node  test/components/search/SearchInput.test.ts (6 tests) 9ms
544
- ✓  node  test/utils/validateSessionRefreshToken.test.ts (6 tests) 10ms
545
- ✓  node  test/components/account/Layout.test.tsx (6 tests) 63ms
546
- ✓  node  test/sdk/recommendations/vrn.test.ts (5 tests) 4ms
552
+ ✓  node  test/pages/api/preview.test.ts (2 tests) 7ms
553
+ ✓  node  test/server/rootSpan.test.ts (4 tests) 44ms
554
+ ✓  node  test/utils/validateSessionRefreshToken.test.ts (6 tests) 5ms
555
+ ✓  node  test/components/account/Layout.test.tsx (6 tests) 69ms
556
+ ✓  node  test/components/search/SearchInput.test.ts (6 tests) 7ms
557
+ ✓  node  test/sdk/recommendations/vrn.test.ts (5 tests) 5ms
547
558
  ✓  node  test/utils/retry.test.ts (5 tests) 14ms
548
559
  ✓  node  test/server/cms/index.test.ts (2 tests) 6ms
549
- ✓  node  test/sdk/account/getB2BSessionClaims.test.ts (4 tests) 4ms
550
- ✓  node  test/utils/unlockResponse.test.ts (11 tests) 4ms
551
- ✓  node  test/server/cms/myAccountDefaultSections.test.ts (5 tests) 4ms
552
- ✓  node  test/sdk/recommendations/useRecommendationUserId.test.ts (4 tests) 191ms
553
- ✓  node  test/sdk/recommendations/useRecommendations.test.ts (2 tests) 5ms
554
- ✓  node  test/utils/isLocalHost.test.ts (7 tests) 4ms
555
- ✓  node  test/components/account/OrganizationDrawerBody.test.tsx (3 tests) 54ms
556
- ✓  node  test/utils/userOrderStatus.test.ts (3 tests) 3ms
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
566
+ ✓  node  test/utils/userOrderStatus.test.ts (3 tests) 4ms
557
567
  ✓  node  test/utils/getCookie.test.ts (4 tests) 5ms
558
- ✓  node  test/sdk/analytics/utils.test.ts (2 tests) 4ms
559
- ✓  node  test/components/auth/ProfileChallenge.test.tsx (3 tests) 38ms
560
- ✓  node  test/instrumentation.test.ts (3 tests) 7ms
561
- ✓  node  test/sdk/account/clearPersistedSessionState.test.ts (1 test) 15ms
562
- ✓  node  test/components/quotes/MyAccountQuoteStatusBadge.test.tsx (2 tests) 24ms
563
-
564
-  Test Files  87 passed (87)
565
-  Tests  695 passed (695)
566
-  Start at  21:11:21
567
-  Duration  43.29s (transform 10.74s, setup 0ms, import 37.56s, tests 15.12s, environment 54.08s)
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)
568
578
 
package/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
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
+
6
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)
7
13
 
8
14
  ### Bug Fixes
@@ -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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/core",
3
- "version": "4.7.0-dev.4",
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/diagnostics": "4.7.0-dev.4",
75
- "@faststore/lighthouse": "4.7.0-dev.4",
76
- "@faststore/sdk": "4.7.0-dev.4",
77
- "@faststore/api": "4.7.0-dev.4",
78
- "@faststore/ui": "4.7.0-dev.4"
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",
@@ -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
@@ -66,6 +66,7 @@ function Page({
66
66
  <NextSeo noindex nofollow />
67
67
 
68
68
  <RenderSectionsBase
69
+ skipLazyLoading
69
70
  sections={pageSections}
70
71
  components={ACCOUNT_COMPONENTS}
71
72
  />
@@ -57,7 +57,11 @@ function Page({
57
57
 
58
58
  <Layout accountName={accountName}>
59
59
  {sections && sections.length > 0 && (
60
- <RenderSectionsBase sections={sections} components={COMPONENTS} />
60
+ <RenderSectionsBase
61
+ skipLazyLoading
62
+ sections={sections}
63
+ components={COMPONENTS}
64
+ />
61
65
  )}
62
66
  </Layout>
63
67
  </RenderSections>
@@ -94,6 +94,7 @@ export default function ListCardsPage({
94
94
  navigationLabels={navigationLabels}
95
95
  >
96
96
  <RenderSectionsBase
97
+ skipLazyLoading
97
98
  sections={pageSections}
98
99
  components={ACCOUNT_COMPONENTS}
99
100
  />
@@ -76,6 +76,7 @@ export default function OrderDetailsPage({
76
76
  <OrderDetailsPageShell>
77
77
  <main data-fs-order-details-content>
78
78
  <RenderSectionsBase
79
+ skipLazyLoading
79
80
  sections={pageSections}
80
81
  components={ACCOUNT_COMPONENTS}
81
82
  />
@@ -408,7 +409,10 @@ const getServerSidePropsBase: GetServerSideProps<
408
409
  navigationLabels: navigationData as AccountNavigationLabels,
409
410
  accountPageData: {
410
411
  order: orderDetails.data.userOrder,
411
- orderStatusLabels,
412
+ // Yields undefined when no section carries order-status labels — the
413
+ // case for a store with no CMS content, since the default sections are
414
+ // created with empty data. getServerSideProps cannot serialize it.
415
+ ...(orderStatusLabels ? { orderStatusLabels } : {}),
412
416
  },
413
417
  pageSections,
414
418
  isRepresentative,
@@ -75,6 +75,7 @@ export default function ListOrdersPage({
75
75
  >
76
76
  <BeforeSection />
77
77
  <RenderSectionsBase
78
+ skipLazyLoading
78
79
  sections={pageSections}
79
80
  components={ACCOUNT_COMPONENTS}
80
81
  />
@@ -74,6 +74,7 @@ export default function Profile({
74
74
  >
75
75
  <BeforeSection />
76
76
  <RenderSectionsBase
77
+ skipLazyLoading
77
78
  sections={pageSections}
78
79
  components={ACCOUNT_COMPONENTS}
79
80
  />
@@ -74,6 +74,7 @@ export default function Page({
74
74
  >
75
75
  <BeforeSection />
76
76
  <RenderSectionsBase
77
+ skipLazyLoading
77
78
  sections={pageSections}
78
79
  components={ACCOUNT_COMPONENTS}
79
80
  />
@@ -73,6 +73,7 @@ export default function Page({
73
73
  >
74
74
  <BeforeSection />
75
75
  <RenderSectionsBase
76
+ skipLazyLoading
76
77
  sections={pageSections}
77
78
  components={ACCOUNT_COMPONENTS}
78
79
  />
@@ -20,16 +20,21 @@ const DEFAULT_SECTION_KEYS: Record<NativeMyAccountContentType, string[]> = {
20
20
  myAccountProfile: ['AccountNavigation', 'AccountProfile'],
21
21
  myAccountOrders: ['AccountNavigation', 'AccountOrdersList'],
22
22
  myAccountCards: ['AccountNavigation', 'AccountListCards'],
23
+ // Mirrors the render order of the `@deprecated OrderDetails.tsx` component,
24
+ // which is the design reference available in the repo. The delivery option
25
+ // accordions render inside AccountOrderDelivery, so they sit right after the
26
+ // compact delivery card instead of after the summary. Known deviation: fixing
27
+ // it would mean splitting AccountOrderDelivery into two CMS sections.
23
28
  myAccountOrderDetails: [
24
29
  'AccountNavigation',
25
30
  'AccountOrderDetails',
31
+ 'AccountOrderOrderedBy',
32
+ 'AccountOrderDelivery',
26
33
  'AccountOrderStatus',
27
34
  'AccountOrderPayment',
28
- 'AccountOrderDelivery',
29
35
  'AccountOrderSummary',
30
- 'AccountOrderOrderedBy',
31
- 'AccountOrderBudgets',
32
36
  'AccountOrderMoreInfo',
37
+ 'AccountOrderBudgets',
33
38
  ],
34
39
  myAccountUserDetails: ['AccountNavigation', 'AccountUserDetails'],
35
40
  myAccountSecurity: ['AccountNavigation', 'AccountSecurity'],
@@ -0,0 +1,135 @@
1
+ import { UIProvider } from '@faststore/ui'
2
+ import { render, screen } from '@testing-library/react'
3
+ import { renderToString } from 'react-dom/server'
4
+ import { beforeAll, describe, expect, it } from 'vitest'
5
+
6
+ import { RenderSectionsBase } from 'src/components/cms/RenderSections'
7
+ import { getDefaultMyAccountSections } from 'src/server/cms/myAccountDefaultSections'
8
+
9
+ /**
10
+ * First-paint behavior of the My Account pages.
11
+ *
12
+ * Sections rendered through `RenderSectionsBase` go through `ViewportObserver`,
13
+ * which emits an 823px-tall placeholder instead of the section content until the
14
+ * element intersects the viewport. That is correct for the public storefront and
15
+ * wrong for My Account, which is authenticated, SSR and above the fold.
16
+ *
17
+ * `skipLazyLoading` opts a whole render pass out of it.
18
+ */
19
+
20
+ /** Never-firing observer — reproduces the pre-intersection (first paint) state. */
21
+ class NeverIntersectingObserver implements IntersectionObserver {
22
+ readonly root = null
23
+ readonly rootMargin = ''
24
+ readonly thresholds = [] as unknown as ReadonlyArray<number>
25
+ observe() {}
26
+ unobserve() {}
27
+ disconnect() {}
28
+ takeRecords() {
29
+ return []
30
+ }
31
+ }
32
+
33
+ beforeAll(() => {
34
+ window.IntersectionObserver =
35
+ NeverIntersectingObserver as unknown as typeof IntersectionObserver
36
+ })
37
+
38
+ const orderDetailsSections = getDefaultMyAccountSections(
39
+ 'myAccountOrderDetails'
40
+ ).filter((section) => section.$componentKey !== 'AccountNavigation')
41
+
42
+ const markerComponents = Object.fromEntries(
43
+ orderDetailsSections.map((section) => [
44
+ section.$componentKey,
45
+ () => <div>{section.$componentKey}</div>,
46
+ ])
47
+ )
48
+
49
+ describe('skipLazyLoading', () => {
50
+ it('renders section content immediately instead of a placeholder', () => {
51
+ const { container } = render(
52
+ <UIProvider>
53
+ <RenderSectionsBase
54
+ skipLazyLoading
55
+ sections={[{ name: 'AccountOrderStatus', data: {} }]}
56
+ components={{ AccountOrderStatus: () => <div>status</div> }}
57
+ />
58
+ </UIProvider>
59
+ )
60
+
61
+ expect(screen.getByText('status')).toBeTruthy()
62
+ expect(container.querySelector('[data-store-section-name]')).toBeNull()
63
+ })
64
+
65
+ it('renders every default order-details section on first paint', () => {
66
+ const { container } = render(
67
+ <UIProvider>
68
+ <RenderSectionsBase
69
+ skipLazyLoading
70
+ sections={orderDetailsSections}
71
+ components={markerComponents}
72
+ />
73
+ </UIProvider>
74
+ )
75
+
76
+ for (const section of orderDetailsSections) {
77
+ expect(screen.getByText(section.$componentKey)).toBeTruthy()
78
+ }
79
+
80
+ expect(
81
+ container.querySelectorAll('[data-store-section-name]')
82
+ ).toHaveLength(0)
83
+ })
84
+
85
+ it('covers store-authored sections, not only the framework defaults', () => {
86
+ render(
87
+ <UIProvider>
88
+ <RenderSectionsBase
89
+ skipLazyLoading
90
+ sections={[{ name: 'StoreCustomAccountSection', data: {} }]}
91
+ components={{
92
+ StoreCustomAccountSection: () => <div>custom</div>,
93
+ }}
94
+ />
95
+ </UIProvider>
96
+ )
97
+
98
+ expect(screen.getByText('custom')).toBeTruthy()
99
+ })
100
+
101
+ it('puts the section content in the SSR HTML, not the placeholder', () => {
102
+ const html = renderToString(
103
+ <UIProvider>
104
+ <RenderSectionsBase
105
+ skipLazyLoading
106
+ sections={orderDetailsSections}
107
+ components={markerComponents}
108
+ />
109
+ </UIProvider>
110
+ )
111
+
112
+ expect(html).toContain('AccountOrderStatus')
113
+ expect(html).not.toContain('data-store-section-name')
114
+ expect(html).not.toContain('823')
115
+ })
116
+
117
+ it('preserves lazy loading when the flag is absent', () => {
118
+ const { container } = render(
119
+ <UIProvider>
120
+ <RenderSectionsBase
121
+ sections={[{ name: 'AccountOrderStatus', data: {} }]}
122
+ components={{ AccountOrderStatus: () => <div>status</div> }}
123
+ />
124
+ </UIProvider>
125
+ )
126
+
127
+ expect(screen.queryByText('status')).toBeNull()
128
+
129
+ const placeholder = container.querySelector(
130
+ '[data-store-section-name="AccountOrderStatus"]'
131
+ ) as HTMLElement | null
132
+
133
+ expect(placeholder?.style.height).toBe('823px')
134
+ })
135
+ })
@@ -20,6 +20,50 @@ describe('getDefaultMyAccountSections', () => {
20
20
  it('returns an empty list for store (unknown) content-types', () => {
21
21
  expect(getDefaultMyAccountSections('myAccountWishlist')).toEqual([])
22
22
  })
23
+
24
+ /**
25
+ * The order-details defaults must mirror the render order of the
26
+ * `@deprecated OrderDetails.tsx` component, which is the design reference
27
+ * available in the repo. The delivery option accordions travel with
28
+ * AccountOrderDelivery, which is the single known deviation.
29
+ */
30
+ it('orders the myAccountOrderDetails defaults like the deprecated component', () => {
31
+ expect(
32
+ getDefaultMyAccountSections('myAccountOrderDetails').map(
33
+ (section) => section.$componentKey
34
+ )
35
+ ).toEqual([
36
+ 'AccountNavigation',
37
+ 'AccountOrderDetails',
38
+ 'AccountOrderOrderedBy',
39
+ 'AccountOrderDelivery',
40
+ 'AccountOrderStatus',
41
+ 'AccountOrderPayment',
42
+ 'AccountOrderSummary',
43
+ 'AccountOrderMoreInfo',
44
+ 'AccountOrderBudgets',
45
+ ])
46
+ })
47
+
48
+ it('keeps the myAccountOrderDetails default section set unchanged', () => {
49
+ const keys = getDefaultMyAccountSections('myAccountOrderDetails').map(
50
+ (section) => section.$componentKey
51
+ )
52
+
53
+ expect(new Set(keys)).toEqual(
54
+ new Set([
55
+ 'AccountNavigation',
56
+ 'AccountOrderDetails',
57
+ 'AccountOrderStatus',
58
+ 'AccountOrderPayment',
59
+ 'AccountOrderDelivery',
60
+ 'AccountOrderSummary',
61
+ 'AccountOrderOrderedBy',
62
+ 'AccountOrderBudgets',
63
+ 'AccountOrderMoreInfo',
64
+ ])
65
+ )
66
+ })
23
67
  })
24
68
 
25
69
  describe('withDefaultMyAccountSections', () => {