@faststore/core 4.8.0-dev.6 → 4.8.0-dev.8
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.
- package/.turbo/turbo-generate.log +3 -3
- package/.turbo/turbo-test.log +109 -107
- package/CHANGELOG.md +12 -0
- package/package.json +6 -6
- package/src/components/account/cards/MyAccountListCards/MyAccountListCards.tsx +1 -0
- package/src/components/account/cards/MyAccountListCards/styles.module.scss +21 -0
- package/src/sdk/graphql/retryPolicy.ts +49 -0
- package/src/sdk/graphql/useQuery.ts +2 -0
- package/test/components/account/cards/MyAccountListCards.browser.test.tsx +38 -0
- package/test/sdk/graphql/retryPolicy.test.ts +135 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> @faststore/core@4.8.0-dev.
|
|
2
|
+
> @faststore/core@4.8.0-dev.7 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.8.0-dev.
|
|
6
|
+
> @faststore/core@4.8.0-dev.7 gen-types /home/runner/work/faststore/faststore/packages/core
|
|
7
7
|
> node ../cli/bin/run generate-types .
|
|
8
8
|
|
|
9
9
|
[33m[STARTED][39m Parse Configuration
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
[32m[COMPLETED][39m Generate to @generated/
|
|
20
20
|
[32m[COMPLETED][39m Generate outputs
|
|
21
21
|
|
|
22
|
-
> @faststore/core@4.8.0-dev.
|
|
22
|
+
> @faststore/core@4.8.0-dev.7 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
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @faststore/core@4.8.0-dev.
|
|
2
|
+
> @faststore/core@4.8.0-dev.7 test /home/runner/work/faststore/faststore/packages/core
|
|
3
3
|
> vitest run
|
|
4
4
|
|
|
5
5
|
|
|
@@ -10,17 +10,17 @@ Not implemented: navigation to another Document
|
|
|
10
10
|
Browserslist: browsers data (caniuse-lite) is 7 months old. Please run:
|
|
11
11
|
npx update-browserslist-db@latest
|
|
12
12
|
Why you should do it regularly: https://github.com/browserslist/update-db#readme
|
|
13
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/ui/useScrollRestoration.browser.test.ts [2m([22m[2m43 tests[22m[2m)[22m[33m
|
|
14
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/CartRecommendationShelf/CartRecommendationShelf.browser.test.tsx [2m([22m[2m13 tests[22m[2m)[22m[33m
|
|
15
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/account/cards/MyAccountListCards.browser.test.tsx [2m([22m[
|
|
16
|
-
[33m[2m✓[22m[39m shows the tab bar and renders Personal cards by default [33m
|
|
17
|
-
[33m[2m✓[22m[39m paginates when there are more than 25 cards [33m
|
|
18
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/localization/useBindingSelector.browser.test.tsx [2m([22m[2m9 tests[22m[2m)[22m[32m
|
|
19
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/
|
|
20
|
-
|
|
21
|
-
[33m[2m✓[22m[39m
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/ui/useScrollRestoration.browser.test.ts [2m([22m[2m43 tests[22m[2m)[22m[33m 1248[2mms[22m[39m
|
|
14
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/CartRecommendationShelf/CartRecommendationShelf.browser.test.tsx [2m([22m[2m13 tests[22m[2m)[22m[33m 572[2mms[22m[39m
|
|
15
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/account/cards/MyAccountListCards.browser.test.tsx [2m([22m[2m16 tests[22m[2m)[22m[33m 2754[2mms[22m[39m
|
|
16
|
+
[33m[2m✓[22m[39m shows the tab bar and renders Personal cards by default [33m 832[2mms[22m[39m
|
|
17
|
+
[33m[2m✓[22m[39m paginates when there are more than 25 cards [33m 601[2mms[22m[39m
|
|
18
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/localization/useBindingSelector.browser.test.tsx [2m([22m[2m9 tests[22m[2m)[22m[32m 222[2mms[22m[39m
|
|
19
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/ui/ProductGallery/GalleryPageHeightLock.browser.test.tsx [2m([22m[2m8 tests[22m[2m)[22m[32m 264[2mms[22m[39m
|
|
20
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/account/ContractSwitcher.browser.test.tsx [2m([22m[2m13 tests[22m[2m)[22m[33m 2747[2mms[22m[39m
|
|
21
|
+
[33m[2m✓[22m[39m shows an error state when the list fails to load [33m 636[2mms[22m[39m
|
|
22
|
+
[33m[2m✓[22m[39m requires selecting a contract before Confirm is enabled, then switches (REQ-03) [33m 386[2mms[22m[39m
|
|
23
|
+
[33m[2m✓[22m[39m keeps Confirm disabled when switching is unavailable [33m 369[2mms[22m[39m
|
|
24
24
|
[90mstderr[2m | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx
|
|
25
25
|
[22m[39mError in optimistic validation: TypeError: Failed to parse URL from /api/graphql?operationName=ValidateCartMutation&operationHash=3c71b0d3fc2bade14df68abfa271858beb361b12
|
|
26
26
|
[90m at node:internal/deps/undici/undici:16416:13[39m
|
|
@@ -47,12 +47,13 @@ Browserslist: browsers data (caniuse-lite) is 7 months old. Please run:
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/session/reconcileSessionLocale.browser.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 19[2mms[22m[39m
|
|
50
51
|
[90mstderr[2m | test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx[2m > [22m[2mRecommendationShelf[2m > [22m[2mrenders nothing when there is an error
|
|
51
52
|
[22m[39mError fetching recommendations [90mundefined[39m boom for campaign vrn:recommendations:acc:rec-top-items-v2:campaign-1
|
|
52
53
|
|
|
53
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
54
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/recommendations/useRecommendationShelf.browser.test.tsx [2m([22m[2m12 tests[22m[2m)[22m[32m
|
|
55
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/CartSidebar/CartSidebar.browser.test.tsx [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
54
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/RecommendationShelf/RecommendationShelf.browser.test.tsx [2m([22m[2m8 tests[22m[2m)[22m[32m 268[2mms[22m[39m
|
|
55
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/recommendations/useRecommendationShelf.browser.test.tsx [2m([22m[2m12 tests[22m[2m)[22m[32m 143[2mms[22m[39m
|
|
56
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/CartSidebar/CartSidebar.browser.test.tsx [2m([22m[2m5 tests[22m[2m)[22m[32m 117[2mms[22m[39m
|
|
56
57
|
[90mstderr[2m | test/pages/password-protection.browser.test.tsx[2m > [22m[2mPasswordProtectionLogin[2m > [22m[2mposts the password and redirects to the requested return path
|
|
57
58
|
[22m[39mWarning: An update to PasswordProtectionLogin inside a test was not wrapped in act(...).
|
|
58
59
|
|
|
@@ -234,6 +235,8 @@ act(() => {
|
|
|
234
235
|
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
|
|
235
236
|
at PasswordProtectionLogin (/home/runner/work/faststore/faststore/packages/core/src/pages/password-protection/index.tsx:19:69)
|
|
236
237
|
|
|
238
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/account/OrganizationDrawer.browser.test.tsx [2m([22m[2m5 tests[22m[2m)[22m[33m 1005[2mms[22m[39m
|
|
239
|
+
[33m[2m✓[22m[39m renders the menu view with contract details and manage footer [33m 538[2mms[22m[39m
|
|
237
240
|
[90mstderr[2m | test/pages/password-protection.browser.test.tsx[2m > [22m[2mPasswordProtectionLogin[2m > [22m[2mshows service unavailable when the login request fails
|
|
238
241
|
[22m[39mWarning: An update to PasswordProtectionLogin inside a test was not wrapped in act(...).
|
|
239
242
|
|
|
@@ -282,12 +285,10 @@ act(() => {
|
|
|
282
285
|
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
|
|
283
286
|
at PasswordProtectionLogin (/home/runner/work/faststore/faststore/packages/core/src/pages/password-protection/index.tsx:19:69)
|
|
284
287
|
|
|
285
|
-
[32m✓[39m [30m[46m browser [49m[39m test/pages/password-protection.browser.test.tsx [2m([22m[2m6 tests[22m[2m)[22m[33m
|
|
286
|
-
[33m[2m✓[22m[39m renders the password protection form [33m
|
|
287
|
-
[32m✓[39m [30m[46m browser [49m[39m test/
|
|
288
|
-
|
|
289
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/session/getInitialSession.browser.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 15[2mms[22m[39m
|
|
290
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/account/changeContractToken.browser.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 45[2mms[22m[39m
|
|
288
|
+
[32m✓[39m [30m[46m browser [49m[39m test/pages/password-protection.browser.test.tsx [2m([22m[2m6 tests[22m[2m)[22m[33m 1068[2mms[22m[39m
|
|
289
|
+
[33m[2m✓[22m[39m renders the password protection form [33m 418[2mms[22m[39m
|
|
290
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/session/getInitialSession.browser.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 16[2mms[22m[39m
|
|
291
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/account/changeContractToken.browser.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 23[2mms[22m[39m
|
|
291
292
|
[90mstderr[2m | test/sdk/localization/store-url.browser.test.ts
|
|
292
293
|
[22m[39mError in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
|
|
293
294
|
at waitForSessionValidated [90m(/home/runner/work/faststore/faststore/packages/core/[39msrc/sdk/cart/waitForSessionValidated.ts:16:32[90m)[39m
|
|
@@ -296,7 +297,6 @@ This ensures that you're testing the behavior the user would see in the browser.
|
|
|
296
297
|
at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
|
|
297
298
|
[90m at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
|
|
298
299
|
|
|
299
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/localization/store-url.browser.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
300
300
|
[90mstderr[2m | test/components/cms/RenderSections.browser.test.tsx
|
|
301
301
|
[22m[39mError in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
|
|
302
302
|
at waitForSessionValidated [90m(/home/runner/work/faststore/faststore/packages/core/[39msrc/sdk/cart/waitForSessionValidated.ts:16:32[90m)[39m
|
|
@@ -305,12 +305,13 @@ This ensures that you're testing the behavior the user would see in the browser.
|
|
|
305
305
|
at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
|
|
306
306
|
[90m at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
|
|
307
307
|
|
|
308
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/
|
|
309
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/cms/RenderSections.browser.test.tsx [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
310
|
-
[32m✓[39m [30m[46m browser [49m[39m test/
|
|
311
|
-
[32m✓[39m [30m[46m browser [49m[39m test/
|
|
312
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/account/useSwitchContract.browser.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
313
|
-
[32m✓[39m [30m[46m browser [49m[39m test/
|
|
308
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/localization/store-url.browser.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
309
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/cms/RenderSections.browser.test.tsx [2m([22m[2m5 tests[22m[2m)[22m[32m 94[2mms[22m[39m
|
|
310
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/account/useAvailableContracts.browser.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 33[2mms[22m[39m
|
|
311
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/templates/SearchPage/SearchWrapper.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 41[2mms[22m[39m
|
|
312
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/account/useSwitchContract.browser.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 35[2mms[22m[39m
|
|
313
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/recommendations/useRecommendationShelf.sessionFallback.browser.test.tsx [2m([22m[2m2 tests[22m[2m)[22m[32m 136[2mms[22m[39m
|
|
314
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/CartRecommendationShelf/CartRecommendationProductCard.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 71[2mms[22m[39m
|
|
314
315
|
[90mstderr[2m | test/components/account/doLogout.browser.test.ts
|
|
315
316
|
[22m[39mError in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
|
|
316
317
|
at waitForSessionValidated [90m(/home/runner/work/faststore/faststore/packages/core/[39msrc/sdk/cart/waitForSessionValidated.ts:16:32[90m)[39m
|
|
@@ -319,11 +320,11 @@ This ensures that you're testing the behavior the user would see in the browser.
|
|
|
319
320
|
at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
|
|
320
321
|
[90m at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
|
|
321
322
|
|
|
322
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/account/doLogout.browser.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m
|
|
323
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/ui/LocalizationButton.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m
|
|
324
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/sections/Account/AccountListCards.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m
|
|
325
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/account/OrganizationDrawerHeader.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m
|
|
326
|
-
[32m✓[39m [30m[46m browser [49m[39m test/components/account/OrganizationDrawerFooter.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m
|
|
323
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/account/doLogout.browser.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 45[2mms[22m[39m
|
|
324
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/ui/LocalizationButton.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 51[2mms[22m[39m
|
|
325
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/sections/Account/AccountListCards.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 87[2mms[22m[39m
|
|
326
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/account/OrganizationDrawerHeader.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 292[2mms[22m[39m
|
|
327
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/account/OrganizationDrawerFooter.browser.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 270[2mms[22m[39m
|
|
327
328
|
[90mstderr[2m | test/sdk/account/clearPersistedSessionState.browser.test.ts
|
|
328
329
|
[22m[39mError in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
|
|
329
330
|
at waitForSessionValidated [90m(/home/runner/work/faststore/faststore/packages/core/[39msrc/sdk/cart/waitForSessionValidated.ts:16:32[90m)[39m
|
|
@@ -332,10 +333,12 @@ This ensures that you're testing the behavior the user would see in the browser.
|
|
|
332
333
|
at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
|
|
333
334
|
[90m at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
|
|
334
335
|
|
|
335
|
-
[32m✓[39m [30m[46m browser [49m[39m test/
|
|
336
|
-
[32m✓[39m [30m[46m browser [49m[39m test/
|
|
337
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m
|
|
338
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/localization/bindingPaths.test.ts [2m([22m[2m71 tests[22m[2m)[22m[32m
|
|
336
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/account/clearPersistedSessionState.browser.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
337
|
+
[32m✓[39m [30m[46m browser [49m[39m test/utils/isLocalHost.browser.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
338
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/session/reconcileSessionLocale.disabled.browser.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
339
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/localization/bindingPaths.test.ts [2m([22m[2m71 tests[22m[2m)[22m[32m 25[2mms[22m[39m
|
|
340
|
+
[32m✓[39m [30m[46m browser [49m[39m test/components/skeletons/ProductGridSkeleton.browser.test.tsx [2m([22m[2m2 tests[22m[2m)[22m[32m 44[2mms[22m[39m
|
|
341
|
+
[32m✓[39m [30m[43m node [49m[39m test/server/password-protection-service.test.ts [2m([22m[2m22 tests[22m[2m)[22m[32m 36[2mms[22m[39m
|
|
339
342
|
[90mstderr[2m | test/sdk/account/refreshToken.browser.test.ts
|
|
340
343
|
[22m[39mError in optimistic validation: TypeError: Cannot read properties of undefined (reading 'read')
|
|
341
344
|
at waitForSessionValidated [90m(/home/runner/work/faststore/faststore/packages/core/[39msrc/sdk/cart/waitForSessionValidated.ts:16:32[90m)[39m
|
|
@@ -344,13 +347,11 @@ This ensures that you're testing the behavior the user would see in the browser.
|
|
|
344
347
|
at a (/home/runner/work/faststore/faststore/packages/sdk/dist/es/index.mjs:354:23)
|
|
345
348
|
[90m at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
|
|
346
349
|
|
|
347
|
-
[32m✓[39m [30m[46m browser [49m[39m test/sdk/account/refreshToken.browser.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m
|
|
348
|
-
[32m✓[39m [30m[
|
|
349
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
350
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
351
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/localization/
|
|
352
|
-
[32m✓[39m [30m[43m node [49m[39m test/pages/api/unlock.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 152[2mms[22m[39m
|
|
353
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/localization/bindingSelector.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 7[2mms[22m[39m
|
|
350
|
+
[32m✓[39m [30m[46m browser [49m[39m test/sdk/account/refreshToken.browser.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
351
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/match-url.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 10[2mms[22m[39m
|
|
352
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/localization/useBindingSelector.test.tsx [2m([22m[2m22 tests[22m[2m)[22m[32m 18[2mms[22m[39m
|
|
353
|
+
[32m✓[39m [30m[43m node [49m[39m test/pages/api/unlock.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 175[2mms[22m[39m
|
|
354
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/localization/bindingSelector.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 12[2mms[22m[39m
|
|
354
355
|
[90mstderr[2m | test/components/search/SearchInputComponent.test.tsx
|
|
355
356
|
[22m[39mWarning: forwardRef render functions accept exactly two parameters: props and ref. Did you forget to use the ref parameter?
|
|
356
357
|
|
|
@@ -414,19 +415,19 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
|
|
|
414
415
|
at Suspense
|
|
415
416
|
at Wrapper (/home/runner/work/faststore/faststore/packages/core/test/components/search/SearchInputComponent.test.tsx:106:20)
|
|
416
417
|
|
|
417
|
-
[32m✓[39m [30m[43m node [49m[39m test/components/search/SearchInputComponent.test.tsx [2m([22m[2m6 tests[22m[2m)[22m[32m
|
|
418
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/search/useSearchHistory.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m
|
|
419
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/cookieCacheBusting.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m
|
|
418
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/search/SearchInputComponent.test.tsx [2m([22m[2m6 tests[22m[2m)[22m[32m 80[2mms[22m[39m
|
|
419
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/search/useSearchHistory.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 59[2mms[22m[39m
|
|
420
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/cookieCacheBusting.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 13[2mms[22m[39m
|
|
420
421
|
[90mstderr[2m | test/pages/pvt/account/cards/index.test.ts[2m > [22m[2mCards page getServerSideProps[2m > [22m[2mredirects to /pvt/account/403 when the query fails with 401/403
|
|
421
422
|
[22m[39m{ extensions: { status: [33m401[39m } }
|
|
422
423
|
|
|
423
424
|
[90mstderr[2m | test/pages/pvt/account/cards/index.test.ts[2m > [22m[2mCards page getServerSideProps[2m > [22m[2mrenders the error state (no redirect) when the query fails with a non-auth status
|
|
424
425
|
[22m[39m{ extensions: { status: [33m502[39m } }
|
|
425
426
|
|
|
426
|
-
[32m✓[39m [30m[43m node [49m[39m test/pages/pvt/account/cards/index.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
427
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/clearCookies.test.ts [2m([22m[2m20 tests[22m[2m)[22m[32m
|
|
428
|
-
[32m✓[39m [30m[43m node [49m[39m test/experimental/myAccountCmsServerSideProps.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
429
|
-
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountListQuotesTable.test.tsx [2m([22m[2m12 tests[22m[2m)[22m[33m
|
|
427
|
+
[32m✓[39m [30m[43m node [49m[39m test/pages/pvt/account/cards/index.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
428
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/clearCookies.test.ts [2m([22m[2m20 tests[22m[2m)[22m[32m 28[2mms[22m[39m
|
|
429
|
+
[32m✓[39m [30m[43m node [49m[39m test/experimental/myAccountCmsServerSideProps.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 11[2mms[22m[39m
|
|
430
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountListQuotesTable.test.tsx [2m([22m[2m12 tests[22m[2m)[22m[33m 456[2mms[22m[39m
|
|
430
431
|
[90mstderr[2m | test/pages/api/graphql.test.ts[2m > [22m[2m/api/graphql error status propagation[2m > [22m[2mpropagates the upstream 400 from a wrapped BadRequestError instead of 500
|
|
431
432
|
[22m[39mGraphql execution returned with error: [
|
|
432
433
|
{
|
|
@@ -519,69 +520,70 @@ Warning: React does not recognize the `providerProps` prop on a DOM element. If
|
|
|
519
520
|
at file:///home/runner/work/faststore/faststore/node_modules/[4m.pnpm[24m/@vitest+runner@4.0.18/node_modules/[4m@vitest/runner[24m/dist/index.js:1653:37
|
|
520
521
|
at Traces.$ (file:///home/runner/work/faststore/faststore/node_modules/[4m.pnpm[24m/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/[4mvitest[24m/dist/chunks/traces.CCmnQaNT.js:142:27)
|
|
521
522
|
|
|
522
|
-
[32m✓[39m [30m[43m node [49m[39m test/pages/api/graphql.test.ts [2m([22m[2m17 tests[22m[2m)[22m[32m
|
|
523
|
-
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountListQuotes.test.tsx [2m([22m[2m9 tests[22m[2m)[22m[33m
|
|
524
|
-
[33m[2m✓[22m[39m navigates with the search term on blur [33m
|
|
525
|
-
[33m[2m✓[22m[39m navigates without a label param when the search is cleared [33m
|
|
523
|
+
[32m✓[39m [30m[43m node [49m[39m test/pages/api/graphql.test.ts [2m([22m[2m17 tests[22m[2m)[22m[32m 25[2mms[22m[39m
|
|
524
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountListQuotes.test.tsx [2m([22m[2m9 tests[22m[2m)[22m[33m 840[2mms[22m[39m
|
|
525
|
+
[33m[2m✓[22m[39m navigates with the search term on blur [33m 364[2mms[22m[39m
|
|
526
|
+
[33m[2m✓[22m[39m navigates without a label param when the search is cleared [33m 359[2mms[22m[39m
|
|
526
527
|
[90mstderr[2m | test/sdk/account/useSetPassword.test.ts[2m > [22m[2museSetPassword[2m > [22m[2mmaps wrongcredentials error responses to the existing message
|
|
527
528
|
[22m[39mSet password request failed: Bad Request
|
|
528
529
|
|
|
529
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/account/useSetPassword.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m
|
|
530
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
531
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/orderEntry/useOrderEntryOperation.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
532
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
533
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/localization/localizeRedirectDestination.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m
|
|
534
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/localization/hreflang.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
535
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/account/getMyAccountRoutes.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m
|
|
536
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/orderEntry/useOrderEntryUpload.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
537
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/redirects/index.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m
|
|
538
|
-
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountQuotesFilterSlider.test.tsx [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
539
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/productJsonLd.test.ts [2m([22m[2m17 tests[22m[2m)[22m[32m
|
|
540
|
-
[32m✓[39m [30m[43m node [49m[39m test/proxy.localization.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
541
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/orderEntry/useOrderEntry.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
542
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
543
|
-
|
|
544
|
-
[33m[2m✓[22m[39m should
|
|
545
|
-
|
|
546
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
547
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/analytics/useStartRecommendationSession.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m
|
|
548
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
549
|
-
[32m✓[39m [30m[43m node [49m[39m test/server/webops-api.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m
|
|
530
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/account/useSetPassword.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 30[2mms[22m[39m
|
|
531
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/quoteFilters.test.ts [2m([22m[2m23 tests[22m[2m)[22m[32m 41[2mms[22m[39m
|
|
532
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/orderEntry/useOrderEntryOperation.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 41[2mms[22m[39m
|
|
533
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/multipleTemplates.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
|
|
534
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/localization/localizeRedirectDestination.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 7[2mms[22m[39m
|
|
535
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/localization/hreflang.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
|
|
536
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/account/getMyAccountRoutes.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 10[2mms[22m[39m
|
|
537
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/orderEntry/useOrderEntryUpload.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 62[2mms[22m[39m
|
|
538
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/redirects/index.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 51[2mms[22m[39m
|
|
539
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountQuotesFilterSlider.test.tsx [2m([22m[2m5 tests[22m[2m)[22m[32m 161[2mms[22m[39m
|
|
540
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/productJsonLd.test.ts [2m([22m[2m17 tests[22m[2m)[22m[32m 12[2mms[22m[39m
|
|
541
|
+
[32m✓[39m [30m[43m node [49m[39m test/proxy.localization.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 43[2mms[22m[39m
|
|
542
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/orderEntry/useOrderEntry.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 31[2mms[22m[39m
|
|
543
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/graphql/retryPolicy.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 17[2mms[22m[39m
|
|
544
|
+
[32m✓[39m [30m[43m node [49m[39m test/server/index.test.ts [2m([22m[2m7 tests[22m[2m)[22m[33m 1124[2mms[22m[39m
|
|
545
|
+
[33m[2m✓[22m[39m should return a valid merged GraphQL schema [33m 359[2mms[22m[39m
|
|
546
|
+
[33m[2m✓[22m[39m should handle options and execute [33m 479[2mms[22m[39m
|
|
547
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/session/syncSalesChannelFromOrderForm.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
|
|
548
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/analytics/useStartRecommendationSession.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 67[2mms[22m[39m
|
|
549
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountQuotesSelectedTags.test.tsx [2m([22m[2m8 tests[22m[2m)[22m[32m 120[2mms[22m[39m
|
|
550
|
+
[32m✓[39m [30m[43m node [49m[39m test/server/webops-api.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 18[2mms[22m[39m
|
|
550
551
|
[32m✓[39m [30m[43m node [49m[39m test/sdk/orderEntry/useOrderFormItems.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 37[2mms[22m[39m
|
|
551
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
552
|
+
[32m✓[39m [30m[43m node [49m[39m test/proxy.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 33[2mms[22m[39m
|
|
552
553
|
[32m✓[39m [30m[43m node [49m[39m test/sdk/cart/waitForSessionValidated.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 12[2mms[22m[39m
|
|
553
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
554
|
-
[32m✓[39m [30m[43m node [49m[39m test/server/content/service.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
555
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
554
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/localization/store-url.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
|
|
555
|
+
[32m✓[39m [30m[43m node [49m[39m test/server/content/service.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
556
|
+
[32m✓[39m [30m[43m node [49m[39m test/server/cms/myAccountDefaultSections.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
557
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/productJsonLdRendering.test.tsx [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
|
|
556
558
|
[32m✓[39m [30m[43m node [49m[39m test/sdk/account/refreshToken.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
|
|
557
|
-
[32m✓[39m [30m[43m node [49m[39m test/server/cms/global.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m
|
|
558
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/auth/useAuth.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
559
|
-
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountQuotesStatusSelector.test.tsx [2m([22m[2m6 tests[22m[2m)[22m[32m
|
|
560
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/getRequestHostname.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m
|
|
561
|
-
[32m✓[39m [30m[43m node [49m[39m test/server/rootSpan.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
562
|
-
[32m✓[39m [30m[43m node [49m[39m test/pages/api/preview.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m
|
|
559
|
+
[32m✓[39m [30m[43m node [49m[39m test/server/cms/global.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
560
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/auth/useAuth.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 32[2mms[22m[39m
|
|
561
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountQuotesStatusSelector.test.tsx [2m([22m[2m6 tests[22m[2m)[22m[32m 143[2mms[22m[39m
|
|
562
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/getRequestHostname.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 7[2mms[22m[39m
|
|
563
|
+
[32m✓[39m [30m[43m node [49m[39m test/server/rootSpan.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 41[2mms[22m[39m
|
|
564
|
+
[32m✓[39m [30m[43m node [49m[39m test/pages/api/preview.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
|
|
563
565
|
[32m✓[39m [30m[43m node [49m[39m test/components/search/SearchInput.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
|
|
564
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/validateSessionRefreshToken.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m
|
|
565
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
566
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
567
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/retry.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
566
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/validateSessionRefreshToken.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
567
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/recommendations/vrn.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
568
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/account/Layout.test.tsx [2m([22m[2m6 tests[22m[2m)[22m[32m 67[2mms[22m[39m
|
|
569
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/retry.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 15[2mms[22m[39m
|
|
568
570
|
[32m✓[39m [30m[43m node [49m[39m test/server/cms/index.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
569
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/account/getB2BSessionClaims.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
570
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/unlockResponse.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m
|
|
571
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/recommendations/useRecommendations.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m
|
|
572
|
-
[32m✓[39m [30m[43m node [49m[39m test/sdk/recommendations/useRecommendationUserId.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
573
|
-
[32m✓[39m [30m[43m node [49m[39m test/utils/isLocalHost.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m
|
|
574
|
-
[32m✓[39m [30m[43m node [49m[39m test/components/account/OrganizationDrawerBody.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 52[2mms[22m[39m
|
|
571
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/account/getB2BSessionClaims.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
572
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/unlockResponse.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 7[2mms[22m[39m
|
|
573
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/recommendations/useRecommendations.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
574
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/recommendations/useRecommendationUserId.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 182[2mms[22m[39m
|
|
575
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/isLocalHost.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
575
576
|
[32m✓[39m [30m[43m node [49m[39m test/utils/userOrderStatus.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
576
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
577
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
578
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
579
|
-
[32m✓[39m [30m[43m node [49m[39m test/instrumentation.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m
|
|
580
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
581
|
-
[32m✓[39m [30m[43m node [49m[39m test/
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
[2m
|
|
585
|
-
[2m
|
|
586
|
-
[2m
|
|
577
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/account/OrganizationDrawerBody.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 45[2mms[22m[39m
|
|
578
|
+
[32m✓[39m [30m[43m node [49m[39m test/utils/getCookie.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
579
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/analytics/utils.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
|
580
|
+
[32m✓[39m [30m[43m node [49m[39m test/instrumentation.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
581
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/auth/ProfileChallenge.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 29[2mms[22m[39m
|
|
582
|
+
[32m✓[39m [30m[43m node [49m[39m test/sdk/account/clearPersistedSessionState.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 15[2mms[22m[39m
|
|
583
|
+
[32m✓[39m [30m[43m node [49m[39m test/components/quotes/MyAccountQuoteStatusBadge.test.tsx [2m([22m[2m2 tests[22m[2m)[22m[32m 25[2mms[22m[39m
|
|
584
|
+
|
|
585
|
+
[2m Test Files [22m [1m[32m98 passed[39m[22m[90m (98)[39m
|
|
586
|
+
[2m Tests [22m [1m[32m795 passed[39m[22m[90m (795)[39m
|
|
587
|
+
[2m Start at [22m 23:27:58
|
|
588
|
+
[2m Duration [22m 50.91s[2m (transform 12.87s, setup 0ms, import 46.91s, tests 16.15s, environment 62.03s)[22m
|
|
587
589
|
|
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
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.8.0-dev.8](https://github.com/vtex/faststore/compare/v4.8.0-dev.7...v4.8.0-dev.8) (2026-09-14)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **core:** align the saved-cards list with the design reference ([#3487](https://github.com/vtex/faststore/issues/3487)) ([0e0d3ea](https://github.com/vtex/faststore/commit/0e0d3eacc23f5d2027ef5f933b03cd8a0338885c))
|
|
11
|
+
|
|
12
|
+
# [4.8.0-dev.7](https://github.com/vtex/faststore/compare/v4.8.0-dev.6...v4.8.0-dev.7) (2026-09-14)
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
- stop retrying upstream 429 responses ([#3453](https://github.com/vtex/faststore/issues/3453)) ([a142258](https://github.com/vtex/faststore/commit/a14225863578965609aa5012cc1ca9f0132959b2)), closes [#3379](https://github.com/vtex/faststore/issues/3379) [#3420](https://github.com/vtex/faststore/issues/3420) [#1629](https://github.com/vtex/faststore/issues/1629) [/github.com/vtex/faststore/pull/3453#issuecomment-5433632179](https://github.com//github.com/vtex/faststore/pull/3453/issues/issuecomment-5433632179)
|
|
17
|
+
|
|
6
18
|
# [4.8.0-dev.6](https://github.com/vtex/faststore/compare/v4.8.0-dev.5...v4.8.0-dev.6) (2026-09-11)
|
|
7
19
|
|
|
8
20
|
**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.8.0-dev.
|
|
3
|
+
"version": "4.8.0-dev.8",
|
|
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.8.0-dev.
|
|
75
|
-
"@faststore/
|
|
76
|
-
"@faststore/
|
|
77
|
-
"@faststore/
|
|
78
|
-
"@faststore/
|
|
74
|
+
"@faststore/api": "4.8.0-dev.8",
|
|
75
|
+
"@faststore/diagnostics": "4.8.0-dev.8",
|
|
76
|
+
"@faststore/lighthouse": "4.8.0-dev.8",
|
|
77
|
+
"@faststore/ui": "4.8.0-dev.8",
|
|
78
|
+
"@faststore/sdk": "4.8.0-dev.8"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@cypress/code-coverage": "^3.12.1",
|
|
@@ -52,6 +52,16 @@
|
|
|
52
52
|
color: var(--fs-text-link, #0632c1);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
// The tabpanel wrapper sits between .page and the controls/grid pair, so
|
|
56
|
+
// .page's column gap stops at this element and never separates the search
|
|
57
|
+
// row from the list below it. Carry the same rhythm down one level rather
|
|
58
|
+
// than dropping the wrapper, which owns the tabpanel role the tabs point at.
|
|
59
|
+
[data-fs-list-cards-panel] {
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
gap: var(--fs-spacing-4, 1.5rem);
|
|
63
|
+
}
|
|
64
|
+
|
|
55
65
|
[data-fs-list-cards-controls] {
|
|
56
66
|
display: flex;
|
|
57
67
|
flex-wrap: wrap;
|
|
@@ -84,14 +94,25 @@
|
|
|
84
94
|
|
|
85
95
|
[data-fs-list-cards-item] {
|
|
86
96
|
display: flex;
|
|
97
|
+
|
|
98
|
+
// Square tile, per the design reference: brand mark at the top, label and
|
|
99
|
+
// number at the bottom, with the slack between them. `aspect-ratio` sets
|
|
100
|
+
// the preferred box only — a long label still grows the card rather than
|
|
101
|
+
// overflowing it, since `min-height` stays `auto`.
|
|
87
102
|
flex-direction: column;
|
|
88
103
|
gap: var(--fs-spacing-1, 0.5rem);
|
|
104
|
+
aspect-ratio: 1;
|
|
89
105
|
padding: var(--fs-spacing-2, 1rem);
|
|
90
106
|
border: 1px solid var(--fs-border-color, #d9d9d9);
|
|
91
107
|
border-radius: var(--fs-border-radius, 0.25rem);
|
|
92
108
|
}
|
|
93
109
|
|
|
94
110
|
[data-fs-list-cards-item-brand] {
|
|
111
|
+
// Pins the brand mark to the top edge and lets the label and number stay
|
|
112
|
+
// grouped at the bottom, as the design reference has them. `space-between`
|
|
113
|
+
// on the parent cannot express this: with three children it spreads all
|
|
114
|
+
// three evenly and strands the label in the middle of the tile.
|
|
115
|
+
margin-bottom: auto;
|
|
95
116
|
font-size: 0.875rem;
|
|
96
117
|
font-weight: 700;
|
|
97
118
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const MAX_BACKOFF_EXPONENT = 8
|
|
2
|
+
const TOO_MANY_REQUESTS = 429
|
|
3
|
+
|
|
4
|
+
/** Mirrors SWR's `RevalidatorOptions`. */
|
|
5
|
+
type RetryOptions = { retryCount: number; dedupe?: boolean }
|
|
6
|
+
|
|
7
|
+
/** Mirrors the subset of SWR's resolved config that the retry policy reads. */
|
|
8
|
+
type RetryConfig = { errorRetryCount?: number; errorRetryInterval: number }
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* SWR retry policy: never retry an upstream rate limit, retry everything else
|
|
12
|
+
* exactly as SWR would.
|
|
13
|
+
*
|
|
14
|
+
* A 429 means an upstream is already shedding load, so retrying multiplies the
|
|
15
|
+
* traffic it is trying to reject. Providing `onErrorRetry` replaces SWR's
|
|
16
|
+
* default implementation entirely, so the fall-through branch mirrors
|
|
17
|
+
* swr@2.4.0's default (ceiling check plus jittered exponential backoff) to keep
|
|
18
|
+
* every other status behaving as it did before. Revisit on an SWR upgrade.
|
|
19
|
+
*
|
|
20
|
+
* SWR writes the truncation as `~~`; `Math.trunc` is used here instead because
|
|
21
|
+
* the values stay far below 2^31, where the two are equivalent.
|
|
22
|
+
*/
|
|
23
|
+
export const onErrorRetry = (
|
|
24
|
+
error: unknown,
|
|
25
|
+
_key: string,
|
|
26
|
+
config: RetryConfig,
|
|
27
|
+
revalidate: (opts: RetryOptions) => void,
|
|
28
|
+
opts: RetryOptions
|
|
29
|
+
) => {
|
|
30
|
+
if (
|
|
31
|
+
(error as { status?: number } | undefined)?.status === TOO_MANY_REQUESTS
|
|
32
|
+
) {
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const maxRetryCount = config.errorRetryCount
|
|
37
|
+
const { retryCount } = opts
|
|
38
|
+
|
|
39
|
+
const timeout =
|
|
40
|
+
Math.trunc(
|
|
41
|
+
(Math.random() + 0.5) * (1 << Math.min(retryCount, MAX_BACKOFF_EXPONENT))
|
|
42
|
+
) * config.errorRetryInterval
|
|
43
|
+
|
|
44
|
+
if (maxRetryCount !== undefined && retryCount > maxRetryCount) {
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
setTimeout(revalidate, timeout, opts)
|
|
49
|
+
}
|
|
@@ -5,6 +5,7 @@ import { getClientCacheBustingValue } from 'src/utils/cookieCacheBusting'
|
|
|
5
5
|
|
|
6
6
|
import type { Operation, RequestOptions } from './request'
|
|
7
7
|
import { request } from './request'
|
|
8
|
+
import { onErrorRetry } from './retryPolicy'
|
|
8
9
|
|
|
9
10
|
export type QueryOptions = SWRConfiguration &
|
|
10
11
|
RequestOptions & { doNotRun?: boolean }
|
|
@@ -34,6 +35,7 @@ export const DEFAULT_OPTIONS = {
|
|
|
34
35
|
revalidateOnFocus: false,
|
|
35
36
|
revalidateOnReconnect: false,
|
|
36
37
|
shouldRetryOnError: true,
|
|
38
|
+
onErrorRetry,
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
export const useQuery = <Data, Variables = Record<string, unknown>>(
|
|
@@ -298,4 +298,42 @@ describe('MyAccountListCards', () => {
|
|
|
298
298
|
fireEvent.click(screen.getByRole('button', { name: 'Try again' }))
|
|
299
299
|
expect(mockReload).toHaveBeenCalledTimes(1)
|
|
300
300
|
})
|
|
301
|
+
|
|
302
|
+
// Regression guard for the search/list spacing fix. The stylesheet hangs the
|
|
303
|
+
// column gap off this attribute because .page's own gap stops at this
|
|
304
|
+
// wrapper and never separates the controls row from the list below it.
|
|
305
|
+
// Dropping the attribute collapses that gap back to zero, silently.
|
|
306
|
+
it('marks the panel wrapper that carries the spacing between controls and list', () => {
|
|
307
|
+
const { container } = render(
|
|
308
|
+
<MyAccountListCards
|
|
309
|
+
personalCards={[VISA_PERSONAL]}
|
|
310
|
+
sharedCards={[AMEX_SHARED]}
|
|
311
|
+
hasOrgAssociation
|
|
312
|
+
canViewPersonalCards
|
|
313
|
+
/>
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
const panel = container.querySelector('[data-fs-list-cards-panel]')
|
|
317
|
+
|
|
318
|
+
expect(panel).not.toBeNull()
|
|
319
|
+
expect(panel).toHaveAttribute('role', 'tabpanel')
|
|
320
|
+
expect(panel?.querySelector('[data-fs-list-cards-controls]')).not.toBeNull()
|
|
321
|
+
expect(panel?.querySelector('[data-fs-list-cards-grid]')).not.toBeNull()
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
it('keeps the panel marker in the shared-only rendering, which has no tabpanel role', () => {
|
|
325
|
+
const { container } = render(
|
|
326
|
+
<MyAccountListCards
|
|
327
|
+
personalCards={[]}
|
|
328
|
+
sharedCards={[AMEX_SHARED]}
|
|
329
|
+
hasOrgAssociation
|
|
330
|
+
canViewPersonalCards={false}
|
|
331
|
+
/>
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
const panel = container.querySelector('[data-fs-list-cards-panel]')
|
|
335
|
+
|
|
336
|
+
expect(panel).not.toBeNull()
|
|
337
|
+
expect(panel).not.toHaveAttribute('role')
|
|
338
|
+
})
|
|
301
339
|
})
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { onErrorRetry } from '../../../src/sdk/graphql/retryPolicy'
|
|
4
|
+
|
|
5
|
+
const ERROR_RETRY_INTERVAL = 5000
|
|
6
|
+
|
|
7
|
+
type RetryConfig = Parameters<typeof onErrorRetry>[2]
|
|
8
|
+
|
|
9
|
+
const createConfig = (overrides: Partial<RetryConfig> = {}): RetryConfig => ({
|
|
10
|
+
errorRetryCount: 3,
|
|
11
|
+
errorRetryInterval: ERROR_RETRY_INTERVAL,
|
|
12
|
+
...overrides,
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
// The client throws the object built by `baseRequest` in `request.ts`, which
|
|
16
|
+
// carries the HTTP status — not an Error instance.
|
|
17
|
+
const clientError = (status?: number) => ({
|
|
18
|
+
status,
|
|
19
|
+
message: 'upstream failure',
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
const runRetry = ({
|
|
23
|
+
error,
|
|
24
|
+
retryCount = 0,
|
|
25
|
+
config = createConfig(),
|
|
26
|
+
}: {
|
|
27
|
+
error: unknown
|
|
28
|
+
retryCount?: number
|
|
29
|
+
config?: RetryConfig
|
|
30
|
+
}) => {
|
|
31
|
+
const revalidate = vi.fn()
|
|
32
|
+
|
|
33
|
+
onErrorRetry(error, 'a-key', config, revalidate, {
|
|
34
|
+
retryCount,
|
|
35
|
+
dedupe: false,
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
vi.runAllTimers()
|
|
39
|
+
|
|
40
|
+
return revalidate
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
describe('useQuery retry policy', () => {
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
vi.useFakeTimers()
|
|
46
|
+
// Pins SWR's jitter so the backoff assertions are deterministic.
|
|
47
|
+
vi.spyOn(Math, 'random').mockReturnValue(0.5)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
afterEach(() => {
|
|
51
|
+
// `restoreAllMocks` must run first: the `setTimeout` spy is installed while
|
|
52
|
+
// timers are faked, so restoring it after `useRealTimers` would put the
|
|
53
|
+
// faked timer back onto `globalThis`.
|
|
54
|
+
vi.restoreAllMocks()
|
|
55
|
+
vi.useRealTimers()
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('never retries an upstream rate limit (429)', () => {
|
|
59
|
+
expect(runRetry({ error: clientError(429) })).not.toHaveBeenCalled()
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
it('does not retry a 429 even on the first attempt of a fresh key', () => {
|
|
63
|
+
const revalidate = runRetry({ error: clientError(429), retryCount: 0 })
|
|
64
|
+
|
|
65
|
+
expect(revalidate).not.toHaveBeenCalled()
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it.each([400, 401, 403, 404, 409, 422, 500, 502, 503])(
|
|
69
|
+
'still retries status %i',
|
|
70
|
+
(status) => {
|
|
71
|
+
expect(runRetry({ error: clientError(status) })).toHaveBeenCalledTimes(1)
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
it('still retries an error carrying no status (e.g. network failure)', () => {
|
|
76
|
+
expect(runRetry({ error: clientError(undefined) })).toHaveBeenCalledTimes(1)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('retries while at the errorRetryCount ceiling', () => {
|
|
80
|
+
expect(
|
|
81
|
+
runRetry({ error: clientError(500), retryCount: 3 })
|
|
82
|
+
).toHaveBeenCalledTimes(1)
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it('stops retrying once errorRetryCount is exceeded', () => {
|
|
86
|
+
expect(
|
|
87
|
+
runRetry({ error: clientError(500), retryCount: 4 })
|
|
88
|
+
).not.toHaveBeenCalled()
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it.each([
|
|
92
|
+
[0, 1 * ERROR_RETRY_INTERVAL],
|
|
93
|
+
[2, 4 * ERROR_RETRY_INTERVAL],
|
|
94
|
+
[3, 8 * ERROR_RETRY_INTERVAL],
|
|
95
|
+
])(
|
|
96
|
+
'mirrors SWR exponential backoff for retryCount %i',
|
|
97
|
+
(retryCount, expectedTimeout) => {
|
|
98
|
+
const setTimeoutSpy = vi.spyOn(globalThis, 'setTimeout')
|
|
99
|
+
const revalidate = vi.fn()
|
|
100
|
+
|
|
101
|
+
onErrorRetry(
|
|
102
|
+
clientError(500),
|
|
103
|
+
'a-key',
|
|
104
|
+
createConfig({ errorRetryCount: 10 }),
|
|
105
|
+
revalidate,
|
|
106
|
+
{ retryCount, dedupe: false }
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
expect(setTimeoutSpy).toHaveBeenCalledWith(
|
|
110
|
+
revalidate,
|
|
111
|
+
expectedTimeout,
|
|
112
|
+
expect.objectContaining({ retryCount })
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
it('caps the backoff exponent at 8, as SWR does', () => {
|
|
118
|
+
const setTimeoutSpy = vi.spyOn(globalThis, 'setTimeout')
|
|
119
|
+
const revalidate = vi.fn()
|
|
120
|
+
|
|
121
|
+
onErrorRetry(
|
|
122
|
+
clientError(500),
|
|
123
|
+
'a-key',
|
|
124
|
+
createConfig({ errorRetryCount: 100 }),
|
|
125
|
+
revalidate,
|
|
126
|
+
{ retryCount: 12, dedupe: false }
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
expect(setTimeoutSpy).toHaveBeenCalledWith(
|
|
130
|
+
revalidate,
|
|
131
|
+
256 * ERROR_RETRY_INTERVAL,
|
|
132
|
+
expect.objectContaining({ retryCount: 12 })
|
|
133
|
+
)
|
|
134
|
+
})
|
|
135
|
+
})
|