@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,25 @@
|
|
|
1
|
+
/* eslint-disable import/prefer-default-export */
|
|
2
|
+
/**
|
|
3
|
+
* M Framework - Flexible backend agnostic framework.
|
|
4
|
+
*
|
|
5
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
6
|
+
* See LICENSE for license details.
|
|
7
|
+
*
|
|
8
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
9
|
+
* @package mframework/mframework-theme
|
|
10
|
+
* @link https://github.com/meeovi/mframework-theme
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Mutation } from '@tilework/opus';
|
|
14
|
+
|
|
15
|
+
import { prepareMutation } from '../../utils/Query';
|
|
16
|
+
import { executePost } from '../../utils/Request/Request';
|
|
17
|
+
|
|
18
|
+
/** @namespace ../../utils/Request/Mutation/fetchMutation */
|
|
19
|
+
export const fetchMutation = <S extends string, T, IsArray extends boolean = false>(
|
|
20
|
+
rawMutations: Mutation<S, T, boolean> | Mutation<S, T, boolean>[],
|
|
21
|
+
): Promise<Record<S, IsArray extends false ? T : T[]>> => {
|
|
22
|
+
const queries = rawMutations instanceof Mutation ? [rawMutations] : rawMutations;
|
|
23
|
+
|
|
24
|
+
return executePost(prepareMutation(queries));
|
|
25
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* eslint-disable import/prefer-default-export */
|
|
2
|
+
/**
|
|
3
|
+
* M Framework - Flexible backend agnostic framework.
|
|
4
|
+
*
|
|
5
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
6
|
+
* See LICENSE for license details.
|
|
7
|
+
*
|
|
8
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
9
|
+
* @package mframework/mframework-theme
|
|
10
|
+
* @link https://github.com/meeovi/mframework-theme
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Query } from '@tilework/opus';
|
|
14
|
+
|
|
15
|
+
import { prepareQuery } from '../../utils/Query';
|
|
16
|
+
import { executePost } from '../../utils/Request/Request';
|
|
17
|
+
|
|
18
|
+
/** @namespace ../../utils/Request/../../normalizers/fetchQuery */
|
|
19
|
+
export const fetchQuery = <S extends string, T, IsArray extends boolean = false>(
|
|
20
|
+
rawQueries: Query<S, T, boolean> | Query<S, T, boolean>[],
|
|
21
|
+
): Promise<Record<S, IsArray extends false ? T : T[]>> => {
|
|
22
|
+
const queries = rawQueries instanceof Query ? [rawQueries] : rawQueries;
|
|
23
|
+
|
|
24
|
+
return executePost(prepareQuery(queries));
|
|
25
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
/**
|
|
3
|
+
* M Framework - Flexible backend agnostic framework.
|
|
4
|
+
*
|
|
5
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
6
|
+
* See LICENSE for license details.
|
|
7
|
+
*
|
|
8
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
9
|
+
* @package mframework/mframework
|
|
10
|
+
* @link https://github.com/meeovi/mframework
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Query } from '@tilework/opus';
|
|
14
|
+
// Minimal Dispatch type for compatibility while migrating to Pinia
|
|
15
|
+
type Dispatch = (action: any) => any;
|
|
16
|
+
|
|
17
|
+
import { NetworkError } from '../../types/Common.type';
|
|
18
|
+
import { CancelablePromise } from '../../utils/Promise/Promise.type';
|
|
19
|
+
import { prepareQuery } from '../../utils/Query';
|
|
20
|
+
import { executeGet, listenForBroadCast } from '../../utils/Request/Request';
|
|
21
|
+
|
|
22
|
+
import { ONE_MONTH_IN_SECONDS } from './Config';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Abstract request dispatcher.
|
|
26
|
+
* IMPORTANT: it is required to implement `prepareRequest(options)` before using!
|
|
27
|
+
* @class QueryDispatcher
|
|
28
|
+
* @namespace ../../utils/Request/QueryDispatcher
|
|
29
|
+
*/
|
|
30
|
+
export abstract class QueryDispatcher<Options, Data, Error = NetworkError | NetworkError[]> {
|
|
31
|
+
protected name = '';
|
|
32
|
+
|
|
33
|
+
protected cacheTTL = 0;
|
|
34
|
+
|
|
35
|
+
protected promise: CancelablePromise<Data> | null = null;
|
|
36
|
+
|
|
37
|
+
protected controller: AbortController | null = null;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Creates an instance of QueryDispatcher.
|
|
41
|
+
* @param {String} name Name of model for ServiceWorker to send BroadCasts updates to
|
|
42
|
+
* @param {Number} cacheTTL Cache TTL (in seconds) for ServiceWorker to cache responses
|
|
43
|
+
* @memberof QueryDispatcher
|
|
44
|
+
*/
|
|
45
|
+
__construct(name: string, cacheTTL = ONE_MONTH_IN_SECONDS): void {
|
|
46
|
+
this.name = name;
|
|
47
|
+
this.cacheTTL = cacheTTL;
|
|
48
|
+
this.promise = null;
|
|
49
|
+
this.controller = null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async handleData(dispatch: Dispatch, options: Options): Promise<void> {
|
|
53
|
+
const { name, cacheTTL } = this;
|
|
54
|
+
|
|
55
|
+
const rawQueries = this.prepareRequest(options, dispatch);
|
|
56
|
+
|
|
57
|
+
if (!rawQueries) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (this.controller) {
|
|
62
|
+
this.controller.abort();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const queries = rawQueries instanceof Query ? [rawQueries] : rawQueries;
|
|
66
|
+
|
|
67
|
+
this.controller = new AbortController();
|
|
68
|
+
const { signal } = this.controller;
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
this.promise = await executeGet(prepareQuery(queries), name, cacheTTL, signal);
|
|
72
|
+
|
|
73
|
+
if (this.promise) {
|
|
74
|
+
this.onSuccess(this.promise, dispatch, options);
|
|
75
|
+
}
|
|
76
|
+
} catch (err) {
|
|
77
|
+
if (!(err as NetworkError).message.includes('abort')) {
|
|
78
|
+
if (!(err as NetworkError).message.includes('abort')) {
|
|
79
|
+
this.onError(err as NetworkError, dispatch, options);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const broadcast = await listenForBroadCast<Data>(name);
|
|
85
|
+
|
|
86
|
+
this.onUpdate(broadcast, dispatch, options);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Is triggered by BroadCast updated from ServiceWorker.
|
|
91
|
+
* Should dispatch some action.
|
|
92
|
+
* @param {any} data Data received from fetch of GraphQL endpoint
|
|
93
|
+
* @param {Function} dispatch Store changing function from Redux (dispatches actions)
|
|
94
|
+
* @return {void}
|
|
95
|
+
* @memberof QueryDispatcher
|
|
96
|
+
*/
|
|
97
|
+
onUpdate(data: Data, dispatch: Dispatch, options: Options): void {
|
|
98
|
+
this.onSuccess(data, dispatch, options);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Is responsible for request building (request & mutation preparation)
|
|
103
|
+
* @param {any} options Any options received from Container
|
|
104
|
+
* @param {Function} dispatch
|
|
105
|
+
* @return {Array<Field>|Field} Array or single item of Field instances
|
|
106
|
+
* @memberof QueryDispatcher
|
|
107
|
+
*/
|
|
108
|
+
abstract prepareRequest(
|
|
109
|
+
options: Options,
|
|
110
|
+
dispatch: Dispatch
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
112
|
+
): Query<any, any, any> | Query<any, any, any>[];
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Is triggered on successful fetch of GraphQL endpoint.
|
|
116
|
+
* IMPORTANT: If there are any errors in response (`errors` field in JSON response from GraphQL), this function won't trigger!
|
|
117
|
+
* Should dispatch some action.
|
|
118
|
+
* @param {any} data
|
|
119
|
+
* @param {any} dispatch
|
|
120
|
+
* @return {void}@memberof QueryDispatcher
|
|
121
|
+
*/
|
|
122
|
+
abstract onSuccess(data: Data | CancelablePromise<Data>, dispatch: Dispatch, options: Options): void;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Is triggered on error in fetch of GraphQL endpoint.
|
|
126
|
+
* IMPORTANT: If there are any errors in response (`errors` field in JSON response from GraphQL), this function will trigger!
|
|
127
|
+
* Should dispatch some action.
|
|
128
|
+
* @param {any} error
|
|
129
|
+
* @param {any} dispatch
|
|
130
|
+
* @return {void}@memberof QueryDispatcher
|
|
131
|
+
*/
|
|
132
|
+
abstract onError(error: Error | NetworkError, dispatch: Dispatch, options: Options): void;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export default QueryDispatcher;
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/* eslint-disable @mframework/mframework-guidelines/no-arrow-functions-in-class */
|
|
2
|
+
/**
|
|
3
|
+
* M Framework - Flexible backend agnostic framework.
|
|
4
|
+
*
|
|
5
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
6
|
+
* See LICENSE for license details.
|
|
7
|
+
*
|
|
8
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
9
|
+
* @package mframework/mframework
|
|
10
|
+
* @link https://github.com/meeovi/mframework
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { GraphQlResponse } from '@tilework/opus';
|
|
14
|
+
|
|
15
|
+
import { isSignedIn } from '../../utils/Auth/IsSignedIn';
|
|
16
|
+
import { getAuthorizationToken, refreshAuthorizationToken } from '../../utils/Auth/Token';
|
|
17
|
+
import { refreshUid } from '../../utils/Compare';
|
|
18
|
+
import { getCurrency } from '../../utils/Currency';
|
|
19
|
+
import {
|
|
20
|
+
GRAPHQL_URI, HTTP_201_CREATED, HTTP_410_GONE, HTTP_503_SERVICE_UNAVAILABLE, ONE_MONTH_IN_SECONDS, WINDOW_ID,
|
|
21
|
+
} from '../../utils/Request/Config';
|
|
22
|
+
|
|
23
|
+
import { hash } from './Hash';
|
|
24
|
+
|
|
25
|
+
/** @namespace ../../utils/Request/getWindowId */
|
|
26
|
+
export const getWindowId = (): string => {
|
|
27
|
+
const result = sessionStorage.getItem(WINDOW_ID);
|
|
28
|
+
|
|
29
|
+
if (!result) {
|
|
30
|
+
const id = String(Date.now());
|
|
31
|
+
|
|
32
|
+
sessionStorage.setItem(WINDOW_ID, id);
|
|
33
|
+
|
|
34
|
+
return id;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** @namespace ../../utils/Request/getStoreCodePath */
|
|
41
|
+
export const getStoreCodePath = (): string => {
|
|
42
|
+
const path = location.pathname;
|
|
43
|
+
// eslint-disable-next-line no-undef
|
|
44
|
+
const firstPathPart = path.split('/')[1];
|
|
45
|
+
|
|
46
|
+
if (window.storeList.includes(firstPathPart)) {
|
|
47
|
+
return `/${ firstPathPart }`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return '';
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/** @namespace ../../utils/Request/getGraphqlEndpoint */
|
|
54
|
+
export const getGraphqlEndpoint = (): string => getStoreCodePath().concat(GRAPHQL_URI);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Append authorization token to header object
|
|
58
|
+
* @param {Object} headers
|
|
59
|
+
* @returns {Object} Headers with appended authorization
|
|
60
|
+
* @namespace ../../utils/Request/appendTokenToHeaders
|
|
61
|
+
*/
|
|
62
|
+
export const appendTokenToHeaders = (headers: HeadersInit): HeadersInit => {
|
|
63
|
+
const token = getAuthorizationToken();
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
...headers,
|
|
67
|
+
Authorization: token ? `Bearer ${token}` : '',
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
* @param {String} query Request body
|
|
74
|
+
* @param {Object} variables Request variables
|
|
75
|
+
* @param {String} url GraphQL url
|
|
76
|
+
* @returns {*}
|
|
77
|
+
* @namespace ../../utils/Request/formatURI
|
|
78
|
+
*/
|
|
79
|
+
export const formatURI = (query: string, variables: Record<string, string>, url: string): string => {
|
|
80
|
+
const stringifyVariables = Object.keys(variables).reduce(
|
|
81
|
+
(acc, variable) => [...acc, `${ variable }=${ JSON.stringify(variables[variable]) }`],
|
|
82
|
+
[`?hash=${ hash(query) }`],
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
return `${ url }${ stringifyVariables.join('&') }`;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
*
|
|
90
|
+
* @param {String} uri
|
|
91
|
+
* @param {String} name
|
|
92
|
+
* @returns {Promise<Response>}
|
|
93
|
+
* @namespace ../../utils/Request/getFetch
|
|
94
|
+
*/
|
|
95
|
+
export const getFetch = (uri: string, name: string, signal?: AbortSignal): Promise<Response> => fetch(
|
|
96
|
+
uri,
|
|
97
|
+
{
|
|
98
|
+
method: 'GET',
|
|
99
|
+
signal,
|
|
100
|
+
headers: appendTokenToHeaders({
|
|
101
|
+
'Content-Type': 'application/json',
|
|
102
|
+
'Content-Currency': getCurrency(),
|
|
103
|
+
'Application-Model': `${ name }_${ getWindowId() }`,
|
|
104
|
+
Accept: 'application/json',
|
|
105
|
+
}),
|
|
106
|
+
},
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
// TODO CacheTTL number or string?
|
|
110
|
+
/**
|
|
111
|
+
*
|
|
112
|
+
* @param {String} graphQlURI
|
|
113
|
+
* @param {{}} query Request body
|
|
114
|
+
* @param {Int} cacheTTL
|
|
115
|
+
* @namespace ../../utils/Request/putPersistedQuery
|
|
116
|
+
*/
|
|
117
|
+
export const putPersistedQuery = (
|
|
118
|
+
graphQlURI: string,
|
|
119
|
+
query: string,
|
|
120
|
+
cacheTTL: number,
|
|
121
|
+
): Promise<Response> => fetch(
|
|
122
|
+
`${ graphQlURI }?hash=${ hash(query) }`,
|
|
123
|
+
{
|
|
124
|
+
method: 'PUT',
|
|
125
|
+
body: JSON.stringify(query),
|
|
126
|
+
headers: {
|
|
127
|
+
'Content-Type': 'application/json',
|
|
128
|
+
'SW-Cache-Age': String(Number.isInteger(cacheTTL) ? cacheTTL : ONE_MONTH_IN_SECONDS),
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
*
|
|
135
|
+
* @param {String} graphQlURI
|
|
136
|
+
* @param {String} queryObject
|
|
137
|
+
* @param {String} name
|
|
138
|
+
* @returns {Promise<Response>}
|
|
139
|
+
* @namespace ../../utils/Request/postFetch
|
|
140
|
+
*/
|
|
141
|
+
export const postFetch = (
|
|
142
|
+
graphQlURI: string,
|
|
143
|
+
query: string,
|
|
144
|
+
variables: Record<string, string>,
|
|
145
|
+
): Promise<Response> => fetch(
|
|
146
|
+
graphQlURI,
|
|
147
|
+
{
|
|
148
|
+
method: 'POST',
|
|
149
|
+
body: JSON.stringify({ query, variables }),
|
|
150
|
+
headers: appendTokenToHeaders({
|
|
151
|
+
'Content-Type': 'application/json',
|
|
152
|
+
'Content-Currency': getCurrency(),
|
|
153
|
+
Accept: 'application/json',
|
|
154
|
+
}),
|
|
155
|
+
},
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
export type ResponseBody<T> = Omit<GraphQlResponse, 'data'> & {
|
|
159
|
+
data: T;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Checks for errors in response, if they exist, rejects promise
|
|
164
|
+
* @param {Object} res Response from GraphQL endpoint
|
|
165
|
+
* @return {Promise<Object>} Handled GraphqlQL results promise
|
|
166
|
+
* @namespace ../../utils/Request/checkForErrors
|
|
167
|
+
*/
|
|
168
|
+
export const checkForErrors = <T>(res: ResponseBody<T>): Promise<T> => new Promise((resolve, reject) => {
|
|
169
|
+
const { errors, data } = res;
|
|
170
|
+
|
|
171
|
+
if (errors) {
|
|
172
|
+
reject(errors);
|
|
173
|
+
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
resolve(data);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Handle connection errors
|
|
182
|
+
* @param {any} err Error from fetch
|
|
183
|
+
* @return {void} Simply console error
|
|
184
|
+
* @namespace ../../utils/Request/handleConnectionError
|
|
185
|
+
*/
|
|
186
|
+
// eslint-disable-next-line no-console
|
|
187
|
+
export const handleConnectionError = (err: unknown, msg: string): void => {
|
|
188
|
+
// eslint-disable-next-line no-console
|
|
189
|
+
console.error(msg, err);
|
|
190
|
+
}; // TODO: Add to logs pool
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Parse response and check wether it contains errors
|
|
194
|
+
* @param {{}} queryObject prepared with `prepareDocument()` from `../../utils/Query` request body object
|
|
195
|
+
* @return {Promise<Request>} Fetch promise to GraphQL endpoint
|
|
196
|
+
* @namespace ../../utils/Request/parseResponse
|
|
197
|
+
*/
|
|
198
|
+
export const parseResponse = async <T>(response: Response): Promise<T> => {
|
|
199
|
+
try {
|
|
200
|
+
const promiseResponse = await response;
|
|
201
|
+
const data = await promiseResponse.json();
|
|
202
|
+
|
|
203
|
+
return await checkForErrors(data);
|
|
204
|
+
} catch (err) {
|
|
205
|
+
handleConnectionError(err, 'Can not parse JSON!');
|
|
206
|
+
|
|
207
|
+
throw err;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// TODO
|
|
212
|
+
export interface QueryObject {
|
|
213
|
+
query: string;
|
|
214
|
+
variables: Record<string, string>;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export type QueryVariables = Record<string, string>;
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Make GET request to endpoint (via ServiceWorker)
|
|
221
|
+
* @param {{}} queryObject prepared with `prepareDocument()` from `../../utils/Query` request body object
|
|
222
|
+
* @param {String} name Name of model for ServiceWorker to send BroadCasts updates to
|
|
223
|
+
* @param {Number} cacheTTL Cache TTL (in seconds) for ServiceWorker to cache responses
|
|
224
|
+
* @return {Promise<Request>} Fetch promise to GraphQL endpoint
|
|
225
|
+
* @namespace ../../utils/Request/executeGet
|
|
226
|
+
*/
|
|
227
|
+
export const executeGet = async <T>(
|
|
228
|
+
queryObject: QueryObject,
|
|
229
|
+
name: string,
|
|
230
|
+
cacheTTL: number,
|
|
231
|
+
signal?: AbortSignal,
|
|
232
|
+
): Promise<T> => {
|
|
233
|
+
const { query, variables } = queryObject;
|
|
234
|
+
const uri = formatURI(query, variables, getGraphqlEndpoint());
|
|
235
|
+
|
|
236
|
+
if (isSignedIn()) {
|
|
237
|
+
refreshAuthorizationToken();
|
|
238
|
+
refreshUid();
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Fetch only throws on network error, http errors have to be handled manually.
|
|
242
|
+
try {
|
|
243
|
+
const result = await getFetch(uri, name, signal);
|
|
244
|
+
|
|
245
|
+
if (result.status === HTTP_410_GONE) {
|
|
246
|
+
const putResponse = await putPersistedQuery(getGraphqlEndpoint(), query, cacheTTL);
|
|
247
|
+
|
|
248
|
+
if (putResponse.status === HTTP_201_CREATED) {
|
|
249
|
+
return await parseResponse(await getFetch(uri, name, signal));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (result.status === HTTP_503_SERVICE_UNAVAILABLE) {
|
|
254
|
+
handleConnectionError(result.status, result.statusText);
|
|
255
|
+
throw new Error(result.statusText);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Successful and all other http responses go here:
|
|
259
|
+
return await parseResponse(result);
|
|
260
|
+
} catch (error) {
|
|
261
|
+
// Network error
|
|
262
|
+
handleConnectionError(error, 'executeGet failed');
|
|
263
|
+
throw new Error(error as string);
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* Make POST request to endpoint
|
|
268
|
+
* @param {{}} queryObject prepared with `prepareDocument()` from `../../utils/Query` request body object
|
|
269
|
+
* @return {Promise<Request>} Fetch promise to GraphQL endpoint
|
|
270
|
+
* @namespace ../../utils/Request/executePost
|
|
271
|
+
*/
|
|
272
|
+
export const executePost = async <T>(queryObject: QueryObject): Promise<T> => {
|
|
273
|
+
const { query, variables } = queryObject;
|
|
274
|
+
|
|
275
|
+
if (isSignedIn()) {
|
|
276
|
+
refreshAuthorizationToken();
|
|
277
|
+
refreshUid();
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
try {
|
|
281
|
+
const response = await postFetch(getGraphqlEndpoint(), query, variables);
|
|
282
|
+
|
|
283
|
+
return await parseResponse(response);
|
|
284
|
+
} catch (err) {
|
|
285
|
+
handleConnectionError(err, 'executePost failed');
|
|
286
|
+
|
|
287
|
+
throw err;
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Listen to the BroadCast connection
|
|
293
|
+
* @param {String} name Name of model for ServiceWorker to send BroadCasts updates to
|
|
294
|
+
* @return {Promise<any>} Broadcast message promise
|
|
295
|
+
* @namespace ../../utils/Request/listenForBroadCast
|
|
296
|
+
*/
|
|
297
|
+
export const listenForBroadCast = <T = unknown>(name: string): Promise<T> => new Promise((resolve) => {
|
|
298
|
+
const { BroadcastChannel } = window;
|
|
299
|
+
const windowId = getWindowId();
|
|
300
|
+
|
|
301
|
+
if (BroadcastChannel) {
|
|
302
|
+
const bc = new BroadcastChannel(`${ name }_${ windowId }`);
|
|
303
|
+
|
|
304
|
+
bc.onmessage = (update) => {
|
|
305
|
+
const { data: { payload: body } } = update;
|
|
306
|
+
|
|
307
|
+
resolve(checkForErrors(body));
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M Framework - Flexible backend agnostic framework.
|
|
3
|
+
*
|
|
4
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
5
|
+
* See LICENSE for license details.
|
|
6
|
+
*
|
|
7
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
8
|
+
* @package mframework/mframework-theme
|
|
9
|
+
* @link https://github.com/meeovi/mframework-theme
|
|
10
|
+
*/
|
|
11
|
+
// Minimal compatibility types to decouple from Redux while migrating to Pinia.
|
|
12
|
+
type AnyAction = any;
|
|
13
|
+
type Reducer = (state: any, action?: any) => any;
|
|
14
|
+
type ReducersMapObject = Record<string, Reducer>;
|
|
15
|
+
type Store = any;
|
|
16
|
+
|
|
17
|
+
// Re-export the concrete RootState definitions so all modules importing
|
|
18
|
+
// `app/utils/Store/Store.type.ts` see the same expanded shape.
|
|
19
|
+
export { ConfigReducerState, CartReducerState, MyAccountReducerState, RootState } from '../../stores/Store.type';
|
|
20
|
+
|
|
21
|
+
declare global {
|
|
22
|
+
export type ModifiedReduxStore<S> = Store & {
|
|
23
|
+
asyncReducers?: ReducersMapObject;
|
|
24
|
+
injectReducer?: (key: string, reducer: Reducer) => void;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* eslint-disable no-param-reassign */
|
|
2
|
+
/**
|
|
3
|
+
* M Framework - Flexible backend agnostic framework.
|
|
4
|
+
*
|
|
5
|
+
* Copyright © Meeovi, LTD. All rights reserved.
|
|
6
|
+
* See LICENSE for license details.
|
|
7
|
+
*
|
|
8
|
+
* @license OSL-3.0 (Open Software License ("OSL") v. 3.0)
|
|
9
|
+
* @package mframework/mframework-theme
|
|
10
|
+
* @link https://github.com/meeovi/mframework-theme
|
|
11
|
+
*/
|
|
12
|
+
import { RootState } from '../../utils/Store/Store.type';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Lightweight compatibility layer that provides the minimal store API
|
|
16
|
+
* used across the commerce layer. This intentionally does not implement
|
|
17
|
+
* full Redux semantics — it keeps a mutable `state` object and exposes
|
|
18
|
+
* `getStore`, `getStoreState`, `injectReducers` and a no-op `dispatch`
|
|
19
|
+
* to satisfy legacy imports while migration to Pinia proceeds.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
type AnyObject = Record<string, any>;
|
|
23
|
+
|
|
24
|
+
const legacyState: RootState = {
|
|
25
|
+
ConfigReducer: {},
|
|
26
|
+
CartReducer: {},
|
|
27
|
+
MyAccountReducer: {},
|
|
28
|
+
} as unknown as RootState;
|
|
29
|
+
|
|
30
|
+
const store: AnyObject = {
|
|
31
|
+
asyncReducers: {} as AnyObject,
|
|
32
|
+
// injectReducer will attach the given reducer/state under the key.
|
|
33
|
+
injectReducer(key: string, reducerOrState: any) {
|
|
34
|
+
// prefer plain objects as initial slice state
|
|
35
|
+
(store.asyncReducers as AnyObject)[key] = reducerOrState;
|
|
36
|
+
(legacyState as AnyObject)[key] = reducerOrState;
|
|
37
|
+
},
|
|
38
|
+
replaceReducer() {
|
|
39
|
+
// no-op compatibility
|
|
40
|
+
},
|
|
41
|
+
// Minimal dispatch compatibility: if a function is passed (thunk-like), call it with dispatch
|
|
42
|
+
dispatch(action: any) {
|
|
43
|
+
if (typeof action === 'function') return action(store.dispatch.bind(store));
|
|
44
|
+
// otherwise, do nothing — migrations should replace side-effects with Pinia actions
|
|
45
|
+
return action;
|
|
46
|
+
},
|
|
47
|
+
getState() {
|
|
48
|
+
return legacyState as any;
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export function configureStore<S, T = typeof store>(s: T): T {
|
|
53
|
+
// no-op for compatibility
|
|
54
|
+
return s;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function noopReducer<T>(state: T): T { return state; }
|
|
58
|
+
|
|
59
|
+
export const getStore = (): typeof store => store;
|
|
60
|
+
|
|
61
|
+
export const getStoreState = (): Partial<RootState> => (store.getState() as Partial<RootState>) || {};
|
|
62
|
+
|
|
63
|
+
export function injectReducers(storeParam: any, reducers: Record<string, any>) {
|
|
64
|
+
Object.entries(reducers).forEach(([name, reducer]) => {
|
|
65
|
+
if (storeParam.injectReducer) storeParam.injectReducer(name, reducer);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
return storeParam;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default getStore;
|