@jetshop/core 5.13.2 → 5.13.12-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 (543) hide show
  1. package/ChannelHandler/CategoryPathnameRedirectQuery.gql +9 -9
  2. package/ChannelHandler/ChannelHandler.d.ts +50 -50
  3. package/ChannelHandler/ChannelHandler.js +108 -108
  4. package/ChannelHandler/PagePathnameRedirectQuery.gql +9 -9
  5. package/ChannelHandler/PreserveRedirectRouteQuery.gql +19 -19
  6. package/ChannelHandler/ProductPathnameRedirectQuery.gql +9 -9
  7. package/ChannelHandler/StartPagePathnameRedirectQuery.gql +9 -9
  8. package/ChannelHandler/channelUtils.d.ts +68 -68
  9. package/ChannelHandler/channelUtils.js +266 -266
  10. package/ChannelHandler/redirectUtils.d.ts +4 -4
  11. package/ChannelHandler/redirectUtils.js +49 -49
  12. package/ChannelHandler/redirectUtils.test.js +538 -538
  13. package/analytics/Analytics.d.ts +18 -18
  14. package/analytics/Analytics.js +56 -56
  15. package/analytics/Analytics.js.map +1 -1
  16. package/analytics/AnalyticsProvider.d.ts +42 -42
  17. package/analytics/AnalyticsProvider.js +177 -177
  18. package/analytics/deprecatedTracking.d.ts +17 -17
  19. package/analytics/deprecatedTracking.js +32 -32
  20. package/analytics/integrations/ga4.d.ts +23 -23
  21. package/analytics/integrations/ga4.js +145 -145
  22. package/analytics/integrations/gtag/gtag.d.ts +8 -8
  23. package/analytics/integrations/gtag/gtag.js +180 -180
  24. package/analytics/integrations/gtag/index.d.ts +1 -1
  25. package/analytics/integrations/gtag/index.js +1 -1
  26. package/analytics/integrations/gtm/index.d.ts +12 -12
  27. package/analytics/integrations/gtm/index.js +200 -200
  28. package/analytics/integrations/gtm/referrerModifier.d.ts +1 -1
  29. package/analytics/integrations/gtm/referrerModifier.js +61 -61
  30. package/analytics/integrations/releware/index.d.ts +3 -3
  31. package/analytics/integrations/releware/index.js +38 -38
  32. package/analytics/integrations/unslugify.d.ts +1 -1
  33. package/analytics/integrations/unslugify.js +17 -17
  34. package/analytics/trackerRegistry.d.ts +101 -101
  35. package/analytics/trackerRegistry.js +219 -219
  36. package/analytics/trackerRegistry.test.js +160 -160
  37. package/analytics/tracking.d.ts +14 -14
  38. package/analytics/tracking.js +71 -71
  39. package/analytics/utils/breadcrumbsWithoutProduct.d.ts +1 -1
  40. package/analytics/utils/breadcrumbsWithoutProduct.js +8 -8
  41. package/analytics/utils/script.d.ts +8 -8
  42. package/analytics/utils/script.js +39 -39
  43. package/analytics/webVitals.d.ts +5 -5
  44. package/analytics/webVitals.js +38 -38
  45. package/boot/AuthHandler.d.ts +14 -14
  46. package/boot/AuthHandler.js +38 -38
  47. package/boot/ChannelsQuery.gql +7 -7
  48. package/boot/PreviewHandler.d.ts +7 -7
  49. package/boot/PreviewHandler.js +13 -13
  50. package/boot/SharedTree.d.ts +25 -25
  51. package/boot/SharedTree.js +28 -28
  52. package/boot/addMissingConfig.d.ts +5 -5
  53. package/boot/addMissingConfig.js +33 -33
  54. package/boot/apollo.d.ts +21 -21
  55. package/boot/apollo.js +197 -197
  56. package/boot/client/entrypoint.d.ts +1 -1
  57. package/boot/client/entrypoint.js +4 -4
  58. package/boot/client/index.d.ts +1 -1
  59. package/boot/client/index.js +1 -1
  60. package/boot/client/startClient.d.ts +4 -4
  61. package/boot/client/startClient.js +142 -142
  62. package/boot/client-schema.gql +59 -59
  63. package/boot/server/IntervalQuery.d.ts +32 -32
  64. package/boot/server/IntervalQuery.js +94 -94
  65. package/boot/server/IntervalQuery.test.js +280 -280
  66. package/boot/server/PersistedApolloClient.d.ts +20 -20
  67. package/boot/server/PersistedApolloClient.js +39 -39
  68. package/boot/server/PersistedApolloClient.test.js +233 -233
  69. package/boot/server/asyncErrorHandler.d.ts +3 -3
  70. package/boot/server/asyncErrorHandler.js +4 -4
  71. package/boot/server/breakpointMiddleware.d.ts +3 -3
  72. package/boot/server/breakpointMiddleware.js +9 -9
  73. package/boot/server/createApolloServer.d.ts +28 -28
  74. package/boot/server/createApolloServer.js +143 -143
  75. package/boot/server/createApolloServer.test.js +114 -114
  76. package/boot/server/createDevServer.d.ts +14 -14
  77. package/boot/server/createDevServer.js +29 -29
  78. package/boot/server/createRenderer.d.ts +28 -28
  79. package/boot/server/createRenderer.js +235 -235
  80. package/boot/server/createServer.d.ts +14 -14
  81. package/boot/server/createServer.js +41 -41
  82. package/boot/server/entrypoint.d.ts +1 -1
  83. package/boot/server/entrypoint.js +35 -35
  84. package/boot/server/getPrefetchFiles.d.ts +10 -10
  85. package/boot/server/getPrefetchFiles.js +19 -19
  86. package/boot/server/getPreloadAssets.d.ts +10 -10
  87. package/boot/server/getPreloadAssets.js +17 -17
  88. package/boot/server/getPreloadAssets.test.js +133 -133
  89. package/boot/server/index.d.ts +9 -9
  90. package/boot/server/index.js +122 -122
  91. package/boot/server/listen.d.ts +13 -13
  92. package/boot/server/listen.js +16 -16
  93. package/boot/server/overwriteServerIntl.js +1 -1
  94. package/boot/server/persistedQueries/PersistedClient.d.ts +22 -22
  95. package/boot/server/persistedQueries/PersistedClient.js +57 -57
  96. package/boot/server/persistedQueries/__tests__/getPersistedQueriesForRequest.test.js +201 -201
  97. package/boot/server/persistedQueries/__tests__/mockQuery.gql +6 -6
  98. package/boot/server/persistedQueries/getPersistedQueriesForRequest.d.ts +3 -3
  99. package/boot/server/persistedQueries/getPersistedQueriesForRequest.js +26 -26
  100. package/boot/server/saleSource.test.js +39 -39
  101. package/boot/server/salesSource.d.ts +8 -8
  102. package/boot/server/salesSource.js +15 -15
  103. package/boot/utils/__tests__/uid.js +47 -47
  104. package/boot/utils/createIntOptions.d.ts +6 -6
  105. package/boot/utils/createIntOptions.js +18 -18
  106. package/boot/utils/queryLoggingMiddleware.d.ts +2 -2
  107. package/boot/utils/queryLoggingMiddleware.js +14 -14
  108. package/boot/utils/uid.d.ts +3 -3
  109. package/boot/utils/uid.js +19 -19
  110. package/cart/AddToCartFormik.d.ts +42 -42
  111. package/cart/AddToCartFormik.js +76 -76
  112. package/cart/useAddToCart.d.ts +88 -88
  113. package/cart/useAddToCart.js +117 -117
  114. package/ci/.gitlab-ci.yml +3 -3
  115. package/components/Auth/CustomerUpdateForm.d.ts +32 -32
  116. package/components/Auth/CustomerUpdateForm.js +121 -121
  117. package/components/Auth/ForgotPasswordProvider.d.ts +71 -71
  118. package/components/Auth/ForgotPasswordProvider.js +56 -56
  119. package/components/Auth/ResetPasswordProvider.d.ts +88 -88
  120. package/components/Auth/ResetPasswordProvider.js +77 -77
  121. package/components/Auth/SSN.d.ts +12 -12
  122. package/components/Auth/SSN.js +34 -34
  123. package/components/Auth/SSNLookupContainer.d.ts +15 -15
  124. package/components/Auth/SSNLookupContainer.js +19 -19
  125. package/components/Auth/SignupFormContainer.d.ts +19 -19
  126. package/components/Auth/SignupFormContainer.js +81 -81
  127. package/components/Auth/UpdatePasswordForm.d.ts +44 -44
  128. package/components/Auth/UpdatePasswordForm.js +97 -97
  129. package/components/Auth/formFieldsFromSettings.d.ts +65 -65
  130. package/components/Auth/formFieldsFromSettings.js +76 -76
  131. package/components/Auth/formatSignupInput.d.ts +8 -8
  132. package/components/Auth/formatSignupInput.js +42 -42
  133. package/components/Auth/signup-context.d.ts +36 -36
  134. package/components/Auth/signup-context.js +71 -71
  135. package/components/Auth/signup-field-translations.d.ts +3 -3
  136. package/components/Auth/signup-field-translations.js +43 -43
  137. package/components/Auth/signupSubmit.d.ts +6 -6
  138. package/components/Auth/signupSubmit.js +56 -56
  139. package/components/Auth/useAddressFields.d.ts +22 -22
  140. package/components/Auth/useAddressFields.js +32 -32
  141. package/components/Auth/useAddressFields.test.js +294 -294
  142. package/components/Auth/useCustomer.d.ts +70 -70
  143. package/components/Auth/useCustomer.js +167 -167
  144. package/components/Auth/useLoginFields.d.ts +20 -20
  145. package/components/Auth/useLoginFields.js +20 -20
  146. package/components/Auth/useSignupForm.d.ts +7 -7
  147. package/components/Auth/useSignupForm.js +14 -14
  148. package/components/AuthContext/AuthContext.d.ts +8 -8
  149. package/components/AuthContext/AuthContext.js +8 -8
  150. package/components/AuthContext/AuthProvider.d.ts +6 -6
  151. package/components/AuthContext/AuthProvider.js +84 -84
  152. package/components/AuthContext/AuthProvider.test.js +66 -66
  153. package/components/AuthContext/LogOut.d.ts +5 -5
  154. package/components/AuthContext/LogOut.js +14 -14
  155. package/components/AuthContext/googleUserIdQuery.gql +6 -6
  156. package/components/AuthContext/useAuth.d.ts +6 -6
  157. package/components/AuthContext/useAuth.js +20 -20
  158. package/components/BreakpointProvider.d.ts +21 -21
  159. package/components/BreakpointProvider.js +23 -23
  160. package/components/Cart/CartIdContext.d.ts +11 -11
  161. package/components/Cart/CartIdContext.js +60 -60
  162. package/components/Cart/CartIdContext.test.js +87 -87
  163. package/components/ChannelContext/ChannelContext.d.ts +20 -20
  164. package/components/ChannelContext/ChannelContext.js +3 -3
  165. package/components/ChannelContext/ChannelProvider.d.ts +10 -10
  166. package/components/ChannelContext/ChannelProvider.js +42 -42
  167. package/components/ChannelContext/ChannelProvider.test.js +112 -112
  168. package/components/ChannelContext/CountrySettingsQuery.gql +34 -34
  169. package/components/ChannelContext/index.d.ts +2 -2
  170. package/components/ChannelContext/index.js +2 -2
  171. package/components/ChannelContext/useCountrySettings.d.ts +8 -8
  172. package/components/ChannelContext/useCountrySettings.js +23 -23
  173. package/components/ConfigProvider.d.ts +108 -108
  174. package/components/ConfigProvider.js +19 -19
  175. package/components/DynamicRoute/ActiveFiltersQuery.gql +21 -21
  176. package/components/DynamicRoute/CategoryRoute.d.ts +13 -13
  177. package/components/DynamicRoute/CategoryRoute.js +55 -55
  178. package/components/DynamicRoute/ContentRoute.d.ts +14 -14
  179. package/components/DynamicRoute/ContentRoute.js +27 -27
  180. package/components/DynamicRoute/PreviewRoute.d.ts +17 -17
  181. package/components/DynamicRoute/PreviewRoute.js +57 -57
  182. package/components/DynamicRoute/ProductByArticlenumber.d.ts +5 -5
  183. package/components/DynamicRoute/ProductByArticlenumber.gql +16 -16
  184. package/components/DynamicRoute/ProductByArticlenumber.js +21 -21
  185. package/components/DynamicRoute/ProductRoute.d.ts +15 -15
  186. package/components/DynamicRoute/ProductRoute.js +57 -57
  187. package/components/DynamicRoute/RouteResolver.d.ts +22 -22
  188. package/components/DynamicRoute/RouteResolver.js +64 -64
  189. package/components/DynamicRoute/Status.d.ts +14 -14
  190. package/components/DynamicRoute/Status.js +19 -19
  191. package/components/DynamicRoute/index.d.ts +17 -17
  192. package/components/DynamicRoute/index.js +95 -95
  193. package/components/Filters/index.d.ts +1 -1
  194. package/components/Filters/index.js +1 -1
  195. package/components/Filters/toggleActiveListItem.gql +15 -15
  196. package/components/Filters/utils/replaceInSearch.d.ts +14 -14
  197. package/components/Filters/utils/replaceInSearch.js +22 -22
  198. package/components/Filters/utils/replaceInSearch.test.js +184 -184
  199. package/components/Filters/utils/updateHistory.d.ts +25 -25
  200. package/components/Filters/utils/updateHistory.js +29 -29
  201. package/components/Filters/utils/updateHistory.test.js +102 -102
  202. package/components/Fonts/CustomFont.d.ts +14 -14
  203. package/components/Fonts/CustomFont.js +16 -16
  204. package/components/Fonts/GoogleFont.d.ts +10 -10
  205. package/components/Fonts/GoogleFont.js +34 -34
  206. package/components/Fonts/TypekitFont.d.ts +16 -16
  207. package/components/Fonts/TypekitFont.js +24 -24
  208. package/components/Fonts/injectFont.d.ts +11 -11
  209. package/components/Fonts/injectFont.js +29 -29
  210. package/components/Head.d.ts +11 -11
  211. package/components/Head.js +74 -74
  212. package/components/Mutation/AddToCart/addToCartUtils.d.ts +18 -18
  213. package/components/Mutation/AddToCart/addToCartUtils.js +51 -51
  214. package/components/Mutation/AddToCartFormik.d.ts +53 -53
  215. package/components/Mutation/AddToCartFormik.js +171 -171
  216. package/components/Mutation/DecrementQuantity.d.ts +4 -4
  217. package/components/Mutation/DecrementQuantity.js +34 -34
  218. package/components/Mutation/IncrementQuantity.d.ts +4 -4
  219. package/components/Mutation/IncrementQuantity.js +34 -34
  220. package/components/Mutation/RemoveFromCart.d.ts +5 -5
  221. package/components/Mutation/RemoveFromCart.js +51 -51
  222. package/components/Mutation/SetQuantity.d.ts +4 -4
  223. package/components/Mutation/SetQuantity.js +36 -36
  224. package/components/Mutation/SubscribeToNewsletter.d.ts +4 -4
  225. package/components/Mutation/SubscribeToNewsletter.js +29 -29
  226. package/components/Mutation/SubscribeToStockNotifications.d.ts +4 -4
  227. package/components/Mutation/SubscribeToStockNotifications.js +30 -30
  228. package/components/Mutation/cartMutationUtils.d.ts +28 -28
  229. package/components/Mutation/cartMutationUtils.js +108 -108
  230. package/components/Mutation/cartMutationUtils.spec.js +142 -142
  231. package/components/Mutation/useDecrementQuantity.d.ts +11 -11
  232. package/components/Mutation/useDecrementQuantity.js +53 -53
  233. package/components/Mutation/useIncrementQuantity.d.ts +11 -11
  234. package/components/Mutation/useIncrementQuantity.js +53 -53
  235. package/components/Mutation/useRemoveFromCart.d.ts +13 -13
  236. package/components/Mutation/useRemoveFromCart.js +49 -49
  237. package/components/Mutation/useSetQuantity.d.ts +12 -12
  238. package/components/Mutation/useSetQuantity.js +37 -37
  239. package/components/Notifications/Notifications.d.ts +15 -15
  240. package/components/Notifications/Notifications.js +26 -26
  241. package/components/Notifications/index.d.ts +2 -2
  242. package/components/Notifications/index.js +2 -2
  243. package/components/Notifications/notificationMachine.d.ts +30 -30
  244. package/components/Notifications/notificationMachine.js +73 -73
  245. package/components/Notifications/notificationsMachine.d.ts +37 -37
  246. package/components/Notifications/notificationsMachine.js +65 -65
  247. package/components/Notifications/useNotification.d.ts +9 -9
  248. package/components/Notifications/useNotification.js +26 -26
  249. package/components/OpenGraph/OpenGraph.test.js +180 -180
  250. package/components/OpenGraph/OpenGraphGeneralPageData.d.ts +25 -25
  251. package/components/OpenGraph/OpenGraphGeneralPageData.js +36 -36
  252. package/components/OpenGraph/OpenGraphProductData.d.ts +25 -25
  253. package/components/OpenGraph/OpenGraphProductData.js +48 -48
  254. package/components/OpenGraph/index.d.ts +2 -2
  255. package/components/OpenGraph/index.js +2 -2
  256. package/components/Pagination/PaginationContainer.d.ts +2 -2
  257. package/components/Pagination/PaginationContainer.js +4 -4
  258. package/components/Pagination/PaginationContext.d.ts +14 -14
  259. package/components/Pagination/PaginationContext.js +3 -3
  260. package/components/Pagination/PaginationProvider.d.ts +19 -19
  261. package/components/Pagination/PaginationProvider.js +94 -94
  262. package/components/Pagination/PaginationProvider.test.js +282 -282
  263. package/components/PreviewContext.d.ts +10 -10
  264. package/components/PreviewContext.js +26 -26
  265. package/components/ProductConfigurationProvider/ConfigPrice.gql +22 -22
  266. package/components/ProductConfigurationProvider/ProductConfigurationContext.d.ts +13 -13
  267. package/components/ProductConfigurationProvider/ProductConfigurationContext.js +4 -4
  268. package/components/ProductConfigurationProvider/ProductConfigurationProvider.d.ts +6 -6
  269. package/components/ProductConfigurationProvider/ProductConfigurationProvider.js +49 -49
  270. package/components/Query/CartProvider.d.ts +22 -22
  271. package/components/Query/CartProvider.js +67 -67
  272. package/components/SortOrder/SortOrderContainer.d.ts +40 -40
  273. package/components/SortOrder/SortOrderContainer.js +101 -101
  274. package/components/SortOrder/SortOrderContainer.js.map +1 -1
  275. package/components/SortOrder/SortOrderContext.d.ts +9 -9
  276. package/components/SortOrder/SortOrderContext.js +8 -8
  277. package/components/StructuredData/SiteLinksSearchStructuredData.d.ts +3 -3
  278. package/components/StructuredData/SiteLinksSearchStructuredData.js +24 -24
  279. package/components/StructuredData/StructuredBreadcrumbData.d.ts +12 -12
  280. package/components/StructuredData/StructuredBreadcrumbData.js +54 -54
  281. package/components/StructuredData/StructuredCategoryData.d.ts +16 -16
  282. package/components/StructuredData/StructuredCategoryData.js +17 -17
  283. package/components/StructuredData/StructuredData.d.ts +9 -9
  284. package/components/StructuredData/StructuredData.js +6 -6
  285. package/components/StructuredData/StructuredPageData.d.ts +16 -16
  286. package/components/StructuredData/StructuredPageData.js +16 -16
  287. package/components/StructuredData/StructuredProductData.d.ts +18 -18
  288. package/components/StructuredData/StructuredProductData.js +42 -42
  289. package/components/StructuredData/StructuredProductData.test.js +130 -130
  290. package/components/StructuredData/index.d.ts +5 -5
  291. package/components/StructuredData/index.js +5 -5
  292. package/data/cache.d.ts +3 -3
  293. package/data/cache.js +20 -20
  294. package/data/fragmentTypes.d.ts +8 -8
  295. package/data/fragmentTypes.js +83 -83
  296. package/data/fragments/BadgeFragment.gql +7 -7
  297. package/data/fragments/CartCoreFragment.gql +89 -89
  298. package/data/fragments/ChannelsFragment.gql +58 -58
  299. package/data/fragments/CommentsFragment.gql +6 -6
  300. package/data/fragments/HeadFragment.gql +9 -9
  301. package/data/fragments/PriceFragment.gql +5 -5
  302. package/data/fragments/ProductCampaignFragment.gql +10 -10
  303. package/data/fragments/ProductConfigurationsFragment.gql +24 -24
  304. package/data/fragments/ProductListsFragments.gql +94 -94
  305. package/data/fragments/ProductMetadataFragment.gql +20 -20
  306. package/data/fragments/ProductPriceFragment.gql +10 -10
  307. package/data/fragments/ProductVariantPriceFragment.gql +10 -10
  308. package/data/fragments/RouteCrumbFragment.gql +20 -20
  309. package/data/fragments/RouteMetaFragment.gql +18 -18
  310. package/data/fragments/StockStatusFragment.gql +7 -7
  311. package/data/fragments/index.d.ts +1 -1
  312. package/data/fragments/index.js +1 -1
  313. package/data/mutations/accountMutations.gql +28 -28
  314. package/data/mutations/cartMutations.gql +41 -41
  315. package/data/mutations/productListMutations.gql +18 -18
  316. package/data/mutations/signup.gql +7 -7
  317. package/data/mutations/subscribeToNewsletter.gql +3 -3
  318. package/data/mutations/subscribeToStockNotifications.gql +6 -6
  319. package/data/mutations/updateCustomer.gql +5 -5
  320. package/data/mutations/updatePassword.gql +5 -5
  321. package/data/queries/CartMutationQuery.gql +36 -36
  322. package/data/queries/CartQuery.gql +7 -7
  323. package/data/queries/GetCustomerCountryCode.gql +9 -9
  324. package/data/queries/PersonLookupQuery.gql +28 -28
  325. package/data/queries/ProductLists.gql +8 -8
  326. package/dependencies.d.ts +104 -104
  327. package/errorReporting.browser.d.ts +3 -3
  328. package/errorReporting.browser.js +11 -11
  329. package/errorReporting.d.ts +3 -3
  330. package/errorReporting.js +19 -19
  331. package/errorReporting.server.d.ts +3 -3
  332. package/errorReporting.server.js +11 -11
  333. package/errorReporting.shared.d.ts +5 -5
  334. package/errorReporting.shared.js +16 -16
  335. package/experiments/ExperimentsProvider.d.ts +4 -4
  336. package/experiments/ExperimentsProvider.js +28 -28
  337. package/experiments/ExperimentsProvider.test.js +105 -105
  338. package/experiments/integration.test.js +76 -76
  339. package/experiments/selectExperimentVariant.d.ts +3 -3
  340. package/experiments/selectExperimentVariant.js +34 -34
  341. package/experiments/selectExperimentVariant.test.js +64 -64
  342. package/experiments/useExperiment.d.ts +2 -2
  343. package/experiments/useExperiment.js +10 -10
  344. package/experiments/useExperiment.test.js +100 -100
  345. package/global.d.ts +1 -1
  346. package/helpers/decodeUrlQuery.d.ts +9 -9
  347. package/helpers/decodeUrlQuery.js +26 -26
  348. package/helpers/decodeUrlQuery.test.js +54 -54
  349. package/helpers/distance.d.ts +7 -7
  350. package/helpers/distance.js +12 -12
  351. package/helpers/encodeVariant.d.ts +3 -3
  352. package/helpers/encodeVariant.js +24 -24
  353. package/helpers/getBreakpointsFromValues.d.ts +6 -6
  354. package/helpers/getBreakpointsFromValues.js +14 -14
  355. package/helpers/getBreakpointsFromValues.test.js +47 -47
  356. package/helpers/getCartItemVariant.d.ts +7 -7
  357. package/helpers/getCartItemVariant.js +8 -8
  358. package/helpers/getErrorDetail.d.ts +7 -7
  359. package/helpers/getErrorDetail.js +11 -11
  360. package/helpers/getErrorDetail.test.js +44 -44
  361. package/helpers/getHeaders.d.ts +6 -6
  362. package/helpers/getHeaders.js +3 -3
  363. package/helpers/isRelativeUrl.d.ts +1 -1
  364. package/helpers/isRelativeUrl.js +3 -3
  365. package/helpers/logError.d.ts +1 -1
  366. package/helpers/logError.js +16 -16
  367. package/helpers/logWarningInDev.d.ts +1 -1
  368. package/helpers/logWarningInDev.js +6 -6
  369. package/helpers/throwErrorInDev.d.ts +6 -6
  370. package/helpers/throwErrorInDev.js +14 -14
  371. package/helpers/uniqueId.d.ts +5 -5
  372. package/helpers/uniqueId.js +9 -9
  373. package/hooks/CartCheckoutQuery.gql +5 -5
  374. package/hooks/Channels/useChannelSettings.d.ts +7 -7
  375. package/hooks/Channels/useChannelSettings.js +11 -11
  376. package/hooks/Channels/useChannelSettings.test.js +51 -51
  377. package/hooks/Filters/useBooleanFilter.d.ts +8 -8
  378. package/hooks/Filters/useBooleanFilter.js +20 -20
  379. package/hooks/Filters/useFilters.d.ts +3 -3
  380. package/hooks/Filters/useFilters.js +15 -15
  381. package/hooks/Filters/useListFilter.d.ts +10 -10
  382. package/hooks/Filters/useListFilter.js +37 -37
  383. package/hooks/Filters/useMultiFilter.d.ts +13 -13
  384. package/hooks/Filters/useMultiFilter.js +49 -49
  385. package/hooks/Filters/useRangeFilter.d.ts +10 -10
  386. package/hooks/Filters/useRangeFilter.js +35 -35
  387. package/hooks/Filters/useSortOrder.d.ts +11 -11
  388. package/hooks/Filters/useSortOrder.js +21 -21
  389. package/hooks/FreeShippingQuery.gql +16 -16
  390. package/hooks/PackageProducts/index.d.ts +2 -2
  391. package/hooks/PackageProducts/index.js +2 -2
  392. package/hooks/PackageProducts/packagePriceQuery.gql +29 -29
  393. package/hooks/PackageProducts/usePackageProductItem.d.ts +17 -17
  394. package/hooks/PackageProducts/usePackageProductItem.js +26 -26
  395. package/hooks/PackageProducts/usePackageProducts.d.ts +19 -19
  396. package/hooks/PackageProducts/usePackageProducts.js +345 -345
  397. package/hooks/PackageProducts/usePackageProducts.test.js +383 -383
  398. package/hooks/Product/index.d.ts +1 -1
  399. package/hooks/Product/index.js +1 -1
  400. package/hooks/Product/useStockStatus.d.ts +9 -9
  401. package/hooks/Product/useStockStatus.js +25 -25
  402. package/hooks/Product/useSwitchToVariantImage.d.ts +9 -9
  403. package/hooks/Product/useSwitchToVariantImage.js +20 -20
  404. package/hooks/ProductList/ProductListContext.d.ts +7 -7
  405. package/hooks/ProductList/ProductListContext.js +110 -110
  406. package/hooks/ProductList/action-creators.d.ts +46 -46
  407. package/hooks/ProductList/action-creators.js +296 -296
  408. package/hooks/ProductList/index.d.ts +118 -118
  409. package/hooks/ProductList/index.js +21 -21
  410. package/hooks/ProductList/list-transforms.d.ts +73 -73
  411. package/hooks/ProductList/list-transforms.js +106 -106
  412. package/hooks/ProductList/list-transforms.test.js +489 -489
  413. package/hooks/ProductList/product-list-reducer.d.ts +76 -76
  414. package/hooks/ProductList/product-list-reducer.js +197 -197
  415. package/hooks/ProductList/product-list-reducer.test.js +464 -464
  416. package/hooks/ProductList/useProductList.d.ts +13 -13
  417. package/hooks/ProductList/useProductList.js +93 -93
  418. package/hooks/ProductList/useProductListItems.d.ts +10 -10
  419. package/hooks/ProductList/useProductListItems.js +48 -48
  420. package/hooks/ProductList/validate-product.d.ts +6 -6
  421. package/hooks/ProductList/validate-product.js +40 -40
  422. package/hooks/Subscriptions/useNewsletterSubscription.d.ts +38 -38
  423. package/hooks/Subscriptions/useNewsletterSubscription.js +41 -41
  424. package/hooks/Subscriptions/useStockNotifications.d.ts +36 -36
  425. package/hooks/Subscriptions/useStockNotifications.js +37 -37
  426. package/hooks/Subscriptions/useStoreSubscriptions.d.ts +48 -48
  427. package/hooks/Subscriptions/useStoreSubscriptions.js +150 -150
  428. package/hooks/Subscriptions/useStoresubscriptions.test.js +179 -179
  429. package/hooks/useAddMultipleToCart.d.ts +27 -27
  430. package/hooks/useAddMultipleToCart.js +113 -113
  431. package/hooks/useAddMultipleToCart.test.js +181 -181
  432. package/hooks/useChannelBanner.js +22 -22
  433. package/hooks/useChannelBanner.test.js +77 -77
  434. package/hooks/useCustomerOrders.test.js +176 -176
  435. package/hooks/useCustomerOrdersQuery.d.ts +21 -21
  436. package/hooks/useCustomerOrdersQuery.js +20 -20
  437. package/hooks/useDeleteAccountMutation.d.ts +15 -15
  438. package/hooks/useDeleteAccountMutation.js +38 -38
  439. package/hooks/useDynamicPrice.d.ts +3 -3
  440. package/hooks/useDynamicPrice.js +24 -24
  441. package/hooks/useFreeShippingCheck.d.ts +15 -15
  442. package/hooks/useFreeShippingCheck.js +30 -30
  443. package/hooks/useGeolocation.d.ts +11 -11
  444. package/hooks/useGeolocation.js +33 -33
  445. package/hooks/useInfinitePagination.d.ts +37 -37
  446. package/hooks/useInfinitePagination.js +138 -138
  447. package/hooks/useLogError.d.ts +1 -1
  448. package/hooks/useLogError.js +7 -7
  449. package/hooks/useLoginMutation.d.ts +12 -12
  450. package/hooks/useLoginMutation.js +14 -14
  451. package/hooks/useLoginRedirect.d.ts +4 -4
  452. package/hooks/useLoginRedirect.js +36 -36
  453. package/hooks/useOrderDetailQuery.d.ts +20 -20
  454. package/hooks/useOrderDetailQuery.js +28 -28
  455. package/hooks/usePreconnectLinks.d.ts +10 -10
  456. package/hooks/usePreconnectLinks.js +29 -29
  457. package/hooks/usePreconnectLinks.test.js +95 -95
  458. package/hooks/usePrice.d.ts +39 -39
  459. package/hooks/usePrice.js +71 -71
  460. package/hooks/usePrice.test.js +171 -171
  461. package/hooks/useProductVariants/index.d.ts +1 -1
  462. package/hooks/useProductVariants/index.js +1 -1
  463. package/hooks/useProductVariants/useProductVariants.d.ts +19 -19
  464. package/hooks/useProductVariants/useProductVariants.js +202 -202
  465. package/hooks/useProductVariants/useProductVariants.test.js +415 -415
  466. package/hooks/useProductVariants/useVariantFromUrl.d.ts +5 -5
  467. package/hooks/useProductVariants/useVariantFromUrl.js +15 -15
  468. package/hooks/useProductVariants/useVariantFromUrl.test.js +79 -79
  469. package/hooks/useRoutePreload.d.ts +24 -24
  470. package/hooks/useRoutePreload.js +39 -39
  471. package/hooks/useShopConfig.d.ts +1 -1
  472. package/hooks/useShopConfig.js +10 -10
  473. package/hooks/useThrowErrorInDev.d.ts +1 -1
  474. package/hooks/useThrowErrorInDev.js +7 -7
  475. package/hooks/useThunkReducer.d.ts +7 -7
  476. package/hooks/useThunkReducer.js +23 -23
  477. package/hooks/useWarningInDev.d.ts +1 -1
  478. package/hooks/useWarningInDev.js +9 -9
  479. package/inServer.d.ts +1 -1
  480. package/inServer.js +2 -2
  481. package/index.d.ts +1 -1
  482. package/index.js +1 -1
  483. package/integrations/addwishSchemaExtension.d.ts +35 -35
  484. package/integrations/addwishSchemaExtension.js +140 -140
  485. package/integrations/nostoSchemaExtension.d.ts +5 -5
  486. package/integrations/nostoSchemaExtension.js +76 -76
  487. package/integrations/sluggishSchemaExtension.d.ts +2 -2
  488. package/integrations/sluggishSchemaExtension.js +26 -26
  489. package/package.json +1 -1
  490. package/polyfills.d.ts +1 -1
  491. package/polyfills.js +37 -37
  492. package/registerServiceWorker.js +110 -110
  493. package/resolvers/filters/boolFilter.d.ts +3 -3
  494. package/resolvers/filters/boolFilter.js +84 -84
  495. package/resolvers/filters/defaultActiveFilters.d.ts +3 -3
  496. package/resolvers/filters/defaultActiveFilters.js +8 -8
  497. package/resolvers/filters/filterParams.d.ts +3 -3
  498. package/resolvers/filters/filterParams.js +84 -84
  499. package/resolvers/filters/filters.d.ts +5 -5
  500. package/resolvers/filters/filters.js +78 -78
  501. package/resolvers/filters/index.d.ts +27 -27
  502. package/resolvers/filters/index.js +7 -7
  503. package/resolvers/filters/listFilter.d.ts +7 -7
  504. package/resolvers/filters/listFilter.js +73 -73
  505. package/resolvers/filters/listFilterItem.d.ts +3 -3
  506. package/resolvers/filters/listFilterItem.js +122 -122
  507. package/resolvers/filters/multiListFilter.d.ts +5 -5
  508. package/resolvers/filters/multiListFilter.js +195 -195
  509. package/resolvers/filters/multiListFilterList.d.ts +3 -3
  510. package/resolvers/filters/multiListFilterList.js +55 -55
  511. package/resolvers/filters/rangeFilter.d.ts +5 -5
  512. package/resolvers/filters/rangeFilter.js +137 -137
  513. package/resolvers/filters/updateQueryString.d.ts +12 -12
  514. package/resolvers/filters/updateQueryString.js +116 -116
  515. package/resolvers/index.d.ts +37 -37
  516. package/resolvers/index.js +37 -37
  517. package/scripts/dev-apolloServer.js +31 -31
  518. package/sentry/client.d.ts +1 -1
  519. package/sentry/client.js +29 -29
  520. package/sentry/common.d.ts +1 -1
  521. package/sentry/common.js +4 -4
  522. package/sentry/server.d.ts +1 -1
  523. package/sentry/server.js +19 -19
  524. package/sentry/utils.d.ts +1 -1
  525. package/sentry/utils.js +1 -1
  526. package/server/graphql.d.ts +20 -20
  527. package/server/graphql.js +118 -118
  528. package/server/graphql.test.js +123 -123
  529. package/server/index.d.ts +2 -2
  530. package/server/index.js +2 -2
  531. package/server/tracking/facebook.d.ts +5 -5
  532. package/server/tracking/facebook.js +132 -132
  533. package/server/tracking/middleware.d.ts +8 -8
  534. package/server/tracking/middleware.js +14 -14
  535. package/server/tracking/types.d.ts +33 -33
  536. package/setupTests.js +2 -2
  537. package/test-utils/ProviderPyramid.js +45 -45
  538. package/test-utils/mockShopConfig.js +26 -26
  539. package/test-utils/mockedProduct.js +253 -253
  540. package/test-utils/renderWithRouter.js +20 -20
  541. package/test-utils/variables.js +1231 -1231
  542. package/time.d.ts +1 -1
  543. package/time.js +5 -5
@@ -1,267 +1,267 @@
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
+ 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
+ }
267
267
  //# sourceMappingURL=channelUtils.js.map
@@ -1,4 +1,4 @@
1
- import ApolloClient from 'apollo-client';
2
- import { SelectedChannel } from '../components/ChannelContext/ChannelContext';
3
- export declare type GetPrimaryRoutePath = (path: string, newChannel: SelectedChannel, setSelectedChannel: (selectedChannel: SelectedChannel) => void) => Promise<string>;
4
- export declare function primaryRouteForPathFetcher(client: ApolloClient<any>): GetPrimaryRoutePath;
1
+ import ApolloClient from 'apollo-client';
2
+ import { SelectedChannel } from '../components/ChannelContext/ChannelContext';
3
+ export declare type GetPrimaryRoutePath = (path: string, newChannel: SelectedChannel, setSelectedChannel: (selectedChannel: SelectedChannel) => void) => Promise<string>;
4
+ export declare function primaryRouteForPathFetcher(client: ApolloClient<any>): GetPrimaryRoutePath;
@@ -1,50 +1,50 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import preserveRedirectRouteQuery from './PreserveRedirectRouteQuery.gql';
11
- import ProductPathnameRedirectQuery from './ProductPathnameRedirectQuery.gql';
12
- import CategoryPathnameRedirectQuery from './CategoryPathnameRedirectQuery.gql';
13
- import StartPagePathnameRedirectQuery from './StartPagePathnameRedirectQuery.gql';
14
- import PagePathnameRedirectQuery from './PagePathnameRedirectQuery.gql';
15
- const PathnameRedirectQueryMap = {
16
- Product: ProductPathnameRedirectQuery,
17
- Category: CategoryPathnameRedirectQuery,
18
- StartPage: StartPagePathnameRedirectQuery,
19
- Page: PagePathnameRedirectQuery
20
- };
21
- export function primaryRouteForPathFetcher(client) {
22
- return (path, newChannel, setSelectedChannel) => __awaiter(this, void 0, void 0, function* () {
23
- try {
24
- if (!path) {
25
- throw new Error('No path was provided');
26
- }
27
- const routeQueryResult = yield client.query({
28
- query: preserveRedirectRouteQuery,
29
- variables: {
30
- path
31
- }
32
- });
33
- const { id, __typename, pageId } = routeQueryResult.data.route.object;
34
- const idUesdForRedirect = id || pageId;
35
- setSelectedChannel(newChannel);
36
- const pathnameQueryResult = yield client.query({
37
- fetchPolicy: 'network-only',
38
- query: PathnameRedirectQueryMap[__typename],
39
- variables: {
40
- id: idUesdForRedirect
41
- }
42
- });
43
- return pathnameQueryResult.data[__typename].primaryRoute.path;
44
- }
45
- catch (e) {
46
- return '/';
47
- }
48
- });
49
- }
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import preserveRedirectRouteQuery from './PreserveRedirectRouteQuery.gql';
11
+ import ProductPathnameRedirectQuery from './ProductPathnameRedirectQuery.gql';
12
+ import CategoryPathnameRedirectQuery from './CategoryPathnameRedirectQuery.gql';
13
+ import StartPagePathnameRedirectQuery from './StartPagePathnameRedirectQuery.gql';
14
+ import PagePathnameRedirectQuery from './PagePathnameRedirectQuery.gql';
15
+ const PathnameRedirectQueryMap = {
16
+ Product: ProductPathnameRedirectQuery,
17
+ Category: CategoryPathnameRedirectQuery,
18
+ StartPage: StartPagePathnameRedirectQuery,
19
+ Page: PagePathnameRedirectQuery
20
+ };
21
+ export function primaryRouteForPathFetcher(client) {
22
+ return (path, newChannel, setSelectedChannel) => __awaiter(this, void 0, void 0, function* () {
23
+ try {
24
+ if (!path) {
25
+ throw new Error('No path was provided');
26
+ }
27
+ const routeQueryResult = yield client.query({
28
+ query: preserveRedirectRouteQuery,
29
+ variables: {
30
+ path
31
+ }
32
+ });
33
+ const { id, __typename, pageId } = routeQueryResult.data.route.object;
34
+ const idUesdForRedirect = id || pageId;
35
+ setSelectedChannel(newChannel);
36
+ const pathnameQueryResult = yield client.query({
37
+ fetchPolicy: 'network-only',
38
+ query: PathnameRedirectQueryMap[__typename],
39
+ variables: {
40
+ id: idUesdForRedirect
41
+ }
42
+ });
43
+ return pathnameQueryResult.data[__typename].primaryRoute.path;
44
+ }
45
+ catch (e) {
46
+ return '/';
47
+ }
48
+ });
49
+ }
50
50
  //# sourceMappingURL=redirectUtils.js.map