@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
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
import React from 'react'
|
|
8
|
+
import {screen, waitFor, within} from '@testing-library/react'
|
|
9
|
+
import {rest} from 'msw'
|
|
10
|
+
import {
|
|
11
|
+
createPathWithDefaults,
|
|
12
|
+
renderWithProviders
|
|
13
|
+
} from '@salesforce/retail-react-app/app/utils/test-utils'
|
|
14
|
+
import ResetPassword from '.'
|
|
15
|
+
import mockConfig from '@salesforce/retail-react-app/config/mocks/default'
|
|
16
|
+
|
|
17
|
+
const mockRegisteredCustomer = {
|
|
18
|
+
authType: 'registered',
|
|
19
|
+
customerId: 'registeredCustomerId',
|
|
20
|
+
customerNo: 'testno',
|
|
21
|
+
email: 'darek@test.com',
|
|
22
|
+
firstName: 'Tester',
|
|
23
|
+
lastName: 'Testing',
|
|
24
|
+
login: 'darek@test.com'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const MockedComponent = () => {
|
|
28
|
+
return (
|
|
29
|
+
<div>
|
|
30
|
+
<ResetPassword />
|
|
31
|
+
</div>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Set up and clean up
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
jest.resetModules()
|
|
38
|
+
window.history.pushState({}, 'Reset Password', createPathWithDefaults('/reset-password'))
|
|
39
|
+
global.server.use(
|
|
40
|
+
rest.post('*/customers', (req, res, ctx) => {
|
|
41
|
+
return res(ctx.delay(0), ctx.status(200), ctx.json(mockRegisteredCustomer))
|
|
42
|
+
}),
|
|
43
|
+
rest.get('*/customers/:customerId', (req, res, ctx) => {
|
|
44
|
+
const {customerId} = req.params
|
|
45
|
+
if (customerId === 'customerId') {
|
|
46
|
+
return res(
|
|
47
|
+
ctx.delay(0),
|
|
48
|
+
ctx.status(200),
|
|
49
|
+
ctx.json({
|
|
50
|
+
authType: 'guest',
|
|
51
|
+
customerId: 'customerid'
|
|
52
|
+
})
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
return res(ctx.delay(0), ctx.status(200), ctx.json(mockRegisteredCustomer))
|
|
56
|
+
})
|
|
57
|
+
)
|
|
58
|
+
})
|
|
59
|
+
afterEach(() => {
|
|
60
|
+
jest.resetModules()
|
|
61
|
+
localStorage.clear()
|
|
62
|
+
jest.clearAllMocks()
|
|
63
|
+
window.history.pushState({}, 'Reset Password', createPathWithDefaults('/reset-password'))
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
test('Allows customer to go to sign in page', async () => {
|
|
67
|
+
// render our test component
|
|
68
|
+
const {user} = renderWithProviders(<MockedComponent />, {
|
|
69
|
+
wrapperProps: {siteAlias: 'uk', appConfig: mockConfig.app}
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
await user.click(await screen.findByText('Sign in'))
|
|
73
|
+
|
|
74
|
+
await waitFor(() => {
|
|
75
|
+
expect(window.location.pathname).toBe('/uk/en-GB/login')
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
test('Allows customer to generate password token', async () => {
|
|
80
|
+
global.server.use(
|
|
81
|
+
rest.post('*/create-reset-token', (req, res, ctx) =>
|
|
82
|
+
res(
|
|
83
|
+
ctx.delay(0),
|
|
84
|
+
ctx.json({
|
|
85
|
+
email: 'foo@test.com',
|
|
86
|
+
expiresInMinutes: 10,
|
|
87
|
+
login: 'foo@test.com',
|
|
88
|
+
resetToken: 'testresettoken'
|
|
89
|
+
})
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
// render our test component
|
|
94
|
+
const {user} = renderWithProviders(<MockedComponent />, {
|
|
95
|
+
wrapperProps: {siteAlias: 'uk', appConfig: mockConfig.app}
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
// enter credentials and submit
|
|
99
|
+
await user.type(await screen.findByLabelText('Email'), 'foo@test.com')
|
|
100
|
+
await user.click(
|
|
101
|
+
within(await screen.findByTestId('sf-auth-modal-form')).getByText(/reset password/i)
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
expect(await screen.findByText(/password reset/i, {}, {timeout: 12000})).toBeInTheDocument()
|
|
105
|
+
|
|
106
|
+
await waitFor(() => {
|
|
107
|
+
expect(screen.getByText(/foo@test.com/i)).toBeInTheDocument()
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
await user.click(screen.getByText('Back to Sign In'))
|
|
111
|
+
|
|
112
|
+
await waitFor(() => {
|
|
113
|
+
expect(window.location.pathname).toBe('/uk/en-GB/login')
|
|
114
|
+
})
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
test('Renders error message from server', async () => {
|
|
118
|
+
global.server.use(
|
|
119
|
+
rest.post('*/create-reset-token', (req, res, ctx) =>
|
|
120
|
+
res(
|
|
121
|
+
ctx.delay(0),
|
|
122
|
+
ctx.status(500),
|
|
123
|
+
ctx.json({
|
|
124
|
+
detail: 'Something went wrong',
|
|
125
|
+
title: 'Error',
|
|
126
|
+
type: '/error'
|
|
127
|
+
})
|
|
128
|
+
)
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
const {user} = renderWithProviders(<MockedComponent />)
|
|
132
|
+
|
|
133
|
+
await user.type(await screen.findByLabelText('Email'), 'foo@test.com')
|
|
134
|
+
await user.click(
|
|
135
|
+
within(await screen.findByTestId('sf-auth-modal-form')).getByText(/reset password/i)
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
await waitFor(() => {
|
|
139
|
+
expect(screen.getByText('500 Internal Server Error')).toBeInTheDocument()
|
|
140
|
+
})
|
|
141
|
+
})
|
|
@@ -0,0 +1,118 @@
|
|
|
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
|
+
// This is an EXAMPLE file. To enable request processing, rename it to
|
|
9
|
+
// 'request-processor.js' and update the processRequest function so that
|
|
10
|
+
// it processes requests in whatever way your project requires.
|
|
11
|
+
|
|
12
|
+
// Uncomment the following line for the example code to work.
|
|
13
|
+
import {QueryParameters} from '@salesforce/pwa-kit-runtime/utils/ssr-request-processing'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The processRequest function is called for *every* non-proxy, non-bundle
|
|
17
|
+
* request received. That is, all requests that will result in pages being
|
|
18
|
+
* rendered, or the Express app requestHook function being invoked. Because
|
|
19
|
+
* this function runs for every request, it is important that processing
|
|
20
|
+
* take as little time as possible. Do not make external requests from
|
|
21
|
+
* this code. Make your code error tolerant; throwing an error from
|
|
22
|
+
* this function will cause a 500 error response to be sent to the
|
|
23
|
+
* requesting client.
|
|
24
|
+
*
|
|
25
|
+
* The processRequest function is passed details of the incoming request,
|
|
26
|
+
* function to support request-class setting plus parameters that refer to
|
|
27
|
+
* the target for which this code is being run.
|
|
28
|
+
*
|
|
29
|
+
* The function must return an object with 'path' and 'querystring'. These
|
|
30
|
+
* may be the same values passed in, or modified values.
|
|
31
|
+
*
|
|
32
|
+
* Processing query strings can be challenging, because there are multiple
|
|
33
|
+
* formats in use, URL-quoting may be required, and the order of parameters
|
|
34
|
+
* in the URL may be important. To avoid issues, use the QueryParameters
|
|
35
|
+
* class from the SDK's 'utils/ssr-request-processing' module. This
|
|
36
|
+
* class will correctly preserve the order, case, values and encoding of
|
|
37
|
+
* the parameters. The QueryParameters class is documented in the SDK.
|
|
38
|
+
*
|
|
39
|
+
* @param path {String} the path part of the URL, beginning with a '/'
|
|
40
|
+
* @param querystring {String} the query string part of the URL, without
|
|
41
|
+
* any initial '?'
|
|
42
|
+
* @param headers {Headers} the headers of the incoming request. This should
|
|
43
|
+
* be considered read-only (although header values can be changed, most headers
|
|
44
|
+
* are not passed to the origin, so changes have no effect).
|
|
45
|
+
* @param setRequestClass {function} call this with a string to set the
|
|
46
|
+
* "class" of the incoming request. By default, requests have no class.
|
|
47
|
+
* @param parameters {Object}
|
|
48
|
+
* @param parameters.appHostname {String} the "application host name" is the
|
|
49
|
+
* hostname to which requests are sent for this target: the website's hostname.
|
|
50
|
+
* @param parameters.deployTarget {String} the target's id. Use this to have
|
|
51
|
+
* different processing for different targets.
|
|
52
|
+
* @param parameters.proxyConfigs {Object[]} an array of proxy configuration
|
|
53
|
+
* object, each one containing protocol, host and path for a proxy. Use this
|
|
54
|
+
* to have different processing for different backends.
|
|
55
|
+
* @returns {{path: String, querystring: String}}
|
|
56
|
+
*/
|
|
57
|
+
export const processRequest = ({
|
|
58
|
+
// Uncomment the following lines for the example code to work.
|
|
59
|
+
// headers,
|
|
60
|
+
// setRequestClass,
|
|
61
|
+
// parameters,
|
|
62
|
+
path,
|
|
63
|
+
querystring
|
|
64
|
+
}) => {
|
|
65
|
+
// This is an EXAMPLE processRequest implementation. You should
|
|
66
|
+
// replace it with code that processes your requests as needed.
|
|
67
|
+
|
|
68
|
+
// This example code will remove any of the parameters whose keys appear
|
|
69
|
+
// in the 'exclusions' array.
|
|
70
|
+
const exclusions = [
|
|
71
|
+
// 'gclid',
|
|
72
|
+
// 'utm_campaign',
|
|
73
|
+
// 'utm_content',
|
|
74
|
+
// 'utm_medium',
|
|
75
|
+
// 'utm_source'
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
// This is a performance optimization for SLAS.
|
|
79
|
+
// On client side, browser always follow the redirect
|
|
80
|
+
// to /callback but the response is always the same.
|
|
81
|
+
// We strip out the unique query parameters so this
|
|
82
|
+
// endpoint is cached at the CDN level
|
|
83
|
+
if (path === '/callback') {
|
|
84
|
+
exclusions.push('usid')
|
|
85
|
+
exclusions.push('code')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Build a first QueryParameters object from the given querystring
|
|
89
|
+
const incomingParameters = new QueryParameters(querystring)
|
|
90
|
+
|
|
91
|
+
// Build a second QueryParameters from the first, with all
|
|
92
|
+
// excluded parameters removed
|
|
93
|
+
const filteredParameters = QueryParameters.from(
|
|
94
|
+
incomingParameters.parameters.filter(
|
|
95
|
+
// parameter.key is always lower-case
|
|
96
|
+
(parameter) => !exclusions.includes(parameter.key)
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
// Re-generate the querystring
|
|
101
|
+
querystring = filteredParameters.toString()
|
|
102
|
+
|
|
103
|
+
/***************************************************************************
|
|
104
|
+
// This example code will detect bots by examining the user-agent,
|
|
105
|
+
// and will set the request class to 'bot' for all such requests.
|
|
106
|
+
const ua = headers.getHeader('user-agent')
|
|
107
|
+
// This check
|
|
108
|
+
const botcheck = /bot|crawler|spider|crawling/i
|
|
109
|
+
if (botcheck.test(ua)) {
|
|
110
|
+
setRequestClass('bot')
|
|
111
|
+
}
|
|
112
|
+
***************************************************************************/
|
|
113
|
+
// Return the path unchanged, and the updated query string
|
|
114
|
+
return {
|
|
115
|
+
path,
|
|
116
|
+
querystring
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
import {processRequest} from '@salesforce/retail-react-app/app/request-processor'
|
|
8
|
+
|
|
9
|
+
describe('processRequest', () => {
|
|
10
|
+
test('returns valid values', () => {
|
|
11
|
+
const result = processRequest({path: 'path', querystring: 'querystring'})
|
|
12
|
+
|
|
13
|
+
expect(result.path).toEqual(expect.any(String))
|
|
14
|
+
expect(result.querystring).toEqual(expect.any(String))
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
test('SLAS callback parameters are removed', () => {
|
|
18
|
+
const result = processRequest({path: '/callback', querystring: 'usid=1&code=2&test=3'})
|
|
19
|
+
|
|
20
|
+
expect(result.path).toBe('/callback')
|
|
21
|
+
expect(result.querystring).toBe('test=3')
|
|
22
|
+
})
|
|
23
|
+
})
|
package/app/routes.jsx
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
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
|
+
/* istanbul ignore file */
|
|
9
|
+
// NOTE!
|
|
10
|
+
// This file is being ignored in the test coverage report for now. It reports `0%` functions
|
|
11
|
+
// tested, which brings down the overall coverage and blocks CI. There are tests still, but
|
|
12
|
+
// we don't want it to count toward coverage until we figure out how to cover the `functions`
|
|
13
|
+
// metric for this file in its test.
|
|
14
|
+
|
|
15
|
+
import React from 'react'
|
|
16
|
+
import loadable from '@loadable/component'
|
|
17
|
+
import {getConfig} from '@salesforce/pwa-kit-runtime/utils/ssr-config'
|
|
18
|
+
|
|
19
|
+
// Components
|
|
20
|
+
import {Skeleton} from '@chakra-ui/react'
|
|
21
|
+
import {configureRoutes} from '@salesforce/retail-react-app/app/utils/routes-utils'
|
|
22
|
+
|
|
23
|
+
const fallback = <Skeleton height="75vh" width="100%" />
|
|
24
|
+
|
|
25
|
+
// Pages
|
|
26
|
+
const Home = loadable(() => import('./pages/home'), {fallback})
|
|
27
|
+
const Login = loadable(() => import('./pages/login'), {fallback})
|
|
28
|
+
const Registration = loadable(() => import('./pages/registration'), {fallback})
|
|
29
|
+
const ResetPassword = loadable(() => import('./pages/reset-password'), {fallback})
|
|
30
|
+
const Account = loadable(() => import('./pages/account'), {fallback})
|
|
31
|
+
const Cart = loadable(() => import('./pages/cart'), {fallback})
|
|
32
|
+
const Checkout = loadable(() => import('./pages/checkout'), {fallback})
|
|
33
|
+
const CheckoutConfirmation = loadable(() => import('./pages/checkout/confirmation'), {fallback})
|
|
34
|
+
const LoginRedirect = loadable(() => import('./pages/login-redirect'), {fallback})
|
|
35
|
+
const ProductDetail = loadable(() => import('./pages/product-detail'), {fallback})
|
|
36
|
+
const ProductList = loadable(() => import('./pages/product-list'), {fallback})
|
|
37
|
+
const Wishlist = loadable(() => import('./pages/account/wishlist'), {fallback})
|
|
38
|
+
const PageNotFound = loadable(() => import('./pages/page-not-found'))
|
|
39
|
+
|
|
40
|
+
export const routes = [
|
|
41
|
+
{
|
|
42
|
+
path: '/',
|
|
43
|
+
component: Home,
|
|
44
|
+
exact: true
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
path: '/login',
|
|
48
|
+
component: Login,
|
|
49
|
+
exact: true
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
path: '/registration',
|
|
53
|
+
component: Registration,
|
|
54
|
+
exact: true
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
path: '/reset-password',
|
|
58
|
+
component: ResetPassword,
|
|
59
|
+
exact: true
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
path: '/account',
|
|
63
|
+
component: Account
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
path: '/checkout',
|
|
67
|
+
component: Checkout,
|
|
68
|
+
exact: true
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
path: '/checkout/confirmation/:orderNo',
|
|
72
|
+
component: CheckoutConfirmation
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
path: '/callback',
|
|
76
|
+
component: LoginRedirect,
|
|
77
|
+
exact: true
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
path: '/cart',
|
|
81
|
+
component: Cart,
|
|
82
|
+
exact: true
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
path: '/product/:productId',
|
|
86
|
+
component: ProductDetail
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
path: '/search',
|
|
90
|
+
component: ProductList
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
path: '/category/:categoryId',
|
|
94
|
+
component: ProductList
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
path: '/account/wishlist',
|
|
98
|
+
component: Wishlist
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
path: '*',
|
|
102
|
+
component: PageNotFound
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
export default () => {
|
|
107
|
+
const config = getConfig()
|
|
108
|
+
return configureRoutes(routes, config, {
|
|
109
|
+
ignoredRoutes: ['/callback', '*']
|
|
110
|
+
})
|
|
111
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
import routes from '@salesforce/retail-react-app/app/routes'
|
|
8
|
+
|
|
9
|
+
describe('Routes', () => {
|
|
10
|
+
test('exports a valid react-router configuration', () => {
|
|
11
|
+
expect(Array.isArray(routes) || typeof routes === 'function').toBe(true)
|
|
12
|
+
})
|
|
13
|
+
})
|
package/app/ssr.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
8
|
+
'use strict'
|
|
9
|
+
|
|
10
|
+
const path = require('path')
|
|
11
|
+
const {getRuntime} = require('@salesforce/pwa-kit-runtime/ssr/server/express')
|
|
12
|
+
const {isRemote} = require('@salesforce/pwa-kit-runtime/utils/ssr-server')
|
|
13
|
+
const {getConfig} = require('@salesforce/pwa-kit-runtime/utils/ssr-config')
|
|
14
|
+
const helmet = require('helmet')
|
|
15
|
+
|
|
16
|
+
const options = {
|
|
17
|
+
// The build directory (an absolute path)
|
|
18
|
+
buildDir: path.resolve(process.cwd(), 'build'),
|
|
19
|
+
|
|
20
|
+
// The cache time for SSR'd pages (defaults to 600 seconds)
|
|
21
|
+
defaultCacheTimeSeconds: 600,
|
|
22
|
+
|
|
23
|
+
// This is the value of the 'mobify' object from package.json
|
|
24
|
+
mobify: getConfig(),
|
|
25
|
+
|
|
26
|
+
// The port that the local dev server listens on
|
|
27
|
+
port: 3000,
|
|
28
|
+
|
|
29
|
+
// The protocol on which the development Express app listens.
|
|
30
|
+
// Note that http://localhost is treated as a secure context for development.
|
|
31
|
+
protocol: 'http'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const runtime = getRuntime()
|
|
35
|
+
|
|
36
|
+
const {handler} = runtime.createHandler(options, (app) => {
|
|
37
|
+
// Set HTTP security headers
|
|
38
|
+
app.use(
|
|
39
|
+
helmet({
|
|
40
|
+
contentSecurityPolicy: {
|
|
41
|
+
useDefaults: true,
|
|
42
|
+
directives: {
|
|
43
|
+
'img-src': ["'self'", '*.commercecloud.salesforce.com', 'data:'],
|
|
44
|
+
'script-src': ["'self'", "'unsafe-eval'", 'storage.googleapis.com'],
|
|
45
|
+
'connect-src': ["'self'", 'api.cquotient.com'],
|
|
46
|
+
|
|
47
|
+
// Do not upgrade insecure requests for local development
|
|
48
|
+
'upgrade-insecure-requests': isRemote() ? [] : null
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
hsts: isRemote()
|
|
52
|
+
})
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
// Handle the redirect from SLAS as to avoid error
|
|
56
|
+
app.get('/callback?*', (req, res) => {
|
|
57
|
+
// This endpoint does nothing and is not expected to change
|
|
58
|
+
// Thus we cache it for a year to maximize performance
|
|
59
|
+
res.set('Cache-Control', `max-age=31536000`)
|
|
60
|
+
res.send()
|
|
61
|
+
})
|
|
62
|
+
app.get('/robots.txt', runtime.serveStaticFile('static/robots.txt'))
|
|
63
|
+
app.get('/favicon.ico', runtime.serveStaticFile('static/ico/favicon.ico'))
|
|
64
|
+
|
|
65
|
+
app.get('/worker.js(.map)?', runtime.serveServiceWorker)
|
|
66
|
+
app.get('*', runtime.render)
|
|
67
|
+
})
|
|
68
|
+
// SSR requires that we export a single handler function called 'get', that
|
|
69
|
+
// supports AWS use of the server that we created above.
|
|
70
|
+
exports.get = handler
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "example.com",
|
|
3
|
+
"short_name": "example.com",
|
|
4
|
+
"start_url": "/?homescreen=1",
|
|
5
|
+
"background_color": "#fff",
|
|
6
|
+
"theme_color": "#4e439b",
|
|
7
|
+
"display": "standalone",
|
|
8
|
+
"icons": [
|
|
9
|
+
{
|
|
10
|
+
"src": "./img/global/app-icon-192.png",
|
|
11
|
+
"sizes": "192x192"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"src": "./img/global/app-icon-512.png",
|
|
15
|
+
"sizes": "512x512"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
export default {
|
|
8
|
+
baseStyle: {
|
|
9
|
+
button: {
|
|
10
|
+
paddingLeft: 0,
|
|
11
|
+
|
|
12
|
+
_hover: {
|
|
13
|
+
background: 'none'
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
panel: {
|
|
17
|
+
paddingTop: 0,
|
|
18
|
+
paddingBottom: 0
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
export default {
|
|
8
|
+
variants: {
|
|
9
|
+
subtle: (props) => ({
|
|
10
|
+
container: {
|
|
11
|
+
borderColor: `${props.colorScheme || 'green'}.600`,
|
|
12
|
+
borderWidth: 1,
|
|
13
|
+
borderStyle: 'solid'
|
|
14
|
+
}
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
export default {
|
|
8
|
+
variants: {
|
|
9
|
+
notification: {
|
|
10
|
+
display: 'inline-flex',
|
|
11
|
+
justifyContent: 'center',
|
|
12
|
+
position: 'absolute',
|
|
13
|
+
top: 0,
|
|
14
|
+
right: 0,
|
|
15
|
+
minWidth: 5,
|
|
16
|
+
height: 5,
|
|
17
|
+
color: 'white',
|
|
18
|
+
fontSize: 'xs',
|
|
19
|
+
backgroundColor: 'blue.500',
|
|
20
|
+
border: '1px solid',
|
|
21
|
+
borderColor: 'white',
|
|
22
|
+
borderRadius: 'full'
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
export default {
|
|
8
|
+
baseStyle: {
|
|
9
|
+
borderRadius: 'base'
|
|
10
|
+
},
|
|
11
|
+
variants: {
|
|
12
|
+
solid: (props) =>
|
|
13
|
+
props.colorScheme === 'blue'
|
|
14
|
+
? {
|
|
15
|
+
backgroundColor: 'blue.600',
|
|
16
|
+
color: 'white',
|
|
17
|
+
_hover: {bg: 'blue.700', _disabled: {bg: 'blue.300'}},
|
|
18
|
+
_active: {bg: 'blue.800'},
|
|
19
|
+
_disabled: {bg: 'blue.300'}
|
|
20
|
+
}
|
|
21
|
+
: {},
|
|
22
|
+
outline: (props) =>
|
|
23
|
+
props.colorScheme === 'black'
|
|
24
|
+
? {color: 'gray.900', _hover: {bg: 'gray.50'}, borderColor: 'gray.200'}
|
|
25
|
+
: {color: 'blue.600', _hover: {bg: 'gray.50'}},
|
|
26
|
+
footer: {
|
|
27
|
+
fontSize: 'sm',
|
|
28
|
+
backgroundColor: 'gray.100',
|
|
29
|
+
color: 'black',
|
|
30
|
+
_hover: {bg: 'gray.200'},
|
|
31
|
+
_active: {bg: 'gray.300'},
|
|
32
|
+
paddingLeft: 3,
|
|
33
|
+
paddingRight: 3
|
|
34
|
+
},
|
|
35
|
+
link: (props) => ({
|
|
36
|
+
color: props.colorScheme === 'red' ? 'red.500' : 'blue.600',
|
|
37
|
+
fontWeight: 'normal',
|
|
38
|
+
minWidth: '1em',
|
|
39
|
+
lineHeight: 4
|
|
40
|
+
}),
|
|
41
|
+
'menu-link': {
|
|
42
|
+
color: 'black',
|
|
43
|
+
justifyContent: 'flex-start',
|
|
44
|
+
fontSize: 'sm',
|
|
45
|
+
_hover: {bg: 'gray.50', textDecoration: 'none'},
|
|
46
|
+
_activeLink: {
|
|
47
|
+
bg: 'gray.50',
|
|
48
|
+
textDecoration: 'none'
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
'menu-link-mobile': {
|
|
52
|
+
color: 'black',
|
|
53
|
+
justifyContent: 'flex-start',
|
|
54
|
+
fontSize: 'sm',
|
|
55
|
+
_hover: {bg: 'gray.50', textDecoration: 'none'},
|
|
56
|
+
_activeLink: {
|
|
57
|
+
bg: 'gray.100',
|
|
58
|
+
textDecoration: 'none'
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
'search-link': {
|
|
62
|
+
color: 'black',
|
|
63
|
+
justifyContent: 'flex-start',
|
|
64
|
+
fontSize: 'sm',
|
|
65
|
+
_hover: {textDecoration: 'none'}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
sizes: {
|
|
69
|
+
md: {
|
|
70
|
+
height: 11,
|
|
71
|
+
minWidth: 11
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
defaultProps: {
|
|
75
|
+
colorScheme: 'blue'
|
|
76
|
+
}
|
|
77
|
+
}
|