@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,43 @@
1
+ import { toRefs } from '@vueuse/shared';
2
+ import { computed } from 'vue';
3
+ import type { Ref } from 'vue';
4
+ import type { Maybe, SfProduct } from '../_types';
5
+ import { useAsyncData, useState } from 'nuxt/app';
6
+ import type {
7
+ UseProductRecommendedReturn,
8
+ UseProductRecommendedState,
9
+ FetchProductRecommended,
10
+ } from './types';
11
+ import { getCommerceClient } from '../../utils/client';
12
+ import { useHandleError } from '../useHandleError';
13
+
14
+ /**
15
+ * Composable for getting recommended products data
16
+ * @param {string} slug Product slug
17
+ */
18
+ export const useProductRecommended: UseProductRecommendedReturn = (slug) => {
19
+ const state = useState<UseProductRecommendedState>(`useProductRecommended-${slug}`, () => ({
20
+ data: null,
21
+ loading: false,
22
+ }));
23
+
24
+ /** Function for fetching product recommended data
25
+ * @param {string} slug Product slug
26
+ * @example
27
+ * fetchProductRecommended('product-slug');
28
+ */
29
+ const fetchProductRecommended: FetchProductRecommended = async (slug) => {
30
+ state.value.loading = true;
31
+ const client = getCommerceClient();
32
+ const { data, error } = await useAsyncData(() => client.listProducts?.());
33
+ useHandleError(error.value);
34
+ state.value.data = data.value as unknown as Maybe<SfProduct[]>;
35
+ state.value.loading = false;
36
+ return computed(() => state.value.data) as unknown as Ref<Maybe<SfProduct[]>>;
37
+ };
38
+
39
+ return {
40
+ fetchProductRecommended,
41
+ ...toRefs(state.value),
42
+ };
43
+ };
@@ -0,0 +1,20 @@
1
+ import type { SfProductReview } from '../_types';
2
+
3
+ export const mockProductReviews: SfProductReview[] = [
4
+ {
5
+ id: '1',
6
+ text: "I recently purchased a pair of sneakers and I am thoroughly impressed with their quality and comfort. The design is sleek and modern, and the shoes are available in a variety of colors to suit anyone's style preferences. The upper is made of a breathable and durable material that allows my feet to stay cool and dry during long walks or runs. The sole is also very comfortable and provides great support for my feet, making it easy for me to wear them all day without experiencing any discomfort or fatigue. Overall, I highly recommend these sneakers to anyone in the market for a comfortable and stylish shoe that can handle any activity. They are definitely worth the investment!",
7
+ reviewer: 'John Doe',
8
+ rating: 5,
9
+ title: 'Great product!',
10
+ createdAt: '2022-04-28T12:00:00.000Z',
11
+ },
12
+ {
13
+ id: '2',
14
+ text: "I recently purchased a pair of sneakers and I am thoroughly impressed with their quality and comfort. The design is sleek and modern, and the shoes are available in a variety of colors to suit anyone's style preferences. The upper is made of a breathable and durable material that allows my feet to stay cool and dry during long walks or runs. The sole is also very comfortable and provides great support for my feet, making it easy for me to wear them all day without experiencing any discomfort or fatigue. Overall, I highly recommend these sneakers to anyone in the market for a comfortable and stylish shoe that can handle any activity. They are definitely worth the investment!",
15
+ reviewer: 'John Doe',
16
+ rating: 5,
17
+ title: 'Great product!',
18
+ createdAt: '2022-03-01T09:30:00.000Z',
19
+ },
20
+ ];
@@ -0,0 +1,22 @@
1
+ import { vi } from 'vitest';
2
+ import { useProductReviews } from '~/composables/useProductReviews';
3
+ import { mockProductReviews } from './productReviews.mock';
4
+
5
+ vi.mock('@mframework/sdk', () => ({
6
+ sdk: {
7
+ commerce: {
8
+ getProductReviews: vi.fn(() => mockProductReviews),
9
+ },
10
+ },
11
+ }));
12
+
13
+ describe('useProductReview', () => {
14
+ it('should return product reviews', async () => {
15
+ const slug = 'athletic-mens-walking-sneakers';
16
+ const { data, fetchProductReviews } = useProductReviews(slug);
17
+
18
+ await fetchProductReviews(slug);
19
+
20
+ expect(data.value).toEqual(mockProductReviews);
21
+ });
22
+ });
@@ -0,0 +1,2 @@
1
+ export * from './useProductReviews';
2
+ export * from './types';
@@ -0,0 +1,17 @@
1
+ import type { Ref } from 'vue';
2
+ import type { SfProductReview, Maybe } from '../_types';
3
+
4
+ export interface UseProductReviewsState {
5
+ data: Maybe<SfProductReview[]>;
6
+ loading: boolean;
7
+ }
8
+
9
+ export type FetchProductReviews = (slug: string) => Promise<Ref<Maybe<SfProductReview[]>>>;
10
+
11
+ export interface UseProductReviewsReturn {
12
+ data: Readonly<Ref<UseProductReviewsState['data']>>;
13
+ loading: Readonly<Ref<boolean>>;
14
+ fetchProductReviews: FetchProductReviews;
15
+ }
16
+
17
+ export type UseProductReviews = (slug: string) => UseProductReviewsReturn;
@@ -0,0 +1,46 @@
1
+ import { toRefs } from '@vueuse/shared';
2
+ import { computed } from 'vue';
3
+ import type { Ref } from 'vue';
4
+ import type { Maybe, SfProductReview } from '../_types';
5
+ import type {
6
+ UseProductReviews,
7
+ UseProductReviewsState,
8
+ FetchProductReviews,
9
+ } from './types';
10
+ import { getCommerceClient } from '../../utils/client';
11
+ import { useAsyncData, useState } from 'nuxt/app';
12
+ import { useHandleError } from '../useHandleError';
13
+
14
+ /**
15
+ * @description Composable managing product reviews data
16
+ * @param {string} slug Product slug
17
+ * @returns {@link UseProductReturn}
18
+ * @example
19
+ * const { data, loading, fetchProductReviews } = useProductReviews('product-slug');
20
+ */
21
+ export const useProductReviews: UseProductReviews = (slug) => {
22
+ const state = useState<UseProductReviewsState>(`useProductReviews-${slug}`, () => ({
23
+ data: null,
24
+ loading: false,
25
+ }));
26
+
27
+ /** Function for fetching product reviews data
28
+ * @param {string} slug Product slug
29
+ * @example
30
+ * fetchProductReviews('product-slug');
31
+ */
32
+ const fetchProductReviews: FetchProductReviews = async (slug) => {
33
+ state.value.loading = true;
34
+ const client = getCommerceClient();
35
+ const { data, error } = await useAsyncData(() => client.listProductReviews?.(slug) ?? client.listReviews?.(slug));
36
+ useHandleError(error.value);
37
+ state.value.data = data.value as unknown as Maybe<SfProductReview[]>;
38
+ state.value.loading = false;
39
+ return computed(() => state.value.data) as unknown as Ref<Maybe<SfProductReview[]>>;
40
+ };
41
+
42
+ return {
43
+ fetchProductReviews,
44
+ ...toRefs(state.value),
45
+ };
46
+ };
@@ -0,0 +1,11 @@
1
+ import { useProducts } from '../useProducts';
2
+
3
+ describe('useProducts', () => {
4
+ it('should return products', async () => {
5
+ const { fetchProducts, data } = useProducts();
6
+
7
+ await fetchProducts();
8
+
9
+ expect(data.value).not.toBeUndefined();
10
+ });
11
+ });
@@ -0,0 +1,22 @@
1
+ import { Ref } from 'vue'
2
+ import type { Product } from '../_types'
3
+ import type { Maybe } from '../_types'
4
+
5
+ export type GetProducts = {
6
+ items: Product[]
7
+ total?: number
8
+ }
9
+
10
+ export interface UseProductsState {
11
+ data: GetProducts | null
12
+ loading: boolean
13
+ }
14
+
15
+ export type FetchProducts = () => Promise<Ref<Maybe<GetProducts>>>
16
+ export interface UseProducts {
17
+ data: Readonly<Ref<UseProductsState['data']>>
18
+ loading: Readonly<Ref<boolean>>
19
+ fetchProducts: FetchProducts
20
+ }
21
+
22
+ export type UseProductsReturn = () => UseProducts
@@ -0,0 +1,41 @@
1
+ import { toRefs } from '@vueuse/shared';
2
+ import { computed } from 'vue';
3
+ import type { Ref } from 'vue';
4
+ import { FetchProducts, UseProductsReturn, UseProductsState } from './types';
5
+ import { getCommerceClient } from '../../utils/client';
6
+ import { useAsyncData, useState } from 'nuxt/app';
7
+ import { useHandleError } from '../useHandleError';
8
+ import type { Maybe } from '../_types';
9
+
10
+ /**
11
+ * @description Composable for managing products.
12
+ * @returns {@link UseProducts}
13
+ * @example
14
+ * const { data, loading, fetchProducts } = useProducts();
15
+ */
16
+ export const useProducts: UseProductsReturn = () => {
17
+ const state = useState<UseProductsState>('products', () => ({
18
+ data: null,
19
+ loading: false,
20
+ }));
21
+
22
+ /**
23
+ * @description Function for fetching products.
24
+ * @example
25
+ * getProducts();
26
+ */
27
+ const fetchProducts: FetchProducts = async () => {
28
+ state.value.loading = true;
29
+ const client = getCommerceClient();
30
+ const { data, error } = await useAsyncData(() => client.listProducts?.());
31
+ useHandleError(error.value);
32
+ state.value.data = data.value as unknown as UseProductsState['data'];
33
+ state.value.loading = false;
34
+ return computed(() => state.value.data) as unknown as Ref<UseProductsState['data']>;
35
+ };
36
+
37
+ return {
38
+ fetchProducts,
39
+ ...toRefs(state.value),
40
+ };
41
+ };
@@ -0,0 +1,27 @@
1
+ import { getCommerceClient } from '../utils/client'
2
+
3
+ export function useTax() {
4
+ const client = getCommerceClient()
5
+
6
+ async function calculateTax(quoteId: string) {
7
+ try {
8
+ // Use adapter if available
9
+ if (client && typeof client.calculateTax === 'function') {
10
+ return await client.calculateTax(quoteId)
11
+ }
12
+
13
+ // Fallback to Magento tax calculation
14
+ const url = `${process.env.COMMERCE_API_URL}${encodeURIComponent(quoteId)}`
15
+ const res = await fetch(url)
16
+ if (!res.ok) throw new Error('Tax calculation failed')
17
+ return res.json()
18
+ } catch (e) {
19
+ console.error('Tax calculation error', e)
20
+ throw e
21
+ }
22
+ }
23
+
24
+ return { calculateTax }
25
+ }
26
+
27
+ export default useTax
@@ -0,0 +1 @@
1
+ export * from "./password";
@@ -0,0 +1,67 @@
1
+ Feature: Password validation rule
2
+
3
+ Scenario Outline: New password can't be too easy (<newPassword>)
4
+ Given the <newPassword> as password
5
+ When the method is called
6
+ Then a false should be returned
7
+
8
+ Examples:
9
+
10
+ | newPassword |
11
+ | 12345 |
12
+ | password |
13
+ | password1 |
14
+ | Password1 |
15
+ | Password@ |
16
+ | Password123567890 |
17
+
18
+ Scenario Outline: New password must be complex enough (<newPassword>)
19
+ Given the <newPassword> as password
20
+ When the method is called
21
+ Then a true should be returned
22
+
23
+ Examples:
24
+
25
+ | newPassword |
26
+ | Password1!3 |
27
+ | L0ngEnough$ |
28
+ | L0ngEnough@ |
29
+ | L0ngEnough# |
30
+ | L0ngEnough% |
31
+ | L0ngEnough^ |
32
+ | L0ngEnough* |
33
+ | L0ngEnough( |
34
+ | L0ngEnough) |
35
+ | L0ngEnough: |
36
+ | L0ngEnough; |
37
+ | L0ngEnough, |
38
+ | L0ngEnough. |
39
+
40
+ Scenario Outline: New password can't have some special signs (<newPassword>)
41
+ Given the <newPassword> as password
42
+ When the method is called
43
+ Then a false should be returned
44
+
45
+ Examples:
46
+
47
+ | newPassword |
48
+ | L0ngEnough& |
49
+ | L0ngEnough[ |
50
+ | L0ngEnough] |
51
+ | L0ngEnough" |
52
+ | L0ngEnough' |
53
+ | L0ngEnough/ |
54
+ | L0ngEnough> |
55
+ | L0ngEnough< |
56
+
57
+ Scenario: New password match with confirmation
58
+ Given the password is "Password1!"
59
+ And the confirmation is "Password1!"
60
+ When the method is called
61
+ Then a true should be returned
62
+
63
+ Scenario: New password mismatch with confirmation
64
+ Given the password is "Password1!"
65
+ And the confirmation is "Password1"
66
+ When the method is called
67
+ Then a false should be returned
@@ -0,0 +1,89 @@
1
+ import { expect } from "vitest";
2
+ import type { DefineStepFunction } from "jest-cucumber";
3
+ import { defineFeature, loadFeature } from "jest-cucumber";
4
+ import { validatePassword } from "./password";
5
+
6
+ const feature = loadFeature("./password.feature", { loadRelativePath: true });
7
+
8
+ defineFeature(feature, (test) => {
9
+ let password: string;
10
+ let confirmation: string;
11
+ let output: boolean;
12
+
13
+ function whenTheMethodIsCalled(when: DefineStepFunction) {
14
+ when("the method is called", () => {
15
+ output = validatePassword(password, confirmation);
16
+ });
17
+ }
18
+
19
+ test("New password can't be too easy (<newPassword>)", ({ given, when, then }) => {
20
+ given(/^the (.*) as password$/, (givenPassword) => {
21
+ password = givenPassword;
22
+ confirmation = givenPassword;
23
+ });
24
+
25
+ whenTheMethodIsCalled(when);
26
+
27
+ then("a false should be returned", () => {
28
+ expect(output).toBe(false);
29
+ });
30
+ });
31
+
32
+ test("New password must be complex enough (<newPassword>)", ({ given, when, then }) => {
33
+ given(/^the (.*) as password$/, (givenPassword) => {
34
+ password = givenPassword;
35
+ confirmation = givenPassword;
36
+ });
37
+
38
+ whenTheMethodIsCalled(when);
39
+
40
+ then("a true should be returned", () => {
41
+ expect(output).toBe(true);
42
+ });
43
+ });
44
+
45
+ test("New password can't have some special signs (<newPassword>)", ({ given, when, then }) => {
46
+ given(/^the (.*) as password$/, (givenPassword) => {
47
+ password = givenPassword;
48
+ confirmation = givenPassword;
49
+ });
50
+
51
+ whenTheMethodIsCalled(when);
52
+
53
+ then("a false should be returned", () => {
54
+ expect(output).toBe(false);
55
+ });
56
+ });
57
+
58
+ test("New password match with confirmation", ({ given, and, when, then }) => {
59
+ given(/^the password is (.*)$/, (givenPassword) => {
60
+ password = givenPassword;
61
+ });
62
+
63
+ and(/^the confirmation is (.*)$/, (givenConfirmation) => {
64
+ confirmation = givenConfirmation;
65
+ });
66
+
67
+ whenTheMethodIsCalled(when);
68
+
69
+ then("a true should be returned", () => {
70
+ expect(output).toBe(true);
71
+ });
72
+ });
73
+
74
+ test("New password mismatch with confirmation", ({ given, and, when, then }) => {
75
+ given(/^the password is (.*)$/, (givenPassword) => {
76
+ password = givenPassword;
77
+ });
78
+
79
+ and(/^the confirmation is (.*)$/, (givenConfirmation) => {
80
+ confirmation = givenConfirmation;
81
+ });
82
+
83
+ whenTheMethodIsCalled(when);
84
+
85
+ then("a false should be returned", () => {
86
+ expect(output).toBe(false);
87
+ });
88
+ });
89
+ });
@@ -0,0 +1,25 @@
1
+ /* eslint-disable sonarjs/prefer-single-boolean-return */
2
+ /* eslint-disable max-statements */
3
+ export function validatePassword(firstInput: string, confirmationInput: string): boolean {
4
+ if (firstInput !== confirmationInput) {
5
+ return false;
6
+ }
7
+
8
+ if (firstInput.length < 8) {
9
+ return false;
10
+ }
11
+
12
+ if (/[A-Z]+/.test(firstInput) === false) {
13
+ return false;
14
+ }
15
+
16
+ if (/\d+/.test(firstInput) === false) {
17
+ return false;
18
+ }
19
+
20
+ if (/[!#$%()*,.:;@^]+/.test(firstInput) === false) {
21
+ return false;
22
+ }
23
+
24
+ return true;
25
+ }