@jetshop/core 5.13.10-0 → 5.14.0-alpha.49df897e

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 (557) 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 +372 -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 +514 -538
  15. package/ChannelHandler/redirectUtilsGroupedChannels.test.js +732 -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/formatSignupInput.d.ts +8 -8
  137. package/components/Auth/formatSignupInput.js +42 -42
  138. package/components/Auth/signup-context.d.ts +36 -36
  139. package/components/Auth/signup-context.js +71 -71
  140. package/components/Auth/signup-field-translations.d.ts +3 -3
  141. package/components/Auth/signup-field-translations.js +43 -43
  142. package/components/Auth/signupSubmit.d.ts +6 -6
  143. package/components/Auth/signupSubmit.js +56 -56
  144. package/components/Auth/useAddressFields.d.ts +22 -22
  145. package/components/Auth/useAddressFields.js +32 -32
  146. package/components/Auth/useAddressFields.test.js +294 -294
  147. package/components/Auth/useCustomer.d.ts +70 -70
  148. package/components/Auth/useCustomer.js +167 -167
  149. package/components/Auth/useLoginFields.d.ts +20 -20
  150. package/components/Auth/useLoginFields.js +20 -20
  151. package/components/Auth/useSignupForm.d.ts +7 -7
  152. package/components/Auth/useSignupForm.js +14 -14
  153. package/components/AuthContext/AuthContext.d.ts +8 -8
  154. package/components/AuthContext/AuthContext.js +8 -8
  155. package/components/AuthContext/AuthProvider.d.ts +6 -6
  156. package/components/AuthContext/AuthProvider.js +84 -84
  157. package/components/AuthContext/AuthProvider.js.map +1 -1
  158. package/components/AuthContext/AuthProvider.test.js +66 -66
  159. package/components/AuthContext/LogOut.d.ts +5 -5
  160. package/components/AuthContext/LogOut.js +14 -14
  161. package/components/AuthContext/googleUserIdQuery.gql +6 -6
  162. package/components/AuthContext/useAuth.d.ts +6 -6
  163. package/components/AuthContext/useAuth.js +20 -20
  164. package/components/BreakpointProvider.d.ts +21 -21
  165. package/components/BreakpointProvider.js +23 -23
  166. package/components/Cart/CartIdContext.d.ts +11 -11
  167. package/components/Cart/CartIdContext.js +60 -60
  168. package/components/Cart/CartIdContext.test.js +87 -87
  169. package/components/ChannelContext/ChannelContext.d.ts +21 -20
  170. package/components/ChannelContext/ChannelContext.js +3 -3
  171. package/components/ChannelContext/ChannelContext.js.map +1 -1
  172. package/components/ChannelContext/ChannelProvider.d.ts +10 -10
  173. package/components/ChannelContext/ChannelProvider.js +44 -42
  174. package/components/ChannelContext/ChannelProvider.js.map +1 -1
  175. package/components/ChannelContext/ChannelProvider.test.js +112 -112
  176. package/components/ChannelContext/CountrySettingsQuery.gql +34 -34
  177. package/components/ChannelContext/index.d.ts +2 -2
  178. package/components/ChannelContext/index.js +2 -2
  179. package/components/ChannelContext/useCountrySettings.d.ts +8 -8
  180. package/components/ChannelContext/useCountrySettings.js +23 -23
  181. package/components/ChannelContext/useCountrySettings.js.map +1 -1
  182. package/components/ConfigProvider.d.ts +107 -108
  183. package/components/ConfigProvider.js +19 -19
  184. package/components/ConfigProvider.js.map +1 -1
  185. package/components/DynamicRoute/ActiveFiltersQuery.gql +21 -21
  186. package/components/DynamicRoute/CategoryRoute.d.ts +13 -13
  187. package/components/DynamicRoute/CategoryRoute.js +55 -55
  188. package/components/DynamicRoute/ContentRoute.d.ts +14 -14
  189. package/components/DynamicRoute/ContentRoute.js +27 -27
  190. package/components/DynamicRoute/PreviewRoute.d.ts +17 -17
  191. package/components/DynamicRoute/PreviewRoute.js +57 -57
  192. package/components/DynamicRoute/ProductByArticlenumber.d.ts +5 -5
  193. package/components/DynamicRoute/ProductByArticlenumber.gql +16 -16
  194. package/components/DynamicRoute/ProductByArticlenumber.js +21 -21
  195. package/components/DynamicRoute/ProductRoute.d.ts +15 -15
  196. package/components/DynamicRoute/ProductRoute.js +57 -57
  197. package/components/DynamicRoute/RouteResolver.d.ts +22 -22
  198. package/components/DynamicRoute/RouteResolver.js +64 -64
  199. package/components/DynamicRoute/Status.d.ts +14 -14
  200. package/components/DynamicRoute/Status.js +19 -19
  201. package/components/DynamicRoute/index.d.ts +17 -17
  202. package/components/DynamicRoute/index.js +95 -95
  203. package/components/Filters/index.d.ts +1 -1
  204. package/components/Filters/index.js +1 -1
  205. package/components/Filters/toggleActiveListItem.gql +15 -15
  206. package/components/Filters/utils/replaceInSearch.d.ts +14 -14
  207. package/components/Filters/utils/replaceInSearch.js +22 -22
  208. package/components/Filters/utils/replaceInSearch.test.js +184 -184
  209. package/components/Filters/utils/updateHistory.d.ts +25 -25
  210. package/components/Filters/utils/updateHistory.js +29 -29
  211. package/components/Filters/utils/updateHistory.test.js +102 -102
  212. package/components/Fonts/CustomFont.d.ts +14 -14
  213. package/components/Fonts/CustomFont.js +16 -16
  214. package/components/Fonts/GoogleFont.d.ts +10 -10
  215. package/components/Fonts/GoogleFont.js +34 -34
  216. package/components/Fonts/TypekitFont.d.ts +16 -16
  217. package/components/Fonts/TypekitFont.js +24 -24
  218. package/components/Fonts/injectFont.d.ts +11 -11
  219. package/components/Fonts/injectFont.js +29 -29
  220. package/components/Head.d.ts +11 -11
  221. package/components/Head.js +79 -74
  222. package/components/Head.js.map +1 -1
  223. package/components/Mutation/AddToCart/addToCartUtils.d.ts +18 -18
  224. package/components/Mutation/AddToCart/addToCartUtils.js +51 -51
  225. package/components/Mutation/AddToCartFormik.d.ts +53 -53
  226. package/components/Mutation/AddToCartFormik.js +171 -171
  227. package/components/Mutation/DecrementQuantity.d.ts +4 -4
  228. package/components/Mutation/DecrementQuantity.js +34 -34
  229. package/components/Mutation/IncrementQuantity.d.ts +4 -4
  230. package/components/Mutation/IncrementQuantity.js +34 -34
  231. package/components/Mutation/RemoveFromCart.d.ts +5 -5
  232. package/components/Mutation/RemoveFromCart.js +51 -51
  233. package/components/Mutation/SetQuantity.d.ts +4 -4
  234. package/components/Mutation/SetQuantity.js +36 -36
  235. package/components/Mutation/SubscribeToNewsletter.d.ts +4 -4
  236. package/components/Mutation/SubscribeToNewsletter.js +29 -29
  237. package/components/Mutation/SubscribeToStockNotifications.d.ts +4 -4
  238. package/components/Mutation/SubscribeToStockNotifications.js +30 -30
  239. package/components/Mutation/cartMutationUtils.d.ts +28 -28
  240. package/components/Mutation/cartMutationUtils.js +108 -108
  241. package/components/Mutation/cartMutationUtils.spec.js +142 -142
  242. package/components/Mutation/useDecrementQuantity.d.ts +11 -11
  243. package/components/Mutation/useDecrementQuantity.js +53 -53
  244. package/components/Mutation/useIncrementQuantity.d.ts +11 -11
  245. package/components/Mutation/useIncrementQuantity.js +53 -53
  246. package/components/Mutation/useRemoveFromCart.d.ts +13 -13
  247. package/components/Mutation/useRemoveFromCart.js +49 -49
  248. package/components/Mutation/useSetQuantity.d.ts +12 -12
  249. package/components/Mutation/useSetQuantity.js +37 -37
  250. package/components/Notifications/Notifications.d.ts +15 -15
  251. package/components/Notifications/Notifications.js +26 -26
  252. package/components/Notifications/index.d.ts +2 -2
  253. package/components/Notifications/index.js +2 -2
  254. package/components/Notifications/notificationMachine.d.ts +30 -30
  255. package/components/Notifications/notificationMachine.js +73 -73
  256. package/components/Notifications/notificationsMachine.d.ts +37 -37
  257. package/components/Notifications/notificationsMachine.js +65 -65
  258. package/components/Notifications/useNotification.d.ts +9 -9
  259. package/components/Notifications/useNotification.js +26 -26
  260. package/components/OpenGraph/OpenGraph.test.js +180 -180
  261. package/components/OpenGraph/OpenGraphGeneralPageData.d.ts +25 -25
  262. package/components/OpenGraph/OpenGraphGeneralPageData.js +36 -36
  263. package/components/OpenGraph/OpenGraphGeneralPageData.js.map +1 -1
  264. package/components/OpenGraph/OpenGraphProductData.d.ts +25 -25
  265. package/components/OpenGraph/OpenGraphProductData.js +48 -48
  266. package/components/OpenGraph/OpenGraphProductData.js.map +1 -1
  267. package/components/OpenGraph/index.d.ts +2 -2
  268. package/components/OpenGraph/index.js +2 -2
  269. package/components/Pagination/PaginationContainer.d.ts +2 -2
  270. package/components/Pagination/PaginationContainer.js +4 -4
  271. package/components/Pagination/PaginationContext.d.ts +14 -14
  272. package/components/Pagination/PaginationContext.js +3 -3
  273. package/components/Pagination/PaginationProvider.d.ts +19 -19
  274. package/components/Pagination/PaginationProvider.js +94 -94
  275. package/components/Pagination/PaginationProvider.test.js +282 -282
  276. package/components/PreviewContext.d.ts +10 -10
  277. package/components/PreviewContext.js +26 -26
  278. package/components/ProductConfigurationProvider/ConfigPrice.gql +22 -22
  279. package/components/ProductConfigurationProvider/ProductConfigurationContext.d.ts +13 -13
  280. package/components/ProductConfigurationProvider/ProductConfigurationContext.js +4 -4
  281. package/components/ProductConfigurationProvider/ProductConfigurationProvider.d.ts +6 -6
  282. package/components/ProductConfigurationProvider/ProductConfigurationProvider.js +49 -49
  283. package/components/Query/CartProvider.d.ts +22 -22
  284. package/components/Query/CartProvider.js +67 -67
  285. package/components/SortOrder/SortOrderContainer.d.ts +40 -40
  286. package/components/SortOrder/SortOrderContainer.js +101 -101
  287. package/components/SortOrder/SortOrderContext.d.ts +9 -9
  288. package/components/SortOrder/SortOrderContext.js +8 -8
  289. package/components/StructuredData/SiteLinksSearchStructuredData.d.ts +3 -3
  290. package/components/StructuredData/SiteLinksSearchStructuredData.js +24 -24
  291. package/components/StructuredData/StructuredBreadcrumbData.d.ts +12 -12
  292. package/components/StructuredData/StructuredBreadcrumbData.js +54 -54
  293. package/components/StructuredData/StructuredCategoryData.d.ts +16 -16
  294. package/components/StructuredData/StructuredCategoryData.js +17 -17
  295. package/components/StructuredData/StructuredData.d.ts +9 -9
  296. package/components/StructuredData/StructuredData.js +6 -6
  297. package/components/StructuredData/StructuredPageData.d.ts +16 -16
  298. package/components/StructuredData/StructuredPageData.js +16 -16
  299. package/components/StructuredData/StructuredProductData.d.ts +18 -18
  300. package/components/StructuredData/StructuredProductData.js +42 -42
  301. package/components/StructuredData/StructuredProductData.test.js +130 -130
  302. package/components/StructuredData/index.d.ts +5 -5
  303. package/components/StructuredData/index.js +5 -5
  304. package/data/cache.d.ts +3 -3
  305. package/data/cache.js +20 -20
  306. package/data/fragmentTypes.d.ts +8 -8
  307. package/data/fragmentTypes.js +83 -83
  308. package/data/fragments/BadgeFragment.gql +7 -7
  309. package/data/fragments/CartCoreFragment.gql +89 -89
  310. package/data/fragments/ChannelsFragment.gql +59 -58
  311. package/data/fragments/CommentsFragment.gql +6 -6
  312. package/data/fragments/HeadFragment.gql +9 -9
  313. package/data/fragments/PriceFragment.gql +5 -5
  314. package/data/fragments/ProductCampaignFragment.gql +10 -10
  315. package/data/fragments/ProductConfigurationsFragment.gql +24 -24
  316. package/data/fragments/ProductListsFragments.gql +94 -94
  317. package/data/fragments/ProductMetadataFragment.gql +20 -20
  318. package/data/fragments/ProductPriceFragment.gql +10 -10
  319. package/data/fragments/ProductVariantPriceFragment.gql +10 -10
  320. package/data/fragments/RouteCrumbFragment.gql +20 -20
  321. package/data/fragments/RouteMetaFragment.gql +18 -18
  322. package/data/fragments/StockStatusFragment.gql +7 -7
  323. package/data/fragments/index.d.ts +1 -1
  324. package/data/fragments/index.js +1 -1
  325. package/data/mutations/accountMutations.gql +28 -28
  326. package/data/mutations/cartMutations.gql +41 -41
  327. package/data/mutations/productListMutations.gql +18 -18
  328. package/data/mutations/signup.gql +7 -7
  329. package/data/mutations/subscribeToNewsletter.gql +3 -3
  330. package/data/mutations/subscribeToStockNotifications.gql +6 -6
  331. package/data/mutations/updateCustomer.gql +5 -5
  332. package/data/mutations/updatePassword.gql +5 -5
  333. package/data/queries/CartMutationQuery.gql +36 -36
  334. package/data/queries/CartQuery.gql +7 -7
  335. package/data/queries/GetCustomerCountryCode.gql +9 -9
  336. package/data/queries/PersonLookupQuery.gql +28 -28
  337. package/data/queries/ProductLists.gql +8 -8
  338. package/dependencies.d.ts +104 -104
  339. package/errorReporting.browser.d.ts +3 -3
  340. package/errorReporting.browser.js +11 -11
  341. package/errorReporting.d.ts +3 -3
  342. package/errorReporting.js +19 -19
  343. package/errorReporting.server.d.ts +3 -3
  344. package/errorReporting.server.js +11 -11
  345. package/errorReporting.shared.d.ts +5 -5
  346. package/errorReporting.shared.js +16 -16
  347. package/experiments/ExperimentsProvider.d.ts +4 -4
  348. package/experiments/ExperimentsProvider.js +28 -28
  349. package/experiments/ExperimentsProvider.test.js +105 -105
  350. package/experiments/integration.test.js +76 -76
  351. package/experiments/selectExperimentVariant.d.ts +3 -3
  352. package/experiments/selectExperimentVariant.js +34 -34
  353. package/experiments/selectExperimentVariant.test.js +64 -64
  354. package/experiments/useExperiment.d.ts +2 -2
  355. package/experiments/useExperiment.js +10 -10
  356. package/experiments/useExperiment.test.js +100 -100
  357. package/global.d.ts +1 -1
  358. package/helpers/decodeUrlQuery.d.ts +9 -9
  359. package/helpers/decodeUrlQuery.js +26 -26
  360. package/helpers/decodeUrlQuery.test.js +54 -54
  361. package/helpers/distance.d.ts +7 -7
  362. package/helpers/distance.js +12 -12
  363. package/helpers/encodeVariant.d.ts +3 -3
  364. package/helpers/encodeVariant.js +24 -24
  365. package/helpers/getBreakpointsFromValues.d.ts +6 -6
  366. package/helpers/getBreakpointsFromValues.js +14 -14
  367. package/helpers/getBreakpointsFromValues.test.js +47 -47
  368. package/helpers/getCartItemVariant.d.ts +7 -7
  369. package/helpers/getCartItemVariant.js +8 -8
  370. package/helpers/getErrorDetail.d.ts +7 -7
  371. package/helpers/getErrorDetail.js +11 -11
  372. package/helpers/getErrorDetail.test.js +44 -44
  373. package/helpers/getHeaders.d.ts +6 -6
  374. package/helpers/getHeaders.js +3 -3
  375. package/helpers/isRelativeUrl.d.ts +1 -1
  376. package/helpers/isRelativeUrl.js +3 -3
  377. package/helpers/logError.d.ts +1 -1
  378. package/helpers/logError.js +16 -16
  379. package/helpers/logWarningInDev.d.ts +1 -1
  380. package/helpers/logWarningInDev.js +6 -6
  381. package/helpers/throwErrorInDev.d.ts +6 -6
  382. package/helpers/throwErrorInDev.js +14 -14
  383. package/helpers/uniqueId.d.ts +5 -5
  384. package/helpers/uniqueId.js +9 -9
  385. package/hooks/CartCheckoutQuery.gql +5 -5
  386. package/hooks/Channels/useChannelSettings.d.ts +7 -7
  387. package/hooks/Channels/useChannelSettings.js +11 -11
  388. package/hooks/Channels/useChannelSettings.js.map +1 -1
  389. package/hooks/Channels/useChannelSettings.test.js +51 -51
  390. package/hooks/Filters/useBooleanFilter.d.ts +8 -8
  391. package/hooks/Filters/useBooleanFilter.js +20 -20
  392. package/hooks/Filters/useFilters.d.ts +3 -3
  393. package/hooks/Filters/useFilters.js +15 -15
  394. package/hooks/Filters/useListFilter.d.ts +10 -10
  395. package/hooks/Filters/useListFilter.js +37 -37
  396. package/hooks/Filters/useMultiFilter.d.ts +13 -13
  397. package/hooks/Filters/useMultiFilter.js +49 -49
  398. package/hooks/Filters/useRangeFilter.d.ts +10 -10
  399. package/hooks/Filters/useRangeFilter.js +35 -35
  400. package/hooks/Filters/useSortOrder.d.ts +11 -11
  401. package/hooks/Filters/useSortOrder.js +21 -21
  402. package/hooks/FreeShippingQuery.gql +16 -16
  403. package/hooks/PackageProducts/index.d.ts +2 -2
  404. package/hooks/PackageProducts/index.js +2 -2
  405. package/hooks/PackageProducts/packagePriceQuery.gql +29 -29
  406. package/hooks/PackageProducts/usePackageProductItem.d.ts +17 -17
  407. package/hooks/PackageProducts/usePackageProductItem.js +26 -26
  408. package/hooks/PackageProducts/usePackageProducts.d.ts +19 -19
  409. package/hooks/PackageProducts/usePackageProducts.js +345 -345
  410. package/hooks/PackageProducts/usePackageProducts.test.js +383 -383
  411. package/hooks/Product/index.d.ts +1 -1
  412. package/hooks/Product/index.js +1 -1
  413. package/hooks/Product/useStockStatus.d.ts +9 -9
  414. package/hooks/Product/useStockStatus.js +25 -25
  415. package/hooks/Product/useSwitchToVariantImage.d.ts +9 -9
  416. package/hooks/Product/useSwitchToVariantImage.js +20 -20
  417. package/hooks/ProductList/ProductListContext.d.ts +7 -7
  418. package/hooks/ProductList/ProductListContext.js +110 -110
  419. package/hooks/ProductList/action-creators.d.ts +46 -46
  420. package/hooks/ProductList/action-creators.js +296 -296
  421. package/hooks/ProductList/index.d.ts +118 -118
  422. package/hooks/ProductList/index.js +21 -21
  423. package/hooks/ProductList/list-transforms.d.ts +73 -73
  424. package/hooks/ProductList/list-transforms.js +106 -106
  425. package/hooks/ProductList/list-transforms.test.js +489 -489
  426. package/hooks/ProductList/product-list-reducer.d.ts +76 -76
  427. package/hooks/ProductList/product-list-reducer.js +197 -197
  428. package/hooks/ProductList/product-list-reducer.test.js +464 -464
  429. package/hooks/ProductList/useProductList.d.ts +13 -13
  430. package/hooks/ProductList/useProductList.js +93 -93
  431. package/hooks/ProductList/useProductListItems.d.ts +10 -10
  432. package/hooks/ProductList/useProductListItems.js +48 -48
  433. package/hooks/ProductList/validate-product.d.ts +6 -6
  434. package/hooks/ProductList/validate-product.js +40 -40
  435. package/hooks/Subscriptions/useNewsletterSubscription.d.ts +38 -38
  436. package/hooks/Subscriptions/useNewsletterSubscription.js +41 -41
  437. package/hooks/Subscriptions/useStockNotifications.d.ts +36 -36
  438. package/hooks/Subscriptions/useStockNotifications.js +37 -37
  439. package/hooks/Subscriptions/useStoreSubscriptions.d.ts +48 -48
  440. package/hooks/Subscriptions/useStoreSubscriptions.js +150 -150
  441. package/hooks/Subscriptions/useStoresubscriptions.test.js +179 -179
  442. package/hooks/useAddMultipleToCart.d.ts +27 -27
  443. package/hooks/useAddMultipleToCart.js +113 -113
  444. package/hooks/useAddMultipleToCart.test.js +181 -181
  445. package/hooks/useChannelBanner.js +22 -22
  446. package/hooks/useChannelBanner.test.js +77 -77
  447. package/hooks/useCustomerOrders.test.js +176 -176
  448. package/hooks/useCustomerOrdersQuery.d.ts +21 -21
  449. package/hooks/useCustomerOrdersQuery.js +20 -20
  450. package/hooks/useDeleteAccountMutation.d.ts +15 -15
  451. package/hooks/useDeleteAccountMutation.js +38 -38
  452. package/hooks/useDynamicPrice.d.ts +3 -3
  453. package/hooks/useDynamicPrice.js +24 -24
  454. package/hooks/useFreeShippingCheck.d.ts +15 -15
  455. package/hooks/useFreeShippingCheck.js +30 -30
  456. package/hooks/useGeolocation.d.ts +11 -11
  457. package/hooks/useGeolocation.js +33 -33
  458. package/hooks/useInfinitePagination.d.ts +37 -37
  459. package/hooks/useInfinitePagination.js +138 -138
  460. package/hooks/useLogError.d.ts +1 -1
  461. package/hooks/useLogError.js +7 -7
  462. package/hooks/useLoginMutation.d.ts +12 -12
  463. package/hooks/useLoginMutation.js +14 -14
  464. package/hooks/useLoginRedirect.d.ts +4 -4
  465. package/hooks/useLoginRedirect.js +36 -36
  466. package/hooks/useOrderDetailQuery.d.ts +20 -20
  467. package/hooks/useOrderDetailQuery.js +28 -28
  468. package/hooks/usePreconnectLinks.d.ts +10 -10
  469. package/hooks/usePreconnectLinks.js +29 -29
  470. package/hooks/usePreconnectLinks.test.js +95 -95
  471. package/hooks/usePrice.d.ts +39 -39
  472. package/hooks/usePrice.js +71 -71
  473. package/hooks/usePrice.test.js +171 -171
  474. package/hooks/useProductVariants/index.d.ts +1 -1
  475. package/hooks/useProductVariants/index.js +1 -1
  476. package/hooks/useProductVariants/useProductVariants.d.ts +19 -19
  477. package/hooks/useProductVariants/useProductVariants.js +202 -202
  478. package/hooks/useProductVariants/useProductVariants.test.js +415 -415
  479. package/hooks/useProductVariants/useVariantFromUrl.d.ts +5 -5
  480. package/hooks/useProductVariants/useVariantFromUrl.js +15 -15
  481. package/hooks/useProductVariants/useVariantFromUrl.test.js +79 -79
  482. package/hooks/useRoutePreload.d.ts +24 -24
  483. package/hooks/useRoutePreload.js +39 -39
  484. package/hooks/useShopConfig.d.ts +1 -1
  485. package/hooks/useShopConfig.js +10 -10
  486. package/hooks/useShopConfig.js.map +1 -1
  487. package/hooks/useThrowErrorInDev.d.ts +1 -1
  488. package/hooks/useThrowErrorInDev.js +7 -7
  489. package/hooks/useThunkReducer.d.ts +7 -7
  490. package/hooks/useThunkReducer.js +23 -23
  491. package/hooks/useWarningInDev.d.ts +1 -1
  492. package/hooks/useWarningInDev.js +9 -9
  493. package/inServer.d.ts +1 -1
  494. package/inServer.js +2 -2
  495. package/index.d.ts +1 -1
  496. package/index.js +1 -1
  497. package/integrations/addwishSchemaExtension.d.ts +35 -35
  498. package/integrations/addwishSchemaExtension.js +140 -140
  499. package/integrations/nostoSchemaExtension.d.ts +5 -5
  500. package/integrations/nostoSchemaExtension.js +76 -76
  501. package/integrations/sluggishSchemaExtension.d.ts +2 -2
  502. package/integrations/sluggishSchemaExtension.js +26 -26
  503. package/package.json +2 -2
  504. package/polyfills.d.ts +1 -1
  505. package/polyfills.js +37 -37
  506. package/registerServiceWorker.js +110 -110
  507. package/resolvers/filters/boolFilter.d.ts +3 -3
  508. package/resolvers/filters/boolFilter.js +84 -84
  509. package/resolvers/filters/defaultActiveFilters.d.ts +3 -3
  510. package/resolvers/filters/defaultActiveFilters.js +8 -8
  511. package/resolvers/filters/filterParams.d.ts +3 -3
  512. package/resolvers/filters/filterParams.js +84 -84
  513. package/resolvers/filters/filters.d.ts +5 -5
  514. package/resolvers/filters/filters.js +78 -78
  515. package/resolvers/filters/index.d.ts +27 -27
  516. package/resolvers/filters/index.js +7 -7
  517. package/resolvers/filters/listFilter.d.ts +7 -7
  518. package/resolvers/filters/listFilter.js +73 -73
  519. package/resolvers/filters/listFilterItem.d.ts +3 -3
  520. package/resolvers/filters/listFilterItem.js +122 -122
  521. package/resolvers/filters/multiListFilter.d.ts +5 -5
  522. package/resolvers/filters/multiListFilter.js +195 -195
  523. package/resolvers/filters/multiListFilterList.d.ts +3 -3
  524. package/resolvers/filters/multiListFilterList.js +55 -55
  525. package/resolvers/filters/rangeFilter.d.ts +5 -5
  526. package/resolvers/filters/rangeFilter.js +137 -137
  527. package/resolvers/filters/updateQueryString.d.ts +12 -12
  528. package/resolvers/filters/updateQueryString.js +116 -116
  529. package/resolvers/index.d.ts +37 -37
  530. package/resolvers/index.js +37 -37
  531. package/scripts/dev-apolloServer.js +31 -31
  532. package/sentry/client.d.ts +1 -1
  533. package/sentry/client.js +29 -29
  534. package/sentry/common.d.ts +1 -1
  535. package/sentry/common.js +4 -4
  536. package/sentry/server.d.ts +1 -1
  537. package/sentry/server.js +19 -19
  538. package/sentry/utils.d.ts +1 -1
  539. package/sentry/utils.js +1 -1
  540. package/server/graphql.d.ts +20 -20
  541. package/server/graphql.js +118 -118
  542. package/server/graphql.test.js +123 -123
  543. package/server/index.d.ts +2 -2
  544. package/server/index.js +2 -2
  545. package/server/tracking/facebook.d.ts +5 -5
  546. package/server/tracking/facebook.js +132 -132
  547. package/server/tracking/middleware.d.ts +8 -8
  548. package/server/tracking/middleware.js +14 -14
  549. package/server/tracking/types.d.ts +33 -33
  550. package/setupTests.js +2 -2
  551. package/test-utils/ProviderPyramid.js +45 -45
  552. package/test-utils/mockShopConfig.js +26 -26
  553. package/test-utils/mockedProduct.js +253 -253
  554. package/test-utils/renderWithRouter.js +20 -20
  555. package/test-utils/variables.js +2465 -1231
  556. package/time.d.ts +1 -1
  557. package/time.js +5 -5
@@ -1,267 +1,373 @@
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) {
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
+ function getGroupedChannelsByUrl({ url, channels, singleDomainMode, cookies, geoipCountry }) {
195
+ const hasGroupedChannels = allChannelsGrouped(channels);
196
+ if (!hasGroupedChannels) {
197
+ return {
198
+ hasGroupedChannels,
199
+ groupByChannel: undefined
200
+ };
201
+ }
202
+ switch (true) {
203
+ case isInDev(url): {
204
+ if (singleDomainMode) {
205
+ const currentBaseUrl = getURLBasename(new URL(url));
206
+ // -> se, de, dk, es etcetc
207
+ return {
208
+ hasGroupedChannels,
209
+ groupByChannel: channels.find((channel) =>
210
+ // We always split channel.url to consider if trailing slashes are added in as BaseUrl
211
+ sanitizeURL(channel.url).split('/')[1] === currentBaseUrl)
212
+ };
213
+ }
214
+ else {
215
+ // Try to match with anything during development + non-singledomain,
216
+ // this is b/c we can't match dev urls with any baseurl.
217
+ // If one wan't to test it in dev one can use the ?channel=XX param.
218
+ const { activeChannel, chosenChannel } = getCurrentChannel({
219
+ url,
220
+ singleDomainMode,
221
+ channels,
222
+ cookies,
223
+ geoipCountry
224
+ });
225
+ return {
226
+ hasGroupedChannels,
227
+ // Active channel is given first priority. If it is null we are most likely in staging or development so chosenChannel or defaultChannel is used
228
+ groupByChannel: activeChannel || chosenChannel || getDefaultChannel(channels)
229
+ };
230
+ }
231
+ }
232
+ case singleDomainMode: {
233
+ const currentBaseUrl = sanitizeURL(url).split('/', 2);
234
+ // -> se, de, dk, es etcetc
235
+ return {
236
+ hasGroupedChannels,
237
+ groupByChannel: channels.find((channel) =>
238
+ // We always split channel.url to consider if trailing slashes are added in as BaseUrl
239
+ sanitizeURL(channel.url).split('/')[1] === currentBaseUrl[1]) || getDefaultChannel(channels)
240
+ };
241
+ }
242
+ default: {
243
+ const currentBaseUrl = sanitizeURL(url).split('/')[0];
244
+ // -> domain.com
245
+ return {
246
+ hasGroupedChannels,
247
+ groupByChannel: channels.find((channel) =>
248
+ // We always split channel.url to consider if trailing slashes are added in as BaseUrl
249
+ sanitizeURL(channel.url).split('/')[0] === currentBaseUrl)
250
+ };
251
+ }
252
+ }
253
+ }
254
+ // Is where we determine current channel to get return values in getSelectedAndRecommendedChannel
255
+ function getCurrentChannel({ url, singleDomainMode, channels, cookies, geoipCountry }) {
256
+ const { activeChannel, activeChannels } = getChannelFromPathOrUrl({
257
+ url,
258
+ singleDomainMode,
259
+ channels
260
+ });
261
+ const chosenChannel = getChannelFromCookies({
262
+ cookies,
263
+ channels
264
+ });
265
+ const channelFromGeoIp = findChannelByCountry(geoipCountry || cookies.get('geoipCountry'), channels);
266
+ // But have default channel as fallback,
267
+ const defaultChannel = getDefaultChannel(channels);
268
+ return {
269
+ activeChannel,
270
+ activeChannels,
271
+ chosenChannel,
272
+ channelFromGeoIp,
273
+ defaultChannel
274
+ };
275
+ }
276
+ export function getSelectedAndRecommendedChannel({ url, singleDomainMode, channels, cookies, geoipCountry, acceptedLanguages, disableGeoRedirect }) {
277
+ setCookiesFromQueryString({ cookies, url });
278
+ const { hasGroupedChannels, groupByChannel } = getGroupedChannelsByUrl({
279
+ url,
280
+ channels,
281
+ singleDomainMode,
282
+ cookies,
283
+ geoipCountry
284
+ });
285
+ // If available, use channel group from here on
286
+ // NB: All channels must be grouped and groupName is nullable.
287
+ const availableChannels = hasGroupedChannels && (groupByChannel === null || groupByChannel === void 0 ? void 0 : groupByChannel.groupName)
288
+ ? getGroupedChannels(channels, {
289
+ groupName: groupByChannel.groupName
290
+ })
291
+ : channels;
292
+ const { defaultChannel, chosenChannel, activeChannel, activeChannels, channelFromGeoIp } = getCurrentChannel({
293
+ url,
294
+ singleDomainMode,
295
+ channels: availableChannels,
296
+ cookies,
297
+ geoipCountry
298
+ });
299
+ // Active channel is given first priority. If it is null we are most likely in staging or development so chosenChannel or defaultChannel is used
300
+ const pureChannel = activeChannel || chosenChannel || defaultChannel;
301
+ let redirect = false;
302
+ let pureRecommendedChannel;
303
+ // If a channel has been chosen we want to redirect to it
304
+ if (chosenChannel &&
305
+ activeChannel &&
306
+ activeChannel.id !== chosenChannel.id &&
307
+ // We don't want to redirect if the URLs of the channels are the same (i.e. demostore)
308
+ chosenChannel.url !== activeChannel.url) {
309
+ redirect = true;
310
+ pureRecommendedChannel = chosenChannel;
311
+ }
312
+ else if (channelFromGeoIp && pureChannel.id !== channelFromGeoIp.id) {
313
+ pureRecommendedChannel = channelFromGeoIp;
314
+ redirect = !disableGeoRedirect && !chosenChannel;
315
+ // 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
316
+ }
317
+ else if (!activeChannel &&
318
+ singleDomainMode &&
319
+ activeChannels.length === 0) {
320
+ redirect = true;
321
+ pureRecommendedChannel = pureChannel;
322
+ }
323
+ // disable all redirects if either redirectDisabled or articlenumber (product previews) is in the query string
324
+ const { redirectDisabled, articlenumber } = getQueryObject(url);
325
+ if (redirectDisabled || articlenumber) {
326
+ redirect = false;
327
+ }
328
+ // 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
329
+ const acceptLanguageCulture = acceptedLanguages &&
330
+ getCultureFromAcceptLanguages({
331
+ channel: pureChannel,
332
+ acceptedLanguages
333
+ });
334
+ // set geoip and acceptLanguage as cookies so we can retrieve them on the client
335
+ setGeoIpAndAcceptLanguageCookies({
336
+ cookies,
337
+ geoipCountry,
338
+ acceptLanguageCulture
339
+ });
340
+ const { cultureFromCookie, currencyFromCookie, countryFromCookie } = getChannelFieldsFromCookies(cookies);
341
+ const urlBasenameLanguage = getURLLanguageBasename({
342
+ url: new URL(url),
343
+ singleDomainMode
344
+ });
345
+ const selectedChannel = createSelectedChannel(pureChannel, cultureFromCookie, currencyFromCookie, countryFromCookie, urlBasenameLanguage);
346
+ if (!selectedChannel.language.isDefault &&
347
+ getLanguageFromCulture(selectedChannel.language.culture) !==
348
+ urlBasenameLanguage) {
349
+ redirect = true;
350
+ pureRecommendedChannel = pureChannel;
351
+ }
352
+ const recommendedChannel = pureRecommendedChannel &&
353
+ createSelectedChannel(pureRecommendedChannel, cultureFromCookie, currencyFromCookie, countryFromCookie, urlBasenameLanguage);
354
+ return {
355
+ redirect,
356
+ selectedChannel,
357
+ recommendedChannel,
358
+ // for testing purposes mainly
359
+ channels: availableChannels
360
+ };
361
+ }
362
+ export function getChannelHeaders(channel) {
363
+ return channel
364
+ ? {
365
+ currency: channel.currency.id,
366
+ channelid: channel.id,
367
+ culture: channel.language.culture,
368
+ country: channel.country.code,
369
+ name: channel.name
370
+ }
371
+ : {};
372
+ }
267
373
  //# sourceMappingURL=channelUtils.js.map