@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.
- package/ChannelHandler/CategoryPathnameRedirectQuery.gql +9 -9
- package/ChannelHandler/ChannelHandler.d.ts +50 -50
- package/ChannelHandler/ChannelHandler.js +108 -108
- package/ChannelHandler/PagePathnameRedirectQuery.gql +9 -9
- package/ChannelHandler/PreserveRedirectRouteQuery.gql +19 -19
- package/ChannelHandler/ProductPathnameRedirectQuery.gql +9 -9
- package/ChannelHandler/StartPagePathnameRedirectQuery.gql +9 -9
- package/ChannelHandler/channelUtils.d.ts +68 -68
- package/ChannelHandler/channelUtils.js +266 -266
- package/ChannelHandler/redirectUtils.d.ts +4 -4
- package/ChannelHandler/redirectUtils.js +49 -49
- package/ChannelHandler/redirectUtils.test.js +538 -538
- package/analytics/Analytics.d.ts +18 -18
- package/analytics/Analytics.js +56 -56
- package/analytics/Analytics.js.map +1 -1
- package/analytics/AnalyticsProvider.d.ts +42 -42
- package/analytics/AnalyticsProvider.js +177 -177
- package/analytics/deprecatedTracking.d.ts +17 -17
- package/analytics/deprecatedTracking.js +32 -32
- package/analytics/integrations/ga4.d.ts +23 -23
- package/analytics/integrations/ga4.js +145 -145
- package/analytics/integrations/gtag/gtag.d.ts +8 -8
- package/analytics/integrations/gtag/gtag.js +180 -180
- package/analytics/integrations/gtag/index.d.ts +1 -1
- package/analytics/integrations/gtag/index.js +1 -1
- package/analytics/integrations/gtm/index.d.ts +12 -12
- package/analytics/integrations/gtm/index.js +200 -200
- package/analytics/integrations/gtm/referrerModifier.d.ts +1 -1
- package/analytics/integrations/gtm/referrerModifier.js +61 -61
- package/analytics/integrations/releware/index.d.ts +3 -3
- package/analytics/integrations/releware/index.js +38 -38
- package/analytics/integrations/unslugify.d.ts +1 -1
- package/analytics/integrations/unslugify.js +17 -17
- package/analytics/trackerRegistry.d.ts +101 -101
- package/analytics/trackerRegistry.js +219 -219
- package/analytics/trackerRegistry.test.js +160 -160
- package/analytics/tracking.d.ts +14 -14
- package/analytics/tracking.js +71 -71
- package/analytics/utils/breadcrumbsWithoutProduct.d.ts +1 -1
- package/analytics/utils/breadcrumbsWithoutProduct.js +8 -8
- package/analytics/utils/script.d.ts +8 -8
- package/analytics/utils/script.js +39 -39
- package/analytics/webVitals.d.ts +5 -5
- package/analytics/webVitals.js +38 -38
- package/boot/AuthHandler.d.ts +14 -14
- package/boot/AuthHandler.js +38 -38
- package/boot/ChannelsQuery.gql +7 -7
- package/boot/PreviewHandler.d.ts +7 -7
- package/boot/PreviewHandler.js +13 -13
- package/boot/SharedTree.d.ts +25 -25
- package/boot/SharedTree.js +28 -28
- package/boot/addMissingConfig.d.ts +5 -5
- package/boot/addMissingConfig.js +33 -33
- package/boot/apollo.d.ts +21 -21
- package/boot/apollo.js +197 -197
- package/boot/client/entrypoint.d.ts +1 -1
- package/boot/client/entrypoint.js +4 -4
- package/boot/client/index.d.ts +1 -1
- package/boot/client/index.js +1 -1
- package/boot/client/startClient.d.ts +4 -4
- package/boot/client/startClient.js +142 -142
- package/boot/client-schema.gql +59 -59
- package/boot/server/IntervalQuery.d.ts +32 -32
- package/boot/server/IntervalQuery.js +94 -94
- package/boot/server/IntervalQuery.test.js +280 -280
- package/boot/server/PersistedApolloClient.d.ts +20 -20
- package/boot/server/PersistedApolloClient.js +39 -39
- package/boot/server/PersistedApolloClient.test.js +233 -233
- package/boot/server/asyncErrorHandler.d.ts +3 -3
- package/boot/server/asyncErrorHandler.js +4 -4
- package/boot/server/breakpointMiddleware.d.ts +3 -3
- package/boot/server/breakpointMiddleware.js +9 -9
- package/boot/server/createApolloServer.d.ts +28 -28
- package/boot/server/createApolloServer.js +143 -143
- package/boot/server/createApolloServer.test.js +114 -114
- package/boot/server/createDevServer.d.ts +14 -14
- package/boot/server/createDevServer.js +29 -29
- package/boot/server/createRenderer.d.ts +28 -28
- package/boot/server/createRenderer.js +235 -235
- package/boot/server/createServer.d.ts +14 -14
- package/boot/server/createServer.js +41 -41
- package/boot/server/entrypoint.d.ts +1 -1
- package/boot/server/entrypoint.js +35 -35
- package/boot/server/getPrefetchFiles.d.ts +10 -10
- package/boot/server/getPrefetchFiles.js +19 -19
- package/boot/server/getPreloadAssets.d.ts +10 -10
- package/boot/server/getPreloadAssets.js +17 -17
- package/boot/server/getPreloadAssets.test.js +133 -133
- package/boot/server/index.d.ts +9 -9
- package/boot/server/index.js +122 -122
- package/boot/server/listen.d.ts +13 -13
- package/boot/server/listen.js +16 -16
- package/boot/server/overwriteServerIntl.js +1 -1
- package/boot/server/persistedQueries/PersistedClient.d.ts +22 -22
- package/boot/server/persistedQueries/PersistedClient.js +57 -57
- package/boot/server/persistedQueries/__tests__/getPersistedQueriesForRequest.test.js +201 -201
- package/boot/server/persistedQueries/__tests__/mockQuery.gql +6 -6
- package/boot/server/persistedQueries/getPersistedQueriesForRequest.d.ts +3 -3
- package/boot/server/persistedQueries/getPersistedQueriesForRequest.js +26 -26
- package/boot/server/saleSource.test.js +39 -39
- package/boot/server/salesSource.d.ts +8 -8
- package/boot/server/salesSource.js +15 -15
- package/boot/utils/__tests__/uid.js +47 -47
- package/boot/utils/createIntOptions.d.ts +6 -6
- package/boot/utils/createIntOptions.js +18 -18
- package/boot/utils/queryLoggingMiddleware.d.ts +2 -2
- package/boot/utils/queryLoggingMiddleware.js +14 -14
- package/boot/utils/uid.d.ts +3 -3
- package/boot/utils/uid.js +19 -19
- package/cart/AddToCartFormik.d.ts +42 -42
- package/cart/AddToCartFormik.js +76 -76
- package/cart/useAddToCart.d.ts +88 -88
- package/cart/useAddToCart.js +117 -117
- package/ci/.gitlab-ci.yml +3 -3
- package/components/Auth/CustomerUpdateForm.d.ts +32 -32
- package/components/Auth/CustomerUpdateForm.js +121 -121
- package/components/Auth/ForgotPasswordProvider.d.ts +71 -71
- package/components/Auth/ForgotPasswordProvider.js +56 -56
- package/components/Auth/ResetPasswordProvider.d.ts +88 -88
- package/components/Auth/ResetPasswordProvider.js +77 -77
- package/components/Auth/SSN.d.ts +12 -12
- package/components/Auth/SSN.js +34 -34
- package/components/Auth/SSNLookupContainer.d.ts +15 -15
- package/components/Auth/SSNLookupContainer.js +19 -19
- package/components/Auth/SignupFormContainer.d.ts +19 -19
- package/components/Auth/SignupFormContainer.js +81 -81
- package/components/Auth/UpdatePasswordForm.d.ts +44 -44
- package/components/Auth/UpdatePasswordForm.js +97 -97
- package/components/Auth/formFieldsFromSettings.d.ts +65 -65
- package/components/Auth/formFieldsFromSettings.js +76 -76
- package/components/Auth/formatSignupInput.d.ts +8 -8
- package/components/Auth/formatSignupInput.js +42 -42
- package/components/Auth/signup-context.d.ts +36 -36
- package/components/Auth/signup-context.js +71 -71
- package/components/Auth/signup-field-translations.d.ts +3 -3
- package/components/Auth/signup-field-translations.js +43 -43
- package/components/Auth/signupSubmit.d.ts +6 -6
- package/components/Auth/signupSubmit.js +56 -56
- package/components/Auth/useAddressFields.d.ts +22 -22
- package/components/Auth/useAddressFields.js +32 -32
- package/components/Auth/useAddressFields.test.js +294 -294
- package/components/Auth/useCustomer.d.ts +70 -70
- package/components/Auth/useCustomer.js +167 -167
- package/components/Auth/useLoginFields.d.ts +20 -20
- package/components/Auth/useLoginFields.js +20 -20
- package/components/Auth/useSignupForm.d.ts +7 -7
- package/components/Auth/useSignupForm.js +14 -14
- package/components/AuthContext/AuthContext.d.ts +8 -8
- package/components/AuthContext/AuthContext.js +8 -8
- package/components/AuthContext/AuthProvider.d.ts +6 -6
- package/components/AuthContext/AuthProvider.js +84 -84
- package/components/AuthContext/AuthProvider.test.js +66 -66
- package/components/AuthContext/LogOut.d.ts +5 -5
- package/components/AuthContext/LogOut.js +14 -14
- package/components/AuthContext/googleUserIdQuery.gql +6 -6
- package/components/AuthContext/useAuth.d.ts +6 -6
- package/components/AuthContext/useAuth.js +20 -20
- package/components/BreakpointProvider.d.ts +21 -21
- package/components/BreakpointProvider.js +23 -23
- package/components/Cart/CartIdContext.d.ts +11 -11
- package/components/Cart/CartIdContext.js +60 -60
- package/components/Cart/CartIdContext.test.js +87 -87
- package/components/ChannelContext/ChannelContext.d.ts +20 -20
- package/components/ChannelContext/ChannelContext.js +3 -3
- package/components/ChannelContext/ChannelProvider.d.ts +10 -10
- package/components/ChannelContext/ChannelProvider.js +42 -42
- package/components/ChannelContext/ChannelProvider.test.js +112 -112
- package/components/ChannelContext/CountrySettingsQuery.gql +34 -34
- package/components/ChannelContext/index.d.ts +2 -2
- package/components/ChannelContext/index.js +2 -2
- package/components/ChannelContext/useCountrySettings.d.ts +8 -8
- package/components/ChannelContext/useCountrySettings.js +23 -23
- package/components/ConfigProvider.d.ts +108 -108
- package/components/ConfigProvider.js +19 -19
- package/components/DynamicRoute/ActiveFiltersQuery.gql +21 -21
- package/components/DynamicRoute/CategoryRoute.d.ts +13 -13
- package/components/DynamicRoute/CategoryRoute.js +55 -55
- package/components/DynamicRoute/ContentRoute.d.ts +14 -14
- package/components/DynamicRoute/ContentRoute.js +27 -27
- package/components/DynamicRoute/PreviewRoute.d.ts +17 -17
- package/components/DynamicRoute/PreviewRoute.js +57 -57
- package/components/DynamicRoute/ProductByArticlenumber.d.ts +5 -5
- package/components/DynamicRoute/ProductByArticlenumber.gql +16 -16
- package/components/DynamicRoute/ProductByArticlenumber.js +21 -21
- package/components/DynamicRoute/ProductRoute.d.ts +15 -15
- package/components/DynamicRoute/ProductRoute.js +57 -57
- package/components/DynamicRoute/RouteResolver.d.ts +22 -22
- package/components/DynamicRoute/RouteResolver.js +64 -64
- package/components/DynamicRoute/Status.d.ts +14 -14
- package/components/DynamicRoute/Status.js +19 -19
- package/components/DynamicRoute/index.d.ts +17 -17
- package/components/DynamicRoute/index.js +95 -95
- package/components/Filters/index.d.ts +1 -1
- package/components/Filters/index.js +1 -1
- package/components/Filters/toggleActiveListItem.gql +15 -15
- package/components/Filters/utils/replaceInSearch.d.ts +14 -14
- package/components/Filters/utils/replaceInSearch.js +22 -22
- package/components/Filters/utils/replaceInSearch.test.js +184 -184
- package/components/Filters/utils/updateHistory.d.ts +25 -25
- package/components/Filters/utils/updateHistory.js +29 -29
- package/components/Filters/utils/updateHistory.test.js +102 -102
- package/components/Fonts/CustomFont.d.ts +14 -14
- package/components/Fonts/CustomFont.js +16 -16
- package/components/Fonts/GoogleFont.d.ts +10 -10
- package/components/Fonts/GoogleFont.js +34 -34
- package/components/Fonts/TypekitFont.d.ts +16 -16
- package/components/Fonts/TypekitFont.js +24 -24
- package/components/Fonts/injectFont.d.ts +11 -11
- package/components/Fonts/injectFont.js +29 -29
- package/components/Head.d.ts +11 -11
- package/components/Head.js +74 -74
- package/components/Mutation/AddToCart/addToCartUtils.d.ts +18 -18
- package/components/Mutation/AddToCart/addToCartUtils.js +51 -51
- package/components/Mutation/AddToCartFormik.d.ts +53 -53
- package/components/Mutation/AddToCartFormik.js +171 -171
- package/components/Mutation/DecrementQuantity.d.ts +4 -4
- package/components/Mutation/DecrementQuantity.js +34 -34
- package/components/Mutation/IncrementQuantity.d.ts +4 -4
- package/components/Mutation/IncrementQuantity.js +34 -34
- package/components/Mutation/RemoveFromCart.d.ts +5 -5
- package/components/Mutation/RemoveFromCart.js +51 -51
- package/components/Mutation/SetQuantity.d.ts +4 -4
- package/components/Mutation/SetQuantity.js +36 -36
- package/components/Mutation/SubscribeToNewsletter.d.ts +4 -4
- package/components/Mutation/SubscribeToNewsletter.js +29 -29
- package/components/Mutation/SubscribeToStockNotifications.d.ts +4 -4
- package/components/Mutation/SubscribeToStockNotifications.js +30 -30
- package/components/Mutation/cartMutationUtils.d.ts +28 -28
- package/components/Mutation/cartMutationUtils.js +108 -108
- package/components/Mutation/cartMutationUtils.spec.js +142 -142
- package/components/Mutation/useDecrementQuantity.d.ts +11 -11
- package/components/Mutation/useDecrementQuantity.js +53 -53
- package/components/Mutation/useIncrementQuantity.d.ts +11 -11
- package/components/Mutation/useIncrementQuantity.js +53 -53
- package/components/Mutation/useRemoveFromCart.d.ts +13 -13
- package/components/Mutation/useRemoveFromCart.js +49 -49
- package/components/Mutation/useSetQuantity.d.ts +12 -12
- package/components/Mutation/useSetQuantity.js +37 -37
- package/components/Notifications/Notifications.d.ts +15 -15
- package/components/Notifications/Notifications.js +26 -26
- package/components/Notifications/index.d.ts +2 -2
- package/components/Notifications/index.js +2 -2
- package/components/Notifications/notificationMachine.d.ts +30 -30
- package/components/Notifications/notificationMachine.js +73 -73
- package/components/Notifications/notificationsMachine.d.ts +37 -37
- package/components/Notifications/notificationsMachine.js +65 -65
- package/components/Notifications/useNotification.d.ts +9 -9
- package/components/Notifications/useNotification.js +26 -26
- package/components/OpenGraph/OpenGraph.test.js +180 -180
- package/components/OpenGraph/OpenGraphGeneralPageData.d.ts +25 -25
- package/components/OpenGraph/OpenGraphGeneralPageData.js +36 -36
- package/components/OpenGraph/OpenGraphProductData.d.ts +25 -25
- package/components/OpenGraph/OpenGraphProductData.js +48 -48
- package/components/OpenGraph/index.d.ts +2 -2
- package/components/OpenGraph/index.js +2 -2
- package/components/Pagination/PaginationContainer.d.ts +2 -2
- package/components/Pagination/PaginationContainer.js +4 -4
- package/components/Pagination/PaginationContext.d.ts +14 -14
- package/components/Pagination/PaginationContext.js +3 -3
- package/components/Pagination/PaginationProvider.d.ts +19 -19
- package/components/Pagination/PaginationProvider.js +94 -94
- package/components/Pagination/PaginationProvider.test.js +282 -282
- package/components/PreviewContext.d.ts +10 -10
- package/components/PreviewContext.js +26 -26
- package/components/ProductConfigurationProvider/ConfigPrice.gql +22 -22
- package/components/ProductConfigurationProvider/ProductConfigurationContext.d.ts +13 -13
- package/components/ProductConfigurationProvider/ProductConfigurationContext.js +4 -4
- package/components/ProductConfigurationProvider/ProductConfigurationProvider.d.ts +6 -6
- package/components/ProductConfigurationProvider/ProductConfigurationProvider.js +49 -49
- package/components/Query/CartProvider.d.ts +22 -22
- package/components/Query/CartProvider.js +67 -67
- package/components/SortOrder/SortOrderContainer.d.ts +40 -40
- package/components/SortOrder/SortOrderContainer.js +101 -101
- package/components/SortOrder/SortOrderContainer.js.map +1 -1
- package/components/SortOrder/SortOrderContext.d.ts +9 -9
- package/components/SortOrder/SortOrderContext.js +8 -8
- package/components/StructuredData/SiteLinksSearchStructuredData.d.ts +3 -3
- package/components/StructuredData/SiteLinksSearchStructuredData.js +24 -24
- package/components/StructuredData/StructuredBreadcrumbData.d.ts +12 -12
- package/components/StructuredData/StructuredBreadcrumbData.js +54 -54
- package/components/StructuredData/StructuredCategoryData.d.ts +16 -16
- package/components/StructuredData/StructuredCategoryData.js +17 -17
- package/components/StructuredData/StructuredData.d.ts +9 -9
- package/components/StructuredData/StructuredData.js +6 -6
- package/components/StructuredData/StructuredPageData.d.ts +16 -16
- package/components/StructuredData/StructuredPageData.js +16 -16
- package/components/StructuredData/StructuredProductData.d.ts +18 -18
- package/components/StructuredData/StructuredProductData.js +42 -42
- package/components/StructuredData/StructuredProductData.test.js +130 -130
- package/components/StructuredData/index.d.ts +5 -5
- package/components/StructuredData/index.js +5 -5
- package/data/cache.d.ts +3 -3
- package/data/cache.js +20 -20
- package/data/fragmentTypes.d.ts +8 -8
- package/data/fragmentTypes.js +83 -83
- package/data/fragments/BadgeFragment.gql +7 -7
- package/data/fragments/CartCoreFragment.gql +89 -89
- package/data/fragments/ChannelsFragment.gql +58 -58
- package/data/fragments/CommentsFragment.gql +6 -6
- package/data/fragments/HeadFragment.gql +9 -9
- package/data/fragments/PriceFragment.gql +5 -5
- package/data/fragments/ProductCampaignFragment.gql +10 -10
- package/data/fragments/ProductConfigurationsFragment.gql +24 -24
- package/data/fragments/ProductListsFragments.gql +94 -94
- package/data/fragments/ProductMetadataFragment.gql +20 -20
- package/data/fragments/ProductPriceFragment.gql +10 -10
- package/data/fragments/ProductVariantPriceFragment.gql +10 -10
- package/data/fragments/RouteCrumbFragment.gql +20 -20
- package/data/fragments/RouteMetaFragment.gql +18 -18
- package/data/fragments/StockStatusFragment.gql +7 -7
- package/data/fragments/index.d.ts +1 -1
- package/data/fragments/index.js +1 -1
- package/data/mutations/accountMutations.gql +28 -28
- package/data/mutations/cartMutations.gql +41 -41
- package/data/mutations/productListMutations.gql +18 -18
- package/data/mutations/signup.gql +7 -7
- package/data/mutations/subscribeToNewsletter.gql +3 -3
- package/data/mutations/subscribeToStockNotifications.gql +6 -6
- package/data/mutations/updateCustomer.gql +5 -5
- package/data/mutations/updatePassword.gql +5 -5
- package/data/queries/CartMutationQuery.gql +36 -36
- package/data/queries/CartQuery.gql +7 -7
- package/data/queries/GetCustomerCountryCode.gql +9 -9
- package/data/queries/PersonLookupQuery.gql +28 -28
- package/data/queries/ProductLists.gql +8 -8
- package/dependencies.d.ts +104 -104
- package/errorReporting.browser.d.ts +3 -3
- package/errorReporting.browser.js +11 -11
- package/errorReporting.d.ts +3 -3
- package/errorReporting.js +19 -19
- package/errorReporting.server.d.ts +3 -3
- package/errorReporting.server.js +11 -11
- package/errorReporting.shared.d.ts +5 -5
- package/errorReporting.shared.js +16 -16
- package/experiments/ExperimentsProvider.d.ts +4 -4
- package/experiments/ExperimentsProvider.js +28 -28
- package/experiments/ExperimentsProvider.test.js +105 -105
- package/experiments/integration.test.js +76 -76
- package/experiments/selectExperimentVariant.d.ts +3 -3
- package/experiments/selectExperimentVariant.js +34 -34
- package/experiments/selectExperimentVariant.test.js +64 -64
- package/experiments/useExperiment.d.ts +2 -2
- package/experiments/useExperiment.js +10 -10
- package/experiments/useExperiment.test.js +100 -100
- package/global.d.ts +1 -1
- package/helpers/decodeUrlQuery.d.ts +9 -9
- package/helpers/decodeUrlQuery.js +26 -26
- package/helpers/decodeUrlQuery.test.js +54 -54
- package/helpers/distance.d.ts +7 -7
- package/helpers/distance.js +12 -12
- package/helpers/encodeVariant.d.ts +3 -3
- package/helpers/encodeVariant.js +24 -24
- package/helpers/getBreakpointsFromValues.d.ts +6 -6
- package/helpers/getBreakpointsFromValues.js +14 -14
- package/helpers/getBreakpointsFromValues.test.js +47 -47
- package/helpers/getCartItemVariant.d.ts +7 -7
- package/helpers/getCartItemVariant.js +8 -8
- package/helpers/getErrorDetail.d.ts +7 -7
- package/helpers/getErrorDetail.js +11 -11
- package/helpers/getErrorDetail.test.js +44 -44
- package/helpers/getHeaders.d.ts +6 -6
- package/helpers/getHeaders.js +3 -3
- package/helpers/isRelativeUrl.d.ts +1 -1
- package/helpers/isRelativeUrl.js +3 -3
- package/helpers/logError.d.ts +1 -1
- package/helpers/logError.js +16 -16
- package/helpers/logWarningInDev.d.ts +1 -1
- package/helpers/logWarningInDev.js +6 -6
- package/helpers/throwErrorInDev.d.ts +6 -6
- package/helpers/throwErrorInDev.js +14 -14
- package/helpers/uniqueId.d.ts +5 -5
- package/helpers/uniqueId.js +9 -9
- package/hooks/CartCheckoutQuery.gql +5 -5
- package/hooks/Channels/useChannelSettings.d.ts +7 -7
- package/hooks/Channels/useChannelSettings.js +11 -11
- package/hooks/Channels/useChannelSettings.test.js +51 -51
- package/hooks/Filters/useBooleanFilter.d.ts +8 -8
- package/hooks/Filters/useBooleanFilter.js +20 -20
- package/hooks/Filters/useFilters.d.ts +3 -3
- package/hooks/Filters/useFilters.js +15 -15
- package/hooks/Filters/useListFilter.d.ts +10 -10
- package/hooks/Filters/useListFilter.js +37 -37
- package/hooks/Filters/useMultiFilter.d.ts +13 -13
- package/hooks/Filters/useMultiFilter.js +49 -49
- package/hooks/Filters/useRangeFilter.d.ts +10 -10
- package/hooks/Filters/useRangeFilter.js +35 -35
- package/hooks/Filters/useSortOrder.d.ts +11 -11
- package/hooks/Filters/useSortOrder.js +21 -21
- package/hooks/FreeShippingQuery.gql +16 -16
- package/hooks/PackageProducts/index.d.ts +2 -2
- package/hooks/PackageProducts/index.js +2 -2
- package/hooks/PackageProducts/packagePriceQuery.gql +29 -29
- package/hooks/PackageProducts/usePackageProductItem.d.ts +17 -17
- package/hooks/PackageProducts/usePackageProductItem.js +26 -26
- package/hooks/PackageProducts/usePackageProducts.d.ts +19 -19
- package/hooks/PackageProducts/usePackageProducts.js +345 -345
- package/hooks/PackageProducts/usePackageProducts.test.js +383 -383
- package/hooks/Product/index.d.ts +1 -1
- package/hooks/Product/index.js +1 -1
- package/hooks/Product/useStockStatus.d.ts +9 -9
- package/hooks/Product/useStockStatus.js +25 -25
- package/hooks/Product/useSwitchToVariantImage.d.ts +9 -9
- package/hooks/Product/useSwitchToVariantImage.js +20 -20
- package/hooks/ProductList/ProductListContext.d.ts +7 -7
- package/hooks/ProductList/ProductListContext.js +110 -110
- package/hooks/ProductList/action-creators.d.ts +46 -46
- package/hooks/ProductList/action-creators.js +296 -296
- package/hooks/ProductList/index.d.ts +118 -118
- package/hooks/ProductList/index.js +21 -21
- package/hooks/ProductList/list-transforms.d.ts +73 -73
- package/hooks/ProductList/list-transforms.js +106 -106
- package/hooks/ProductList/list-transforms.test.js +489 -489
- package/hooks/ProductList/product-list-reducer.d.ts +76 -76
- package/hooks/ProductList/product-list-reducer.js +197 -197
- package/hooks/ProductList/product-list-reducer.test.js +464 -464
- package/hooks/ProductList/useProductList.d.ts +13 -13
- package/hooks/ProductList/useProductList.js +93 -93
- package/hooks/ProductList/useProductListItems.d.ts +10 -10
- package/hooks/ProductList/useProductListItems.js +48 -48
- package/hooks/ProductList/validate-product.d.ts +6 -6
- package/hooks/ProductList/validate-product.js +40 -40
- package/hooks/Subscriptions/useNewsletterSubscription.d.ts +38 -38
- package/hooks/Subscriptions/useNewsletterSubscription.js +41 -41
- package/hooks/Subscriptions/useStockNotifications.d.ts +36 -36
- package/hooks/Subscriptions/useStockNotifications.js +37 -37
- package/hooks/Subscriptions/useStoreSubscriptions.d.ts +48 -48
- package/hooks/Subscriptions/useStoreSubscriptions.js +150 -150
- package/hooks/Subscriptions/useStoresubscriptions.test.js +179 -179
- package/hooks/useAddMultipleToCart.d.ts +27 -27
- package/hooks/useAddMultipleToCart.js +113 -113
- package/hooks/useAddMultipleToCart.test.js +181 -181
- package/hooks/useChannelBanner.js +22 -22
- package/hooks/useChannelBanner.test.js +77 -77
- package/hooks/useCustomerOrders.test.js +176 -176
- package/hooks/useCustomerOrdersQuery.d.ts +21 -21
- package/hooks/useCustomerOrdersQuery.js +20 -20
- package/hooks/useDeleteAccountMutation.d.ts +15 -15
- package/hooks/useDeleteAccountMutation.js +38 -38
- package/hooks/useDynamicPrice.d.ts +3 -3
- package/hooks/useDynamicPrice.js +24 -24
- package/hooks/useFreeShippingCheck.d.ts +15 -15
- package/hooks/useFreeShippingCheck.js +30 -30
- package/hooks/useGeolocation.d.ts +11 -11
- package/hooks/useGeolocation.js +33 -33
- package/hooks/useInfinitePagination.d.ts +37 -37
- package/hooks/useInfinitePagination.js +138 -138
- package/hooks/useLogError.d.ts +1 -1
- package/hooks/useLogError.js +7 -7
- package/hooks/useLoginMutation.d.ts +12 -12
- package/hooks/useLoginMutation.js +14 -14
- package/hooks/useLoginRedirect.d.ts +4 -4
- package/hooks/useLoginRedirect.js +36 -36
- package/hooks/useOrderDetailQuery.d.ts +20 -20
- package/hooks/useOrderDetailQuery.js +28 -28
- package/hooks/usePreconnectLinks.d.ts +10 -10
- package/hooks/usePreconnectLinks.js +29 -29
- package/hooks/usePreconnectLinks.test.js +95 -95
- package/hooks/usePrice.d.ts +39 -39
- package/hooks/usePrice.js +71 -71
- package/hooks/usePrice.test.js +171 -171
- package/hooks/useProductVariants/index.d.ts +1 -1
- package/hooks/useProductVariants/index.js +1 -1
- package/hooks/useProductVariants/useProductVariants.d.ts +19 -19
- package/hooks/useProductVariants/useProductVariants.js +202 -202
- package/hooks/useProductVariants/useProductVariants.test.js +415 -415
- package/hooks/useProductVariants/useVariantFromUrl.d.ts +5 -5
- package/hooks/useProductVariants/useVariantFromUrl.js +15 -15
- package/hooks/useProductVariants/useVariantFromUrl.test.js +79 -79
- package/hooks/useRoutePreload.d.ts +24 -24
- package/hooks/useRoutePreload.js +39 -39
- package/hooks/useShopConfig.d.ts +1 -1
- package/hooks/useShopConfig.js +10 -10
- package/hooks/useThrowErrorInDev.d.ts +1 -1
- package/hooks/useThrowErrorInDev.js +7 -7
- package/hooks/useThunkReducer.d.ts +7 -7
- package/hooks/useThunkReducer.js +23 -23
- package/hooks/useWarningInDev.d.ts +1 -1
- package/hooks/useWarningInDev.js +9 -9
- package/inServer.d.ts +1 -1
- package/inServer.js +2 -2
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/integrations/addwishSchemaExtension.d.ts +35 -35
- package/integrations/addwishSchemaExtension.js +140 -140
- package/integrations/nostoSchemaExtension.d.ts +5 -5
- package/integrations/nostoSchemaExtension.js +76 -76
- package/integrations/sluggishSchemaExtension.d.ts +2 -2
- package/integrations/sluggishSchemaExtension.js +26 -26
- package/package.json +1 -1
- package/polyfills.d.ts +1 -1
- package/polyfills.js +37 -37
- package/registerServiceWorker.js +110 -110
- package/resolvers/filters/boolFilter.d.ts +3 -3
- package/resolvers/filters/boolFilter.js +84 -84
- package/resolvers/filters/defaultActiveFilters.d.ts +3 -3
- package/resolvers/filters/defaultActiveFilters.js +8 -8
- package/resolvers/filters/filterParams.d.ts +3 -3
- package/resolvers/filters/filterParams.js +84 -84
- package/resolvers/filters/filters.d.ts +5 -5
- package/resolvers/filters/filters.js +78 -78
- package/resolvers/filters/index.d.ts +27 -27
- package/resolvers/filters/index.js +7 -7
- package/resolvers/filters/listFilter.d.ts +7 -7
- package/resolvers/filters/listFilter.js +73 -73
- package/resolvers/filters/listFilterItem.d.ts +3 -3
- package/resolvers/filters/listFilterItem.js +122 -122
- package/resolvers/filters/multiListFilter.d.ts +5 -5
- package/resolvers/filters/multiListFilter.js +195 -195
- package/resolvers/filters/multiListFilterList.d.ts +3 -3
- package/resolvers/filters/multiListFilterList.js +55 -55
- package/resolvers/filters/rangeFilter.d.ts +5 -5
- package/resolvers/filters/rangeFilter.js +137 -137
- package/resolvers/filters/updateQueryString.d.ts +12 -12
- package/resolvers/filters/updateQueryString.js +116 -116
- package/resolvers/index.d.ts +37 -37
- package/resolvers/index.js +37 -37
- package/scripts/dev-apolloServer.js +31 -31
- package/sentry/client.d.ts +1 -1
- package/sentry/client.js +29 -29
- package/sentry/common.d.ts +1 -1
- package/sentry/common.js +4 -4
- package/sentry/server.d.ts +1 -1
- package/sentry/server.js +19 -19
- package/sentry/utils.d.ts +1 -1
- package/sentry/utils.js +1 -1
- package/server/graphql.d.ts +20 -20
- package/server/graphql.js +118 -118
- package/server/graphql.test.js +123 -123
- package/server/index.d.ts +2 -2
- package/server/index.js +2 -2
- package/server/tracking/facebook.d.ts +5 -5
- package/server/tracking/facebook.js +132 -132
- package/server/tracking/middleware.d.ts +8 -8
- package/server/tracking/middleware.js +14 -14
- package/server/tracking/types.d.ts +33 -33
- package/setupTests.js +2 -2
- package/test-utils/ProviderPyramid.js +45 -45
- package/test-utils/mockShopConfig.js +26 -26
- package/test-utils/mockedProduct.js +253 -253
- package/test-utils/renderWithRouter.js +20 -20
- package/test-utils/variables.js +1231 -1231
- package/time.d.ts +1 -1
- 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
|