@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
@@ -0,0 +1,47 @@
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
10
+ */
11
+
12
+ import { FieldType } from 'Component/Field/Field.config';
13
+
14
+ export interface ValidationRule {
15
+ isRequired?: boolean;
16
+ inputType?: string;
17
+ selector?: string;
18
+ match?: string
19
+ | ((value: string | Record<string, string | boolean>[] | undefined) => boolean)
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ | ((...args: any[]) => boolean | string);
22
+ range?: { min?: number; max?: number; showLengthError?: boolean };
23
+ fileExtension?: Record<string, string>;
24
+ customErrorMessages?: Record<string, string>;
25
+ }
26
+
27
+ export interface ValidationOutput {
28
+ value: string | boolean;
29
+ errorMessages: string[];
30
+ }
31
+
32
+ export interface ValidationDOMOutput {
33
+ values?: {
34
+ name: string;
35
+ value: string | boolean;
36
+ type: string;
37
+ }[];
38
+ errorFields?: unknown[];
39
+ errorMessages?: string[];
40
+ }
41
+
42
+ export interface FieldValidationOutput {
43
+ errorMessages?: string[];
44
+ name?: string;
45
+ type: any;
46
+ value?: string | boolean;
47
+ }
@@ -0,0 +1,12 @@
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
9
+ * @link https://github.com/meeovi/mframework
10
+ */
11
+
12
+ export * from './Validator';
@@ -0,0 +1,65 @@
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
9
+ * @link https://github.com/meeovi/mframework
10
+ */
11
+
12
+ import {
13
+ PriceRange,
14
+ ProductDiscount,
15
+ ProductItem,
16
+ ProductPrice,
17
+ } from '../../normalizers/ProductList.type';
18
+ import { Product as DomainProduct } from '../../types/domain';
19
+
20
+ /**
21
+ * Updates wishlist item price for option based products
22
+ * @param {Object} product
23
+ * @namespace ../../utils/Wishlist/getPriceRange
24
+ */
25
+ export const getPriceRange = (
26
+ product: ProductItem | DomainProduct,
27
+ price: number,
28
+ priceWithoutTax: number,
29
+ discount: ProductDiscount | number = 0,
30
+ ): { price_range?: PriceRange } => {
31
+ if (!price) {
32
+ return {};
33
+ }
34
+
35
+ const {
36
+ price_range: {
37
+ minimum_price: {
38
+ regular_price: {
39
+ currency,
40
+ } = {},
41
+ },
42
+ },
43
+ } = product;
44
+
45
+ const priceCurrencyValue = { value: price, currency };
46
+ const priceCurrencyValueExclTax = { value: priceWithoutTax, currency };
47
+
48
+ const priceSection = {
49
+ final_price: priceCurrencyValue,
50
+ regular_price: priceCurrencyValue,
51
+ final_price_excl_tax: priceCurrencyValueExclTax,
52
+ regular_price_excl_tax: priceCurrencyValueExclTax,
53
+ default_final_price_excl_tax: priceCurrencyValueExclTax,
54
+ discount,
55
+ } as ProductPrice;
56
+
57
+ return {
58
+ price_range: {
59
+ minimum_price: priceSection,
60
+ maximum_price: priceSection,
61
+ },
62
+ };
63
+ };
64
+
65
+ export default getPriceRange;
@@ -0,0 +1,12 @@
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
9
+ * @link https://github.com/meeovi/mframework
10
+ */
11
+
12
+ export * from './Wishlist';
@@ -0,0 +1,280 @@
1
+ import * as CommercePkg from '~/types';
2
+ import { sdk } from '@mframework/sdk';
3
+ import imports from '../types';
4
+ import { normalizeProductsQueryOutput, normalizeProduct } from '../normalizers/ProductList.type';
5
+ import { normalizeCart } from '../normalizers/Cart.type';
6
+ import { normalizeOrder } from '../normalizers/Order.type';
7
+ import { normalizeReview } from '../normalizers/Review.type';
8
+ import { normalizeGiftCard, normalizeGiftCards } from '../normalizers/GiftCard.type';
9
+ import { normalizeSubscription, normalizeSubscriptions } from '../normalizers/Subscription.type';
10
+ import { normalizeReturn, normalizeReturns } from '../normalizers/Return.type';
11
+ import { normalizeCreditMemo, normalizeCreditMemos } from '../normalizers/CreditMemo.type';
12
+ import { normalizeInvoice, normalizeInvoices } from '../normalizers/Invoice.type';
13
+ import { normalizeTransaction, normalizeTransactions } from '../normalizers/Transaction.type';
14
+ import { normalizePayment, normalizePayments } from '../normalizers/Payment.type';
15
+
16
+ function getRawCommerceClient(provider?: string, config?: any): any {
17
+ try {
18
+ if (typeof (imports as any)?.createClient === 'function') {
19
+ return (imports as any).createClient(provider, config);
20
+ }
21
+ if (typeof (imports as any)?.init === 'function') {
22
+ return (imports as any).init(config);
23
+ }
24
+ if ((imports as any).commerce) return (imports as any).commerce;
25
+ } catch (e) {
26
+ // ignore and continue to other fallbacks
27
+ }
28
+
29
+ try {
30
+ const CommerceAny: any = CommercePkg as any;
31
+ if (typeof CommerceAny?.createClient === 'function') return CommerceAny.createClient(provider, config);
32
+ if (typeof CommerceAny?.init === 'function') return CommerceAny.init(config);
33
+ if (CommerceAny?.commerce) return CommerceAny.commerce;
34
+ } catch (e) {
35
+ // ignore and fallback to sdk
36
+ }
37
+
38
+ return (sdk as any)?.commerce || null;
39
+ }
40
+
41
+ function createNormalizedClient(client: any) {
42
+ if (!client) return client;
43
+ if ((client as any).__normalized) return client;
44
+
45
+ const wrapped: any = Object.create(client);
46
+
47
+ if (typeof client.listProducts === 'function') {
48
+ wrapped.listProducts = async (...args: any[]) => {
49
+ const res = await client.listProducts(...args);
50
+ try {
51
+ return normalizeProductsQueryOutput(res);
52
+ } catch (e) {
53
+ return res;
54
+ }
55
+ };
56
+ }
57
+
58
+ if (typeof client.getProductById === 'function') {
59
+ wrapped.getProductById = async (...args: any[]) => {
60
+ const res = await client.getProductById(...args);
61
+ try {
62
+ return normalizeProduct(res);
63
+ } catch (e) {
64
+ return res;
65
+ }
66
+ };
67
+ }
68
+
69
+ if (typeof client.getProductBySlug === 'function') {
70
+ wrapped.getProductBySlug = async (...args: any[]) => {
71
+ const res = await client.getProductBySlug(...args);
72
+ try {
73
+ return normalizeProduct(res);
74
+ } catch (e) {
75
+ return res;
76
+ }
77
+ };
78
+ }
79
+
80
+ if (typeof client.getProduct === 'function') {
81
+ wrapped.getProduct = async (...args: any[]) => {
82
+ const res = await client.getProduct(...args);
83
+ try {
84
+ return normalizeProduct(res);
85
+ } catch (e) {
86
+ return res;
87
+ }
88
+ };
89
+ }
90
+
91
+ const cartMethods = ['getCart', 'createCart', 'addToCart', 'updateCart', 'removeFromCart', 'applyCoupon', 'setShippingAddress'];
92
+ for (const m of cartMethods) {
93
+ if (typeof client[m] === 'function') {
94
+ wrapped[m] = async (...args: any[]) => {
95
+ const res = await client[m](...args);
96
+ try {
97
+ return normalizeCart(res);
98
+ } catch (e) {
99
+ return res;
100
+ }
101
+ };
102
+ }
103
+ }
104
+
105
+ // Order methods: normalize single orders and lists of orders
106
+ if (typeof client.listOrders === 'function') {
107
+ wrapped.listOrders = async (...args: any[]) => {
108
+ const res = await client.listOrders(...args);
109
+ try {
110
+ if (Array.isArray(res)) return res.map(normalizeOrder);
111
+ if (res && Array.isArray(res.items)) return res.items.map(normalizeOrder);
112
+ return res;
113
+ } catch (e) {
114
+ return res;
115
+ }
116
+ };
117
+ }
118
+
119
+ const orderSingles = ['getOrder', 'getOrderById', 'getOrders'];
120
+ for (const m of orderSingles) {
121
+ if (typeof client[m] === 'function') {
122
+ wrapped[m] = async (...args: any[]) => {
123
+ const res = await client[m](...args);
124
+ try {
125
+ return normalizeOrder(res);
126
+ } catch (e) {
127
+ return res;
128
+ }
129
+ };
130
+ }
131
+ }
132
+
133
+ // Returns
134
+ if (typeof client.listReturns === 'function') {
135
+ wrapped.listReturns = async (...args: any[]) => {
136
+ const res = await client.listReturns(...args);
137
+ try { if (Array.isArray(res)) return normalizeReturns(res); if (res && Array.isArray(res.items)) return normalizeReturns(res.items); return res; } catch (e) { return res; }
138
+ };
139
+ }
140
+ if (typeof client.getReturn === 'function') {
141
+ wrapped.getReturn = async (...args: any[]) => { const res = await client.getReturn(...args); try { return normalizeReturn(res); } catch (e) { return res; } };
142
+ }
143
+ if (typeof client.createReturn === 'function') {
144
+ wrapped.createReturn = async (...args: any[]) => { const res = await client.createReturn(...args); try { return normalizeReturn(res); } catch (e) { return res; } };
145
+ }
146
+
147
+ // Credit memos
148
+ if (typeof client.listCreditMemos === 'function') {
149
+ wrapped.listCreditMemos = async (...args: any[]) => {
150
+ const res = await client.listCreditMemos(...args);
151
+ try { if (Array.isArray(res)) return normalizeCreditMemos(res); if (res && Array.isArray(res.items)) return normalizeCreditMemos(res.items); return res; } catch (e) { return res; }
152
+ };
153
+ }
154
+ if (typeof client.getCreditMemo === 'function') {
155
+ wrapped.getCreditMemo = async (...args: any[]) => { const res = await client.getCreditMemo(...args); try { return normalizeCreditMemo(res); } catch (e) { return res; } };
156
+ }
157
+
158
+ // Invoices
159
+ if (typeof client.listInvoices === 'function') {
160
+ wrapped.listInvoices = async (...args: any[]) => {
161
+ const res = await client.listInvoices(...args);
162
+ try { if (Array.isArray(res)) return normalizeInvoices(res); if (res && Array.isArray(res.items)) return normalizeInvoices(res.items); return res; } catch (e) { return res; }
163
+ };
164
+ }
165
+ if (typeof client.getInvoice === 'function') {
166
+ wrapped.getInvoice = async (...args: any[]) => { const res = await client.getInvoice(...args); try { return normalizeInvoice(res); } catch (e) { return res; } };
167
+ }
168
+
169
+ // Transactions
170
+ if (typeof client.listTransactions === 'function') {
171
+ wrapped.listTransactions = async (...args: any[]) => {
172
+ const res = await client.listTransactions(...args);
173
+ try { if (Array.isArray(res)) return normalizeTransactions(res); if (res && Array.isArray(res.items)) return normalizeTransactions(res.items); return res; } catch (e) { return res; }
174
+ };
175
+ }
176
+ if (typeof client.getTransaction === 'function') {
177
+ wrapped.getTransaction = async (...args: any[]) => { const res = await client.getTransaction(...args); try { return normalizeTransaction(res); } catch (e) { return res; } };
178
+ }
179
+
180
+ // Payments
181
+ if (typeof client.listPayments === 'function') {
182
+ wrapped.listPayments = async (...args: any[]) => {
183
+ const res = await client.listPayments(...args);
184
+ try { if (Array.isArray(res)) return normalizePayments(res); if (res && Array.isArray(res.items)) return normalizePayments(res.items); return res; } catch (e) { return res; }
185
+ };
186
+ }
187
+ if (typeof client.getPayment === 'function') {
188
+ wrapped.getPayment = async (...args: any[]) => { const res = await client.getPayment(...args); try { return normalizePayment(res); } catch (e) { return res; } };
189
+ }
190
+ if (typeof client.createPaymentIntent === 'function') {
191
+ wrapped.createPaymentIntent = async (...args: any[]) => { const res = await client.createPaymentIntent(...args); try { return normalizePayment(res); } catch (e) { return res; } };
192
+ }
193
+ if (typeof client.createPayment === 'function') {
194
+ wrapped.createPayment = async (...args: any[]) => { const res = await client.createPayment(...args); try { return normalizePayment(res); } catch (e) { return res; } };
195
+ }
196
+ if (typeof client.capturePayment === 'function') {
197
+ wrapped.capturePayment = async (...args: any[]) => { const res = await client.capturePayment(...args); try { return normalizePayment(res); } catch (e) { return res; } };
198
+ }
199
+ if (typeof client.refundPayment === 'function') {
200
+ wrapped.refundPayment = async (...args: any[]) => { const res = await client.refundPayment(...args); try { return normalizePayment(res); } catch (e) { return res; } };
201
+ }
202
+
203
+ // Reviews
204
+ if (typeof client.listReviews === 'function') {
205
+ wrapped.listReviews = async (...args: any[]) => {
206
+ const res = await client.listReviews(...args);
207
+ try {
208
+ if (Array.isArray(res)) return res.map(normalizeReview);
209
+ if (res && Array.isArray(res.items)) return res.items.map(normalizeReview);
210
+ return res;
211
+ } catch (e) {
212
+ return res;
213
+ }
214
+ };
215
+ }
216
+
217
+ if (typeof client.getReview === 'function') {
218
+ wrapped.getReview = async (...args: any[]) => {
219
+ const res = await client.getReview(...args);
220
+ try { return normalizeReview(res); } catch (e) { return res; }
221
+ };
222
+ }
223
+
224
+ // Gift cards
225
+ if (typeof client.listGiftCards === 'function') {
226
+ wrapped.listGiftCards = async (...args: any[]) => {
227
+ const res = await client.listGiftCards(...args);
228
+ try { return normalizeGiftCards(res); } catch (e) { return res; }
229
+ };
230
+ }
231
+ if (typeof client.getGiftCard === 'function') {
232
+ wrapped.getGiftCard = async (...args: any[]) => {
233
+ const res = await client.getGiftCard(...args);
234
+ try { return normalizeGiftCard(res); } catch (e) { return res; }
235
+ };
236
+ }
237
+
238
+ if (typeof client.redeemGiftCard === 'function') {
239
+ wrapped.redeemGiftCard = async (...args: any[]) => {
240
+ const res = await client.redeemGiftCard(...args);
241
+ try { return normalizeGiftCard(res); } catch (e) { return res; }
242
+ };
243
+ }
244
+
245
+ // Subscriptions
246
+ if (typeof client.listSubscriptions === 'function') {
247
+ wrapped.listSubscriptions = async (...args: any[]) => {
248
+ const res = await client.listSubscriptions(...args);
249
+ try { return normalizeSubscriptions(res); } catch (e) { return res; }
250
+ };
251
+ }
252
+ if (typeof client.getSubscription === 'function') {
253
+ wrapped.getSubscription = async (...args: any[]) => {
254
+ const res = await client.getSubscription(...args);
255
+ try { return normalizeSubscription(res); } catch (e) { return res; }
256
+ };
257
+ }
258
+ if (typeof client.subscribe === 'function') {
259
+ wrapped.subscribe = async (...args: any[]) => {
260
+ const res = await client.subscribe(...args);
261
+ try { return normalizeSubscription(res); } catch (e) { return res; }
262
+ };
263
+ }
264
+
265
+ (wrapped as any).__normalized = true;
266
+ return wrapped;
267
+ }
268
+
269
+ /**
270
+ * Returns a commerce client. This exported function now returns a thin
271
+ * compatibility wrapper around provider clients so common methods return
272
+ * normalized domain shapes when possible. Under the hood it still prefers
273
+ * layer-local providers and falls back to package-level APIs and the SDK.
274
+ */
275
+ export function getCommerceClient(provider?: string, config?: any): any {
276
+ const raw = getRawCommerceClient(provider, config);
277
+ return createNormalizedClient(raw);
278
+ }
279
+
280
+ export default getCommerceClient;
@@ -0,0 +1,53 @@
1
+ import { NormalizerRegistry, CommerceNormalizer } from '../utils/normalizer';
2
+
3
+ // Keep imports loose because host `@mframework/commerce` implementations may vary
4
+ import * as CommercePkg from '~/types';
5
+ const CommerceAny: any = CommercePkg as any;
6
+
7
+ export type Provider = string;
8
+
9
+ export interface CommerceLayerConfig {
10
+ provider: Provider;
11
+ providerConfig?: Record<string, any>;
12
+ normalizer?: CommerceNormalizer;
13
+ registry?: NormalizerRegistry;
14
+ }
15
+
16
+ export function createCommerceLayer(config: CommerceLayerConfig) {
17
+ const registry = config.registry ?? new NormalizerRegistry();
18
+ const normalizer = config.normalizer ?? registry.get(config.provider);
19
+
20
+ if (!normalizer) {
21
+ throw new Error('No normalizer found for provider: ' + config.provider);
22
+ }
23
+
24
+ // Create or obtain a client from `@mframework/commerce` in a resilient way
25
+ const client = ((): any => {
26
+ try {
27
+ if (typeof CommerceAny.createClient === 'function') {
28
+ return CommerceAny.createClient(config.provider, config.providerConfig);
29
+ }
30
+ if (typeof CommerceAny.init === 'function') {
31
+ return CommerceAny.init(config.providerConfig);
32
+ }
33
+ return CommerceAny;
34
+ } catch (e) {
35
+ // In production, surface useful message while avoiding leaking secrets
36
+ throw new Error('Failed to initialize commerce client for provider: ' + config.provider);
37
+ }
38
+ })();
39
+
40
+ async function getProduct(id: string) {
41
+ const raw = await (client.getProduct?.(id) ?? client.fetchProduct?.(id) ?? client.product?.(id));
42
+ return normalizer!.normalizeProduct(raw);
43
+ }
44
+
45
+ return {
46
+ client,
47
+ getProduct,
48
+ registry,
49
+ normalizer,
50
+ } as const;
51
+ }
52
+
53
+ export default createCommerceLayer;
@@ -0,0 +1,23 @@
1
+ export interface CommerceNormalizer {
2
+ normalizeProduct(data: any): any;
3
+ normalizeCategory?(data: any): any;
4
+ normalizeCart?(data: any): any;
5
+ }
6
+
7
+ export class NormalizerRegistry {
8
+ private registry = new Map<string, CommerceNormalizer>();
9
+
10
+ register(name: string, normalizer: CommerceNormalizer) {
11
+ this.registry.set(name, normalizer);
12
+ }
13
+
14
+ get(name: string): CommerceNormalizer | undefined {
15
+ return this.registry.get(name);
16
+ }
17
+
18
+ list(): string[] {
19
+ return Array.from(this.registry.keys());
20
+ }
21
+ }
22
+
23
+ export default NormalizerRegistry;
@@ -0,0 +1,29 @@
1
+ import { CommerceNormalizer } from "../normalizer";
2
+
3
+ export const magentoNormalizer: CommerceNormalizer = {
4
+ normalizeProduct(data: any) {
5
+ return {
6
+ id: data?.id ?? data?.sku ?? data?.item_id,
7
+ title: data?.name ?? data?.title,
8
+ price:
9
+ data?.price ?? data?.price_range?.minimum_price?.final_price?.value,
10
+ description: data?.description ?? data?.short_description,
11
+ images: (data?.media_gallery_entries ?? []).map((m: any) => m.file || m.url),
12
+ raw: data,
13
+ };
14
+ },
15
+
16
+ normalizeCategory(data: any) {
17
+ return {
18
+ id: data?.id,
19
+ name: data?.name,
20
+ raw: data,
21
+ };
22
+ },
23
+
24
+ normalizeCart(data: any) {
25
+ return { raw: data };
26
+ },
27
+ };
28
+
29
+ export default magentoNormalizer;
@@ -0,0 +1,29 @@
1
+ import { CommerceNormalizer } from "../normalizer";
2
+
3
+ export const shopifyNormalizer: CommerceNormalizer = {
4
+ normalizeProduct(data: any) {
5
+ // Shopify payloads vary depending on SDK; this maps common fields
6
+ return {
7
+ id: data?.id ?? data?.variants?.[0]?.id,
8
+ title: data?.title ?? data?.name,
9
+ price: data?.variants?.[0]?.price ?? data?.price,
10
+ description: data?.body_html ?? data?.description,
11
+ images: (data?.images ?? []).map((i: any) => i?.src || i?.url),
12
+ raw: data,
13
+ };
14
+ },
15
+
16
+ normalizeCategory(data: any) {
17
+ return {
18
+ id: data?.id,
19
+ name: data?.title ?? data?.name,
20
+ raw: data,
21
+ };
22
+ },
23
+
24
+ normalizeCart(data: any) {
25
+ return { raw: data };
26
+ },
27
+ };
28
+
29
+ export default shopifyNormalizer;
package/nuxt.config.ts ADDED
@@ -0,0 +1,11 @@
1
+ import {
2
+ defineNuxtConfig
3
+ } from 'nuxt/config'
4
+
5
+ export default defineNuxtConfig({
6
+ $meta: {
7
+ name: 'commerce',
8
+ },
9
+
10
+ runtimeConfig: {}
11
+ })
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@mframework/layer-commerce",
3
+ "version": "0.0.3",
4
+ "description": "Commerce Layer for the M Framework",
5
+ "keywords": [
6
+ "commerce",
7
+ "mframework-framework",
8
+ "nuxt",
9
+ "layer"
10
+ ],
11
+ "license": "MIT",
12
+ "author": "M Framework",
13
+ "type": "module",
14
+ "main": "./nuxt.config.ts",
15
+ "scripts": {
16
+ "test": "vitest",
17
+ "build": "tsc -p tsconfig.json",
18
+ "typecheck": "tsc -p tsconfig.json --noEmit",
19
+ "lint": "eslint 'src/**/*.{ts,tsx}' || true",
20
+ "prepare": "npm run build",
21
+ "prepublishOnly": "npm run typecheck && npm run build",
22
+ "codegen": "npx graphql-codegen --config ./node_modules/@mframework/adapter-magento/codegen.ts"
23
+ },
24
+ "dependencies": {
25
+ "@better-auth/stripe": "^1.4.15",
26
+ "@mframework/core": "^0.0.1",
27
+ "@mframework/sdk": "^0.0.2",
28
+ "@polar-sh/sdk": "^0.42.2",
29
+ "@storefront-ui/nuxt": "^3.1.1",
30
+ "@tilework/opus": "^0.0.12",
31
+ "history": "^5.3.0",
32
+ "jwt-decode": "^4.0.0",
33
+ "lodash-es": "^4.17.23"
34
+ },
35
+ "devDependencies": {
36
+ "@biomejs/biome": "^2.3.11",
37
+ "@vitest/coverage-v8": "^4.0.17",
38
+ "eslint": "^8.0.0",
39
+ "jest-cucumber": "^4.5.0",
40
+ "nuxt": "^4.3.0",
41
+ "typescript": "^5.8.2"
42
+ }
43
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "compilerOptions": {
3
+ "types": ["node", "vitest", "vue", "pinia"],
4
+ "baseUrl": ".",
5
+ "paths": {
6
+ "~/*": ["app/*", "./*"],
7
+ "@/*": ["app/*", "./*"],
8
+ "Util/*": ["app/utils/*"],
9
+ "Query/*": ["app/normalizers/*"],
10
+ "Component/*": ["app/components/*"],
11
+ "Store/*": ["app/stores/*"],
12
+ "Type/*": ["app/types/*"],
13
+ "../../routes/*": ["app/routes/*"],
14
+ "#imports": ["app/imports"],
15
+ "~/app/*": ["app/*"]
16
+ },
17
+ "declaration": true,
18
+ "emitDeclarationOnly": false,
19
+ "outDir": "dist",
20
+ "moduleResolution": "bundler",
21
+ "module": "ESNext",
22
+ "target": "ESNext",
23
+ "strict": false,
24
+ "jsx": "preserve",
25
+ "skipLibCheck": true,
26
+ "noEmitOnError": false
27
+ },
28
+ "include": [
29
+ "src",
30
+ "index.ts",
31
+ "app",
32
+ "app/**/*.vue",
33
+ "app/types",
34
+ "global.d.ts",
35
+ "app/utils/client.ts",
36
+ "app/utils/normalizers"
37
+ ]
38
+ ,
39
+ "exclude": [
40
+ "**/__tests__/**",
41
+ "**/*.spec.ts",
42
+ "**/*.spec.tsx",
43
+ "node_modules"
44
+ ]
45
+ }