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