@evershop/evershop 1.1.0 → 1.2.1

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 (391) hide show
  1. package/bin/build/index.js +24 -0
  2. package/bin/extension/index.js +2 -2
  3. package/bin/lib/addDefaultMiddlewareFuncs.js +7 -2
  4. package/bin/lib/buildEntry.js +20 -2
  5. package/bin/lib/onListening.js +7 -4
  6. package/bin/lib/startUp.js +6 -0
  7. package/package.json +9 -1
  8. package/src/components/admin/catalog/productEdit/category/CategoryItem.jsx +2 -7
  9. package/src/components/admin/catalog/productEdit/category/CategoryTree.jsx +14 -7
  10. package/src/components/admin/catalog/productEdit/category/CategoryTree.scss +10 -0
  11. package/src/components/admin/catalog/productEdit/variants/CreateVariant.jsx +2 -2
  12. package/src/components/admin/catalog/productEdit/variants/CreateVariantGroup.jsx +1 -1
  13. package/src/components/admin/catalog/productEdit/variants/EditVariant.jsx +1 -1
  14. package/src/components/admin/catalog/productEdit/variants/New.jsx +2 -2
  15. package/src/components/admin/catalog/productEdit/variants/Search.jsx +1 -1
  16. package/src/components/admin/catalog/productEdit/variants/SearchModal.jsx +1 -1
  17. package/src/components/admin/catalog/productEdit/variants/VariantModal.jsx +6 -6
  18. package/src/components/admin/catalog/productGrid/rows/ThumbnailRow.jsx +1 -1
  19. package/src/components/admin/checkout/shippingSetting/Method.jsx +6 -6
  20. package/src/components/admin/checkout/shippingSetting/MethodForm.jsx +4 -4
  21. package/src/components/admin/checkout/shippingSetting/Methods.jsx +3 -3
  22. package/src/components/admin/checkout/shippingSetting/PriceBasedPrice.jsx +2 -2
  23. package/src/components/admin/checkout/shippingSetting/WeightBasedPrice.jsx +2 -2
  24. package/src/components/admin/checkout/shippingSetting/Zone.jsx +7 -7
  25. package/src/components/admin/checkout/shippingSetting/ZoneForm.jsx +1 -1
  26. package/src/components/admin/cms/Card.jsx +3 -3
  27. package/src/components/admin/cms/PageHeading.jsx +3 -3
  28. package/src/components/admin/cms/widget/WidgetTypes.jsx +28 -0
  29. package/src/components/admin/cms/widget/grid/WidgetTypeRow.jsx +29 -0
  30. package/src/components/admin/oms/orderEdit/items/ItemVariantOptions.jsx +1 -1
  31. package/src/components/admin/oms/orderEdit/items/Name.jsx +1 -1
  32. package/src/components/admin/oms/orderGrid/headers/OrderDateColumnHeader.jsx +1 -1
  33. package/src/components/admin/promotion/couponEdit/AttributeGroupSelector.jsx +3 -3
  34. package/src/components/admin/promotion/couponEdit/BuyXGetY.jsx +2 -2
  35. package/src/components/admin/promotion/couponEdit/CategorySelector.jsx +6 -6
  36. package/src/components/admin/promotion/couponEdit/CollectionSelector.jsx +3 -3
  37. package/src/components/admin/promotion/couponEdit/ProductSkuSelector.jsx +4 -4
  38. package/src/components/admin/promotion/couponEdit/RequireProducts.jsx +2 -2
  39. package/src/components/admin/promotion/couponEdit/Setting.jsx +1 -1
  40. package/src/components/admin/promotion/couponEdit/TargetProducts.jsx +4 -4
  41. package/src/components/admin/tax/taxSetting/Rate.jsx +6 -6
  42. package/src/components/admin/tax/taxSetting/RateForm.jsx +5 -5
  43. package/src/components/admin/tax/taxSetting/Rates.jsx +6 -6
  44. package/src/components/admin/tax/taxSetting/TaxClass.jsx +3 -3
  45. package/src/components/admin/tax/taxSetting/TaxClassForm.jsx +1 -1
  46. package/src/components/admin/widgets/BasicMenuSetting.jsx +614 -0
  47. package/src/components/admin/widgets/BasicMenuSetting.scss +19 -0
  48. package/src/components/admin/widgets/CollectionProductsSetting.jsx +203 -0
  49. package/src/components/admin/widgets/TextBlockSetting.jsx +70 -0
  50. package/src/components/common/Area.jsx +31 -8
  51. package/src/components/common/Badge.jsx +1 -1
  52. package/src/components/common/Editor.jsx +193 -0
  53. package/src/components/common/Notification.scss +1 -0
  54. package/src/components/common/SimplePagination.jsx +2 -2
  55. package/src/components/common/form/Form.jsx +1 -1
  56. package/src/components/common/form/fields/Checkbox.jsx +1 -1
  57. package/src/components/common/form/fields/Ckeditor.jsx +11 -11
  58. package/src/components/common/form/fields/Editor.jsx +326 -0
  59. package/src/components/common/form/fields/Editor.scss +33 -0
  60. package/src/components/common/form/fields/Radio.jsx +1 -1
  61. package/src/components/common/form/fields/editor/FileBrowser.jsx +419 -0
  62. package/src/components/common/form/fields/editor/FileBrowser.scss +37 -0
  63. package/src/components/common/form/fields/editor/GetColumnClasses.jsx +14 -0
  64. package/src/components/common/form/fields/editor/GetRowClasses.jsx +18 -0
  65. package/src/components/common/form/fields/editor/RowTemplates.jsx +154 -0
  66. package/src/components/common/grid/Pagination.jsx +4 -4
  67. package/src/components/common/grid/headers/FromTo.jsx +1 -1
  68. package/src/components/common/grid/headers/Sortable.jsx +1 -1
  69. package/src/components/common/grid/rows/ThumbnailRow.jsx +1 -1
  70. package/src/components/common/list/Filter.jsx +1 -1
  71. package/src/components/common/modal/Alert.jsx +1 -1
  72. package/src/components/common/modal/Modal.jsx +1 -1
  73. package/src/components/frontStore/catalog/categoryView/filter/AttributeFilter.jsx +2 -2
  74. package/src/components/frontStore/catalog/categoryView/filter/CategoryFilter.jsx +3 -2
  75. package/src/components/frontStore/catalog/categoryView/filter/CategoryFilter.scss +5 -0
  76. package/src/components/frontStore/catalog/product/list/List.jsx +4 -4
  77. package/src/components/frontStore/catalog/product/list/Pagination.jsx +1 -1
  78. package/src/components/frontStore/catalog/product/list/Sorting.jsx +2 -2
  79. package/src/components/frontStore/catalog/product/list/item/Name.jsx +1 -1
  80. package/src/components/frontStore/checkout/cart/Empty.jsx +3 -3
  81. package/src/components/frontStore/checkout/cart/items/ItemOptions.jsx +1 -1
  82. package/src/components/frontStore/checkout/cart/items/ItemVariantOptions.jsx +1 -1
  83. package/src/components/frontStore/checkout/cart/items/Items.jsx +20 -21
  84. package/src/components/frontStore/checkout/cart/items/Items.scss +47 -0
  85. package/src/components/frontStore/checkout/cart/items/Quantity.jsx +154 -0
  86. package/src/components/frontStore/checkout/checkout/StepTitle.jsx +1 -1
  87. package/src/components/frontStore/checkout/checkout/payment/paymentStep/StepContent.jsx +5 -5
  88. package/src/components/frontStore/checkout/checkout/shipment/StepContent.jsx +1 -1
  89. package/src/components/frontStore/checkout/checkout/summary/Cart.jsx +10 -12
  90. package/src/components/frontStore/checkout/checkout/summary/Items.jsx +9 -9
  91. package/src/components/frontStore/checkout/checkout/summary/cart/Total.jsx +6 -6
  92. package/src/components/frontStore/checkout/success/summary/items/ItemOptions.jsx +1 -1
  93. package/src/components/frontStore/checkout/success/summary/items/Items.jsx +9 -6
  94. package/src/components/frontStore/checkout/success/summary/order/OrderSummary.jsx +9 -13
  95. package/src/components/frontStore/checkout/success/summary/order/Total.jsx +5 -5
  96. package/src/components/frontStore/customer/address/addressForm/AddressFormLoadingSkeleton.jsx +2 -2
  97. package/src/components/frontStore/customer/address/addressForm/NameAndTelephone.jsx +1 -1
  98. package/src/components/frontStore/customer/address/addressForm/ProvinceAndPostcode.jsx +1 -1
  99. package/src/components/frontStore/customer/checkout/Edit.jsx +2 -2
  100. package/src/components/frontStore/customer/detail/Order.jsx +4 -4
  101. package/src/components/frontStore/stripe/checkout/CheckoutForm.jsx +2 -2
  102. package/src/components/frontStore/stripe/checkout/TestCards.jsx +1 -1
  103. package/src/components/frontStore/widgets/BasicMenu.jsx +129 -0
  104. package/src/{modules/catalog/pages/frontStore/homepage/FeaturedProducts.jsx → components/frontStore/widgets/CollectionProducts.jsx} +40 -32
  105. package/src/components/frontStore/widgets/TextBlock.jsx +46 -0
  106. package/src/lib/componee/getComponentsByRoute.js +15 -2
  107. package/src/lib/event/event-manager.js +1 -1
  108. package/src/lib/middleware/tests/app/modules/404page/pages/frontStore/product/route.json +2 -1
  109. package/src/lib/middlewares/static.js +3 -1
  110. package/src/lib/response/render.js +5 -6
  111. package/src/lib/router/Router.js +1 -1
  112. package/src/lib/router/loadModuleRoutes.js +3 -0
  113. package/src/lib/router/registerAdminRoute.js +9 -1
  114. package/src/lib/router/registerFrontStoreRoute.js +2 -0
  115. package/src/lib/router/scanForRoutes.js +1 -0
  116. package/src/lib/router/tests/unit/unit.validateRoute.test.js +7 -1
  117. package/src/lib/util/defaultPaginationFilters.js +19 -17
  118. package/src/lib/util/getEnabledWidgets.js +34 -0
  119. package/src/lib/util/merge.js +67 -14
  120. package/src/lib/util/tests/unit/util.merge.test.js +21 -4
  121. package/src/lib/util/validateConfiguration.js +83 -0
  122. package/src/lib/webpack/createBaseConfig.js +4 -1
  123. package/src/lib/webpack/dev/createConfigClient.js +10 -2
  124. package/src/lib/webpack/loaders/AreaLoader.js +16 -6
  125. package/src/lib/webpack/util/keyGenerator.js +9 -0
  126. package/src/lib/webpack/util/parseGraphql.js +30 -16
  127. package/src/lib/webpack/util/parseGraphqlByFile.js +16 -2
  128. package/src/modules/auth/pages/admin/adminLogin/LoginForm.jsx +54 -21
  129. package/src/modules/auth/pages/admin/all/AdminUser.jsx +3 -3
  130. package/src/modules/base/bootstrap.js +79 -0
  131. package/src/modules/base/graphql/types/Route/Route.admin.graphql +15 -0
  132. package/src/modules/base/graphql/types/Route/Route.admin.resolvers.js +10 -0
  133. package/src/modules/base/pages/global/response[errorHandler].js +25 -1
  134. package/src/modules/catalog/bootstrap.js +125 -5
  135. package/src/modules/catalog/graphql/types/Category/Category.graphql +4 -3
  136. package/src/modules/catalog/graphql/types/Category/Category.resolvers.js +34 -0
  137. package/src/modules/catalog/graphql/types/Collection/Collection.graphql +2 -2
  138. package/src/modules/catalog/graphql/types/Collection/Collection.resolvers.js +34 -0
  139. package/src/modules/catalog/graphql/types/Product/Attribute/ProductAttribute.resolvers.js +1 -0
  140. package/src/modules/catalog/graphql/types/Product/Product.graphql +1 -1
  141. package/src/modules/catalog/graphql/types/Product/Product.resolvers.js +34 -0
  142. package/src/modules/catalog/graphql/types/Widget/CollectionProductsWidget/CollectionProductsWidget.graphql +11 -0
  143. package/src/modules/catalog/graphql/types/Widget/CollectionProductsWidget/CollectionProductsWidget.resolvers.js +8 -0
  144. package/src/modules/catalog/migration/Version-1.0.0.js +1 -0
  145. package/src/modules/catalog/migration/Version-1.0.7.js +10 -0
  146. package/src/modules/catalog/pages/admin/attributeEdit+attributeNew/FormContent.jsx +4 -4
  147. package/src/modules/catalog/pages/admin/attributeEdit+attributeNew/General.jsx +5 -5
  148. package/src/modules/catalog/pages/admin/attributeGrid/Grid.jsx +2 -2
  149. package/src/modules/catalog/pages/admin/categoryEdit/Products.jsx +4 -4
  150. package/src/modules/catalog/pages/admin/categoryEdit+categoryNew/FormContent.jsx +4 -4
  151. package/src/modules/catalog/pages/admin/categoryEdit+categoryNew/General.jsx +16 -18
  152. package/src/modules/catalog/pages/admin/categoryEdit+categoryNew/Image.jsx +1 -2
  153. package/src/modules/catalog/pages/admin/categoryEdit+categoryNew/Status.jsx +16 -1
  154. package/src/modules/catalog/pages/admin/categoryGrid/Grid.jsx +3 -3
  155. package/src/modules/catalog/pages/admin/collectionEdit/Products.jsx +4 -4
  156. package/src/modules/catalog/pages/admin/collectionEdit+collectionNew/FormContent.jsx +2 -2
  157. package/src/modules/catalog/pages/admin/collectionEdit+collectionNew/General.jsx +2 -2
  158. package/src/modules/catalog/pages/admin/collectionGrid/Grid.jsx +3 -3
  159. package/src/modules/catalog/pages/admin/productEdit/Collection.jsx +7 -7
  160. package/src/modules/catalog/pages/admin/productEdit+productNew/Attributes.jsx +8 -3
  161. package/src/modules/catalog/pages/admin/productEdit+productNew/CustomOptions.jsss +4 -4
  162. package/src/modules/catalog/pages/admin/productEdit+productNew/FormContent.jsx +4 -4
  163. package/src/modules/catalog/pages/admin/productEdit+productNew/General.jsx +15 -17
  164. package/src/modules/catalog/pages/admin/productGrid/Grid.jsx +3 -3
  165. package/src/modules/catalog/pages/frontStore/catalogSearch/General.jsx +2 -2
  166. package/src/modules/catalog/pages/frontStore/catalogSearch/Products.jsx +1 -1
  167. package/src/modules/catalog/pages/frontStore/catalogSearch/route.json +2 -1
  168. package/src/modules/catalog/pages/frontStore/categoryView/CategoryView.jsx +19 -2
  169. package/src/modules/catalog/pages/frontStore/categoryView/Filter.scss +1 -0
  170. package/src/modules/catalog/pages/frontStore/categoryView/General.jsx +6 -8
  171. package/src/modules/catalog/pages/frontStore/categoryView/General.scss +0 -2
  172. package/src/modules/catalog/pages/frontStore/categoryView/Pagination.jsx +6 -0
  173. package/src/modules/catalog/pages/frontStore/categoryView/Products.jsx +8 -1
  174. package/src/modules/catalog/pages/frontStore/categoryView/route.json +2 -1
  175. package/src/modules/catalog/pages/frontStore/productView/Description.jsx +15 -4
  176. package/src/modules/catalog/pages/frontStore/productView/Form.jsx +4 -4
  177. package/src/modules/catalog/pages/frontStore/productView/Form.scss +1 -0
  178. package/src/modules/catalog/pages/frontStore/productView/GeneralInfo.jsx +1 -1
  179. package/src/modules/catalog/pages/frontStore/productView/Images.jsx +1 -1
  180. package/src/modules/catalog/pages/frontStore/productView/Layout.jsx +1 -1
  181. package/src/modules/catalog/pages/frontStore/productView/Options.jsx +7 -3
  182. package/src/modules/catalog/pages/frontStore/productView/Variants.jsx +6 -6
  183. package/src/modules/catalog/pages/frontStore/productView/route.json +2 -1
  184. package/src/modules/catalog/services/AttributeCollection.js +10 -10
  185. package/src/modules/catalog/services/AttributeGroupCollection.js +10 -10
  186. package/src/modules/catalog/services/CategoryCollection.js +10 -10
  187. package/src/modules/catalog/services/CollectionCollection.js +10 -10
  188. package/src/modules/catalog/services/registerCartItemProductUrlField.js +35 -0
  189. package/src/modules/catalog/services/registerCartItemVariantOptionsField.js +51 -0
  190. package/src/modules/catalog/services/registerDefaultCategoryCollectionFilters.js +16 -0
  191. package/src/modules/checkout/api/addShippingNote/[context]bodyParser[auth].js +5 -0
  192. package/src/modules/checkout/api/addShippingNote/payloadSchema.json +15 -0
  193. package/src/modules/checkout/api/addShippingNote/route.json +5 -0
  194. package/src/modules/checkout/api/addShippingNote/saveShippingNote.js +50 -0
  195. package/src/modules/checkout/api/createCart/createNewCart.js +28 -3
  196. package/src/modules/checkout/api/updateCartItemQty/[bodyParser]updateQty.js +49 -0
  197. package/src/modules/checkout/api/updateCartItemQty/[context]bodyParser[auth].js +5 -0
  198. package/src/modules/checkout/api/updateCartItemQty/payloadSchema.json +21 -0
  199. package/src/modules/checkout/api/updateCartItemQty/route.json +5 -0
  200. package/src/modules/checkout/api/updateMineCartItemQty/[context]bodyParser[auth].js +5 -0
  201. package/src/modules/checkout/api/updateMineCartItemQty/[detectCurrentCart]updateQty.js +51 -0
  202. package/src/modules/checkout/api/updateMineCartItemQty/[getCurrentCustomer]detectCurrentCart.js +32 -0
  203. package/src/modules/checkout/api/updateMineCartItemQty/payloadSchema.json +21 -0
  204. package/src/modules/checkout/api/updateMineCartItemQty/route.json +5 -0
  205. package/src/modules/checkout/bootstrap.js +27 -0
  206. package/src/modules/checkout/graphql/types/Cart/Cart.graphql +22 -3
  207. package/src/modules/checkout/graphql/types/Cart/Cart.resolvers.js +18 -2
  208. package/src/modules/checkout/graphql/types/CheckoutSetting/CheckoutSetting.graphql +3 -0
  209. package/src/modules/checkout/graphql/types/CheckoutSetting/CheckoutSetting.resolvers.js +7 -0
  210. package/src/modules/checkout/migration/Version-1.0.0.js +14 -0
  211. package/src/modules/checkout/migration/Version-1.0.6.js +201 -0
  212. package/src/modules/checkout/pages/admin/shippingSetting/ShippingSetting.jsx +2 -2
  213. package/src/modules/checkout/pages/frontStore/all/[context]detectCurrentCart[auth].js +5 -0
  214. package/src/modules/checkout/pages/frontStore/cart/ShoppingCart.jsx +20 -12
  215. package/src/modules/checkout/pages/frontStore/cart/Summary.jsx +34 -23
  216. package/src/modules/checkout/pages/frontStore/cart/route.json +2 -1
  217. package/src/modules/checkout/pages/frontStore/checkout/Checkout.jsx +5 -5
  218. package/src/modules/checkout/pages/frontStore/checkout/Checkout.scss +4 -0
  219. package/src/modules/checkout/pages/frontStore/checkout/ShippingMethods.jsx +2 -2
  220. package/src/modules/checkout/pages/frontStore/checkout/ShippingNote.jsx +105 -0
  221. package/src/modules/checkout/pages/frontStore/checkout/Summary.jsx +14 -14
  222. package/src/modules/checkout/pages/frontStore/checkout/SummaryMobile.jsx +12 -15
  223. package/src/modules/checkout/pages/frontStore/checkout/route.json +2 -1
  224. package/src/modules/checkout/pages/frontStore/checkoutSuccess/CheckoutSuccess.jsx +1 -1
  225. package/src/modules/checkout/pages/frontStore/checkoutSuccess/CheckoutSuccess.scss +4 -0
  226. package/src/modules/checkout/pages/frontStore/checkoutSuccess/CustomerInfo.jsx +30 -32
  227. package/src/modules/checkout/pages/frontStore/checkoutSuccess/ShippingNote.jsx +47 -0
  228. package/src/modules/checkout/pages/frontStore/checkoutSuccess/Summary.jsx +12 -15
  229. package/src/modules/checkout/pages/frontStore/checkoutSuccess/route.json +2 -1
  230. package/src/modules/checkout/services/cart/Cart.js +31 -27
  231. package/src/modules/checkout/services/cart/registerCartBaseFields.js +133 -41
  232. package/src/modules/checkout/services/cart/registerCartItemBaseFields.js +300 -374
  233. package/src/modules/checkout/services/toPrice.js +1 -1
  234. package/src/modules/checkout/tests/basicSetup.js +85 -0
  235. package/src/modules/checkout/tests/coupons.js +82 -0
  236. package/src/modules/checkout/tests/products.js +67 -0
  237. package/src/modules/checkout/tests/taxRates.js +3 -0
  238. package/src/modules/checkout/tests/unit/discountAmount.test.js +60 -0
  239. package/src/modules/checkout/tests/unit/grandTotal.test.js +83 -0
  240. package/src/modules/checkout/tests/unit/lineTotal.test.js +92 -0
  241. package/src/modules/checkout/tests/unit/lineTotalWithDiscount.test.js +103 -0
  242. package/src/modules/checkout/tests/unit/productPrice.test.js +69 -0
  243. package/src/modules/checkout/tests/unit/subTotal.test.js +85 -0
  244. package/src/modules/checkout/tests/unit/subTotalWithDiscount.test.js +117 -0
  245. package/src/modules/checkout/tests/unit/taxAmount.test.js +68 -0
  246. package/src/modules/checkout/tests/unit/taxAmountRounding.test.js +277 -0
  247. package/src/modules/cms/api/createWidget/[context]bodyParser[auth].js +5 -0
  248. package/src/modules/cms/api/createWidget/createWidget[finish].js +17 -0
  249. package/src/modules/cms/api/createWidget/finish[apiResponse].js +27 -0
  250. package/src/modules/cms/api/createWidget/payloadSchema.json +18 -0
  251. package/src/modules/cms/api/createWidget/route.json +5 -0
  252. package/src/modules/cms/api/deleteWidget/deleteWidget.js +27 -0
  253. package/src/modules/cms/api/deleteWidget/route.json +5 -0
  254. package/src/modules/cms/api/updateWidget/[context]bodyParser[auth].js +5 -0
  255. package/src/modules/cms/api/updateWidget/finish[apiResponse].js +27 -0
  256. package/src/modules/cms/api/updateWidget/payloadSchema.json +18 -0
  257. package/src/modules/cms/api/updateWidget/route.json +5 -0
  258. package/src/modules/cms/api/updateWidget/updateWidget[finish].js +17 -0
  259. package/src/modules/cms/bootstrap.js +223 -3
  260. package/src/modules/cms/graphql/types/CmsPage/CmsPage.graphql +1 -2
  261. package/src/modules/cms/graphql/types/CmsPage/CmsPage.resolvers.js +35 -1
  262. package/src/modules/cms/graphql/types/Widget/Widget.graphql +91 -0
  263. package/src/modules/cms/graphql/types/Widget/Widget.resolvers.js +142 -0
  264. package/src/modules/cms/migration/Version-1.1.0.js +22 -0
  265. package/src/modules/cms/migration/Version-1.1.1.js +103 -0
  266. package/src/modules/cms/pages/admin/adminNotFound/NotFound.jsx +4 -4
  267. package/src/modules/cms/pages/admin/all/CmsMenuGroup.jsx +12 -4
  268. package/src/modules/cms/pages/admin/all/Notification.scss +1 -1
  269. package/src/modules/cms/pages/admin/all/search/NoResult.jsx +2 -2
  270. package/src/modules/cms/pages/admin/all/search/Results.jsx +3 -3
  271. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/FormContent.jsx +7 -9
  272. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/General.jsx +3 -3
  273. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/Seo.jsx +1 -1
  274. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/Status.jsx +40 -0
  275. package/src/modules/cms/pages/admin/cmsPageGrid/Grid.jsx +3 -4
  276. package/src/modules/cms/pages/admin/dashboard/Layout.jsx +3 -3
  277. package/src/modules/cms/pages/admin/widgetEdit/WidgetForm.jsx +52 -0
  278. package/src/modules/cms/pages/admin/widgetEdit/index.js +36 -0
  279. package/src/modules/cms/pages/admin/widgetEdit/route.json +4 -0
  280. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/FormContent.jsx +69 -0
  281. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/FormContent.scss +7 -0
  282. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/General.jsx +185 -0
  283. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/PageHeading.jsx +37 -0
  284. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/Setting.jsx +55 -0
  285. package/src/modules/cms/pages/admin/widgetGrid/Grid.jsx +415 -0
  286. package/src/modules/cms/pages/admin/widgetGrid/Heading.jsx +11 -0
  287. package/src/modules/cms/pages/admin/widgetGrid/NewWidgetButton.jsx +52 -0
  288. package/src/modules/cms/pages/admin/widgetGrid/index.js +15 -0
  289. package/src/modules/cms/pages/admin/widgetGrid/route.json +4 -0
  290. package/src/modules/cms/pages/admin/widgetNew/WidgetNewForm.jsx +60 -0
  291. package/src/modules/cms/pages/admin/widgetNew/index.js +11 -0
  292. package/src/modules/cms/pages/admin/widgetNew/route.json +4 -0
  293. package/src/modules/cms/pages/admin/widgetNew/typeValidate.js +21 -0
  294. package/src/modules/cms/pages/frontStore/all/Breadcrumb.jsx +1 -1
  295. package/src/modules/cms/pages/frontStore/all/Footer.jsx +2 -2
  296. package/src/modules/cms/pages/frontStore/all/Layout.jsx +3 -3
  297. package/src/modules/cms/pages/frontStore/all/Layout.scss +13 -0
  298. package/src/modules/cms/pages/frontStore/all/Logo.jsx +2 -2
  299. package/src/modules/cms/pages/frontStore/all/Logo.scss +2 -4
  300. package/src/modules/cms/pages/frontStore/all/Notification.scss +1 -1
  301. package/src/modules/cms/pages/frontStore/cmsPageView/Layout.jsx +2 -2
  302. package/src/modules/cms/pages/frontStore/cmsPageView/View.jsx +5 -3
  303. package/src/modules/cms/pages/frontStore/cmsPageView/index.js +6 -12
  304. package/src/modules/cms/pages/frontStore/cmsPageView/route.json +2 -1
  305. package/src/modules/cms/pages/frontStore/homepage/route.json +2 -1
  306. package/src/modules/cms/pages/frontStore/notFound/NotFound.jsx +4 -4
  307. package/src/modules/cms/pages/frontStore/notFound/route.json +2 -1
  308. package/src/modules/cms/pages/frontStore/staticAsset/[context]staticAssets[auth].js +1 -1
  309. package/src/modules/cms/services/CMSPageCollection.js +10 -10
  310. package/src/modules/cms/services/WidgetCollection.js +62 -0
  311. package/src/modules/cms/services/getWidgetsBaseQuery.js +7 -0
  312. package/src/modules/cms/services/page/createPage.js +1 -2
  313. package/src/modules/cms/services/page/pageDataSchema.json +0 -4
  314. package/src/modules/cms/services/registerDefaultWidgetCollectionFilters.js +62 -0
  315. package/src/modules/cms/services/tailwind.admin.config.js +22 -107
  316. package/src/modules/cms/services/tailwind.frontStore.config.js +23 -108
  317. package/src/modules/cms/services/widget/createWidget.js +73 -0
  318. package/src/modules/cms/services/widget/deleteWidget.js +49 -0
  319. package/src/modules/cms/services/widget/loadWidgetInstances.js +54 -0
  320. package/src/modules/cms/services/widget/updateWidget.js +86 -0
  321. package/src/modules/cms/services/widget/widgetDataSchema.json +29 -0
  322. package/src/modules/cod/pages/admin/paymentSetting/CODSetting.jsx +2 -2
  323. package/src/modules/cod/pages/frontStore/checkout/CashOnDelivery.jsx +1 -1
  324. package/src/modules/customer/bootstrap.js +21 -4
  325. package/src/modules/customer/pages/admin/customerEdit/CustomerEditForm.jsx +3 -3
  326. package/src/modules/customer/pages/admin/customerEdit+customerNew/OrderHistory.jsx +1 -1
  327. package/src/modules/customer/pages/admin/customerGrid/Grid.jsx +3 -3
  328. package/src/modules/customer/pages/frontStore/account/AccountDetails.jsx +3 -3
  329. package/src/modules/customer/pages/frontStore/account/Layout.jsx +3 -3
  330. package/src/modules/customer/pages/frontStore/account/OrderHistory.jsx +1 -1
  331. package/src/modules/customer/pages/frontStore/account/route.json +2 -1
  332. package/src/modules/customer/pages/frontStore/login/LoginForm.jsx +2 -2
  333. package/src/modules/customer/pages/frontStore/login/route.json +2 -1
  334. package/src/modules/customer/pages/frontStore/register/RegisterForm.jsx +2 -2
  335. package/src/modules/customer/pages/frontStore/register/route.json +2 -1
  336. package/src/modules/customer/pages/frontStore/resetPasswordPage/ResetPasswordForm.jsx +2 -2
  337. package/src/modules/customer/pages/frontStore/resetPasswordPage/route.json +2 -1
  338. package/src/modules/customer/pages/frontStore/updatePasswordPage/UpdatePasswordForm.jsx +3 -3
  339. package/src/modules/customer/pages/frontStore/updatePasswordPage/route.json +2 -1
  340. package/src/modules/customer/services/CustomerCollection.js +10 -10
  341. package/src/modules/customer/services/CustomerGroupCollection.js +10 -10
  342. package/src/modules/graphql/pages/global/[bodyParser]buildQuery[graphql].js +241 -6
  343. package/src/modules/graphql/pages/global/[buildQuery]graphql[notification].js +12 -8
  344. package/src/modules/oms/bootstrap.js +87 -3
  345. package/src/modules/oms/graphql/types/Order/Order.graphql +11 -2
  346. package/src/modules/oms/graphql/types/Order/Order.resolvers.js +7 -1
  347. package/src/modules/oms/pages/admin/dashboard/Bestsellers.jsx +2 -2
  348. package/src/modules/oms/pages/admin/dashboard/Lifetimesales.jsx +5 -5
  349. package/src/modules/oms/pages/admin/orderEdit/AddTrackingButton.jsx +1 -1
  350. package/src/modules/oms/pages/admin/orderEdit/Items.jsx +7 -7
  351. package/src/modules/oms/pages/admin/orderEdit/Layout.jsx +3 -3
  352. package/src/modules/oms/pages/admin/orderEdit/Payment.jsx +6 -6
  353. package/src/modules/oms/pages/admin/orderEdit/ShipButton.jsx +1 -1
  354. package/src/modules/oms/pages/admin/orderGrid/Grid.jsx +3 -3
  355. package/src/modules/oms/services/OrderCollection.js +10 -10
  356. package/src/modules/paypal/api/paypalCreateOrder/[bodyParser]createOrder.js +55 -24
  357. package/src/modules/paypal/pages/admin/paymentSetting/PaypalSetting.jsx +6 -6
  358. package/src/modules/paypal/pages/frontStore/checkout/Paypal.jsx +3 -4
  359. package/src/modules/promotion/bootstrap.js +19 -101
  360. package/src/modules/promotion/pages/admin/couponEdit+couponNew/DiscountType.jsx +1 -1
  361. package/src/modules/promotion/pages/admin/couponEdit+couponNew/FormContent.jsx +5 -5
  362. package/src/modules/promotion/pages/admin/couponGrid/Grid.jsx +3 -3
  363. package/src/modules/promotion/pages/frontStore/cart/Coupon.jsx +2 -2
  364. package/src/modules/promotion/services/CouponCollection.js +10 -10
  365. package/src/modules/promotion/services/couponValidator.js +4 -7
  366. package/src/modules/promotion/services/discountCalculator.js +2 -7
  367. package/src/modules/promotion/services/registerCartItemPromotionFields.js +80 -0
  368. package/src/modules/promotion/services/registerCartPromotionFields.js +128 -0
  369. package/src/modules/promotion/services/registerDefaultCalculators.js +48 -20
  370. package/src/modules/promotion/services/registerDefaultValidators.js +16 -4
  371. package/src/modules/setting/pages/admin/paymentSetting/PaymentSetting.jsx +2 -2
  372. package/src/modules/setting/pages/admin/storeSetting/StoreSetting.jsx +98 -35
  373. package/src/modules/stripe/pages/admin/paymentSetting/StripePayment.jsx +5 -5
  374. package/src/modules/stripe/pages/frontStore/checkout/Stripe.jsx +1 -1
  375. package/src/modules/tax/bootstrap.js +40 -5
  376. package/src/modules/tax/graphql/types/Product/Price/ProductPrice.resolvers.js +6 -39
  377. package/src/modules/tax/graphql/types/TaxSetting/TaxSetting.graphql +1 -2
  378. package/src/modules/tax/graphql/types/TaxSetting/TaxSetting.resolvers.js +1 -8
  379. package/src/modules/tax/pages/admin/taxSetting/TaxSetting.jsx +4 -4
  380. package/src/modules/tax/services/TaxClassCollection.js +10 -10
  381. package/src/modules/tax/services/calculateTaxAmount.js +12 -9
  382. package/src/modules/tax/services/registerCartItemTaxPercentField.js +76 -0
  383. package/src/modules/auth/services/adminSessionMiddleware.js +0 -0
  384. package/src/modules/catalog/pages/frontStore/homepage/FeaturedCategories.jsx +0 -58
  385. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/StatusAndLayout.jsx +0 -61
  386. package/src/modules/cms/pages/frontStore/all/Menu.jsx +0 -46
  387. package/src/modules/cms/pages/frontStore/all/Menu.scss +0 -7
  388. package/src/modules/cms/pages/frontStore/all/MobileMenu.jsx +0 -73
  389. package/src/modules/cms/pages/frontStore/all/MobileMenu.scss +0 -35
  390. package/src/modules/cms/pages/frontStore/homepage/MainBanner.jsx +0 -31
  391. package/src/modules/cms/pages/frontStore/homepage/MainBanner.scss +0 -48
@@ -85,7 +85,7 @@ function Actions({ customers = [], selectedIds = [] }) {
85
85
  {selectedIds.length > 0 && (
86
86
  <td style={{ borderTop: 0 }} colSpan="100">
87
87
  <div className="inline-flex border border-divider rounded justify-items-start">
88
- <a href="#" className="font-semibold pt-075 pb-075 pl-15 pr-15">
88
+ <a href="#" className="font-semibold pt-3 pb-3 pl-6 pr-6">
89
89
  {selectedIds.length} selected
90
90
  </a>
91
91
  {actions.map((action) => (
@@ -95,7 +95,7 @@ function Actions({ customers = [], selectedIds = [] }) {
95
95
  e.preventDefault();
96
96
  action.onAction();
97
97
  }}
98
- className="font-semibold pt-075 pb-075 pl-15 pr-15 block border-l border-divider self-center"
98
+ className="font-semibold pt-3 pb-3 pl-6 pr-6 block border-l border-divider self-center"
99
99
  >
100
100
  <span>{action.name}</span>
101
101
  </a>
@@ -133,7 +133,7 @@ export default function CustomerGrid({
133
133
  <Card.Session
134
134
  title={
135
135
  <Form submitBtn={false}>
136
- <div className="flex gap-2 justify-center items-center">
136
+ <div className="flex gap-8 justify-center items-center">
137
137
  <Area
138
138
  id="customerGridFilter"
139
139
  noOuter
@@ -7,14 +7,14 @@ export default function AccountDetails({ account }) {
7
7
  return (
8
8
  <div className="account-details">
9
9
  <div className="account-details-inner">
10
- <div className="grid grid-cols-1 gap-1">
11
- <div className="account-details-name flex gap-1">
10
+ <div className="grid grid-cols-1 gap-4">
11
+ <div className="account-details-name flex gap-4">
12
12
  <div>
13
13
  <User width={20} height={20} />
14
14
  </div>
15
15
  <div>{account.fullName}</div>
16
16
  </div>
17
- <div className="account-details-email flex gap-1">
17
+ <div className="account-details-email flex gap-4">
18
18
  <div>
19
19
  <EmailIcon width={20} height={20} />
20
20
  </div>
@@ -20,15 +20,15 @@ export default function Layout({ logoutUrl }) {
20
20
  return (
21
21
  <div>
22
22
  <h1 className="text-center">{_('My Account')}</h1>
23
- <div className="page-width mt-3 grid grid-cols-1 md:grid-cols-3 gap-3">
23
+ <div className="page-width mt-12 grid grid-cols-1 md:grid-cols-3 gap-12">
24
24
  <div className="col-span-1 md:col-span-2">
25
- <div className="border-b mb-1 border-textSubdued">
25
+ <div className="border-b mb-4 border-textSubdued">
26
26
  <h2>{_('Order History')}</h2>
27
27
  </div>
28
28
  <Area id="accountPageLeft" noOuter />
29
29
  </div>
30
30
  <div className="col-span-1">
31
- <div className="border-b mb-1 flex justify-between items-center border-textSubdued">
31
+ <div className="border-b mb-4 flex justify-between items-center border-textSubdued">
32
32
  <h2>{_('Account Details')}</h2>
33
33
  <a className="text-interactive" href="#" onClick={(e) => logout(e)}>
34
34
  {_('Logout')}
@@ -12,7 +12,7 @@ export default function OrderHistory({ customer: { orders = [] } }) {
12
12
  </div>
13
13
  )}
14
14
  {orders.map((order) => (
15
- <div className="order-history-order border-divider py-2">
15
+ <div className="order-history-order border-divider py-8">
16
16
  <Order order={order} key={order.orderId} />
17
17
  </div>
18
18
  ))}
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "methods": ["GET"],
3
- "path": "/account"
3
+ "path": "/account",
4
+ "name": "Account page"
4
5
  }
@@ -19,7 +19,7 @@ export default function LoginForm({
19
19
  <div className="login-form flex justify-center items-center">
20
20
  <div className="login-form-inner">
21
21
  <h1 className="text-center">{_('Login')}</h1>
22
- {error && <div className="text-critical mb-1">{error}</div>}
22
+ {error && <div className="text-critical mb-4">{error}</div>}
23
23
  <Form
24
24
  id="loginForm"
25
25
  action={action}
@@ -60,7 +60,7 @@ export default function LoginForm({
60
60
  ]}
61
61
  />
62
62
  </Form>
63
- <div className="text-center mt-1 gap-2 flex justify-center">
63
+ <div className="text-center mt-4 gap-8 flex justify-center">
64
64
  <a className="text-interactive" href={registerUrl}>
65
65
  {_('Create an account')}
66
66
  </a>
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "methods": ["GET"],
3
- "path": "/account/login"
3
+ "path": "/account/login",
4
+ "name": "Login page"
4
5
  }
@@ -16,7 +16,7 @@ export default function RegisterForm({ action, homeUrl, loginApi, loginUrl }) {
16
16
  <div className="register-form flex justify-center items-center">
17
17
  <div className="register-form-inner">
18
18
  <h1 className="text-center">{_('Create A New Account')}</h1>
19
- {error && <div className="text-critical mb-1">{error}</div>}
19
+ {error && <div className="text-critical mb-4">{error}</div>}
20
20
  <Form
21
21
  id="registerForm"
22
22
  action={action}
@@ -99,7 +99,7 @@ export default function RegisterForm({ action, homeUrl, loginApi, loginUrl }) {
99
99
  ]}
100
100
  />
101
101
  </Form>
102
- <div className="text-center mt-1">
102
+ <div className="text-center mt-4">
103
103
  <span>
104
104
  {_('Already have an account?')}
105
105
  <a className="text-interactive" href={loginUrl}>
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "methods": ["GET"],
3
- "path": "/account/register"
3
+ "path": "/account/register",
4
+ "name": "Register page"
4
5
  }
@@ -31,7 +31,7 @@ function ResetForm({ action, onSuccess }) {
31
31
  <div className="reset-password-form flex justify-center items-center">
32
32
  <div className="reset-password-form-inner">
33
33
  <h1 className="text-center">{_('Enter your email address')}</h1>
34
- {error && <div className="text-critical mb-1">{error}</div>}
34
+ {error && <div className="text-critical mb-4">{error}</div>}
35
35
  <Form
36
36
  id="resetPasswordForm"
37
37
  action={action}
@@ -58,7 +58,7 @@ function ResetForm({ action, onSuccess }) {
58
58
  placeholder={_('Email')}
59
59
  validationRules={['notEmpty', 'email']}
60
60
  />
61
- <div className="form-submit-button flex border-t border-divider mt-1 pt-1">
61
+ <div className="form-submit-button flex border-t border-divider mt-4 pt-4">
62
62
  <Button
63
63
  title={_('RESET PASSWORD')}
64
64
  type="submit"
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "methods": ["GET"],
3
- "path": "/account/reset-password"
3
+ "path": "/account/reset-password",
4
+ "name": "Reset password page"
4
5
  }
@@ -37,8 +37,8 @@ function UpdateForm({ action, onSuccess }) {
37
37
  <div className="flex justify-center items-center">
38
38
  <div className="update-password-form flex justify-center items-center">
39
39
  <div className="update-password-form-inner">
40
- <h2 className="text-center mb-2">{_('Enter your new password')}</h2>
41
- {error && <div className="text-critical mb-1">{error}</div>}
40
+ <h2 className="text-center mb-8">{_('Enter your new password')}</h2>
41
+ {error && <div className="text-critical mb-4">{error}</div>}
42
42
  <Form
43
43
  id="updatePasswordForm"
44
44
  action={action}
@@ -66,7 +66,7 @@ function UpdateForm({ action, onSuccess }) {
66
66
  validationRules={['notEmpty']}
67
67
  />
68
68
  <Field name="token" type="hidden" value={token} />
69
- <div className="form-submit-button flex border-t border-divider mt-1 pt-1">
69
+ <div className="form-submit-button flex border-t border-divider mt-4 pt-4">
70
70
  <Button
71
71
  title={_('UPDATE PASSWORD')}
72
72
  type="submit"
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "methods": ["GET"],
3
- "path": "/account/update-password"
3
+ "path": "/account/update-password",
4
+ "name": "Update password page"
4
5
  }
@@ -18,16 +18,16 @@ class CustomerCollection {
18
18
  );
19
19
 
20
20
  customerCollectionFilters.forEach((filter) => {
21
- const check = filters.find((f) => f.key === filter.key);
22
- if (check) {
23
- if (filter.operation.includes(check.operation)) {
24
- filter.callback(
25
- this.baseQuery,
26
- check.operation,
27
- check.value,
28
- currentFilters
29
- );
30
- }
21
+ const check = filters.find(
22
+ (f) => f.key === filter.key && filter.operation.includes(f.operation)
23
+ );
24
+ if (filter.key === '*' || check) {
25
+ filter.callback(
26
+ this.baseQuery,
27
+ check?.operation,
28
+ check?.value,
29
+ currentFilters
30
+ );
31
31
  }
32
32
  });
33
33
 
@@ -17,16 +17,16 @@ class CustomerGroupCollection {
17
17
  );
18
18
 
19
19
  customerGroupCollectionFilters.forEach((filter) => {
20
- const check = filters.find((f) => f.key === filter.key);
21
- if (check) {
22
- if (filter.operation.includes(check.operation)) {
23
- filter.callback(
24
- this.baseQuery,
25
- check.operation,
26
- check.value,
27
- currentFilters
28
- );
29
- }
20
+ const check = filters.find(
21
+ (f) => f.key === filter.key && filter.operation.includes(f.operation)
22
+ );
23
+ if (filter.key === '*' || check) {
24
+ filter.callback(
25
+ this.baseQuery,
26
+ check?.operation,
27
+ check?.value,
28
+ currentFilters
29
+ );
30
30
  }
31
31
  });
32
32
 
@@ -1,5 +1,6 @@
1
1
  const path = require('path');
2
2
  const JSON5 = require('json5');
3
+ const uniqid = require('uniqid');
3
4
  const { readFileSync } = require('fs');
4
5
  const isDevelopmentMode = require('@evershop/evershop/src/lib/util/isDevelopmentMode');
5
6
  const isProductionMode = require('@evershop/evershop/src/lib/util/isProductionMode');
@@ -9,10 +10,18 @@ const {
9
10
  const { CONSTANTS } = require('@evershop/evershop/src/lib/helpers');
10
11
  const { getRoutes } = require('@evershop/evershop/src/lib/router/Router');
11
12
  const { error } = require('@evershop/evershop/src/lib/log/logger');
13
+
14
+ const {
15
+ getEnabledWidgets
16
+ } = require('@evershop/evershop/src/lib/util/getEnabledWidgets');
17
+ const { get } = require('@evershop/evershop/src/lib/util/get');
18
+ const {
19
+ loadWidgetInstances
20
+ } = require('../../../cms/services/widget/loadWidgetInstances');
12
21
  // eslint-disable-next-line no-unused-vars
13
22
  const { getContextValue } = require('../../services/contextHelper');
14
23
 
15
- module.exports = (request, response) => {
24
+ module.exports = async (request, response, delegate, next) => {
16
25
  let query;
17
26
  if (isDevelopmentMode()) {
18
27
  let route;
@@ -28,7 +37,7 @@ module.exports = (request, response) => {
28
37
  }
29
38
  const devMiddleware = route.webpackMiddleware;
30
39
  const { outputFileSystem } = devMiddleware.context;
31
- const jsonWebpackStats = devMiddleware.context.stats.toJson();
40
+ const { jsonWebpackStats } = response.locals;
32
41
  const { outputPath } = jsonWebpackStats;
33
42
 
34
43
  query = outputFileSystem.readFileSync(
@@ -54,6 +63,8 @@ module.exports = (request, response) => {
54
63
  'utf8'
55
64
  );
56
65
  }
66
+ const widgetInstances = await loadWidgetInstances(request);
67
+ const enabledWidgets = getEnabledWidgets();
57
68
  if (query) {
58
69
  // Parse the query
59
70
  // Use regex to replace "getContextValue_'base64 encoded string'"
@@ -75,9 +86,232 @@ module.exports = (request, response) => {
75
86
  });
76
87
  try {
77
88
  const json = JSON5.parse(query);
78
- // Get all variables definition and build the operation name
79
- const variables = JSON5.parse(json.variables);
89
+ // We need to get the list of applicable widgets and remove all the queries and variable that are not used
90
+ let applicableWidgets = [];
91
+ const { currentRoute } = request;
92
+ if (
93
+ currentRoute?.isAdmin === false ||
94
+ ['widgetNew', 'widgetEdit'].includes(currentRoute?.id)
95
+ ) {
96
+ applicableWidgets = widgetInstances.map((widget) => {
97
+ const widgetSpecs = enabledWidgets.find(
98
+ (enabledWidget) => enabledWidget.type === widget.type
99
+ );
100
+ const componentPath = currentRoute?.isAdmin
101
+ ? widgetSpecs.setting_component
102
+ : widgetSpecs.component;
103
+ const componentKey = currentRoute?.isAdmin
104
+ ? widgetSpecs.settingComponentKey
105
+ : widgetSpecs.componentKey;
106
+ return {
107
+ uuid: widget.uuid,
108
+ type: widget.type,
109
+ settings: widget.settings,
110
+ component: componentPath,
111
+ componentKey
112
+ };
113
+ });
114
+ }
115
+
80
116
  let operation = 'query Query';
117
+ const { fragments } = json;
118
+ const { propsMap } = json;
119
+ let queryStr = '';
120
+ let variables;
121
+
122
+ if (applicableWidgets.length > 0) {
123
+ applicableWidgets.forEach((widget) => {
124
+ const widgetKey = widget.componentKey;
125
+ let widgetQuery = json.queries[widgetKey];
126
+ // Deep clone the widget variables
127
+ let widgetVariables = JSON.parse(
128
+ JSON.stringify(json.variables[widgetKey])
129
+ );
130
+ const regex = /\\"getWidgetSetting_([a-zA-Z0-9+/=]*)\\"/g;
131
+ widgetQuery = widgetQuery.replace(regex, (match, p1) => {
132
+ const base64 = p1;
133
+ const decoded = Buffer.from(base64, 'base64').toString('ascii');
134
+ // Accept max 2 arguments from the decoded string, the fist one is the path to the setting object (a.b.c) and the second one is the default value
135
+ // Get the actual value from the setting of the current widget
136
+ // eslint-disable-next-line
137
+ const path = decoded.split(',')[0];
138
+ const defaultValue = decoded.split(',')[1] || undefined;
139
+ let value = get(widget.settings, path, defaultValue);
140
+ // JSON sringify without adding double quotes to the property name
141
+ value = JSON5.stringify(value, { quote: '"' });
142
+ // Escape the value so we can insert it into the query
143
+ if (value) {
144
+ value = value.replace(/"/g, '\\"');
145
+ }
146
+ return value;
147
+ });
148
+ // Use regex to find if there is any variable inside the query by checking if there is any string started with `$variable_` and no special character after that. If there is a match, we will replace it with the another unique name to make it unique
149
+ const variableRegex = /\$variable_([a-zA-Z0-9]+)/g;
150
+ const variableMatch = widgetQuery.match(variableRegex);
151
+ const variableList = [];
152
+ if (variableMatch) {
153
+ widgetQuery = widgetQuery.replace(variableRegex, (match, p1) => {
154
+ const newId = `${uniqid()}`;
155
+ variableList.push({
156
+ origin: `variable_${p1}`,
157
+ new: `variable_${newId}`
158
+ });
159
+ // Check if p1 already exists in the variableList
160
+ // If it does, we will replace it with the newId
161
+ const test = variableList.find(
162
+ (variable) => variable.origin === `variable_${p1}`
163
+ );
164
+ if (test) {
165
+ return `$${test.new}`;
166
+ } else {
167
+ return `$variable_${newId}`;
168
+ }
169
+ });
170
+ }
171
+
172
+ // Now we need to process the widgetVariables.values and widgetVariables.defs
173
+ const widgetVariablesValues = Object.keys(
174
+ widgetVariables.values
175
+ ).reduce((acc, key) => {
176
+ const check = variableList.find(
177
+ (variable) => variable.origin === key
178
+ );
179
+ if (check) {
180
+ const variableRegex = /getWidgetSetting_([a-zA-Z0-9+/=]*)/g;
181
+ const v = widgetVariables.values[key];
182
+ if (typeof v === 'string') {
183
+ // A regext matching "getContextValue_'base64 encoded string'"
184
+ // Check if the value is a string and contains the getContextValue_ string
185
+ const variableMatch = v.match(variableRegex);
186
+ if (variableMatch) {
187
+ // Replace the getContextValue_ string with the actual function
188
+ const base64 = variableMatch[0].replace(
189
+ variableRegex,
190
+ (match, p1) => p1
191
+ );
192
+ const decoded = Buffer.from(base64, 'base64')
193
+ .toString('ascii')
194
+ .split(',')[0]
195
+ .replace(/['"]+/g, '');
196
+ // eslint-disable-next-line no-eval
197
+ let actualValue;
198
+ if (!decoded.trim()) {
199
+ actualValue = widget.settings;
200
+ } else {
201
+ actualValue = get(widget.settings, decoded);
202
+ }
203
+ acc[check.new] = actualValue;
204
+ }
205
+ } else {
206
+ acc[check.new] = v;
207
+ }
208
+ }
209
+ return acc;
210
+ }, {});
211
+ const widgetVariablesDefs = widgetVariables.defs.reduce(
212
+ (acc, variable) => {
213
+ const check = variableList.find(
214
+ (v) => v.origin === variable.alias
215
+ );
216
+ if (check) {
217
+ acc.push({
218
+ ...variable,
219
+ alias: check.new
220
+ });
221
+ } else {
222
+ acc.push(variable);
223
+ }
224
+ return acc;
225
+ },
226
+ []
227
+ );
228
+ widgetVariables = {
229
+ values: widgetVariablesValues,
230
+ defs: widgetVariablesDefs
231
+ };
232
+ const originPropsMap = propsMap[widgetKey]; // [{origin: 'real field name', alias: 'bbbb'}, {origin: 'real field name', alias: 'ccc'}]
233
+ const widgetUUID = `e${widget.uuid.replace(/-/g, '')}`;
234
+ propsMap[widgetUUID] = [];
235
+ originPropsMap.forEach((prop) => {
236
+ const newAlias = `e${uniqid()}`;
237
+ widgetQuery = widgetQuery.replace(prop.alias, newAlias);
238
+ propsMap[widgetUUID].push({
239
+ origin: prop.origin,
240
+ alias: newAlias
241
+ });
242
+ });
243
+ json.queries[widgetUUID] = widgetQuery;
244
+ json.variables[widgetUUID] = widgetVariables;
245
+ // Now we merge the queries to the query as the string,
246
+ queryStr = Object.keys(json.queries).reduce((acc, key) => {
247
+ if (
248
+ !enabledWidgets.find(
249
+ (widget) =>
250
+ widget.componentKey === key ||
251
+ widget.settingComponentKey === key
252
+ )
253
+ ) {
254
+ // eslint-disable-next-line no-param-reassign
255
+ acc += `\n${json.queries[key]} `;
256
+ }
257
+ return acc;
258
+ }, '');
259
+
260
+ // Now we merge the variables
261
+ variables = Object.keys(json.variables).reduce(
262
+ (acc, key) => {
263
+ if (
264
+ !enabledWidgets.find(
265
+ (widget) =>
266
+ widget.componentKey === key ||
267
+ widget.settingComponentKey === key
268
+ )
269
+ ) {
270
+ acc.values = { ...acc.values, ...json.variables[key].values };
271
+ acc.defs = [...acc.defs, ...json.variables[key].defs];
272
+ }
273
+ return acc;
274
+ },
275
+ { values: {}, defs: [] }
276
+ );
277
+ });
278
+ } else {
279
+ // Just delete resolvable queries and variables
280
+ queryStr = Object.keys(json.queries).reduce((acc, key) => {
281
+ if (
282
+ enabledWidgets.find(
283
+ (widget) =>
284
+ widget.componentKey === key ||
285
+ widget.settingComponentKey === key
286
+ )
287
+ ) {
288
+ delete json.queries[key];
289
+ } else {
290
+ // eslint-disable-next-line no-param-reassign
291
+ acc += `\n${json.queries[key]} `;
292
+ }
293
+ return acc;
294
+ }, '');
295
+
296
+ variables = Object.keys(json.variables).reduce(
297
+ (acc, key) => {
298
+ if (
299
+ enabledWidgets.find(
300
+ (widget) =>
301
+ widget.componentKey === key ||
302
+ widget.settingComponentKey === key
303
+ )
304
+ ) {
305
+ delete json.variables[key];
306
+ } else {
307
+ acc.values = { ...acc.values, ...json.variables[key].values };
308
+ acc.defs = [...acc.defs, ...json.variables[key].defs];
309
+ }
310
+ return acc;
311
+ },
312
+ { values: {}, defs: [] }
313
+ );
314
+ }
81
315
  if (variables.defs.length > 0) {
82
316
  const variablesString = variables.defs
83
317
  .map((variable) => `$${variable.alias}: ${variable.type}`)
@@ -106,9 +340,10 @@ module.exports = (request, response) => {
106
340
  }
107
341
  });
108
342
  }
109
- request.body.graphqlQuery = `${operation} { ${json.query} } ${json.fragments}`;
343
+ request.body.graphqlQuery = `${operation} { ${queryStr} } ${fragments}`;
110
344
  request.body.graphqlVariables = variables.values;
111
- request.body.propsMap = json.propsMap;
345
+ request.body.propsMap = propsMap;
346
+ next();
112
347
  } catch (e) {
113
348
  error(e);
114
349
  throw error;
@@ -1,5 +1,9 @@
1
- const { execute } = require('graphql');
2
- const { parse } = require('graphql');
1
+ const {
2
+ execute,
3
+ parse,
4
+ specifiedRules,
5
+ NoUnusedFragmentsRule
6
+ } = require('graphql');
3
7
  const { validate } = require('graphql/validation');
4
8
  const { debug } = require('@evershop/evershop/src/lib/log/logger');
5
9
  const adminSchema = require('../../services/buildSchema');
@@ -28,18 +32,18 @@ module.exports = async function graphql(request, response, delegate, next) {
28
32
  } else {
29
33
  const document = parse(graphqlQuery);
30
34
  // Validate the query
31
-
32
- const validationErrors = validate(schema, document);
35
+ const validationErrors = validate(
36
+ schema,
37
+ document,
38
+ specifiedRules.filter((rule) => rule !== NoUnusedFragmentsRule)
39
+ );
33
40
  if (validationErrors.length > 0) {
34
41
  const formatedErrorMessage = graphqlErrorMessageFormat(
35
42
  graphqlQuery,
36
43
  validationErrors[0].locations[0].line,
37
44
  validationErrors[0].locations[0].column
38
45
  );
39
- debug(
40
- 'critical',
41
- `GraphQL validation error: ${formatedErrorMessage}`
42
- );
46
+ debug(`GraphQL validation error: ${formatedErrorMessage}`);
43
47
  next(validationErrors[0]);
44
48
  } else {
45
49
  const context = getContext(request);