@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.
Files changed (355) hide show
  1. package/README.md +101 -0
  2. package/app/cart/useCart.ts +1 -0
  3. package/app/components/ChevronIcon/ChevronIcon.config.ts +17 -0
  4. package/app/components/DateSelect/DateSelect.config.ts +15 -0
  5. package/app/components/Field/Field.config.ts +14 -0
  6. package/app/components/FieldDate/FieldDate.config.ts +16 -0
  7. package/app/components/Form/Form.type.ts +8 -0
  8. package/app/components/Product/Product.config.ts +19 -0
  9. package/app/components/Product/Stock.config.ts +15 -0
  10. package/app/components/ProductCustomizableOption/ProductCustomizableOption.config.ts +5 -0
  11. package/app/components/ProductGallery/ProductGallery.config.ts +15 -0
  12. package/app/components/ProductReviews/ProductReviews.config.ts +8 -0
  13. package/app/composables/_types.ts +18 -0
  14. package/app/composables/adapters/abstract/cartAdapter.ts +0 -0
  15. package/app/composables/adapters/abstract/categoryAdapter.ts +0 -0
  16. package/app/composables/adapters/abstract/customerAdapter.ts +0 -0
  17. package/app/composables/adapters/abstract/inventoryAdapter.ts +0 -0
  18. package/app/composables/adapters/abstract/orderAdapter.ts +0 -0
  19. package/app/composables/adapters/abstract/productAdapter.ts +7 -0
  20. package/app/composables/cart/registry.ts +20 -0
  21. package/app/composables/cart/types.ts +18 -0
  22. package/app/composables/cart/useCart.ts +15 -0
  23. package/app/composables/config.ts +19 -0
  24. package/app/composables/defs/apiDefinitions.ts +55 -0
  25. package/app/composables/defs/extension.feature +40 -0
  26. package/app/composables/defs/extension.mocks.ts +39 -0
  27. package/app/composables/defs/extension.test.ts +280 -0
  28. package/app/composables/defs/extension.ts +236 -0
  29. package/app/composables/defs/index.ts +3 -0
  30. package/app/composables/defs/typeHelpers.ts +8 -0
  31. package/app/composables/defs/types.ts +136 -0
  32. package/app/composables/domain/product.ts +12 -0
  33. package/app/composables/featured-products.ts +20 -0
  34. package/app/composables/helpers/contextualizedNormalizers.feature +14 -0
  35. package/app/composables/helpers/contextualizedNormalizers.test.ts +85 -0
  36. package/app/composables/helpers/contextualizedNormalizers.ts +20 -0
  37. package/app/composables/helpers/index.ts +1 -0
  38. package/app/composables/index.ts +9 -0
  39. package/app/composables/methods/auth.ts +83 -0
  40. package/app/composables/methods/cart.ts +119 -0
  41. package/app/composables/methods/category.ts +27 -0
  42. package/app/composables/methods/checkout.ts +54 -0
  43. package/app/composables/methods/customer.ts +52 -0
  44. package/app/composables/methods/helpers.ts +5 -0
  45. package/app/composables/methods/index.ts +75 -0
  46. package/app/composables/methods/order.ts +39 -0
  47. package/app/composables/methods/product.ts +95 -0
  48. package/app/composables/methods/settings.ts +16 -0
  49. package/app/composables/models/cart.ts +95 -0
  50. package/app/composables/models/category.ts +13 -0
  51. package/app/composables/models/checkout.ts +17 -0
  52. package/app/composables/models/customer.ts +16 -0
  53. package/app/composables/models/facets.ts +25 -0
  54. package/app/composables/models/index.ts +94 -0
  55. package/app/composables/models/order.ts +43 -0
  56. package/app/composables/models/product.ts +73 -0
  57. package/app/composables/models/shared.ts +75 -0
  58. package/app/composables/orders.ts +69 -0
  59. package/app/composables/products/registry.ts +86 -0
  60. package/app/composables/products/types.ts +8 -0
  61. package/app/composables/products/useEvents.ts +26 -0
  62. package/app/composables/products/useGiftCards.ts +29 -0
  63. package/app/composables/products/useProducts.ts +12 -0
  64. package/app/composables/products/useSubscriptions.ts +29 -0
  65. package/app/composables/products.ts +30 -0
  66. package/app/composables/registry.ts +24 -0
  67. package/app/composables/useAuth.ts +43 -0
  68. package/app/composables/useBreakpoints/index.ts +1 -0
  69. package/app/composables/useBreakpoints/useBreakpoints.ts +28 -0
  70. package/app/composables/useCache.ts +38 -0
  71. package/app/composables/useCart/__tests__/useCart.spec.ts +11 -0
  72. package/app/composables/useCart/index.ts +1 -0
  73. package/app/composables/useCart/types.ts +17 -0
  74. package/app/composables/useCart/useCart.ts +46 -0
  75. package/app/composables/useCartShippingMethods/__tests__/useCartShippingMethods.spec.ts +11 -0
  76. package/app/composables/useCartShippingMethods/index.ts +1 -0
  77. package/app/composables/useCartShippingMethods/types.ts +17 -0
  78. package/app/composables/useCartShippingMethods/useCartShippingMethods.ts +47 -0
  79. package/app/composables/useCatalog.ts +26 -0
  80. package/app/composables/useContent.ts +26 -0
  81. package/app/composables/useCustomer/__tests__/useCustomer.spec.ts +25 -0
  82. package/app/composables/useCustomer/index.ts +2 -0
  83. package/app/composables/useCustomer/types.ts +17 -0
  84. package/app/composables/useCustomer/useCustomer.ts +40 -0
  85. package/app/composables/useCustomerAddress/__tests__/useCustomerAddress.spec.ts +11 -0
  86. package/app/composables/useCustomerAddress/index.ts +2 -0
  87. package/app/composables/useCustomerAddress/types.ts +17 -0
  88. package/app/composables/useCustomerAddress/useCustomerAddress.ts +55 -0
  89. package/app/composables/useCustomerOrder/__tests__/useCustomerOrder.spec.ts +11 -0
  90. package/app/composables/useCustomerOrder/adress.ts +10 -0
  91. package/app/composables/useCustomerOrder/index.ts +2 -0
  92. package/app/composables/useCustomerOrder/product.ts +37 -0
  93. package/app/composables/useCustomerOrder/types.ts +40 -0
  94. package/app/composables/useCustomerOrder/useCustomerOrder.ts +63 -0
  95. package/app/composables/useCustomerOrders/__tests__/useCustomerOrders.spec.ts +11 -0
  96. package/app/composables/useCustomerOrders/index.ts +2 -0
  97. package/app/composables/useCustomerOrders/types.ts +20 -0
  98. package/app/composables/useCustomerOrders/useCustomerOrders.ts +56 -0
  99. package/app/composables/useCustomerReturns/__tests__/useCustomerReturns.spec.ts +11 -0
  100. package/app/composables/useCustomerReturns/index.ts +2 -0
  101. package/app/composables/useCustomerReturns/types.ts +17 -0
  102. package/app/composables/useCustomerReturns/useCustomerReturns.ts +41 -0
  103. package/app/composables/useHandleError/index.ts +1 -0
  104. package/app/composables/useHandleError/types.ts +11 -0
  105. package/app/composables/useHandleError/useHandleError.ts +27 -0
  106. package/app/composables/useInventory.ts +29 -0
  107. package/app/composables/useLoading.ts +21 -0
  108. package/app/composables/useNotification.ts +21 -0
  109. package/app/composables/usePageTitle.ts +20 -0
  110. package/app/composables/useProduct/index.ts +2 -0
  111. package/app/composables/useProduct/types.ts +17 -0
  112. package/app/composables/useProduct/useProduct.ts +42 -0
  113. package/app/composables/useProductAttribute/__tests__/useProduct.mock.ts +31 -0
  114. package/app/composables/useProductAttribute/__tests__/useProductAttribute.spec.ts +14 -0
  115. package/app/composables/useProductAttribute/index.ts +1 -0
  116. package/app/composables/useProductAttribute/useProductAttribute.ts +37 -0
  117. package/app/composables/useProductRecommended/__tests__/useProductRecommended.spec.ts +12 -0
  118. package/app/composables/useProductRecommended/index.ts +1 -0
  119. package/app/composables/useProductRecommended/types.ts +17 -0
  120. package/app/composables/useProductRecommended/useProductRecommended.ts +43 -0
  121. package/app/composables/useProductReviews/__tests__/productReviews.mock.ts +20 -0
  122. package/app/composables/useProductReviews/__tests__/useProductReviews.spec.ts +22 -0
  123. package/app/composables/useProductReviews/index.ts +2 -0
  124. package/app/composables/useProductReviews/types.ts +17 -0
  125. package/app/composables/useProductReviews/useProductReviews.ts +46 -0
  126. package/app/composables/useProducts/__tests__/useProducts.spec.ts +11 -0
  127. package/app/composables/useProducts/types.ts +22 -0
  128. package/app/composables/useProducts/useProducts.ts +41 -0
  129. package/app/composables/useTax.ts +27 -0
  130. package/app/composables/validationRules/index.ts +1 -0
  131. package/app/composables/validationRules/password.feature +67 -0
  132. package/app/composables/validationRules/password.test.ts +89 -0
  133. package/app/composables/validationRules/password.ts +25 -0
  134. package/app/normalizers/Cart.query.ts +729 -0
  135. package/app/normalizers/Cart.type.ts +285 -0
  136. package/app/normalizers/Category.query.ts +146 -0
  137. package/app/normalizers/Category.type.ts +55 -0
  138. package/app/normalizers/CheckEmail.query.ts +28 -0
  139. package/app/normalizers/Checkout.query.ts +253 -0
  140. package/app/normalizers/Checkout.type.ts +77 -0
  141. package/app/normalizers/CmsBlock.query.ts +57 -0
  142. package/app/normalizers/CmsBlock.type.ts +25 -0
  143. package/app/normalizers/CmsPage.query.ts +59 -0
  144. package/app/normalizers/CmsPage.type.ts +26 -0
  145. package/app/normalizers/Config.query.ts +224 -0
  146. package/app/normalizers/Config.type.ts +196 -0
  147. package/app/normalizers/ContactForm.query.ts +49 -0
  148. package/app/normalizers/CreditMemo.type.ts +49 -0
  149. package/app/normalizers/GiftCard.type.ts +24 -0
  150. package/app/normalizers/Invoice.type.ts +58 -0
  151. package/app/normalizers/Menu.query.ts +54 -0
  152. package/app/normalizers/Menu.type.ts +22 -0
  153. package/app/normalizers/MyAccount.query.ts +268 -0
  154. package/app/normalizers/MyAccount.type.ts +129 -0
  155. package/app/normalizers/NewsletterSubscription.query.ts +38 -0
  156. package/app/normalizers/Order.query.ts +741 -0
  157. package/app/normalizers/Order.type.ts +268 -0
  158. package/app/normalizers/Payment.type.ts +28 -0
  159. package/app/normalizers/ProductAlerts.query.ts +23 -0
  160. package/app/normalizers/ProductCompare.query.ts +226 -0
  161. package/app/normalizers/ProductCompare.type.ts +90 -0
  162. package/app/normalizers/ProductList.query.ts +1620 -0
  163. package/app/normalizers/ProductList.type.ts +726 -0
  164. package/app/normalizers/Region.query.ts +58 -0
  165. package/app/normalizers/Region.type.ts +23 -0
  166. package/app/normalizers/Return.type.ts +50 -0
  167. package/app/normalizers/Review.query.ts +81 -0
  168. package/app/normalizers/Review.type.ts +42 -0
  169. package/app/normalizers/Slider.query.ts +72 -0
  170. package/app/normalizers/Slider.type.ts +26 -0
  171. package/app/normalizers/StoreInPickUp.query.ts +54 -0
  172. package/app/normalizers/StoreInPickUp.type.ts +59 -0
  173. package/app/normalizers/Subscription.type.ts +25 -0
  174. package/app/normalizers/Transaction.type.ts +20 -0
  175. package/app/normalizers/UrlRewrites.query.ts +55 -0
  176. package/app/normalizers/UrlRewrites.type.ts +25 -0
  177. package/app/normalizers/Wishlist.query.ts +202 -0
  178. package/app/normalizers/Wishlist.type.ts +42 -0
  179. package/app/pages/brand/[...slug].vue +76 -0
  180. package/app/pages/brands.vue +67 -0
  181. package/app/pages/cart.vue +142 -0
  182. package/app/pages/compare.vue +166 -0
  183. package/app/pages/departments/[...slug].vue +353 -0
  184. package/app/pages/departments/category/[...slug].vue +114 -0
  185. package/app/pages/incentive/[...id].vue +66 -0
  186. package/app/pages/invoice/[id].vue +309 -0
  187. package/app/pages/order/[id].vue +327 -0
  188. package/app/pages/product/[...id].vue +309 -0
  189. package/app/pages/product/showcases/index.vue +86 -0
  190. package/app/pages/shipment/[...id].vue +176 -0
  191. package/app/pages/shop/[...slug].vue +158 -0
  192. package/app/pages/shops.vue +76 -0
  193. package/app/pages/subscription/[...id].vue +147 -0
  194. package/app/pages/transaction/[...id].vue +74 -0
  195. package/app/routes/CategoryPage/CategoryPage.config.ts +28 -0
  196. package/app/routes/CategoryPage/CategoryPage.type.ts +8 -0
  197. package/app/routes/Checkout/Checkout.config.ts +3 -0
  198. package/app/routes/Checkout/Checkout.type.ts +14 -0
  199. package/app/routes/MyAccount/MyAccount.config.ts +1 -0
  200. package/app/routes/SearchPage/SearchPage.config.ts +1 -0
  201. package/app/routes/UrlRewrites/UrlRewrites.config.ts +5 -0
  202. package/app/stores/Cart/Cart.type.ts +26 -0
  203. package/app/stores/MyAccount/MyAccount.action.ts +7 -0
  204. package/app/stores/Notification/Notification.action.ts +40 -0
  205. package/app/stores/Notification/Notification.type.ts +16 -0
  206. package/app/stores/Popup/Popup.action.ts +30 -0
  207. package/app/stores/Product/Product.dispatcher.ts +53 -0
  208. package/app/stores/Product/Product.reducer.ts +12 -0
  209. package/app/stores/ProductList/ProductList.dispatcher.ts +35 -0
  210. package/app/stores/ProductList/ProductList.reducer.ts +13 -0
  211. package/app/stores/Store.type.ts +31 -0
  212. package/app/stores/Wishlist/Wishlist.type.ts +12 -0
  213. package/app/stores/cart.ts +218 -0
  214. package/app/stores/cartStore.ts +224 -0
  215. package/app/stores/checkout.ts +18 -0
  216. package/app/stores/compare.ts +65 -0
  217. package/app/stores/currency.js +29 -0
  218. package/app/stores/digital-products.js +11 -0
  219. package/app/stores/orders.ts +172 -0
  220. package/app/stores/product.ts +34 -0
  221. package/app/stores/productList.ts +35 -0
  222. package/app/stores/productListInfo.ts +0 -0
  223. package/app/stores/products.ts +118 -0
  224. package/app/stores/recentlyViewedProducts.ts +56 -0
  225. package/app/stores/review.ts +33 -0
  226. package/app/stores/storeInPickUp.ts +21 -0
  227. package/app/stores/user.ts +20 -0
  228. package/app/stores/wishlist.ts +46 -0
  229. package/app/types/Account.type.ts +141 -0
  230. package/app/types/Breadcrumbs.type.ts +23 -0
  231. package/app/types/CMS.type.ts +33 -0
  232. package/app/types/Category.type.ts +67 -0
  233. package/app/types/Checkout.type.ts +58 -0
  234. package/app/types/Common.type.ts +77 -0
  235. package/app/types/Config.type.ts +47 -0
  236. package/app/types/Device.type.ts +37 -0
  237. package/app/types/Direction.type.ts +23 -0
  238. package/app/types/Downloadable.type.ts +24 -0
  239. package/app/types/Error.type.ts +22 -0
  240. package/app/types/Field.type.ts +151 -0
  241. package/app/types/Global.type.ts +156 -0
  242. package/app/types/Graphql.type.ts +4497 -0
  243. package/app/types/Layout.type.ts +18 -0
  244. package/app/types/Menu.type.ts +39 -0
  245. package/app/types/MiniCart.type.ts +61 -0
  246. package/app/types/NotificationList.type.ts +34 -0
  247. package/app/types/Order.type.ts +174 -0
  248. package/app/types/Price.type.ts +72 -0
  249. package/app/types/ProductCompare.type.ts +24 -0
  250. package/app/types/ProductList.type.ts +351 -0
  251. package/app/types/Rating.type.ts +42 -0
  252. package/app/types/Router.type.ts +67 -0
  253. package/app/types/Slider.type.ts +25 -0
  254. package/app/types/StockStatus.type.ts +21 -0
  255. package/app/types/domain/index.ts +94 -0
  256. package/app/types/index.ts +33 -0
  257. package/app/types/shims.d.ts +52 -0
  258. package/app/types/tilework-opus.d.ts +48 -0
  259. package/app/utils/Address/Address.type.ts +28 -0
  260. package/app/utils/Address/index.ts +325 -0
  261. package/app/utils/Auth/IsSignedIn.ts +4 -0
  262. package/app/utils/Auth/Token.ts +9 -0
  263. package/app/utils/Base64/Base64.ts +16 -0
  264. package/app/utils/Base64/index.ts +12 -0
  265. package/app/utils/Browser/Browser.ts +29 -0
  266. package/app/utils/Browser/index.ts +12 -0
  267. package/app/utils/BrowserDatabase/BrowserDatabase.ts +70 -0
  268. package/app/utils/BrowserDatabase/index.ts +12 -0
  269. package/app/utils/CSS/CSS.ts +65 -0
  270. package/app/utils/CSS/index.ts +12 -0
  271. package/app/utils/Cache/Cache.ts +99 -0
  272. package/app/utils/Cart/Cart.ts +300 -0
  273. package/app/utils/Cart/Cart.type.ts +76 -0
  274. package/app/utils/Cart/Token.ts +59 -0
  275. package/app/utils/Cart/index.ts +13 -0
  276. package/app/utils/Category/Filters.ts +39 -0
  277. package/app/utils/Category/index.ts +12 -0
  278. package/app/utils/Common/index.ts +32 -0
  279. package/app/utils/Compare/Compare.ts +89 -0
  280. package/app/utils/Compare/index.ts +12 -0
  281. package/app/utils/Currency/Currency.ts +84 -0
  282. package/app/utils/Currency/index.ts +12 -0
  283. package/app/utils/DynamicReducer/DynamicReducer.type.ts +14 -0
  284. package/app/utils/DynamicReducer/Helper.ts +30 -0
  285. package/app/utils/DynamicReducer/index.tsx +35 -0
  286. package/app/utils/ElementTransition/ElementTransition.ts +100 -0
  287. package/app/utils/Form/Extract.ts +316 -0
  288. package/app/utils/Form/Form.ts +46 -0
  289. package/app/utils/Form/Form.type.ts +60 -0
  290. package/app/utils/Form/Transform.ts +33 -0
  291. package/app/utils/FormPortalCollector/index.ts +45 -0
  292. package/app/utils/History/History.type.ts +31 -0
  293. package/app/utils/History/index.ts +17 -0
  294. package/app/utils/Manipulations/Array.ts +18 -0
  295. package/app/utils/Manipulations/Date.ts +36 -0
  296. package/app/utils/Manipulations/index.ts +14 -0
  297. package/app/utils/Media/Media.ts +27 -0
  298. package/app/utils/Media/index.ts +13 -0
  299. package/app/utils/Menu/Menu.ts +116 -0
  300. package/app/utils/Menu/Menu.type.ts +37 -0
  301. package/app/utils/Menu/index.ts +12 -0
  302. package/app/utils/Mobile/index.ts +13 -0
  303. package/app/utils/Mobile/isMobile.ts +34 -0
  304. package/app/utils/Orders/Orders.ts +71 -0
  305. package/app/utils/Orders/Orders.type.ts +19 -0
  306. package/app/utils/Orders/index.ts +13 -0
  307. package/app/utils/Polyfill/index.ts +336 -0
  308. package/app/utils/Preload/CategoryPreload.ts +74 -0
  309. package/app/utils/Preload/ProductPreload.ts +28 -0
  310. package/app/utils/Preload/index.ts +75 -0
  311. package/app/utils/Price/Price.config.ts +189 -0
  312. package/app/utils/Price/Price.ts +63 -0
  313. package/app/utils/Price/index.ts +12 -0
  314. package/app/utils/Product/Extract.ts +652 -0
  315. package/app/utils/Product/Product.ts +575 -0
  316. package/app/utils/Product/Product.type.ts +260 -0
  317. package/app/utils/Product/Transform.ts +382 -0
  318. package/app/utils/Product/index.ts +12 -0
  319. package/app/utils/Promise/MakeCancelable.ts +44 -0
  320. package/app/utils/Promise/Promise.type.ts +15 -0
  321. package/app/utils/Promise/index.ts +13 -0
  322. package/app/utils/Query/Field.ts +71 -0
  323. package/app/utils/Query/Fragment.ts +22 -0
  324. package/app/utils/Query/PrepareDocument.ts +119 -0
  325. package/app/utils/Query/Query.type.ts +26 -0
  326. package/app/utils/Query/index.ts +15 -0
  327. package/app/utils/Request/Config.ts +21 -0
  328. package/app/utils/Request/DataContainer.ts +102 -0
  329. package/app/utils/Request/Debounce.ts +48 -0
  330. package/app/utils/Request/Error.ts +31 -0
  331. package/app/utils/Request/Hash.ts +88 -0
  332. package/app/utils/Request/LowPriorityLoad.ts +32 -0
  333. package/app/utils/Request/LowPriorityRender.ts +55 -0
  334. package/app/utils/Request/Mutation.ts +25 -0
  335. package/app/utils/Request/Query.ts +25 -0
  336. package/app/utils/Request/QueryDispatcher.ts +135 -0
  337. package/app/utils/Request/Request.ts +310 -0
  338. package/app/utils/Store/Store.type.ts +26 -0
  339. package/app/utils/Store/index.ts +71 -0
  340. package/app/utils/Url/Url.ts +297 -0
  341. package/app/utils/Url/index.ts +12 -0
  342. package/app/utils/Validator/Config.ts +96 -0
  343. package/app/utils/Validator/Validator.ts +268 -0
  344. package/app/utils/Validator/Validator.type.ts +47 -0
  345. package/app/utils/Validator/index.ts +12 -0
  346. package/app/utils/Wishlist/Wishlist.ts +65 -0
  347. package/app/utils/Wishlist/index.ts +12 -0
  348. package/app/utils/client.ts +280 -0
  349. package/app/utils/index.ts +53 -0
  350. package/app/utils/normalizer.ts +23 -0
  351. package/app/utils/normalizers/magento.ts +29 -0
  352. package/app/utils/normalizers/shopify.ts +29 -0
  353. package/nuxt.config.ts +11 -0
  354. package/package.json +43 -0
  355. 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,8 @@
1
+ export type FormFields = Record<string, any>
2
+
3
+ export interface FormValidationResult {
4
+ valid: boolean
5
+ errors?: Record<string, string[]>
6
+ }
7
+
8
+ export default FormFields
@@ -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,5 @@
1
+ export const NONE_RADIO_OPTION = 'none'
2
+
3
+ export default {
4
+ NONE_RADIO_OPTION,
5
+ }
@@ -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,8 @@
1
+ export const REVIEW_POPUP_ID = 'review_popup'
2
+
3
+ export const DEFAULT_REVIEW_LIMIT = 10
4
+
5
+ export default {
6
+ REVIEW_POPUP_ID,
7
+ DEFAULT_REVIEW_LIMIT,
8
+ }
@@ -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;
@@ -0,0 +1,7 @@
1
+ import { Product } from "../../domain/product"
2
+
3
+ export interface ProductAdapter {
4
+ list(): Promise<Product[]>
5
+ get(id: string): Promise<Product | null>
6
+ search(query: string): Promise<Product[]>
7
+ }
@@ -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
+ });