@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
package/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# @mframework/commerce
|
|
2
|
+
|
|
3
|
+
A backend‑agnostic commerce domain module for the Meeovi ecosystem.
|
|
4
|
+
This package provides a unified interface for products, categories, carts, and other commerce operations — regardless of the underlying backend (Directus, Medusa, Shopify, custom APIs, etc.).
|
|
5
|
+
|
|
6
|
+
## ✨ Features
|
|
7
|
+
|
|
8
|
+
- Pluggable provider architecture
|
|
9
|
+
- Unified composables (`useProducts`, `useCart`, `useCategories`)
|
|
10
|
+
- Backend‑agnostic types
|
|
11
|
+
- Runtime configuration
|
|
12
|
+
- Zero Nuxt dependency
|
|
13
|
+
- Works in any JS/TS environment
|
|
14
|
+
|
|
15
|
+
## 📦 Installation
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npm install @mframework/commerce
|
|
19
|
+
|
|
20
|
+
⚙️ Configuration
|
|
21
|
+
Configure the active providers at runtime:
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
import { setCommerceConfig } from '@mframework/commerce'
|
|
25
|
+
|
|
26
|
+
setCommerceConfig({
|
|
27
|
+
productProvider: 'directus',
|
|
28
|
+
cartProvider: 'directus',
|
|
29
|
+
categoryProvider: 'directus'
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
🧩 Usage
|
|
33
|
+
|
|
34
|
+
import { useProducts } from '@mframework/commerce'
|
|
35
|
+
|
|
36
|
+
const { listProducts, getProduct } = useProducts()
|
|
37
|
+
|
|
38
|
+
const products = await listProducts()
|
|
39
|
+
const product = await getProduct('123')
|
|
40
|
+
🔌 Providers
|
|
41
|
+
A provider implements one or more domain interfaces:
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
export interface ProductProvider {
|
|
45
|
+
getProduct(id: string): Promise<Product>
|
|
46
|
+
listProducts(params?: any): Promise<Product[]>
|
|
47
|
+
}
|
|
48
|
+
Register a provider:
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
import { registerProductProvider } from '@mframework/commerce'
|
|
52
|
+
|
|
53
|
+
registerProductProvider('directus', {
|
|
54
|
+
getProduct: async (id) => { ... },
|
|
55
|
+
listProducts: async () => { ... }
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
### Registering domain providers from an adapter
|
|
59
|
+
|
|
60
|
+
Adapter packages can register domain-specific implementations at runtime. Import the runtime helpers from the layer package and call them from your adapter plugin entry:
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
import {
|
|
64
|
+
registerProductProvider,
|
|
65
|
+
registerEventProviderRuntime,
|
|
66
|
+
registerGiftCardProviderRuntime,
|
|
67
|
+
registerSubscriptionProviderRuntime
|
|
68
|
+
} from '@mframework/commerce'
|
|
69
|
+
|
|
70
|
+
registerProductProvider('my-adapter', {
|
|
71
|
+
getProduct: async (id) => { /* ... */ },
|
|
72
|
+
listProducts: async (params) => { /* ... */ }
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
registerEventProviderRuntime('my-adapter', {
|
|
76
|
+
getEvent: async (id) => { /* ... */ },
|
|
77
|
+
listEvents: async () => { /* ... */ }
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
registerGiftCardProviderRuntime('my-adapter', {
|
|
81
|
+
getGiftCard: async (id) => { /* ... */ },
|
|
82
|
+
listGiftCards: async () => { /* ... */ },
|
|
83
|
+
redeemGiftCard: async (code) => ({ success: true })
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
registerSubscriptionProviderRuntime('my-adapter', {
|
|
87
|
+
getSubscription: async (id) => { /* ... */ },
|
|
88
|
+
listSubscriptions: async () => { /* ... */ },
|
|
89
|
+
subscribe: async (payload) => ({ success: true })
|
|
90
|
+
})
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
🧱 Folder Structure
|
|
94
|
+
Code
|
|
95
|
+
src/
|
|
96
|
+
products/
|
|
97
|
+
cart/
|
|
98
|
+
categories/
|
|
99
|
+
config.
|
|
100
|
+
registry.
|
|
101
|
+
useCommerce.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../composables/cart/useCart'
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const Directions = {
|
|
2
|
+
UP: 'up',
|
|
3
|
+
DOWN: 'down',
|
|
4
|
+
LEFT: 'left',
|
|
5
|
+
RIGHT: 'right',
|
|
6
|
+
TOP: 'top',
|
|
7
|
+
BOTTOM: 'bottom',
|
|
8
|
+
} as const
|
|
9
|
+
|
|
10
|
+
export type ChevronDirection = typeof Directions[keyof typeof Directions]
|
|
11
|
+
|
|
12
|
+
export const ChevronDefaults = {
|
|
13
|
+
size: 16,
|
|
14
|
+
direction: Directions.LEFT as ChevronDirection,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default ChevronDefaults
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const DateFieldAttr = {
|
|
2
|
+
TYPE: 'data-type',
|
|
3
|
+
NAME: 'data-name',
|
|
4
|
+
} as const
|
|
5
|
+
|
|
6
|
+
export type DateFieldAttrType = typeof DateFieldAttr
|
|
7
|
+
|
|
8
|
+
export enum HourFormat {
|
|
9
|
+
H12 = 12,
|
|
10
|
+
H24 = 24,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const DEFAULT_DATE_ATTRS = { format: 'YYYY-MM-DD' }
|
|
14
|
+
|
|
15
|
+
export default DEFAULT_DATE_ATTRS
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export enum FieldType {
|
|
2
|
+
TEXT = 'text',
|
|
3
|
+
TEXTAREA = 'textarea',
|
|
4
|
+
SELECT = 'select',
|
|
5
|
+
RADIO = 'radio',
|
|
6
|
+
CHECKBOX = 'checkbox',
|
|
7
|
+
DATE = 'date',
|
|
8
|
+
FILE = 'file',
|
|
9
|
+
BUTTON = 'button',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const DEFAULT_FIELD = FieldType.TEXT
|
|
13
|
+
|
|
14
|
+
export default DEFAULT_FIELD
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export enum FieldDateType {
|
|
2
|
+
DATE = 'date',
|
|
3
|
+
DATETIME = 'datetime',
|
|
4
|
+
TIME = 'time',
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export const DATE_FIELDS_COUNT = 3
|
|
8
|
+
|
|
9
|
+
export enum TimeFormat {
|
|
10
|
+
H12 = '12',
|
|
11
|
+
H24 = '24',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const FIELD_DATE_DEFAULT = FieldDateType.DATE
|
|
15
|
+
|
|
16
|
+
export default FIELD_DATE_DEFAULT
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export enum ProductType {
|
|
2
|
+
SIMPLE = 'simple',
|
|
3
|
+
CONFIGURABLE = 'configurable',
|
|
4
|
+
VIRTUAL = 'virtual',
|
|
5
|
+
BUNDLE = 'bundle',
|
|
6
|
+
GROUPED = 'grouped',
|
|
7
|
+
DOWNLOADABLE = 'downloadable',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const ProductTypes = [
|
|
11
|
+
ProductType.SIMPLE,
|
|
12
|
+
ProductType.CONFIGURABLE,
|
|
13
|
+
ProductType.VIRTUAL,
|
|
14
|
+
ProductType.BUNDLE,
|
|
15
|
+
ProductType.GROUPED,
|
|
16
|
+
ProductType.DOWNLOADABLE,
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
export default ProductTypes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export enum StockStatus {
|
|
2
|
+
IN_STOCK = 'in_stock',
|
|
3
|
+
OUT_OF_STOCK = 'out_of_stock',
|
|
4
|
+
BACKORDER = 'backorder',
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type StockStatusType = StockStatus
|
|
8
|
+
|
|
9
|
+
export const StockStatusDefaults = {
|
|
10
|
+
[StockStatus.IN_STOCK]: 'In stock',
|
|
11
|
+
[StockStatus.OUT_OF_STOCK]: 'Out of stock',
|
|
12
|
+
[StockStatus.BACKORDER]: 'Backorder',
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export default StockStatus
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export enum ImageType {
|
|
2
|
+
THUMBNAIL = 'thumbnail',
|
|
3
|
+
SMALL = 'small',
|
|
4
|
+
IMAGE = 'image',
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface ImageDescriptor {
|
|
8
|
+
src: string
|
|
9
|
+
alt?: string
|
|
10
|
+
label?: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const ImageDefaults: Partial<ImageDescriptor> = {}
|
|
14
|
+
|
|
15
|
+
export default ImageDefaults
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type Maybe<T> = T | null | undefined;
|
|
2
|
+
|
|
3
|
+
// Re-export or alias common legacy names expected by the composables
|
|
4
|
+
// Fallback permissive types for isolated builds
|
|
5
|
+
export type SfProduct = any;
|
|
6
|
+
export type Product = any;
|
|
7
|
+
export type SfCart = any;
|
|
8
|
+
export type Cart = any;
|
|
9
|
+
|
|
10
|
+
// No direct equivalents in @mframework/commerce yet — use permissive any types
|
|
11
|
+
export type SfCustomer = any;
|
|
12
|
+
export type SfAddress = any;
|
|
13
|
+
export type SfProductReview = any;
|
|
14
|
+
export type SfShippingMethods = any;
|
|
15
|
+
export type SfAttribute = any;
|
|
16
|
+
|
|
17
|
+
// Export additional useful types from the commerce package if needed
|
|
18
|
+
export type Category = any;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CartProvider } from "./types"
|
|
2
|
+
|
|
3
|
+
const providers: Record<string, CartProvider> = {}
|
|
4
|
+
|
|
5
|
+
export function registerCartProvider(name: string, provider: CartProvider) {
|
|
6
|
+
providers[name] = provider
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function getCartProvider(name: string) {
|
|
10
|
+
const provider = providers[name]
|
|
11
|
+
if (!provider) throw new Error(`Cart provider "${name}" not found`)
|
|
12
|
+
return provider
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Runtime helper for adapter packages to register themselves when the
|
|
16
|
+
// app boots. Adapter packages can import this and call it from their
|
|
17
|
+
// plugin entry to wire into the commerce cart provider registry.
|
|
18
|
+
export function registerCartProviderRuntime(name: string, provider: CartProvider) {
|
|
19
|
+
registerCartProvider(name, provider)
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface CartItem {
|
|
2
|
+
id: string
|
|
3
|
+
quantity: number
|
|
4
|
+
product: any
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface Cart {
|
|
8
|
+
id: string
|
|
9
|
+
items: CartItem[]
|
|
10
|
+
total: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface CartProvider {
|
|
14
|
+
getCart(): Promise<Cart>
|
|
15
|
+
addItem(productId: string, quantity?: number): Promise<Cart>
|
|
16
|
+
removeItem(productId: string): Promise<Cart>
|
|
17
|
+
clearCart(): Promise<Cart>
|
|
18
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getCartProvider } from './registry'
|
|
2
|
+
import useRuntimeConfig from '~/types'
|
|
3
|
+
|
|
4
|
+
export function useCart() {
|
|
5
|
+
const _cfg: any = (typeof (useRuntimeConfig as any) === 'function') ? (useRuntimeConfig as any)() : (useRuntimeConfig || { public: {} })
|
|
6
|
+
const providerName = (_cfg && _cfg.public && _cfg.public.cartProvider) ? _cfg.public.cartProvider : 'directus'
|
|
7
|
+
const provider = getCartProvider(providerName)
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
getCart: provider.getCart,
|
|
11
|
+
addItem: provider.addItem,
|
|
12
|
+
removeItem: provider.removeItem,
|
|
13
|
+
clearCart: provider.clearCart
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface CommerceConfig {
|
|
2
|
+
productProvider: string
|
|
3
|
+
cartProvider: string
|
|
4
|
+
categoryProvider: string
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
let config: CommerceConfig = {
|
|
8
|
+
productProvider: 'directus',
|
|
9
|
+
cartProvider: 'directus',
|
|
10
|
+
categoryProvider: 'directus'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function setCommerceConfig(newConfig: Partial<CommerceConfig>) {
|
|
14
|
+
config = { ...config, ...newConfig }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function getCommerceConfig() {
|
|
18
|
+
return config
|
|
19
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { DefineAddCustomFields, NormalizersConstraint } from "./types";
|
|
2
|
+
import type { UnifiedMethods } from "../methods";
|
|
3
|
+
|
|
4
|
+
export type DefineApi<TContext = Record<string, unknown>> = {
|
|
5
|
+
[TKey in keyof UnifiedMethods]: (
|
|
6
|
+
fn: (
|
|
7
|
+
context: TContext,
|
|
8
|
+
...args: Parameters<UnifiedMethods[TKey]>
|
|
9
|
+
) => ReturnType<UnifiedMethods[TKey]>,
|
|
10
|
+
) => (
|
|
11
|
+
context: TContext,
|
|
12
|
+
...args: Parameters<UnifiedMethods[TKey]>
|
|
13
|
+
) => ReturnType<UnifiedMethods[TKey]>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function getApiDefinitions<TContext = Record<string, unknown>>(): DefineApi<TContext> {
|
|
17
|
+
return {
|
|
18
|
+
getCategories: (fn) => fn,
|
|
19
|
+
getCategory: (fn) => fn,
|
|
20
|
+
getCart: (fn) => fn,
|
|
21
|
+
addCartLineItem: (fn) => fn,
|
|
22
|
+
updateCartLineItem: (fn) => fn,
|
|
23
|
+
removeCartLineItem: (fn) => fn,
|
|
24
|
+
applyCouponToCart: (fn) => fn,
|
|
25
|
+
removeCouponFromCart: (fn) => fn,
|
|
26
|
+
setCustomerEmail: (fn) => fn,
|
|
27
|
+
setCartAddress: (fn) => fn,
|
|
28
|
+
getAvailableShippingMethods: (fn) => fn,
|
|
29
|
+
setShippingMethod: (fn) => fn,
|
|
30
|
+
registerCustomer: (fn) => fn,
|
|
31
|
+
loginCustomer: (fn) => fn,
|
|
32
|
+
getCustomer: (fn) => fn,
|
|
33
|
+
logoutCustomer: (fn) => fn,
|
|
34
|
+
updateCustomer: (fn) => fn,
|
|
35
|
+
changeCustomerPassword: (fn) => fn,
|
|
36
|
+
searchProducts: (fn) => fn,
|
|
37
|
+
getProducts: (fn) => fn,
|
|
38
|
+
getProductDetails: (fn) => fn,
|
|
39
|
+
getProductReviews: (fn) => fn,
|
|
40
|
+
createCustomerAddress: (fn) => fn,
|
|
41
|
+
getCustomerAddresses: (fn) => fn,
|
|
42
|
+
updateCustomerAddress: (fn) => fn,
|
|
43
|
+
deleteCustomerAddress: (fn) => fn,
|
|
44
|
+
getCurrencies: (fn) => fn,
|
|
45
|
+
getOrders: (fn) => fn,
|
|
46
|
+
getOrderDetails: (fn) => fn,
|
|
47
|
+
placeOrder: (fn) => fn,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function defineAddCustomFieldsFactory<TNormalizers extends NormalizersConstraint>() {
|
|
52
|
+
return <TInput extends DefineAddCustomFields<TNormalizers>>(input: TInput) => {
|
|
53
|
+
return input;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Feature: Unified Extension
|
|
2
|
+
|
|
3
|
+
Scenario: Overriding normalizer
|
|
4
|
+
Given one of the normalizers is overridden
|
|
5
|
+
When extension is created
|
|
6
|
+
And the normalizer is called
|
|
7
|
+
Then the overridden normalizer should be called
|
|
8
|
+
And remaining normalizers should be unchanged
|
|
9
|
+
|
|
10
|
+
Scenario: Add custom fields array with a single element
|
|
11
|
+
Given a custom field is added to one of the normalizers
|
|
12
|
+
When extension is created
|
|
13
|
+
And the normalizer is called
|
|
14
|
+
Then the custom field should be present in the $custom object
|
|
15
|
+
And remaining normalizers should be unchanged
|
|
16
|
+
|
|
17
|
+
Scenario: Add custom fields array with multiple elements
|
|
18
|
+
Given multiple elements of the addCustomFields array override the same normalizer
|
|
19
|
+
When extension is created
|
|
20
|
+
And the normalizer is called
|
|
21
|
+
Then all custom fields should be present in the $custom object
|
|
22
|
+
|
|
23
|
+
Scenario: Nested custom fields
|
|
24
|
+
Given multiple elements of the addCustomFields array override the same normalizer
|
|
25
|
+
And custom fields are objects
|
|
26
|
+
When extension is created
|
|
27
|
+
And the normalizer is called
|
|
28
|
+
Then objects should be merged into the $custom object
|
|
29
|
+
|
|
30
|
+
Scenario: Adding the same custom fields more than once
|
|
31
|
+
Given multiple elements of the addCustomFields array add the same custom field
|
|
32
|
+
When extension is created
|
|
33
|
+
And the normalizer is called
|
|
34
|
+
Then the custom field should have value based on the last element of the addCustomFields array
|
|
35
|
+
|
|
36
|
+
Scenario: Overriding api method
|
|
37
|
+
Given one of the api methods is overridden
|
|
38
|
+
When extension is created
|
|
39
|
+
And the api method is called
|
|
40
|
+
Then the overridden api method should be called
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
interface RawMoney {
|
|
2
|
+
amount: number;
|
|
3
|
+
formattedAmount: string;
|
|
4
|
+
decimalPlaces: number;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
interface RawProduct {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
type NormalizerContext = any;
|
|
13
|
+
|
|
14
|
+
export const normalizers = {
|
|
15
|
+
normalizeMoney: (rawMoney: RawMoney, ctx: NormalizerContext) => ({
|
|
16
|
+
amount: rawMoney.amount,
|
|
17
|
+
currency: ctx.currency,
|
|
18
|
+
}),
|
|
19
|
+
normalizeProductCatalogItem: (rawProduct: RawProduct) => ({
|
|
20
|
+
id: rawProduct.id,
|
|
21
|
+
name: rawProduct.name,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const rawMoneyMock: RawMoney = {
|
|
26
|
+
amount: 10,
|
|
27
|
+
formattedAmount: "10.00",
|
|
28
|
+
decimalPlaces: 2,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const methods = {
|
|
32
|
+
getSuccess() {
|
|
33
|
+
return Promise.resolve({ ok: true });
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const getAdditionalNormalizerContext = () => ({
|
|
38
|
+
sku: "123",
|
|
39
|
+
});
|