@jetshop/core 5.13.10-0 → 5.14.0-alpha.49df897e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ChannelHandler/CategoryPathnameRedirectQuery.gql +9 -9
- package/ChannelHandler/ChannelHandler.d.ts +52 -50
- package/ChannelHandler/ChannelHandler.js +114 -108
- package/ChannelHandler/ChannelHandler.js.map +1 -1
- 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 +72 -68
- package/ChannelHandler/channelUtils.js +372 -266
- package/ChannelHandler/channelUtils.js.map +1 -1
- package/ChannelHandler/redirectUtils.d.ts +4 -4
- package/ChannelHandler/redirectUtils.js +49 -49
- package/ChannelHandler/redirectUtils.test.js +514 -538
- package/ChannelHandler/redirectUtilsGroupedChannels.test.js +732 -0
- package/analytics/Analytics.d.ts +18 -18
- package/analytics/Analytics.js +56 -56
- package/analytics/AnalyticsProvider.d.ts +42 -42
- package/analytics/AnalyticsProvider.js +177 -177
- package/analytics/AnalyticsProvider.js.map +1 -1
- 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 +144 -145
- package/analytics/integrations/ga4.js.map +1 -1
- 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 +15 -17
- package/analytics/integrations/unslugify.js.map +1 -1
- 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.js.map +1 -1
- 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 +21 -20
- package/components/ChannelContext/ChannelContext.js +3 -3
- package/components/ChannelContext/ChannelContext.js.map +1 -1
- package/components/ChannelContext/ChannelProvider.d.ts +10 -10
- package/components/ChannelContext/ChannelProvider.js +44 -42
- package/components/ChannelContext/ChannelProvider.js.map +1 -1
- 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/ChannelContext/useCountrySettings.js.map +1 -1
- package/components/ConfigProvider.d.ts +107 -108
- package/components/ConfigProvider.js +19 -19
- package/components/ConfigProvider.js.map +1 -1
- 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 +79 -74
- package/components/Head.js.map +1 -1
- 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/OpenGraphGeneralPageData.js.map +1 -1
- package/components/OpenGraph/OpenGraphProductData.d.ts +25 -25
- package/components/OpenGraph/OpenGraphProductData.js +48 -48
- package/components/OpenGraph/OpenGraphProductData.js.map +1 -1
- 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/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 +59 -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.js.map +1 -1
- 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/useShopConfig.js.map +1 -1
- 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 +2 -2
- 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 +2465 -1231
- package/time.d.ts +1 -1
- package/time.js +5 -5
@@ -1,236 +1,236 @@
|
|
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 { getDataFromTree } from '@apollo/react-ssr';
|
11
|
-
import { getSelectedAndRecommendedChannel } from '@jetshop/core/ChannelHandler/channelUtils';
|
12
|
-
import { setupIntl } from '@jetshop/intl/config';
|
13
|
-
import IntlContext from '@jetshop/intl/context';
|
14
|
-
import React from 'react';
|
15
|
-
import { renderToString } from 'react-dom/server';
|
16
|
-
import { ChunkExtractor, ChunkExtractorManager } from '@loadable/server';
|
17
|
-
import { StaticRouter } from 'react-router-dom';
|
18
|
-
import { createPolyfill } from '../../polyfills';
|
19
|
-
import { getActiveFiltersFromSearch } from '../../resolvers/filters/filterParams';
|
20
|
-
import { createClient } from '../apollo';
|
21
|
-
import SharedTree from '../SharedTree';
|
22
|
-
import createIntlOptions from '../utils/createIntOptions';
|
23
|
-
import selectExperimentVariant from '../../experiments/selectExperimentVariant';
|
24
|
-
import { ChannelHandler } from '../../ChannelHandler/ChannelHandler';
|
25
|
-
import { AuthHandler } from '../AuthHandler';
|
26
|
-
import { PreviewHandler } from '../PreviewHandler';
|
27
|
-
import isBot from 'isbot';
|
28
|
-
import { getPersistedQueriesForRequest } from './persistedQueries/getPersistedQueriesForRequest';
|
29
|
-
import _merge from 'lodash.merge';
|
30
|
-
import { salesSourceMiddleware } from './salesSource';
|
31
|
-
import { getPreloadLinkHeaderString } from './getPreloadAssets';
|
32
|
-
import { primaryRouteForPathFetcher } from '../../../core/ChannelHandler/redirectUtils';
|
33
|
-
const injectDataIntoSlots = (template, data) => Object.keys(data).reduce((output, key) => key !== 'htmlAttributes'
|
34
|
-
? output.replace(`<slot name="${key}"/>`, data[key])
|
35
|
-
: output.replace('<html lang="en">', `<html ${data[key]}>`), template);
|
36
|
-
const wrapTree = (tree, req, renderOptions, client, channelHandler, authHandler, previewHandler, translator, locale, config, extractor) => __awaiter(void 0, void 0, void 0, function* () {
|
37
|
-
var _a;
|
38
|
-
const modules = [];
|
39
|
-
const routerContext = { url: null, statusCode: 200 };
|
40
|
-
const helmetContext = { helmet: null };
|
41
|
-
const wrappedTree = (React.createElement(ChunkExtractorManager, { extractor: extractor },
|
42
|
-
React.createElement(IntlContext.Provider, { value: translator },
|
43
|
-
React.createElement(SharedTree, { activeBreakpoint: req.breakpoint, config: renderOptions, cookies: req.universalCookies, helmetContext: helmetContext, client: client, channelHandler: channelHandler, authHandler: authHandler, previewHandler: previewHandler, Router: StaticRouter, routerProps: {
|
44
|
-
location: req.originalUrl,
|
45
|
-
context: routerContext
|
46
|
-
} }, tree))));
|
47
|
-
try {
|
48
|
-
// This getDataFromTree is used to get all of the data from the Query components
|
49
|
-
yield getDataFromTree(wrappedTree);
|
50
|
-
}
|
51
|
-
catch (e) {
|
52
|
-
// Don't log to Sentry here as we're already logging query errors in a
|
53
|
-
// middleware and JS errors further down in `handleError` and then
|
54
|
-
// again on the client if it fails to recover
|
55
|
-
if (e.message ===
|
56
|
-
'GraphQL error: This channel requires you to be logged in.' ||
|
57
|
-
((_a = e.networkError) === null || _a === void 0 ? void 0 : _a.statusCode) === 401) {
|
58
|
-
const base = channelHandler.getChannelBasename() || '';
|
59
|
-
const loginPathWithBase = base + config.loginPath;
|
60
|
-
const routesAllowedWithoutAuth = config.pathsWithNoAuthRequired.map((path) => base + path);
|
61
|
-
const matches = routesAllowedWithoutAuth.filter((route) => req.path.startsWith(route))
|
62
|
-
.length > 0;
|
63
|
-
// Redirect to login page on all other routes
|
64
|
-
if (!matches) {
|
65
|
-
const reqUrl = new URL(req.protocol + '://' + req.get('host') + req.originalUrl);
|
66
|
-
routerContext.statusCode = 302;
|
67
|
-
routerContext.url = loginPathWithBase + reqUrl.search;
|
68
|
-
}
|
69
|
-
}
|
70
|
-
else {
|
71
|
-
console.error('Apollo data fetch failed:', e);
|
72
|
-
routerContext.statusCode = 500;
|
73
|
-
}
|
74
|
-
}
|
75
|
-
// Serialize the apollo state for client side rehydration. The html comment
|
76
|
-
// (inside js comments) is intentional and prevents inline script tags
|
77
|
-
// inside the extracted state from closing this script tag prematurely
|
78
|
-
const apolloState = `<script>/*<!--*/
|
79
|
-
window.__APOLLO_STATE__=JSON.parse(${JSON.stringify(JSON.stringify(client.extract()))});
|
80
|
-
/*-->*/</script>`;
|
81
|
-
return {
|
82
|
-
wrappedTree,
|
83
|
-
modules,
|
84
|
-
routerUrl: routerContext.url,
|
85
|
-
statusCode: routerContext.statusCode,
|
86
|
-
helmet: helmetContext.helmet,
|
87
|
-
apolloState,
|
88
|
-
polyfill: createPolyfill(locale)
|
89
|
-
};
|
90
|
-
});
|
91
|
-
const startResponse = ({ res, head, statusCode }) => {
|
92
|
-
res.status(statusCode);
|
93
|
-
// write head and don't end response
|
94
|
-
res.write(head);
|
95
|
-
};
|
96
|
-
const endResponse = ({ res, foot }) => {
|
97
|
-
res.write(foot);
|
98
|
-
res.end();
|
99
|
-
};
|
100
|
-
const persistedQueryClients = {};
|
101
|
-
const createRenderer = (template, tree, options) => {
|
102
|
-
return (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
103
|
-
var _a;
|
104
|
-
const { apolloConfig, loadableStatsPath, intl, schema, globalClient, disableGeoRedirect, singleDomainMode } = options;
|
105
|
-
// Set response headers immediately
|
106
|
-
res.setHeader('Content-Type', 'text/html');
|
107
|
-
const fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
|
108
|
-
const cookies = req.universalCookies;
|
109
|
-
salesSourceMiddleware({
|
110
|
-
queryObject: req.query,
|
111
|
-
cookies
|
112
|
-
});
|
113
|
-
// geoIP is set in the load balancer
|
114
|
-
const geoipCountry = req.header('x-geoip-country');
|
115
|
-
const acceptedLanguages = req.headers['accept-language']
|
116
|
-
? req.headers['accept-language']
|
117
|
-
: '';
|
118
|
-
const channels = yield globalClient.getChannels();
|
119
|
-
const { selectedChannel, recommendedChannel, redirect } = getSelectedAndRecommendedChannel({
|
120
|
-
url: fullUrl,
|
121
|
-
singleDomainMode,
|
122
|
-
channels,
|
123
|
-
cookies,
|
124
|
-
geoipCountry,
|
125
|
-
acceptedLanguages,
|
126
|
-
disableGeoRedirect
|
127
|
-
});
|
128
|
-
const authHandler = new AuthHandler({
|
129
|
-
cookies
|
130
|
-
});
|
131
|
-
const previewHandler = new PreviewHandler();
|
132
|
-
const channelHandler = new ChannelHandler({
|
133
|
-
selectedChannel,
|
134
|
-
recommendedChannel,
|
135
|
-
channels
|
136
|
-
});
|
137
|
-
const createClientOpts = {
|
138
|
-
apolloConfig,
|
139
|
-
schema,
|
140
|
-
authHandler,
|
141
|
-
previewHandler,
|
142
|
-
req,
|
143
|
-
channelHandler
|
144
|
-
};
|
145
|
-
const { client } = createClient(createClientOpts);
|
146
|
-
channelHandler.setGetPrimaryRoutePath(primaryRouteForPathFetcher(client));
|
147
|
-
if (redirect && !isBot(req.header('user-agent'))) {
|
148
|
-
const redirectUrl = yield channelHandler.getRedirectUrl({
|
149
|
-
url: fullUrl,
|
150
|
-
newChannel: channelHandler.recommendedChannel,
|
151
|
-
preserveRedirect: true,
|
152
|
-
routes: options.routes
|
153
|
-
});
|
154
|
-
return res.redirect(302, redirectUrl);
|
155
|
-
}
|
156
|
-
const persistedQueries = yield ((_a = getPersistedQueriesForRequest(persistedQueryClients, createClientOpts)) === null || _a === void 0 ? void 0 : _a.extractCache());
|
157
|
-
// Merge channel and persisted query caches
|
158
|
-
const cachedChannels = yield globalClient.extractCache();
|
159
|
-
const combinedCache = _merge({}, cachedChannels, persistedQueries);
|
160
|
-
client.cache.restore(combinedCache);
|
161
|
-
// Initialise cache with active filters from the search params
|
162
|
-
client.cache.writeData({
|
163
|
-
data: {
|
164
|
-
activeFilters: getActiveFiltersFromSearch(req.query)
|
165
|
-
}
|
166
|
-
});
|
167
|
-
const intlOptions = createIntlOptions({
|
168
|
-
selectedChannel,
|
169
|
-
options: intl.options
|
170
|
-
});
|
171
|
-
const { translator, locale } = yield setupIntl({
|
172
|
-
translations: intl.translations,
|
173
|
-
locale: selectedChannel.language.culture,
|
174
|
-
defaultLocale: intl.defaultLocale,
|
175
|
-
options: intlOptions
|
176
|
-
});
|
177
|
-
if (options.optimize) {
|
178
|
-
const selectedVariant = req.universalCookies.get('optimizeExperiment');
|
179
|
-
const newVariant = selectExperimentVariant(options.optimize, selectedVariant);
|
180
|
-
if (newVariant) {
|
181
|
-
req.universalCookies.set('optimizeExperiment', newVariant, {
|
182
|
-
path: '/',
|
183
|
-
maxAge: 60 * 60 * 24 * 90 // 90 days
|
184
|
-
});
|
185
|
-
}
|
186
|
-
}
|
187
|
-
const chunkExtractor = new ChunkExtractor({
|
188
|
-
statsFile: loadableStatsPath,
|
189
|
-
entrypoints: ['client']
|
190
|
-
});
|
191
|
-
const { wrappedTree, routerUrl, statusCode, helmet: { htmlAttributes, title, meta, style, link }, apolloState, polyfill } = yield wrapTree(tree, req, options, client, channelHandler, authHandler, previewHandler, translator, locale, {
|
192
|
-
loginPath: options.loginPath,
|
193
|
-
pathsWithNoAuthRequired: options.pathsWithNoAuthRequired
|
194
|
-
}, chunkExtractor);
|
195
|
-
if (routerUrl) {
|
196
|
-
return res.redirect(
|
197
|
-
// We want to default to 302 redirects so if no status code comes back so we don't accidentally cache a temporary redirect as permanent
|
198
|
-
// If we get a non-redirect status code or no status code we won't redirect so we need to change the status code to 302
|
199
|
-
!statusCode || statusCode < 300 || statusCode >= 400 ? 302 : statusCode, routerUrl);
|
200
|
-
}
|
201
|
-
// We want to set the Link header string first so that the required assets are immediately downloaded before the html starts rendering
|
202
|
-
const preLoadAssets = chunkExtractor.getPreAssets();
|
203
|
-
if (preLoadAssets.length > 0) {
|
204
|
-
res.set('Link', getPreloadLinkHeaderString(preLoadAssets));
|
205
|
-
}
|
206
|
-
// Here we get the actual link, style, and script tags to be rendered in the html slots
|
207
|
-
const preloadLinks = chunkExtractor.getLinkTags();
|
208
|
-
const preloadStyles = chunkExtractor.getStyleTags();
|
209
|
-
const preloadScripts = chunkExtractor.getScriptTags();
|
210
|
-
// eslint
|
211
|
-
const breakpointScript = `<script>window.__ACTIVE_BREAKPOINT__ = "${req.breakpoint}";</script>`;
|
212
|
-
const geoipCountryScript = `<script>window.__GEOIP_COUNTRY__ = "${geoipCountry}";</script>`;
|
213
|
-
const acceptedLanguagesScript = `<script>window.__ACCEPTED_LANGUAGES__ = '${JSON.stringify(acceptedLanguages)}';</script>`;
|
214
|
-
const statusCodeScript = `<script>window.__STATUS_CODE__ = '${statusCode}';</script>`;
|
215
|
-
const data = {
|
216
|
-
apolloState: apolloState,
|
217
|
-
polyfill,
|
218
|
-
preloadLinks,
|
219
|
-
preloadScripts: preloadScripts +
|
220
|
-
geoipCountryScript +
|
221
|
-
acceptedLanguagesScript +
|
222
|
-
statusCodeScript,
|
223
|
-
title: title.toString(),
|
224
|
-
meta: meta.toString() + link.toString(),
|
225
|
-
style: style.toString() + breakpointScript + preloadStyles,
|
226
|
-
htmlAttributes: htmlAttributes.toString()
|
227
|
-
};
|
228
|
-
const html = injectDataIntoSlots(template, data);
|
229
|
-
const [head, foot] = html.split('<slot name="html"/>');
|
230
|
-
startResponse({ res, head, statusCode });
|
231
|
-
res.write(renderToString(wrappedTree));
|
232
|
-
endResponse({ res, foot });
|
233
|
-
});
|
234
|
-
};
|
235
|
-
export default createRenderer;
|
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 { getDataFromTree } from '@apollo/react-ssr';
|
11
|
+
import { getSelectedAndRecommendedChannel } from '@jetshop/core/ChannelHandler/channelUtils';
|
12
|
+
import { setupIntl } from '@jetshop/intl/config';
|
13
|
+
import IntlContext from '@jetshop/intl/context';
|
14
|
+
import React from 'react';
|
15
|
+
import { renderToString } from 'react-dom/server';
|
16
|
+
import { ChunkExtractor, ChunkExtractorManager } from '@loadable/server';
|
17
|
+
import { StaticRouter } from 'react-router-dom';
|
18
|
+
import { createPolyfill } from '../../polyfills';
|
19
|
+
import { getActiveFiltersFromSearch } from '../../resolvers/filters/filterParams';
|
20
|
+
import { createClient } from '../apollo';
|
21
|
+
import SharedTree from '../SharedTree';
|
22
|
+
import createIntlOptions from '../utils/createIntOptions';
|
23
|
+
import selectExperimentVariant from '../../experiments/selectExperimentVariant';
|
24
|
+
import { ChannelHandler } from '../../ChannelHandler/ChannelHandler';
|
25
|
+
import { AuthHandler } from '../AuthHandler';
|
26
|
+
import { PreviewHandler } from '../PreviewHandler';
|
27
|
+
import isBot from 'isbot';
|
28
|
+
import { getPersistedQueriesForRequest } from './persistedQueries/getPersistedQueriesForRequest';
|
29
|
+
import _merge from 'lodash.merge';
|
30
|
+
import { salesSourceMiddleware } from './salesSource';
|
31
|
+
import { getPreloadLinkHeaderString } from './getPreloadAssets';
|
32
|
+
import { primaryRouteForPathFetcher } from '../../../core/ChannelHandler/redirectUtils';
|
33
|
+
const injectDataIntoSlots = (template, data) => Object.keys(data).reduce((output, key) => key !== 'htmlAttributes'
|
34
|
+
? output.replace(`<slot name="${key}"/>`, data[key])
|
35
|
+
: output.replace('<html lang="en">', `<html ${data[key]}>`), template);
|
36
|
+
const wrapTree = (tree, req, renderOptions, client, channelHandler, authHandler, previewHandler, translator, locale, config, extractor) => __awaiter(void 0, void 0, void 0, function* () {
|
37
|
+
var _a;
|
38
|
+
const modules = [];
|
39
|
+
const routerContext = { url: null, statusCode: 200 };
|
40
|
+
const helmetContext = { helmet: null };
|
41
|
+
const wrappedTree = (React.createElement(ChunkExtractorManager, { extractor: extractor },
|
42
|
+
React.createElement(IntlContext.Provider, { value: translator },
|
43
|
+
React.createElement(SharedTree, { activeBreakpoint: req.breakpoint, config: renderOptions, cookies: req.universalCookies, helmetContext: helmetContext, client: client, channelHandler: channelHandler, authHandler: authHandler, previewHandler: previewHandler, Router: StaticRouter, routerProps: {
|
44
|
+
location: req.originalUrl,
|
45
|
+
context: routerContext
|
46
|
+
} }, tree))));
|
47
|
+
try {
|
48
|
+
// This getDataFromTree is used to get all of the data from the Query components
|
49
|
+
yield getDataFromTree(wrappedTree);
|
50
|
+
}
|
51
|
+
catch (e) {
|
52
|
+
// Don't log to Sentry here as we're already logging query errors in a
|
53
|
+
// middleware and JS errors further down in `handleError` and then
|
54
|
+
// again on the client if it fails to recover
|
55
|
+
if (e.message ===
|
56
|
+
'GraphQL error: This channel requires you to be logged in.' ||
|
57
|
+
((_a = e.networkError) === null || _a === void 0 ? void 0 : _a.statusCode) === 401) {
|
58
|
+
const base = channelHandler.getChannelBasename() || '';
|
59
|
+
const loginPathWithBase = base + config.loginPath;
|
60
|
+
const routesAllowedWithoutAuth = config.pathsWithNoAuthRequired.map((path) => base + path);
|
61
|
+
const matches = routesAllowedWithoutAuth.filter((route) => req.path.startsWith(route))
|
62
|
+
.length > 0;
|
63
|
+
// Redirect to login page on all other routes
|
64
|
+
if (!matches) {
|
65
|
+
const reqUrl = new URL(req.protocol + '://' + req.get('host') + req.originalUrl);
|
66
|
+
routerContext.statusCode = 302;
|
67
|
+
routerContext.url = loginPathWithBase + reqUrl.search;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
else {
|
71
|
+
console.error('Apollo data fetch failed:', e);
|
72
|
+
routerContext.statusCode = 500;
|
73
|
+
}
|
74
|
+
}
|
75
|
+
// Serialize the apollo state for client side rehydration. The html comment
|
76
|
+
// (inside js comments) is intentional and prevents inline script tags
|
77
|
+
// inside the extracted state from closing this script tag prematurely
|
78
|
+
const apolloState = `<script>/*<!--*/
|
79
|
+
window.__APOLLO_STATE__=JSON.parse(${JSON.stringify(JSON.stringify(client.extract()))});
|
80
|
+
/*-->*/</script>`;
|
81
|
+
return {
|
82
|
+
wrappedTree,
|
83
|
+
modules,
|
84
|
+
routerUrl: routerContext.url,
|
85
|
+
statusCode: routerContext.statusCode,
|
86
|
+
helmet: helmetContext.helmet,
|
87
|
+
apolloState,
|
88
|
+
polyfill: createPolyfill(locale)
|
89
|
+
};
|
90
|
+
});
|
91
|
+
const startResponse = ({ res, head, statusCode }) => {
|
92
|
+
res.status(statusCode);
|
93
|
+
// write head and don't end response
|
94
|
+
res.write(head);
|
95
|
+
};
|
96
|
+
const endResponse = ({ res, foot }) => {
|
97
|
+
res.write(foot);
|
98
|
+
res.end();
|
99
|
+
};
|
100
|
+
const persistedQueryClients = {};
|
101
|
+
const createRenderer = (template, tree, options) => {
|
102
|
+
return (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
103
|
+
var _a;
|
104
|
+
const { apolloConfig, loadableStatsPath, intl, schema, globalClient, disableGeoRedirect, singleDomainMode } = options;
|
105
|
+
// Set response headers immediately
|
106
|
+
res.setHeader('Content-Type', 'text/html');
|
107
|
+
const fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
|
108
|
+
const cookies = req.universalCookies;
|
109
|
+
salesSourceMiddleware({
|
110
|
+
queryObject: req.query,
|
111
|
+
cookies
|
112
|
+
});
|
113
|
+
// geoIP is set in the load balancer
|
114
|
+
const geoipCountry = req.header('x-geoip-country');
|
115
|
+
const acceptedLanguages = req.headers['accept-language']
|
116
|
+
? req.headers['accept-language']
|
117
|
+
: '';
|
118
|
+
const channels = yield globalClient.getChannels();
|
119
|
+
const { selectedChannel, recommendedChannel, redirect } = getSelectedAndRecommendedChannel({
|
120
|
+
url: fullUrl,
|
121
|
+
singleDomainMode,
|
122
|
+
channels,
|
123
|
+
cookies,
|
124
|
+
geoipCountry,
|
125
|
+
acceptedLanguages,
|
126
|
+
disableGeoRedirect
|
127
|
+
});
|
128
|
+
const authHandler = new AuthHandler({
|
129
|
+
cookies
|
130
|
+
});
|
131
|
+
const previewHandler = new PreviewHandler();
|
132
|
+
const channelHandler = new ChannelHandler({
|
133
|
+
selectedChannel,
|
134
|
+
recommendedChannel,
|
135
|
+
channels
|
136
|
+
});
|
137
|
+
const createClientOpts = {
|
138
|
+
apolloConfig,
|
139
|
+
schema,
|
140
|
+
authHandler,
|
141
|
+
previewHandler,
|
142
|
+
req,
|
143
|
+
channelHandler
|
144
|
+
};
|
145
|
+
const { client } = createClient(createClientOpts);
|
146
|
+
channelHandler.setGetPrimaryRoutePath(primaryRouteForPathFetcher(client));
|
147
|
+
if (redirect && !isBot(req.header('user-agent'))) {
|
148
|
+
const redirectUrl = yield channelHandler.getRedirectUrl({
|
149
|
+
url: fullUrl,
|
150
|
+
newChannel: channelHandler.recommendedChannel,
|
151
|
+
preserveRedirect: true,
|
152
|
+
routes: options.routes
|
153
|
+
});
|
154
|
+
return res.redirect(302, redirectUrl);
|
155
|
+
}
|
156
|
+
const persistedQueries = yield ((_a = getPersistedQueriesForRequest(persistedQueryClients, createClientOpts)) === null || _a === void 0 ? void 0 : _a.extractCache());
|
157
|
+
// Merge channel and persisted query caches
|
158
|
+
const cachedChannels = yield globalClient.extractCache();
|
159
|
+
const combinedCache = _merge({}, cachedChannels, persistedQueries);
|
160
|
+
client.cache.restore(combinedCache);
|
161
|
+
// Initialise cache with active filters from the search params
|
162
|
+
client.cache.writeData({
|
163
|
+
data: {
|
164
|
+
activeFilters: getActiveFiltersFromSearch(req.query)
|
165
|
+
}
|
166
|
+
});
|
167
|
+
const intlOptions = createIntlOptions({
|
168
|
+
selectedChannel,
|
169
|
+
options: intl.options
|
170
|
+
});
|
171
|
+
const { translator, locale } = yield setupIntl({
|
172
|
+
translations: intl.translations,
|
173
|
+
locale: selectedChannel.language.culture,
|
174
|
+
defaultLocale: intl.defaultLocale,
|
175
|
+
options: intlOptions
|
176
|
+
});
|
177
|
+
if (options.optimize) {
|
178
|
+
const selectedVariant = req.universalCookies.get('optimizeExperiment');
|
179
|
+
const newVariant = selectExperimentVariant(options.optimize, selectedVariant);
|
180
|
+
if (newVariant) {
|
181
|
+
req.universalCookies.set('optimizeExperiment', newVariant, {
|
182
|
+
path: '/',
|
183
|
+
maxAge: 60 * 60 * 24 * 90 // 90 days
|
184
|
+
});
|
185
|
+
}
|
186
|
+
}
|
187
|
+
const chunkExtractor = new ChunkExtractor({
|
188
|
+
statsFile: loadableStatsPath,
|
189
|
+
entrypoints: ['client']
|
190
|
+
});
|
191
|
+
const { wrappedTree, routerUrl, statusCode, helmet: { htmlAttributes, title, meta, style, link }, apolloState, polyfill } = yield wrapTree(tree, req, options, client, channelHandler, authHandler, previewHandler, translator, locale, {
|
192
|
+
loginPath: options.loginPath,
|
193
|
+
pathsWithNoAuthRequired: options.pathsWithNoAuthRequired
|
194
|
+
}, chunkExtractor);
|
195
|
+
if (routerUrl) {
|
196
|
+
return res.redirect(
|
197
|
+
// We want to default to 302 redirects so if no status code comes back so we don't accidentally cache a temporary redirect as permanent
|
198
|
+
// If we get a non-redirect status code or no status code we won't redirect so we need to change the status code to 302
|
199
|
+
!statusCode || statusCode < 300 || statusCode >= 400 ? 302 : statusCode, routerUrl);
|
200
|
+
}
|
201
|
+
// We want to set the Link header string first so that the required assets are immediately downloaded before the html starts rendering
|
202
|
+
const preLoadAssets = chunkExtractor.getPreAssets();
|
203
|
+
if (preLoadAssets.length > 0) {
|
204
|
+
res.set('Link', getPreloadLinkHeaderString(preLoadAssets));
|
205
|
+
}
|
206
|
+
// Here we get the actual link, style, and script tags to be rendered in the html slots
|
207
|
+
const preloadLinks = chunkExtractor.getLinkTags();
|
208
|
+
const preloadStyles = chunkExtractor.getStyleTags();
|
209
|
+
const preloadScripts = chunkExtractor.getScriptTags();
|
210
|
+
// eslint
|
211
|
+
const breakpointScript = `<script>window.__ACTIVE_BREAKPOINT__ = "${req.breakpoint}";</script>`;
|
212
|
+
const geoipCountryScript = `<script>window.__GEOIP_COUNTRY__ = "${geoipCountry}";</script>`;
|
213
|
+
const acceptedLanguagesScript = `<script>window.__ACCEPTED_LANGUAGES__ = '${JSON.stringify(acceptedLanguages)}';</script>`;
|
214
|
+
const statusCodeScript = `<script>window.__STATUS_CODE__ = '${statusCode}';</script>`;
|
215
|
+
const data = {
|
216
|
+
apolloState: apolloState,
|
217
|
+
polyfill,
|
218
|
+
preloadLinks,
|
219
|
+
preloadScripts: preloadScripts +
|
220
|
+
geoipCountryScript +
|
221
|
+
acceptedLanguagesScript +
|
222
|
+
statusCodeScript,
|
223
|
+
title: title.toString(),
|
224
|
+
meta: meta.toString() + link.toString(),
|
225
|
+
style: style.toString() + breakpointScript + preloadStyles,
|
226
|
+
htmlAttributes: htmlAttributes.toString()
|
227
|
+
};
|
228
|
+
const html = injectDataIntoSlots(template, data);
|
229
|
+
const [head, foot] = html.split('<slot name="html"/>');
|
230
|
+
startResponse({ res, head, statusCode });
|
231
|
+
res.write(renderToString(wrappedTree));
|
232
|
+
endResponse({ res, foot });
|
233
|
+
});
|
234
|
+
};
|
235
|
+
export default createRenderer;
|
236
236
|
//# sourceMappingURL=createRenderer.js.map
|
@@ -1,14 +1,14 @@
|
|
1
|
-
import { ApolloServer } from 'apollo-server-express';
|
2
|
-
import { Request, Response, Express, NextFunction } from 'express';
|
3
|
-
export interface Middleware {
|
4
|
-
path: string;
|
5
|
-
handler: (req: Request, res: Response, next: NextFunction) => Promise<void> | void;
|
6
|
-
}
|
7
|
-
export interface CreateServerOptions {
|
8
|
-
apolloServer: ApolloServer;
|
9
|
-
}
|
10
|
-
declare const createServer: ({ apolloServer, middlewares }: {
|
11
|
-
apolloServer?: ApolloServer;
|
12
|
-
middlewares: Middleware[];
|
13
|
-
}) => Express;
|
14
|
-
export default createServer;
|
1
|
+
import { ApolloServer } from 'apollo-server-express';
|
2
|
+
import { Request, Response, Express, NextFunction } from 'express';
|
3
|
+
export interface Middleware {
|
4
|
+
path: string;
|
5
|
+
handler: (req: Request, res: Response, next: NextFunction) => Promise<void> | void;
|
6
|
+
}
|
7
|
+
export interface CreateServerOptions {
|
8
|
+
apolloServer: ApolloServer;
|
9
|
+
}
|
10
|
+
declare const createServer: ({ apolloServer, middlewares }: {
|
11
|
+
apolloServer?: ApolloServer;
|
12
|
+
middlewares: Middleware[];
|
13
|
+
}) => Express;
|
14
|
+
export default createServer;
|
@@ -1,42 +1,42 @@
|
|
1
|
-
import * as Sentry from '@sentry/node';
|
2
|
-
import express from 'express';
|
3
|
-
import compression from 'compression';
|
4
|
-
import breakpointMiddleware from '@jetshop/core/boot/server/breakpointMiddleware';
|
5
|
-
import cookiesMiddleware from 'universal-cookie-express';
|
6
|
-
import report from '../../errorReporting';
|
7
|
-
// Makes the script crash on unhandled rejections instead of silently
|
8
|
-
// ignoring them. In the future, promise rejections that are not handled will
|
9
|
-
// terminate the Node.js process with a non-zero exit code.
|
10
|
-
process.on('unhandledRejection', (err) => {
|
11
|
-
report(err, { reason: 'unhandledRejection' });
|
12
|
-
throw err;
|
13
|
-
});
|
14
|
-
const createServer = ({ apolloServer, middlewares }) => {
|
15
|
-
const app = express();
|
16
|
-
// The Sentry.io request handler must be the first middleware on the app
|
17
|
-
if (process.env.USE_SENTRY === '1') {
|
18
|
-
app.use(Sentry.Handlers.requestHandler());
|
19
|
-
}
|
20
|
-
app.set('trust proxy', true);
|
21
|
-
app.use(compression());
|
22
|
-
app.use(breakpointMiddleware);
|
23
|
-
app.use(cookiesMiddleware());
|
24
|
-
if (apolloServer) {
|
25
|
-
apolloServer.applyMiddleware({
|
26
|
-
app: app,
|
27
|
-
path: '/graphql'
|
28
|
-
});
|
29
|
-
}
|
30
|
-
app.use(express.json());
|
31
|
-
middlewares.forEach(({ path, handler }) => app.use(path, handler));
|
32
|
-
app.use(express.static(process.env.RAZZLE_PUBLIC_DIR, {
|
33
|
-
maxAge: '365d'
|
34
|
-
}));
|
35
|
-
// The error handler must be before any other error middleware
|
36
|
-
if (process.env.USE_SENTRY === '1') {
|
37
|
-
app.use(Sentry.Handlers.errorHandler());
|
38
|
-
}
|
39
|
-
return app;
|
40
|
-
};
|
41
|
-
export default createServer;
|
1
|
+
import * as Sentry from '@sentry/node';
|
2
|
+
import express from 'express';
|
3
|
+
import compression from 'compression';
|
4
|
+
import breakpointMiddleware from '@jetshop/core/boot/server/breakpointMiddleware';
|
5
|
+
import cookiesMiddleware from 'universal-cookie-express';
|
6
|
+
import report from '../../errorReporting';
|
7
|
+
// Makes the script crash on unhandled rejections instead of silently
|
8
|
+
// ignoring them. In the future, promise rejections that are not handled will
|
9
|
+
// terminate the Node.js process with a non-zero exit code.
|
10
|
+
process.on('unhandledRejection', (err) => {
|
11
|
+
report(err, { reason: 'unhandledRejection' });
|
12
|
+
throw err;
|
13
|
+
});
|
14
|
+
const createServer = ({ apolloServer, middlewares }) => {
|
15
|
+
const app = express();
|
16
|
+
// The Sentry.io request handler must be the first middleware on the app
|
17
|
+
if (process.env.USE_SENTRY === '1') {
|
18
|
+
app.use(Sentry.Handlers.requestHandler());
|
19
|
+
}
|
20
|
+
app.set('trust proxy', true);
|
21
|
+
app.use(compression());
|
22
|
+
app.use(breakpointMiddleware);
|
23
|
+
app.use(cookiesMiddleware());
|
24
|
+
if (apolloServer) {
|
25
|
+
apolloServer.applyMiddleware({
|
26
|
+
app: app,
|
27
|
+
path: '/graphql'
|
28
|
+
});
|
29
|
+
}
|
30
|
+
app.use(express.json());
|
31
|
+
middlewares.forEach(({ path, handler }) => app.use(path, handler));
|
32
|
+
app.use(express.static(process.env.RAZZLE_PUBLIC_DIR, {
|
33
|
+
maxAge: '365d'
|
34
|
+
}));
|
35
|
+
// The error handler must be before any other error middleware
|
36
|
+
if (process.env.USE_SENTRY === '1') {
|
37
|
+
app.use(Sentry.Handlers.errorHandler());
|
38
|
+
}
|
39
|
+
return app;
|
40
|
+
};
|
41
|
+
export default createServer;
|
42
42
|
//# sourceMappingURL=createServer.js.map
|
@@ -1 +1 @@
|
|
1
|
-
export {};
|
1
|
+
export {};
|