@salesforce/retail-react-app 1.0.0-preview.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/.eslintignore +7 -0
- package/.eslintrc.js +25 -0
- package/.prettierignore +4 -0
- package/.prettierrc.yaml +7 -0
- package/CHANGELOG.md +173 -0
- package/LICENSE +14 -0
- package/README.md +48 -0
- package/app/assets/svg/account.svg +3 -0
- package/app/assets/svg/alert.svg +3 -0
- package/app/assets/svg/basket.svg +3 -0
- package/app/assets/svg/brand-logo.svg +10 -0
- package/app/assets/svg/cc-amex.svg +7 -0
- package/app/assets/svg/cc-cvv.svg +8 -0
- package/app/assets/svg/cc-discover.svg +14 -0
- package/app/assets/svg/cc-mastercard.svg +8 -0
- package/app/assets/svg/cc-visa.svg +11 -0
- package/app/assets/svg/check-circle.svg +3 -0
- package/app/assets/svg/check.svg +3 -0
- package/app/assets/svg/chevron-down.svg +3 -0
- package/app/assets/svg/chevron-left.svg +3 -0
- package/app/assets/svg/chevron-right.svg +3 -0
- package/app/assets/svg/chevron-up.svg +3 -0
- package/app/assets/svg/close.svg +3 -0
- package/app/assets/svg/dashboard.svg +4 -0
- package/app/assets/svg/figma-logo.svg +14 -0
- package/app/assets/svg/file.svg +3 -0
- package/app/assets/svg/filter.svg +3 -0
- package/app/assets/svg/flag-ca.svg +5 -0
- package/app/assets/svg/flag-cn.svg +19 -0
- package/app/assets/svg/flag-fr.svg +19 -0
- package/app/assets/svg/flag-gb.svg +16 -0
- package/app/assets/svg/flag-it.svg +29 -0
- package/app/assets/svg/flag-jp.svg +10 -0
- package/app/assets/svg/flag-us.svg +7 -0
- package/app/assets/svg/github-logo.svg +40 -0
- package/app/assets/svg/hamburger.svg +8 -0
- package/app/assets/svg/heart-solid.svg +7 -0
- package/app/assets/svg/heart.svg +3 -0
- package/app/assets/svg/info.svg +3 -0
- package/app/assets/svg/like.svg +4 -0
- package/app/assets/svg/location.svg +3 -0
- package/app/assets/svg/lock.svg +3 -0
- package/app/assets/svg/paypal.svg +19 -0
- package/app/assets/svg/plug.svg +3 -0
- package/app/assets/svg/plus.svg +3 -0
- package/app/assets/svg/receipt.svg +3 -0
- package/app/assets/svg/search.svg +8 -0
- package/app/assets/svg/signout.svg +3 -0
- package/app/assets/svg/social-facebook.svg +3 -0
- package/app/assets/svg/social-instagram.svg +3 -0
- package/app/assets/svg/social-pinterest.svg +4 -0
- package/app/assets/svg/social-twitter.svg +3 -0
- package/app/assets/svg/social-youtube.svg +3 -0
- package/app/assets/svg/user.svg +3 -0
- package/app/assets/svg/visibility-off.svg +5 -0
- package/app/assets/svg/visibility.svg +3 -0
- package/app/components/_app/index.jsx +401 -0
- package/app/components/_app/index.test.js +85 -0
- package/app/components/_app/partials/above-header.jsx +10 -0
- package/app/components/_app-config/index.jsx +125 -0
- package/app/components/_app-config/index.test.js +77 -0
- package/app/components/_error/index.jsx +142 -0
- package/app/components/_error/index.test.js +25 -0
- package/app/components/action-card/index.jsx +75 -0
- package/app/components/address-display/index.jsx +30 -0
- package/app/components/basic-tile/index.jsx +65 -0
- package/app/components/basic-tile/index.test.js +23 -0
- package/app/components/breadcrumb/index.jsx +67 -0
- package/app/components/breadcrumb/index.test.js +30 -0
- package/app/components/confirmation-modal/index.jsx +111 -0
- package/app/components/confirmation-modal/index.test.js +98 -0
- package/app/components/drawer-menu/index.jsx +405 -0
- package/app/components/drawer-menu/index.test.js +33 -0
- package/app/components/dynamic-image/index.jsx +56 -0
- package/app/components/field/index.jsx +161 -0
- package/app/components/footer/index.jsx +269 -0
- package/app/components/footer/index.test.js +22 -0
- package/app/components/forms/address-fields.jsx +49 -0
- package/app/components/forms/credit-card-fields.jsx +149 -0
- package/app/components/forms/form-action-buttons.jsx +55 -0
- package/app/components/forms/login-fields.jsx +31 -0
- package/app/components/forms/password-requirements.jsx +99 -0
- package/app/components/forms/post-checkout-registration-fields.jsx +43 -0
- package/app/components/forms/profile-fields.jsx +36 -0
- package/app/components/forms/promo-code-fields.jsx +43 -0
- package/app/components/forms/registration-fields.jsx +42 -0
- package/app/components/forms/reset-password-fields.jsx +31 -0
- package/app/components/forms/state-province-options.jsx +75 -0
- package/app/components/forms/update-password-fields.jsx +49 -0
- package/app/components/forms/useAddressFields.jsx +196 -0
- package/app/components/forms/useCreditCardFields.jsx +146 -0
- package/app/components/forms/useLoginFields.jsx +52 -0
- package/app/components/forms/useProfileFields.jsx +95 -0
- package/app/components/forms/usePromoCodeFields.jsx +39 -0
- package/app/components/forms/useRegistrationFields.jsx +136 -0
- package/app/components/forms/useResetPasswordFields.jsx +40 -0
- package/app/components/forms/useUpdatePasswordFields.jsx +89 -0
- package/app/components/header/index.jsx +290 -0
- package/app/components/header/index.test.js +217 -0
- package/app/components/hero/index.jsx +84 -0
- package/app/components/hero/index.test.js +40 -0
- package/app/components/icons/index.jsx +158 -0
- package/app/components/icons/index.test.js +20 -0
- package/app/components/image-gallery/index.jsx +176 -0
- package/app/components/image-gallery/index.test.js +485 -0
- package/app/components/item-variant/index.jsx +33 -0
- package/app/components/item-variant/item-attributes.jsx +107 -0
- package/app/components/item-variant/item-image.jsx +73 -0
- package/app/components/item-variant/item-name.jsx +28 -0
- package/app/components/item-variant/item-price.jsx +117 -0
- package/app/components/link/index.jsx +32 -0
- package/app/components/link/index.test.js +72 -0
- package/app/components/links-list/index.jsx +89 -0
- package/app/components/links-list/index.test.js +62 -0
- package/app/components/list-menu/index.jsx +280 -0
- package/app/components/list-menu/index.test.js +44 -0
- package/app/components/loading-spinner/index.jsx +46 -0
- package/app/components/locale-selector/index.jsx +124 -0
- package/app/components/locale-selector/index.test.js +37 -0
- package/app/components/locale-text/index.jsx +97 -0
- package/app/components/locale-text/index.test.js +36 -0
- package/app/components/login/index.jsx +96 -0
- package/app/components/nested-accordion/index.jsx +185 -0
- package/app/components/nested-accordion/index.test.js +98 -0
- package/app/components/offline-banner/index.jsx +40 -0
- package/app/components/offline-banner/index.test.js +15 -0
- package/app/components/offline-boundary/index.jsx +104 -0
- package/app/components/offline-boundary/index.test.js +123 -0
- package/app/components/order-summary/index.jsx +331 -0
- package/app/components/page-action-placeholder/index.jsx +50 -0
- package/app/components/pagination/index.jsx +134 -0
- package/app/components/pagination/index.test.js +25 -0
- package/app/components/product-item/index.jsx +146 -0
- package/app/components/product-item/index.test.js +38 -0
- package/app/components/product-scroller/index.jsx +172 -0
- package/app/components/product-scroller/index.test.js +98 -0
- package/app/components/product-tile/index.jsx +195 -0
- package/app/components/product-tile/index.test.js +96 -0
- package/app/components/product-view/index.jsx +538 -0
- package/app/components/product-view/index.test.js +224 -0
- package/app/components/product-view-modal/index.jsx +48 -0
- package/app/components/product-view-modal/index.test.js +72 -0
- package/app/components/promo-code/index.jsx +162 -0
- package/app/components/promo-popover/index.jsx +83 -0
- package/app/components/quantity-picker/index.jsx +58 -0
- package/app/components/radio-card/index.jsx +75 -0
- package/app/components/recommended-products/index.jsx +227 -0
- package/app/components/register/index.jsx +114 -0
- package/app/components/reset-password/index.jsx +87 -0
- package/app/components/responsive/index.jsx +29 -0
- package/app/components/scroll-to-top/index.jsx +24 -0
- package/app/components/scroll-to-top/index.test.js +46 -0
- package/app/components/search/index.jsx +279 -0
- package/app/components/search/index.test.js +127 -0
- package/app/components/search/partials/recent-searches.jsx +76 -0
- package/app/components/search/partials/search-suggestions.jsx +45 -0
- package/app/components/search/partials/suggestions.jsx +43 -0
- package/app/components/section/index.jsx +68 -0
- package/app/components/seo/index.jsx +33 -0
- package/app/components/social-icons/index.jsx +101 -0
- package/app/components/social-icons/index.test.js +30 -0
- package/app/components/swatch-group/index.jsx +77 -0
- package/app/components/swatch-group/index.test.js +136 -0
- package/app/components/swatch-group/swatch.jsx +94 -0
- package/app/components/toggle-card/index.jsx +97 -0
- package/app/components/with-registration/index.jsx +58 -0
- package/app/components/with-registration/index.test.js +85 -0
- package/app/constants.js +109 -0
- package/app/contexts/index.js +92 -0
- package/app/hooks/einstein-mock-data.js +916 -0
- package/app/hooks/index.js +17 -0
- package/app/hooks/use-add-to-cart-modal.js +344 -0
- package/app/hooks/use-add-to-cart-modal.test.js +625 -0
- package/app/hooks/use-auth-modal.js +337 -0
- package/app/hooks/use-auth-modal.test.js +365 -0
- package/app/hooks/use-currency.js +20 -0
- package/app/hooks/use-currency.test.js +41 -0
- package/app/hooks/use-current-basket.js +39 -0
- package/app/hooks/use-current-customer.js +29 -0
- package/app/hooks/use-derived-product.js +77 -0
- package/app/hooks/use-derived-product.test.js +69 -0
- package/app/hooks/use-einstein.js +512 -0
- package/app/hooks/use-einstein.test.js +224 -0
- package/app/hooks/use-intersection-observer.js +64 -0
- package/app/hooks/use-limit-urls.js +31 -0
- package/app/hooks/use-limit-urls.test.js +40 -0
- package/app/hooks/use-multi-site.js +36 -0
- package/app/hooks/use-multi-site.test.js +53 -0
- package/app/hooks/use-navigation.js +37 -0
- package/app/hooks/use-navigation.test.js +109 -0
- package/app/hooks/use-page-urls.js +35 -0
- package/app/hooks/use-page-urls.test.js +39 -0
- package/app/hooks/use-pdp-search-params.js +16 -0
- package/app/hooks/use-pdp-search-params.test.js +52 -0
- package/app/hooks/use-previous.js +17 -0
- package/app/hooks/use-product-view-modal.js +93 -0
- package/app/hooks/use-product-view-modal.test.js +172 -0
- package/app/hooks/use-search-params.js +96 -0
- package/app/hooks/use-search-params.test.js +91 -0
- package/app/hooks/use-sort-urls.js +33 -0
- package/app/hooks/use-sort-urls.test.js +42 -0
- package/app/hooks/use-toast.js +68 -0
- package/app/hooks/use-toast.test.js +58 -0
- package/app/hooks/use-variant.js +32 -0
- package/app/hooks/use-variant.test.js +81 -0
- package/app/hooks/use-variation-attributes.js +138 -0
- package/app/hooks/use-variation-attributes.test.js +119 -0
- package/app/hooks/use-variation-params.js +31 -0
- package/app/hooks/use-variation-params.test.js +73 -0
- package/app/hooks/use-wish-list.js +42 -0
- package/app/main.jsx +14 -0
- package/app/mocks/basket-with-suit.js +146 -0
- package/app/mocks/empty-basket.js +39 -0
- package/app/mocks/mock-data.js +5632 -0
- package/app/mocks/product-set-winter-lookM.js +1224 -0
- package/app/mocks/searchResults.js +144 -0
- package/app/mocks/variant-750518699578M.js +434 -0
- package/app/page-designer/README.md +102 -0
- package/app/page-designer/assets/image-tile/index.jsx +51 -0
- package/app/page-designer/assets/image-tile/index.test.js +30 -0
- package/app/page-designer/assets/image-with-text/index.jsx +140 -0
- package/app/page-designer/assets/image-with-text/index.test.js +38 -0
- package/app/page-designer/assets/index.js +9 -0
- package/app/page-designer/index.js +10 -0
- package/app/page-designer/layouts/carousel/index.jsx +222 -0
- package/app/page-designer/layouts/carousel/index.test.js +43 -0
- package/app/page-designer/layouts/index.js +14 -0
- package/app/page-designer/layouts/mobileGrid1r1c/index.jsx +36 -0
- package/app/page-designer/layouts/mobileGrid1r1c/index.test.js +35 -0
- package/app/page-designer/layouts/mobileGrid2r1c/index.jsx +37 -0
- package/app/page-designer/layouts/mobileGrid2r1c/index.test.js +47 -0
- package/app/page-designer/layouts/mobileGrid2r2c/index.jsx +37 -0
- package/app/page-designer/layouts/mobileGrid2r2c/index.test.js +71 -0
- package/app/page-designer/layouts/mobileGrid2r3c/index.jsx +37 -0
- package/app/page-designer/layouts/mobileGrid2r3c/index.test.js +95 -0
- package/app/page-designer/layouts/mobileGrid3r1c/index.jsx +37 -0
- package/app/page-designer/layouts/mobileGrid3r1c/index.test.js +59 -0
- package/app/page-designer/layouts/mobileGrid3r2c/index.jsx +37 -0
- package/app/page-designer/layouts/mobileGrid3r2c/index.test.js +95 -0
- package/app/page-designer/utils.js +14 -0
- package/app/pages/account/addresses.jsx +382 -0
- package/app/pages/account/addresses.test.js +120 -0
- package/app/pages/account/constant.js +57 -0
- package/app/pages/account/index.jsx +237 -0
- package/app/pages/account/index.test.js +188 -0
- package/app/pages/account/order-detail.jsx +397 -0
- package/app/pages/account/order-history.jsx +264 -0
- package/app/pages/account/orders.jsx +30 -0
- package/app/pages/account/orders.test.js +95 -0
- package/app/pages/account/profile.jsx +357 -0
- package/app/pages/account/wishlist/index.jsx +195 -0
- package/app/pages/account/wishlist/index.mock.js +1481 -0
- package/app/pages/account/wishlist/index.test.js +56 -0
- package/app/pages/account/wishlist/partials/wishlist-primary-action.jsx +170 -0
- package/app/pages/account/wishlist/partials/wishlist-primary-action.mock.js +1623 -0
- package/app/pages/account/wishlist/partials/wishlist-primary-action.test.js +99 -0
- package/app/pages/account/wishlist/partials/wishlist-secondary-button-group.jsx +120 -0
- package/app/pages/account/wishlist/partials/wishlist-secondary-button-group.test.js +391 -0
- package/app/pages/cart/index.jsx +476 -0
- package/app/pages/cart/index.test.js +481 -0
- package/app/pages/cart/partials/cart-cta.jsx +46 -0
- package/app/pages/cart/partials/cart-secondary-button-group.jsx +135 -0
- package/app/pages/cart/partials/cart-secondary-button-group.test.js +103 -0
- package/app/pages/cart/partials/cart-skeleton.jsx +93 -0
- package/app/pages/cart/partials/cart-title.jsx +27 -0
- package/app/pages/cart/partials/empty-cart.jsx +86 -0
- package/app/pages/checkout/confirmation.jsx +541 -0
- package/app/pages/checkout/confirmation.mock.js +450 -0
- package/app/pages/checkout/confirmation.test.js +114 -0
- package/app/pages/checkout/index.jsx +169 -0
- package/app/pages/checkout/index.test.js +582 -0
- package/app/pages/checkout/partials/cc-radio-group.jsx +122 -0
- package/app/pages/checkout/partials/checkout-footer.jsx +140 -0
- package/app/pages/checkout/partials/checkout-footer.test.js +16 -0
- package/app/pages/checkout/partials/checkout-header.jsx +54 -0
- package/app/pages/checkout/partials/checkout-header.test.js +16 -0
- package/app/pages/checkout/partials/checkout-skeleton.jsx +52 -0
- package/app/pages/checkout/partials/contact-info.jsx +251 -0
- package/app/pages/checkout/partials/contact-info.test.js +43 -0
- package/app/pages/checkout/partials/payment-form.jsx +97 -0
- package/app/pages/checkout/partials/payment.jsx +276 -0
- package/app/pages/checkout/partials/shipping-address-selection.jsx +377 -0
- package/app/pages/checkout/partials/shipping-address.jsx +132 -0
- package/app/pages/checkout/partials/shipping-options.jsx +232 -0
- package/app/pages/checkout/util/checkout-context.js +94 -0
- package/app/pages/home/data.js +134 -0
- package/app/pages/home/index.jsx +301 -0
- package/app/pages/home/index.test.js +23 -0
- package/app/pages/login/index.jsx +123 -0
- package/app/pages/login/index.test.js +229 -0
- package/app/pages/login-redirect/index.jsx +23 -0
- package/app/pages/login-redirect/index.test.js +16 -0
- package/app/pages/page-not-found/index.jsx +90 -0
- package/app/pages/page-not-found/index.test.js +31 -0
- package/app/pages/product-detail/index.jsx +394 -0
- package/app/pages/product-detail/index.mock.js +197 -0
- package/app/pages/product-detail/index.test.js +162 -0
- package/app/pages/product-detail/partials/information-accordion.jsx +121 -0
- package/app/pages/product-list/index.jsx +735 -0
- package/app/pages/product-list/index.test.js +180 -0
- package/app/pages/product-list/partials/above-page-header.jsx +10 -0
- package/app/pages/product-list/partials/checkbox-refinements.jsx +41 -0
- package/app/pages/product-list/partials/checkbox-refinements.test.js +53 -0
- package/app/pages/product-list/partials/color-refinements.jsx +88 -0
- package/app/pages/product-list/partials/empty-results.jsx +118 -0
- package/app/pages/product-list/partials/link-refinements.jsx +38 -0
- package/app/pages/product-list/partials/page-header.jsx +42 -0
- package/app/pages/product-list/partials/radio-refinements.jsx +60 -0
- package/app/pages/product-list/partials/refinements.jsx +144 -0
- package/app/pages/product-list/partials/selected-refinements.jsx +100 -0
- package/app/pages/product-list/partials/size-refinements.jsx +55 -0
- package/app/pages/registration/index.jsx +87 -0
- package/app/pages/registration/index.test.jsx +132 -0
- package/app/pages/reset-password/index.jsx +112 -0
- package/app/pages/reset-password/index.test.jsx +141 -0
- package/app/request-processor.js +118 -0
- package/app/request-processor.test.js +23 -0
- package/app/routes.jsx +111 -0
- package/app/routes.test.js +13 -0
- package/app/ssr.js +70 -0
- package/app/static/ico/favicon.ico +0 -0
- package/app/static/img/global/app-icon-192.png +0 -0
- package/app/static/img/global/app-icon-512.png +0 -0
- package/app/static/img/global/apple-touch-icon.png +0 -0
- package/app/static/img/hero.png +0 -0
- package/app/static/manifest.json +19 -0
- package/app/static/robots.txt +2 -0
- package/app/theme/components/base/accordion.js +21 -0
- package/app/theme/components/base/alert.js +17 -0
- package/app/theme/components/base/badge.js +25 -0
- package/app/theme/components/base/button.js +77 -0
- package/app/theme/components/base/checkbox.js +30 -0
- package/app/theme/components/base/container.js +17 -0
- package/app/theme/components/base/drawer.js +26 -0
- package/app/theme/components/base/formLabel.js +13 -0
- package/app/theme/components/base/icon.js +13 -0
- package/app/theme/components/base/input.js +44 -0
- package/app/theme/components/base/modal.js +11 -0
- package/app/theme/components/base/popover.js +61 -0
- package/app/theme/components/base/radio.js +33 -0
- package/app/theme/components/base/select.js +15 -0
- package/app/theme/components/base/skeleton.js +12 -0
- package/app/theme/components/base/tooltip.js +19 -0
- package/app/theme/components/project/_app.js +25 -0
- package/app/theme/components/project/breadcrumb.js +25 -0
- package/app/theme/components/project/checkout-footer.js +35 -0
- package/app/theme/components/project/drawer-menu.js +66 -0
- package/app/theme/components/project/footer.js +84 -0
- package/app/theme/components/project/header.js +84 -0
- package/app/theme/components/project/image-gallery.js +59 -0
- package/app/theme/components/project/links-list.js +43 -0
- package/app/theme/components/project/list-menu.js +91 -0
- package/app/theme/components/project/locale-selector.js +42 -0
- package/app/theme/components/project/nested-accordion.js +26 -0
- package/app/theme/components/project/offline-banner.js +25 -0
- package/app/theme/components/project/pagination.js +22 -0
- package/app/theme/components/project/product-tile.js +32 -0
- package/app/theme/components/project/social-icons.js +52 -0
- package/app/theme/components/project/swatch-group.js +115 -0
- package/app/theme/foundations/colors.js +170 -0
- package/app/theme/foundations/gradients.js +9 -0
- package/app/theme/foundations/layerStyles.js +41 -0
- package/app/theme/foundations/shadows.js +9 -0
- package/app/theme/foundations/sizes.js +18 -0
- package/app/theme/foundations/space.js +9 -0
- package/app/theme/foundations/styles.js +21 -0
- package/app/theme/index.js +104 -0
- package/app/utils/cc-utils.js +112 -0
- package/app/utils/cc-utils.test.js +41 -0
- package/app/utils/image-groups-utils.js +62 -0
- package/app/utils/image-groups-utils.test.js +65 -0
- package/app/utils/locale.js +78 -0
- package/app/utils/locale.test.js +112 -0
- package/app/utils/password-utils.js +21 -0
- package/app/utils/phone-utils.js +22 -0
- package/app/utils/phone-utils.test.js +15 -0
- package/app/utils/product-utils.js +35 -0
- package/app/utils/product-utils.test.js +51 -0
- package/app/utils/responsive-image.js +198 -0
- package/app/utils/responsive-image.test.js +170 -0
- package/app/utils/routes-utils.js +111 -0
- package/app/utils/routes-utils.test.js +291 -0
- package/app/utils/site-utils.js +222 -0
- package/app/utils/site-utils.test.js +376 -0
- package/app/utils/test-utils.js +257 -0
- package/app/utils/url.js +291 -0
- package/app/utils/url.test.js +421 -0
- package/app/utils/utils.js +201 -0
- package/app/utils/utils.test.js +182 -0
- package/babel.config.js +7 -0
- package/cache-hash-config.json +8 -0
- package/config/default.js +64 -0
- package/config/mocks/default.js +131 -0
- package/config/sites.js +78 -0
- package/jest-setup.js +191 -0
- package/jest.config.js +50 -0
- package/jsconfig.json +13 -0
- package/package.json +105 -0
- package/scripts/extract-default-messages.js +92 -0
- package/tests/lighthouserc.js +37 -0
- package/translations/README.md +127 -0
- package/translations/compiled/de-DE.json +3212 -0
- package/translations/compiled/en-GB.json +3212 -0
- package/translations/compiled/en-US.json +3212 -0
- package/translations/compiled/en-XA.json +6948 -0
- package/translations/compiled/es-MX.json +3216 -0
- package/translations/compiled/fr-FR.json +3216 -0
- package/translations/compiled/it-IT.json +3188 -0
- package/translations/compiled/ja-JP.json +3200 -0
- package/translations/compiled/ko-KR.json +3180 -0
- package/translations/compiled/pt-BR.json +3220 -0
- package/translations/compiled/zh-CN.json +3212 -0
- package/translations/compiled/zh-TW.json +3208 -0
- package/translations/de-DE.json +1417 -0
- package/translations/en-GB.json +1417 -0
- package/translations/en-US.json +1417 -0
- package/translations/es-MX.json +1417 -0
- package/translations/fr-FR.json +1417 -0
- package/translations/it-IT.json +1417 -0
- package/translations/ja-JP.json +1417 -0
- package/translations/ko-KR.json +1417 -0
- package/translations/pt-BR.json +1417 -0
- package/translations/zh-CN.json +1417 -0
- package/translations/zh-TW.json +1417 -0
- package/worker/main.js +36 -0
package/app/utils/url.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021, salesforce.com, inc.
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
+
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {getAppOrigin} from '@salesforce/pwa-kit-react-sdk/utils/url'
|
|
9
|
+
import {
|
|
10
|
+
getLocaleByReference,
|
|
11
|
+
getParamsFromPath,
|
|
12
|
+
getDefaultSite,
|
|
13
|
+
getSiteByReference
|
|
14
|
+
} from '@salesforce/retail-react-app/app/utils/site-utils'
|
|
15
|
+
import {HOME_HREF, urlPartPositions} from '@salesforce/retail-react-app/app/constants'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A function that takes a path and qualifies it with the current host and protocol.
|
|
19
|
+
* This function works on the client and on the server.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* absoluteUrl(/women/dresses?color=black)
|
|
23
|
+
*
|
|
24
|
+
* // => http(s)://www.site.com/women/dresses?color=black
|
|
25
|
+
* @param path
|
|
26
|
+
* @returns {string|*}
|
|
27
|
+
*/
|
|
28
|
+
export const absoluteUrl = (path) => {
|
|
29
|
+
return new URL(path, getAppOrigin()).toString()
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Modifies a given url by adding/updating query parameters.
|
|
34
|
+
*
|
|
35
|
+
* @param {string} url - The base url of the output url set.
|
|
36
|
+
* @param {object} extraParams - A key values pairing used to add static search param values.
|
|
37
|
+
* @returns {string} A URL with additional params
|
|
38
|
+
* @example
|
|
39
|
+
* import {rebuildPathWithParams} from '/path/to/utils/url'
|
|
40
|
+
*
|
|
41
|
+
* rebuildPathWithParams(
|
|
42
|
+
* '/en-GB/product/25501032M',
|
|
43
|
+
* {color: 'JJ2SKXX', size: 'MD'}
|
|
44
|
+
* )
|
|
45
|
+
*
|
|
46
|
+
* // Returns
|
|
47
|
+
* // '/en-GB/product/25501032M?color=JJ2SKXX&size=9MD'
|
|
48
|
+
*/
|
|
49
|
+
export const rebuildPathWithParams = (url, extraParams) => {
|
|
50
|
+
const [pathname, search] = url.split('?')
|
|
51
|
+
const params = new URLSearchParams(search)
|
|
52
|
+
|
|
53
|
+
updateSearchParams(params, extraParams)
|
|
54
|
+
|
|
55
|
+
// Clean up any trailing `=` for params without values.
|
|
56
|
+
const paramStr = params.toString().replace(/=&/g, '&').replace(/=$/, '')
|
|
57
|
+
|
|
58
|
+
// Generate the newly updated url.
|
|
59
|
+
return `${pathname}${Array.from(paramStr).length > 0 ? `?${paramStr}` : ''}`
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export const updateSearchParams = (searchParams, newParams) => {
|
|
63
|
+
Object.entries(newParams).forEach(([key, value]) => {
|
|
64
|
+
// 0 is a valid value as for a param
|
|
65
|
+
if (!value && value !== 0) {
|
|
66
|
+
searchParams.delete(key)
|
|
67
|
+
} else {
|
|
68
|
+
searchParams.set(key, value)
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Builds a list of modified Urls with the provided params key and values,
|
|
75
|
+
* preserving any search params provided in the original url.Optionally
|
|
76
|
+
* you can pass and object used to set static params values.
|
|
77
|
+
* @param {string} url - The base url of the output url set.
|
|
78
|
+
* @param {string} key - The search params for the associated values
|
|
79
|
+
* @param {Array} values - The search param values
|
|
80
|
+
* @param {object} extraParams - A key values pairing used to add static search param values.
|
|
81
|
+
* @returns {string[]} A list of URLs
|
|
82
|
+
* @example
|
|
83
|
+
* import {buildUrlSet} from '/path/to/utils/url'
|
|
84
|
+
*
|
|
85
|
+
* buildUrlSet(
|
|
86
|
+
* '/womens/clothing',
|
|
87
|
+
* 'sort',
|
|
88
|
+
* ['price-high-to-low', 'price-low-to-high'],
|
|
89
|
+
* {offset: 0}
|
|
90
|
+
* )
|
|
91
|
+
*
|
|
92
|
+
* // Returns
|
|
93
|
+
* // ['/womens/clothing?sort=price-high-to-low', '/womens/clothing?sort=price-low-to-high']
|
|
94
|
+
*/
|
|
95
|
+
export const buildUrlSet = (url = '', key = '', values = [], extraParams = {}) =>
|
|
96
|
+
values.map((value) => rebuildPathWithParams(url, {[key]: value, ...extraParams}))
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Given a category and the current locale returns an href to the product list page.
|
|
100
|
+
*
|
|
101
|
+
* @param {Object} category
|
|
102
|
+
* @returns {string}
|
|
103
|
+
*/
|
|
104
|
+
export const categoryUrlBuilder = (category) => encodeURI(`/category/${category.id}`)
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Given a product and the current locale returns an href to the product detail page.
|
|
108
|
+
*
|
|
109
|
+
* @param {Object} product
|
|
110
|
+
* @returns {string}
|
|
111
|
+
*/
|
|
112
|
+
export const productUrlBuilder = (product) => encodeURI(`/product/${product.id}`)
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Given a search term, constructs a search url.
|
|
116
|
+
*
|
|
117
|
+
* @param {string} searchTerm
|
|
118
|
+
* @returns {string}
|
|
119
|
+
*/
|
|
120
|
+
export const searchUrlBuilder = (searchTerm) => '/search?q=' + encodeURIComponent(searchTerm)
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Returns a relative URL for a locale short code.
|
|
124
|
+
* Based on your app configuration, this function will replace your current locale shortCode with a new one
|
|
125
|
+
*
|
|
126
|
+
* @param {String} shortCode - The locale short code.
|
|
127
|
+
* @param {function(*, *, *, *=): string} - Generates a site URL from the provided path, site and locale.
|
|
128
|
+
* @param {string[]} opts.disallowParams - URL parameters to remove
|
|
129
|
+
* @param {Object} opts.location - location object to replace the default `window.location`
|
|
130
|
+
* @returns {String} url - The relative URL for the specific locale.
|
|
131
|
+
*/
|
|
132
|
+
export const getPathWithLocale = (shortCode, buildUrl, opts = {}) => {
|
|
133
|
+
const location = opts.location ? opts.location : window.location
|
|
134
|
+
let {siteRef, localeRef} = getParamsFromPath(`${location.pathname}${location.search}`)
|
|
135
|
+
let {pathname, search} = location
|
|
136
|
+
|
|
137
|
+
// sanitize the site from current url if existing
|
|
138
|
+
if (siteRef) {
|
|
139
|
+
pathname = pathname.replace(`/${siteRef}`, '')
|
|
140
|
+
search = search.replace(`site=${siteRef}`, '')
|
|
141
|
+
}
|
|
142
|
+
// sanitize the locale from current url if existing
|
|
143
|
+
if (localeRef) {
|
|
144
|
+
pathname = pathname.replace(`/${localeRef}`, '')
|
|
145
|
+
search = search.replace(`locale=${localeRef}`, '')
|
|
146
|
+
}
|
|
147
|
+
// remove ending any &
|
|
148
|
+
search = search.replace(/&$/, '')
|
|
149
|
+
|
|
150
|
+
const defaultSite = getDefaultSite()
|
|
151
|
+
|
|
152
|
+
// Remove query parameters
|
|
153
|
+
const {disallowParams = []} = opts
|
|
154
|
+
|
|
155
|
+
let queryString = new URLSearchParams(`${search}`)
|
|
156
|
+
|
|
157
|
+
if (disallowParams.length) {
|
|
158
|
+
disallowParams.forEach((param) => {
|
|
159
|
+
queryString.delete(param)
|
|
160
|
+
})
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const site = getSiteByReference(siteRef)
|
|
164
|
+
|
|
165
|
+
const locale = getLocaleByReference(site, shortCode)
|
|
166
|
+
|
|
167
|
+
// rebuild the url with new locale,
|
|
168
|
+
const newUrl = buildUrl(
|
|
169
|
+
`${pathname}${Array.from(queryString).length !== 0 ? `?${queryString}` : ''}`,
|
|
170
|
+
// By default, as for home page, when the values of site and locale belongs to the default site,
|
|
171
|
+
// they will be not shown in the url just
|
|
172
|
+
defaultSite.alias || defaultSite.id,
|
|
173
|
+
locale?.alias || locale?.id
|
|
174
|
+
)
|
|
175
|
+
return newUrl
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Generates the URL Template literal (Template string) used to build URLs in the App according
|
|
180
|
+
* the current selected site/locale and the default App URL configuration.
|
|
181
|
+
*
|
|
182
|
+
* @param appConfig Application default configuration.
|
|
183
|
+
* @param siteRef Current selected Site reference. The value can be the Site id or alias.
|
|
184
|
+
* @param localeRef Current selected Locale reference. The value can be the Locale id or alias.
|
|
185
|
+
* @returns {function(*, *, *): string} function providing: path, site and locale generates a URL.
|
|
186
|
+
*/
|
|
187
|
+
export const createUrlTemplate = (appConfig, siteRef, localeRef) => {
|
|
188
|
+
const {site: siteConfig, locale: localeConfig, showDefaults: showDefaultsConfig} = appConfig.url
|
|
189
|
+
const defaultSite = getDefaultSite()
|
|
190
|
+
const site = getSiteByReference(siteRef)
|
|
191
|
+
const defaultLocale = getLocaleByReference(site, site.l10n.defaultLocale)
|
|
192
|
+
|
|
193
|
+
const isDefaultSite =
|
|
194
|
+
defaultSite.id === siteRef || (defaultSite.alias && defaultSite.alias === siteRef)
|
|
195
|
+
const isDefaultLocale =
|
|
196
|
+
defaultLocale.id === localeRef || (defaultLocale.alias && defaultLocale.alias === localeRef)
|
|
197
|
+
|
|
198
|
+
const querySite =
|
|
199
|
+
(siteConfig === urlPartPositions.QUERY_PARAM && showDefaultsConfig) ||
|
|
200
|
+
(siteConfig === urlPartPositions.QUERY_PARAM && !showDefaultsConfig && !isDefaultSite)
|
|
201
|
+
const queryLocale =
|
|
202
|
+
(localeConfig === urlPartPositions.QUERY_PARAM && showDefaultsConfig) ||
|
|
203
|
+
(localeConfig === urlPartPositions.QUERY_PARAM && !showDefaultsConfig && !isDefaultLocale)
|
|
204
|
+
|
|
205
|
+
const isQuery = querySite || queryLocale
|
|
206
|
+
|
|
207
|
+
const pathSite =
|
|
208
|
+
(siteConfig === urlPartPositions.PATH && showDefaultsConfig) ||
|
|
209
|
+
(siteConfig === urlPartPositions.PATH && !showDefaultsConfig && !isDefaultSite)
|
|
210
|
+
const pathLocale =
|
|
211
|
+
(localeConfig === urlPartPositions.PATH && showDefaultsConfig) ||
|
|
212
|
+
(localeConfig === urlPartPositions.PATH && !showDefaultsConfig && !isDefaultLocale)
|
|
213
|
+
|
|
214
|
+
return (path, site, locale) => {
|
|
215
|
+
const isHomeWithDefaultSiteAndLocale =
|
|
216
|
+
path === HOME_HREF &&
|
|
217
|
+
(defaultSite.id === site || (defaultSite.alias && defaultSite.alias === site)) &&
|
|
218
|
+
(defaultLocale.id === locale || (defaultLocale.alias && defaultLocale.alias === locale))
|
|
219
|
+
|
|
220
|
+
const sitePath = pathSite && site && !isHomeWithDefaultSiteAndLocale ? `/${site}` : ''
|
|
221
|
+
const localePath =
|
|
222
|
+
pathLocale && locale && !isHomeWithDefaultSiteAndLocale ? `/${locale}` : ''
|
|
223
|
+
|
|
224
|
+
const hasQuery = isQuery && (site || locale) && !isHomeWithDefaultSiteAndLocale
|
|
225
|
+
let queryString = ''
|
|
226
|
+
if (hasQuery) {
|
|
227
|
+
const searchParams = new URLSearchParams()
|
|
228
|
+
querySite && site && searchParams.append('site', site)
|
|
229
|
+
queryLocale && locale && searchParams.append('locale', locale)
|
|
230
|
+
queryString = `?${searchParams.toString()}`
|
|
231
|
+
}
|
|
232
|
+
return `${sitePath}${localePath}${path}${queryString}`
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/*
|
|
237
|
+
* Remove query params from a give url path based on a given list of keys
|
|
238
|
+
*
|
|
239
|
+
* @param {string} path - The part of url to have params removed from.
|
|
240
|
+
* @param {array} keys - list of params to be removed
|
|
241
|
+
* @returns {string} - the url after param has been removed
|
|
242
|
+
* @example
|
|
243
|
+
* import {removeQueryParamsFromPath} from /path/to/util/url
|
|
244
|
+
*
|
|
245
|
+
* removeQueryParamsFromPath(
|
|
246
|
+
* /en-GB/cart?pid=1234&color=black&size=s&abc=12,
|
|
247
|
+
* ['pid', 'color', 'size']
|
|
248
|
+
* )
|
|
249
|
+
* // returns
|
|
250
|
+
* // '/en-GB/cart?abc=12'
|
|
251
|
+
*/
|
|
252
|
+
export const removeQueryParamsFromPath = (path, keys) => {
|
|
253
|
+
const [pathname, search] = path.split('?')
|
|
254
|
+
const params = new URLSearchParams(search)
|
|
255
|
+
keys.forEach((key) => {
|
|
256
|
+
if (params.has(key)) {
|
|
257
|
+
params.delete(key)
|
|
258
|
+
}
|
|
259
|
+
})
|
|
260
|
+
|
|
261
|
+
// Clean up any trailing `=` for params without values.
|
|
262
|
+
const paramStr = params.toString().replace(/=&/g, '&').replace(/=$/, '')
|
|
263
|
+
|
|
264
|
+
return `${pathname}${paramStr && '?'}${paramStr}`
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/*
|
|
268
|
+
* Remove site alias and locale from a given url, to be used for "navigate" urls
|
|
269
|
+
*
|
|
270
|
+
* @param {string} pathName - The part of url to have site alias and locale removed from
|
|
271
|
+
* @returns {string} - the path after site alias and locale have been removed
|
|
272
|
+
* @example
|
|
273
|
+
* import {removeSiteLocaleFromPath} from /path/to/util/url
|
|
274
|
+
*
|
|
275
|
+
* removeSiteLocaleFromPath(/RefArch/en-US/account/wishlist)
|
|
276
|
+
* // returns '/account/wishlist'
|
|
277
|
+
*/
|
|
278
|
+
export const removeSiteLocaleFromPath = (pathName = '') => {
|
|
279
|
+
let {siteRef, localeRef} = getParamsFromPath(pathName)
|
|
280
|
+
|
|
281
|
+
// remove the site alias from the current pathName
|
|
282
|
+
if (siteRef) {
|
|
283
|
+
pathName = pathName.replace(new RegExp(`/${siteRef}`, 'g'), '')
|
|
284
|
+
}
|
|
285
|
+
// remove the locale from the current pathName
|
|
286
|
+
if (localeRef) {
|
|
287
|
+
pathName = pathName.replace(new RegExp(`/${localeRef}`, 'g'), '')
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return pathName
|
|
291
|
+
}
|