@faststore/core 3.99.1 → 4.0.0-dev.4

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 (543) hide show
  1. package/.turbo/turbo-generate.log +29 -0
  2. package/.turbo/turbo-test.log +47 -16
  3. package/@generated/cached-operations.json +24 -0
  4. package/@generated/gql.ts +134 -210
  5. package/@generated/graphql.ts +1628 -3037
  6. package/@generated/index.ts +1 -1
  7. package/@generated/persisted-documents.json +1 -1
  8. package/@generated/schema.graphql +1854 -1743
  9. package/CHANGELOG.md +28 -4
  10. package/README.md +2 -1
  11. package/api/index.ts +6 -7
  12. package/cms/faststore/base.jsonc +1 -1
  13. package/cms/faststore/components/cms_component__alert.jsonc +5 -1
  14. package/cms/faststore/components/cms_component__bannernewsletter.jsonc +5 -1
  15. package/cms/faststore/components/cms_component__bannertext.jsonc +5 -1
  16. package/cms/faststore/components/cms_component__breadcrumb.jsonc +16 -4
  17. package/cms/faststore/components/cms_component__cartsidebar.jsonc +21 -1
  18. package/cms/faststore/components/cms_component__children.jsonc +5 -1
  19. package/cms/faststore/components/cms_component__crosssellingshelf.jsonc +5 -1
  20. package/cms/faststore/components/cms_component__emptystate.jsonc +8 -3
  21. package/cms/faststore/components/cms_component__footer.jsonc +9 -3
  22. package/cms/faststore/components/cms_component__hero.jsonc +5 -1
  23. package/cms/faststore/components/cms_component__incentives.jsonc +5 -1
  24. package/cms/faststore/components/cms_component__navbar.jsonc +139 -1
  25. package/cms/faststore/components/cms_component__newsletter.jsonc +5 -1
  26. package/cms/faststore/components/cms_component__productdetails.jsonc +33 -1
  27. package/cms/faststore/components/cms_component__productgallery.jsonc +113 -15
  28. package/cms/faststore/components/cms_component__productshelf.jsonc +5 -1
  29. package/cms/faststore/components/cms_component__producttiles.jsonc +5 -1
  30. package/cms/faststore/components/cms_component__regionbar.jsonc +5 -1
  31. package/cms/faststore/components/cms_component__regionmodal.jsonc +5 -1
  32. package/cms/faststore/components/cms_component__regionpopover.jsonc +5 -1
  33. package/cms/faststore/components/cms_component__scrolltotopbutton.jsonc +29 -0
  34. package/cms/faststore/components/cms_component__search.jsonc +5 -1
  35. package/cms/faststore/content-types.json +115 -0
  36. package/cms/faststore/pages/cms_content_type__globalsections.jsonc +52 -0
  37. package/cms/faststore/pages/cms_content_type__home.jsonc +6 -0
  38. package/cms/faststore/pages/cms_content_type__landingpage.jsonc +8 -1
  39. package/cms/faststore/pages/cms_content_type__pdp.jsonc +6 -0
  40. package/cms/faststore/pages/cms_content_type__plp.jsonc +17 -0
  41. package/cms/faststore/pages/cms_content_type__search.jsonc +17 -0
  42. package/cms/faststore/schema.json +547 -43
  43. package/cms/faststore/sections.json +330 -21
  44. package/discovery.config.default.js +49 -3
  45. package/next-env.d.ts +2 -1
  46. package/next.config.js +48 -26
  47. package/package.json +47 -60
  48. package/public/icons.svg +5 -1
  49. package/scripts/i18n.js +76 -0
  50. package/src/components/account/MyAccountDrawer/OrganizationDrawer/OrganizationDrawer.tsx +2 -1
  51. package/src/components/account/MyAccountDrawer/OrganizationDrawer/section.module.scss +25 -24
  52. package/src/components/account/MyAccountDrawer/ProfileSummary/profile-summary.scss +8 -6
  53. package/src/components/account/MyAccountLayout/styles.scss +16 -12
  54. package/src/components/account/MyAccountMenu/styles.scss +21 -22
  55. package/src/components/account/MyAccountUserDetails/styles.module.scss +4 -2
  56. package/src/components/account/components/MyAccountAccordion/styles.scss +4 -2
  57. package/src/components/account/components/MyAccountHeader/styles.scss +3 -1
  58. package/src/components/account/components/MyAccountTable/styles.scss +6 -4
  59. package/src/components/account/orders/MyAccountListOrders/MyAccountFilterSlider/section.module.scss +21 -19
  60. package/src/components/account/orders/MyAccountListOrders/MyAccountListOrdersTable/MyAccountListOrdersTable.tsx +3 -1
  61. package/src/components/account/orders/MyAccountListOrders/MyAccountListOrdersTable/styles.scss +5 -3
  62. package/src/components/account/orders/MyAccountListOrders/styles.module.scss +25 -22
  63. package/src/components/account/orders/MyAccountOrderDetails/MyAccountBudgetsCard/styles.scss +7 -5
  64. package/src/components/account/orders/MyAccountOrderDetails/MyAccountDeliveryOptionAccordion/styles.scss +7 -5
  65. package/src/components/account/orders/MyAccountOrderDetails/MyAccountMoreInformationCard/styles.scss +3 -1
  66. package/src/components/account/orders/MyAccountOrderDetails/MyAccountOrderActionModal/styles.module.scss +8 -6
  67. package/src/components/account/orders/MyAccountOrderDetails/MyAccountOrderActions/styles.scss +3 -1
  68. package/src/components/account/orders/MyAccountOrderDetails/MyAccountStatusCard/styles.scss +8 -6
  69. package/src/components/account/orders/MyAccountOrderDetails/section.module.scss +36 -43
  70. package/src/components/account/profile/profile.module.scss +3 -1
  71. package/src/components/account/section.module.scss +3 -1
  72. package/src/components/account/security/styles.module.scss +14 -8
  73. package/src/components/cart/CartSidebar/CartSidebar.tsx +10 -1
  74. package/src/components/cart/CartSidebar/section.module.scss +19 -17
  75. package/src/components/cart/EmptyCart/EmptyCart.tsx +12 -4
  76. package/src/components/cms/GlobalSections.tsx +12 -12
  77. package/src/components/cms/RenderSections.tsx +10 -2
  78. package/src/components/cms/plp/Components.ts +9 -0
  79. package/src/components/common/Alert/section.module.scss +10 -5
  80. package/src/components/common/PreviewTag/section.module.scss +48 -40
  81. package/src/components/common/Toast/section.module.scss +4 -2
  82. package/src/components/localization/LocalizationSelector/LocalizationSelector.tsx +320 -0
  83. package/src/components/localization/LocalizationSelector/index.ts +1 -0
  84. package/src/components/localization/LocalizationSelector/section.module.scss +18 -0
  85. package/src/components/localization/index.ts +1 -0
  86. package/src/components/navigation/Navbar/Navbar.tsx +49 -1
  87. package/src/components/navigation/NavbarSlider/NavbarSlider.tsx +19 -1
  88. package/src/components/navigation/NavbarSlider/section.module.scss +12 -10
  89. package/src/components/product/OutOfStock/OutOfStock.tsx +6 -1
  90. package/src/components/product/ProductCard/ProductCard.tsx +1 -1
  91. package/src/components/region/RegionModal/RegionModal.tsx +4 -1
  92. package/src/components/region/RegionModal/section.module.scss +10 -8
  93. package/src/components/region/RegionPopover/RegionPopover.tsx +6 -5
  94. package/src/components/region/RegionPopover/section.module.scss +9 -7
  95. package/src/components/region/RegionSlider/RegionSlider.tsx +5 -2
  96. package/src/components/region/RegionSlider/section.module.scss +16 -13
  97. package/src/components/search/Filter/FilterDeliveryMethodFacet.tsx +5 -5
  98. package/src/components/search/Filter/FilterDesktop.tsx +13 -4
  99. package/src/components/search/Filter/FilterSlider.tsx +18 -6
  100. package/src/components/search/Filter/section.module.scss +21 -19
  101. package/src/components/search/SearchDropdown/SearchDropdown.tsx +9 -7
  102. package/src/components/search/SearchHistory/SearchHistory.tsx +7 -2
  103. package/src/components/search/SearchInput/SearchInput.tsx +21 -8
  104. package/src/components/search/SearchProductItem/SearchProductItem.tsx +10 -3
  105. package/src/components/search/SearchTop/SearchTop.tsx +30 -24
  106. package/src/components/search/Sort/Sort.tsx +17 -19
  107. package/src/components/sections/Alert/Alert.tsx +6 -1
  108. package/src/components/sections/BannerNewsletter/section.module.scss +6 -4
  109. package/src/components/sections/BannerText/section.module.scss +5 -3
  110. package/src/components/sections/Breadcrumb/Breadcrumb.tsx +6 -2
  111. package/src/components/sections/Breadcrumb/section.module.scss +7 -5
  112. package/src/components/sections/EmptyState/section.module.scss +5 -3
  113. package/src/components/sections/Footer/Footer.tsx +1 -5
  114. package/src/components/sections/Footer/section.module.scss +10 -8
  115. package/src/components/sections/Hero/Hero.tsx +3 -1
  116. package/src/components/sections/Hero/section.module.scss +6 -4
  117. package/src/components/sections/Incentives/section.module.scss +5 -3
  118. package/src/components/sections/Navbar/Navbar.tsx +45 -0
  119. package/src/components/sections/Navbar/section.module.scss +34 -33
  120. package/src/components/sections/Newsletter/section.module.scss +10 -8
  121. package/src/components/sections/ProductDetails/ProductDetails.tsx +23 -1
  122. package/src/components/sections/ProductDetails/section.module.scss +32 -30
  123. package/src/components/sections/ProductGallery/EmptyGallery.tsx +13 -16
  124. package/src/components/sections/ProductGallery/section.module.scss +42 -39
  125. package/src/components/sections/ProductShelf/section.module.scss +22 -17
  126. package/src/components/sections/ProductTiles/section.module.scss +15 -13
  127. package/src/components/sections/RegionBar/section.module.scss +5 -3
  128. package/src/components/sections/ScrollToTopButton/ScrollToTopButton.tsx +4 -3
  129. package/src/components/sections/ScrollToTopButton/section.module.scss +4 -2
  130. package/src/components/templates/LandingPage/LandingPage.tsx +22 -16
  131. package/src/components/templates/ProductListingPage/ProductListing.tsx +1 -13
  132. package/src/components/templates/ProductListingPage/ProductListingPage.tsx +8 -3
  133. package/src/components/ui/Breadcrumb/Breadcrumb.tsx +14 -11
  134. package/src/components/ui/Button/ButtonSignIn/ButtonSignIn.tsx +2 -1
  135. package/src/components/ui/Button/ButtonSignIn/ButtonSignInFallback/ButtonSignInFallback.tsx +3 -1
  136. package/src/components/ui/Link/Link.tsx +19 -2
  137. package/src/components/ui/LinkButton/LinkButton.tsx +28 -0
  138. package/src/components/ui/LinkButton/index.ts +2 -0
  139. package/src/components/ui/LocalizationButton/LocalizationButton.tsx +124 -0
  140. package/src/components/ui/LocalizationButton/index.ts +1 -0
  141. package/src/components/ui/PickupPoints/PickupPointCards.tsx +2 -4
  142. package/src/components/ui/ProductComparison/ProductComparisonSidebar.tsx +34 -17
  143. package/src/components/ui/ProductDescription/ProductDescription.tsx +8 -3
  144. package/src/components/ui/ProductDetails/AddToCartLoadingSkeleton.tsx +6 -2
  145. package/src/components/ui/ProductDetails/ProductDetailsSettings.tsx +17 -5
  146. package/src/components/ui/ProductGallery/ProductGallery.tsx +7 -3
  147. package/src/components/ui/ProductGallery/ProductGalleryPage.tsx +1 -3
  148. package/src/components/ui/ShippingSimulation/ShippingSimulation.tsx +6 -1
  149. package/src/customizations/src/styles/custom-mixins.scss +0 -2
  150. package/src/experimental/index.ts +26 -0
  151. package/src/experimental/myAccountServerSideProps.ts +11 -2
  152. package/src/experimental/searchServerSideFunctions/getServerSideProps.ts +13 -7
  153. package/src/experimental/searchServerSideFunctions/getStaticProps.ts +5 -4
  154. package/src/instrumentation.ts +20 -6
  155. package/src/pages/404.tsx +5 -4
  156. package/src/pages/500.tsx +5 -4
  157. package/src/pages/[...slug].tsx +7 -4
  158. package/src/pages/[slug]/p.tsx +26 -8
  159. package/src/pages/_app.tsx +9 -1
  160. package/src/pages/api/fs/logout.ts +3 -2
  161. package/src/pages/api/graphql.ts +7 -23
  162. package/src/pages/api/preview.ts +21 -8
  163. package/src/pages/checkout.tsx +15 -5
  164. package/src/pages/index.tsx +19 -10
  165. package/src/pages/login.tsx +5 -4
  166. package/src/pages/pvt/account/403.tsx +11 -2
  167. package/src/pages/pvt/account/404.tsx +13 -3
  168. package/src/pages/pvt/account/index.tsx +6 -4
  169. package/src/pages/pvt/account/orders/[id].tsx +11 -3
  170. package/src/pages/pvt/account/orders/index.tsx +11 -3
  171. package/src/pages/pvt/account/profile.tsx +11 -2
  172. package/src/pages/pvt/account/security.tsx +11 -2
  173. package/src/pages/pvt/account/user-details.tsx +11 -2
  174. package/src/pages/s.tsx +26 -6
  175. package/src/proxy.ts +154 -0
  176. package/src/sdk/account/refreshToken.ts +4 -4
  177. package/src/sdk/account/useReorder.ts +8 -2
  178. package/src/sdk/analytics/platform/vtex/search.ts +3 -2
  179. package/src/sdk/cart/redirectToCheckout.ts +14 -8
  180. package/src/sdk/cart/useCheckoutButton.ts +7 -1
  181. package/src/sdk/deliveryPromise/useDeliveryPromise.ts +10 -18
  182. package/src/sdk/graphql/request.ts +102 -50
  183. package/src/sdk/localization/bindingSelector.ts +91 -0
  184. package/src/sdk/localization/index.ts +4 -0
  185. package/src/sdk/localization/match-url.ts +64 -0
  186. package/src/sdk/localization/types.ts +31 -0
  187. package/src/sdk/localization/useBindingSelector.ts +183 -0
  188. package/src/sdk/localization/useLocaleValidation.ts +49 -0
  189. package/src/sdk/localization/useLocalizationConfig.tsx +160 -0
  190. package/src/sdk/offer/fetcher.ts +3 -2
  191. package/src/sdk/product/useLocalizedVariables.ts +1 -1
  192. package/src/sdk/product/usePageProductsQuery.ts +2 -2
  193. package/src/sdk/product/useProductGalleryQuery.ts +1 -2
  194. package/src/sdk/product/useProductLink.ts +3 -1
  195. package/src/sdk/search/formatSearchPath.ts +28 -3
  196. package/src/sdk/search/state.ts +22 -13
  197. package/src/sdk/search/useSearchBase.ts +10 -0
  198. package/src/sdk/search/useSearchHistory.ts +41 -7
  199. package/src/sdk/session/index.ts +21 -3
  200. package/src/sdk/shipping/useShippingSimulation.ts +10 -2
  201. package/src/sdk/tsconfig.json +6 -0
  202. package/src/sdk/ui/useLink.ts +48 -0
  203. package/src/server/cms/global.ts +40 -0
  204. package/src/server/cms/index.ts +18 -10
  205. package/src/server/cms/pdp.ts +1 -0
  206. package/src/server/cms/plp.ts +3 -0
  207. package/src/server/content/service.ts +36 -24
  208. package/src/server/content/types.ts +10 -3
  209. package/src/server/index.ts +27 -20
  210. package/src/server/options.ts +27 -2
  211. package/src/styles/global/index.scss +10 -7
  212. package/src/styles/main.scss +3 -3
  213. package/src/typings/locales.ts +41 -0
  214. package/src/utils/fetchProductGallerySSR.ts +3 -1
  215. package/src/utils/getBaseDomain.ts +2 -1
  216. package/src/utils/getRequestHostname.ts +26 -0
  217. package/src/utils/globalSettings.ts +11 -0
  218. package/src/utils/localization/bindingPaths.ts +337 -0
  219. package/src/utils/localization/validateLocaleForHostname.ts +69 -0
  220. package/src/utils/localization/withLocaleValidation.ts +36 -0
  221. package/src/utils/utilities.ts +22 -0
  222. package/test/pages/api/preview.test.ts +93 -0
  223. package/test/sdk/localization/bindingSelector.test.ts +246 -0
  224. package/test/sdk/localization/store-url.browser.test.ts +140 -0
  225. package/test/sdk/localization/store-url.test.ts +96 -0
  226. package/test/sdk/localization/useBindingSelector.test.tsx +219 -0
  227. package/test/sdk/search/useSearchHistory.test.ts +222 -0
  228. package/test/server/cms/index.test.ts +3 -4
  229. package/test/server/content/service.test.ts +98 -0
  230. package/test/server/index.test.ts +10 -22
  231. package/test/utils/cookieCacheBusting.test.ts +32 -24
  232. package/test/utils/getRequestHostname.test.ts +71 -0
  233. package/test/utils/localization/bindingPaths.test.ts +706 -0
  234. package/test/utils/match-url.test.ts +388 -0
  235. package/tsconfig.json +11 -3
  236. package/vitest.config.ts +61 -0
  237. package/.next/BUILD_ID +0 -1
  238. package/.next/build-manifest.json +0 -197
  239. package/.next/cache/.tsbuildinfo +0 -1
  240. package/.next/cache/config.json +0 -7
  241. package/.next/cache/webpack/client-production/0.pack +0 -0
  242. package/.next/cache/webpack/client-production/index.pack +0 -0
  243. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  244. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  245. package/.next/cache/webpack/server-production/0.pack +0 -0
  246. package/.next/cache/webpack/server-production/index.pack +0 -0
  247. package/.next/export-marker.json +0 -1
  248. package/.next/images-manifest.json +0 -1
  249. package/.next/next-minimal-server.js.nft.json +0 -1
  250. package/.next/next-server.js.nft.json +0 -1
  251. package/.next/package.json +0 -1
  252. package/.next/prerender-manifest.js +0 -1
  253. package/.next/prerender-manifest.json +0 -1
  254. package/.next/react-loadable-manifest.json +0 -478
  255. package/.next/required-server-files.json +0 -1
  256. package/.next/routes-manifest.json +0 -1
  257. package/.next/server/chunks/1280.js +0 -1
  258. package/.next/server/chunks/1454.js +0 -1
  259. package/.next/server/chunks/1554.js +0 -1
  260. package/.next/server/chunks/1607.js +0 -1
  261. package/.next/server/chunks/1780.js +0 -1
  262. package/.next/server/chunks/1917.js +0 -1
  263. package/.next/server/chunks/1972.js +0 -1
  264. package/.next/server/chunks/2230.js +0 -1
  265. package/.next/server/chunks/2249.js +0 -1
  266. package/.next/server/chunks/2430.js +0 -1
  267. package/.next/server/chunks/2445.js +0 -12
  268. package/.next/server/chunks/2570.js +0 -1
  269. package/.next/server/chunks/2792.js +0 -1
  270. package/.next/server/chunks/2903.js +0 -1
  271. package/.next/server/chunks/294.js +0 -1
  272. package/.next/server/chunks/2955.js +0 -1
  273. package/.next/server/chunks/3006.js +0 -1
  274. package/.next/server/chunks/3029.js +0 -1
  275. package/.next/server/chunks/3060.js +0 -1
  276. package/.next/server/chunks/3408.js +0 -1
  277. package/.next/server/chunks/3483.js +0 -1
  278. package/.next/server/chunks/3683.js +0 -1
  279. package/.next/server/chunks/3836.js +0 -1
  280. package/.next/server/chunks/3890.js +0 -494
  281. package/.next/server/chunks/3922.js +0 -1
  282. package/.next/server/chunks/3945.js +0 -1
  283. package/.next/server/chunks/3951.js +0 -7
  284. package/.next/server/chunks/416.js +0 -1
  285. package/.next/server/chunks/4194.js +0 -1
  286. package/.next/server/chunks/4365.js +0 -1
  287. package/.next/server/chunks/4451.js +0 -1
  288. package/.next/server/chunks/4803.js +0 -1
  289. package/.next/server/chunks/4913.js +0 -13
  290. package/.next/server/chunks/5402.js +0 -1
  291. package/.next/server/chunks/5723.js +0 -13
  292. package/.next/server/chunks/5796.js +0 -1
  293. package/.next/server/chunks/6393.js +0 -1
  294. package/.next/server/chunks/6457.js +0 -6
  295. package/.next/server/chunks/6698.js +0 -1
  296. package/.next/server/chunks/6804.js +0 -6
  297. package/.next/server/chunks/6886.js +0 -1
  298. package/.next/server/chunks/7098.js +0 -9
  299. package/.next/server/chunks/7169.js +0 -1
  300. package/.next/server/chunks/7228.js +0 -1
  301. package/.next/server/chunks/7275.js +0 -1
  302. package/.next/server/chunks/7371.js +0 -1
  303. package/.next/server/chunks/7692.js +0 -1
  304. package/.next/server/chunks/7799.js +0 -1
  305. package/.next/server/chunks/8068.js +0 -1
  306. package/.next/server/chunks/83.js +0 -1
  307. package/.next/server/chunks/831.js +0 -1
  308. package/.next/server/chunks/8563.js +0 -1
  309. package/.next/server/chunks/8569.js +0 -1
  310. package/.next/server/chunks/8687.js +0 -1
  311. package/.next/server/chunks/870.js +0 -1
  312. package/.next/server/chunks/8737.js +0 -1
  313. package/.next/server/chunks/8741.js +0 -1
  314. package/.next/server/chunks/9088.js +0 -1
  315. package/.next/server/chunks/9117.js +0 -1
  316. package/.next/server/chunks/9237.js +0 -1
  317. package/.next/server/chunks/948.js +0 -3
  318. package/.next/server/chunks/9563.js +0 -3
  319. package/.next/server/chunks/9570.js +0 -1
  320. package/.next/server/chunks/9740.js +0 -1
  321. package/.next/server/chunks/9853.js +0 -1
  322. package/.next/server/chunks/9984.js +0 -1
  323. package/.next/server/chunks/9985.js +0 -1
  324. package/.next/server/chunks/9990.js +0 -1
  325. package/.next/server/chunks/ButtonSignIn.js +0 -1
  326. package/.next/server/chunks/Dropdown.js +0 -1
  327. package/.next/server/chunks/DropdownButton.js +0 -1
  328. package/.next/server/chunks/DropdownItem.js +0 -1
  329. package/.next/server/chunks/DropdownMenu.js +0 -1
  330. package/.next/server/chunks/FilterSkeleton.js +0 -1
  331. package/.next/server/chunks/ScrollToTopButton.js +0 -1
  332. package/.next/server/chunks/UIBannerText.js +0 -1
  333. package/.next/server/chunks/UISKUMatrixSidebar.js +0 -1
  334. package/.next/server/chunks/font-manifest.json +0 -1
  335. package/.next/server/edge-instrumentation.js +0 -2
  336. package/.next/server/edge-instrumentation.js.map +0 -1
  337. package/.next/server/edge-runtime-webpack.js +0 -157
  338. package/.next/server/edge-runtime-webpack.js.map +0 -1
  339. package/.next/server/font-manifest.json +0 -1
  340. package/.next/server/functions-config-manifest.json +0 -1
  341. package/.next/server/instrumentation.js +0 -1
  342. package/.next/server/instrumentation.js.nft.json +0 -1
  343. package/.next/server/middleware-build-manifest.js +0 -1
  344. package/.next/server/middleware-manifest.json +0 -6
  345. package/.next/server/middleware-react-loadable-manifest.js +0 -1
  346. package/.next/server/next-font-manifest.js +0 -1
  347. package/.next/server/next-font-manifest.json +0 -1
  348. package/.next/server/pages/404.js +0 -1
  349. package/.next/server/pages/404.js.nft.json +0 -1
  350. package/.next/server/pages/500.js +0 -1
  351. package/.next/server/pages/500.js.nft.json +0 -1
  352. package/.next/server/pages/[...slug].js +0 -1
  353. package/.next/server/pages/[...slug].js.nft.json +0 -1
  354. package/.next/server/pages/[slug]/p.js +0 -1
  355. package/.next/server/pages/[slug]/p.js.nft.json +0 -1
  356. package/.next/server/pages/_app.js +0 -1
  357. package/.next/server/pages/_app.js.nft.json +0 -1
  358. package/.next/server/pages/_document.js +0 -1
  359. package/.next/server/pages/_document.js.nft.json +0 -1
  360. package/.next/server/pages/_error.js +0 -1
  361. package/.next/server/pages/_error.js.nft.json +0 -1
  362. package/.next/server/pages/api/fs/logout.js +0 -1
  363. package/.next/server/pages/api/fs/logout.js.nft.json +0 -1
  364. package/.next/server/pages/api/graphql.js +0 -3
  365. package/.next/server/pages/api/graphql.js.nft.json +0 -1
  366. package/.next/server/pages/api/health/live.js +0 -1
  367. package/.next/server/pages/api/health/live.js.nft.json +0 -1
  368. package/.next/server/pages/api/health/ready.js +0 -1
  369. package/.next/server/pages/api/health/ready.js.nft.json +0 -1
  370. package/.next/server/pages/api/preview.js +0 -1
  371. package/.next/server/pages/api/preview.js.nft.json +0 -1
  372. package/.next/server/pages/checkout.js +0 -1
  373. package/.next/server/pages/checkout.js.nft.json +0 -1
  374. package/.next/server/pages/en-US/404.html +0 -42
  375. package/.next/server/pages/en-US/404.json +0 -1
  376. package/.next/server/pages/en-US/500.html +0 -42
  377. package/.next/server/pages/en-US/500.json +0 -1
  378. package/.next/server/pages/en-US/checkout.html +0 -42
  379. package/.next/server/pages/en-US/checkout.json +0 -1
  380. package/.next/server/pages/en-US/login.html +0 -42
  381. package/.next/server/pages/en-US/login.json +0 -1
  382. package/.next/server/pages/en-US/s.html +0 -42
  383. package/.next/server/pages/en-US/s.json +0 -1
  384. package/.next/server/pages/en-US.html +0 -42
  385. package/.next/server/pages/en-US.json +0 -1
  386. package/.next/server/pages/index.js +0 -1
  387. package/.next/server/pages/index.js.nft.json +0 -1
  388. package/.next/server/pages/login.js +0 -1
  389. package/.next/server/pages/login.js.nft.json +0 -1
  390. package/.next/server/pages/pvt/account/403.js +0 -1
  391. package/.next/server/pages/pvt/account/403.js.nft.json +0 -1
  392. package/.next/server/pages/pvt/account/404.js +0 -1
  393. package/.next/server/pages/pvt/account/404.js.nft.json +0 -1
  394. package/.next/server/pages/pvt/account/[...unknown].js +0 -1
  395. package/.next/server/pages/pvt/account/[...unknown].js.nft.json +0 -1
  396. package/.next/server/pages/pvt/account/orders/[id].js +0 -1
  397. package/.next/server/pages/pvt/account/orders/[id].js.nft.json +0 -1
  398. package/.next/server/pages/pvt/account/orders.js +0 -1
  399. package/.next/server/pages/pvt/account/orders.js.nft.json +0 -1
  400. package/.next/server/pages/pvt/account/profile.js +0 -1
  401. package/.next/server/pages/pvt/account/profile.js.nft.json +0 -1
  402. package/.next/server/pages/pvt/account/security.js +0 -1
  403. package/.next/server/pages/pvt/account/security.js.nft.json +0 -1
  404. package/.next/server/pages/pvt/account/user-details.js +0 -1
  405. package/.next/server/pages/pvt/account/user-details.js.nft.json +0 -1
  406. package/.next/server/pages/pvt/account.js +0 -1
  407. package/.next/server/pages/pvt/account.js.nft.json +0 -1
  408. package/.next/server/pages/s.js +0 -1
  409. package/.next/server/pages/s.js.nft.json +0 -1
  410. package/.next/server/pages-manifest.json +0 -1
  411. package/.next/server/webpack-api-runtime.js +0 -1
  412. package/.next/server/webpack-runtime.js +0 -1
  413. package/.next/static/NAuY8lqaeBBZf9CMZuYI2/_buildManifest.js +0 -1
  414. package/.next/static/NAuY8lqaeBBZf9CMZuYI2/_ssgManifest.js +0 -1
  415. package/.next/static/chunks/227-f109b24190a008ab.js +0 -8
  416. package/.next/static/chunks/2284.185d834d9829b652.js +0 -1
  417. package/.next/static/chunks/2851.e68ed3c8d27a032a.js +0 -1
  418. package/.next/static/chunks/2927.5a79877943a6bf7c.js +0 -1
  419. package/.next/static/chunks/3155.7bc4c730a79d9ecb.js +0 -1
  420. package/.next/static/chunks/3166-0b30a3887c0c346d.js +0 -1
  421. package/.next/static/chunks/3399.017c5209b74b0d97.js +0 -1
  422. package/.next/static/chunks/3483.ef53d632a763da3f.js +0 -1
  423. package/.next/static/chunks/349.b3b38e1e9f719dda.js +0 -1
  424. package/.next/static/chunks/3802.5e8b0b689eacc0f8.js +0 -1
  425. package/.next/static/chunks/3836.620480018be48233.js +0 -1
  426. package/.next/static/chunks/4436.e7af66f0b654ee36.js +0 -1
  427. package/.next/static/chunks/4803.b1920b6e3a1a6304.js +0 -1
  428. package/.next/static/chunks/5796.4351370494d8b8b6.js +0 -1
  429. package/.next/static/chunks/6393.55f991b1a6bb4fe7.js +0 -1
  430. package/.next/static/chunks/6700.b23221a57514e737.js +0 -1
  431. package/.next/static/chunks/6789.960162355435a81d.js +0 -1
  432. package/.next/static/chunks/7191-befad64ba238a817.js +0 -1
  433. package/.next/static/chunks/7692.8d5bf4560341a2f6.js +0 -1
  434. package/.next/static/chunks/7861.7f9f1a124a43da30.js +0 -6
  435. package/.next/static/chunks/8068.43663fb64762f7b8.js +0 -1
  436. package/.next/static/chunks/83.e0c16f0299b364a5.js +0 -1
  437. package/.next/static/chunks/8325.dabe9aa22eaadeed.js +0 -1
  438. package/.next/static/chunks/8587.53c8ce185ed1a2cb.js +0 -1
  439. package/.next/static/chunks/9173-e89da04079c35360.js +0 -2
  440. package/.next/static/chunks/9237.7555603703f81bf7.js +0 -1
  441. package/.next/static/chunks/9298-1d1ed0a54133cb59.js +0 -28
  442. package/.next/static/chunks/9399.d116a7fd62024783.js +0 -1
  443. package/.next/static/chunks/941.3e2782ab9c490eb0.js +0 -1
  444. package/.next/static/chunks/9701.f9a0bfffba8807dc.js +0 -1
  445. package/.next/static/chunks/9909.787576b171184aa5.js +0 -1
  446. package/.next/static/chunks/9960.7ef77f8a8b046170.js +0 -1
  447. package/.next/static/chunks/9979.aedbc094bdc2c599.js +0 -1
  448. package/.next/static/chunks/BannerNewsletter.00328ad162109908.js +0 -1
  449. package/.next/static/chunks/BannerText.dbbec87cadb8a521.js +0 -1
  450. package/.next/static/chunks/ButtonSignIn.f6e210eaca873e48.js +0 -1
  451. package/.next/static/chunks/CartItem.b34e295377f6f94f.js +0 -1
  452. package/.next/static/chunks/CartSidebar.ac447d1ef6276da1.js +0 -1
  453. package/.next/static/chunks/Dropdown.38b48c749bad6b60.js +0 -1
  454. package/.next/static/chunks/DropdownButton.66fa6b25dddb3a07.js +0 -1
  455. package/.next/static/chunks/DropdownItem.38b8f5a07c7f422a.js +0 -1
  456. package/.next/static/chunks/DropdownMenu.48b11521a24c6efd.js +0 -1
  457. package/.next/static/chunks/EmptyCart.320e2f94a0d5e6b1.js +0 -1
  458. package/.next/static/chunks/FilterSkeleton.7ab99e28f92341c9.js +0 -1
  459. package/.next/static/chunks/Footer.166b02c2f13980c6.js +0 -1
  460. package/.next/static/chunks/Gift.c49ba26da2fbab5e.js +0 -1
  461. package/.next/static/chunks/Newsletter.fc406f6029057022.js +0 -1
  462. package/.next/static/chunks/OrderSummary.5957d69f990d9add.js +0 -1
  463. package/.next/static/chunks/PreviewTag.f4f0c8710a7bcad9.js +0 -1
  464. package/.next/static/chunks/ProductShelf.cc46f5cdeeaeaff6.js +0 -1
  465. package/.next/static/chunks/ProductTiles.9b804e51b0704d60.js +0 -1
  466. package/.next/static/chunks/RegionModal.319ad44250cb12d2.js +0 -1
  467. package/.next/static/chunks/RegionSlider.0e0e93369f4f9c92.js +0 -1
  468. package/.next/static/chunks/ScrollToTopButton.c15431f2e8bb93ef.js +0 -1
  469. package/.next/static/chunks/ShoppingAssistant.ba191eb4dbed67e5.js +0 -1
  470. package/.next/static/chunks/Toast.5f90f0436708be5e.js +0 -1
  471. package/.next/static/chunks/UIBannerText.7315b16af4457059.js +0 -1
  472. package/.next/static/chunks/UISKUMatrixSidebar.b4349b2682bbe183.js +0 -1
  473. package/.next/static/chunks/UIToast.19a8664c01a00d3a.js +0 -1
  474. package/.next/static/chunks/framework-d514426edf885c68.js +0 -33
  475. package/.next/static/chunks/main-ec03882c4375091d.js +0 -1
  476. package/.next/static/chunks/pages/404-e3dfbbac003b02a2.js +0 -1
  477. package/.next/static/chunks/pages/500-c7814e085081d7b8.js +0 -1
  478. package/.next/static/chunks/pages/[...slug]-dc8a395a43b081f1.js +0 -1
  479. package/.next/static/chunks/pages/[slug]/p-644f1132f5a0f736.js +0 -1
  480. package/.next/static/chunks/pages/_app-84aaff8a9d4de60e.js +0 -1
  481. package/.next/static/chunks/pages/_error-2b0148be56a716e9.js +0 -1
  482. package/.next/static/chunks/pages/checkout-2071467ad42dfb99.js +0 -1
  483. package/.next/static/chunks/pages/index-8774d5b4a8744eb2.js +0 -1
  484. package/.next/static/chunks/pages/login-e74747c9f9cb5b49.js +0 -1
  485. package/.next/static/chunks/pages/pvt/account/403-491e6b062487b30f.js +0 -1
  486. package/.next/static/chunks/pages/pvt/account/404-5ad472d9f2ee1980.js +0 -1
  487. package/.next/static/chunks/pages/pvt/account/[...unknown]-f80f645594d2740c.js +0 -1
  488. package/.next/static/chunks/pages/pvt/account/orders/[id]-64e42157c0974c48.js +0 -1
  489. package/.next/static/chunks/pages/pvt/account/orders-faab39f2aff05fae.js +0 -1
  490. package/.next/static/chunks/pages/pvt/account/profile-9672177ee2665bc0.js +0 -1
  491. package/.next/static/chunks/pages/pvt/account/security-03eb1ccab9a30563.js +0 -1
  492. package/.next/static/chunks/pages/pvt/account/user-details-7838e3f79781596c.js +0 -1
  493. package/.next/static/chunks/pages/pvt/account-65fefcc699344bdb.js +0 -1
  494. package/.next/static/chunks/pages/s-162ba789e6611175.js +0 -1
  495. package/.next/static/chunks/polyfills-c67a75d1b6f99dc8.js +0 -1
  496. package/.next/static/chunks/webpack-f621ff3e951d2982.js +0 -1
  497. package/.next/static/css/02259c549b2179f2.css +0 -1
  498. package/.next/static/css/02eaf202d3d11fd1.css +0 -1
  499. package/.next/static/css/033e241c58ba6fbb.css +0 -1
  500. package/.next/static/css/042d012bc1895b5c.css +0 -1
  501. package/.next/static/css/14176a4704ff97b2.css +0 -1
  502. package/.next/static/css/146a8678babc61bf.css +0 -1
  503. package/.next/static/css/16d65422bfa80f51.css +0 -1
  504. package/.next/static/css/1c4983f11b861ea0.css +0 -1
  505. package/.next/static/css/204754bbd8cc4bef.css +0 -1
  506. package/.next/static/css/24d91007fc96be10.css +0 -1
  507. package/.next/static/css/2980acad3f8e1028.css +0 -1
  508. package/.next/static/css/2c19433e38fd7533.css +0 -1
  509. package/.next/static/css/31380ebc6e671486.css +0 -1
  510. package/.next/static/css/42df884711219edb.css +0 -1
  511. package/.next/static/css/4f0597b0bf0ef2e1.css +0 -1
  512. package/.next/static/css/54cedf4b65e5863f.css +0 -1
  513. package/.next/static/css/6580147d7ab8fcca.css +0 -1
  514. package/.next/static/css/6819dddf2b1b5ea7.css +0 -1
  515. package/.next/static/css/7ef7762f412ed665.css +0 -1
  516. package/.next/static/css/82f3cd529b672812.css +0 -1
  517. package/.next/static/css/837662922091162f.css +0 -1
  518. package/.next/static/css/8e6ab59ace21e03b.css +0 -1
  519. package/.next/static/css/a852afa9be31e946.css +0 -1
  520. package/.next/static/css/b684b347c5cc6514.css +0 -1
  521. package/.next/static/css/bcdaef0a83277ef5.css +0 -1
  522. package/.next/static/css/c33615999008d3f9.css +0 -1
  523. package/.next/static/css/c34f6ea9953e2f63.css +0 -1
  524. package/.next/static/css/ea11d74a2848b093.css +0 -1
  525. package/.next/static/css/f16438bcf4508fb3.css +0 -1
  526. package/.next/static/css/f60366555f563deb.css +0 -1
  527. package/.next/trace +0 -143
  528. package/.turbo/turbo-build.log +0 -140
  529. package/jest.config.js +0 -17
  530. package/public/~partytown/debug/partytown-atomics.js +0 -556
  531. package/public/~partytown/debug/partytown-media.js +0 -374
  532. package/public/~partytown/debug/partytown-sandbox-sw.js +0 -543
  533. package/public/~partytown/debug/partytown-sw.js +0 -59
  534. package/public/~partytown/debug/partytown-ww-atomics.js +0 -1789
  535. package/public/~partytown/debug/partytown-ww-sw.js +0 -1781
  536. package/public/~partytown/debug/partytown.js +0 -72
  537. package/public/~partytown/partytown-atomics.js +0 -2
  538. package/public/~partytown/partytown-media.js +0 -2
  539. package/public/~partytown/partytown-sw.js +0 -2
  540. package/public/~partytown/partytown.js +0 -2
  541. package/src/middleware__DISABLED.ts +0 -65
  542. package/src/server/generator/generateGraphQLSchemaFile.ts +0 -3
  543. package/src/server/generator/schema.ts +0 -81
@@ -24,6 +24,7 @@ import { execute } from 'src/server'
24
24
  import { injectGlobalSections } from 'src/server/cms/global'
25
25
  import { getMyAccountRedirect } from 'src/utils/myAccountRedirect'
26
26
  import { extractStatusFromError } from 'src/utils/utilities'
27
+ import { withLocaleValidationSSR } from 'src/utils/localization/withLocaleValidation'
27
28
 
28
29
  const COMPONENTS: Record<string, ComponentType<any>> = {
29
30
  ...GLOBAL_COMPONENTS,
@@ -280,7 +281,7 @@ const query = gql(`
280
281
  }
281
282
  `)
282
283
 
283
- export const getServerSideProps: GetServerSideProps<
284
+ const getServerSidePropsBase: GetServerSideProps<
284
285
  OrderDetailsPageProps,
285
286
  Record<string, string>,
286
287
  Locator
@@ -299,15 +300,18 @@ export const getServerSideProps: GetServerSideProps<
299
300
  }
300
301
 
301
302
  const {
302
- previewData,
303
303
  params: { id },
304
304
  } = context
305
+ const contentContext = {
306
+ previewData: context.previewData,
307
+ locale: context.locale,
308
+ }
305
309
 
306
310
  const [
307
311
  globalSectionsPromise,
308
312
  globalSectionsHeaderPromise,
309
313
  globalSectionsFooterPromise,
310
- ] = getGlobalSectionsData(previewData)
314
+ ] = getGlobalSectionsData(contentContext)
311
315
 
312
316
  const [
313
317
  orderDetails,
@@ -366,3 +370,7 @@ export const getServerSideProps: GetServerSideProps<
366
370
  },
367
371
  }
368
372
  }
373
+
374
+ export const getServerSideProps = withLocaleValidationSSR(
375
+ getServerSidePropsBase
376
+ )
@@ -19,6 +19,7 @@ import { default as BeforeSection } from 'src/customizations/src/myAccount/exten
19
19
  import type { MyAccountProps } from 'src/experimental/myAccountServerSideProps'
20
20
  import { execute } from 'src/server'
21
21
  import { injectGlobalSections } from 'src/server/cms/global'
22
+ import { withLocaleValidationSSR } from 'src/utils/localization/withLocaleValidation'
22
23
  import { getMyAccountRedirect } from 'src/utils/myAccountRedirect'
23
24
  import { groupOrderStatusByLabel } from 'src/utils/userOrderStatus'
24
25
 
@@ -125,7 +126,7 @@ const query = gql(`
125
126
  }
126
127
  `)
127
128
 
128
- export const getServerSideProps: GetServerSideProps<
129
+ const getServerSidePropsBase: GetServerSideProps<
129
130
  MyAccountProps,
130
131
  Record<string, string>,
131
132
  Locator
@@ -135,7 +136,10 @@ export const getServerSideProps: GetServerSideProps<
135
136
  account: storeConfig.api.storeId,
136
137
  })
137
138
 
138
- const { previewData } = context
139
+ const contentContext = {
140
+ previewData: context.previewData,
141
+ locale: context.locale,
142
+ }
139
143
 
140
144
  const { isFaststoreMyAccountEnabled, redirect } = getMyAccountRedirect({
141
145
  query: context.query,
@@ -149,7 +153,7 @@ export const getServerSideProps: GetServerSideProps<
149
153
  globalSectionsPromise,
150
154
  globalSectionsHeaderPromise,
151
155
  globalSectionsFooterPromise,
152
- ] = getGlobalSectionsData(previewData)
156
+ ] = getGlobalSectionsData(contentContext)
153
157
 
154
158
  const page = Number(context.query.page as string | undefined) || 1
155
159
  const perPage = 25 // TODO: make this configurable
@@ -253,3 +257,7 @@ export const getServerSideProps: GetServerSideProps<
253
257
  },
254
258
  }
255
259
  }
260
+
261
+ export const getServerSideProps = withLocaleValidationSSR(
262
+ getServerSidePropsBase
263
+ )
@@ -21,6 +21,7 @@ import type { MyAccountProps } from 'src/experimental/myAccountServerSideProps'
21
21
  import { getIsRepresentative } from 'src/sdk/account/getIsRepresentative'
22
22
  import { injectGlobalSections } from 'src/server/cms/global'
23
23
  import { getMyAccountRedirect } from 'src/utils/myAccountRedirect'
24
+ import { withLocaleValidationSSR } from 'src/utils/localization/withLocaleValidation'
24
25
 
25
26
  import storeConfig from 'discovery.config'
26
27
  import PageProvider from 'src/sdk/overrides/PageProvider'
@@ -77,7 +78,7 @@ const query = gql(`
77
78
  }
78
79
  `)
79
80
 
80
- export const getServerSideProps: GetServerSideProps<
81
+ const getServerSidePropsBase: GetServerSideProps<
81
82
  MyAccountProps,
82
83
  Record<string, string>,
83
84
  Locator
@@ -94,12 +95,16 @@ export const getServerSideProps: GetServerSideProps<
94
95
  headers: context.req.headers as Record<string, string>,
95
96
  account: storeConfig.api.storeId,
96
97
  })
98
+ const contentContext = {
99
+ previewData: context.previewData,
100
+ locale: context.locale,
101
+ }
97
102
 
98
103
  const [
99
104
  globalSectionsPromise,
100
105
  globalSectionsHeaderPromise,
101
106
  globalSectionsFooterPromise,
102
- ] = getGlobalSectionsData(context.previewData)
107
+ ] = getGlobalSectionsData(contentContext)
103
108
 
104
109
  const [profile, globalSections, globalSectionsHeader, globalSectionsFooter] =
105
110
  await Promise.all([
@@ -150,3 +155,7 @@ export const getServerSideProps: GetServerSideProps<
150
155
  },
151
156
  }
152
157
  }
158
+
159
+ export const getServerSideProps = withLocaleValidationSSR(
160
+ getServerSidePropsBase
161
+ )
@@ -22,6 +22,7 @@ import { getIsRepresentative } from 'src/sdk/account/getIsRepresentative'
22
22
  import { execute } from 'src/server'
23
23
  import { injectGlobalSections } from 'src/server/cms/global'
24
24
  import { getMyAccountRedirect } from 'src/utils/myAccountRedirect'
25
+ import { withLocaleValidationSSR } from 'src/utils/localization/withLocaleValidation'
25
26
 
26
27
  import PageProvider from 'src/sdk/overrides/PageProvider'
27
28
 
@@ -77,7 +78,7 @@ const query = gql(`
77
78
  }
78
79
  `)
79
80
 
80
- export const getServerSideProps: GetServerSideProps<
81
+ const getServerSidePropsBase: GetServerSideProps<
81
82
  MyAccountProps,
82
83
  Record<string, string>,
83
84
  Locator
@@ -94,12 +95,16 @@ export const getServerSideProps: GetServerSideProps<
94
95
  if (!isFaststoreMyAccountEnabled) {
95
96
  return { redirect }
96
97
  }
98
+ const contentContext = {
99
+ previewData: context.previewData,
100
+ locale: context.locale,
101
+ }
97
102
 
98
103
  const [
99
104
  globalSectionsPromise,
100
105
  globalSectionsHeaderPromise,
101
106
  globalSectionsFooterPromise,
102
- ] = getGlobalSectionsData(context.previewData)
107
+ ] = getGlobalSectionsData(contentContext)
103
108
 
104
109
  const [security, globalSections, globalSectionsHeader, globalSectionsFooter] =
105
110
  await Promise.all([
@@ -149,3 +154,7 @@ export const getServerSideProps: GetServerSideProps<
149
154
  },
150
155
  }
151
156
  }
157
+
158
+ export const getServerSideProps = withLocaleValidationSSR(
159
+ getServerSidePropsBase
160
+ )
@@ -25,6 +25,7 @@ import PageProvider from 'src/sdk/overrides/PageProvider'
25
25
  import { execute } from 'src/server'
26
26
  import { injectGlobalSections } from 'src/server/cms/global'
27
27
  import { getMyAccountRedirect } from 'src/utils/myAccountRedirect'
28
+ import { withLocaleValidationSSR } from 'src/utils/localization/withLocaleValidation'
28
29
 
29
30
  /* A list of components that can be used in the CMS. */
30
31
  const COMPONENTS: Record<string, ComponentType<any>> = {
@@ -82,7 +83,7 @@ const query = gql(`
82
83
  }
83
84
  `)
84
85
 
85
- export const getServerSideProps: GetServerSideProps<
86
+ const getServerSidePropsBase: GetServerSideProps<
86
87
  MyAccountProps,
87
88
  Record<string, string>,
88
89
  Locator
@@ -99,12 +100,16 @@ export const getServerSideProps: GetServerSideProps<
99
100
  if (!isFaststoreMyAccountEnabled) {
100
101
  return { redirect }
101
102
  }
103
+ const contentContext = {
104
+ previewData: context.previewData,
105
+ locale: context.locale,
106
+ }
102
107
 
103
108
  const [
104
109
  globalSectionsPromise,
105
110
  globalSectionsHeaderPromise,
106
111
  globalSectionsFooterPromise,
107
- ] = getGlobalSectionsData(context.previewData)
112
+ ] = getGlobalSectionsData(contentContext)
108
113
 
109
114
  const [
110
115
  userDetails,
@@ -172,3 +177,7 @@ export const getServerSideProps: GetServerSideProps<
172
177
  },
173
178
  }
174
179
  }
180
+
181
+ export const getServerSideProps = withLocaleValidationSSR(
182
+ getServerSidePropsBase
183
+ )
package/src/pages/s.tsx CHANGED
@@ -1,8 +1,9 @@
1
1
  import { NextSeo } from 'next-seo'
2
2
  import { useRouter } from 'next/router'
3
- import { useMemo } from 'react'
3
+ import { useEffect, useMemo, useState } from 'react'
4
4
 
5
5
  import type { SearchState } from '@faststore/sdk'
6
+ import type { SearchSettings } from 'src/server/cms'
6
7
  import {
7
8
  formatSearchState,
8
9
  parseSearchState,
@@ -20,6 +21,7 @@ import {
20
21
  getStaticProps,
21
22
  type SearchPageProps,
22
23
  } from 'src/experimental/searchServerSideFunctions'
24
+ import { getStoreURL } from 'src/sdk/localization/useLocalizationConfig'
23
25
 
24
26
  export interface SearchPageContextType {
25
27
  title: string
@@ -49,13 +51,20 @@ const useSearchParams = ({
49
51
 
50
52
  type StoreConfig = typeof storeConfig
51
53
 
52
- function generateSEOData(storeConfig: StoreConfig, searchTerm?: string) {
54
+ function generateSEOData(
55
+ storeConfig: StoreConfig,
56
+ searchTerm?: string,
57
+ pageSeoSettings?: SearchSettings['settings']['seo']
58
+ ) {
53
59
  const { search: searchSeo, ...seo } = storeConfig.seo
54
60
 
55
61
  const isSSREnabled = storeConfig.experimental.enableSearchSSR
56
62
 
57
63
  const title = searchTerm ?? seo.title ?? 'Search Results'
58
- const titleTemplate = searchSeo?.titleTemplate ?? seo.titleTemplate
64
+ const titleTemplate =
65
+ pageSeoSettings?.titleTemplate ??
66
+ searchSeo?.titleTemplate ??
67
+ seo.titleTemplate
59
68
  const description = searchSeo?.descriptionTemplate
60
69
  ? searchSeo.descriptionTemplate
61
70
  .replace(/%s/g, () => searchTerm ?? '')
@@ -79,7 +88,7 @@ function generateSEOData(storeConfig: StoreConfig, searchTerm?: string) {
79
88
  }
80
89
 
81
90
  const canonical = searchTerm
82
- ? `${storeConfig.storeUrl}/s?q=${searchTerm.replaceAll(' ', '+')}`
91
+ ? `${getStoreURL()}/s?q=${searchTerm.replaceAll(' ', '+')}`
83
92
  : undefined
84
93
 
85
94
  return {
@@ -116,9 +125,20 @@ function Page({
116
125
  return null
117
126
  }
118
127
 
128
+ const [effectiveSearchTerm, setEffectiveSearchTerm] = useState<
129
+ string | undefined
130
+ >(() => searchTerm ?? undefined)
131
+
132
+ useEffect(() => {
133
+ if (!searchTerm && searchParams.term) {
134
+ setEffectiveSearchTerm(searchParams.term)
135
+ }
136
+ }, [searchParams.term, searchTerm])
137
+
119
138
  const { noindex, nofollow, ...seoData } = generateSEOData(
120
139
  storeConfig,
121
- searchTerm ?? searchParams.term ?? undefined
140
+ effectiveSearchTerm,
141
+ settings?.seo
122
142
  )
123
143
 
124
144
  return (
@@ -149,7 +169,7 @@ function Page({
149
169
  searchContentType={searchContentType}
150
170
  serverData={{
151
171
  title: seoData.title,
152
- searchTerm: searchTerm ?? searchParams.term ?? undefined,
172
+ searchTerm: effectiveSearchTerm,
153
173
  }}
154
174
  globalSections={globalSections}
155
175
  globalSettings={globalSettings}
package/src/proxy.ts ADDED
@@ -0,0 +1,154 @@
1
+ import storeConfig from 'discovery.config'
2
+ import { NextResponse, type NextRequest } from 'next/server'
3
+ import { getRequestHostname } from 'src/utils/getRequestHostname'
4
+ import {
5
+ getCustomPathsFromBindings,
6
+ getSubdomainBindings,
7
+ isValidLocale,
8
+ } from 'src/utils/localization/bindingPaths'
9
+
10
+ type RewriteRule = {
11
+ regex: RegExp
12
+ locale: string
13
+ hostname?: string
14
+ }
15
+
16
+ function generateRewriteRules(): RewriteRule[] {
17
+ if (!storeConfig.localization?.enabled) {
18
+ return []
19
+ }
20
+
21
+ const customPaths = getCustomPathsFromBindings()
22
+
23
+ const rules: RewriteRule[] = customPaths.map((customPath) => {
24
+ const escapedPath = customPath.path.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
25
+ const regex = new RegExp(`^${escapedPath}(?:\\/(.*))?$`, 'i')
26
+ return {
27
+ regex,
28
+ locale: customPath.locale,
29
+ hostname: customPath.hostname,
30
+ }
31
+ })
32
+
33
+ return rules.sort((a, b) => {
34
+ const aLength = a.regex.source.length
35
+ const bLength = b.regex.source.length
36
+ return bLength - aLength
37
+ })
38
+ }
39
+
40
+ const DATA_ROUTE_RE = /^\/_next\/data\/[^/]+\/([^/]+)\/(.+)$/
41
+
42
+ const rewriteRules = generateRewriteRules()
43
+ const subdomainBindings = getSubdomainBindings()
44
+ const shouldValidateHostname = process.env.NODE_ENV === 'production'
45
+ const validLocales = new Set(
46
+ Object.keys(storeConfig.localization?.locales || {})
47
+ )
48
+
49
+ /**
50
+ * Rewrites the request to the subdomain locale.
51
+ * Without this, getStaticProps receives the wrong locale on subdomain domains
52
+ * because Next.js domain routing doesn't set the locale for server-side rendering.
53
+ *
54
+ * @param request - The request to rewrite.
55
+ * @param locale - The locale to rewrite to.
56
+ * @returns The rewritten response or null if the request is not a subdomain request.
57
+ */
58
+ function rewriteSubdomainRequest(
59
+ request: NextRequest,
60
+ locale: string
61
+ ): NextResponse | null {
62
+ const { pathname, search } = request.nextUrl
63
+
64
+ const dataMatch = pathname.match(DATA_ROUTE_RE)
65
+
66
+ if (dataMatch) {
67
+ const [, currentLocale] = dataMatch
68
+
69
+ if (currentLocale !== locale && validLocales.has(currentLocale)) {
70
+ const url = request.nextUrl.clone()
71
+ url.pathname = pathname.replace(`/${currentLocale}/`, `/${locale}/`)
72
+ url.search = search
73
+
74
+ return NextResponse.rewrite(url)
75
+ }
76
+
77
+ return null
78
+ }
79
+
80
+ const firstSegment = pathname.split('/')[1] ?? ''
81
+
82
+ if (!validLocales.has(firstSegment)) {
83
+ const rest = pathname.replace(/^\/+/, '')
84
+ const normalizedPath = rest ? `/${locale}/${rest}` : `/${locale}`
85
+
86
+ const url = request.nextUrl.clone()
87
+ url.pathname = normalizedPath
88
+ url.search = search
89
+
90
+ return NextResponse.rewrite(url)
91
+ }
92
+
93
+ return null
94
+ }
95
+
96
+ export function proxy(request: NextRequest) {
97
+ if (!storeConfig.localization?.enabled) {
98
+ return NextResponse.next()
99
+ }
100
+
101
+ const { pathname, search } = request.nextUrl
102
+
103
+ // Read the hostname from the Host header rather than request.nextUrl.hostname.
104
+ // When the Next.js standalone server is started with a `hostname` (which the
105
+ // generated server.js always does, defaulting to "0.0.0.0" via the HOSTNAME
106
+ // env var), Next.js builds the internal request URL using that bind address
107
+ // instead of the client-facing host, see attachRequestMeta in
108
+ // next/dist/server/next-server.js. As a result, request.nextUrl.hostname
109
+ // returns the bind address (e.g. "0.0.0.0"), which never matches the
110
+ // hostname extracted from a binding URL (e.g. "brandless.fast.store").
111
+ const hostname = getRequestHostname(request.headers.get('host'))
112
+
113
+ const subdomainMatch = subdomainBindings.find((b) => b.hostname === hostname)
114
+
115
+ if (subdomainMatch && isValidLocale(subdomainMatch.locale)) {
116
+ const result = rewriteSubdomainRequest(request, subdomainMatch.locale)
117
+
118
+ if (result) {
119
+ return result
120
+ }
121
+ }
122
+
123
+ for (const rule of rewriteRules) {
124
+ if (shouldValidateHostname && rule.hostname && rule.hostname !== hostname) {
125
+ continue
126
+ }
127
+
128
+ const match = pathname.match(rule.regex)
129
+ if (!match) continue
130
+
131
+ if (!isValidLocale(rule.locale)) {
132
+ console.warn(`Locale ${rule.locale} not found in configuration`)
133
+ continue
134
+ }
135
+
136
+ const rest = match[1]?.replace(/^\/+/, '') ?? ''
137
+ const normalizedPath = rest ? `/${rule.locale}/${rest}` : `/${rule.locale}`
138
+
139
+ const url = request.nextUrl.clone()
140
+ url.pathname = normalizedPath
141
+ url.search = search
142
+
143
+ return NextResponse.rewrite(url)
144
+ }
145
+
146
+ return NextResponse.next()
147
+ }
148
+
149
+ export const config = {
150
+ matcher: [
151
+ '/((?!api|_next/static|_next/image|favicon.ico|.*\\.[^/]+$).*)',
152
+ '/_next/data/:path*',
153
+ ],
154
+ }
@@ -1,9 +1,7 @@
1
- import discoveryConfig from 'discovery.config'
2
1
  import fetch from 'isomorphic-unfetch'
2
+ import { getStoreURL } from 'src/sdk/localization/useLocalizationConfig'
3
3
  import { sanitizeHost } from 'src/utils/utilities'
4
4
 
5
- const REFRESH_TOKEN_URL = `${discoveryConfig.storeUrl}/api/vtexid/refreshtoken/webstore`
6
-
7
5
  export interface RefreshTokenResponse {
8
6
  status?: string
9
7
  refreshAfter?: string
@@ -30,9 +28,11 @@ async function fetchWithRetry(
30
28
  export const refreshTokenRequest = async (): Promise<
31
29
  RefreshTokenResponse | undefined
32
30
  > => {
31
+ const storeOriginURL = new URL(getStoreURL()).origin
32
+ const REFRESH_TOKEN_URL = `${storeOriginURL}/api/vtexid/refreshtoken/webstore`
33
33
  const headers: HeadersInit = {
34
34
  'content-type': 'application/json',
35
- Host: `${sanitizeHost(discoveryConfig.storeUrl)}`,
35
+ Host: `${sanitizeHost(storeOriginURL)}`,
36
36
  }
37
37
 
38
38
  return await fetchWithRetry(REFRESH_TOKEN_URL, {
@@ -8,10 +8,13 @@ import type {
8
8
  CartItemFragment,
9
9
  IStoreCart,
10
10
  } from '@generated/graphql'
11
+ import ReorderError from '../error/ReorderError/ReorderError'
11
12
  import { request } from '../graphql/request'
12
13
  import { sessionStore } from '../session'
14
+ import { useLink } from '../ui/useLink'
15
+
16
+ import storeConfig from '../../../discovery.config'
13
17
  import { redirectToCheckout } from '../cart/redirectToCheckout'
14
- import ReorderError from '../error/ReorderError/ReorderError'
15
18
 
16
19
  type Order = ServerOrderDetailsQueryQuery['userOrder']
17
20
  type AdditionalProperties =
@@ -33,6 +36,9 @@ const getItemId = (item: CartItemFragment) => {
33
36
  export const useReorder = () => {
34
37
  const [loading, setLoading] = useState(false)
35
38
  const [error, setError] = useState<Error | null>(null)
39
+ const { resolveLink } = useLink()
40
+ const resolvedCheckoutUrl =
41
+ resolveLink(storeConfig.checkoutUrl) ?? storeConfig.checkoutUrl
36
42
 
37
43
  const reorder = async (order: Order | null | undefined) => {
38
44
  if (!order) {
@@ -131,7 +137,7 @@ export const useReorder = () => {
131
137
 
132
138
  cartStore.set(updatedCart)
133
139
 
134
- redirectToCheckout(validated.order.orderNumber)
140
+ redirectToCheckout(validated.order.orderNumber, resolvedCheckoutUrl)
135
141
  } catch (err) {
136
142
  setError(err instanceof Error ? err : new ReorderError('Unknown error'))
137
143
  console.error('Error reordering:', err)
@@ -8,6 +8,7 @@ import { LOG_LABEL_STYLE } from 'src/constants'
8
8
  import { getBaseDomain } from 'src/utils/getBaseDomain'
9
9
  import { getCookie } from 'src/utils/getCookie'
10
10
  import config from '../../../../../discovery.config'
11
+ import { getStoreURL } from 'src/sdk/localization/useLocalizationConfig'
11
12
 
12
13
  const THIRTY_MINUTES_S = 30 * 60
13
14
  const ONE_YEAR_S = 365 * 24 * 3600
@@ -25,8 +26,8 @@ const createOrRefreshCookie = (key: string, expiresSecond: number) => {
25
26
  process.env.NODE_ENV === 'development'
26
27
  ? '.localhost'
27
28
  : config.secureSubdomain
28
- ? getBaseDomain([config.storeUrl, config.secureSubdomain])
29
- : `.${new URL(config.storeUrl).hostname}`
29
+ ? getBaseDomain([getStoreURL(), config.secureSubdomain])
30
+ : `.${new URL(getStoreURL()).hostname}`
30
31
 
31
32
  return () => {
32
33
  let currentValue = getCookie(key)
@@ -1,15 +1,21 @@
1
1
  import storeConfig from '../../../discovery.config'
2
2
 
3
- export const redirectToCheckout = (orderFormId?: string) => {
3
+ /**
4
+ * Redirects to checkout. Use `resolvedCheckoutUrl` (e.g. from useLink().resolveLink)
5
+ * when i18n is enabled so the URL has the correct locale/custom path.
6
+ */
7
+ export const redirectToCheckout = (
8
+ orderFormId?: string,
9
+ resolvedCheckoutUrl?: string
10
+ ) => {
11
+ const baseUrl = resolvedCheckoutUrl ?? storeConfig.checkoutUrl
4
12
  const isDevEnv =
5
13
  window.location.host.includes('.vtex.app') ||
6
14
  window.location.host.includes('localhost')
15
+ const href =
16
+ isDevEnv && orderFormId
17
+ ? `${baseUrl}${baseUrl.includes('?') ? '&' : '?'}orderFormId=${orderFormId}`
18
+ : baseUrl
7
19
 
8
- if (!isDevEnv) {
9
- window.location.href = `${storeConfig.checkoutUrl}`
10
- } else if (orderFormId) {
11
- window.location.href = `${storeConfig.checkoutUrl}?orderFormId=${orderFormId}`
12
- } else {
13
- window.location.href = `${storeConfig.checkoutUrl}`
14
- }
20
+ window.location.href = href
15
21
  }
@@ -1,14 +1,20 @@
1
+ import { useLink } from 'src/sdk/ui/useLink'
2
+
3
+ import storeConfig from '../../../discovery.config'
1
4
  import { useCart } from './index'
2
5
  import { redirectToCheckout } from './redirectToCheckout'
3
6
 
4
7
  export const useCheckoutButton = () => {
5
8
  const { isValidating, id } = useCart()
9
+ const { resolveLink } = useLink()
10
+ const resolvedCheckoutUrl =
11
+ resolveLink(storeConfig.checkoutUrl) ?? storeConfig.checkoutUrl
6
12
 
7
13
  const onClick = (e: React.MouseEvent<HTMLButtonElement>) => {
8
14
  e.preventDefault()
9
15
 
10
16
  if (!isValidating) {
11
- redirectToCheckout(id)
17
+ redirectToCheckout(id, resolvedCheckoutUrl)
12
18
  }
13
19
  }
14
20
 
@@ -221,7 +221,7 @@ export function useDeliveryPromise({
221
221
  values: [
222
222
  {
223
223
  value: 'true',
224
- label: deliveryPromiseSettings?.inStock?.label ?? 'In-stock only',
224
+ label: deliveryPromiseSettings?.inStock?.label ?? '',
225
225
  selected: selectedFacets.some(
226
226
  ({ key, value }) => key === IN_STOCK_FACET_KEY && value === 'true'
227
227
  ),
@@ -236,9 +236,7 @@ export function useDeliveryPromise({
236
236
  () => [
237
237
  {
238
238
  value: ALL_DELIVERY_METHODS_FACET_VALUE,
239
- label:
240
- deliveryPromiseSettings?.deliveryMethods?.allDeliveryMethods ??
241
- 'All delivery methods',
239
+ label: deliveryPromiseSettings?.deliveryMethods?.allDeliveryMethods,
242
240
  selected:
243
241
  !selectedFacets.some(({ key }) => key === SHIPPING_FACET_KEY) ||
244
242
  selectedFacets?.some(
@@ -250,9 +248,7 @@ export function useDeliveryPromise({
250
248
  },
251
249
  {
252
250
  value: ALL_DELIVERY_OPTIONS_FACET_VALUE,
253
- label:
254
- deliveryPromiseSettings?.deliveryOptions?.allDeliveryOptions ??
255
- 'All delivery options',
251
+ label: deliveryPromiseSettings?.deliveryOptions?.allDeliveryOptions,
256
252
  selected:
257
253
  !selectedFacets.some(
258
254
  ({ key }) => key === DELIVERY_OPTIONS_FACET_KEY
@@ -468,12 +464,10 @@ export function useDeliveryPromise({
468
464
  )
469
465
 
470
466
  const labelsMap = {
471
- [SHIPPING_FACET_KEY]:
472
- deliveryPromiseSettings?.deliveryMethods?.title ?? 'Delivery',
467
+ [SHIPPING_FACET_KEY]: deliveryPromiseSettings?.deliveryMethods?.title,
473
468
  [DELIVERY_OPTIONS_FACET_KEY]:
474
- deliveryPromiseSettings?.deliveryOptions?.title ?? 'Delivery Option',
475
- [IN_STOCK_FACET_KEY]:
476
- deliveryPromiseSettings?.inStock?.title ?? 'Availability',
469
+ deliveryPromiseSettings?.deliveryOptions?.title,
470
+ [IN_STOCK_FACET_KEY]: deliveryPromiseSettings?.inStock?.title,
477
471
  }
478
472
 
479
473
  function getBadgeLabel(value: DeliveryType, isAvailable: boolean) {
@@ -483,19 +477,17 @@ export function useDeliveryPromise({
483
477
  > = {
484
478
  delivery: {
485
479
  available:
486
- deliveryPromiseSettings?.deliveryPromiseBadges?.delivery ??
487
- 'Available for shipping',
480
+ deliveryPromiseSettings?.deliveryPromiseBadges?.delivery ?? '',
488
481
  unavailable:
489
482
  deliveryPromiseSettings?.deliveryPromiseBadges?.deliveryUnavailable ??
490
- 'Unavailable for shipping',
483
+ '',
491
484
  },
492
485
  'pickup-in-point': {
493
486
  available:
494
- deliveryPromiseSettings?.deliveryPromiseBadges?.pickupInPoint ??
495
- 'Available for pickup',
487
+ deliveryPromiseSettings?.deliveryPromiseBadges?.pickupInPoint ?? '',
496
488
  unavailable:
497
489
  deliveryPromiseSettings?.deliveryPromiseBadges
498
- ?.pickupInPointUnavailable ?? 'Unavailable for pickup',
490
+ ?.pickupInPointUnavailable ?? '',
499
491
  },
500
492
  }
501
493