@shopgate/pwa-common-commerce 7.30.0-alpha.7 → 7.30.0-alpha.8

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 (315) hide show
  1. package/cart/action-creators/addCouponsToCart.js +9 -2
  2. package/cart/action-creators/addProductsToCart.js +9 -2
  3. package/cart/action-creators/deleteCouponsFromCart.js +9 -2
  4. package/cart/action-creators/deleteProductsFromCart.js +9 -2
  5. package/cart/action-creators/errorAddCouponsToCart.js +10 -2
  6. package/cart/action-creators/errorAddProductsToCart.js +10 -2
  7. package/cart/action-creators/errorCart.js +8 -2
  8. package/cart/action-creators/errorDeleteCouponsFromCart.js +10 -2
  9. package/cart/action-creators/errorDeleteProductsFromCart.js +10 -2
  10. package/cart/action-creators/errorUpdateProductsInCart.js +10 -2
  11. package/cart/action-creators/receiveCart.js +9 -2
  12. package/cart/action-creators/requestCart.js +8 -2
  13. package/cart/action-creators/setCartProductPendingCount.js +9 -2
  14. package/cart/action-creators/setCouponFieldError.js +9 -2
  15. package/cart/action-creators/setCouponFieldValue.js +9 -2
  16. package/cart/action-creators/setFulfillmentSlot.js +9 -2
  17. package/cart/action-creators/successAddCouponsToCart.js +10 -2
  18. package/cart/action-creators/successAddProductsToCart.js +8 -2
  19. package/cart/action-creators/successDeleteCouponsFromCart.js +8 -2
  20. package/cart/action-creators/successDeleteProductsFromCart.js +8 -2
  21. package/cart/action-creators/successUpdateProductsInCart.js +8 -2
  22. package/cart/action-creators/updateProductsInCart.js +9 -2
  23. package/cart/actions/addCouponsToCart.js +52 -8
  24. package/cart/actions/addProductsToCart.js +80 -11
  25. package/cart/actions/deleteCouponsFromCart.js +39 -6
  26. package/cart/actions/deleteProductsFromCart.js +38 -6
  27. package/cart/actions/fetchCart.js +52 -8
  28. package/cart/actions/updateProductsInCart.js +44 -6
  29. package/cart/constants/PipelineErrors.js +6 -1
  30. package/cart/constants/Pipelines.js +6 -1
  31. package/cart/constants/Portals.js +85 -1
  32. package/cart/constants/index.js +39 -2
  33. package/cart/helpers/config.js +47 -2
  34. package/cart/helpers/createPipelineErrorList.js +30 -4
  35. package/cart/helpers/fulfillmentSlots.js +37 -4
  36. package/cart/helpers/index.js +14 -3
  37. package/cart/helpers/quantity.js +23 -4
  38. package/cart/helpers/shipping.js +57 -2
  39. package/cart/helpers/tax.js +26 -2
  40. package/cart/index.js +25 -5
  41. package/cart/mock.js +130 -1
  42. package/cart/reducers/couponField.js +30 -2
  43. package/cart/reducers/data.js +98 -6
  44. package/cart/reducers/index.js +7 -1
  45. package/cart/selectors/index.js +181 -31
  46. package/cart/selectors/spec.js +189 -2
  47. package/cart/streams/index.js +176 -29
  48. package/cart/subscriptions/index.js +307 -30
  49. package/category/action-creators/errorCategory.js +10 -2
  50. package/category/action-creators/errorCategoryChildren.js +9 -2
  51. package/category/action-creators/errorRootCategories.js +8 -2
  52. package/category/action-creators/receiveCategory.js +12 -2
  53. package/category/action-creators/receiveCategoryChildren.js +10 -2
  54. package/category/action-creators/receiveRootCategories.js +9 -2
  55. package/category/action-creators/requestCategory.js +9 -2
  56. package/category/action-creators/requestCategoryChildren.js +9 -2
  57. package/category/action-creators/requestRootCategories.js +8 -2
  58. package/category/actions/fetchCategory.js +47 -5
  59. package/category/actions/fetchCategoryChildren.js +30 -2
  60. package/category/actions/fetchCategoryOrRootCategories.js +16 -2
  61. package/category/actions/fetchCategoryProducts.js +36 -2
  62. package/category/actions/fetchRootCategories.js +31 -2
  63. package/category/actions/getCategory.js +10 -2
  64. package/category/constants/Pipelines.js +3 -1
  65. package/category/constants/Portals.js +56 -3
  66. package/category/constants/index.js +17 -2
  67. package/category/helpers/index.js +27 -3
  68. package/category/index.js +19 -5
  69. package/category/mock.js +176 -1
  70. package/category/reducers/categoriesById.js +65 -3
  71. package/category/reducers/childrenByCategoryId.js +55 -4
  72. package/category/reducers/helpers/handleCategoryCollection.js +24 -3
  73. package/category/reducers/helpers/handleReceivedCategories.js +3 -1
  74. package/category/reducers/index.js +12 -2
  75. package/category/reducers/rootCategories.js +31 -2
  76. package/category/selectors/index.js +115 -16
  77. package/category/streams/index.js +82 -4
  78. package/category/subscriptions/index.js +96 -3
  79. package/checkout/action-creators/successCheckout.js +9 -2
  80. package/checkout/actions/fetchCheckoutUrl.js +28 -3
  81. package/checkout/constants/Pipelines.js +1 -1
  82. package/checkout/constants/index.js +3 -2
  83. package/checkout/index.js +11 -4
  84. package/checkout/selectors/index.js +7 -2
  85. package/checkout/streams/index.js +8 -2
  86. package/checkout/subscriptions/index.js +35 -6
  87. package/favorites/action-creators/index.js +206 -24
  88. package/favorites/actions/addFavorites.js +41 -3
  89. package/favorites/actions/addFavoritesList.js +27 -2
  90. package/favorites/actions/fetchFavoriteIds.js +49 -5
  91. package/favorites/actions/fetchFavorites.js +60 -5
  92. package/favorites/actions/fetchFavoritesList.js +47 -3
  93. package/favorites/actions/fetchFavoritesListsWithItems.js +32 -3
  94. package/favorites/actions/getFavorites.js +6 -2
  95. package/favorites/actions/removeFavorites.js +32 -3
  96. package/favorites/actions/removeFavoritesList.js +24 -2
  97. package/favorites/actions/toggleFavorites.js +68 -10
  98. package/favorites/actions/updateFavorites.js +39 -3
  99. package/favorites/actions/updateFavoritesList.js +26 -2
  100. package/favorites/constants/Pipelines.js +9 -1
  101. package/favorites/constants/Portals.js +32 -4
  102. package/favorites/constants/index.js +37 -5
  103. package/favorites/index.js +14 -4
  104. package/favorites/mock.js +89 -4
  105. package/favorites/reducers/index.js +7 -1
  106. package/favorites/reducers/lists.js +74 -2
  107. package/favorites/reducers/products.js +231 -24
  108. package/favorites/selectors/index.js +188 -24
  109. package/favorites/streams/index.js +135 -23
  110. package/favorites/streams/spec.js +517 -8
  111. package/favorites/subscriptions/index.js +260 -25
  112. package/favorites/subscriptions/spec.js +701 -28
  113. package/filter/action-creators/errorFilters.js +9 -2
  114. package/filter/action-creators/index.js +4 -1
  115. package/filter/action-creators/receiveFilters.js +10 -2
  116. package/filter/action-creators/requestFilters.js +9 -2
  117. package/filter/action-creators/updateFilters.js +8 -2
  118. package/filter/actions/fetchFilters.js +46 -3
  119. package/filter/actions/getFilters.js +6 -2
  120. package/filter/actions/helpers/buildFilterParams.js +34 -2
  121. package/filter/actions/helpers/buildRequestFilters.js +35 -2
  122. package/filter/actions/helpers/processFilters.js +10 -2
  123. package/filter/actions/helpers/processParams.js +26 -2
  124. package/filter/constants/Pipelines.js +1 -1
  125. package/filter/constants/Portals.js +39 -3
  126. package/filter/constants/index.js +8 -1
  127. package/filter/index.js +12 -4
  128. package/filter/reducers/helpers/enrichFilters.js +11 -3
  129. package/filter/reducers/index.js +5 -1
  130. package/filter/reducers/resultsByHash.js +43 -3
  131. package/filter/selectors/index.js +47 -6
  132. package/filter/streams/index.js +30 -1
  133. package/filter/subscriptions/index.js +34 -2
  134. package/market/constants/Portals.js +22 -4
  135. package/market/constants/index.js +2 -1
  136. package/market/helpers/showReturnPolicy.js +3 -1
  137. package/market/helpers/showTaxDisclaimer.js +3 -1
  138. package/market/index.js +6 -2
  139. package/orders/constants.js +2 -1
  140. package/package.json +3 -3
  141. package/product/action-creators/deleteProductsByIds.js +10 -2
  142. package/product/action-creators/errorProduct.js +10 -2
  143. package/product/action-creators/errorProductDescription.js +10 -2
  144. package/product/action-creators/errorProductImages.js +10 -2
  145. package/product/action-creators/errorProductMedia.js +10 -2
  146. package/product/action-creators/errorProductOptions.js +10 -2
  147. package/product/action-creators/errorProductProperties.js +10 -2
  148. package/product/action-creators/errorProductRelations.js +9 -2
  149. package/product/action-creators/errorProductShipping.js +10 -2
  150. package/product/action-creators/errorProductVariants.js +10 -2
  151. package/product/action-creators/errorProducts.js +9 -2
  152. package/product/action-creators/expireProductById.js +10 -2
  153. package/product/action-creators/expireProductData.js +11 -2
  154. package/product/action-creators/expireProductsByHash.js +9 -2
  155. package/product/action-creators/productNotAvailable.js +10 -2
  156. package/product/action-creators/provideProduct.js +9 -2
  157. package/product/action-creators/receiveProduct.js +10 -2
  158. package/product/action-creators/receiveProductCached.js +9 -2
  159. package/product/action-creators/receiveProductDescription.js +10 -2
  160. package/product/action-creators/receiveProductImages.js +10 -2
  161. package/product/action-creators/receiveProductMedia.js +10 -2
  162. package/product/action-creators/receiveProductOptions.js +10 -2
  163. package/product/action-creators/receiveProductProperties.js +10 -2
  164. package/product/action-creators/receiveProductRelations.js +12 -2
  165. package/product/action-creators/receiveProductShipping.js +10 -2
  166. package/product/action-creators/receiveProductVariants.js +10 -2
  167. package/product/action-creators/receiveProducts.js +16 -2
  168. package/product/action-creators/receiveProductsCached.js +9 -2
  169. package/product/action-creators/refreshExpiredPDPData.js +8 -2
  170. package/product/action-creators/requestProduct.js +10 -2
  171. package/product/action-creators/requestProductDescription.js +9 -2
  172. package/product/action-creators/requestProductImages.js +9 -2
  173. package/product/action-creators/requestProductMedia.js +9 -2
  174. package/product/action-creators/requestProductOptions.js +9 -2
  175. package/product/action-creators/requestProductProperties.js +9 -2
  176. package/product/action-creators/requestProductRelations.js +10 -2
  177. package/product/action-creators/requestProductShipping.js +9 -2
  178. package/product/action-creators/requestProductVariants.js +9 -2
  179. package/product/action-creators/requestProducts.js +9 -2
  180. package/product/action-creators/setProductId.js +9 -2
  181. package/product/action-creators/setProductQuantity.js +9 -2
  182. package/product/action-creators/setProductVariantId.js +9 -2
  183. package/product/actions/changeSortOrder.js +21 -2
  184. package/product/actions/fetchHighlightProducts.js +18 -2
  185. package/product/actions/fetchLiveshoppingProducts.js +14 -2
  186. package/product/actions/fetchProduct.js +52 -3
  187. package/product/actions/fetchProductDescription.js +30 -2
  188. package/product/actions/fetchProductImages.js +31 -2
  189. package/product/actions/fetchProductMedia.js +35 -2
  190. package/product/actions/fetchProductOptions.js +31 -2
  191. package/product/actions/fetchProductProperties.js +30 -2
  192. package/product/actions/fetchProductRelations.js +63 -2
  193. package/product/actions/fetchProductShipping.js +31 -2
  194. package/product/actions/fetchProductVariants.js +31 -2
  195. package/product/actions/fetchProducts.js +189 -17
  196. package/product/actions/fetchProductsById.js +68 -8
  197. package/product/actions/fetchProductsByQuery.js +102 -18
  198. package/product/actions/getHighlightProducts.js +6 -2
  199. package/product/actions/getLiveshoppingProducts.js +6 -2
  200. package/product/actions/getProduct.js +6 -2
  201. package/product/actions/getProductDescription.js +6 -2
  202. package/product/actions/getProductImages.js +6 -2
  203. package/product/actions/getProductOptions.js +6 -2
  204. package/product/actions/getProductProperties.js +6 -2
  205. package/product/actions/getProductRelations.js +6 -2
  206. package/product/actions/getProductShipping.js +6 -2
  207. package/product/actions/getProductVariants.js +6 -2
  208. package/product/actions/getProducts.js +6 -2
  209. package/product/actions/getProductsById.js +6 -2
  210. package/product/actions/getProductsByQuery.js +6 -2
  211. package/product/actions/processProductFlags.js +35 -3
  212. package/product/actions/updateMetadata.js +17 -2
  213. package/product/collections/ProductImageFormats.js +48 -8
  214. package/product/collections/index.js +1 -1
  215. package/product/constants/Pipelines.js +12 -1
  216. package/product/constants/Portals.js +200 -33
  217. package/product/constants/index.js +90 -18
  218. package/product/helpers/index.js +61 -8
  219. package/product/index.js +36 -6
  220. package/product/mock.js +1002 -2
  221. package/product/reducers/descriptionsByProductId.js +54 -5
  222. package/product/reducers/helpers/formatOptions.js +17 -2
  223. package/product/reducers/helpers/handleProductCollection.js +19 -2
  224. package/product/reducers/imagesByProductId.js +51 -4
  225. package/product/reducers/index.js +23 -1
  226. package/product/reducers/mediaByProductId.js +55 -3
  227. package/product/reducers/optionsByProductId.js +41 -2
  228. package/product/reducers/productRelationsByHash.js +43 -2
  229. package/product/reducers/productsById.js +122 -7
  230. package/product/reducers/propertiesByProductId.js +48 -2
  231. package/product/reducers/resultsByHash.js +125 -9
  232. package/product/reducers/shippingByProductId.js +37 -2
  233. package/product/reducers/variantsByProductId.js +56 -2
  234. package/product/selectors/options.js +90 -13
  235. package/product/selectors/page.js +62 -13
  236. package/product/selectors/price.js +81 -18
  237. package/product/selectors/product.js +549 -59
  238. package/product/selectors/product.mock.js +327 -12
  239. package/product/selectors/relations.js +35 -5
  240. package/product/selectors/variants.js +91 -15
  241. package/product/streams/index.js +167 -13
  242. package/product/subscriptions/index.js +210 -4
  243. package/reviews/action-creators/errorProductReviews.js +9 -2
  244. package/reviews/action-creators/errorReviews.js +9 -2
  245. package/reviews/action-creators/errorSubmitReview.js +9 -2
  246. package/reviews/action-creators/errorUserReview.js +9 -2
  247. package/reviews/action-creators/flushUserReview.js +8 -2
  248. package/reviews/action-creators/receiveProductReviews.js +11 -2
  249. package/reviews/action-creators/receiveReviews.js +12 -2
  250. package/reviews/action-creators/receiveSubmitReview.js +9 -2
  251. package/reviews/action-creators/receiveUserReview.js +10 -2
  252. package/reviews/action-creators/requestProductReviews.js +10 -2
  253. package/reviews/action-creators/requestReviews.js +9 -2
  254. package/reviews/action-creators/requestSubmitReview.js +9 -2
  255. package/reviews/action-creators/requestUserReview.js +9 -2
  256. package/reviews/action-creators/resetSubmittedReview.js +9 -2
  257. package/reviews/action-creators/spec.js +40 -1
  258. package/reviews/actions/fetchProductReviews.js +37 -2
  259. package/reviews/actions/fetchReviews.js +38 -2
  260. package/reviews/actions/fetchUserReview.js +31 -2
  261. package/reviews/actions/flushUserReview.js +5 -1
  262. package/reviews/actions/getProductReviews.js +6 -2
  263. package/reviews/actions/getUserReview.js +6 -2
  264. package/reviews/actions/spec.js +241 -4
  265. package/reviews/actions/submitReview.js +63 -3
  266. package/reviews/constants/Pipelines.js +4 -1
  267. package/reviews/constants/Portals.js +4 -1
  268. package/reviews/constants/index.js +26 -7
  269. package/reviews/index.js +15 -4
  270. package/reviews/mock.js +172 -11
  271. package/reviews/reducers/index.js +11 -1
  272. package/reviews/reducers/mock.js +14 -2
  273. package/reviews/reducers/reviewsByHash.js +52 -6
  274. package/reviews/reducers/reviewsById.js +27 -2
  275. package/reviews/reducers/reviewsByProductId.js +47 -2
  276. package/reviews/reducers/spec.js +211 -2
  277. package/reviews/reducers/userReviewsByProductId.js +68 -2
  278. package/reviews/selectors/index.js +123 -19
  279. package/reviews/selectors/mock.js +100 -1
  280. package/reviews/selectors/spec.js +100 -1
  281. package/reviews/streams/index.js +37 -5
  282. package/reviews/streams/spec.js +25 -1
  283. package/reviews/subscriptions/index.js +27 -2
  284. package/scanner/action-creators/errorHandleScanner.js +11 -2
  285. package/scanner/action-creators/scannerFinished.js +11 -2
  286. package/scanner/action-creators/startScanner.js +8 -2
  287. package/scanner/action-creators/successHandleScanner.js +11 -2
  288. package/scanner/actions/handleBarCode.js +22 -2
  289. package/scanner/actions/handleNoResults.js +23 -2
  290. package/scanner/actions/handleQrCode.js +116 -6
  291. package/scanner/actions/handleSearch.js +33 -2
  292. package/scanner/constants/Portals.js +22 -1
  293. package/scanner/constants/index.js +17 -1
  294. package/scanner/helpers/index.js +115 -5
  295. package/scanner/index.js +19 -5
  296. package/scanner/streams/index.js +36 -1
  297. package/scanner/subscriptions/index.js +78 -8
  298. package/search/action-creators/errorSearchResults.js +10 -2
  299. package/search/action-creators/receiveSearchResults.js +11 -2
  300. package/search/action-creators/receiveSearchSuggestions.js +10 -2
  301. package/search/action-creators/requestSearchResults.js +10 -2
  302. package/search/action-creators/requestSearchSuggestions.js +9 -2
  303. package/search/actions/fetchSearchResults.js +66 -8
  304. package/search/actions/fetchSearchSuggestions.js +36 -2
  305. package/search/constants/Pipelines.js +1 -1
  306. package/search/constants/Portals.js +9 -2
  307. package/search/constants/index.js +10 -2
  308. package/search/helpers/index.js +5 -2
  309. package/search/helpers/removeHighlightingPlaceholders.js +4 -1
  310. package/search/helpers/spec.js +19 -1
  311. package/search/index.js +17 -5
  312. package/search/reducers/index.js +38 -2
  313. package/search/selectors/index.js +23 -4
  314. package/search/streams/index.js +51 -3
  315. package/search/subscriptions/index.js +132 -5
@@ -1,15 +1,330 @@
1
- import cloneDeep from'lodash/cloneDeep';/* eslint-disable camelcase */export var mockedRouterState={currentRoute:null,stack:[]};export var mockedProductMetadata={some:'product metadata'};export var mockedVariantProductMetadata={some:'variant product metadata'};export var mockedProductsById={// Base product with variants
2
- product_1:{isFetching:false,productData:{id:'product_1',active:true,baseProductId:null,flags:{hasChildren:false,hasOptions:false,hasVariants:true},stock:{ignoreQuantity:false,quantity:0,info:'Out of stock',orderable:false,minOrderQuantity:1,maxOrderQuantity:10000},metadata:mockedProductMetadata}},// Variant product of product_1
3
- product_2:{isFetching:false,productData:{id:'product_2',active:true,baseProductId:'product_1',flags:{hasChildren:false,hasOptions:false,hasVariants:false},stock:{ignoreQuantity:true,quantity:200,info:'In stock',orderable:true,minOrderQuantity:1,maxOrderQuantity:10000},metadata:mockedVariantProductMetadata}},// Variant product of product_1 which is not orderable
4
- product_3:{isFetching:false,productData:{id:'product_3',active:true,baseProductId:'product_1',flags:{hasChildren:false,hasOptions:false,hasVariants:false},stock:{ignoreQuantity:false,quantity:0,info:'Out of stock',orderable:false,minOrderQuantity:1,maxOrderQuantity:10000}}},// Currently fetching product
5
- product_4:{isFetching:true,productData:null},// Simple product without variants
6
- product_5:{isFetching:false,productData:{id:'product_5',active:true,baseProductId:null,flags:{hasChildren:false,hasOptions:false,hasVariants:false},name:'Fancy Product',longName:'Fancy Long Product Name',manufacturer:'ACME',price:{currency:'EUR',info:'',unitPrice:90,unitPriceStriked:95,unitPriceMin:0,unitPriceMax:0,unitPriceNet:150,unitPriceWithTax:150,taxAmount:0,taxPercent:0,msrp:100,tiers:[],discount:10},rating:{count:2,average:50,reviewCount:2},stock:{ignoreQuantity:true,quantity:200,info:'In stock',orderable:true,minOrderQuantity:1,maxOrderQuantity:10000},availability:{text:'In stock',state:'ok'},metadata:{some:'metadata'}}},product_7:{isFetching:false,productData:{name:'Short product name'}},// Taken from the original getKnownRelatives() selector test for variants.
7
- parent:{productData:{id:'parent',baseProductId:null,flags:{hasVariants:true}}},child:{productData:{id:'child',baseProductId:'parent',flags:{hasVariants:false}}},child2:{productData:{id:'child2',baseProductId:'parent',flags:{hasVariants:false}}},notAChild:{productData:{id:'notAChild',baseProductId:'foo',flags:{hasVariants:false}}}};export var mockedShippingByProductId={product_1:{isFetching:false,shipping:{currency:'EUR',price:499}},product_5:{isFetching:true}};export var mockedDescriptionsByProductId={product_1:{isFetching:false,description:'Lorem ipsum dolor'},product_5:{isFetching:true}};export var mockedProperty1={label:'Article No.',value:'9252529931'};export var mockedProperty2={label:'Manufacturer',value:'Nike'};export var mockedPropertiesByProductId={product_1:{isFetching:false,properties:[mockedProperty1,mockedProperty2]},product_5:{isFetching:true}};export var mockedProductImagesBase=['https://img-cdn.shopgate.com/a43fac2d','https://img-cdn.shopgate.com/b543f421'];export var mockedProductImagesVariant=['https://img-cdn.shopgate.com/a43fac2d','https://img-cdn.shopgate.com/b543f421'];export var mockedImagesByProductId={product_1:{isFetching:false,images:mockedProductImagesBase},product_2:{isFetching:false,images:mockedProductImagesVariant},product_3:{isFetching:false,images:[]},product_5:{isFetching:true}};export var mockedVariantMetadata={some:'variant metadata'};export var mockedVariantsByProductId={product_1:{isFetching:false,variants:{products:[{id:'product_2',characteristics:{1:'1'},availability:{text:'In stock',state:'ok'}},{id:'product_3',characteristics:{1:'2'},availability:{text:'Only 3 items left',state:'warning'},metadata:mockedVariantMetadata}],characteristics:[{id:'1',label:'Color',values:[{id:'1',label:'Black'},{id:'2',label:'Green'}]}]}}};export var mockedState={router:mockedRouterState,product:{productsById:mockedProductsById,shippingByProductId:mockedShippingByProductId,descriptionsByProductId:mockedDescriptionsByProductId,propertiesByProductId:mockedPropertiesByProductId,imagesByProductId:mockedImagesByProductId,variantsByProductId:mockedVariantsByProductId,optionsByProductId:{}}};/**
1
+ import cloneDeep from 'lodash/cloneDeep';
2
+ /* eslint-disable camelcase */
3
+ export const mockedRouterState = {
4
+ currentRoute: null,
5
+ stack: []
6
+ };
7
+ export const mockedProductMetadata = {
8
+ some: 'product metadata'
9
+ };
10
+ export const mockedVariantProductMetadata = {
11
+ some: 'variant product metadata'
12
+ };
13
+ export const mockedProductsById = {
14
+ // Base product with variants
15
+ product_1: {
16
+ isFetching: false,
17
+ productData: {
18
+ id: 'product_1',
19
+ active: true,
20
+ baseProductId: null,
21
+ flags: {
22
+ hasChildren: false,
23
+ hasOptions: false,
24
+ hasVariants: true
25
+ },
26
+ stock: {
27
+ ignoreQuantity: false,
28
+ quantity: 0,
29
+ info: 'Out of stock',
30
+ orderable: false,
31
+ minOrderQuantity: 1,
32
+ maxOrderQuantity: 10000
33
+ },
34
+ metadata: mockedProductMetadata
35
+ }
36
+ },
37
+ // Variant product of product_1
38
+ product_2: {
39
+ isFetching: false,
40
+ productData: {
41
+ id: 'product_2',
42
+ active: true,
43
+ baseProductId: 'product_1',
44
+ flags: {
45
+ hasChildren: false,
46
+ hasOptions: false,
47
+ hasVariants: false
48
+ },
49
+ stock: {
50
+ ignoreQuantity: true,
51
+ quantity: 200,
52
+ info: 'In stock',
53
+ orderable: true,
54
+ minOrderQuantity: 1,
55
+ maxOrderQuantity: 10000
56
+ },
57
+ metadata: mockedVariantProductMetadata
58
+ }
59
+ },
60
+ // Variant product of product_1 which is not orderable
61
+ product_3: {
62
+ isFetching: false,
63
+ productData: {
64
+ id: 'product_3',
65
+ active: true,
66
+ baseProductId: 'product_1',
67
+ flags: {
68
+ hasChildren: false,
69
+ hasOptions: false,
70
+ hasVariants: false
71
+ },
72
+ stock: {
73
+ ignoreQuantity: false,
74
+ quantity: 0,
75
+ info: 'Out of stock',
76
+ orderable: false,
77
+ minOrderQuantity: 1,
78
+ maxOrderQuantity: 10000
79
+ }
80
+ }
81
+ },
82
+ // Currently fetching product
83
+ product_4: {
84
+ isFetching: true,
85
+ productData: null
86
+ },
87
+ // Simple product without variants
88
+ product_5: {
89
+ isFetching: false,
90
+ productData: {
91
+ id: 'product_5',
92
+ active: true,
93
+ baseProductId: null,
94
+ flags: {
95
+ hasChildren: false,
96
+ hasOptions: false,
97
+ hasVariants: false
98
+ },
99
+ name: 'Fancy Product',
100
+ longName: 'Fancy Long Product Name',
101
+ manufacturer: 'ACME',
102
+ price: {
103
+ currency: 'EUR',
104
+ info: '',
105
+ unitPrice: 90,
106
+ unitPriceStriked: 95,
107
+ unitPriceMin: 0,
108
+ unitPriceMax: 0,
109
+ unitPriceNet: 150,
110
+ unitPriceWithTax: 150,
111
+ taxAmount: 0,
112
+ taxPercent: 0,
113
+ msrp: 100,
114
+ tiers: [],
115
+ discount: 10
116
+ },
117
+ rating: {
118
+ count: 2,
119
+ average: 50,
120
+ reviewCount: 2
121
+ },
122
+ stock: {
123
+ ignoreQuantity: true,
124
+ quantity: 200,
125
+ info: 'In stock',
126
+ orderable: true,
127
+ minOrderQuantity: 1,
128
+ maxOrderQuantity: 10000
129
+ },
130
+ availability: {
131
+ text: 'In stock',
132
+ state: 'ok'
133
+ },
134
+ metadata: {
135
+ some: 'metadata'
136
+ }
137
+ }
138
+ },
139
+ product_7: {
140
+ isFetching: false,
141
+ productData: {
142
+ name: 'Short product name'
143
+ }
144
+ },
145
+ // Taken from the original getKnownRelatives() selector test for variants.
146
+ parent: {
147
+ productData: {
148
+ id: 'parent',
149
+ baseProductId: null,
150
+ flags: {
151
+ hasVariants: true
152
+ }
153
+ }
154
+ },
155
+ child: {
156
+ productData: {
157
+ id: 'child',
158
+ baseProductId: 'parent',
159
+ flags: {
160
+ hasVariants: false
161
+ }
162
+ }
163
+ },
164
+ child2: {
165
+ productData: {
166
+ id: 'child2',
167
+ baseProductId: 'parent',
168
+ flags: {
169
+ hasVariants: false
170
+ }
171
+ }
172
+ },
173
+ notAChild: {
174
+ productData: {
175
+ id: 'notAChild',
176
+ baseProductId: 'foo',
177
+ flags: {
178
+ hasVariants: false
179
+ }
180
+ }
181
+ }
182
+ };
183
+ export const mockedShippingByProductId = {
184
+ product_1: {
185
+ isFetching: false,
186
+ shipping: {
187
+ currency: 'EUR',
188
+ price: 499
189
+ }
190
+ },
191
+ product_5: {
192
+ isFetching: true
193
+ }
194
+ };
195
+ export const mockedDescriptionsByProductId = {
196
+ product_1: {
197
+ isFetching: false,
198
+ description: 'Lorem ipsum dolor'
199
+ },
200
+ product_5: {
201
+ isFetching: true
202
+ }
203
+ };
204
+ export const mockedProperty1 = {
205
+ label: 'Article No.',
206
+ value: '9252529931'
207
+ };
208
+ export const mockedProperty2 = {
209
+ label: 'Manufacturer',
210
+ value: 'Nike'
211
+ };
212
+ export const mockedPropertiesByProductId = {
213
+ product_1: {
214
+ isFetching: false,
215
+ properties: [mockedProperty1, mockedProperty2]
216
+ },
217
+ product_5: {
218
+ isFetching: true
219
+ }
220
+ };
221
+ export const mockedProductImagesBase = ['https://img-cdn.shopgate.com/a43fac2d', 'https://img-cdn.shopgate.com/b543f421'];
222
+ export const mockedProductImagesVariant = ['https://img-cdn.shopgate.com/a43fac2d', 'https://img-cdn.shopgate.com/b543f421'];
223
+ export const mockedImagesByProductId = {
224
+ product_1: {
225
+ isFetching: false,
226
+ images: mockedProductImagesBase
227
+ },
228
+ product_2: {
229
+ isFetching: false,
230
+ images: mockedProductImagesVariant
231
+ },
232
+ product_3: {
233
+ isFetching: false,
234
+ images: []
235
+ },
236
+ product_5: {
237
+ isFetching: true
238
+ }
239
+ };
240
+ export const mockedVariantMetadata = {
241
+ some: 'variant metadata'
242
+ };
243
+ export const mockedVariantsByProductId = {
244
+ product_1: {
245
+ isFetching: false,
246
+ variants: {
247
+ products: [{
248
+ id: 'product_2',
249
+ characteristics: {
250
+ 1: '1'
251
+ },
252
+ availability: {
253
+ text: 'In stock',
254
+ state: 'ok'
255
+ }
256
+ }, {
257
+ id: 'product_3',
258
+ characteristics: {
259
+ 1: '2'
260
+ },
261
+ availability: {
262
+ text: 'Only 3 items left',
263
+ state: 'warning'
264
+ },
265
+ metadata: mockedVariantMetadata
266
+ }],
267
+ characteristics: [{
268
+ id: '1',
269
+ label: 'Color',
270
+ values: [{
271
+ id: '1',
272
+ label: 'Black'
273
+ }, {
274
+ id: '2',
275
+ label: 'Green'
276
+ }]
277
+ }]
278
+ }
279
+ }
280
+ };
281
+ export const mockedState = {
282
+ router: mockedRouterState,
283
+ product: {
284
+ productsById: mockedProductsById,
285
+ shippingByProductId: mockedShippingByProductId,
286
+ descriptionsByProductId: mockedDescriptionsByProductId,
287
+ propertiesByProductId: mockedPropertiesByProductId,
288
+ imagesByProductId: mockedImagesByProductId,
289
+ variantsByProductId: mockedVariantsByProductId,
290
+ optionsByProductId: {}
291
+ }
292
+ };
293
+
294
+ /**
8
295
  * The following mocked states can be used simplified product variant testing. They mimic the
9
296
  * product state in different stages of product data fetching.
10
297
  * product_1 is the base product of product_2 and product_2.
11
- */ // Base product and all its variants are available.
12
- export var mockedVariantStateComplete={product:{productsById:{product_1:cloneDeep(mockedState.product.productsById.product_1),product_2:cloneDeep(mockedState.product.productsById.product_2),product_3:cloneDeep(mockedState.product.productsById.product_3)},variantsByProductId:mockedVariantsByProductId}};// Everything is fetching.
13
- export var mockedVariantStateAllFetching=cloneDeep(mockedVariantStateComplete);delete mockedVariantStateAllFetching.product.variantsByProductId.product_1;delete mockedVariantStateAllFetching.product.productsById.product_1;delete mockedVariantStateAllFetching.product.productsById.product_2;delete mockedVariantStateAllFetching.product.productsById.product_3;// Base product is available, but variants data and variants ara fetching.
14
- export var mockedVariantStateVariantDataFetching=cloneDeep(mockedVariantStateComplete);delete mockedVariantStateVariantDataFetching.product.variantsByProductId.product_1;delete mockedVariantStateVariantDataFetching.product.productsById.product_2;delete mockedVariantStateVariantDataFetching.product.productsById.product_3;// Base product and variants data is available, but variants ara fetching.
15
- export var mockedVariantStateVariantsFetching=cloneDeep(mockedVariantStateComplete);delete mockedVariantStateVariantsFetching.product.productsById.product_2;delete mockedVariantStateVariantsFetching.product.productsById.product_3;/* eslint-enable camelcase */
298
+ */
299
+
300
+ // Base product and all its variants are available.
301
+ export const mockedVariantStateComplete = {
302
+ product: {
303
+ productsById: {
304
+ product_1: cloneDeep(mockedState.product.productsById.product_1),
305
+ product_2: cloneDeep(mockedState.product.productsById.product_2),
306
+ product_3: cloneDeep(mockedState.product.productsById.product_3)
307
+ },
308
+ variantsByProductId: mockedVariantsByProductId
309
+ }
310
+ };
311
+
312
+ // Everything is fetching.
313
+ export const mockedVariantStateAllFetching = cloneDeep(mockedVariantStateComplete);
314
+ delete mockedVariantStateAllFetching.product.variantsByProductId.product_1;
315
+ delete mockedVariantStateAllFetching.product.productsById.product_1;
316
+ delete mockedVariantStateAllFetching.product.productsById.product_2;
317
+ delete mockedVariantStateAllFetching.product.productsById.product_3;
318
+
319
+ // Base product is available, but variants data and variants ara fetching.
320
+ export const mockedVariantStateVariantDataFetching = cloneDeep(mockedVariantStateComplete);
321
+ delete mockedVariantStateVariantDataFetching.product.variantsByProductId.product_1;
322
+ delete mockedVariantStateVariantDataFetching.product.productsById.product_2;
323
+ delete mockedVariantStateVariantDataFetching.product.productsById.product_3;
324
+
325
+ // Base product and variants data is available, but variants ara fetching.
326
+ export const mockedVariantStateVariantsFetching = cloneDeep(mockedVariantStateComplete);
327
+ delete mockedVariantStateVariantsFetching.product.productsById.product_2;
328
+ delete mockedVariantStateVariantsFetching.product.productsById.product_3;
329
+
330
+ /* eslint-enable camelcase */
@@ -1,14 +1,29 @@
1
- import{createSelector}from'reselect';import{generateProductRelationsHash}from"../helpers";import{getProducts}from"./product";/**
1
+ import { createSelector } from 'reselect';
2
+ import { generateProductRelationsHash } from "../helpers";
3
+ import { getProducts } from "./product";
4
+
5
+ /**
2
6
  * Returns productRelations state.
3
7
  * @param {Object} state State.
4
8
  * @returns {Object}
5
9
  * @deprecated
6
- */export var getProductRelationsState=function getProductRelationsState(state){return state.product.productRelationsByHash;};/**
10
+ */
11
+ export const getProductRelationsState = state => state.product.productRelationsByHash;
12
+
13
+ /**
7
14
  * Factory of a function that returns selector of product relations state for given hash.
8
15
  * @param {string} hash State hash.
9
16
  * @returns {Function}
10
17
  * @deprecated
11
- */export var getProductRelationsByHash=function getProductRelationsByHash(hash){return createSelector(getProductRelationsState,function(state){if(state[hash]){return state[hash].productIds;}return undefined;});};/**
18
+ */
19
+ export const getProductRelationsByHash = hash => createSelector(getProductRelationsState, state => {
20
+ if (state[hash]) {
21
+ return state[hash].productIds;
22
+ }
23
+ return undefined;
24
+ });
25
+
26
+ /**
12
27
  * Selector factory.
13
28
  * Accepts parameters as arguments. When used within `mapStateToProps` factory won't be called
14
29
  * as long as `state` and `props` didn't change (shallow comparison).
@@ -18,10 +33,25 @@ import{createSelector}from'reselect';import{generateProductRelationsHash}from"..
18
33
  * @param {number} limit Query limit.
19
34
  * @returns {Function} Selector.
20
35
  * @deprecated Use `makeGetProductRelations` from `@shopgate/engage/products` instead.
21
- */export var getProductRelations=function getProductRelations(_ref){var productId=_ref.productId,type=_ref.type,limit=_ref.limit;return function(state){var hash=generateProductRelationsHash({productId:productId,type:type,limit:limit});return getProductRelationsByHash(hash)(state);};};/**
36
+ */
37
+ export const getProductRelations = ({
38
+ productId,
39
+ type,
40
+ limit
41
+ }) => state => {
42
+ const hash = generateProductRelationsHash({
43
+ productId,
44
+ type,
45
+ limit
46
+ });
47
+ return getProductRelationsByHash(hash)(state);
48
+ };
49
+
50
+ /**
22
51
  * Returns products data for product id.
23
52
  *
24
53
  * @param {Object} params Params, see `.getProductRelations`
25
54
  * @returns {Array}
26
55
  * @deprecated Use `makeGetRelatedProducts` from `@shopgate/engage/products` instead.
27
- */export var getRelatedProducts=function getRelatedProducts(params){return createSelector(getProductRelations(params),getProducts,function(){var relations=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var productsById=arguments.length>1?arguments[1]:undefined;return relations.filter(function(id){return productsById[id]&&productsById[id].productData;}).map(function(id){return productsById[id].productData;});});};
56
+ */
57
+ export const getRelatedProducts = params => createSelector(getProductRelations(params), getProducts, (relations = [], productsById) => relations.filter(id => productsById[id] && productsById[id].productData).map(id => productsById[id].productData));
@@ -1,29 +1,105 @@
1
- import{createSelector}from'reselect';import{getProducts,getProductById,getProductVariants,hasBaseProductVariants,isVariantSelected,getSelectedVariant,getVariantProductId}from"./product";/**
1
+ import "core-js/modules/es.regexp.flags.js";
2
+ import { createSelector } from 'reselect';
3
+ import { getProducts, getProductById, getProductVariants, hasBaseProductVariants, isVariantSelected, getSelectedVariant, getVariantProductId } from "./product";
4
+
5
+ /**
2
6
  * Retrieves the metadata from the product data within the variants.
3
7
  * @param {Object} state The current application state.
4
8
  * @param {Object} props The component props.
5
9
  * @return {Object|null}
6
- */export var getSelectedVariantMetadata=createSelector(getProductVariants,getSelectedVariant,getVariantProductId,function(variants,variant,variantId){if(!variants&&!variant){return null;}// Prefer variant data, if available
7
- if(variants&&variantId!==null){// Get the product data of the selected product from the variants.
8
- var _ref2=variants.products.find(function(_ref3){var id=_ref3.id;return id===variantId;})||{},metadata=_ref2.metadata;if(metadata){return metadata;}}// Check if variant data is available in product list
9
- // istanbul ignore else
10
- if(variant){return variant.metadata;}/**
11
- * This statement should never be reached since getProductVariants will not return data when the
12
- * variant product entity can't be found to determine a baseProductId.
13
- */ // istanbul ignore next
14
- return null;});/**
10
+ */
11
+ export const getSelectedVariantMetadata = createSelector(getProductVariants, getSelectedVariant, getVariantProductId, (variants, variant, variantId) => {
12
+ if (!variants && !variant) {
13
+ return null;
14
+ }
15
+ // Prefer variant data, if available
16
+ if (variants && variantId !== null) {
17
+ // Get the product data of the selected product from the variants.
18
+ const {
19
+ metadata
20
+ } = variants.products.find(({
21
+ id
22
+ }) => id === variantId) || {};
23
+ if (metadata) {
24
+ return metadata;
25
+ }
26
+ }
27
+
28
+ // Check if variant data is available in product list
29
+ // istanbul ignore else
30
+ if (variant) {
31
+ return variant.metadata;
32
+ }
33
+
34
+ /**
35
+ * This statement should never be reached since getProductVariants will not return data when the
36
+ * variant product entity can't be found to determine a baseProductId.
37
+ */
38
+
39
+ // istanbul ignore next
40
+ return null;
41
+ });
42
+
43
+ /**
15
44
  * Matches all products relatives which are already fetched and stored in redux.
16
45
  * If this ever would be too slow, the calculation should happen in the reducer.
17
46
  * @param {Object} state Current state.
18
47
  * @returns {Object}
19
- */export var getKnownProductRelatives=createSelector([getProducts],function(products){var relativesByBaseProductId={};Object.keys(products).forEach(function(id){if(!products[id].productData){// It's possible that product has no data yet. Skip it then.
20
- return;}var productData=products[id].productData;var parentId=productData.id;if(productData.baseProductId){parentId=productData.baseProductId;}if(!relativesByBaseProductId[parentId]){relativesByBaseProductId[parentId]=[];}relativesByBaseProductId[parentId].push(productData.id);if(parentId!==productData.id&&!relativesByBaseProductId[parentId].includes(parentId)){relativesByBaseProductId[parentId].push(parentId);}});return relativesByBaseProductId;});/**
48
+ */
49
+ export const getKnownProductRelatives = createSelector([getProducts], products => {
50
+ const relativesByBaseProductId = {};
51
+ Object.keys(products).forEach(id => {
52
+ if (!products[id].productData) {
53
+ // It's possible that product has no data yet. Skip it then.
54
+ return;
55
+ }
56
+ const {
57
+ productData
58
+ } = products[id];
59
+ let parentId = productData.id;
60
+ if (productData.baseProductId) {
61
+ parentId = productData.baseProductId;
62
+ }
63
+ if (!relativesByBaseProductId[parentId]) {
64
+ relativesByBaseProductId[parentId] = [];
65
+ }
66
+ relativesByBaseProductId[parentId].push(productData.id);
67
+ if (parentId !== productData.id && !relativesByBaseProductId[parentId].includes(parentId)) {
68
+ relativesByBaseProductId[parentId].push(parentId);
69
+ }
70
+ });
71
+ return relativesByBaseProductId;
72
+ });
73
+
74
+ /**
21
75
  * Returns relatives which are already fetched into a client app for given product id.
22
76
  * @param {Object} state Current state.
23
77
  * @param {string} productId Product id.
24
78
  * @returns {Array}
25
- */export var getKnownRelatives=createSelector(getProductById,getKnownProductRelatives,function(product,knownRelations){if(!product){return[];}var productData=product.productData;var parentId=productData.id;// Product is parent.
26
- if(productData.flags.hasVariants){parentId=productData.id;}else if(productData.baseProductId){parentId=productData.baseProductId;}return knownRelations[parentId]||[];});/**
79
+ */
80
+ export const getKnownRelatives = createSelector(getProductById, getKnownProductRelatives, (product, knownRelations) => {
81
+ if (!product) {
82
+ return [];
83
+ }
84
+ const {
85
+ productData
86
+ } = product;
87
+ let parentId = productData.id;
88
+ // Product is parent.
89
+ if (productData.flags.hasVariants) {
90
+ parentId = productData.id;
91
+ } else if (productData.baseProductId) {
92
+ parentId = productData.baseProductId;
93
+ }
94
+ return knownRelations[parentId] || [];
95
+ });
96
+
97
+ /**
27
98
  * Selector mappings for PWA < 6.0
28
99
  * @deprecated
29
- */export var getCurrentProductVariantId=getVariantProductId;export var hasCurrentProductVariants=hasBaseProductVariants;export var isProductChildrenSelected=isVariantSelected;export var getVariantsByProductId=getProductVariants;export var getCurrentBaseProductVariants=getProductVariants;
100
+ */
101
+ export const getCurrentProductVariantId = getVariantProductId;
102
+ export const hasCurrentProductVariants = hasBaseProductVariants;
103
+ export const isProductChildrenSelected = isVariantSelected;
104
+ export const getVariantsByProductId = getProductVariants;
105
+ export const getCurrentBaseProductVariants = getProductVariants;