@jetshop/core 5.13.12-0 → 5.14.0

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 (559) hide show
  1. package/ChannelHandler/CategoryPathnameRedirectQuery.gql +9 -9
  2. package/ChannelHandler/ChannelHandler.d.ts +52 -50
  3. package/ChannelHandler/ChannelHandler.js +114 -108
  4. package/ChannelHandler/ChannelHandler.js.map +1 -1
  5. package/ChannelHandler/PagePathnameRedirectQuery.gql +9 -9
  6. package/ChannelHandler/PreserveRedirectRouteQuery.gql +19 -19
  7. package/ChannelHandler/ProductPathnameRedirectQuery.gql +9 -9
  8. package/ChannelHandler/StartPagePathnameRedirectQuery.gql +9 -9
  9. package/ChannelHandler/channelUtils.d.ts +72 -68
  10. package/ChannelHandler/channelUtils.js +311 -266
  11. package/ChannelHandler/channelUtils.js.map +1 -1
  12. package/ChannelHandler/redirectUtils.d.ts +4 -4
  13. package/ChannelHandler/redirectUtils.js +49 -49
  14. package/ChannelHandler/redirectUtils.test.js +524 -538
  15. package/ChannelHandler/redirectUtilsGroupedChannels.test.js +784 -0
  16. package/analytics/Analytics.d.ts +18 -18
  17. package/analytics/Analytics.js +56 -56
  18. package/analytics/AnalyticsProvider.d.ts +42 -42
  19. package/analytics/AnalyticsProvider.js +177 -177
  20. package/analytics/AnalyticsProvider.js.map +1 -1
  21. package/analytics/deprecatedTracking.d.ts +17 -17
  22. package/analytics/deprecatedTracking.js +32 -32
  23. package/analytics/integrations/ga4.d.ts +23 -23
  24. package/analytics/integrations/ga4.js +144 -145
  25. package/analytics/integrations/ga4.js.map +1 -1
  26. package/analytics/integrations/gtag/gtag.d.ts +8 -8
  27. package/analytics/integrations/gtag/gtag.js +180 -180
  28. package/analytics/integrations/gtag/index.d.ts +1 -1
  29. package/analytics/integrations/gtag/index.js +1 -1
  30. package/analytics/integrations/gtm/index.d.ts +12 -12
  31. package/analytics/integrations/gtm/index.js +200 -200
  32. package/analytics/integrations/gtm/referrerModifier.d.ts +1 -1
  33. package/analytics/integrations/gtm/referrerModifier.js +61 -61
  34. package/analytics/integrations/releware/index.d.ts +3 -3
  35. package/analytics/integrations/releware/index.js +38 -38
  36. package/analytics/integrations/unslugify.d.ts +1 -1
  37. package/analytics/integrations/unslugify.js +15 -17
  38. package/analytics/integrations/unslugify.js.map +1 -1
  39. package/analytics/trackerRegistry.d.ts +101 -101
  40. package/analytics/trackerRegistry.js +219 -219
  41. package/analytics/trackerRegistry.test.js +160 -160
  42. package/analytics/tracking.d.ts +14 -14
  43. package/analytics/tracking.js +71 -71
  44. package/analytics/utils/breadcrumbsWithoutProduct.d.ts +1 -1
  45. package/analytics/utils/breadcrumbsWithoutProduct.js +8 -8
  46. package/analytics/utils/script.d.ts +8 -8
  47. package/analytics/utils/script.js +39 -39
  48. package/analytics/webVitals.d.ts +5 -5
  49. package/analytics/webVitals.js +38 -38
  50. package/boot/AuthHandler.d.ts +14 -14
  51. package/boot/AuthHandler.js +38 -38
  52. package/boot/ChannelsQuery.gql +7 -7
  53. package/boot/PreviewHandler.d.ts +7 -7
  54. package/boot/PreviewHandler.js +13 -13
  55. package/boot/SharedTree.d.ts +25 -25
  56. package/boot/SharedTree.js +28 -28
  57. package/boot/addMissingConfig.d.ts +5 -5
  58. package/boot/addMissingConfig.js +33 -33
  59. package/boot/apollo.d.ts +21 -21
  60. package/boot/apollo.js +197 -197
  61. package/boot/client/entrypoint.d.ts +1 -1
  62. package/boot/client/entrypoint.js +4 -4
  63. package/boot/client/index.d.ts +1 -1
  64. package/boot/client/index.js +1 -1
  65. package/boot/client/startClient.d.ts +4 -4
  66. package/boot/client/startClient.js +142 -142
  67. package/boot/client-schema.gql +59 -59
  68. package/boot/server/IntervalQuery.d.ts +32 -32
  69. package/boot/server/IntervalQuery.js +94 -94
  70. package/boot/server/IntervalQuery.test.js +280 -280
  71. package/boot/server/PersistedApolloClient.d.ts +20 -20
  72. package/boot/server/PersistedApolloClient.js +39 -39
  73. package/boot/server/PersistedApolloClient.test.js +233 -233
  74. package/boot/server/asyncErrorHandler.d.ts +3 -3
  75. package/boot/server/asyncErrorHandler.js +4 -4
  76. package/boot/server/breakpointMiddleware.d.ts +3 -3
  77. package/boot/server/breakpointMiddleware.js +9 -9
  78. package/boot/server/createApolloServer.d.ts +28 -28
  79. package/boot/server/createApolloServer.js +143 -143
  80. package/boot/server/createApolloServer.test.js +114 -114
  81. package/boot/server/createDevServer.d.ts +14 -14
  82. package/boot/server/createDevServer.js +29 -29
  83. package/boot/server/createRenderer.d.ts +28 -28
  84. package/boot/server/createRenderer.js +235 -235
  85. package/boot/server/createServer.d.ts +14 -14
  86. package/boot/server/createServer.js +41 -41
  87. package/boot/server/entrypoint.d.ts +1 -1
  88. package/boot/server/entrypoint.js +35 -35
  89. package/boot/server/getPrefetchFiles.d.ts +10 -10
  90. package/boot/server/getPrefetchFiles.js +19 -19
  91. package/boot/server/getPreloadAssets.d.ts +10 -10
  92. package/boot/server/getPreloadAssets.js +17 -17
  93. package/boot/server/getPreloadAssets.test.js +133 -133
  94. package/boot/server/index.d.ts +9 -9
  95. package/boot/server/index.js +122 -122
  96. package/boot/server/listen.d.ts +13 -13
  97. package/boot/server/listen.js +16 -16
  98. package/boot/server/overwriteServerIntl.js +1 -1
  99. package/boot/server/persistedQueries/PersistedClient.d.ts +22 -22
  100. package/boot/server/persistedQueries/PersistedClient.js +57 -57
  101. package/boot/server/persistedQueries/__tests__/getPersistedQueriesForRequest.test.js +201 -201
  102. package/boot/server/persistedQueries/__tests__/mockQuery.gql +6 -6
  103. package/boot/server/persistedQueries/getPersistedQueriesForRequest.d.ts +3 -3
  104. package/boot/server/persistedQueries/getPersistedQueriesForRequest.js +26 -26
  105. package/boot/server/saleSource.test.js +39 -39
  106. package/boot/server/salesSource.d.ts +8 -8
  107. package/boot/server/salesSource.js +15 -15
  108. package/boot/utils/__tests__/uid.js +47 -47
  109. package/boot/utils/createIntOptions.d.ts +6 -6
  110. package/boot/utils/createIntOptions.js +18 -18
  111. package/boot/utils/queryLoggingMiddleware.d.ts +2 -2
  112. package/boot/utils/queryLoggingMiddleware.js +14 -14
  113. package/boot/utils/uid.d.ts +3 -3
  114. package/boot/utils/uid.js +19 -19
  115. package/cart/AddToCartFormik.d.ts +42 -42
  116. package/cart/AddToCartFormik.js +76 -76
  117. package/cart/useAddToCart.d.ts +88 -88
  118. package/cart/useAddToCart.js +117 -117
  119. package/ci/.gitlab-ci.yml +3 -3
  120. package/components/Auth/CustomerUpdateForm.d.ts +32 -32
  121. package/components/Auth/CustomerUpdateForm.js +121 -121
  122. package/components/Auth/ForgotPasswordProvider.d.ts +71 -71
  123. package/components/Auth/ForgotPasswordProvider.js +56 -56
  124. package/components/Auth/ResetPasswordProvider.d.ts +88 -88
  125. package/components/Auth/ResetPasswordProvider.js +77 -77
  126. package/components/Auth/SSN.d.ts +12 -12
  127. package/components/Auth/SSN.js +34 -34
  128. package/components/Auth/SSNLookupContainer.d.ts +15 -15
  129. package/components/Auth/SSNLookupContainer.js +19 -19
  130. package/components/Auth/SignupFormContainer.d.ts +19 -19
  131. package/components/Auth/SignupFormContainer.js +81 -81
  132. package/components/Auth/UpdatePasswordForm.d.ts +44 -44
  133. package/components/Auth/UpdatePasswordForm.js +97 -97
  134. package/components/Auth/formFieldsFromSettings.d.ts +65 -65
  135. package/components/Auth/formFieldsFromSettings.js +76 -76
  136. package/components/Auth/formFieldsFromSettings.js.map +1 -1
  137. package/components/Auth/formatSignupInput.d.ts +8 -8
  138. package/components/Auth/formatSignupInput.js +42 -42
  139. package/components/Auth/signup-context.d.ts +36 -36
  140. package/components/Auth/signup-context.js +71 -71
  141. package/components/Auth/signup-field-translations.d.ts +3 -3
  142. package/components/Auth/signup-field-translations.js +43 -43
  143. package/components/Auth/signupSubmit.d.ts +6 -6
  144. package/components/Auth/signupSubmit.js +56 -56
  145. package/components/Auth/useAddressFields.d.ts +22 -22
  146. package/components/Auth/useAddressFields.js +32 -32
  147. package/components/Auth/useAddressFields.test.js +294 -294
  148. package/components/Auth/useCustomer.d.ts +116 -70
  149. package/components/Auth/useCustomer.js +188 -167
  150. package/components/Auth/useCustomer.js.map +1 -1
  151. package/components/Auth/useLoginFields.d.ts +20 -20
  152. package/components/Auth/useLoginFields.js +20 -20
  153. package/components/Auth/useSignupForm.d.ts +7 -7
  154. package/components/Auth/useSignupForm.js +14 -14
  155. package/components/AuthContext/AuthContext.d.ts +8 -8
  156. package/components/AuthContext/AuthContext.js +8 -8
  157. package/components/AuthContext/AuthProvider.d.ts +6 -6
  158. package/components/AuthContext/AuthProvider.js +84 -84
  159. package/components/AuthContext/AuthProvider.js.map +1 -1
  160. package/components/AuthContext/AuthProvider.test.js +66 -66
  161. package/components/AuthContext/LogOut.d.ts +5 -5
  162. package/components/AuthContext/LogOut.js +14 -14
  163. package/components/AuthContext/googleUserIdQuery.gql +6 -6
  164. package/components/AuthContext/useAuth.d.ts +6 -6
  165. package/components/AuthContext/useAuth.js +20 -20
  166. package/components/BreakpointProvider.d.ts +21 -21
  167. package/components/BreakpointProvider.js +23 -23
  168. package/components/Cart/CartIdContext.d.ts +11 -11
  169. package/components/Cart/CartIdContext.js +60 -60
  170. package/components/Cart/CartIdContext.test.js +87 -87
  171. package/components/ChannelContext/ChannelContext.d.ts +21 -20
  172. package/components/ChannelContext/ChannelContext.js +3 -3
  173. package/components/ChannelContext/ChannelContext.js.map +1 -1
  174. package/components/ChannelContext/ChannelProvider.d.ts +10 -10
  175. package/components/ChannelContext/ChannelProvider.js +44 -42
  176. package/components/ChannelContext/ChannelProvider.js.map +1 -1
  177. package/components/ChannelContext/ChannelProvider.test.js +112 -112
  178. package/components/ChannelContext/CountrySettingsQuery.gql +34 -34
  179. package/components/ChannelContext/index.d.ts +2 -2
  180. package/components/ChannelContext/index.js +2 -2
  181. package/components/ChannelContext/useCountrySettings.d.ts +8 -8
  182. package/components/ChannelContext/useCountrySettings.js +23 -23
  183. package/components/ChannelContext/useCountrySettings.js.map +1 -1
  184. package/components/ConfigProvider.d.ts +107 -108
  185. package/components/ConfigProvider.js +19 -19
  186. package/components/ConfigProvider.js.map +1 -1
  187. package/components/DynamicRoute/ActiveFiltersQuery.gql +21 -21
  188. package/components/DynamicRoute/CategoryRoute.d.ts +13 -13
  189. package/components/DynamicRoute/CategoryRoute.js +55 -55
  190. package/components/DynamicRoute/ContentRoute.d.ts +14 -14
  191. package/components/DynamicRoute/ContentRoute.js +27 -27
  192. package/components/DynamicRoute/PreviewRoute.d.ts +17 -17
  193. package/components/DynamicRoute/PreviewRoute.js +57 -57
  194. package/components/DynamicRoute/ProductByArticlenumber.d.ts +5 -5
  195. package/components/DynamicRoute/ProductByArticlenumber.gql +16 -16
  196. package/components/DynamicRoute/ProductByArticlenumber.js +21 -21
  197. package/components/DynamicRoute/ProductRoute.d.ts +15 -15
  198. package/components/DynamicRoute/ProductRoute.js +57 -57
  199. package/components/DynamicRoute/RouteResolver.d.ts +22 -22
  200. package/components/DynamicRoute/RouteResolver.js +64 -64
  201. package/components/DynamicRoute/Status.d.ts +14 -14
  202. package/components/DynamicRoute/Status.js +19 -19
  203. package/components/DynamicRoute/index.d.ts +17 -17
  204. package/components/DynamicRoute/index.js +95 -95
  205. package/components/Filters/index.d.ts +1 -1
  206. package/components/Filters/index.js +1 -1
  207. package/components/Filters/toggleActiveListItem.gql +15 -15
  208. package/components/Filters/utils/replaceInSearch.d.ts +14 -14
  209. package/components/Filters/utils/replaceInSearch.js +22 -22
  210. package/components/Filters/utils/replaceInSearch.test.js +184 -184
  211. package/components/Filters/utils/updateHistory.d.ts +25 -25
  212. package/components/Filters/utils/updateHistory.js +29 -29
  213. package/components/Filters/utils/updateHistory.test.js +102 -102
  214. package/components/Fonts/CustomFont.d.ts +14 -14
  215. package/components/Fonts/CustomFont.js +16 -16
  216. package/components/Fonts/GoogleFont.d.ts +10 -10
  217. package/components/Fonts/GoogleFont.js +34 -34
  218. package/components/Fonts/TypekitFont.d.ts +16 -16
  219. package/components/Fonts/TypekitFont.js +24 -24
  220. package/components/Fonts/injectFont.d.ts +11 -11
  221. package/components/Fonts/injectFont.js +29 -29
  222. package/components/Head.d.ts +11 -11
  223. package/components/Head.js +79 -74
  224. package/components/Head.js.map +1 -1
  225. package/components/Mutation/AddToCart/addToCartUtils.d.ts +18 -18
  226. package/components/Mutation/AddToCart/addToCartUtils.js +51 -51
  227. package/components/Mutation/AddToCartFormik.d.ts +53 -53
  228. package/components/Mutation/AddToCartFormik.js +171 -171
  229. package/components/Mutation/DecrementQuantity.d.ts +4 -4
  230. package/components/Mutation/DecrementQuantity.js +34 -34
  231. package/components/Mutation/IncrementQuantity.d.ts +4 -4
  232. package/components/Mutation/IncrementQuantity.js +34 -34
  233. package/components/Mutation/RemoveFromCart.d.ts +5 -5
  234. package/components/Mutation/RemoveFromCart.js +51 -51
  235. package/components/Mutation/SetQuantity.d.ts +4 -4
  236. package/components/Mutation/SetQuantity.js +36 -36
  237. package/components/Mutation/SubscribeToNewsletter.d.ts +4 -4
  238. package/components/Mutation/SubscribeToNewsletter.js +29 -29
  239. package/components/Mutation/SubscribeToStockNotifications.d.ts +4 -4
  240. package/components/Mutation/SubscribeToStockNotifications.js +30 -30
  241. package/components/Mutation/cartMutationUtils.d.ts +28 -28
  242. package/components/Mutation/cartMutationUtils.js +108 -108
  243. package/components/Mutation/cartMutationUtils.spec.js +142 -142
  244. package/components/Mutation/useDecrementQuantity.d.ts +11 -11
  245. package/components/Mutation/useDecrementQuantity.js +53 -53
  246. package/components/Mutation/useIncrementQuantity.d.ts +11 -11
  247. package/components/Mutation/useIncrementQuantity.js +53 -53
  248. package/components/Mutation/useRemoveFromCart.d.ts +13 -13
  249. package/components/Mutation/useRemoveFromCart.js +49 -49
  250. package/components/Mutation/useSetQuantity.d.ts +12 -12
  251. package/components/Mutation/useSetQuantity.js +37 -37
  252. package/components/Notifications/Notifications.d.ts +15 -15
  253. package/components/Notifications/Notifications.js +26 -26
  254. package/components/Notifications/index.d.ts +2 -2
  255. package/components/Notifications/index.js +2 -2
  256. package/components/Notifications/notificationMachine.d.ts +30 -30
  257. package/components/Notifications/notificationMachine.js +73 -73
  258. package/components/Notifications/notificationsMachine.d.ts +37 -37
  259. package/components/Notifications/notificationsMachine.js +65 -65
  260. package/components/Notifications/useNotification.d.ts +9 -9
  261. package/components/Notifications/useNotification.js +26 -26
  262. package/components/OpenGraph/OpenGraph.test.js +180 -180
  263. package/components/OpenGraph/OpenGraphGeneralPageData.d.ts +25 -25
  264. package/components/OpenGraph/OpenGraphGeneralPageData.js +36 -36
  265. package/components/OpenGraph/OpenGraphGeneralPageData.js.map +1 -1
  266. package/components/OpenGraph/OpenGraphProductData.d.ts +25 -25
  267. package/components/OpenGraph/OpenGraphProductData.js +48 -48
  268. package/components/OpenGraph/OpenGraphProductData.js.map +1 -1
  269. package/components/OpenGraph/index.d.ts +2 -2
  270. package/components/OpenGraph/index.js +2 -2
  271. package/components/Pagination/PaginationContainer.d.ts +2 -2
  272. package/components/Pagination/PaginationContainer.js +4 -4
  273. package/components/Pagination/PaginationContext.d.ts +14 -14
  274. package/components/Pagination/PaginationContext.js +3 -3
  275. package/components/Pagination/PaginationProvider.d.ts +19 -19
  276. package/components/Pagination/PaginationProvider.js +94 -94
  277. package/components/Pagination/PaginationProvider.test.js +282 -282
  278. package/components/PreviewContext.d.ts +10 -10
  279. package/components/PreviewContext.js +26 -26
  280. package/components/ProductConfigurationProvider/ConfigPrice.gql +22 -22
  281. package/components/ProductConfigurationProvider/ProductConfigurationContext.d.ts +13 -13
  282. package/components/ProductConfigurationProvider/ProductConfigurationContext.js +4 -4
  283. package/components/ProductConfigurationProvider/ProductConfigurationProvider.d.ts +6 -6
  284. package/components/ProductConfigurationProvider/ProductConfigurationProvider.js +49 -49
  285. package/components/Query/CartProvider.d.ts +22 -22
  286. package/components/Query/CartProvider.js +67 -67
  287. package/components/SortOrder/SortOrderContainer.d.ts +40 -40
  288. package/components/SortOrder/SortOrderContainer.js +101 -101
  289. package/components/SortOrder/SortOrderContext.d.ts +9 -9
  290. package/components/SortOrder/SortOrderContext.js +8 -8
  291. package/components/StructuredData/SiteLinksSearchStructuredData.d.ts +3 -3
  292. package/components/StructuredData/SiteLinksSearchStructuredData.js +24 -24
  293. package/components/StructuredData/StructuredBreadcrumbData.d.ts +12 -12
  294. package/components/StructuredData/StructuredBreadcrumbData.js +54 -54
  295. package/components/StructuredData/StructuredCategoryData.d.ts +16 -16
  296. package/components/StructuredData/StructuredCategoryData.js +17 -17
  297. package/components/StructuredData/StructuredData.d.ts +9 -9
  298. package/components/StructuredData/StructuredData.js +6 -6
  299. package/components/StructuredData/StructuredPageData.d.ts +16 -16
  300. package/components/StructuredData/StructuredPageData.js +16 -16
  301. package/components/StructuredData/StructuredProductData.d.ts +18 -18
  302. package/components/StructuredData/StructuredProductData.js +42 -42
  303. package/components/StructuredData/StructuredProductData.test.js +130 -130
  304. package/components/StructuredData/index.d.ts +5 -5
  305. package/components/StructuredData/index.js +5 -5
  306. package/data/cache.d.ts +3 -3
  307. package/data/cache.js +20 -20
  308. package/data/fragmentTypes.d.ts +8 -8
  309. package/data/fragmentTypes.js +83 -83
  310. package/data/fragments/BadgeFragment.gql +7 -7
  311. package/data/fragments/CartCoreFragment.gql +89 -89
  312. package/data/fragments/ChannelsFragment.gql +59 -58
  313. package/data/fragments/CommentsFragment.gql +6 -6
  314. package/data/fragments/HeadFragment.gql +9 -9
  315. package/data/fragments/PriceFragment.gql +5 -5
  316. package/data/fragments/ProductCampaignFragment.gql +10 -10
  317. package/data/fragments/ProductConfigurationsFragment.gql +24 -24
  318. package/data/fragments/ProductListsFragments.gql +94 -94
  319. package/data/fragments/ProductMetadataFragment.gql +20 -20
  320. package/data/fragments/ProductPriceFragment.gql +10 -10
  321. package/data/fragments/ProductVariantPriceFragment.gql +10 -10
  322. package/data/fragments/RouteCrumbFragment.gql +20 -20
  323. package/data/fragments/RouteMetaFragment.gql +18 -18
  324. package/data/fragments/StockStatusFragment.gql +7 -7
  325. package/data/fragments/index.d.ts +1 -1
  326. package/data/fragments/index.js +1 -1
  327. package/data/mutations/accountMutations.gql +28 -28
  328. package/data/mutations/cartMutations.gql +41 -41
  329. package/data/mutations/productListMutations.gql +18 -18
  330. package/data/mutations/signup.gql +7 -7
  331. package/data/mutations/subscribeToNewsletter.gql +3 -3
  332. package/data/mutations/subscribeToStockNotifications.gql +6 -6
  333. package/data/mutations/updateCustomer.gql +5 -5
  334. package/data/mutations/updatePassword.gql +5 -5
  335. package/data/queries/CartMutationQuery.gql +36 -36
  336. package/data/queries/CartQuery.gql +7 -7
  337. package/data/queries/GetCustomerCountryCode.gql +9 -9
  338. package/data/queries/PersonLookupQuery.gql +28 -28
  339. package/data/queries/ProductLists.gql +8 -8
  340. package/dependencies.d.ts +104 -104
  341. package/errorReporting.browser.d.ts +3 -3
  342. package/errorReporting.browser.js +11 -11
  343. package/errorReporting.d.ts +3 -3
  344. package/errorReporting.js +19 -19
  345. package/errorReporting.server.d.ts +3 -3
  346. package/errorReporting.server.js +11 -11
  347. package/errorReporting.shared.d.ts +5 -5
  348. package/errorReporting.shared.js +16 -16
  349. package/experiments/ExperimentsProvider.d.ts +4 -4
  350. package/experiments/ExperimentsProvider.js +28 -28
  351. package/experiments/ExperimentsProvider.test.js +105 -105
  352. package/experiments/integration.test.js +76 -76
  353. package/experiments/selectExperimentVariant.d.ts +3 -3
  354. package/experiments/selectExperimentVariant.js +34 -34
  355. package/experiments/selectExperimentVariant.test.js +64 -64
  356. package/experiments/useExperiment.d.ts +2 -2
  357. package/experiments/useExperiment.js +10 -10
  358. package/experiments/useExperiment.test.js +100 -100
  359. package/global.d.ts +2 -1
  360. package/helpers/decodeUrlQuery.d.ts +9 -9
  361. package/helpers/decodeUrlQuery.js +26 -26
  362. package/helpers/decodeUrlQuery.test.js +54 -54
  363. package/helpers/distance.d.ts +7 -7
  364. package/helpers/distance.js +12 -12
  365. package/helpers/encodeVariant.d.ts +3 -3
  366. package/helpers/encodeVariant.js +24 -24
  367. package/helpers/getBreakpointsFromValues.d.ts +6 -6
  368. package/helpers/getBreakpointsFromValues.js +14 -14
  369. package/helpers/getBreakpointsFromValues.test.js +47 -47
  370. package/helpers/getCartItemVariant.d.ts +7 -7
  371. package/helpers/getCartItemVariant.js +8 -8
  372. package/helpers/getErrorDetail.d.ts +7 -7
  373. package/helpers/getErrorDetail.js +11 -11
  374. package/helpers/getErrorDetail.test.js +44 -44
  375. package/helpers/getHeaders.d.ts +6 -6
  376. package/helpers/getHeaders.js +3 -3
  377. package/helpers/isRelativeUrl.d.ts +1 -1
  378. package/helpers/isRelativeUrl.js +3 -3
  379. package/helpers/logError.d.ts +1 -1
  380. package/helpers/logError.js +16 -16
  381. package/helpers/logWarningInDev.d.ts +1 -1
  382. package/helpers/logWarningInDev.js +6 -6
  383. package/helpers/throwErrorInDev.d.ts +6 -6
  384. package/helpers/throwErrorInDev.js +14 -14
  385. package/helpers/uniqueId.d.ts +5 -5
  386. package/helpers/uniqueId.js +9 -9
  387. package/hooks/CartCheckoutQuery.gql +5 -5
  388. package/hooks/Channels/useChannelSettings.d.ts +7 -7
  389. package/hooks/Channels/useChannelSettings.js +11 -11
  390. package/hooks/Channels/useChannelSettings.js.map +1 -1
  391. package/hooks/Channels/useChannelSettings.test.js +51 -51
  392. package/hooks/Filters/useBooleanFilter.d.ts +8 -8
  393. package/hooks/Filters/useBooleanFilter.js +20 -20
  394. package/hooks/Filters/useFilters.d.ts +3 -3
  395. package/hooks/Filters/useFilters.js +15 -15
  396. package/hooks/Filters/useListFilter.d.ts +10 -10
  397. package/hooks/Filters/useListFilter.js +37 -37
  398. package/hooks/Filters/useMultiFilter.d.ts +13 -13
  399. package/hooks/Filters/useMultiFilter.js +49 -49
  400. package/hooks/Filters/useRangeFilter.d.ts +10 -10
  401. package/hooks/Filters/useRangeFilter.js +35 -35
  402. package/hooks/Filters/useSortOrder.d.ts +11 -11
  403. package/hooks/Filters/useSortOrder.js +21 -21
  404. package/hooks/FreeShippingQuery.gql +16 -16
  405. package/hooks/PackageProducts/index.d.ts +2 -2
  406. package/hooks/PackageProducts/index.js +2 -2
  407. package/hooks/PackageProducts/packagePriceQuery.gql +29 -29
  408. package/hooks/PackageProducts/usePackageProductItem.d.ts +17 -17
  409. package/hooks/PackageProducts/usePackageProductItem.js +26 -26
  410. package/hooks/PackageProducts/usePackageProducts.d.ts +19 -19
  411. package/hooks/PackageProducts/usePackageProducts.js +345 -345
  412. package/hooks/PackageProducts/usePackageProducts.test.js +383 -383
  413. package/hooks/Product/index.d.ts +1 -1
  414. package/hooks/Product/index.js +1 -1
  415. package/hooks/Product/useStockStatus.d.ts +9 -9
  416. package/hooks/Product/useStockStatus.js +25 -25
  417. package/hooks/Product/useSwitchToVariantImage.d.ts +9 -9
  418. package/hooks/Product/useSwitchToVariantImage.js +20 -20
  419. package/hooks/ProductList/ProductListContext.d.ts +7 -7
  420. package/hooks/ProductList/ProductListContext.js +110 -110
  421. package/hooks/ProductList/action-creators.d.ts +46 -46
  422. package/hooks/ProductList/action-creators.js +296 -296
  423. package/hooks/ProductList/index.d.ts +118 -118
  424. package/hooks/ProductList/index.js +21 -21
  425. package/hooks/ProductList/list-transforms.d.ts +73 -73
  426. package/hooks/ProductList/list-transforms.js +106 -106
  427. package/hooks/ProductList/list-transforms.test.js +489 -489
  428. package/hooks/ProductList/product-list-reducer.d.ts +76 -76
  429. package/hooks/ProductList/product-list-reducer.js +197 -197
  430. package/hooks/ProductList/product-list-reducer.test.js +464 -464
  431. package/hooks/ProductList/useProductList.d.ts +13 -13
  432. package/hooks/ProductList/useProductList.js +93 -93
  433. package/hooks/ProductList/useProductListItems.d.ts +10 -10
  434. package/hooks/ProductList/useProductListItems.js +48 -48
  435. package/hooks/ProductList/validate-product.d.ts +6 -6
  436. package/hooks/ProductList/validate-product.js +40 -40
  437. package/hooks/Subscriptions/useNewsletterSubscription.d.ts +38 -38
  438. package/hooks/Subscriptions/useNewsletterSubscription.js +41 -41
  439. package/hooks/Subscriptions/useStockNotifications.d.ts +36 -36
  440. package/hooks/Subscriptions/useStockNotifications.js +37 -37
  441. package/hooks/Subscriptions/useStoreSubscriptions.d.ts +48 -48
  442. package/hooks/Subscriptions/useStoreSubscriptions.js +150 -150
  443. package/hooks/Subscriptions/useStoresubscriptions.test.js +179 -179
  444. package/hooks/useAddMultipleToCart.d.ts +27 -27
  445. package/hooks/useAddMultipleToCart.js +113 -113
  446. package/hooks/useAddMultipleToCart.test.js +181 -181
  447. package/hooks/useChannelBanner.js +22 -22
  448. package/hooks/useChannelBanner.test.js +77 -77
  449. package/hooks/useCustomerOrders.test.js +176 -176
  450. package/hooks/useCustomerOrdersQuery.d.ts +21 -21
  451. package/hooks/useCustomerOrdersQuery.js +20 -20
  452. package/hooks/useDeleteAccountMutation.d.ts +15 -15
  453. package/hooks/useDeleteAccountMutation.js +38 -38
  454. package/hooks/useDynamicPrice.d.ts +3 -3
  455. package/hooks/useDynamicPrice.js +24 -24
  456. package/hooks/useFreeShippingCheck.d.ts +15 -15
  457. package/hooks/useFreeShippingCheck.js +30 -30
  458. package/hooks/useGeolocation.d.ts +11 -11
  459. package/hooks/useGeolocation.js +33 -33
  460. package/hooks/useInfinitePagination.d.ts +37 -37
  461. package/hooks/useInfinitePagination.js +138 -138
  462. package/hooks/useLogError.d.ts +1 -1
  463. package/hooks/useLogError.js +7 -7
  464. package/hooks/useLoginMutation.d.ts +12 -12
  465. package/hooks/useLoginMutation.js +14 -14
  466. package/hooks/useLoginRedirect.d.ts +4 -4
  467. package/hooks/useLoginRedirect.js +36 -36
  468. package/hooks/useOrderDetailQuery.d.ts +20 -20
  469. package/hooks/useOrderDetailQuery.js +28 -28
  470. package/hooks/usePreconnectLinks.d.ts +10 -10
  471. package/hooks/usePreconnectLinks.js +29 -29
  472. package/hooks/usePreconnectLinks.test.js +95 -95
  473. package/hooks/usePrice.d.ts +39 -39
  474. package/hooks/usePrice.js +71 -71
  475. package/hooks/usePrice.test.js +171 -171
  476. package/hooks/useProductVariants/index.d.ts +1 -1
  477. package/hooks/useProductVariants/index.js +1 -1
  478. package/hooks/useProductVariants/useProductVariants.d.ts +19 -19
  479. package/hooks/useProductVariants/useProductVariants.js +202 -202
  480. package/hooks/useProductVariants/useProductVariants.test.js +415 -415
  481. package/hooks/useProductVariants/useVariantFromUrl.d.ts +5 -5
  482. package/hooks/useProductVariants/useVariantFromUrl.js +15 -15
  483. package/hooks/useProductVariants/useVariantFromUrl.test.js +79 -79
  484. package/hooks/useRoutePreload.d.ts +24 -24
  485. package/hooks/useRoutePreload.js +39 -39
  486. package/hooks/useShopConfig.d.ts +1 -1
  487. package/hooks/useShopConfig.js +10 -10
  488. package/hooks/useShopConfig.js.map +1 -1
  489. package/hooks/useThrowErrorInDev.d.ts +1 -1
  490. package/hooks/useThrowErrorInDev.js +7 -7
  491. package/hooks/useThunkReducer.d.ts +7 -7
  492. package/hooks/useThunkReducer.js +23 -23
  493. package/hooks/useWarningInDev.d.ts +1 -1
  494. package/hooks/useWarningInDev.js +9 -9
  495. package/inServer.d.ts +1 -1
  496. package/inServer.js +2 -2
  497. package/index.d.ts +1 -1
  498. package/index.js +1 -1
  499. package/integrations/addwishSchemaExtension.d.ts +35 -35
  500. package/integrations/addwishSchemaExtension.js +140 -140
  501. package/integrations/nostoSchemaExtension.d.ts +5 -5
  502. package/integrations/nostoSchemaExtension.js +76 -76
  503. package/integrations/sluggishSchemaExtension.d.ts +2 -2
  504. package/integrations/sluggishSchemaExtension.js +26 -26
  505. package/package.json +2 -2
  506. package/polyfills.d.ts +1 -1
  507. package/polyfills.js +37 -37
  508. package/registerServiceWorker.js +110 -110
  509. package/resolvers/filters/boolFilter.d.ts +3 -3
  510. package/resolvers/filters/boolFilter.js +84 -84
  511. package/resolvers/filters/defaultActiveFilters.d.ts +3 -3
  512. package/resolvers/filters/defaultActiveFilters.js +8 -8
  513. package/resolvers/filters/filterParams.d.ts +3 -3
  514. package/resolvers/filters/filterParams.js +84 -84
  515. package/resolvers/filters/filters.d.ts +5 -5
  516. package/resolvers/filters/filters.js +78 -78
  517. package/resolvers/filters/index.d.ts +27 -27
  518. package/resolvers/filters/index.js +7 -7
  519. package/resolvers/filters/listFilter.d.ts +7 -7
  520. package/resolvers/filters/listFilter.js +73 -73
  521. package/resolvers/filters/listFilterItem.d.ts +3 -3
  522. package/resolvers/filters/listFilterItem.js +122 -122
  523. package/resolvers/filters/multiListFilter.d.ts +5 -5
  524. package/resolvers/filters/multiListFilter.js +195 -195
  525. package/resolvers/filters/multiListFilterList.d.ts +3 -3
  526. package/resolvers/filters/multiListFilterList.js +55 -55
  527. package/resolvers/filters/rangeFilter.d.ts +5 -5
  528. package/resolvers/filters/rangeFilter.js +137 -137
  529. package/resolvers/filters/updateQueryString.d.ts +12 -12
  530. package/resolvers/filters/updateQueryString.js +116 -116
  531. package/resolvers/index.d.ts +37 -37
  532. package/resolvers/index.js +37 -37
  533. package/scripts/dev-apolloServer.js +31 -31
  534. package/sentry/client.d.ts +1 -1
  535. package/sentry/client.js +29 -29
  536. package/sentry/common.d.ts +1 -1
  537. package/sentry/common.js +4 -4
  538. package/sentry/server.d.ts +1 -1
  539. package/sentry/server.js +19 -19
  540. package/sentry/utils.d.ts +1 -1
  541. package/sentry/utils.js +1 -1
  542. package/server/graphql.d.ts +20 -20
  543. package/server/graphql.js +118 -118
  544. package/server/graphql.test.js +123 -123
  545. package/server/index.d.ts +2 -2
  546. package/server/index.js +2 -2
  547. package/server/tracking/facebook.d.ts +5 -5
  548. package/server/tracking/facebook.js +132 -132
  549. package/server/tracking/middleware.d.ts +8 -8
  550. package/server/tracking/middleware.js +14 -14
  551. package/server/tracking/types.d.ts +33 -33
  552. package/setupTests.js +2 -2
  553. package/test-utils/ProviderPyramid.js +45 -45
  554. package/test-utils/mockShopConfig.js +26 -26
  555. package/test-utils/mockedProduct.js +253 -253
  556. package/test-utils/renderWithRouter.js +20 -20
  557. package/test-utils/variables.js +2476 -1231
  558. package/time.d.ts +1 -1
  559. package/time.js +5 -5
@@ -1,267 +1,312 @@
1
- import acceptLanguageParser from 'accept-language-parser';
2
- import qs from 'qs';
3
- export const getURLBasename = (url) => {
4
- return url.pathname.split('/')[1];
5
- };
6
- export const getURLLanguageBasename = ({ url, singleDomainMode }) => {
7
- if (singleDomainMode) {
8
- return url.pathname.split('/')[2];
9
- }
10
- else {
11
- return getURLBasename(url);
12
- }
13
- };
14
- /**
15
- * Returns the default channel from a list of channels
16
- * @param channels List of channels to search through
17
- */
18
- export const getDefaultChannel = (channels) => {
19
- return channels.find((channel) => channel.isDefault) || channels[0];
20
- };
21
- /**
22
- * Converts a Channel object to a SelectedChannel with the specified culture and currency
23
- * @param channel Channel to convert
24
- * @param culture Desired culture
25
- * @param currency Desired currency
26
- * @param country? Optional desired country code
27
- */
28
- export const createSelectedChannel = (channel, culture, currency, country, urlBasenameLanguage) => {
29
- const selectedLanguage = channel.languages.find((language) => getLanguageFromCulture(language.culture) === urlBasenameLanguage) ||
30
- channel.languages.find((language) => language.culture === culture) ||
31
- channel.languages.find((language) => language.isDefault);
32
- const selectedCurrency = channel.currencies.find((c) => c.id === currency) ||
33
- channel.currencies.find((c) => c.isDefault);
34
- // Set selectedCountry to the prop `country`, else use the default
35
- const selectedCountry = channel.countries.find((c) => c.code === country) ||
36
- channel.countries.find((c) => c.isDefault);
37
- return Object.assign(Object.assign({}, channel), { currency: selectedCurrency || channel.defaultCurrency, language: selectedLanguage || channel.defaultLanguage, country: selectedCountry });
38
- };
39
- /**
40
- * Returns a channel with the specified name
41
- * @param channelName Name of the channel to be fond
42
- * @param channels Array of channels to search through
43
- */
44
- export const findChannel = (channelName, channels) => {
45
- return channels.find((channel) => channel.name === channelName);
46
- };
47
- const sanitizeURL = (url) => String(url).replace(/^(?:[\w]+:\/\/)?(?:www\.)?/, '');
48
- export const findChannelById = (id, channels) => {
49
- return channels.find((channel) => channel.id === id);
50
- };
51
- export const findChannelByCountry = (countryCode, channels) => {
52
- // We want to give priority to channels that have the country we are looking for as a default country
53
- const channelWithDefaultCountry = channels.find((channel) => channel.countries.find((country) => country.code === countryCode && country.isDefault)
54
- ? true
55
- : false);
56
- if (!channelWithDefaultCountry) {
57
- // If we don't find a channel with the default country then just return the first channel we find with that country
58
- return channels.find((channel) => channel.countries.find((country) => country.code === countryCode)
59
- ? true
60
- : false);
61
- }
62
- else {
63
- return channelWithDefaultCountry;
64
- }
65
- };
66
- export const getQueryObject = (url) => {
67
- const queryObject = qs.parse(new URL(url).search, {
68
- ignoreQueryPrefix: true
69
- });
70
- // We want to make this property case insensitive
71
- if (queryObject.redirectdisabled) {
72
- queryObject.redirectDisabled = queryObject.redirectdisabled;
73
- }
74
- return queryObject;
75
- };
76
- export const setChannelCookies = ({ culture, currency, channelCountry, channel, redirectDisabled }, cookies) => {
77
- const expires = new Date();
78
- expires.setFullYear(new Date().getFullYear() + 10);
79
- if (redirectDisabled) {
80
- cookies.remove('culture');
81
- cookies.remove('currency');
82
- cookies.remove('country');
83
- cookies.remove('channel');
84
- }
85
- culture && cookies.set('culture', culture, { expires, path: '/' });
86
- currency && cookies.set('currency', currency, { expires, path: '/' });
87
- channelCountry &&
88
- cookies.set('country', channelCountry, { expires, path: '/' });
89
- channel && cookies.set('channel', channel, { expires, path: '/' });
90
- };
91
- export function getLanguageFromCulture(culture) {
92
- return culture.split('-')[0];
93
- }
94
- export function getChannelBasename(selectedChannel) {
95
- const channelUrl = new URL(selectedChannel.url);
96
- let languageSuffix;
97
- if (!selectedChannel.language.isDefault) {
98
- languageSuffix =
99
- '/' + getLanguageFromCulture(selectedChannel.language.culture);
100
- }
101
- let basename;
102
- if (channelUrl.pathname !== '/') {
103
- basename = channelUrl.pathname + (languageSuffix || '');
104
- }
105
- else if (languageSuffix) {
106
- basename = languageSuffix;
107
- }
108
- return basename;
109
- }
110
- export function isInDev(url) {
111
- return (url.indexOf('localhost') >= 0 ||
112
- url.indexOf('.dev.jetshop.se') >= 0 ||
113
- process.env.NODE_ENV === 'development');
114
- }
115
- function getChannelFromPathOrUrl({ url, singleDomainMode, channels }) {
116
- if (isInDev(url) && singleDomainMode) {
117
- const basename = getURLBasename(new URL(url));
118
- const activeChannels = channels.filter((channel) => basename === getURLBasename(new URL(channel.url)));
119
- // If we find more than one active channel we will end up in an infinite redirect so we return the first channel
120
- // This likely means that there are multiple channels with the same basename but different domains
121
- // To handle channel switching on development we also return the activeChannels array
122
- return {
123
- activeChannel: activeChannels.length > 1 ? null : activeChannels[0],
124
- activeChannels
125
- };
126
- }
127
- else {
128
- const currentUrl = sanitizeURL(url);
129
- const sorted = channels.slice().sort((a, b) => b.url.length - a.url.length);
130
- const activeChannels = sorted.filter((channel) => currentUrl.indexOf(sanitizeURL(channel.url)) === 0);
131
- // If we find more than one active channel we will end up in an infinite redirect so we return false
132
- // This likely means that there are multiple channels with the same domain
133
- return {
134
- activeChannel: activeChannels.length > 1 ? null : activeChannels[0],
135
- activeChannels
136
- };
137
- }
138
- }
139
- function getChannelFromCookies({ cookies, channels }) {
140
- const channelNameFromCookie = cookies.get('channel');
141
- return findChannel(channelNameFromCookie, channels);
142
- }
143
- function setCookiesFromQueryString({ cookies, url }) {
144
- // Get the culture, currency, country, channel from query string if set
145
- const queryStringParams = getQueryObject(url);
146
- // Set those values in to cookies
147
- setChannelCookies(queryStringParams, cookies);
148
- }
149
- function getChannelFieldsFromCookies(cookies) {
150
- const cultureFromCookie = cookies.get('culture');
151
- const currencyFromCookie = cookies.get('currency');
152
- const countryFromCookie = cookies.get('country');
153
- const geoipCountryFromCookie = cookies.get('geoipCountry');
154
- const acceptLanguageCultureFromCookie = cookies.get('acceptLanguageCulture');
155
- return {
156
- cultureFromCookie: cultureFromCookie || acceptLanguageCultureFromCookie,
157
- currencyFromCookie,
158
- countryFromCookie: countryFromCookie || geoipCountryFromCookie
159
- };
160
- }
161
- function getCultureFromAcceptLanguages({ channel, acceptedLanguages }) {
162
- const acceptedLanguagesString = typeof acceptedLanguages !== 'string'
163
- ? acceptedLanguages[0]
164
- : acceptedLanguages;
165
- const channelLanguages = channel.languages.map((language) => language.culture);
166
- return (acceptedLanguages &&
167
- acceptLanguageParser.pick(channelLanguages, acceptedLanguagesString));
168
- }
169
- function setGeoIpAndAcceptLanguageCookies({ cookies, geoipCountry, acceptLanguageCulture }) {
170
- const expires = new Date();
171
- expires.setFullYear(new Date().getFullYear() + 10);
172
- geoipCountry &&
173
- cookies.set('geoipCountry', geoipCountry, { expires, path: '/' });
174
- acceptLanguageCulture &&
175
- cookies.set('acceptLanguageCulture', acceptLanguageCulture, {
176
- expires,
177
- path: '/'
178
- });
179
- }
180
- export function getSelectedAndRecommendedChannel({ url, singleDomainMode, channels, cookies, geoipCountry, acceptedLanguages, disableGeoRedirect }) {
181
- setCookiesFromQueryString({ cookies, url });
182
- const { activeChannel, activeChannels } = getChannelFromPathOrUrl({
183
- url,
184
- singleDomainMode,
185
- channels
186
- });
187
- const chosenChannel = getChannelFromCookies({
188
- cookies,
189
- channels
190
- });
191
- const defaultChannel = getDefaultChannel(channels);
192
- // Active channel is given first priority. If it is null we are most likely in staging or development so chosenChannel or defaultChannel is used
193
- const pureChannel = activeChannel || chosenChannel || defaultChannel;
194
- let redirect = false;
195
- const channelFromGeoIp = findChannelByCountry(geoipCountry || cookies.get('geoipCountry'), channels);
196
- let pureRecommendedChannel;
197
- // If a channel has been chosen we want to redirect to it
198
- if (chosenChannel &&
199
- activeChannel &&
200
- activeChannel.id !== chosenChannel.id &&
201
- // We don't want to redirect if the URLs of the channels are the same (i.e. demostore)
202
- chosenChannel.url !== activeChannel.url) {
203
- redirect = true;
204
- pureRecommendedChannel = chosenChannel;
205
- }
206
- else if (pureChannel &&
207
- channelFromGeoIp &&
208
- pureChannel.id !== channelFromGeoIp.id) {
209
- pureRecommendedChannel = channelFromGeoIp;
210
- redirect = !disableGeoRedirect && !chosenChannel;
211
- // this should happen when we can't find a matching channel from the url so we want to redirect such that the basename is included
212
- }
213
- else if (!activeChannel &&
214
- singleDomainMode &&
215
- activeChannels.length === 0) {
216
- redirect = true;
217
- pureRecommendedChannel = pureChannel;
218
- }
219
- // disable all redirects if either redirectDisabled or articlenumber (product previews) is in the query string
220
- const { redirectDisabled, articlenumber } = getQueryObject(url);
221
- if (redirectDisabled || articlenumber) {
222
- redirect = false;
223
- }
224
- // This should only happen on the server. We do this because we need to know the channel languages before we can determine accept language culture
225
- const acceptLanguageCulture = acceptedLanguages &&
226
- getCultureFromAcceptLanguages({
227
- channel: pureChannel,
228
- acceptedLanguages
229
- });
230
- // set geoip and acceptLanguage as cookies so we can retrieve them on the client
231
- setGeoIpAndAcceptLanguageCookies({
232
- cookies,
233
- geoipCountry,
234
- acceptLanguageCulture
235
- });
236
- const { cultureFromCookie, currencyFromCookie, countryFromCookie } = getChannelFieldsFromCookies(cookies);
237
- const urlBasenameLanguage = getURLLanguageBasename({
238
- url: new URL(url),
239
- singleDomainMode
240
- });
241
- const selectedChannel = createSelectedChannel(pureChannel, cultureFromCookie, currencyFromCookie, countryFromCookie, urlBasenameLanguage);
242
- if (!selectedChannel.language.isDefault &&
243
- getLanguageFromCulture(selectedChannel.language.culture) !==
244
- urlBasenameLanguage) {
245
- redirect = true;
246
- pureRecommendedChannel = pureChannel;
247
- }
248
- const recommendedChannel = pureRecommendedChannel &&
249
- createSelectedChannel(pureRecommendedChannel, cultureFromCookie, currencyFromCookie, countryFromCookie, urlBasenameLanguage);
250
- return {
251
- redirect,
252
- selectedChannel,
253
- recommendedChannel
254
- };
255
- }
256
- export function getChannelHeaders(channel) {
257
- return channel
258
- ? {
259
- currency: channel.currency.id,
260
- channelid: channel.id,
261
- culture: channel.language.culture,
262
- country: channel.country.code,
263
- name: channel.name
264
- }
265
- : {};
266
- }
1
+ import acceptLanguageParser from 'accept-language-parser';
2
+ import qs from 'qs';
3
+ const allChannelsGrouped = (availableChannels) => availableChannels.every((channel) => { var _a; return (_a = channel === null || channel === void 0 ? void 0 : channel.groupName) === null || _a === void 0 ? void 0 : _a.length; });
4
+ export const getGroupedChannels = (availableChannels, { groupName }) => {
5
+ const currentChannel = availableChannels.find((channel) => channel.groupName === groupName);
6
+ if (!currentChannel) {
7
+ return undefined;
8
+ }
9
+ const selectedChannelGroup = availableChannels.filter((channel) => channel.groupName === currentChannel.groupName);
10
+ if (selectedChannelGroup.length > 0) {
11
+ return selectedChannelGroup;
12
+ }
13
+ else {
14
+ return undefined;
15
+ }
16
+ };
17
+ export const getURLBasename = (url) => {
18
+ return url.pathname.split('/')[1];
19
+ };
20
+ export const getURLLanguageBasename = ({ url, singleDomainMode }) => {
21
+ if (singleDomainMode) {
22
+ return url.pathname.split('/')[2];
23
+ }
24
+ else {
25
+ return getURLBasename(url);
26
+ }
27
+ };
28
+ /**
29
+ * Returns the default channel from a list of channels
30
+ * @param channels List of channels to search through
31
+ */
32
+ export const getDefaultChannel = (channels) => {
33
+ return channels.find((channel) => channel.isDefault) || channels[0];
34
+ };
35
+ /**
36
+ * Converts a Channel object to a SelectedChannel with the specified culture and currency
37
+ * @param channel Channel to convert
38
+ * @param culture Desired culture
39
+ * @param currency Desired currency
40
+ * @param country? Optional desired country code
41
+ */
42
+ export const createSelectedChannel = (channel, culture, currency, country, urlBasenameLanguage) => {
43
+ const selectedLanguage = channel.languages.find((language) => getLanguageFromCulture(language.culture) === urlBasenameLanguage) ||
44
+ channel.languages.find((language) => language.culture === culture) ||
45
+ channel.languages.find((language) => language.isDefault);
46
+ const selectedCurrency = channel.currencies.find((c) => c.id === currency) ||
47
+ channel.currencies.find((c) => c.isDefault);
48
+ // Set selectedCountry to the prop `country`, else use the default
49
+ const selectedCountry = channel.countries.find((c) => c.code === country) ||
50
+ channel.countries.find((c) => c.isDefault);
51
+ return Object.assign(Object.assign({}, channel), { currency: selectedCurrency || channel.defaultCurrency, language: selectedLanguage || channel.defaultLanguage, country: selectedCountry });
52
+ };
53
+ /**
54
+ * Returns a channel with the specified name
55
+ * @param channelName Name of the channel to be fond
56
+ * @param channels Array of channels to search through
57
+ */
58
+ export const findChannel = (channelName, channels) => {
59
+ return channels.find((channel) => channel.name === channelName);
60
+ };
61
+ const sanitizeURL = (url) => String(url).replace(/^(?:[\w]+:\/\/)?(?:www\.)?/, '');
62
+ export const findChannelById = (id, channels) => {
63
+ return channels.find((channel) => channel.id === id);
64
+ };
65
+ export const findChannelByCountry = (countryCode, channels) => {
66
+ // We want to give priority to channels that have the country we are looking for as a default country
67
+ const channelWithDefaultCountry = channels.find((channel) => channel.countries.find((country) => country.code === countryCode && country.isDefault)
68
+ ? true
69
+ : false);
70
+ if (!channelWithDefaultCountry) {
71
+ // If we don't find a channel with the default country then just return the first channel we find with that country
72
+ return channels.find((channel) => channel.countries.find((country) => country.code === countryCode)
73
+ ? true
74
+ : false);
75
+ }
76
+ else {
77
+ return channelWithDefaultCountry;
78
+ }
79
+ };
80
+ export const getQueryObject = (url) => {
81
+ const queryObject = qs.parse(new URL(url).search, {
82
+ ignoreQueryPrefix: true
83
+ });
84
+ // We want to make this property case insensitive
85
+ if (queryObject.redirectdisabled) {
86
+ queryObject.redirectDisabled = queryObject.redirectdisabled;
87
+ }
88
+ return queryObject;
89
+ };
90
+ export const setChannelCookies = ({ culture, currency, channelCountry, channel, redirectDisabled }, cookies) => {
91
+ const expires = new Date();
92
+ expires.setFullYear(new Date().getFullYear() + 10);
93
+ if (redirectDisabled) {
94
+ cookies.remove('culture');
95
+ cookies.remove('currency');
96
+ cookies.remove('country');
97
+ cookies.remove('channel');
98
+ }
99
+ culture && cookies.set('culture', culture, { expires, path: '/' });
100
+ currency && cookies.set('currency', currency, { expires, path: '/' });
101
+ channelCountry &&
102
+ cookies.set('country', channelCountry, { expires, path: '/' });
103
+ channel && cookies.set('channel', channel, { expires, path: '/' });
104
+ };
105
+ export function getLanguageFromCulture(culture) {
106
+ return culture.split('-')[0];
107
+ }
108
+ export function getChannelBasename(selectedChannel) {
109
+ const channelUrl = new URL(selectedChannel.url);
110
+ let languageSuffix;
111
+ if (!selectedChannel.language.isDefault) {
112
+ languageSuffix =
113
+ '/' + getLanguageFromCulture(selectedChannel.language.culture);
114
+ }
115
+ let basename;
116
+ if (channelUrl.pathname !== '/') {
117
+ basename = channelUrl.pathname + (languageSuffix || '');
118
+ }
119
+ else if (languageSuffix) {
120
+ basename = languageSuffix;
121
+ }
122
+ return basename;
123
+ }
124
+ export function isInDev(url) {
125
+ return (url.indexOf('localhost') >= 0 ||
126
+ url.indexOf('.dev.jetshop.se') >= 0 ||
127
+ process.env.NODE_ENV === 'development');
128
+ }
129
+ function getChannelFromPathOrUrl({ url, singleDomainMode, channels }) {
130
+ if (isInDev(url) && singleDomainMode) {
131
+ const basename = getURLBasename(new URL(url));
132
+ const activeChannels = channels.filter((channel) => basename === getURLBasename(new URL(channel.url)));
133
+ // If we find more than one active channel we will end up in an infinite redirect so we return the first channel
134
+ // This likely means that there are multiple channels with the same basename but different domains
135
+ // To handle channel switching on development we also return the activeChannels array
136
+ return {
137
+ activeChannel: activeChannels.length > 1 ? null : activeChannels[0],
138
+ activeChannels
139
+ };
140
+ }
141
+ else {
142
+ const currentUrl = sanitizeURL(url);
143
+ const sorted = channels.slice().sort((a, b) => b.url.length - a.url.length);
144
+ const activeChannels = sorted.filter((channel) => currentUrl.indexOf(sanitizeURL(channel.url)) === 0);
145
+ // If we find more than one active channel we will end up in an infinite redirect so we return false
146
+ // This likely means that there are multiple channels with the same domain
147
+ return {
148
+ activeChannel: activeChannels.length > 1 ? null : activeChannels[0],
149
+ activeChannels
150
+ };
151
+ }
152
+ }
153
+ function getChannelFromCookies({ cookies, channels }) {
154
+ const channelNameFromCookie = cookies.get('channel');
155
+ return findChannel(channelNameFromCookie, channels);
156
+ }
157
+ function setCookiesFromQueryString({ cookies, url }) {
158
+ // Get the culture, currency, country, channel from query string if set
159
+ const queryStringParams = getQueryObject(url);
160
+ // Set those values in to cookies
161
+ setChannelCookies(queryStringParams, cookies);
162
+ }
163
+ function getChannelFieldsFromCookies(cookies) {
164
+ const cultureFromCookie = cookies.get('culture');
165
+ const currencyFromCookie = cookies.get('currency');
166
+ const countryFromCookie = cookies.get('country');
167
+ const geoipCountryFromCookie = cookies.get('geoipCountry');
168
+ const acceptLanguageCultureFromCookie = cookies.get('acceptLanguageCulture');
169
+ return {
170
+ cultureFromCookie: cultureFromCookie || acceptLanguageCultureFromCookie,
171
+ currencyFromCookie,
172
+ countryFromCookie: countryFromCookie || geoipCountryFromCookie
173
+ };
174
+ }
175
+ function getCultureFromAcceptLanguages({ channel, acceptedLanguages }) {
176
+ const acceptedLanguagesString = typeof acceptedLanguages !== 'string'
177
+ ? acceptedLanguages[0]
178
+ : acceptedLanguages;
179
+ const channelLanguages = channel.languages.map((language) => language.culture);
180
+ return (acceptedLanguages &&
181
+ acceptLanguageParser.pick(channelLanguages, acceptedLanguagesString));
182
+ }
183
+ function setGeoIpAndAcceptLanguageCookies({ cookies, geoipCountry, acceptLanguageCulture }) {
184
+ const expires = new Date();
185
+ expires.setFullYear(new Date().getFullYear() + 10);
186
+ geoipCountry &&
187
+ cookies.set('geoipCountry', geoipCountry, { expires, path: '/' });
188
+ acceptLanguageCulture &&
189
+ cookies.set('acceptLanguageCulture', acceptLanguageCulture, {
190
+ expires,
191
+ path: '/'
192
+ });
193
+ }
194
+ // Is where we determine current channel to get return values in getSelectedAndRecommendedChannel
195
+ function getCurrentChannel({ url, singleDomainMode, channels, cookies }) {
196
+ const { activeChannel, activeChannels } = getChannelFromPathOrUrl({
197
+ url,
198
+ singleDomainMode,
199
+ channels
200
+ });
201
+ const chosenChannel = getChannelFromCookies({
202
+ cookies,
203
+ channels
204
+ });
205
+ // But have default channel as fallback,
206
+ const defaultChannel = getDefaultChannel(channels);
207
+ return {
208
+ activeChannel,
209
+ activeChannels,
210
+ chosenChannel,
211
+ defaultChannel
212
+ };
213
+ }
214
+ export function getSelectedAndRecommendedChannel({ url, singleDomainMode, channels, cookies, geoipCountry, acceptedLanguages, disableGeoRedirect }) {
215
+ setCookiesFromQueryString({ cookies, url });
216
+ const { defaultChannel, chosenChannel, activeChannel, activeChannels } = getCurrentChannel({
217
+ url,
218
+ singleDomainMode,
219
+ channels,
220
+ cookies,
221
+ geoipCountry
222
+ });
223
+ // Active channel is given first priority. If it is null we are most likely in staging or development so chosenChannel or defaultChannel is used
224
+ // Definitions: Requested channel by url || Channel stored in cookies || Default channel
225
+ const pureChannel = activeChannel || chosenChannel || defaultChannel;
226
+ // NB: All channels must be grouped and groupName is nullable.
227
+ const availableChannels = allChannelsGrouped(channels)
228
+ ? getGroupedChannels(channels, {
229
+ groupName: pureChannel.groupName
230
+ })
231
+ : channels;
232
+ const channelFromGeoIp = findChannelByCountry(geoipCountry || cookies.get('geoipCountry'), availableChannels);
233
+ let redirect = false;
234
+ let pureRecommendedChannel;
235
+ // If a channel has been chosen we want to redirect to it
236
+ if (chosenChannel &&
237
+ activeChannel &&
238
+ activeChannel.id !== chosenChannel.id &&
239
+ // We don't want to redirect if the URLs of the channels are the same (i.e. demostore)
240
+ chosenChannel.url !== activeChannel.url &&
241
+ // It is safe to redirect if the channel is part of the same group (null === null ie. channel not grouped)
242
+ (chosenChannel === null || chosenChannel === void 0 ? void 0 : chosenChannel.groupName) === (activeChannel === null || activeChannel === void 0 ? void 0 : activeChannel.groupName)) {
243
+ redirect = true;
244
+ pureRecommendedChannel = chosenChannel;
245
+ }
246
+ else if (channelFromGeoIp &&
247
+ // Recommend channel if it not the same as the current channel
248
+ pureChannel.id !== channelFromGeoIp.id &&
249
+ // Or is available in channel group (null === null ie. channel not grouped)
250
+ (pureChannel === null || pureChannel === void 0 ? void 0 : pureChannel.groupName) === (channelFromGeoIp === null || channelFromGeoIp === void 0 ? void 0 : channelFromGeoIp.groupName)) {
251
+ pureRecommendedChannel = channelFromGeoIp;
252
+ // Allow redirect if there's no channel in cookies (chosenChannel)
253
+ redirect = !disableGeoRedirect && !chosenChannel;
254
+ // the following should happen when we can't find a matching channel from the url so we want to redirect such that the basename is included
255
+ }
256
+ else if (!activeChannel &&
257
+ singleDomainMode &&
258
+ activeChannels.length === 0) {
259
+ redirect = true;
260
+ pureRecommendedChannel = pureChannel;
261
+ }
262
+ // disable all redirects if either redirectDisabled or articlenumber (product previews) is in the query string
263
+ const { redirectDisabled, articlenumber } = getQueryObject(url);
264
+ if (redirectDisabled || articlenumber) {
265
+ redirect = false;
266
+ }
267
+ // This should only happen on the server. We do this because we need to know the channel languages before we can determine accept language culture
268
+ const acceptLanguageCulture = acceptedLanguages &&
269
+ getCultureFromAcceptLanguages({
270
+ channel: pureChannel,
271
+ acceptedLanguages
272
+ });
273
+ // set geoip and acceptLanguage as cookies so we can retrieve them on the client
274
+ setGeoIpAndAcceptLanguageCookies({
275
+ cookies,
276
+ geoipCountry,
277
+ acceptLanguageCulture
278
+ });
279
+ const { cultureFromCookie, currencyFromCookie, countryFromCookie } = getChannelFieldsFromCookies(cookies);
280
+ const urlBasenameLanguage = getURLLanguageBasename({
281
+ url: new URL(url),
282
+ singleDomainMode
283
+ });
284
+ const selectedChannel = createSelectedChannel(pureChannel, cultureFromCookie, currencyFromCookie, countryFromCookie, urlBasenameLanguage);
285
+ if (!selectedChannel.language.isDefault &&
286
+ getLanguageFromCulture(selectedChannel.language.culture) !==
287
+ urlBasenameLanguage) {
288
+ redirect = true;
289
+ pureRecommendedChannel = pureChannel;
290
+ }
291
+ const recommendedChannel = pureRecommendedChannel &&
292
+ createSelectedChannel(pureRecommendedChannel, cultureFromCookie, currencyFromCookie, countryFromCookie, urlBasenameLanguage);
293
+ return {
294
+ redirect,
295
+ selectedChannel,
296
+ recommendedChannel,
297
+ // for testing purposes mainly
298
+ channels: availableChannels
299
+ };
300
+ }
301
+ export function getChannelHeaders(channel) {
302
+ return channel
303
+ ? {
304
+ currency: channel.currency.id,
305
+ channelid: channel.id,
306
+ culture: channel.language.culture,
307
+ country: channel.country.code,
308
+ name: channel.name
309
+ }
310
+ : {};
311
+ }
267
312
  //# sourceMappingURL=channelUtils.js.map