@mframework/layer-commerce 0.0.3
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/README.md +101 -0
- package/app/cart/useCart.ts +1 -0
- package/app/components/ChevronIcon/ChevronIcon.config.ts +17 -0
- package/app/components/DateSelect/DateSelect.config.ts +15 -0
- package/app/components/Field/Field.config.ts +14 -0
- package/app/components/FieldDate/FieldDate.config.ts +16 -0
- package/app/components/Form/Form.type.ts +8 -0
- package/app/components/Product/Product.config.ts +19 -0
- package/app/components/Product/Stock.config.ts +15 -0
- package/app/components/ProductCustomizableOption/ProductCustomizableOption.config.ts +5 -0
- package/app/components/ProductGallery/ProductGallery.config.ts +15 -0
- package/app/components/ProductReviews/ProductReviews.config.ts +8 -0
- package/app/composables/_types.ts +18 -0
- package/app/composables/adapters/abstract/cartAdapter.ts +0 -0
- package/app/composables/adapters/abstract/categoryAdapter.ts +0 -0
- package/app/composables/adapters/abstract/customerAdapter.ts +0 -0
- package/app/composables/adapters/abstract/inventoryAdapter.ts +0 -0
- package/app/composables/adapters/abstract/orderAdapter.ts +0 -0
- package/app/composables/adapters/abstract/productAdapter.ts +7 -0
- package/app/composables/cart/registry.ts +20 -0
- package/app/composables/cart/types.ts +18 -0
- package/app/composables/cart/useCart.ts +15 -0
- package/app/composables/config.ts +19 -0
- package/app/composables/defs/apiDefinitions.ts +55 -0
- package/app/composables/defs/extension.feature +40 -0
- package/app/composables/defs/extension.mocks.ts +39 -0
- package/app/composables/defs/extension.test.ts +280 -0
- package/app/composables/defs/extension.ts +236 -0
- package/app/composables/defs/index.ts +3 -0
- package/app/composables/defs/typeHelpers.ts +8 -0
- package/app/composables/defs/types.ts +136 -0
- package/app/composables/domain/product.ts +12 -0
- package/app/composables/featured-products.ts +20 -0
- package/app/composables/helpers/contextualizedNormalizers.feature +14 -0
- package/app/composables/helpers/contextualizedNormalizers.test.ts +85 -0
- package/app/composables/helpers/contextualizedNormalizers.ts +20 -0
- package/app/composables/helpers/index.ts +1 -0
- package/app/composables/index.ts +9 -0
- package/app/composables/methods/auth.ts +83 -0
- package/app/composables/methods/cart.ts +119 -0
- package/app/composables/methods/category.ts +27 -0
- package/app/composables/methods/checkout.ts +54 -0
- package/app/composables/methods/customer.ts +52 -0
- package/app/composables/methods/helpers.ts +5 -0
- package/app/composables/methods/index.ts +75 -0
- package/app/composables/methods/order.ts +39 -0
- package/app/composables/methods/product.ts +95 -0
- package/app/composables/methods/settings.ts +16 -0
- package/app/composables/models/cart.ts +95 -0
- package/app/composables/models/category.ts +13 -0
- package/app/composables/models/checkout.ts +17 -0
- package/app/composables/models/customer.ts +16 -0
- package/app/composables/models/facets.ts +25 -0
- package/app/composables/models/index.ts +94 -0
- package/app/composables/models/order.ts +43 -0
- package/app/composables/models/product.ts +73 -0
- package/app/composables/models/shared.ts +75 -0
- package/app/composables/orders.ts +69 -0
- package/app/composables/products/registry.ts +86 -0
- package/app/composables/products/types.ts +8 -0
- package/app/composables/products/useEvents.ts +26 -0
- package/app/composables/products/useGiftCards.ts +29 -0
- package/app/composables/products/useProducts.ts +12 -0
- package/app/composables/products/useSubscriptions.ts +29 -0
- package/app/composables/products.ts +30 -0
- package/app/composables/registry.ts +24 -0
- package/app/composables/useAuth.ts +43 -0
- package/app/composables/useBreakpoints/index.ts +1 -0
- package/app/composables/useBreakpoints/useBreakpoints.ts +28 -0
- package/app/composables/useCache.ts +38 -0
- package/app/composables/useCart/__tests__/useCart.spec.ts +11 -0
- package/app/composables/useCart/index.ts +1 -0
- package/app/composables/useCart/types.ts +17 -0
- package/app/composables/useCart/useCart.ts +46 -0
- package/app/composables/useCartShippingMethods/__tests__/useCartShippingMethods.spec.ts +11 -0
- package/app/composables/useCartShippingMethods/index.ts +1 -0
- package/app/composables/useCartShippingMethods/types.ts +17 -0
- package/app/composables/useCartShippingMethods/useCartShippingMethods.ts +47 -0
- package/app/composables/useCatalog.ts +26 -0
- package/app/composables/useContent.ts +26 -0
- package/app/composables/useCustomer/__tests__/useCustomer.spec.ts +25 -0
- package/app/composables/useCustomer/index.ts +2 -0
- package/app/composables/useCustomer/types.ts +17 -0
- package/app/composables/useCustomer/useCustomer.ts +40 -0
- package/app/composables/useCustomerAddress/__tests__/useCustomerAddress.spec.ts +11 -0
- package/app/composables/useCustomerAddress/index.ts +2 -0
- package/app/composables/useCustomerAddress/types.ts +17 -0
- package/app/composables/useCustomerAddress/useCustomerAddress.ts +55 -0
- package/app/composables/useCustomerOrder/__tests__/useCustomerOrder.spec.ts +11 -0
- package/app/composables/useCustomerOrder/adress.ts +10 -0
- package/app/composables/useCustomerOrder/index.ts +2 -0
- package/app/composables/useCustomerOrder/product.ts +37 -0
- package/app/composables/useCustomerOrder/types.ts +40 -0
- package/app/composables/useCustomerOrder/useCustomerOrder.ts +63 -0
- package/app/composables/useCustomerOrders/__tests__/useCustomerOrders.spec.ts +11 -0
- package/app/composables/useCustomerOrders/index.ts +2 -0
- package/app/composables/useCustomerOrders/types.ts +20 -0
- package/app/composables/useCustomerOrders/useCustomerOrders.ts +56 -0
- package/app/composables/useCustomerReturns/__tests__/useCustomerReturns.spec.ts +11 -0
- package/app/composables/useCustomerReturns/index.ts +2 -0
- package/app/composables/useCustomerReturns/types.ts +17 -0
- package/app/composables/useCustomerReturns/useCustomerReturns.ts +41 -0
- package/app/composables/useHandleError/index.ts +1 -0
- package/app/composables/useHandleError/types.ts +11 -0
- package/app/composables/useHandleError/useHandleError.ts +27 -0
- package/app/composables/useInventory.ts +29 -0
- package/app/composables/useLoading.ts +21 -0
- package/app/composables/useNotification.ts +21 -0
- package/app/composables/usePageTitle.ts +20 -0
- package/app/composables/useProduct/index.ts +2 -0
- package/app/composables/useProduct/types.ts +17 -0
- package/app/composables/useProduct/useProduct.ts +42 -0
- package/app/composables/useProductAttribute/__tests__/useProduct.mock.ts +31 -0
- package/app/composables/useProductAttribute/__tests__/useProductAttribute.spec.ts +14 -0
- package/app/composables/useProductAttribute/index.ts +1 -0
- package/app/composables/useProductAttribute/useProductAttribute.ts +37 -0
- package/app/composables/useProductRecommended/__tests__/useProductRecommended.spec.ts +12 -0
- package/app/composables/useProductRecommended/index.ts +1 -0
- package/app/composables/useProductRecommended/types.ts +17 -0
- package/app/composables/useProductRecommended/useProductRecommended.ts +43 -0
- package/app/composables/useProductReviews/__tests__/productReviews.mock.ts +20 -0
- package/app/composables/useProductReviews/__tests__/useProductReviews.spec.ts +22 -0
- package/app/composables/useProductReviews/index.ts +2 -0
- package/app/composables/useProductReviews/types.ts +17 -0
- package/app/composables/useProductReviews/useProductReviews.ts +46 -0
- package/app/composables/useProducts/__tests__/useProducts.spec.ts +11 -0
- package/app/composables/useProducts/types.ts +22 -0
- package/app/composables/useProducts/useProducts.ts +41 -0
- package/app/composables/useTax.ts +27 -0
- package/app/composables/validationRules/index.ts +1 -0
- package/app/composables/validationRules/password.feature +67 -0
- package/app/composables/validationRules/password.test.ts +89 -0
- package/app/composables/validationRules/password.ts +25 -0
- package/app/normalizers/Cart.query.ts +729 -0
- package/app/normalizers/Cart.type.ts +285 -0
- package/app/normalizers/Category.query.ts +146 -0
- package/app/normalizers/Category.type.ts +55 -0
- package/app/normalizers/CheckEmail.query.ts +28 -0
- package/app/normalizers/Checkout.query.ts +253 -0
- package/app/normalizers/Checkout.type.ts +77 -0
- package/app/normalizers/CmsBlock.query.ts +57 -0
- package/app/normalizers/CmsBlock.type.ts +25 -0
- package/app/normalizers/CmsPage.query.ts +59 -0
- package/app/normalizers/CmsPage.type.ts +26 -0
- package/app/normalizers/Config.query.ts +224 -0
- package/app/normalizers/Config.type.ts +196 -0
- package/app/normalizers/ContactForm.query.ts +49 -0
- package/app/normalizers/CreditMemo.type.ts +49 -0
- package/app/normalizers/GiftCard.type.ts +24 -0
- package/app/normalizers/Invoice.type.ts +58 -0
- package/app/normalizers/Menu.query.ts +54 -0
- package/app/normalizers/Menu.type.ts +22 -0
- package/app/normalizers/MyAccount.query.ts +268 -0
- package/app/normalizers/MyAccount.type.ts +129 -0
- package/app/normalizers/NewsletterSubscription.query.ts +38 -0
- package/app/normalizers/Order.query.ts +741 -0
- package/app/normalizers/Order.type.ts +268 -0
- package/app/normalizers/Payment.type.ts +28 -0
- package/app/normalizers/ProductAlerts.query.ts +23 -0
- package/app/normalizers/ProductCompare.query.ts +226 -0
- package/app/normalizers/ProductCompare.type.ts +90 -0
- package/app/normalizers/ProductList.query.ts +1620 -0
- package/app/normalizers/ProductList.type.ts +726 -0
- package/app/normalizers/Region.query.ts +58 -0
- package/app/normalizers/Region.type.ts +23 -0
- package/app/normalizers/Return.type.ts +50 -0
- package/app/normalizers/Review.query.ts +81 -0
- package/app/normalizers/Review.type.ts +42 -0
- package/app/normalizers/Slider.query.ts +72 -0
- package/app/normalizers/Slider.type.ts +26 -0
- package/app/normalizers/StoreInPickUp.query.ts +54 -0
- package/app/normalizers/StoreInPickUp.type.ts +59 -0
- package/app/normalizers/Subscription.type.ts +25 -0
- package/app/normalizers/Transaction.type.ts +20 -0
- package/app/normalizers/UrlRewrites.query.ts +55 -0
- package/app/normalizers/UrlRewrites.type.ts +25 -0
- package/app/normalizers/Wishlist.query.ts +202 -0
- package/app/normalizers/Wishlist.type.ts +42 -0
- package/app/pages/brand/[...slug].vue +76 -0
- package/app/pages/brands.vue +67 -0
- package/app/pages/cart.vue +142 -0
- package/app/pages/compare.vue +166 -0
- package/app/pages/departments/[...slug].vue +353 -0
- package/app/pages/departments/category/[...slug].vue +114 -0
- package/app/pages/incentive/[...id].vue +66 -0
- package/app/pages/invoice/[id].vue +309 -0
- package/app/pages/order/[id].vue +327 -0
- package/app/pages/product/[...id].vue +309 -0
- package/app/pages/product/showcases/index.vue +86 -0
- package/app/pages/shipment/[...id].vue +176 -0
- package/app/pages/shop/[...slug].vue +158 -0
- package/app/pages/shops.vue +76 -0
- package/app/pages/subscription/[...id].vue +147 -0
- package/app/pages/transaction/[...id].vue +74 -0
- package/app/routes/CategoryPage/CategoryPage.config.ts +28 -0
- package/app/routes/CategoryPage/CategoryPage.type.ts +8 -0
- package/app/routes/Checkout/Checkout.config.ts +3 -0
- package/app/routes/Checkout/Checkout.type.ts +14 -0
- package/app/routes/MyAccount/MyAccount.config.ts +1 -0
- package/app/routes/SearchPage/SearchPage.config.ts +1 -0
- package/app/routes/UrlRewrites/UrlRewrites.config.ts +5 -0
- package/app/stores/Cart/Cart.type.ts +26 -0
- package/app/stores/MyAccount/MyAccount.action.ts +7 -0
- package/app/stores/Notification/Notification.action.ts +40 -0
- package/app/stores/Notification/Notification.type.ts +16 -0
- package/app/stores/Popup/Popup.action.ts +30 -0
- package/app/stores/Product/Product.dispatcher.ts +53 -0
- package/app/stores/Product/Product.reducer.ts +12 -0
- package/app/stores/ProductList/ProductList.dispatcher.ts +35 -0
- package/app/stores/ProductList/ProductList.reducer.ts +13 -0
- package/app/stores/Store.type.ts +31 -0
- package/app/stores/Wishlist/Wishlist.type.ts +12 -0
- package/app/stores/cart.ts +218 -0
- package/app/stores/cartStore.ts +224 -0
- package/app/stores/checkout.ts +18 -0
- package/app/stores/compare.ts +65 -0
- package/app/stores/currency.js +29 -0
- package/app/stores/digital-products.js +11 -0
- package/app/stores/orders.ts +172 -0
- package/app/stores/product.ts +34 -0
- package/app/stores/productList.ts +35 -0
- package/app/stores/productListInfo.ts +0 -0
- package/app/stores/products.ts +118 -0
- package/app/stores/recentlyViewedProducts.ts +56 -0
- package/app/stores/review.ts +33 -0
- package/app/stores/storeInPickUp.ts +21 -0
- package/app/stores/user.ts +20 -0
- package/app/stores/wishlist.ts +46 -0
- package/app/types/Account.type.ts +141 -0
- package/app/types/Breadcrumbs.type.ts +23 -0
- package/app/types/CMS.type.ts +33 -0
- package/app/types/Category.type.ts +67 -0
- package/app/types/Checkout.type.ts +58 -0
- package/app/types/Common.type.ts +77 -0
- package/app/types/Config.type.ts +47 -0
- package/app/types/Device.type.ts +37 -0
- package/app/types/Direction.type.ts +23 -0
- package/app/types/Downloadable.type.ts +24 -0
- package/app/types/Error.type.ts +22 -0
- package/app/types/Field.type.ts +151 -0
- package/app/types/Global.type.ts +156 -0
- package/app/types/Graphql.type.ts +4497 -0
- package/app/types/Layout.type.ts +18 -0
- package/app/types/Menu.type.ts +39 -0
- package/app/types/MiniCart.type.ts +61 -0
- package/app/types/NotificationList.type.ts +34 -0
- package/app/types/Order.type.ts +174 -0
- package/app/types/Price.type.ts +72 -0
- package/app/types/ProductCompare.type.ts +24 -0
- package/app/types/ProductList.type.ts +351 -0
- package/app/types/Rating.type.ts +42 -0
- package/app/types/Router.type.ts +67 -0
- package/app/types/Slider.type.ts +25 -0
- package/app/types/StockStatus.type.ts +21 -0
- package/app/types/domain/index.ts +94 -0
- package/app/types/index.ts +33 -0
- package/app/types/shims.d.ts +52 -0
- package/app/types/tilework-opus.d.ts +48 -0
- package/app/utils/Address/Address.type.ts +28 -0
- package/app/utils/Address/index.ts +325 -0
- package/app/utils/Auth/IsSignedIn.ts +4 -0
- package/app/utils/Auth/Token.ts +9 -0
- package/app/utils/Base64/Base64.ts +16 -0
- package/app/utils/Base64/index.ts +12 -0
- package/app/utils/Browser/Browser.ts +29 -0
- package/app/utils/Browser/index.ts +12 -0
- package/app/utils/BrowserDatabase/BrowserDatabase.ts +70 -0
- package/app/utils/BrowserDatabase/index.ts +12 -0
- package/app/utils/CSS/CSS.ts +65 -0
- package/app/utils/CSS/index.ts +12 -0
- package/app/utils/Cache/Cache.ts +99 -0
- package/app/utils/Cart/Cart.ts +300 -0
- package/app/utils/Cart/Cart.type.ts +76 -0
- package/app/utils/Cart/Token.ts +59 -0
- package/app/utils/Cart/index.ts +13 -0
- package/app/utils/Category/Filters.ts +39 -0
- package/app/utils/Category/index.ts +12 -0
- package/app/utils/Common/index.ts +32 -0
- package/app/utils/Compare/Compare.ts +89 -0
- package/app/utils/Compare/index.ts +12 -0
- package/app/utils/Currency/Currency.ts +84 -0
- package/app/utils/Currency/index.ts +12 -0
- package/app/utils/DynamicReducer/DynamicReducer.type.ts +14 -0
- package/app/utils/DynamicReducer/Helper.ts +30 -0
- package/app/utils/DynamicReducer/index.tsx +35 -0
- package/app/utils/ElementTransition/ElementTransition.ts +100 -0
- package/app/utils/Form/Extract.ts +316 -0
- package/app/utils/Form/Form.ts +46 -0
- package/app/utils/Form/Form.type.ts +60 -0
- package/app/utils/Form/Transform.ts +33 -0
- package/app/utils/FormPortalCollector/index.ts +45 -0
- package/app/utils/History/History.type.ts +31 -0
- package/app/utils/History/index.ts +17 -0
- package/app/utils/Manipulations/Array.ts +18 -0
- package/app/utils/Manipulations/Date.ts +36 -0
- package/app/utils/Manipulations/index.ts +14 -0
- package/app/utils/Media/Media.ts +27 -0
- package/app/utils/Media/index.ts +13 -0
- package/app/utils/Menu/Menu.ts +116 -0
- package/app/utils/Menu/Menu.type.ts +37 -0
- package/app/utils/Menu/index.ts +12 -0
- package/app/utils/Mobile/index.ts +13 -0
- package/app/utils/Mobile/isMobile.ts +34 -0
- package/app/utils/Orders/Orders.ts +71 -0
- package/app/utils/Orders/Orders.type.ts +19 -0
- package/app/utils/Orders/index.ts +13 -0
- package/app/utils/Polyfill/index.ts +336 -0
- package/app/utils/Preload/CategoryPreload.ts +74 -0
- package/app/utils/Preload/ProductPreload.ts +28 -0
- package/app/utils/Preload/index.ts +75 -0
- package/app/utils/Price/Price.config.ts +189 -0
- package/app/utils/Price/Price.ts +63 -0
- package/app/utils/Price/index.ts +12 -0
- package/app/utils/Product/Extract.ts +652 -0
- package/app/utils/Product/Product.ts +575 -0
- package/app/utils/Product/Product.type.ts +260 -0
- package/app/utils/Product/Transform.ts +382 -0
- package/app/utils/Product/index.ts +12 -0
- package/app/utils/Promise/MakeCancelable.ts +44 -0
- package/app/utils/Promise/Promise.type.ts +15 -0
- package/app/utils/Promise/index.ts +13 -0
- package/app/utils/Query/Field.ts +71 -0
- package/app/utils/Query/Fragment.ts +22 -0
- package/app/utils/Query/PrepareDocument.ts +119 -0
- package/app/utils/Query/Query.type.ts +26 -0
- package/app/utils/Query/index.ts +15 -0
- package/app/utils/Request/Config.ts +21 -0
- package/app/utils/Request/DataContainer.ts +102 -0
- package/app/utils/Request/Debounce.ts +48 -0
- package/app/utils/Request/Error.ts +31 -0
- package/app/utils/Request/Hash.ts +88 -0
- package/app/utils/Request/LowPriorityLoad.ts +32 -0
- package/app/utils/Request/LowPriorityRender.ts +55 -0
- package/app/utils/Request/Mutation.ts +25 -0
- package/app/utils/Request/Query.ts +25 -0
- package/app/utils/Request/QueryDispatcher.ts +135 -0
- package/app/utils/Request/Request.ts +310 -0
- package/app/utils/Store/Store.type.ts +26 -0
- package/app/utils/Store/index.ts +71 -0
- package/app/utils/Url/Url.ts +297 -0
- package/app/utils/Url/index.ts +12 -0
- package/app/utils/Validator/Config.ts +96 -0
- package/app/utils/Validator/Validator.ts +268 -0
- package/app/utils/Validator/Validator.type.ts +47 -0
- package/app/utils/Validator/index.ts +12 -0
- package/app/utils/Wishlist/Wishlist.ts +65 -0
- package/app/utils/Wishlist/index.ts +12 -0
- package/app/utils/client.ts +280 -0
- package/app/utils/index.ts +53 -0
- package/app/utils/normalizer.ts +23 -0
- package/app/utils/normalizers/magento.ts +29 -0
- package/app/utils/normalizers/shopify.ts +29 -0
- package/nuxt.config.ts +11 -0
- package/package.json +43 -0
- package/tsconfig.json +45 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { toRefs } from '@vueuse/shared';
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
import type { Ref } from 'vue';
|
|
4
|
+
import type { Maybe, SfProduct } from '../_types';
|
|
5
|
+
import { useAsyncData, useState } from 'nuxt/app';
|
|
6
|
+
import type {
|
|
7
|
+
UseProductRecommendedReturn,
|
|
8
|
+
UseProductRecommendedState,
|
|
9
|
+
FetchProductRecommended,
|
|
10
|
+
} from './types';
|
|
11
|
+
import { getCommerceClient } from '../../utils/client';
|
|
12
|
+
import { useHandleError } from '../useHandleError';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Composable for getting recommended products data
|
|
16
|
+
* @param {string} slug Product slug
|
|
17
|
+
*/
|
|
18
|
+
export const useProductRecommended: UseProductRecommendedReturn = (slug) => {
|
|
19
|
+
const state = useState<UseProductRecommendedState>(`useProductRecommended-${slug}`, () => ({
|
|
20
|
+
data: null,
|
|
21
|
+
loading: false,
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
/** Function for fetching product recommended data
|
|
25
|
+
* @param {string} slug Product slug
|
|
26
|
+
* @example
|
|
27
|
+
* fetchProductRecommended('product-slug');
|
|
28
|
+
*/
|
|
29
|
+
const fetchProductRecommended: FetchProductRecommended = async (slug) => {
|
|
30
|
+
state.value.loading = true;
|
|
31
|
+
const client = getCommerceClient();
|
|
32
|
+
const { data, error } = await useAsyncData(() => client.listProducts?.());
|
|
33
|
+
useHandleError(error.value);
|
|
34
|
+
state.value.data = data.value as unknown as Maybe<SfProduct[]>;
|
|
35
|
+
state.value.loading = false;
|
|
36
|
+
return computed(() => state.value.data) as unknown as Ref<Maybe<SfProduct[]>>;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
fetchProductRecommended,
|
|
41
|
+
...toRefs(state.value),
|
|
42
|
+
};
|
|
43
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SfProductReview } from '../_types';
|
|
2
|
+
|
|
3
|
+
export const mockProductReviews: SfProductReview[] = [
|
|
4
|
+
{
|
|
5
|
+
id: '1',
|
|
6
|
+
text: "I recently purchased a pair of sneakers and I am thoroughly impressed with their quality and comfort. The design is sleek and modern, and the shoes are available in a variety of colors to suit anyone's style preferences. The upper is made of a breathable and durable material that allows my feet to stay cool and dry during long walks or runs. The sole is also very comfortable and provides great support for my feet, making it easy for me to wear them all day without experiencing any discomfort or fatigue. Overall, I highly recommend these sneakers to anyone in the market for a comfortable and stylish shoe that can handle any activity. They are definitely worth the investment!",
|
|
7
|
+
reviewer: 'John Doe',
|
|
8
|
+
rating: 5,
|
|
9
|
+
title: 'Great product!',
|
|
10
|
+
createdAt: '2022-04-28T12:00:00.000Z',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
id: '2',
|
|
14
|
+
text: "I recently purchased a pair of sneakers and I am thoroughly impressed with their quality and comfort. The design is sleek and modern, and the shoes are available in a variety of colors to suit anyone's style preferences. The upper is made of a breathable and durable material that allows my feet to stay cool and dry during long walks or runs. The sole is also very comfortable and provides great support for my feet, making it easy for me to wear them all day without experiencing any discomfort or fatigue. Overall, I highly recommend these sneakers to anyone in the market for a comfortable and stylish shoe that can handle any activity. They are definitely worth the investment!",
|
|
15
|
+
reviewer: 'John Doe',
|
|
16
|
+
rating: 5,
|
|
17
|
+
title: 'Great product!',
|
|
18
|
+
createdAt: '2022-03-01T09:30:00.000Z',
|
|
19
|
+
},
|
|
20
|
+
];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { vi } from 'vitest';
|
|
2
|
+
import { useProductReviews } from '~/composables/useProductReviews';
|
|
3
|
+
import { mockProductReviews } from './productReviews.mock';
|
|
4
|
+
|
|
5
|
+
vi.mock('@mframework/sdk', () => ({
|
|
6
|
+
sdk: {
|
|
7
|
+
commerce: {
|
|
8
|
+
getProductReviews: vi.fn(() => mockProductReviews),
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
describe('useProductReview', () => {
|
|
14
|
+
it('should return product reviews', async () => {
|
|
15
|
+
const slug = 'athletic-mens-walking-sneakers';
|
|
16
|
+
const { data, fetchProductReviews } = useProductReviews(slug);
|
|
17
|
+
|
|
18
|
+
await fetchProductReviews(slug);
|
|
19
|
+
|
|
20
|
+
expect(data.value).toEqual(mockProductReviews);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Ref } from 'vue';
|
|
2
|
+
import type { SfProductReview, Maybe } from '../_types';
|
|
3
|
+
|
|
4
|
+
export interface UseProductReviewsState {
|
|
5
|
+
data: Maybe<SfProductReview[]>;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type FetchProductReviews = (slug: string) => Promise<Ref<Maybe<SfProductReview[]>>>;
|
|
10
|
+
|
|
11
|
+
export interface UseProductReviewsReturn {
|
|
12
|
+
data: Readonly<Ref<UseProductReviewsState['data']>>;
|
|
13
|
+
loading: Readonly<Ref<boolean>>;
|
|
14
|
+
fetchProductReviews: FetchProductReviews;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type UseProductReviews = (slug: string) => UseProductReviewsReturn;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { toRefs } from '@vueuse/shared';
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
import type { Ref } from 'vue';
|
|
4
|
+
import type { Maybe, SfProductReview } from '../_types';
|
|
5
|
+
import type {
|
|
6
|
+
UseProductReviews,
|
|
7
|
+
UseProductReviewsState,
|
|
8
|
+
FetchProductReviews,
|
|
9
|
+
} from './types';
|
|
10
|
+
import { getCommerceClient } from '../../utils/client';
|
|
11
|
+
import { useAsyncData, useState } from 'nuxt/app';
|
|
12
|
+
import { useHandleError } from '../useHandleError';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @description Composable managing product reviews data
|
|
16
|
+
* @param {string} slug Product slug
|
|
17
|
+
* @returns {@link UseProductReturn}
|
|
18
|
+
* @example
|
|
19
|
+
* const { data, loading, fetchProductReviews } = useProductReviews('product-slug');
|
|
20
|
+
*/
|
|
21
|
+
export const useProductReviews: UseProductReviews = (slug) => {
|
|
22
|
+
const state = useState<UseProductReviewsState>(`useProductReviews-${slug}`, () => ({
|
|
23
|
+
data: null,
|
|
24
|
+
loading: false,
|
|
25
|
+
}));
|
|
26
|
+
|
|
27
|
+
/** Function for fetching product reviews data
|
|
28
|
+
* @param {string} slug Product slug
|
|
29
|
+
* @example
|
|
30
|
+
* fetchProductReviews('product-slug');
|
|
31
|
+
*/
|
|
32
|
+
const fetchProductReviews: FetchProductReviews = async (slug) => {
|
|
33
|
+
state.value.loading = true;
|
|
34
|
+
const client = getCommerceClient();
|
|
35
|
+
const { data, error } = await useAsyncData(() => client.listProductReviews?.(slug) ?? client.listReviews?.(slug));
|
|
36
|
+
useHandleError(error.value);
|
|
37
|
+
state.value.data = data.value as unknown as Maybe<SfProductReview[]>;
|
|
38
|
+
state.value.loading = false;
|
|
39
|
+
return computed(() => state.value.data) as unknown as Ref<Maybe<SfProductReview[]>>;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
fetchProductReviews,
|
|
44
|
+
...toRefs(state.value),
|
|
45
|
+
};
|
|
46
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useProducts } from '../useProducts';
|
|
2
|
+
|
|
3
|
+
describe('useProducts', () => {
|
|
4
|
+
it('should return products', async () => {
|
|
5
|
+
const { fetchProducts, data } = useProducts();
|
|
6
|
+
|
|
7
|
+
await fetchProducts();
|
|
8
|
+
|
|
9
|
+
expect(data.value).not.toBeUndefined();
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Ref } from 'vue'
|
|
2
|
+
import type { Product } from '../_types'
|
|
3
|
+
import type { Maybe } from '../_types'
|
|
4
|
+
|
|
5
|
+
export type GetProducts = {
|
|
6
|
+
items: Product[]
|
|
7
|
+
total?: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface UseProductsState {
|
|
11
|
+
data: GetProducts | null
|
|
12
|
+
loading: boolean
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type FetchProducts = () => Promise<Ref<Maybe<GetProducts>>>
|
|
16
|
+
export interface UseProducts {
|
|
17
|
+
data: Readonly<Ref<UseProductsState['data']>>
|
|
18
|
+
loading: Readonly<Ref<boolean>>
|
|
19
|
+
fetchProducts: FetchProducts
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type UseProductsReturn = () => UseProducts
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { toRefs } from '@vueuse/shared';
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
import type { Ref } from 'vue';
|
|
4
|
+
import { FetchProducts, UseProductsReturn, UseProductsState } from './types';
|
|
5
|
+
import { getCommerceClient } from '../../utils/client';
|
|
6
|
+
import { useAsyncData, useState } from 'nuxt/app';
|
|
7
|
+
import { useHandleError } from '../useHandleError';
|
|
8
|
+
import type { Maybe } from '../_types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @description Composable for managing products.
|
|
12
|
+
* @returns {@link UseProducts}
|
|
13
|
+
* @example
|
|
14
|
+
* const { data, loading, fetchProducts } = useProducts();
|
|
15
|
+
*/
|
|
16
|
+
export const useProducts: UseProductsReturn = () => {
|
|
17
|
+
const state = useState<UseProductsState>('products', () => ({
|
|
18
|
+
data: null,
|
|
19
|
+
loading: false,
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @description Function for fetching products.
|
|
24
|
+
* @example
|
|
25
|
+
* getProducts();
|
|
26
|
+
*/
|
|
27
|
+
const fetchProducts: FetchProducts = async () => {
|
|
28
|
+
state.value.loading = true;
|
|
29
|
+
const client = getCommerceClient();
|
|
30
|
+
const { data, error } = await useAsyncData(() => client.listProducts?.());
|
|
31
|
+
useHandleError(error.value);
|
|
32
|
+
state.value.data = data.value as unknown as UseProductsState['data'];
|
|
33
|
+
state.value.loading = false;
|
|
34
|
+
return computed(() => state.value.data) as unknown as Ref<UseProductsState['data']>;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
fetchProducts,
|
|
39
|
+
...toRefs(state.value),
|
|
40
|
+
};
|
|
41
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { getCommerceClient } from '../utils/client'
|
|
2
|
+
|
|
3
|
+
export function useTax() {
|
|
4
|
+
const client = getCommerceClient()
|
|
5
|
+
|
|
6
|
+
async function calculateTax(quoteId: string) {
|
|
7
|
+
try {
|
|
8
|
+
// Use adapter if available
|
|
9
|
+
if (client && typeof client.calculateTax === 'function') {
|
|
10
|
+
return await client.calculateTax(quoteId)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Fallback to Magento tax calculation
|
|
14
|
+
const url = `${process.env.COMMERCE_API_URL}${encodeURIComponent(quoteId)}`
|
|
15
|
+
const res = await fetch(url)
|
|
16
|
+
if (!res.ok) throw new Error('Tax calculation failed')
|
|
17
|
+
return res.json()
|
|
18
|
+
} catch (e) {
|
|
19
|
+
console.error('Tax calculation error', e)
|
|
20
|
+
throw e
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return { calculateTax }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default useTax
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./password";
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Feature: Password validation rule
|
|
2
|
+
|
|
3
|
+
Scenario Outline: New password can't be too easy (<newPassword>)
|
|
4
|
+
Given the <newPassword> as password
|
|
5
|
+
When the method is called
|
|
6
|
+
Then a false should be returned
|
|
7
|
+
|
|
8
|
+
Examples:
|
|
9
|
+
|
|
10
|
+
| newPassword |
|
|
11
|
+
| 12345 |
|
|
12
|
+
| password |
|
|
13
|
+
| password1 |
|
|
14
|
+
| Password1 |
|
|
15
|
+
| Password@ |
|
|
16
|
+
| Password123567890 |
|
|
17
|
+
|
|
18
|
+
Scenario Outline: New password must be complex enough (<newPassword>)
|
|
19
|
+
Given the <newPassword> as password
|
|
20
|
+
When the method is called
|
|
21
|
+
Then a true should be returned
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
|
|
25
|
+
| newPassword |
|
|
26
|
+
| Password1!3 |
|
|
27
|
+
| L0ngEnough$ |
|
|
28
|
+
| L0ngEnough@ |
|
|
29
|
+
| L0ngEnough# |
|
|
30
|
+
| L0ngEnough% |
|
|
31
|
+
| L0ngEnough^ |
|
|
32
|
+
| L0ngEnough* |
|
|
33
|
+
| L0ngEnough( |
|
|
34
|
+
| L0ngEnough) |
|
|
35
|
+
| L0ngEnough: |
|
|
36
|
+
| L0ngEnough; |
|
|
37
|
+
| L0ngEnough, |
|
|
38
|
+
| L0ngEnough. |
|
|
39
|
+
|
|
40
|
+
Scenario Outline: New password can't have some special signs (<newPassword>)
|
|
41
|
+
Given the <newPassword> as password
|
|
42
|
+
When the method is called
|
|
43
|
+
Then a false should be returned
|
|
44
|
+
|
|
45
|
+
Examples:
|
|
46
|
+
|
|
47
|
+
| newPassword |
|
|
48
|
+
| L0ngEnough& |
|
|
49
|
+
| L0ngEnough[ |
|
|
50
|
+
| L0ngEnough] |
|
|
51
|
+
| L0ngEnough" |
|
|
52
|
+
| L0ngEnough' |
|
|
53
|
+
| L0ngEnough/ |
|
|
54
|
+
| L0ngEnough> |
|
|
55
|
+
| L0ngEnough< |
|
|
56
|
+
|
|
57
|
+
Scenario: New password match with confirmation
|
|
58
|
+
Given the password is "Password1!"
|
|
59
|
+
And the confirmation is "Password1!"
|
|
60
|
+
When the method is called
|
|
61
|
+
Then a true should be returned
|
|
62
|
+
|
|
63
|
+
Scenario: New password mismatch with confirmation
|
|
64
|
+
Given the password is "Password1!"
|
|
65
|
+
And the confirmation is "Password1"
|
|
66
|
+
When the method is called
|
|
67
|
+
Then a false should be returned
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { expect } from "vitest";
|
|
2
|
+
import type { DefineStepFunction } from "jest-cucumber";
|
|
3
|
+
import { defineFeature, loadFeature } from "jest-cucumber";
|
|
4
|
+
import { validatePassword } from "./password";
|
|
5
|
+
|
|
6
|
+
const feature = loadFeature("./password.feature", { loadRelativePath: true });
|
|
7
|
+
|
|
8
|
+
defineFeature(feature, (test) => {
|
|
9
|
+
let password: string;
|
|
10
|
+
let confirmation: string;
|
|
11
|
+
let output: boolean;
|
|
12
|
+
|
|
13
|
+
function whenTheMethodIsCalled(when: DefineStepFunction) {
|
|
14
|
+
when("the method is called", () => {
|
|
15
|
+
output = validatePassword(password, confirmation);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
test("New password can't be too easy (<newPassword>)", ({ given, when, then }) => {
|
|
20
|
+
given(/^the (.*) as password$/, (givenPassword) => {
|
|
21
|
+
password = givenPassword;
|
|
22
|
+
confirmation = givenPassword;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
whenTheMethodIsCalled(when);
|
|
26
|
+
|
|
27
|
+
then("a false should be returned", () => {
|
|
28
|
+
expect(output).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("New password must be complex enough (<newPassword>)", ({ given, when, then }) => {
|
|
33
|
+
given(/^the (.*) as password$/, (givenPassword) => {
|
|
34
|
+
password = givenPassword;
|
|
35
|
+
confirmation = givenPassword;
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
whenTheMethodIsCalled(when);
|
|
39
|
+
|
|
40
|
+
then("a true should be returned", () => {
|
|
41
|
+
expect(output).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("New password can't have some special signs (<newPassword>)", ({ given, when, then }) => {
|
|
46
|
+
given(/^the (.*) as password$/, (givenPassword) => {
|
|
47
|
+
password = givenPassword;
|
|
48
|
+
confirmation = givenPassword;
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
whenTheMethodIsCalled(when);
|
|
52
|
+
|
|
53
|
+
then("a false should be returned", () => {
|
|
54
|
+
expect(output).toBe(false);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("New password match with confirmation", ({ given, and, when, then }) => {
|
|
59
|
+
given(/^the password is (.*)$/, (givenPassword) => {
|
|
60
|
+
password = givenPassword;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
and(/^the confirmation is (.*)$/, (givenConfirmation) => {
|
|
64
|
+
confirmation = givenConfirmation;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
whenTheMethodIsCalled(when);
|
|
68
|
+
|
|
69
|
+
then("a true should be returned", () => {
|
|
70
|
+
expect(output).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("New password mismatch with confirmation", ({ given, and, when, then }) => {
|
|
75
|
+
given(/^the password is (.*)$/, (givenPassword) => {
|
|
76
|
+
password = givenPassword;
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
and(/^the confirmation is (.*)$/, (givenConfirmation) => {
|
|
80
|
+
confirmation = givenConfirmation;
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
whenTheMethodIsCalled(when);
|
|
84
|
+
|
|
85
|
+
then("a false should be returned", () => {
|
|
86
|
+
expect(output).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* eslint-disable sonarjs/prefer-single-boolean-return */
|
|
2
|
+
/* eslint-disable max-statements */
|
|
3
|
+
export function validatePassword(firstInput: string, confirmationInput: string): boolean {
|
|
4
|
+
if (firstInput !== confirmationInput) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
if (firstInput.length < 8) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (/[A-Z]+/.test(firstInput) === false) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (/\d+/.test(firstInput) === false) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (/[!#$%()*,.:;@^]+/.test(firstInput) === false) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return true;
|
|
25
|
+
}
|